Autor Tema: Driver Sensor Color TCS3414  (Leído 1959 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Fuentes84

  • PIC10
  • *
  • Mensajes: 4
Driver Sensor Color TCS3414
« en: 10 de Diciembre de 2014, 13:42:51 »
Buenas tardes,

El caso es que he adquirido el modulo sensor de colores de 16 bits TCS3414. Está claro que me falta programar el driver del sensor y es aquí donde necesitaría un poco de ayuda. Utilizo el compilador CCS 5.025. Iré posteando y actualizando lo que lleve programado, aunque estoy un poco verde.
No pido que me hagáis el programa, ya que lo haré yo, pero sí que pido asesoramiento. Ya he buscado si existía el driver en internet pero me ha sido imposible.
Entiendo que el modulo utiliza fotodiodos como filtros ( 4 filtros rojos, 4 filtros verdes, 4 filtros azules y 4 sin filtro, formando un array de 8x2 ). Esos filtros llevan incorporados los convertidores A/D para conseguir el color detectado.

Mediante el bus I2C se puede controlar la escritura/lectura del sensor. Ahora el caso es ir definiendo los registros que contiene el sensor que si no me equivoco están enumerados en la siguiente figura:

De esos registros, creo que con solo configurar los registros de command, control, timing,gain y los ADC channels me vale para hacer correr el sensor.

Ahora bien, la dirección del sensor de colores en modo esclavo indica que es:
Address = 0111001 = 0x39
Registro commando

Corregidme si me equivoco pero interpreto que después de ubicar la dirección del esclavo debo mandar lo siguiente:
Bit 7: Debe ser 1 obligatorio.
Bit 6-5: Protocolo de comunicación.  Interpreto que para leer/escribir byte a byte o toda la palabra. Alguien me puede aclarecer la diferencia entre esos protocolos?
Bit 4-0: La dirección del registro en el que leer o escribir



registro de control
 la dirección del registro es 0x00, donde los 8 bits se define:

De manera que deduzco que:
Activar modulo :               00000011   ( 0x03 )
Desactivar modulo:           00000000   ( 0x00 )

Registro timming

Para seleccionar el tiempo de conversión de los canales A/D
Creo que con el modo de 12ms de tiempo de conversión me es suficiente por lo que quedaría configurado de la siguiente manera:
Registro timming = 00000000

Registro gain
Para configurar la sensibilidad del sensor, aunque no sé qué consigo… mayor sensibilidad, más detecta el cambio de las diferentes gammas del rojo por ejemplo?


Registro ADC channels
Lectura de los conversores A/D


El codigo

Código: [Seleccionar]
#include<16F88.h>
#fuses NOMCLR
#fuses INTRC_IO
#fuses NOLVP
#fuses NOPROTECT
#fuses NOWDT
#use delay(internal=4000000)
#byte porta=0x05
#byte portb=0x06
#use i2c(Slave,Fast,sda=PIN_B1,scl=PIN_B4,address=0x39)

#define REGISTRO_CONTROL                  (0x00)             ////////////////////////////////////////////////////////////////////////
#define REGISTRO_TIMING                   (0x01)             //                                                                    //
#define REGISTRO_INTERRUPT                (0x02)             //                                                                    //
#define REGISTRO_INTSOURCE                (0x03)             //                                                                    //
#define REGISTRO_ID                       (0x04)             //                                                                    //
#define REGISTRO_GAIN                     (0x07)             //                                                                    //
#define REGISTRO_LOWTHRESHOLD_LOWBYTE     (0x08)             //                                                                    //
#define REGISTRO_LOWTHRESHOLD_HIGHBYTE    (0x09)             //                                                                    //
#define REGISTRO_HIGHTHRESHOLD_LOWBYTE    (0x0A)             //                                                                    //
#define REGISTRO_HIGHTHRESHOLD_HIGHBYTE   (0x0B)             //                Definición de los registros de la tabla 2           //
#define REGISTRO_GREENLOW                 (0x10)             //                  de la pagina 13 del datahseet.                    // 
#define REGISTRO_GREENHIGH                (0x11)             //                                                                    // 
#define REGISTRO_REDLOW                   (0x12)             //                                                                    // 
#define REGISTRO_REDHIGH                  (0x13)             //                                                                    // 
#define REGISTRO_BLUELOW                  (0x14)             //                                                                    // 
#define REGISTRO_BLUEHIGH                 (0x15)             //                                                                    // 
#define REGISTRO_CLEARLOW                 (0x16)             //                                                                    // 
#define REGISTRO_CLEARHIGH                (0x17)             ////////////////////////////////////////////////////////////////////////

#define COMANDO_TIMMING                  (0x81)
#define COMANDO_CONTROL                  (0x80)
#define COMANDO_GAIN                     (0x87)
       



#define POWER_ON                        (0x03)             // Configuración registro control para activar el sensor
#define POWER_OFF                       (0x00)             // Configuración registro control para desactivar el sensor



void main()
{
disable_interrupts(GLOBAL);
set_tris_a(0x00);
set_tris_b(0x00);
porta=0;
portb=0;
setup_oscillator(OSC_4MHZ);
enable_interrupts(GLOBAL);
i2c_start();         //Inicializa
i2c_write(0x39);    // dirección del sensor
i2c_write(COMANDO_TIMMING);        // registro configuracion timming
i2c_write(0x00);        // registro configuracion timming a 12ms
i2c_stop();          //Finaliza
i2c_start();         //Inicializa
i2c_write(0x39);    // dirección del sensor
i2c_write(COMANDO_GAIN);        // registro configuracion gain
i2c_write(0x00);        // registro configuracion gain a 1X y divide by 1
i2c_stop();          //Finaliza
i2c_start();         //Inicializa
i2c_write(0x39);    // dirección del sensor
i2c_write(COMANDO_CONTROL);        // registro configuracion control
i2c_write(POWER_ON);        // Activar sensor
i2c_stop();          //Finaliza

while(1)
{
}

   
   

}

Visto así parece fácil, pero trasladaro al ccs se me hace un mundo.. por eso pido asesoramiento.. gracias!








 
« Última modificación: 11 de Diciembre de 2014, 05:27:36 por Fuentes84 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Driver Sensor Color TCS3414
« Respuesta #1 en: 10 de Diciembre de 2014, 14:18:55 »
Citar
No pido que me hagáis el programa, ya que lo haré yo, pero sí que pido asesoramiento. Ya he buscado si existía el driver en internet pero me ha sido imposible.

Para PIC tal ves, pero para orto micro puede ser
http://www.maxpierson.me/2012/06/07/interfacing-the-arduino-to-the-taos-tcs3414-via-i2c/

Al menos podes ver como lo hace y portarlo

Respecto a I2C aca hay un ejemplo bien simple, si te fijas termina haciendo casi lo mismo que en el de arduino.
http://electgpl.blogspot.com.ar/2013/10/utilizacion-del-protocolo-i2c.html

En si mandas un start, luego escribis la direccion del dispositivo (0x39), luego el comando, lees/escribis, y luego el stop. Como una trama i2C, tambien lei en otro lado que la ultima lectura deberia ser i2c_read(0); y no i2c_read(); asi se envia un NACK
Fuente: http://www.ccsinfo.com/forum/viewtopic.php?p=18043

En la pagina 21 del datasheet da un pseudocodigo de como seria la comunicacion.

Citar
Bit 6-5: Protocolo de comunicación.  Interpreto que para leer/escribir byte a byte o toda la palabra. Alguien me puede aclarecer la diferencia entre esos protocolos?

Yo interpreto lo siguiente, inicias tu I2C  envias adress ,el comando y luego lees, si es byte va a haber un solo resultado y deberias parar, si es word, serian 2 bytes que te mandaria el sensor (caso que si quisieras tomar los datos de un canal completo H y L), y si es block, definis la primera direccion y no para de enviar datos hasta que vos le mandes un stop.

Citar
An I2C block transaction will continue until the Master sends a stop condition.
« Última modificación: 10 de Diciembre de 2014, 14:29:53 por KILLERJC »

Desconectado Fuentes84

  • PIC10
  • *
  • Mensajes: 4
Re: Driver Sensor Color TCS3414
« Respuesta #2 en: 10 de Diciembre de 2014, 14:31:37 »
Gracias por contestar!! Ahora debo irme pero mañana leeré detenidamente tus enlaces!!!