miércoles, 17 de abril de 2013

Un poco de physical computing

Si bien lo que voy a mostrar en esta entrada no es nada nuevo, el objetivo real es mostrar que con componentes que no faltan en nuestras casas se puede hacer un dispositivo joystick modular que podamos incorporar en algun otro proyecto de robotica.

El programa para controlar el nunchuck de nintendo desde un arduino fue hecho en el 2008 por Tod E. Kurt, se preguntaran porque prefiero de esta manera a usar lo tradicional, el nunchuck pegado al Wiimote. La respuesta es depende... si el proyecto de robotica solo necesita de un joystick, un par de botones y/o lectura de acelerometro en x y y no hace falta tanto aparatejo; ademas de esta manera no necesitamos gastar baterias ya que se alimenta directamente del arduino que a su vez esta pegado al puerto usb del pc.

por otra parte el software que se va a ejecutar en el pc o en su defecto un linux embebido como es el caso del raspberry pudiera hacerse con processing, si no te apetece el java como es mi caso lo puedes hacer con python que esta de moda y si eres C# dependiente (o sea como yo) en mono o dotnet

se mueve muy bien bastante rapido, está controlado por eventos ya que encapsulé el control nunchuck en un componente independiente, el programilla esta totalmente estable y listo para ser incorporardo en un proyecto de robotica.

El proximo paso seria construir una tarjeta con un avr tiny que implemente una interfaz usb quedando el hardware muchisimo mas pequeño y con una mejor presentación; claro en este caso habria que desarrollarlo directamente con AVRStudio.

sábado, 13 de abril de 2013

Adaptador de Memoria MicroSD para Raspberry

Este adaptador de Memoria vale la pena adquirirlo, lo vende Adafruit; mejora la apariencia del raspberry debido que elimina el espacio sobrante del convertidor de microsd a SD.


Fijense que antes de colocar este aparatico el raspberry se ve asi


y ahora se ve asi
Vale la pena


viernes, 12 de abril de 2013

Adaptador para las GPIO del Raspberry

En esta entrada compartiremos un conector para las GPIO del raspberry hecho a mano, aun cuando se puede conseguir por internet puede ser complicado y costoso conseguirlo.






tiene la separacion idonea para colocarlo en el protoboard


jueves, 11 de abril de 2013

Sesion remota gráfica del RaspberryPi

En ocaciones es necesario establecer una sesion remota gráfica al RaspberryPi, utilizar el vnc de manera estandar suele ser lento debido a que la GUI es compartida.

Dependiendo del requerimiento del usuario si lo que necesita es mayor velocidad a la hora de usar una interfaz gráfica remota y no compartir la pantalla es posible iniciar la interfaz X usando el protocolo RDP; esto se hace instalando como sudo el xrdp de la siguiente manera

sudo apt-get install xrdp

luego reiniciamos el equipo y podremos conectarnos desde linux con el tsclient, desde mac con Remote Desktop Connection.app y con Windows desde Coneccion a Escritorio Remoto, por supuesto el rendimiento es muy bueno solo que la interfaz X no esta compartida, es decir no se va poder observar lo que se hace en el monitor que tenga el Raspberry conectado en ese momento.

Mas adelante en otra entrada indicaremos como se hace inicio de interfaz X con otro protocolo.

viernes, 5 de abril de 2013

Lector de ondas cerebrales parte 2


Un poco decepcionado con el hardware lector de ondas cerebrales, posee un clip que se conecta en el lobulo de la oreja haciendo tierra, y una pequeña placa metalica que hace contacto con la frente del usuario, solo es capaz segun lo que pude comprobar de sensar el pestañeo de la persona y el nivel de concentracion, aun cuando este ultimo no lo hace muy bien.

A continuacion muestro una captura de pantalla de un programa de matematicas que viene con el equipo, inicialmente creia que si uno pensaba la respuesta deberia aparecer en la pantalla; pero despues de concentrarme mucho y hacer fuerza con la mente :( nada de nada ;(.

Uno debe escribir la respuesta mientras el software mide el nivel de concentracion, solo eso....




Sin embargo existe otro equipo mas profesional que sensa varios puntos de la cabeza del usuario, estos si valen la pena a la hora de hacer investigación.

En lo que a mi respecta esperare tener a la mano algo mas profesional para hacer investigación en este campo.




martes, 19 de marzo de 2013

Lector de ondas cerebrales NeuroSky de Mindwave

Llego la hora del hardware Freaky, este aparatillo promete cosas buenas, acabo de destaparlo veamos que podemos hacer, hay mucho desarrollo en la WEB interesante.


lunes, 18 de marzo de 2013

PirateModbus

Basados en el desarrollo de la libreria Modbus presentaremos una herramienta basada en Arduino Mega(1) que puede ser util en algunos casos. 

El PirateModbus, que puede colocarse en el medio de las remotas y el SCADA para examinar los paquetes :)







(1):Utilicé el ArduinoMega porque no tenia en que usarlo era muy viejo "Arduino1280", se pudo hacer el diseño con varios attiny85 conectados por puerto I2C o SPI, solo que queria mas largo el programa y mas complicado de armar >:)

miércoles, 13 de marzo de 2013

Accesorios Raspberry

Por fin algo sobre Raspberry...

No quise escribir nada sobre como configurar un equipillo de estos, en internet ya hay mucha informacion solo quise compartir sobre como darle una apariencia decente. Este Case me parece muy interesante, tiene una apariencia inmejorable, los acabados son perfectos.



y para culminar es necesario en ocaciones hacer alguna implementación con un hardware adicional. Esta tarjeta fue hecha a mano aun cuando tambien se consigue por la web.

y para culminar una vez montado

martes, 12 de marzo de 2013

Llaves electronicas usb

En esta entrada exponemos una implementacion de llave electronica para proteger el código fuente de copias no autorizadas utilizando una placa generica basada en AVR especificamente ATtiny85, sin embargo es posible hacerla con otro mcu solo que quedaria con un tamaño un poco mas grande.

En la internet se consiguen varias implementaciones de estas placas a continuacion muestro un diseño muy simple

hay que acotar que en este caso es necesario colocar un pequeño regulador de 3v3 para alimentar el mcu y sobre todo los pines D+ y D- del usb; en otros diseños prefieren alimentar el mcu con los 5v y colocar un par de zener en D+ y D-, de igual manera cualquiera funciona, en mi caso particular hice algo menos fastidioso... utilizar el AVRStick de Sparkfun, simplemente hice un nuevo desarrollo basado en el diseño de ellos obteniendo resultados satisfactorios.

Para subir el programa en la plaquita utilizé los famosos pines pogo


simplemente es un pin que posee un resorte interno esto con el objeto de hacer un adaptador icsp de 6 pines para programar la plaquita 





por ultimo subo el programa que implenta la llave electronica basada en la libreria libusb ya que el micro ATtiny85 no posee puerto USB, en esta ocasión no utilicé la IDE de Arduino sino que lo hice directamente con el AVRStudio. Es importantes aclarar que hay que conectar la plaquita a la alimentacion preferiblemente no a la computadora sino a una toma externa para que no intente reconocerla.


por último colocamos las tapitas de pendrive y quedo de la siguiente manera




En el programa que va dentro del mcu se le coloca en las definiciones de USB_CFG_VENDOR_NAME y USB_CFG_DEVICE_NAME nuestro valores respectivos, ojo no debemos utilizar valores que corresponda a otros dispositivos comerciales. 

Cuando se inserta la llave en una maquina pedirá el driver y la va a reconocer con el nombre de fabricante y el nombre de dispositivo definido en la llave electronica.

jueves, 14 de febrero de 2013

sensor biometrico

A continuacion un pequeño proyecto que usa el sensor biometrico FIM3040N-LV tiene todo lo que hace una cerradura biometrica estandar de casa basada en atmega328p

viernes, 1 de febrero de 2013

Turno para empezar con el Zigbee

Empezaremos a documentar la información sobre XBee un producto perteneciente al estándar Zigbee.

Según la pagina http://www.zigbee.org es una tecnología de comunicacion inalambrica de bajo costo y bajo consumo eléctrico para implementar redes de control y/o sensores.

En este blog dedicaremos un espacio en la configuración y puesta en marcha de varios tipos de transmisores xbee que poseo en el laboratorio, programandolos con las tecnologias de Arduino, Microframework y Linux Embebido.

A continuación mostraremos un ejemplo de solución inalámbrica de muy bajo costo basada en un par de transmisores xbee.


En la caja transmisora se añadió un micro attiny85 para implementar una lógica que recibe procesa y retransmite datos vía inalámbrica ademas de agregarle un cifrado personalizado por si las moscas :)




miércoles, 30 de enero de 2013

Libreria Modbus Serial para Arduino (1/2)

En vista de que no encontré una implementación completa de la librería modbus para Arduino decidí hacer una librería que posea al menos todas las funciones mínimas necesarias para leer y escribir en una remota.

Ahora disponible en Github:
https://github.com/fernandezajp/ARDUModBus.git  

Todas la pruebas fueron realizadas utilizando el simulador ModSim el cual nos garantiza que funcionaría perfectamente un hardware real.

Las funciones marcadas en azul corresponden a las implementadas en esta librería


   - Función 1 Read Coil Status
   - Función 2 Read Input Status
   - Función 3 Read Holding Registers
   - Función 4 Read Input Registers
   - Función 5 Force Single Coil
   - Función 6 Preset Single Register
   - Función 7 Read Exception Status
   - Función 8 Diagnostics
   - Función 9 Program 484
   - Función 10 Poll 484
   - Función 11 Fetch Communication Event Counter
   - Función 12 Fetch Communication Event Log
   - Función 13 Program Controller
   - Función 14 Poll Controller
   - Función 15 Force Multiple Coils
   - Función 16 Preset Multiple Registers
   - Función 17 Report Slave ID
   - Función 18 Program 884/M84
   - Función 19 Reset Comm. Link
   - Función 20 Read General Reference
   - Función 21 Write General Reference
   - Función 22 Mask Write 4X Register
   - Función 23 Read/Write 4X Registers
   - Función 24 Read FIFO Queue

A continuación detallamos las tramas de cada función con un ejemplo



Funcion: Read Coil Status (FC=01)


Request: Esta trama realiza la petición del estado de los (discrete coils) del 20 al 56 del dispositivo esclavo con dirección 17.
11 01 0013 0025 0E10
11: Dirección del Esclavo (17 = 11 hex.)
01: Código de la Función (read Coil Status)
0013: Dirección del dato del primer coil para leer. (Coil 20 - 1 = 19 = 13 hex)
0025: Número de coils para leer. (del 20 al 56 =  37 = 25 hex) 
0E10: El CRC (cyclic redundancy check) para manejo de errores.
Response
11 01 05 CD6BB20E1B 45E6 
11: Dirección del esclavo (17 = 11 hex)
01: Código de la función (read Coil Status)
05: Número de data bytes (37 Coils / 8 bits por byte = 5 bytes)
CD: Coils 27 - 20 (1100 1101)
6B: Coils 35 - 28 (0110 1011)
B2: Coils 43 - 36 (1011 0010)
0E: Coils 51 - 44 (0000 1110)
1B: 3 bits no usados & Coils 56 - 52 (0001 1011)
45E6: El CRC (cyclic redundancy check).


Función: Input Status (FC=02)




Request: Esta trama realiza la petición del estado de los (discrete inputs) del 10197 al 10218 del dispositivo esclavo con dirección 17.
11 02 00C4 0016 BA08
11: Dirección del Esclavo (17 = 11 hex.)
02: Código de la Función (read Input Status).
00C4: Dirección de la primera entrada. (10197 - 10001 = 196 = C4 hex.)
0016: Número total de coils de la petición. (197 al 218 =  22 = 16 hex.)
BA08: El CRC (cyclic redundancy check) para manejo de errores.
Response
11 02 03 CD6B32 45C4
11: Dirección del Esclavo (17 = 11 hex.)
02: Código de la función (read Input Status)
03: El numero total de bytes (22 Inputs / 8 bits per byte = 3 bytes)
CD: Entradas Discretas 10204 -10197 (1010 1100)
6B: Entradas Discretas 10212 - 10205 (1101 1011)
32: 2 espacios vacíos & Entradas Discretas 10218 - 10213 (0011 0101)
45C4: El código CRC (cyclic redundancy check).



Función: Read Holding Registers (fc3)




Request: Esta trama realiza la petición del estado de la salida analógica holding registers desde 40108 a 40110 del dispositivo esclavo con dirección 17.
11 03 006B 0003 7611
11: Dirección del Esclavo (17 = 11 hex.)
03: Código de la función (read Analog Output Holding Registers)
006B: Dirección del Dato del primer registro requerido. (40108-40001 = 107 = 6B hex.)
0003: Número total de registros requeridos. (3 registros desde 40108 al 40110) 
7611: El CRC (cyclic redundancy check) manejo de errores.
Response
11 03 06 AE41 5652 4340 49AD
11: Dirección del Esclavo (17 = 11 hex)
03: Código de la función (read Analog Output Holding Registers)
06: Número de bytes (3 registros x 2 bytes por cada uno = 6 bytes)
AE41: Contenido del registro 40108
5652: Contenido del registro 40109
4340: Contenido del registro 40110
49AD: El CRC (cyclic redundancy check).



Función: Read Input Register (fc4)




Request: Esta trama realiza la petición del estado de la entrada analógica input registers #30009 del dispositivo esclavo con dirección 17.
11 04 0008 0001 B207
11: Dirección del Esclavo (17 = 11 hex.)
04: Código de la Función (read Analog Input Registers)
0008: Dirección de dato del primer registro requerido. (30009-30001 = 8)
0001: El numero de registros para leer. (leer 1 registro) 
B207: The CRC (cyclic redundancy check) for error checking.
Response
11 04 02 000A F8F4
11: Dirección del Esclavo (17 = 11 hex)
04: El Código de Función (read Analog Input Registers)
02: Numero de bytes de datos (1 registro x 2 bytes por registro = 2 bytes)
000A: Contenido del registro 30009
F8F4: El código CRC (cyclic redundancy check).



Función: Force Single Coil (fc5)




Request: Este comando escribe el registro del discrete coil # 173 a ON en el dispositivo esclavo con dirección 17.
11 05 00AC 00FF 4F08
11: Dirección del Esclavo (17 = 11 hex)
05: Código de la Función (Force Single Coil)
00AC: Dirección de Dato del coil. (# 173 - 1 = 172 = AC hex)
00FF: Estado a escribir ( 00FF = ON,  0000 = OFF ) 
4F08: El Código CRC (cyclic redundancy check) para manejo de errores.
Response
11 05 00AC 00FF 4F3B
11: Dirección del Esclavo (17 = 11 hex)
05: Código de la Función (Force Single Coil)
00AC: Dirección de Dato del coil. (coil# 173 - 1 = 172 = AC hex)
00FF: Estado actualizado ( 00FF = ON,  0000 = OFF ) 
4F3B: El Código CRC (cyclic redundancy check) para manejo de errores.



Función: Preset Single Register (fc6)




Request: Este comando escribe el contenido del analog output holding register # 40002
al dispositivo esclavo con direccion 17.
11 06 0001 0003 9A08
11: Dirección del Esclavo (17 = 11 hex)
06: Código de la Función (Preset Single Register)
0001: Dirección del registro de Dato. (# 40002 - 40001 = 1 )
0003: Valor a escribir.
9A08: El código CRC (cyclic redundancy check) para manejo de errores.
Response: La respuesta normal es un echo del request.
11 06 0001 0003 9A9B
11: Dirección del Esclavo (17 = 11 hex)
06: Código de la Función (Preset Single Register)
0001: Dirección del registro de Dato. (# 40002 - 40001 = 1 )
0003: Valor escrito.
9A9B: El código CRC (cyclic redundancy check) para manejo de errores.



Función: Force Multiple Coils (FC=15)




Request: Este comando escribe el contenido discreto de una serie de 10 coils desde  #20 al #29 en el esclavo con direccion 17.
11 0F 0013 000A 02 CB01 BF08
11: Dirección del Esclavo (17 = 11 hex.)
0F: Código de la Función (Force Multiple Coil, 15 = 0F hex.)
0013: Dirección del primer coil. (# 20 - 1 = 19 = 13 hex.)
000A: Número de coils para ser escrito (10 = 0A hex)
02: Numero de bytes de datos (10 Coils / 8 bits por byte = 2 bytes)
CB: Coils 27 - 20 (1100 1011
01: 6 espacios vacios & Coils 29 - 28 (0000 0001
BF08: El Código CRC (cyclic redundancy check) para manejo de errores.

Response
11 0F 0013 000A 2699
11: Dirección del Esclavo (17 = 11 hex)
0F: Código de la Función (Force Multiple Coil, 15 = 0F hex)
0013: Dirección del primer coil. (coil# 20 - 1 = 19 = 13 hex)
000A: Número de coils para ser escrito (10 = 0A hex)
2699: El Código CRC (cyclic redundancy check) para manejo de errores.



Función: Preset Multiple Registers (FC=16)




Request: Este comando escribe el contenido de 2 analog output holding registers # 40002 & 40003 en el esclavo con dirección 17.
11 10 0001 0002 04 000A 0102 C608
11: Dirección del Esclavo (17 = 11 hex)
10: Código de la función (Preset Multiple Registers 16 = 10 hex)
0001: Dirección del primer registro. (# 40002 - 40001 = 1 )
0002: Numero de registros para escribir.
04: Numero de bytes (2 registros x 2 bytes por cada registro = 4 bytes)
000A: Valor para escribir para el registro 40002
0102: Valor para escribir para el registro 40003
C608: El código CRC (cyclic redundancy check) para el manejo de errores.
Response
11 10 0001 0002 1298
11: Dirección del Esclavo (17 = 11 hex)
10: Código de la función (Preset Multiple Registers 16 = 10 hex)
0001: Dirección del primer registro. (# 40002 - 40001 = 1 )
0002: Número de bytes escritos.
1298: El Código CRC (cyclic redundancy check) para manejo de errores


Ver Parte 2 En la siguiente entrada esta un pequeño ejemplo de como se usa

http://fernandezajp.blogspot.com/2013/07/uso-de-la-libreria-modbusserial.html

martes, 29 de enero de 2013

Implementacion de libreria lite para manejar el módulo GSM SM5100B

A continuación mostraremos una implentación versión lite de como manejar el modulo Cellular Shield con SM5100B

El codigo de la implementacion totalmente funcional esta en la siguiente dirección de Github:
https://github.com/fernandezajp/ARDUGSMLite.git

Esta libreria funciona con el modulo SM5100B-D



 utilizamos un chip GSM de Movistar y Movilnet

los resultados de la prueba se pueden ver en el Monitor Serial de la IDE de Arduino con los siguientes resultados

Initializing GSM ...
waiting for 10 secs
AT+IPR=9600
OK
AT+CMEE=2
OK
AT+CMGF=1
OK
Ready.
searching for provider...
Cheching network ...
AT+CREG?

+CREG: 0,2

OK

+SIND: 11
no GSM Signal
searching for provider...
Cheching network ...
AT+CREG?

+CREG: 0,1

OK

+SIND: 4
registered
sending SMS ...
AT+CMGF=1
OK
AT+CMGS="<destination number here>"

>
ready









 
Disfrutenlo...