Category Archives: Evaluaciones de Productos

IMG_20170216_190038

Intel Realsense Robotic Kit con Upboard + ROS

17 Feb , 2017,
Jose Nunez
, , , , ,
No Comments

IMG_20170216_190038Recientemente publicamos un primer artículo sobre el kit de robótica de Intel que trae una cámara Real Sense y un Upboard.

Aunque esta segunda entrega es bastante corta, esperamos que abra las perspectivas de nuestros lectores sobre lo que se puede llegar a hacer con uno de estos kits y los sistemas de robótica ROS y las facilidades que tiene para el manejo de cámaras Real Sense.

Paso 1 (30 min)

Comenzaremos diciendo que instalar Ubuntu y ROS en el Upboard es una tarea súperfacil siguiendo las instrucciones en este enlace:

https://software.intel.com/realsense/robotic-devkit-quickstart

Esto incluye

  1. Una revisión de materiales incluidos en el kit
    (!) Van a necesitar un cable HDMI estándar para conectar el video del UP Board a un monitor, un teclado, un ratón y un adaptador WIFI USB.
  2. La descarga de Ubuntu 16.04.1 LTS
    (!) Hoy (FEB18) gracias a las pruebas que está haciendo el profesor Tomás de Camino, vimos que ya la versión de Ubuntu 16.04.1 no está disponible en el enlace oficial que trae la guía de quick start de Intel, sino que fue reemplazada por la 16.04.2. Aunque en la buena teoría deben funcionar igual, en caso de experimientar algun problema con el setup acá les dejamos el enlace oficial a esa versión: 
    http://old-releases.ubuntu.com/releases/xenial/ubuntu-16.04.1-desktop-amd64.iso
  3. La creación de un USB Stick de instalación
  4. La instalación del Ubuntu en el UP Board
  5. La actualización del sistema operativo incluyendo el KERNEL de linux optimizado para el Upboard
    (!) En este paso puede que se necesite configurar los servidores APT de Ubuntu para que use los servidores en Estados Unidos (no en Costa Rica) ya que en CR no están los paquetes de ROS. Para esto se abre el menú de búsqueda de Ubuntu y se digita “Software Updates” y en la casilla “Download From” se selecciona “Server from United States”image
  6. La actualización del software de Real Sense
  7. La instalación del sistema ROS en su versión Kinetic
    (!) ROS es un “meta-sistema operativo” de código abierto para robots, desarrollado por la fundación de robótica de código abierto. Para aprender más sobre ROS pueden seguir este enlace http://wiki.ros.org/ROS/Introduction
  8. Ejecución de un “Nodelet” de ROS para la cámara Realsense R200
  9. La ejecución del programa “RVIZ” para visualización 3D
  10. ¡a celebrar carajo!

Si, eso es todo por ahora.

69c570f4-7821-42da-a8b7-c0d23bf1b202

Intel UPBoard y el kit de robótica Real Sense

16 Feb , 2017,
Jose Nunez
, , , , , ,
No Comments

69c570f4-7821-42da-a8b7-c0d23bf1b202Esta semana nuestra investigación dio un giro inesperado al encontrarnos por primera vez con una pequeña maravilla que desconocíamos: el kit de robótica Real Sense de Intel, que está basado en un dispositivo (diríamos “compentencia” del Raspberry PI) denominado UP Board.

[Actualización 2/20/2017]
El UP Board es un dispositivo fabricado por la empresa AAEON que usa tecnología Intel y está optimizado para las cámaras Real Sense de Intel.

Afortunadamente pudimos conseguir uno de estos kits en la tienda de Intel antes de que se agotaran. Esperamos que pronto estén de vuelta.

El kit que se vende por aprox. $350 más gastos de envío e impuestos, contiene una tarjeta Up Board que prácitcamente del mismo tamaño que una Raspberry PI 3, con 32GB de storage eMMC, 4 GB de memoria RAM de alta velocidad y un procesador Intel Atom de 4 núcleos 1.92 GHz y GPIO de 40 pines y fuente de poder (5V 4A). (Especificación completa)

Siendo que la cámara Real Sense se consigue por $170, la tarjeta UP Board con 4GB RAM, 32GB Storage, nos sale costando aproximadamente $180, más un dongle wifi que necesitamos para conectarlo a Internet ($20)

Pero no nos confundamos; pusimos “competencia” entre comillas por que ¡esta cosa realmente vuela! Pienso que el precio está justificado por el desempeño que presenta y la facilidad con que lo pudimos poner en operación.

Viene optimizado y preparado para correr Ubuntu Linux (tal cual se descarga del sitio de Cannonical), trae un USB3.0  optimizado para la cámara Real Sense R200  que conforma el kit y otros cuatro puertos USB 2.0 más.

Mi experiencia echando a andar este pequeño monstruo fue realmente placentera. Fue cuestión de preparar un USB Stick con una imagen de Ubuntu, bootearlo en el dispositivo e instalar.

Luego de eso instalamos algunas librerías muy interesantes que estaremos detallando pronto en nuestra siguiente entrega, tales como ROS (robot operating system), OpenCV Apps, Optimizaciones del Kernel de Linux para el upboard, etc.

A este punto pudimos instalar todas las librerías necesarias, e incluso instalar y correr Netbeans 8.2 sin ningun impacto en el desempeño del dispositivo.

 

 

___fadd2efe-349e-4ec3-b03e-b6fbd6b6ebfe-imageId=0a6ed59a-7a19-4839-b801-9691e0c0ae4a (1)

Intel Joule – Primeros Pasos

20 Ene , 2017,
Jose Nunez
, , ,
No Comments

___fadd2efe-349e-4ec3-b03e-b6fbd6b6ebfe-imageId=0a6ed59a-7a19-4839-b801-9691e0c0ae4a (1)En nuestra publicación anterior hicimos un breve recorrido sobre las especificaciones del Joule de Intel, una tarjeta de desarrollo pensada para adentrarnos en el mundo de las aplicaciones de alta demanda computacional en dispositivos pequeños, ya sea vestibles o de tamaño reducido; especialmente sistemas de análisis de imágenes 3D de cámaras Intel Real Sense.

En esta ocasión iremos paso a paso por los tutoriales de Intel sobre cómo empezar a desarrollar soluciones en esta magnífica plataforma.

Para esto nos basaremos en la guía de usuario suministrada por el fabricante mientras tratamos de resumir y enfocarnos en los aspectos más importantes.


1 Materiales Requeridos

Comencemos por los diferentes materiales que serán necesarios para nuestro primera incursión funcional.

  1. Una Plataforma de Desarrollo Intel Joule 570x (enlace)
  2. Un disipador de calor (suministrado con la plataforma)
  3. Fuente de poder 12V, 3A (En este tutorial nosotros usamos una de 12V, 2A) conector de barril de 5mm con centro positivo de 2.1mm
  4. Cable micro-USB tipo B para la comunicación serial con el dispositivo (cable no incluido en el kit). Es el tipo de cable con que actualmente cargamos los telefonos Andriod.
  5. Teclado USB. Nosotros utilizamos un teclado inalámbrico con ratón marca Microsoft sin mayor problema.
  6. Cable HDMI macho estándar a macho conector micro
  7. USB Hub: Opcionalmente un concentrador USB (hub) con suministro eléctrico independiente (en caso de querer conectar dispositivos que demanden más de 900mA)
  8. Bluetooth: Opcionalmente también se pueden conectar dispositivos de teclado y ratón vía Bluetooth.
  9. Computador Anfitrión: Se necesitará un computador para programar el Joule.
    • Para actualizar el BIOS del Joule será necesario un computador anfitrión con sistema operativo Windows 8, 8.1 o Windows 10.
    • El sistema operativo que se vaya a utilizar en el Joule introduce algunas dependencias en el computador anfitrión que se use para programarlo. Así, si se utiliza LINUX de referencia que provee Intel o si se utiliza Ubuntu para IoT, se puede usar un computador anfitrión con sistema operativo Windows, Linux o Mac. Pero si el sistema operativo del Joule es Windows IoT, el computador anfitrión deberá estar equipado con sistema operativo Windows 10 y demás especificaciones de Microsoft descritas acá.

2 Ambientes de Desarrollo de Intel

El Intel Joule se puede programar de muy diversas formas. Intel recomienda usar alguno de los siguientes sistemas para programara la plataforma:

  1. Intel System Studio IoT Edition para Windows, Mac, o Linux en  caso de querer programar la plataforma mediante lenguajes como C/C++ o Java. Nótese Intel System Studio para Linux requiere Ubuntu 16.04 LTS como sistema operativo anfitrión en 64bit.
  2. Intel XDK tambien para Windows, Mac o Linux, en caso de querer programar la plataforma con NodeJS

(!) En esta publicación utilizaremos Intel XDK tanto en un anfitrión Linux (Mint 18) como en Windows 10.


3 Requisitos para Instalación del Sistema Operativo del Joule

La plataforma Intel Joule trae de fábrica una versión optimizada del sistema operativo LINUX. Se recomienda actualizarla ya sea a la imagen más reciente o a alguna versión de Ubuntu Desktop o de Windows for IoT.

Dicha actualización requiere:

  1. Flash Drive de tipo USB 3.0 con 16GB de capacidad conectado a un USB HUB con alimentación independiente. Puede ser USB 2.0 pero la transferecia de datos tendrá una tardanza notoria.
  2. Tarjeta MicroSD de 16GB (puede usarse un Flash Drive adicional si se trata del LINUX de referencia)
  3. El computador anfitrión deberá tener capacidad de leer la tarjeta del punto #2 anterior.
  4. Instrucciones (En inglés) para la actualización del sistema operativo

4 Ensamblando la Plataforma de Desarrollo

Este enlace provee instrucciones muy completas y sencillas sobre cómo preparar / ensamblar los diferentes elementos de la plataforma desarrollo. Se incluyen en dicho enlace pasos importantes como:

  1. Instalación del disipador de calor
  2. Antenas
  3. Instalación de espaciadores

5 Sobre el sistema operativo de la plataforma

En este enlace se describe en detalle las principales opciones de sistema operativo las cuales incluyen:

  1. Ubuntu Desktop 16.04 LTS
  2. Ubuntu Core 16.04 LTS
  3. Windows 10 IoT Edition
  4. Linux de referencia para IoT

6. Actualizando el BIOS

Un primer paso importante en el uso de Joule consiste en actualizar el BIOS. Es el software que orquesta ya carga del sistema operativo y otras funciones de entrada/salida.

El procedimiento es realmente sencillo, nos ha tomado unos 20 minutos en realizarlo. Se describe en este enlace:

https://software.intel.com/en-us/flashing-the-bios-on-joule


7. ¿Qué sigue?

En nuestra siguiente entrega estaremos explorando la instalación de Windows 10 for IoT en el Joule.

robot-willie

Robot de dos llantas + acelerómetro/giroscópio > Una experiencia de Aprendizaje

13 Ene , 2017,
Jean Paul Jimenez
, , , , , , , , , , ,
No Comments

robot-willieResumen

Les confieso que esta es mi primera publicación; por pura insistencia de mi editor estamos acá escribiendo. En esta primera entrada discutiremos mi experiencia en Intel en la investigación de cómo programar un robot de dos ruedas mediante diversos micro-c0ntroladores, incluyendo el S4A-EDU, Arduino UNO, Aruduino 101 y Sparkfun Thing.

Detalle

A principios de este año 2017. tuve la bendición de poder pasar unos días en Intel en una experiencia “ad-hoc” de aprendizaje de tecnología, investiación, desarrollo, auspiciada por el Centro de Innovación de Intel y por José Núñez.

En esta experiencia pudimos explorar las diferentes reacciones que que tenia el robot cuando instalábamos diferentes programas (en ARDUINO IDE) con  diferente controladores para realizar rutinas como por ejemplo: movilidad hacia adelante y atrás, movimientos con giros con duración específica y también pudimos ver funcionar el acelerometro y giroscópio del chip Intel Curie.

En el fondo nos concentramos en tratar de entender cómo hacer que se mueva el robot (descrito acá) en distintas direcciones y cómo hacer que este pueda tener un movimiento rectilineo preciso, controlado utilizando el giroscopipo disponible en el Intel Curie.

Experiencia con el Acelerómetro de Intel Curie

Comenzamos aprendiendo sobre las diferentes funciones del Intel Curie. Para esto realizamos diversos experimentos descritos en este artículo de Jose Nunez acá en CostaRicaMakers.com.

La verdad me resultó sencillo de utilizar y muy útil para aprender a hacer las lecturas de los diferentes sensores (acelerómetro y giroscópio) y la utilización de las funciones de Blue Tooth Low Energy (BLE)

Experiencia con el Robot de dos llantas y el controlador S4-EDU

La verdad es que comencé con esta experiencia con altas expectativas de lo que podría aprender y hacer. Al principio el primer problema que enfrenté fue aprender un poco de programación, creo que tengo un largo camino por recorrer en esta área.

El robot en sí permite realizar movimientos de manera muy versatil gracias a su sistema de dos llantas independientes sobre las que podemos controlar dirección individual y velocidad.

Como mencioné antes fuimos probando diversos controladores, comenzando por el original del kit del robot (el S4A-EDU) que cuenta con un circuito muy interesante denominado “Puente H” (H-Bridge) que nos permite controlar la dirección y velocidad de los motores.

Una vez que pudimos hacerlo moverse usando el controlador original (S4A-EDU) nos dimos a la tarea de reemplazar dicho controlador (parcialmente) con un ARDUINO101 que como dijimos tiene sensores de movimiento (acelerómetro y giroscopio). Para esto pudimos facilmente desconectar el puente H del S4A-EDU y conectarlo al ARDUINO 101.

Como dije antes, el principal reto que enfrentamos fue la programación. Realizamos diferentes tipos de programa usando el ambiente integrado de desarrollo (IDE) de ARDUINO.

Una vez controlado por el ARDUINO 101 para realizar los movimientos básicos, el siguiente reto era comenzar a utilizar el giroscopio para leer cuanto se desviaba hacia un lado u otro el robot al caminar en una misma dirección. Para poder extraer los datos (que son muchos) de las lecturas del giroscopio, tratamos inicialmente de subirlos por WiFi a un servidor en Internet. Pare este fin introducimos un controlador más: el SPARKFUN THING.

La programación del SPARKFUN THING es algo “truculenta” ya que requiere una interfase serial para conectar la laptop donde uno escribe el programa y subirla al micro-controlador. Intentamos con un cable tipo FTDI, pero no tuvimos suerte. En resumen no funcionó por que el cable que teníamos no cuenta con línea DTR… (eso me queda pendiente de entenderlo mejor). Al día siguiente conseguimos otra interfase denomiada “FOCA V1.2” la cual permite comunicación serial con diversas opciones, con y sin línea DTR, a diferentes voltajes (3V, 5V) etc.

Ahora bien, subir datos por via WiFi a un servidor en Internet, el tiempo minimo que toma son 3 o 4 segundos… y el giroscopio generaba datos cada 200ms o menos… o sea, no nos servía la opción del WiFi… fue entonces cuando decidimos cambiar la solución. En vez de guardar los datos en Internet nos avocamos a graficarlos en mi celular usando una conexion Bluetooth Low Energy (del ARUDINO 101). Para esto fue necesario instalar una app en mi celular denominada nRF Toolbox descrita en el artículo mencionado sobre ARDUINO 101.

En este punto logramos que el robot se moviera en una misma dirección durante dos segundos y graficar durante ese tiempo las lecturas del giroscópio cada 200ms.

Control de Velocidad

Aprendí que la velocidad del robot se puede controlar mediante un método que se llama PWM (Pulse Width Modulation) y la idea es utilizar ese principio para ajustar la velocidad de cada rueda para compensar micro-desviaciones del movimiento rectilineo que queriamos lograr. Desafortunadamente no nos dio tiempo de implementar esa parte correctiva.

Conceptos Relacionados

Quiero listar acá algiunos conceptos que me parece importante profundizar en el futuro para mi propio aprendizaje en el área de robótica, tecnología y mecatrónica:

  • Variables y Constantes
  • Funciones y Métodos
  • Pasos e Instrucciones
  • Condicionales
  • Vibración
  • Frecuencia
  • Ancho de Pulso
  • Voltaje
  • Corriente/Amperaje

Agradecimientos

Quiero agradecer a el Señor Jose Núñez por permitirme esta oportunidad de estar en Intel aprendiendo mediante estos experimentos. Sinceramente me ha servido de mucho, tanto para mis estudios como para mi futuro.

IMG_20170113_000211

Intel Joule 570x Developer Kit

Ene , 2017,
Jose Nunez
,
No Comments

IMG_20170113_000514Finalmente llegó el momento de evaluar el Intel Joule. Una plataforma de amplio poder computacional y de un tamaño sumamente reducido.

Tal y como se menciona en su sitio de arranque (getting started with Intel Joule), se trata de un módulo de alto desempeño tanto en poder de computación como en procesamiento de gráficos y memoria. Está orientado a la innovación en aplicaciones de visión computarizada, robótica, drones y otras aplicaciones de alta capacidad de cómputo.

En nuestro caso, estaremos probando el kit de desarrollo Joule 570X cuyas principales características incluyen:

  • Procesador Intel Atom de cuatro núcleos a 1.7 GHz (base) hasta 2.4GHz en modo turbo. (Dos hilos por núcleo)
  • Plataforma de direccionamiento de 64bit
  • Procesador gráfico Intel de alta definición HDMI 1.4b a 450MHz (base) hasta 650MHz (modo turbo)
    • Puerto Micro-HDMI
  • Memoria RAM de 4GB con velocidad de 25.6GB/s
  • Almacenamiento de 16GB en Flash eMMC
  • Puertos USB 3.0
  • 3.5 Puertos UART
  • Conectividad WiFi y Bluetooth
  • 8 líneas dedicadas de entrada/salida de propósito general (GPIO) + 48 pines re-mapeables
  • 4 Puertos PWM
  • 1 Puerto SDIO para tarjeta SD
  • Reloj de Tiempo Real (RTC)
  • Alimentación de 12V 3A (fuente no incuida en el kit de desarrollo)
    • La documentación sugiere rango de operación de 4V a 20v *
  • Sistemas Operativos Sugeridos: Linux de referencia, Ubuntu IoT, Windows IoT
  • 7 Interfaces I2C en modo MASTER
  • Optimizado para interactuar con cámaras 3D tecnología Real Sense

Comparativamente se puede analizar el Intel Joule en contraste con el Intel Edison donde se destacan las siguientes diferencias:

  1. Más de 6X adicionales de poder de procesamiento: El Edison tiene un procesador que corre a 500MHz en contraste con 1.7GHz del Joule
  2. 4X más de memoria RAM: El Edison tiene RAM de 1GB DDR3 mientras que el Joule cuenta con 4GB LPDDR4
  3. 4X más de capacidad de de almacenamiento: El Edison provee 4GB de capacidad de almacenamiento, mientras el Joule provee 16GB ambos en tecnología eMMC Flash
  4. WiFi Mejorado: El Edison incluye conectividad WiFi para bandas de 2.4 y 5 GHz, mientras que el Joule incluye WiFi 802.11ac con MIMO.
  5. Capacidad de Video: El Intel Joule incluye controlador de video y salida de video Intel HD, mientras que el Edison no tiene salida de video integrada.
  6. Dimensiones: El Intel Joule mide 48X24x3.5mm ligeramente más grande que el Edison que mide 35.5x25x2.9mm
  7. GPIO: Más de 4X en puertos GPIO disponibles.

En nuestra próxima entrega estaremos compartndo nuestras pruebas prácticas sobre el Intel Joule.

Cabe mencionar que en nuestra prueba inicial (boot up) usamos una fuente de poder de 12V 1A. Tratamos con una de 5V 2A, pero no fue suficiente

IMG_20161206_202348

Comenzando con Intel Galileo

7 Dic , 2016,
Jose Nunez
, , , , , ,
No Comments

IMG_20161206_202348Tomando en cuenta una pequeña comunidad que hay acá en C.R. sobre Intel Galileo GEN2, acá les presentamos un pequeño resumen introductorio.

La línea Galileo de Intel parece estar más orientada a la parte didáctica de microcontroladores que funcionan con ARDUINO mezclada con Micro-computadores que corren LINUX.

Enlace con Especificaciones

Para “iniciar” con este dispositivo no se necesita mayor cosa, solo un cable de tipo USB-a-microUSB (~$6) para programarlo mediante el ambiente ARDUINO IDE. Es el mismo tipo de cable que se usa para cargar una mayoría de teléfonos Android desde una PC.

Hay un tutorial en Inglés acá: https://software.intel.com/en-us/get-started-galileo-windows

Para sacarle mayor provecho se recomienda tener lo siguiente:
• Tarjeta Micro SD de 2GB a 32GB (crcibernetica ~$8) Para instalar una versión LINUX personalizada
• Cable de tipo “6-pin Serial to Type A USB cable (FTDI cable # TTL-232R-3V3 is recommended ($20 en Amazon)” o interfaz USB/SERIAL/FTDI tipo FOCA 2.2 ($ 11 en crcibernetica) Para acceder a la consola LINUX
• Tarjeta WiFi para laptop (Centrino N135 o Centrino 6205 ~$11-$14 en Amazon) para darle conectividad WiFi. Ambas tarjetas requieren este accesorio.

La presentación estándar de Intel Galileo GEN2 incluye la fuente de poder.

El dispositivo puede ser programado con ARDUINO IDE o mediante la plataforma LINUX que corre.

IMG_20161129_172340

FOCA V2.2 by ITEAD STUDIO + GALILEO GEN2 de Intel

30 Nov , 2016,
Jose Nunez
, , , , ,
No Comments

El dispositivo FOCA v.2.2 que se consigue en amazon y en crcibernetica.com es un adaptador conocido como “FTDI” para puerto USB que permite conectar una PC a un dispositivo por puerto serial tx/rx ya sea en voltajes 3.3V o 5V. Sumanente versatil.

Uno de los principales retos para usar este dispositivo es encontrar el controlador adecuado para la PC a la que se va a conectar.

En nuestro caso, para Windows 10, pudimos utilizar un controlador del fabricante silabs que se puede descargar en este enlace:

http://www.silabs.com/products/mcu/pages/usbtouartbridgevcpdrivers.aspx#windows

http://www.silabs.com/Support%20Documents/Software/CP210x_Windows_Drivers.zip

Una vez que hemos instalado el controlador (usando el Administrador de Dispositivos y la opción de “Actualizar Controlador”), pudimos probarlo exitosamente conectándolo al puerto FTDI de un Intel Galileo GEN2 para acceder a la terminal Linux del Galileo. Seguidamente les mostramos el “pinout” o distribución del cableado. Para la prueba usamos putty (de putty.org) a una velocidad de 115200 baudios.

GALILEO GEN2                 FOCA V2.2
   1 (BLK) <===  BLACK  ===> GND
   2 (RTS)  | NO CONECTAR |
   3       <===    RED  ===> VCCIO (Puede dejarse desconectado)
   4 (RXI) <=== PURPLE  ===> TXD
   5 (TXO) <===   GRAY  ===> RXD
   6 (CTS) <===  BROWN  ===> DTR

IMG_20161129_172340

 

 

curie

Intel Curie – Punto de Partida (Documento Cambiante)

20 Ago , 2016,
Jose Nunez
one comments

Acá algunos enlaces útiles para desarrollar con Intel Curie:

 

 

 

IMG_20160713_154251

Robot de dos llantas y un micro-controlador S4A-EDU

13 Jul , 2016,
Jose Nunez
, , , ,
one comments

Descripción

En este experimento vamos a montar un pequeño robot de dos ruedas que controla su trayectoria mediante la diferencia de velocidad de cada rueda. Para esto utilizaremos un micro-controlador denominado S4A-EDU (Sketch 4 Arduino EDUCATION). El cual implementa la circuitería necesaria para controlar dos motores DC incluyendo la implementación de dos circuitos de “Puente H” que se utilizan para controlar la dirección en la que gira cada motor manipulando la polaridad a la que son expuestos.

Este es un experimento resumido que require un nivel de conocimiento medio en Arduino y Electrónica.


Referencias Externas

  1. Manual Introductorio del Microcontrolador (en inglés): S4AIntroduction
  2. Sketch for Arduino: http://s4a.cat

Advertencia y Condiciones de Uso

(!) Antes de seguir estas instrucciones asegúrese de entender las Condiciones de Uso de nuestro sitio.


Materiales


Pasos Resumidos

A. Montaje y Prueba Inicial

  1. Ensamble el chasis con las ruedas y los motores (siguiendo las instrucciones del fabricante)
  2. Agregue  el microcontrolador S4A-EDU al chasis
  3. Asegúrese de que el interruptor on/off del micro-controlador S4A-EDU está colocado en la posición de OFF
  4. Conecte el micro-controlador S4A-EDU al computador usando un cable de USB a Mini-USB
  5. Windows:
    1. Instale el “controlador de windows” para el puerto USB del microcontrolador CP210x (nosotros lo descargamos de este enlace)
  6. Arduino IDE:
    1. Instale y seleccione la tarjeta “Amtel atmega328p xplained mini“. La encontramos buscando “328p” en Tools > Boards > Boards Manager
    2. Configure  el puerto correspondiente. Para nuestro caso aparece  en el “Device Manager” como “Silicon Labs CP210x USB to UART Bridge en COMxx
    3. Abra el ejemplo  “Blink” (File > Examples > 01.Basics > Blink) y subirlo al microcontrolador.
    4. En este punto la luz (azul en nuestro caso) del S4A-EDU parpadea cada segundo. Nótese que el interruptor on/off del micro-controlador está todavía en la posición OFF.
    5. (!) En este punto tenemos un chasis de robot con dos ruedas, con un micro-controlador S4A-EDU montado sobre el chasis el cual podemos programar utilizando el ARDUINO IDE.

B. Trabajando en los motores

En esta etapa vamos a conectar los motores al micro-controlador S4A-EDU y vamos a utilizar un programa básico para hacer que el robot “gire sobre su propio eje”. Esto es, hacer que una de las llantas se mueva en una dirección y la otra llanta en la dirección opuesta, ambas a la misma velocidad.

  1. Conexiones:
    1. Asegúrese de que el interruptor on/off del micro-controlador S4A-EDU está colocado en la posición de OFF
    2. Conecte el positivo de cada motor (cable rojo) y el negativo (cable negro) de cada motor según se indica en la parte inferior derecha de la siguente imagen.robot_rotate
    3. En nuestro caso, vamos a alimentar el sistema mediante una batería LIPO 3.7V de 2500MAh.  (!) Nótese que el circuito funciona con 6-9V según las especificaciones. Nosotros en este experimento usamos un convertidor de 3V a 5V el cual parece funcionar perfectamente.
  2. Arduino IDE:
    1. Abra un nuevo programa en el ARDUINO IDE, y pegue en él el código de este archivo: https://github.com/janunezc/robotics/blob/master/_02_s4a_edu_rotate/_02_s4a_edu_rotate.ino
    2. Cárguelo al S4A EDU
  3. Funcionamiento del Programa:
    1. En la función “setup()” se definen los pines del controlador utilizados para manipular los motores junto con el pin 13 que se utiliza para ilumnar el LED integrado en el micro-controlador S4A-EDU; que nos va a servir de medio para ver la ejecución del programa.
    2. Una vez definidos los pines de salida se hace una llamada a la función doBlink la cual hace parpadear rápidamente el LED integrado como indicativo del que el Setup está completado.
    3. Seguidamente se configuran la velocidad y dirección de cada motor. Es en este momento que el robot comienza a girar.
    4. La función loop() permanece vacía en este caso.
    5. La función setMotor() se encarga de manipular los pines de velocidad y dirección para el motor solicitado.
    6. La función doBlink() se encarga de hacer parpadear el LED del micro-controlador un numero de veces determinado con una espera entre transiciones tambien determinado en los parámetros.
  4. (!) En este punto. Al desconectar el cable USB del micro-controlador S4A-EDU y poner el interruptor a la posición ON, el sistema parpadea 10 veces el LED indicador y comienza a girar sobre su propio eje.

Agradecimientos

Queremos expresar nuestro agradecimiento a nuestro colega Gerardo Mora y al estudiante Jean Paul Jimenez por acompañarnos en esta aventura de descubrir el funcionamiento de los diferentes componentes de este robot.

IMG_20160524_204326

El Nuevo ARDUINO MKR1000 es una belleza

25 May , 2016,
Jose Nunez
No Comments

Hoy probamos por un rato el Arduino MKR1000 (GENUINO MKR1000 que es lo mismo)

Se trata de uno de los productos más recientes de la familia ARDUINO, un microcontrolador que incorpora conectividad WiFi y encripción por hardware, lo cual le permite conectarse al Internet usando protocolo HTTPS; que – en mi opinión – lo ubica por encima del afamado Sparkfun Thing ESP8266.

Pueden ver las especificaciones de este dispositivo acá: https://www.arduino.cc/en/Main/ArduinoMKR1000

Dentro de las funciones más destacadas podemos mencionar:

  • Microcontrolador de bajo consumo eléctrico de 32 bits.
  • Puerto de alimentación USB de 5V
  • Conector para batería LIPO de 3.7V, 700mAh
  • Voltaje de operación de 3.3V (! Importante… por que el voltaje aplicado a los puertos de GPIO no debe superar los 3.3V)
  • 8 (ocho) puertos de I/O Digitales de propósito general, que incluyen 4 (cuatro) pines PWM
  • 1 Puerto serial UART
  • 1 Puerto SPI
  • 1 Puerto I2C
  • 7 Entradas analógicas de 8/10/12 bits
  • 1 Salida Analógica (DAC de 10 bits)
  • 8 Puertos con capacidad de interrupción externa (0,1,4,5,6,7,8,A1,A2)
  • Capacidad de entregar 7mA de corriente en cada I/O Pin
  • Memoria no-volatil (FLASH) de 256KB
  • Memoria Volatil (SRAM) de 32KB
  • RTC de 32.768 KHz
  • 48MHz de Procesamiento
  • Puerto USB como cliente y embedded host
  • Comunicación WiFi
  • Chip de Encripción que permite la comunicación por protocolo SSL
  • Precio al momento de escribir este artículo: ~$35 (aca)
  • Utiliza la libreria Wifi101 disponible en la ultima version del ARDUINO IDE.

Lo primero que probamos – SSL

Por supuesto, la capacidad de conectarse a un servidor via HTTPS/SSL. Para esto utilizamos el tutorial titulado “Scheduled WiFi SSL Web Client“; solo que le realizamos algunas modificaciones para entender mejor el código… pueden encontrarse aca: enlace o ver listado 1 abajo.

Lo segundo que probamos – Access Point

Como ya dijimos, es compatible con la librería WiFi101; así que decidimos probar el ejemplo llamado “AP_SimpleWebSever” el cual implementa un Access Point, y un servidor web que escucha en la dirección IP 192.168.1.1 y sirve un par de enlaces que automáticamente encienden y apagan un LED. Ver Listado 2 abajo.

2016-05-24_2035

 

Listado 1 – SSL + MKR1000 + PVCLOUD TEST

/*
  Scheduled WiFi SSL Web Client for MKR1000

  This sketch connects to the Arduino website every minute and downloads the ASCII logo to display it on the serial monitor

  created 19 Jan 2016
  by Arturo Guadalupi <a.guadalupi@arduino.cc>

  http://arduino.cc/en/Tutorial/

  This code is in the public domain.

  Modified by Jose Nunez <jose.nunez@intel.com> 
  
*/

#include 
#include 
#include 

char ssid[] = "opodiym";      //  your network SSID (name)
char pass[] = "luaus7151";       // your network password

int keyIndex = 0;                  // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;

// Initialize the Wifi client library
WiFiSSLClient client;
 
// server address:
char server[] = "costaricamakers.com";

bool sendRequest = true; // used to understand if the http request must be sent

/* Create an rtc object */
RTCZero rtc;

/* Change these values to set the current initial time */
const byte seconds = 50;
const byte minutes = 00;
const byte hours = 17;

/* Change these values to set the current initial date */
const byte day = 24;
const byte month = 05;
const byte year = 16;

void setup() {
  delay(3000);
  Serial.begin(115200);
  serialOut("Begin...");

  serialOut("Connecting to Access Point...");
  connectToAP();    // connect the board to the access point
  
  serialOut("Printing WIFI Status...");
  printWifiStatus();

  serialOut("Making initial HTTP Request...");
  httpRequest();

  serialOut("Calling listenToClient()...");
  listenToClient();

  serialOut("Setting RTC Up...");
  rtc.begin();
  rtc.setTime(hours, minutes, seconds);
  rtc.setDate(day, month, year);

  rtc.setAlarmTime(0, 0, 0);    //in this way the request is sent every minute at 0 seconds
  rtc.enableAlarm(rtc.MATCH_SS);

  rtc.attachInterrupt(alarmMatch);

  serialOut("SETUP COMPLETE");
}
void loop() {
 
  if (sendRequest) {
    serialOut("sendRequest was TRUE");
    sendRequest = false;

    serialOut("Calling httpRequest()...");
    httpRequest();

    serialOut("Calling listenToClient()...");
    listenToClient();
  }
}

void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

void alarmMatch() {
  sendRequest = true;
}

void connectToAP() {
  // check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    // don't continue:
    while (true);
  }

  // attempt to connect to Wifi network:
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid, pass);

    // wait 1 second for connection:
    delay(1000);
  }
}

// this method makes a HTTP connection to the server:
void httpRequest() {
  sendRequest = false;

  // Print request time
  Serial.println();
  Serial.print("Request sent @ ");
  print2digits(rtc.getHours());
  Serial.print(":");
  print2digits(rtc.getMinutes());
  Serial.print(":");
  print2digits(rtc.getSeconds());
  Serial.println();
  Serial.println();

  if (client.connect(server, 443)) {
    // Make a HTTP request:
    client.println("GET /pvcloud_test/mkr1000test.json HTTP/1.1");
    client.println("Host: costaricamakers.com");
    client.println("User-Agent: MKR1000/1.1");
    client.println("Connection: close");
    client.println();
  }
  else {
    Serial.println("connection failed");
  }
}

void listenToClient()
{
  unsigned long startTime = millis();
  bool received = false;

  while ((millis() - startTime < 5000) && !received) { //try to listen for 5 seconds
    while (client.available()) {
      received = true;
      char c = client.read();
      Serial.write(c);
    }
  }
  client.stop();
  Serial.println();
  serialOut("listenToClient() FINISHED");
}

void print2digits(int number) {
  if (number < 10) {
    Serial.print("0");
  }
  Serial.print(number);
}

void serialOut(String message){
  Serial.println("-------------------------------------------------------------------------------");
  Serial.print(millis());
  Serial.print(": ");
  Serial.println(message);
}

Listado 2 – AP_SimpleWebServer

/*
  WiFi Web Server LED Blink

  A simple web server that lets you blink an LED via the web.
  This sketch will create a new access point (with no password).
  It will then launch a new server and print out the IP address
  to the Serial monitor. From there, you can open that address in a web browser
  to turn on and off the LED on pin 13.

  If the IP address of your shield is yourAddress:
    http://yourAddress/H turns the LED on
    http://yourAddress/L turns it off

  created 25 Nov 2012
  by Tom Igoe
  adapted to WiFi AP by Adafruit
 */

#include <SPI.h>
#include <WiFi101.h>

int led =  LED_BUILTIN;

char ssid[] = "wifi101-network"; // created AP name
char pass[] = "luaus7151";      // AP password (needed only for WEP, must be exactly 10 or 26 characters in length)
int keyIndex = 0;                // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;
WiFiServer server(80);

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  Serial.println("Access Point Web Server");

  pinMode(led, OUTPUT);      // set the LED pin mode

  // check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    // don't continue
    while (true);
  }

  // print the network name (SSID);
  Serial.print("Creating access point named: ");
  Serial.println(ssid);

  // Create open network. Change this line if you want to create an WEP network:
  if (WiFi.beginAP(ssid) != WL_CONNECTED) {
    Serial.println("Creating access point failed");
    // don't continue
    while (true);
  }

  // wait 10 seconds for connection:
  delay(10000);

  // start the web server on port 80
  server.begin();

  // you're connected now, so print out the status
  printWifiStatus();
}


void loop() {
  WiFiClient client = server.available();   // listen for incoming clients

  if (client) {                             // if you get a client,
    Serial.println("new client");           // print a message out the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        if (c == '\n') {                    // if the byte is a newline character

          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();

            // the content of the HTTP response follows the header:
            client.print("Click here turn the LED on
");
            client.print("Click here turn the LED off
");

            // The HTTP response ends with another blank line:
            client.println();
            // break out of the while loop:
            break;
          }
          else {      // if you got a newline, then clear currentLine:
            currentLine = "";
          }
        }
        else if (c != '\r') {    // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }

        // Check to see if the client request was "GET /H" or "GET /L":
        if (currentLine.endsWith("GET /H")) {
          digitalWrite(led, HIGH);               // GET /H turns the LED on
        }
        if (currentLine.endsWith("GET /L")) {
          digitalWrite(led, LOW);                // GET /L turns the LED off
        }
      }
    }
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}

void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
  // print where to go in a browser:
  Serial.print("To see this page in action, open a browser to http://");
  Serial.println(ip);
}