Más información sobre cómo hizo el proyecto aquí.
Hasta pronto.
Microcontroladores, robótica, open hardware, Arduino, Raspberry Pi, ... hacking electronics
Cuando emprendas tu viaje hacia ÍtacaEl largo viaje, lleno de altos y bajos, es lo que justifica afrontar nuevos retos cada día. No es la gratificación, que a veces no llega, sino el aprendizaje y las vivencias del camino.
debes rogar que el viaje sea largo,
lleno de peripecias, lleno de experiencias.
No has de temer ni a los lestrigones ni a los cíclopes,
ni la cólera del airado Posidón.
Nunca tales monstruos hallarás en tu ruta
si tu pensamiento es elevado, si una exquisita
emoción penetra en tu alma y en tu cuerpo.
Desde hace unos dos años estos robots usan Arduino (cuatro procesadores cada uno de ellos). Antes usaban uno o dos procesadores mucho más potentes, pero para ellos (que tienen menos de 19 años para poder participar en esta competición) es mucho más sencillo dividir el "problema" en tareas independientes que ejecuta separadamente cada uno de los procesadores. Lo que se llama un sistema distribuido.En la versión actual ambos robots llevan programas muy similares aunque uno desempeña el roll de delantero y otro de portero. Usan lo que llamamos "ejecución orientada al comportamiento" donde cada uno de los robots adopta una actitud diferente en función de la información que recibe de los sensores: 24 sensores para localizar la pelota, 2 sensores adicionales para saber si está muy cerca, 4 sensores de US para determinar su posición en el campo, una brújula electrónica, cuatro sensores de luz en el suelo para detectar las líneas del campo.
Arduino Duemilanove detecta si alimentamos la placa desde el conector USB de forma automática, no hace falta configurarlo a través de un jumper. Voy a explicar cómo se consigue esto en Arduino Duemilanove.
Esa tensión de USBVCC se lleva al drenador de un transistor MOSFET tipo P, cuya base está controlada por el siguiente circuito:
El transistor MOSFET (NDT2955) conducirá, dejando pasar la corriente de alimentación del conector USB a la alimentación del circuito (+5V), si la base del transistor (GATE_CMD) está a masa (GND o 0V). ¿Cuándo ocurre eso?.
Vemos que IC5A es un circuito comparador. Está comparando la mitad de la tensión de alimentación proveniente del conector de alimentación externa (VIN) con 3.3V. Si la tensión en el terminal positivo del operacional es mayor que la del negativo, tendremos a la salida del comparador la tensión positiva de alimentación del operacional (aunque no lo indique el esquemático, esta tensión es de +5V), en caso contrario, tendremos GND.
Si no hay alimentación externa VIN, la tensión CMP será GND (gracias al pulldown R11), y por tanto a la salida de IC5A tendremos GND. El circuito conIC5B es un (prescindible) seguidor de tensión, a su salida tenemos la misma tensión que a la salida de IC5A, por tanto la tensión GATE_CMD será también GND. De esta forma el transistor MOSFET conducirá y se alimentará la placa a través del USB.
Si existe alimentación externa VIN mayor que 7V, a través del conector de alimentación, tendremos una tensión superior a 3.3V en CMP, tendremos tensión positiva en la salida de IC5A y por tanto tendremos también tensión positiva en la base del transistor NDT2955. Eso significa que el transistor estará abierto, y +5V vendrá de la salida del regulador lineal IC4, tal como comentamos en anteriores posts.
Es importante remarcar un punto que nos quedó pendiente de matizar en posts anteriores y que en este se ha explicado de una forma, quizás, demasiado implícita. La tensión mínima externa (no USB) es de 7V, porque para detectar la fuente de alimentación (USB o externa) se compara VIN/2 con 3.3V. Por tanto, para que se detecte que efectivamente se está alimentando Arduino desde una fuente externa, ésta tiene que ser superior a 7V.
La corriente máxima, según el datasheet del fabricante, para estos 3.3V es de 50mA.
Hasta pronto.
Vregulador_in = VPOWERIN-VdiodoVdropout = Vregulador_in - Vregulador_out
El consumo en corriente de la placa en modo estable depende, evidentemente del programa que tengamos corriendo en el microcontrolador, del número de pines activos como salidas, ... Considero, como aproximación, que es de 50mA.
La potencia que disipa por defecto, en su modo estático, el regulador sería:
Pdisipada_regulador = dVregulador * Iout
Considerando que alimentamos a 12V (VPOWERIN), la potencia disipada será:
Pdisipada = (12 - 0,7 - 5) * 0,05 = 315 mW
En el datasheet se dice que el regulador tiene un circuito de limitación térmica interna que deshabilita la salida a 170ºC, pero que nunca esta protección puede ser considerada como un disipador (o heatsink). No se tiene que considerar como variable en nuestro diseño.
En resumen, antes de decidirnos a alimentar el shield a través del Arduino, tenemos que saber qué consumo le estaremos exigiendo. Si es superior a 150mA en los 5V, tenemos que plantearnos la opción de utilizar otra fuente auxiliar para alimentar el shield (baterias, otra conexión de alimentación externa (ojo con las masas),...) o reducir el consumo.
También hay que considerar que en todo momento he hablado de consumo estable. El regulador es capaz de disipar más potencia de la especificada si sólo tiene picos de corriente puntuales.
En el caso de alimentación por el puerto de USB la situación es diferente, hay que tener otras consideraciones que trataremos en otros futuros post.
Hasta pronto.
Vemos que la net de alimentación es VIN, y la tensión de alimentación interna del circuito es +5V. En la siguiente foto se señala la parte de la placa que corresponde con el circuito:
Entre los dos terminales señalados en la imagen debemos 5V incluso si alimentamos a través del USB.
En el siguiente post describiré la limitaciones en corriente de las fuentes internas de 5V y de 3.3V, y se describirá con más detalle las razones por las que el margen de tensión de alimentación va de 7V a 12V.
Hasta pronto.
pinMode(13,OUTPUT);
De esta forma, cuando asignamos la I/O 13 como salida, en realidad estamos configurando el pin 19 (PB5) del microcontrolador, como salida. Esto hay que tenerlo en cuenta para interpretar correctamente el esquemático de Arduino. Cosa que haremos en próximos posts.
Hasta pronto.
A los mensajes por el puerto serie enviados desde el programa se les llama “trazas del programa”. Las llamaremos así a partir de ahora.
Para hacer uso de este Serial Monitor tenemos que añadir instrucciones en el programa. Son instrucciones dedicadas a configurar el puerto serie, primero, y sacar el mensaje por el puerto.
Las instrucciones son:
Las trazas son una herramienta muy potente para depurar programas sencillos. A nivel los programas se depuran mediante herramientas más sofisticadas con las que se pueden tener acceso a los registros internos del microcontrolador.
Añadiendo estas trazas podemos asegurarnos que se ha cargado nuestro programa dentro de Arduino. El programa Blink modificado queda:
void setup() {Añadiendo estas dos lineas de comandos, habilitamos el Serial Monitor y al ejecutar el programa por primera vez obtenemos la siguiente traza:
// initialize the digital pin as an output:
pinMode(13, OUTPUT);
Serial.begin(9600); //abre el puerto serie
//para enviar al PC
//info a 9600 bps
Serial.println("Tutorial Arduino. Blink"); //imprime por el puerto serie
}
void loop() {
digitalWrite(13, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(13, LOW); // set the LED off
delay(1000); // wait for a second
}
En Windows XP, se abrirá el diálogo de instalación de Nuevo Harware:
Cuando te pregunten: ¿Puede Windows conectarse a Windows Update para buscar el software? selecciona No, no esta vez. Haz click en Siguiente. Selecciona Instalar desde una lista o localización específica (Avanzado) haz click en Siguiente. Asegurate que Buscar los mejores drivers en estas localizaciones esté seleccionado; deselecciona Buscar en medios removibles; selecciona Incluye esta localización en la búsqueda y navega al directorio drivers/FTDI USB Drivers dentro de la carpeta de Arduino que has descomprimido previamente. (La versión más reciente de los drivers se puede encontrar en la página web del fabricante delchip FTDI.) Haz click en Siguiente. El asistente de instalación buscará los drivers y te anunciará que encontró un "USB Serial Converter" (se traduce por Conversor USB-Serie). Haz click en Finalizar. El asistente de instalación de hardware volverá a iniciarse. Repite los mismos pasos que antes y selecciona la misma carpeta de instalación de los drivers. Esta vez el sistema encontrará un "USB Serial Port" (o Puerto USB-Serie). Puedes comprobar que los drivers se han instalado correctamente abriendo la carpeta del Administrador del Dispositivos, en el grupo Dispositivos del panel de control del sistema. Busca "USB Serial Port" (o Puerto USB-Serie)en la sección de puertos; esa es tu placa Arduino.
Espero que os sean útiles.
Volveré sobre este tema en el futuro.
Hasta pronto.
Hasta pronto
Veamos en más detalle cómo se hace lo explicado anteriormente.
Compilar
Al pulsar el botón superior izquierda, indicado con un círculo rojo en la figura superior, se verifica el programa, es decir, se compila el programa. Seleccionamos ese botón, esperamos unos segundos, y vemos lo que ocurre:Vemos que nos sale un mensaje de error, NO os preocupéis, este error de compilación ha ocurrido después de que yo haya hecho trampa. Se trata de mostraros lo que ocurre cuando realmente ocurre un error en el programa. En nuestro caso, lo que he hecho es quitar el punto y coma que hay en la linea del setup. Esta modificación no le ha gustado al compilado y ha mostrado un mensaje de error: “expected ';' before “)” token. Este mensaje nos indica que nos hacía falta cerrar la linea de instrucción con un punto y coma.
Dejamos el programa tal como estaba inicialmente, con el punto y coma en su sitio y volvemos a ejecutar el compilador con el programa ya corregido. El resultado esta vez es:
Cuando pulsamos en esta opción, estamos grabando el programa en la placa. Lo siguiente es comprobar que el programa hace lo que esperamos. Lo comprobaremos en el próximo post.
No hay tiempo que perder.
Hasta pronto.
Las promesas son deudas y se había hecho una en este blog: un tutorial sobre Arduino.
No hay escusas. No hay tiempo que perder.
El objetivo de este capítulo es ponernos en marcha. Ejecutar nuestro primer programa. En puntos posteriores habrá tiempo para entrar en detalles sobre el software y hardware de Arduino, pero creo, que para empezar, lo mejor es ver como efectivamente nuestro Arduino funciona correctamente. Instalaremos el IDE y ejecutaremos un programa sencillo. Eso nos mostrara cómo de fácil es comenzar a obtener resultados.
Instalación del IDE
Arduino es un dispositivo vivo, que se a menudo se actualiza con nuevas versiones de Software y Hardware. Con la sana intención de hacer un tutorial que no caduque a las dos días, lo mejor que podéis hacer para arrancar Arduino es seguir las instrucciones que proporciona la website del proyecto Arduino (http://arduino.cc/en/Guide/HomePage). Visitando esa web encontrareis los últimos ficheros disponibles y las instrucciones de instalación de Arduino.
Considerando que habéis seguido las instrucciones de instalación correctamente, deberéis disponer del sistema de desarrollo instalado.
Recomendación: crear un link al escritorio con el ejecutable de Arduino para poder acceder al ejecutable directamente.
Sketches
Sketch es el nombre que se le ha dado a los programas que ejecutamos en Arduino.
Con el IDE se nos proporcionan algunos sketches de ejemplo, son muy útiles para introducirnos en el mundo Arduino.
Recuerda que los programas, o sketches, de Arduino están escritos en lenguaje C. Libros de referencia básicos de lenguaje C son:
Los sketches tienen la misma estructura básica, requieren, al menos, de dos funciones:
Pueden crearse multitud de funciones adidicionales que se son llamadas desde loop. A medida que el programa vaya cogiendo complejidad, para hacerlo ininteligible, más fácil de mantener, esta división en funciones simples del programa, se convierte en un requerimiento necesario para poder trabajar con el programa. Divide la complejidad y venceras.
Seguidamente ponemos uno de los exemplos proporcionados por el IDE de Arduino. Veremos en él las partes que hemos mencionado anteriormente y añadiremos algunos detalles. Trabajaremos con el sketch Examples -> Basics -> Blink:
/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.
This example code is in the public domain.
*/
void setup() {
// initialize the digital pin as an output:
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(13, LOW); // set the LED off
delay(1000); // wait for a second
}
Este sencillo ejemplo nos ayudará a identificar las distintas partes de las que está compuesto un programa.
Comentarios
Como veis, inicialemente tenemos una lineas que nos describen el programa, su funcionalidad. Cuando querramos comentar varias lineas, de forma que el compilador no entienda esas lineas como comandos, tenemos que acotarlas de la siguiente forma:
/*
comentarios
*/
Existe otra forma de comentar una sola lineas, se trata de utilizar dos contrabarras:
\\comentarios
La diferencia entre los dos métodos, tal como he comentado, es que una sirve para varias lineas y la segunda solo para una linea.
En todo caso, comentar el programa es excelente hábito. A veces, incluso a nivel profesional, se nos olvida comentar el programa. Al cabo de unas pocas lineas, el trabajo se transforma en un ente opaco, marronuzco, hasta poder convertirse en una pesadilla para cualquiera que se enfrente a él. Por tanto, desde el principio tenedlo claro, hay que comentar todo lo que hagamos, incluso lo más trivial. En el futuro, seguro que lo agradeceremos.
En el caso de nuestro ejemplo, los comentarios describen la funcionalidad del programa, activar y desactivar un pin de salida cada segundo, a ese pin hay conectado un LED en la placa de Arduino.
Setup
Esta es la función en la que configuramos la funcionalidad de los distintos pines. Más adelante explicare qué posibilidades de configuración hay en esta función, cuántos pines tenemos y cómo se pueden configurar. Por ahora, lo único que nos interesa es que:
esta función es obligatoria en todos los programas
sirve para configurar los pines del microcontrolador
la instrucción que se utiliza para configurar la mayoría de los pines es pinMode (pin, mode). Donde pin es el numero del pin que queremos configurar y el mode, es donde ponemos si queremos que sea un pin de entrada (INPUT) o de salida (OUTPUT).
En el ejemplo que estamos analizando, se configura el pin 13 como pin de salida.
Loop
Esta es la función donde alojamos las funcionalidad. Como todo los programas embebidos, es un programa que se ejecuta secuencialmente e indefinidamente. Es un bucle de instrucciones que constituye la funcionalidad de nuestra placa.
Es aquí donde tenemos que ser creativos y con las herramientas que nos da el idioma de programción C, tenemos que idear el programa que implemente la funcionalidad deseada. Ese es el juego, ese es el reto.
En nuestro ejemplo se activa el pin 13 mediante la instrucción digitalWrite (pin,valor). Donde pin es el numero del pin cuyo estado queremos cambiar. Debe ser un pin previamente configurado en la función setup. Y valor, puede ser, en este caso de señal digital, nivel alto (1 lógico o HIGH), o nivel bajo (0 lógico o LOW).
De forma que el programa ejemplo lo que hace es activar el pin 13, ponerlo a nivel alto, encendiendo el LED, espera 1 segundo y pone el pin a nivel bajo, apagando el LED. Al estar dentro de la función de loop, esta sucesión de instrucciones se ejecutan en un bucle (loop).
Proximamente más. Produndizaremos en cómo ejecutar el programa ejemplo.
Hasta pronto.
“una plataforma de programación física de código abierto, basado en una placa de
entradas/salidas (I/O) y un ambiente de desarrollo que implementa el lenguaje Processing. Arduino puede utilizarse para
desarrollar objetos autónomos interactivos, o se puede conectar al software de
tu ordenador”
Arduino viene a ser la conjunción de tres cosas:
Detrás de Arduino hay una forma de trabajar, de enfocar la electrónica desde un punto de vista práctico. En inglés hay un término que Manzi utiliza para definir la filosofía que hay tras Arduino, el término es tinkering: disfrutar experimentando con máquinas.
Pero no todo el mundo tiene el conocimiento para experimentar con máquinas, ser creativos con ellas. ¿No todo el mundo? La ambición de Arduino y de su plataforma de programación es hacerlo accesible que cualquiera pueda utilizarlo con éxito.
Arduino, con su sencillez, incita a experimentar sin un objetivo claro, por el gusto de hacer prototipos, de ser creativo. Gracias a eso, Arduino ha sido adoptado por ámbitos ajenos a la electrónica, como ninguna plataforma de este tipo lo había sido antes. Hay ejemplos de aplicaciones de lo más variadas. Sólo la imaginación, y las propias limitaciones de la placa, ponen límites.
¿Qué necesitamos para empezar a trabajar con Arduino?:
Y estas son todas las piezas del juego. Al menos las piezas fundamentales, ya veremos que para ampliar las posibilidades de la placa, podemos añadir componentes que controlaremos a través del microcontrolador del Arduino.
En este tutorial, iniciaré una explicación sobre cómo empezar a trabajar, y qué posibilidades de ampliación tenemos. Añadiré componentes externos para ilustrar algunas de las posibilidades que existen, y explicaré las placas de ampliación, conocidas como shields, más extendidas entre los aficionados.
Algunos ejemplos de shields son:
Aquí va unos links a añadir a favoritos, directorio Arduino, para aprender y estar a la última en diseños:
En cuanto a bibliografía, algunos libros sobre Arduino:
En el siguiente capítulo del tutorial nos pondremos manos a la obra con Arduino. Nos aseguraremos que tenemos todo en marcha para empezar a hacer nuestros propios diseños.
Hasta pronto.
Anunciamos un tutorial sobre Arduino.
Se ha escrito mucho sobre Arduino, seguramente en este mismo instante hay varios centenares de personas escribiendo un nuevo tutorial o desarrollando una nueva aplicación, así que resultaría demasiado pedante por mi parte pensar que puedo escribir algo original. No os prometo nada.
Este será un tutorial con la única ambición de ser riguroso.
La estructura del tutorial será la siguiente:
1. Introducción
2. Manos a la obra
3. Programación
4. Hardware
5. Desarrollo de Proyectos
Por supuesto me reservo la libertad de ir cambiando el índice a medida que vaya desarrollando el tutorial ;-)
Hasta pronto.