Archivo de la etiqueta: Intel Edison

Intel Edison SmartCar V2.0

intel-edison-smartcar

La versión 1.0 estaba bien para comenzar, pero mi intención era hacer algo diferente a lo que se encuentra en otros tutoriales.

El objetivo que me he marcado para la v2.0 es añadir al coche una webcam para hacer streaming de lo que ve. Para ello he usado una Sony Eye, que es de poca resolución pero tiene una calidad de imagen muy buena y requiere poca energía.

Pero al llevarlo a la práctica me he encontrado con 2 problemas: el primero es que la Intel Edison deshabilita el puerto USB Host cuando es alimentada por USB, y el segundo es que la imagen oficial de Yocto Linux solo soporta cámaras UVC.

El conector redondo de power input del Arduino Breakout acepta 5v así que usé la clavija de un cargador de portátil viejo y la soldé a un conector USB para tener habilitado el puerto USB Host con la batería externa.

IMG_20150830_223327

Hace tiempo en un evento de intel me dieron una placa Intel Galileo con una webcam Sony Eye y esperaba encontrarme los drivers preinstalados en la imagen de Yocto para Edison, pero no ha sido así y he tenido que compilarlos. Como no tengo experiencia me he basado en un tutorial de los foros de intel de alguien que ha hecho algo parecido. He incluído los módulos en el repositorio de Github.

Para terminar he atornillado un tupper al chasis del coche para evitar que los componentes se caigan cuando el coche se mueve.

P1010200

En la parte de código he reutilizado partes de proyectos que he encontrado por Internet. Con ffmpeg capturo el vídeo de la webcam, luego hago streaming por websockets a una página web que reproduce el vídeo usando HTML5, con esto consigo que sea compatible con casi todos los navegadores de internet de ordenadores y móviles.

También, a modo de prueba, he conectado el coche a thethings.io para guardar el log del programa. A largo plazo tendrá aplicaciones potenciales como controlar el coche remotamente desde una página web (lo que me evitaría tener que saber la IP del coche para conectarme y controlarlo), y enviar fotos a Internet.

Los cambios ya están subidos a Github. El proceso de instalación se ha vuelto a complicar porque la instalación de ffmpeg y los módulos se ha de hacer a mano. Me gustaría volver a conseguir que la puesta en marcha sea sólo montar el coche y darle a un botón pero eso será en próximas versiones.

Intel Edison SmartCar V1.1.0

Poco a poco sigo avanzando en la construcción del coche, pero antes de añadirle mejoras he creído necesario revisar el código a fin de hacerlo más simple y fácil de mantener.

Con la V1 el coche funcionaba pero el código estaba dividido en una carpeta para el backend y otra para el frontend y eso complicaba la instalación porque se tenía que hacer por separado. Además estaba el inconveniente de que el puerto del backend de NodeJS es distinto al del frontend y daba problemas de crossdomain cuando se comunicaban entre si mediante AJAX, en ese momento los solucioné de manera cuestionable poniendo la IP de la placa directamente en el código y usando JQuery.

Como soy newbie en NodeJS he investigado hasta encontrar la solución a mis problemas: el Framework Express, que me ha servido para optimizar el código. Ahora tengo el frontend y el backend en el mismo puerto, los problemas de crossdomain desaparecieron, he podido eliminar JQuery y sustituirlo por una única función para AJAX, y además los archivos del frontend se han podido integrar en el proyecto de Intel XDK.

Con estos cambios el código entero se sube simplemente haciendo clic en el botón Upload del Intel XDK, no hay que poner la IP a mano, y además hay menos archivos que mantener.

Lo más importante esta en la nueva función setup_app() del archivo main.js del backend porque es la que me ha permitido hacer las mejoras.

La nueva versión es la V1.1.0. La puedes descargar en Github.

2049eaa2-1578-3fbb-875c-d3ca1c68aa75

Construcción de coche teledirigido con Intel Edison: V1

Vamos a construir la primera versión del coche. Tendrá los componentes y código justos para que funcione. Nos servirá de base, le añadiremos mejoras más adelante.

Usaremos estos componentes:

  • Placa Intel Edison + Arduino breakout.
  • Batería externa USB para alimentar la Intel Edison.
  • Controlador de motores L298N. (Controla 2 motores)
  • Chasis de smart car de 2 ruedas motorizadas.
  • Opcional: Arduino sensor shield V5.0. (Facilita las conexiones)

En la parte de software usaremos nodeJS en el backend para controlar los motores, y HTML y AJAX en el frontend.
NodeJS viene incluido en la imagen de Yocto Linux de Intel Edison.

Conexiones

El controlador de motores L298N tiene conexiones de alimentación, de control, y las de los motores:

  • Las conexiones de alimentación van conectadas a una fuente de alimentación de entre 6 y 12 voltios. El L298N tiene un regulador de tensión que alimenta los motores con 5v.
  • Las conexiones de control reciben la señal para encender y apagar los motores y el sentido de giro. Están numeradas de la IN1 hasta la IN4 y las conectaremos a los pines Arduino de la placa Intel Edison.
  • Las conexiones de los motores están situadas en ambos lados del L298N.

Esquema del controlador de motores L298N

Conecta los cables de la siguiente manera:

  • IN1 — Pin 7 de Arduino
  • IN2 — Pin 6 de Arduino
  • IN3 — Pin 5 de Arduino
  • IN4 — Pin 4 de Arduino
  • Vin — Fuente de alimentación (6 – 12v)
  • GND — Polo negativo de la fuente de alimentación y también al pin GND de Arduino
  • OUT1 — Motor 1
  • OUT2 — Motor 2

Las conexiones quedan de esta forma:
Intel Edison SmartCar V1

Código

Prerequisitos: Intel XDK IoT Edition para compilar y instalar el script de NodeJS, y un cliente de SCP para subir el frontend en HTML y Javascript al servidor web de Intel Edison.

Descarga el código fuente en github.com/Branyac/intel-edison-smartcar, alli tienes las instrucciones para compilarlo y subirlo a la placa, voy a explicar el funcionamiento brevemente:

Backend en NodeJS

Programar para la Intel Edison en NodeJS es un poco más complicado que con Processing (el lenguaje de programación de Arduino), pero es más potente y más fácil añadir funcionalidades. Se usa la librería MRAA para controlar los pines de Arduino.

El programa se compone de un sólo archivo de Javascript llamado main.js que encontrarás dentro de la carpeta SmartCar.
La función main() es la principal y hace lo siguiente:

  1. Primero llama a la función setup_mraa() que crea una nueva instancia de MRAA necesaria para controlar los pines de Arduino.
  2. A continuación llama a setup_arduino_pins() que indica que los pines del 4 al 7 se van a usar en modo salida (equivale a hacer un pinMode (X, OUTPUT); en processing, donde X es el número de pin)
  3. Por último llama a setup_webserver() que crea un servidor web en el puerto 8888 y luego a la función start_motors() con el valor del parámetro motors_action que le llega en una petición HTTP GET. La función start_motors() enciende y apaga los pines de salida de Arduino para indicar al L298N en que sentido se mueve cada motor (equivale a hacer digitalWrite (X, HIGH); en processing), luego espera 1 segundo y para los motores apagando todos los pines.

Frontend en HTML + JS

El frontend simplemente hace llamadas AJAX al puerto 8888 de la placa Edison para mover el coche. El código está en el archivo main.js de la carpeta web/js, según el valor del parámetro motors_action hará estos movimientos:

  • motors_action=F: Hacia delante.
  • motors_action=B: Hacia atrás.
  • motors_action=L: Girar a la izquierda.
  • motors_action=R: Girar a la derecha.

Próximamente publicaré otros posts con las mejoras que iré añadiendo a este coche teledirigido.

intel-edison-smartcar