arduino

1.3 Semáforo doble con cruces peatonales

Semáforo doble con cruces peatonales en Arduino

Último post sobre simulación de semáforos en Arduino. En este ejercicio veremos cómo simular el comportamiento de un semáforo doble (o dos semáforos) que tienen además un cruce peatonal.

En total vamos a usar 10 leds: 3 para el semáforo 1, 3 para el semáforo 2 y finalmente 4 para los dos cruces peatonales (verde y rojo)

El ejercicio anterior trató sobre un semáforo doble en Arduino; el presente es la “continuación” del mismo.

Continue reading…

1.1 Semáforo simple

Semáforo en Arduino sin delay

Hace algún tiempo vimos cómo simular un semáforo con 3 leds en Arduino, en donde usamos delay. En este post veremos exactamente lo mismo, pero con una condición: no usar delay.

El enfoque que hoy veremos servirá para otros proyectos en donde no podemos usar delay, por ejemplo, en uno en donde debemos escuchar el botón presionado de un teclado pero además debemos usar el tiempo de alguna manera (en un cronómetro por poner una referencia).

Continue reading…

Obtener dirección de módulo I2C para LCD con Arduino

Introducción

Si queremos usar el módulo I2C para conectar nuestra LCD y ahorrar cables, es necesario (en la mayoría de casos) saber la dirección hexadecimal de dicho módulo. Dicha dirección puede (y siempre lo hace) variar.

Para ahorrarnos los problemas, alguien más hizo un sketch en Arduino que prueba con todas las direcciones posibles y en caso de encontrar algún dispositivo I2C nos avisa.

Hoy veremos cómo usar dicho sketch. Por cierto, lo encontré aquí, créditos a su autor.

Conexión

La conexión es simple. Un pin va a tierra, otro a voltaje positivo. Los otros dos son SCL y SDA. Lo que varía son estos dos últimos pines. Aquí mostraré la conexión para Arduino MEGA, UNO y Leonardo.

Arduino MEGA

  • SCL: Pin 21
  • SDA: Pin 20

Imagen de Fritzing:

Arduino UNO

  • SDA: Pin A4
  • SCL: Pin A5

Imagen de Fritzing:

Arduino Leonardo

Los pines SCL y SDA están marcados con esas leyendas. De todos modos dejo la imagen de Fritzing:

Código y modificaciones

Le hice algunas modificaciones al código original. Para comenzar, lo traduje al español y reduje el tiempo de espera en cada iteración. También lo puse en un gist de GitHub para que cualquier persona pueda copiarlo, pegarlo en el editor de Arduino y subirlo a la tarjeta.

Nada de zips, nada de “Descarga esta librería” y cosas de esas. Simplemente pega el siguiente código en tu editor:

Una vez subido al Arduino, abre el monitor serial con Ctrl + Shift + M y se verá algo así:

Así estará infinitamente. Si dice que no se encontró ninguno, por favor verifica la conexión. Ya con la dirección podemos pasar ahora sí a trabajar con una pantalla LCD que usa este módulo.

Recuerda que la dirección es tal cual la manda, por lo que en mi caso es 0x3F. Es esencial copiar tal y como está dicha dirección.

Descargar, instalar y configurar fritzing

Introducción

Fritzing es un programa libre de automatización de diseño electrónico que busca ayudar a diseñadores y artistas para que puedan pasar de prototipos (usando, por ejemplo, placas de pruebas) a productos finales.

Fritzing fue creado bajo los principios de Processing y Arduino, y permite a los diseñadores, artistas, investigadores y aficionados documentar sus prototipos basados en Arduino y crear esquemas de circuitos impresos para su posterior fabricación.

Además, cuenta con un sitio web complementario que ayuda a compartir y discutir bosquejos y experiencias y a reducir los costos de fabricación. y su diseño de arte de artistas.

Personalmente lo ocupo para diseñar circuitos de Arduino, ya que tiene muchos componentes. Además, nosotros podemos crear los nuestros. Es gratuito y puede exportar a imagen, PDF, etcétera.

Descargar

Vamos a la página de descargas: Click aquí

En la siguiente página seleccionamos No donation y hacemos click en Download:

 

Ahora nos llevará a otra página en donde vamos a elegir nuestro sistema operativo. Si tenemos Windows o Linux podemos elegir entre 32 y 64 bits. Si tenemos MacOS X sólo tenemos una opción.

En mi caso la descargaré para Windows de 64 bits. Es un archivo comprimido que podemos extraer con nuestro software de compresión favorito.

Extraer

Recomiendo extraerlo en C:\fritzing para tenerlo como un programa normal

Creando acceso directo

Cuando haya terminado podemos abrir la carpeta que elegimos para extraerlo y dentro habrá una carpeta llamada fritzing.0.9.3b.64.pc o algo parecido.

Entraremos a ella y dentro veremos muchos archivos, aunque sólo nos importa el ejecutable, ya que lo demás son componentes y librerías:

Con un recuadro azul marqué la aplicación. Ahora podemos crear un acceso directo a ella o anclarlo al inicio o a la barra de herramientas.

Y finalmente podemos abrirlo:

Actualizaciones

Cuando haya actualizaciones el programa nos avisará y se actualizará. No necesitaremos intervenir mucho en el proceso. Aunque realmente casi no se actualiza, ya que la última versión estable es del 2016.

De todos modos, en cada actualización hay que asegurarnos de tener nuestros prototipos y diseños en una carpeta separada.

 

 

Diferencia entre #define y const en Arduino

Introducción

Las constantes; como sabemos, no cambian su valor en tiempo de ejecución. Son útiles para prevenir que nosotros mismos tengamos errores.

En el lenguaje de Arduino, que no es otra cosa que C y C++, podemos declarar constantes usando #define y también const. Cada una de ellas tiene su explicación.

#define

Es un macro que se ejecuta antes de la compilación. Para explicarlo de la manera más sencilla, supongamos que definimos lo siguiente:

#define NUMERO 1

void setup(){
  pinMode(NUMERO, OUTPUT);
  digitalWrite(NUMERO, HIGH);
}

Antes de que el código sea compilado, se hará un buscar y remplazar, en donde las ocurrencias serán (valga la redundancia) remplazadas por el valor verdadero. Por lo que (no podemos verlo, pero así es), el programa de arriba se convertiría en lo siguiente:

void setup(){
  pinMode(1, OUTPUT);
  digitalWrite(1, HIGH);
}

Es decir, remplazó las constantes por el valor verdadero.

Ventajas

  • No ocupa memoria para almacenar las constantes, puesto que son remplazadas por sus valores
  • Si vamos a usarlo para cosas pequeñas, como definir un pin, una cadena, etcétera, nos viene genial

Desventajas

  • No tienen tipo. Por lo que el compilador no podrá avisarnos si algo estamos haciendo mal
  • Son globales, por lo que debemos ser sumamente cuidadosos al referirnos a ellas

 

Const

Para declarar una constante, usamos const seguido del tipo de la variable. Por ejemplo:

const int numero = 1;

Al compilar, esto no se remplaza. Queda así como está. Y si el compilador detecta que en algún momento de nuestro código queremos asignarle un nuevo valor nos arrojará un valor.

Ventajas

Obedecen el ámbito de las funciones. Es decir, podemos declarar dos constantes con el mismo nombre en diferentes funciones:

void funcionUno(){
  const int edad = 18;
}

void otraFuncion(){
  const int edad = 50;
}

Y podemos usarlas dentro de cada función sin que choquen. También tiene la ventaja de que tiene tipo, por lo que el compilador nos informará los errores que puede que estemos cometiendo.

Const también permite declarar arreglos, cosa que #define no.

Finalmente, cabe mencionar que el uso de const es recomendado en lugar de #define según este artículo.

Conclusión

Personalmente utilizo #define porque no trabajo en proyectos grandes, y las librerías que incluyo no chocan con el nombre de mis constantes.

Sin embargo, es una buena práctica usar const en lugar de #define según el sitio oficial de Arduino. Y si ellos lo dicen, es porque así debería ser. Además, en la mayoría de casos tenemos memoria de sobra para los proyectos que hacemos, por lo que no tenemos que ahorrarla usando #define.

Char a Int en Arduino

Si queremos convertir un char a entero en Arduino, podemos usar:

char c = '5';
int convertido = int(c);

El resultado sería el número 53, porque el número 5 es el carácter ASCII número 53. Nosotros no queremos eso, nosotros esperábamos un que ‘5’ se convirtiera en 5. Para obtener lo que realmente necesitamos, podemos usar lo siguiente:

char c = '5';
int convertido = String(c).toInt();

Ahora sí, el resultado sería 5 como entero. De esta forma podemos convertir carácter a entero, e incluso String a entero.