3/14/2017

Intel Edison : Eddie Bot + APDS-9960 + Line Sensor

Saludos,

llevo unas semanas trabajando con este ordenador Intel Edison, y que decir… Algo sino no haría esta entrada. Para ser un ordenador en miniatura de 25x35 mm con un Dueal Core Atom a 500 Mhz y un MCU Quark SOC a 100MHz, con wifi, bluetooth, 40 GPIOs, un giga de RAM y 4 Gigas de memoria Flash. Lo que lo convierte en una pequeña joya muy potente quizá comparable con la raspberry pi 3 pero aun no la he probado.




Como ya mencione en otro hilo empleamos estas placas para desarrollar balancings como EddieBot, que es un proyecto muy bien desarrollado con un ajuste de PID  muy conseguido. Pero necesitamos más sensores, un sensor de distancia, un seguidor de línea y posiblemente un sensor de color.



Un sensor de distancia, normalmente usamos el  GP2Y0A21YK, pero funciona a 5V, Edison a 3,3V y necesitaríamos una placa ADC, pero mirando especificaciones podíamos emplear el sensor APDS-9960, funciona a 3,3V y por I2C pero no había driver para el Edison. Bueno no había, he adaptado el driver de Sparkfun, para el Edison. No he probado todas las funcionalidades pero funcionar funciona.





El segundo sensor es un seguidor de línea que usamos en la mayoría de robots para los cursos de robótica, pero en esta ocasión lo hemos hecho I2C con el PIC12LF1840, un prototipo de una serie de sensores que estamos diseñando para nuestros robots que funcionen por I2C.

No ha sido fácil, si bien el sensor funcionab sin problemas conectándolo a un arduino con el Edison, nos daba problemas al emplear la instrucción.

mraa_i2c_read(i2c,message,4); //4 bytes para dos valores de 16 bits de los sensores de linea.

La solución ha sido hacer.

void GetLineSensor(uint16_t * temp)
{
mraa_i2c_context i2c;
mraa_init();
 i2cline = mraa_i2c_init(1);
mraa_i2c_address(i2c, address);
int i;
uint8_t message[4]={0,0,0,0};
for(i=0;i<4;i++)
{
message[i]=mraa_i2c_read_byte(i2c);
i++;
}
temp[0]=(uint16_t)message[1]<<8;
temp[0]=temp[0]+message[0];
temp[1]=(uint16_t)message[3]<<8;
temp[1]=temp[1]+message[2];
 }


No es una solución muy elegante pero funciona.



Va un poco borracho ... Working progress...



Anakleto.