2/25/2019

AnalogHub i2c


Saludos,



“That is not dead which can eternal lie, And with strange aeons even death may die”.

No hoy no vengo a haceros entrega de una nueva aventura de la llamada de Cthulhu, aunque estaría bien. Hoy trato de arrancar nuevamente el foro tras un periodo de silencio, mucho trabajo principalmente.



Hoy vengo a presentaros un “AnalogHub I2C” basado en el PIC16f1503, no es nada nuevo ya hice algo similar con la entrada de la Pi Zero. Pero en esta ocasión es una plaquita más ligera y que se puede añadir a cualquier proyecto uses, Arduino, raspberry pi, teensy, Intel edison , etc.


 


Imagen de una placa sin soldar y otra hecha.
   
Las placas las he pedido a Seeedstudio, realizan un trabajo muy fino a un precio muy competitivo. Entre otras cosas funcionan tan bien como OshPark, simplemente les subes el pcb a su pagina y te realizan un presupuesto.


Que tienen estas placas:
·         Puerto i2c
·         Un led controlable.
·         5 entradas Analógicas
·         2 controladores de servo


Evidentemente la funcionalidad de los puertos se puede modificar si modificas el programa del pic. Como funciona, la placa puede dar el valor de la analógica que se le pida, en una resolución de 16 bits, de forma automática se obtiene 5 muestras y se da la media.
·        
  •  Modo lectura Master escribe al AnalogHub un byte :
o   0x30 à El master ha de leer 2 bytes de la entrada Analogica 0
o   0x31 à El master ha de leer 2 bytes de la entrada Analogica 1
o   0x32 à El master ha de leer 2 bytes de la entrada Analogica 2
o   0x33 à El master ha de leer 2 bytes de la entrada Analogica 3
o   0x34 à El master ha de leer 2 bytes de la entrada Analogica 4
o   0x35 à El master ha de leer 2 bytes de la entrada Analogica 5
o   0x36 à registro de control, el master lee 2 bytes que son ‘1234’

  Ejemplo de Arduino
 
Wire.beginTransmission(address);  // Address of AnalogHub
  Wire.write(op); // option
  dato=i2cReadbyte(address);
  dato|=i2cReadbyte(address)<<8;
  Wire.endTransmission();
  delay(15);


En modo control he implementado un control de servos en continua, que nos permitía realizar un simple robot con ruedas, una vez enviada la instrucción los motores ruedan un tiempo determinado y se paran hasta recibir su siguiente instrucción, de normal son 100 ms. 


·          
  • Modo control del Master al AnalogHub:
o   Master escribe un byte
§  0x01 à El led se enciende
§  0x02 à El led se apaga
o   Master escribe 2 bytes
§  Modo robot con  servomotores en continua
·         0x20 + [0..50]à forward
·         0x21 + [0..50]à backward
·         0x22 + [0..50]à turn right
·         0x23 + [0..50]à turn left
·         0x24 à stop
§  Modo Servos
·         0x26 + [0..180] à control servo 1
·         0x27 + [0..180] à control servo 2
o   Master escribe 3 bytes
§  0x25 + [0..255] + [0..255] à Parte baja y parte alta del delay entre motores en modo robot, de normal está en 100 ms
§  0x69 + [0..255] +[0..255] à Parte baja y parte alta de la media de muestreo para las lecturas analógicas. De normal está en 5.

Ejemplo Arduino

Wire.beginTransmission(address); // Address of AnalogHub
 Wire.write(op); //opcion
 Wire.write(data);// data is uint16_t
 Wire.write(data>>8);
 Wire.endTransmission();


Lo único que hay que considerar es los tiempos entre las instrucciones de control, si le enviamos dos órdenes sin dejar el tiempo suficiente para que se completen la segunda orden posiblemente no llegue. Si el tiempo medio de instrucción de control de los motores es 100ms el tiempo mínimo ha de ser 100ms entre instrucción. Ajustando mucho.


   
Conexiones

La alimentación puede ser a 3,3 o 5V, en función de los sensores que necesitéis conectar. Para la alimentación de los servos/motores se recomienda una alimentación a parte de la tensión de control, las pruebas realizadas con servomotores de dfrobot  no fue necesaria alimentación extra, pero tampoco tenía puesto ningún sensor.

Conclusión


El AnalogHub esta pensado para deslocalizar funciones básicas como leer sensores y controlar motores, bien porque el master no posea estas funciones o para reducir el nivel de código en este sentido. No deja de ser un prototipo y se hecha en falta un segundo puerto I2c para poder conectar varios en cascada e la inclusión de un puerto extra para la alimentación de los motores. Pero abre la puerta a desarrollar robots modulares, que sean plug and play para el master.

Anakleto





No hay comentarios:

Publicar un comentario