Archivo de la categoría: Arduino

Manejar Kit Arduino

Cualquiera puede adquirir por unos 20€ un kit de Arduino con muchos elementos para manejar, como un lector de tarjetas, leds, motor paso a paso, servo, mando infrarrojos, etc… pero una vez te llega a casa es difícil empezar a manejar por separado cada elemento del kit, por ese motivo veamos cómo manejar los elementos de un kit Arduino chino como este: https://es.aliexpress.com/item/UNO-KIT-Upgraded-version-of-the-For-Starter-Kit-the-RFID-learn-Suite-Stepper-Motor-ULN2003/1207142899.html

Este artículo es una guía de uso de un kit de Arduino chino como los que se pueden comprar en tiendas como Aliexpress, Gearbest o Elegoo.

Para aprender a usar Arduino y manejar elementos básicos como LEDs, botones, potenciómetro, etc… así como programación básica y uso de librerías ver el taller de iniciación de Arduino en https://www.aprendiendoarduino.com/talleres-arduino/arduino-ur-maker-2018/

Una vez conocido como manejar por separado cada elemento es más sencillo unir todo para hacer un proyecto completo como:

  • Mover un servo con el joystick
  • Mover el motor paso a paso al pasar una tarjeta RFID válida
  • Encender leds con un mando a distancia
  • Escribir por pantalla lo pulsado en el teclado
  • Termómetro usando la sonda de temperatura y la pantalla
  • etc…

Repositorio prácticas: https://github.com/jecrespo/Arduino-Kit-China-Guide

Prácticas para usar elementos del kit:

Tutoriales de prácticas para ampliar:

Anuncios

Kit de Prácticas UR-Maker

El kit de prácticas disponible es: https://es.aliexpress.com/item/UNO-KIT-Upgraded-version-of-the-For-Starter-Kit-the-RFID-learn-Suite-Stepper-Motor-ULN2003/1207142899.html

Driver Arduino UNO de este kit:

Descripción:

  • 1 X Arduino UNO
  • 1 X Cable USB
  • 1 X Jump Cable
  • 1 X Breadboard
  • 5 X luz LED
  • 1 Pack resistencia
  • 1 X hembra a macho línea dupond
  • 1 X potenciómetro
  • 1 X Buzzer
  • 1X 74HC595 (Shift Register)
  • 1 X receptor de infrarrojos
  • 1 X ds18b20
  • 1 X Sensor de llama
  • 1 X interruptor de bola
  • 1 X fotoresistor
  • 1 X botón clave
  • 1 X control Remoto
  • 1 X tubo de pantalla de 4 dígitos
  • 1 X 8*8 Módulo de matriz de puntos
  • 1 X 1-Tubo de visualización de dígitos
  • 1 X convertidor de motor paso a paso
  • 1 X motor paso a paso
  • 1 X 9g Servo
  • 1 X IIC 1602 LCD
  • 1 X Módulo de joystick XY
  • 1 X Módulo de temperatura
  • 1 X Módulo de prueba de agua
  • 1 X módulo RFID
  • 1 X llavero RFID
  • 1 X Tarjeta blanca RFID
  • 1 X Módulo de sonido
  • 1 X módulo de relé
  • 1 X Módulo de reloj
  • 1 X 4*4 tablero clave
  • 1 X Módulo de color RGB 3
  • 1 X 9 V batería Snap

Presentación Taller Arduino Ingenia’18

Taller dentro del programa Ingenia’18 de la universidad de la Rioja: https://www.unirioja.es/facultades_escuelas/etsii/Triptico_ingenia18.pdf.

Seminario: Aprendiendo a manejar Arduino en profundidad

Lugar: Espacio UR-Maker del Edificio Ampliación Politécnico

Ponente: José Enrique Crespo Moreno, profesional experto en Arduino, microcontroladores, automatización, gestión energética…

El objetivo de este seminario es iniciarse en el mundo del hardware libre, los microcontroladores, el internet de las cosas, la robótica, el mundo maker y DIY, utilizando la plataforma Arduino. Al finalizarlo con aprovechamiento, se será capaz de manejar la plataforma Arduino, conocer su potencial e implementar proyectos sencillos con Arduino, se será capaz de usar el entorno de programación de la plataforma y ejecutar programas sobre Arduino.

Objetivos

El objetivo de este taller es iniciar al alumno en la programación y uso de la placa de hardware libre Arduino.

El alumno conocerá las bases de la programación de Arduino, uso de librerías, los conceptos de entradas y salidas digitales y analógicas y aprenderá a manejar sensores y actuadores de diversos tipos. Todo ellos mediante casos prácticos usando los kits de Arduino.

Al finalizar el taller el alumno será capaz de usar el entorno de programación de Arduino, ejecutar programas, manejar la plataforma Arduino, conocer su potencial y realizar sus propios proyectos con Arduino.

Requisitos

Este taller parte desde cero, por lo que no son necesarios unos conocimientos previos, pero sí son recomendables conocimientos básicos de programación, electricidad y electrónica.

Es recomendable un conocimiento medio de Inglés puesto que gran parte de la documentación está en Inglés.

Metodología

El curso se compone de una combinación de teoría y práctica que establecen las bases necesarias para entender la plataforma Hardware y Software de Arduino, con una duración de 12 horas. También se realizará un proyecto más complejo al final del curso donde se podrá ver la potencia de esta tecnología.

Los recursos utilizados para la realización de este curso son:

Además están disponibles otros recursos para ampliar información:

Para interactuar en el curso se puede hacer mediante:

  • Twitter con el hashtag #aprendiendoarduino
  • En el blog poniendo comentarios en los post con la documentación del curso
  • Correo a aprendiendoarduino@gmail.com
  • Preguntando en clase

Para realizar las prácticas de este curso se incluye un Kit Arduino https://es.aliexpress.com/item/UNO-KIT-Upgraded-version-of-the-For-Starter-Kit-the-RFID-learn-Suite-Stepper-Motor-ULN2003/1207142899.html que contiene un Arduino Uno, una serie de sensores y actuadores y diversos elementos electrónicos necesarios para realizar las prácticas y proyectos.

Todo el material entregado es en préstamo y debe cuidarse al máximo, a la hora del montaje de las prácticas se seguirán las instrucciones para evitar dañar los componentes.

Toda la documentación y código es liberado con licencia Creative Commons.

Reconocimiento – NoComercial – CompartirIgual (by-nc-sa): No se permite un uso comercial de la obra original ni de las posibles obras derivadas, la distribución de las cuales se debe hacer con una licencia igual a la que regula la obra original.

Aprendiendo Arduino by Enrique Crespo is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional License.

Organización del Taller

Duración total de 12 horas. El taller se realiza los días 3, 4, 17 y 18 de octubre de 2018 en horario de 18.00 a 21.00. Se hará un descanso de 10 minutos aproximadamente a mitad de la sesión.

Detalle del temario: https://www.aprendiendoarduino.com/talleres-arduino/arduino-ur-maker-2018/  

Los contenidos teóricos y prácticos se irán combinando cada día.

Como Empezar con Arduino

Para empezar con Arduino debes preguntarte qué sabes de electrónica y qué sabes de programación. Si no sabes de electrónica, es difícil entender cómo funcionan los elementos con los que va a interactuar la placa Arduino y si no sabes de programación no va a ser posible traducir las órdenes que deseas hacer a la electrónica para que las ejecute Arduino.

La gran ventaja de Arduino es que no es necesario ser un experto en cada una de esas áreas, nos ofrece una capa de programación muy sencilla y el HW es muy sencillo de manejar sin saber mucho de electrónica.

Para empezar con Arduino hay que aprender electrónica y a programar y eso es lo que vamos a aprender en este curso entre otras cosas.

Artículos de como empezar con Arduino:

Un buen tutorial para los que están empezando lo puedes ver en https://openwebinars.net/tutorial-de-arduino/

Acerca de Enrique Crespo

El autor del curso es Enrique Crespo. Llevo trabajando con Arduino desde el año 2011 y en el año 2014 empecé mi andadura como profesor de Arduino y otros temas relacionados. Desde entonces he impartido muchos cursos presenciales de Arduino, talleres y conferencias en diversos lugares. También colaboro en el makerspace de la Universidad de la Rioja UR-maker.

Todos los cursos, talleres y conferencias que he impartido puedes verlos en https://www.aprendiendoarduino.com/, donde publico toda la documentación y código.

Twitter @jecrespo: https://twitter.com/jecrespom

Linkedin: https://www.linkedin.com/in/enriquecrespo/

Contacto

Para cualquier consulta durante el curso y en cualquier otro momento mediante email: aprendiendoarduino@gmail.com

Twitter @jecrespo: https://twitter.com/jecrespom

Y más información sobre el curso y el autor: http://www.aprendiendoarduino.com/acerca-de/

Arduino UNO, Nano y NodeMCU ESP8266 a buen precio

Una de las preguntas que me hacen con más frecuencia es donde comprar Arduinos a buen precio. Una de las opciones para comprar Arduinos es GearBest https://www.gearbest.com/

Aquí os dejo tres Arduinos que puedes usar en muchos proyectos y que en función del proyecto y sus necesidades doy pistas para optar por uno u otro.

Arduino UNO

Arduino UNO es el Arduino más popular y del que existe más documentación en Internet. Es el Arduino perfecto para iniciarse y al tener el factor de forma estándar de Arduino puedes ponerle alguno de los miles de shields disponibles en el mercado, aquí puedes ver algunos ejemplos https://www.gearbest.com/arduino-shields-_gear/

Un detalle de estos Arduinos es que es necesario instalarse el driver de conversor de puerto serial a USB. Este Arduino dispone de un chip CH340G como conversor serial a USB y por lo tanto deberemos usar el driver de este chip y que podemos encontrar su última versión en http://www.wch.cn/download/CH341SER_EXE.html. Enlaces de descarga:

En este enlace puedes comprarlo por alrededor de 4€ y con envío gratuito a España: https://www.gearbest.com/boards-shields/pp_228782.html?wid=1433363

Arduino Nano

Arduino Nano es el Arduino ideal para los proyectos donde es necesario un Arduino con el microcontrolador ATmega328P del Arduino UNO pero con un tamaño mucho más pequeño, menor consumo e incluso alimentar mediante batería.

Al igual que el Arduino UNO, este Arduino Nano dispone de un chip CH340G como conversor serial a USB y por lo tanto deberemos usar el driver de este chip y que podemos encontrar su última versión en http://www.wch.cn/download/CH341SER_EXE.html. Enlaces de descarga:

En este enlace puedes comprarlo por alrededor de 4€ y con envío gratuito a España: https://www.gearbest.com/boards-shields/pp_265453.html?wid=1433363

NodeMCU ESP8266

Si quieres empezar a trabajar con ESP8266 o tu proyecto con Arduino necesita de conexión wifi, el módulo más adecuado es el NodeMCU ESP8266 por su facilidad de uso y pequeño tamaño.

Se trata de la versión de hardware v1.0, debe tenerse en cuenta porque las versiones anteriores cambian bastante los pines y los drivers a instalar.

Comparación entre versiones:

Para usar el NodeMCU es necesario instalar el driver del chip adaptador de serial a USB. Esta placa dispone de un chip CP2102 como conversor serial a USB y por lo tanto deberemos usar el driver de este chip y que podemos encontrar su última versión en https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers.

En este enlace puedes comprarlo por alrededor de 4€ y con envío gratuito a España: https://www.gearbest.com/transmitters-receivers-module/pp_366523.html?wid=1433363

Si quieres más información sobre el uso del ESP8266 y del nodeMCU puedes ver estos artículos del curso avanzado de Arduino:

También hablo del nodeMCU en estos dos vídeos del curso de ESP8266:

Crear Librerias Arduino

Las librerías son trozos de código hechos por terceros que usamos en nuestro sketch. Esto nos facilita mucho la programación y permite la abstracción haciendo que nuestro programa sea más sencillo de hacer y de entender. En este apartado veremos cómo escribir o modificar librerías.

Librerías Arduino: https://www.arduino.cc/en/Main/Libraries

El IDE de Arduino incluye una serie de librerías ya instaladas: https://www.arduino.cc/en/Reference/Libraries

Listado de librerías del playground de Arduino: http://playground.arduino.cc/Main/LibraryList, pero existen otras muchas librerías creadas por usuarios o por los fabricantes de HW para facilitar el uso de esos dispositivos con Arduino.

Este tutorial explica como crear una librería: http://arduino.cc/en/Hacking/LibraryTutorial. Explica cómo convertir la función morse en en una librería.

Ejemplo ‘morse.ino’:

 
int pin = 13;

void setup()
{
  pinMode(pin, OUTPUT);
}

void loop()
{
  dot(); dot(); dot();
  dash(); dash(); dash();
  dot(); dot(); dot();
  delay(3000);
}

void dot()
{
  digitalWrite(pin, HIGH);
  delay(250);
  digitalWrite(pin, LOW);
  delay(250);
}

void dash()
{
  digitalWrite(pin, HIGH);
  delay(1000);
  digitalWrite(pin, LOW);
  delay(250);
}

Para convertir en una librería de código morse, vemos que hay dos funciones dot() y dash() para iluminar un led durante 250 ms y 1 segundo y  una variable que es ledPin que determina que pin usar. Este es un estilo de programación clásico usando funciones en lugar de objetos.

Para una librería se necesitan al menos dos ficheros:

  • Un fichero de cabecera con la extensión .h. Este fichero tiene las definiciones de la librería, básicamente un listado de todo lo que hay dentro de la librería
  • Un fichero fuente con la extensión .cpp. Este fichero el que contiene el código

En este caso la librería se va a llamar morse y generamos un fichero de cabecera llamado morse.h.

Veamos el código de morse.h donde se define la clase Morse donde tiene una línea por cada función o método y también una línea por cada variable o propiedad de la clase.

 
class Morse
{
  public:
    Morse(int pin);	//constructor
    void dot();
    void dash();
  private:
    int _pin;
};

Una clase es una colección de funciones (métodos) y variables (propiedades) que se guardan todas juntas en un solo lugar. Las funciones pueden ser públicas (public), es decir, pueden llamarse por quien usa la librería o privadas (private), es decir, que solo pueden llamarse desde dentro de la propia clase. Todas las clases tienen una función llamada constructor, que es usada para crear una instancia de la clase. El constructor tiene el mismo nombre que la clase y no tiene tipo de variable de devolución.

En el fichero de cabecera de una librería es necesario la declaración #include que de acceso a los tipos y constantes estándar del lenguaje de Arduino (esto se añade automáticamente en los sketches pero no a las librerías). Esta declaración debe ponerse antes de la definición de la clase. La declaración debe ser:

  • Versión IDE 1.x: #include “Arduino.h”
  • Versión IDE 0.x: #include “WProgram.h”

También es común poner todo el fichero de cabecera entre estas instrucciones:

 
#ifndef Morse_h
#define Morse_h

// the #include statment and code go here...

#endif

Esto evita problemas si alguien accidentalmente incluye dos veces la librería, lo que provocaría un error de compilación. A esto se llama guardián de inclusión múltiple o include guard.

 
// Guardián de inclusión múltiple
#ifndef FICHERO_YA_INCLUIDO
#define FICHERO_YA_INCLUIDO

Así se evita que un compilador poco sofisticado abra otra vez el mismo conjunto de ficheros cuando se incluye un fichero de cabecera dos o más veces. Puede darse el caso de no poner las inclusiones en el inicio de un fichero.

La directiva #include existe en dos versiones. En una se pone el nombre de fichero entre comillas, en la otra entre paréntesis angulares (el signo menor y mayor como “comillas”).

 
#include "fichero_con_comillas.h"
#include <fichero_entre_menor_y_mayor.h>

La versión con los paréntesis angulares busca los ficheros en todos los directorios que se han especificado en la llamada al compilador – normalmente con la opción “-I”. Estos directorios se suelen rastrear por el fichero incluido en el orden en que aparecen en la línea de comando.

Cuando se incluye un fichero entre comillas, entonces el compilador busca este fichero primero en el mismo directorio que el fichero actualmente compilado y después en los demás directorios. Es decir, la versión con comillas se diferencia de la versión con paréntesis angulares únicamente por buscar primero en el directorio del fichero compilado. Tras no encontrarlo ahí actua igual.

Cuando se crea una librería se debe documentar poniendo un comentario al comienzo de la librerías con el nombre, breve descripción, quien la ha escrito, fecha, licencia, etc…

El fichero de cabecera ‘Morse.h’ queda:

 
/*
  Morse.h - Library for flashing Morse code.
  Created by David A. Mellis, November 2, 2007.
  Released into the public domain.
*/
#ifndef Morse_h
#define Morse_h

#include "Arduino.h"

class Morse
{
  public:
    Morse(int pin);
    void dot();
    void dash();
  private:
    int _pin;
};

#endif

Una vez hecho el fichero de cabecera hay que codificar el fichero fuente ‘Morse.cpp’.

Primero deben ponerse las declaraciones, esto da al resto de código acceso a las funciones estándar de Arduino y a las definiciones del fichero de cabecera:

 
#include "Arduino.h"
#include "Morse.h"

Lo siguiente es poner el constructor de la clase. Esto define que ocurre cuando se crea una instancia de la clase. En este caso el usuario debe especificar cual es el pin que se va a usar. Configuramos el pin como salida y los guardamos en una variable privada para usarlo desde otras funciones.

 
Morse::Morse(int pin)
{
  pinMode(pin, OUTPUT);
  _pin = pin;
}

El código “Morse::” antes del nombre de la función indica que la función es parte de la clase Morse. Esto se ve en todas las funciones de la clase. La variable llamada “_pin” es una variable privada tal y como se ha definido en el fichero de cabecera y se pone el simbolo “_” delante por convención para indicar que es privada y para diferenciarlo del argumento de la función, pero puede llamarse de cualquier forma mientras coincida con la definición en el fichero de cabecera.

Después de definir el constructor, se deben definir las funciones o métodos de la clase. Son las funciones que se habían definido anteriormente en el sketch:

 
void Morse::dot()
{
  digitalWrite(_pin, HIGH);
  delay(250);
  digitalWrite(_pin, LOW);
  delay(250);  
}

void Morse::dash()
{
  digitalWrite(_pin, HIGH);
  delay(1000);
  digitalWrite(_pin, LOW);
  delay(250);
}

También es habitual añadir el comentario del fichero al principio del fichero. El fichero ‘Morse.cpp’ queda de la siguiente forma:

 
/*
  Morse.cpp - Library for flashing Morse code.
  Created by David A. Mellis, November 2, 2007.
  Released into the public domain.
*/

#include "Arduino.h"
#include "Morse.h"

Morse::Morse(int pin)
{
  pinMode(pin, OUTPUT);
  _pin = pin;
}

void Morse::dot()
{
  digitalWrite(_pin, HIGH);
  delay(250);
  digitalWrite(_pin, LOW);
  delay(250);  
}

void Morse::dash()
{
  digitalWrite(_pin, HIGH);
  delay(1000);
  digitalWrite(_pin, LOW);
  delay(250);
}

De esta forma ya tenemos una librería completa. Ahora para incluirla en nuestro IDE debemos crear un directorio Morse dentro del subdirectorio “libraries” del directorio de nuestro entorno de trabajo definido en las propiedades del IDE. Copiar Morse.h y Morse.cpp dentro del directorio Morse y abrir o reiniciar el IDE de Arduino. A partir de este momento veremos nuestra librería disponible en el IDE y podremos incluirla en los sketches con la declaración #include <Morse.h>. La librería será compilada por los sketches que la usen.

El anterior sketch quedaría ahora sustituido por:

 
#include <Morse.h>

Morse morse(13);

void setup()
{
}

void loop()
{
  morse.dot(); morse.dot(); morse.dot();
  morse.dash(); morse.dash(); morse.dash();
  morse.dot(); morse.dot(); morse.dot();
  delay(3000);
}

Podemos ver que primero se llama a la declaración de la librería Morse. Esto hace que la librería esté disponible en el sketch y lo incluye en el código enviado a la placa Arduino, lo que hace que si la librería es muy pesada, ocupe mucha más memoria nuestro sketch y si no voy a usar una librería es mejor no incluirla para ahorrar espacio.

También observamos que creamos una instancia de la clase Morse llamada “morse”. Al ejecutar esta línea el constructor de la clase es llamado pasando un argumento, creando así el objeto “morse” en nuestro sketch. Luego podemos llamar a los métodos dot() y dash() precedidos del prefijo morse del nombre del objeto.

Es posible tener múltiples instancias de la clase Morse, cada una un pin diferente guardado en la variable privada “_pin”.

Si creamos una librería es conveniente crear el fichero keywords.txt dentro del directorio Morse. De esta forma conseguiremos resaltar las palabras clave que definamos en el fichero keywords. En cada línea del fichero keywords.txt se indica el nombre de la palabra clave y seguido por un tabulador, el tipo de keyword.

  • Las clases deben ser del tipo KEYWORD1 que se resaltan en naranja.
  • Las funciones deben ser del tipo KEYWORD2 que se resaltan en marrón

Para que el fichero keywords.txt se aplique al IDE es necesario reiniciar el IDE.

El fichero keywords.txt quedaría:

Morse KEYWORD1
dash KEYWORD2
dot KEYWORD2

Recomendación de uso de KEYWORDS:

  • Datatypes and Classes (KEYWORD1)
  • Methods and Functions (KEYWORD2)
  • Instances (KEYWORD2)
  • Class (KEYWORD3)
  • Constants (LITERAL1)
Type ID Purpose Color
KEYWORD1 Datatypes Brown #cc6600,plain
KEYWORD2 Method and function names Brown #cc6600,plain
KEYWORD3 setup, loop, Serial, and a few more Brown, bold #cc6600,bold
LITERAL1 Constants Blue #006699,plain
LITERAL2 Apparently, not used Blue #006699,plain

Las KEYWORDS predefinidas en Arduino están en el fichero C:\Program Files (x86)\Arduino\lib

Más explicación de keywords: https://spencer.bliven.us/index.php/2012/01/18/arduino-ide-keywords/

También es aconsejable ofrecer ejemplos de uso de la librería para que los posibles usuarios sepan usarla. Esto se hace creando un directorio “examples” dentro del directorio Morse y añadir en el subdirectorio los sketches de ejemplos que serán visibles desde el IDE.

La librerías morse con los ejemplos y el fichero keywords.txt se puede descargar en: http://www.arduino.cc/en/uploads/Hacking/Morse.zip

Para más información sobre la creación de librerías con un buen “estilo Arduino”, ver la Guía de Estilo de API. Guia de estilo para escribir librerías: http://arduino.cc/en/Reference/APIStyleGuide

IMPORTANTE: Como se ve en el código de una librería usamos código de de Arduino y por lo tanto podría la librería funcionará con cualquier placa compatible. Pero generalmente las librerías tienen código a bajo nivel que puede que solo valga para un tipo de procesadores y en ese caso habrá que adaptar la librería a las instrucciones del microprocesador con el que queramos usar la librería.

Para saber la arquitectura soportada por una librería ver https://arduinolibraries.info

Librería adaptada para Arduino y ESP8266: https://github.com/adafruit/Adafruit_NeoPixel donde se ha creado el fichero esp8266.c para que cuando compile con una placa ESP8266 o ESP32 sea compatible.

Más información:

Ejemplo Librería Semáforo

Para crear una clase semáforo que representa un semáforo y cuyo programa de uso es:

 
#include <Semaforo.h>

Semaforo miSemaforo(2,3,4,12);

void setup() { 
}

void loop() {
  miSemaforo.Verde();
  delay(3000);
  miSemaforo.Rojo();
  delay(3000);
}

semaforo.h

 
/*
Semaforo.h - Libreria para control de luces de un Semaforo
Por Leo Lamolda, marzo de 2018, para LMDAPPS
experimentosconarduino.blogspot.es.com
*/
#ifndef Semaforo_h
#define Semaforo_h

#include "Arduino.h"

class Semaforo
{  
 public:
  Semaforo(int rojo, int amarillo, int verde, int buzzer);
  void Rojo();
  void Verde();
  void Cambia();
  bool EsRojo();
  bool EsVerde();
 private:
        int _rojo;
        int _amarillo;
        int _verde;
        int _buzzer;
} ;

#endif

Semaforo.cpp

 
/*
Semaforo.h - Libreria para control de luces de un Semaforo
Por Leo Lamolda, marzo de 2018, para LMDAPPS
experimentosconarduino.blogspot.es.com
*/

#include "Semaforo.h"

Semaforo::Semaforo(int rojo, int amarillo, int verde, int buzzer)
{ 
 pinMode(rojo,OUTPUT);     digitalWrite(rojo,LOW);
    pinMode(amarillo,OUTPUT); digitalWrite(amarillo,LOW);
    pinMode(verde,OUTPUT);    digitalWrite(verde,LOW);
    pinMode(buzzer,OUTPUT);   digitalWrite(buzzer,LOW);
   _rojo = rojo;
   _amarillo=amarillo;
   _verde=verde;
   _buzzer=buzzer;             
}

void Semaforo::Rojo(){
 digitalWrite(_rojo,LOW);
  digitalWrite(_verde,LOW);
  for (int i=0;i<5;i++){
        digitalWrite(_amarillo,HIGH);
        digitalWrite(_buzzer,HIGH);
        delay(200);
        digitalWrite(_amarillo,LOW);
        digitalWrite(_buzzer,LOW);
        delay(200);
    } 
 digitalWrite(_rojo,HIGH);
}

void Semaforo::Verde(){
    digitalWrite(_rojo,LOW);
    digitalWrite(_amarillo,LOW);
    digitalWrite(_verde,HIGH);
}

void Semaforo::Cambia(){
 if (EsVerde()) Rojo();
  else Verde(); 
}

bool Semaforo::EsRojo(){
 return digitalRead(_rojo);
}

bool Semaforo::EsVerde(){
 return digitalRead(_verde);
}

Y si tenemos dos semáforos podemos hacer:

 
#include <Semaforo.h>

Semaforo miSemaforo1(2,3,4,12);
Semaforo miSemaforo2(8,9,10,12);

void setup() {  
}

void loop() {
  miSemaforo1.Rojo();
  delay(500);
  miSemaforo2.Verde();
  delay(3000);
  miSemaforo2.Rojo();
  delay(500);
  miSemaforo1.Verde();
  delay(3000);
}

 

Más información:  http://experimentosconarduino.blogspot.com/2018/04/un-clasico-semaforo-con-arduino-y.html

Otros Ejemplos de Librerías

Ver ejemplos simples de librerías:

Librería para el manejo de una API: https://github.com/jecrespo/apisiar_arduino/tree/master/apisiarlib

Guía de estilo para escribir una librería de Arduino

Para facilitar el entendimiento de las librerías o APIs de Arduino y hacer que el entorno de Arduino sea más homogéneo, desde arduino.cc dan unas pautas para escribir librerías al “estilo Arduino”. Algunas de estas prácticas van en contra de la programación programación profesional, pero esto hace posible a los principiantes comenzar a trabajar de forma sencilla con Arduino.

  • Se amable con el usuario. Tener una modelo claro del concepto que va tratar la librería y las funciones que se van a implementar.
  • Organizar las funciones pública alrededor de los datos y funcionalidades que el usuario quiere. Frecuentemente el conjunto de comandos para un módulo electrónico son demasiado complicado, pero podemos reorganizar las funciones desde un punto de vista de uso a alto nivel. Pensar en lo que hace la mayoría de las personas y organizar la API en función de ese uso. Un ejemplo es la librería https://github.com/adafruit/Adafruit-BMP085-Library. La función readPressure() hace todos los pasos para obtener la presión final, siendo transparente para el usuario todos los complejos pasos intermedios. Esto abstrae al usuario no solo de los comandos I2C necesarios, sino de de los cálculos intermedios.
  • Usar palabras claras para escribir la librerías. Usar nombres de funciones y variables claros que expresen claramente lo que son o hacen y no usar términos técnicos.
  • Evitar palabras que tengan diferente significado para el público en general.
  • Documentar todo. Al escribir ejemplos usar esta guía: http://www.arduino.cc/en/Reference/StyleGuide
  • Usar las librerías del core de Arduino y su estilo:
    • Usar read() para leer entradas y write() para escribir salidas
    • Usar las librerías Stream.h y print.h cuando se estén manejando byte streams. Si no es posible al menos intentar usar su modelo de API.
    • Para aplicaciones de redes, usar las librerías de Client y Server como base.
    • Usar begin() para inicializar unas instancia de una librería, normalmente con unos parámetros de configuración. Usar end() para finalizarla.
  • Usar funciones camel case, no con guión bajo. Por ejemplo analogRead en lugar de analog_read. Esto es una adopción de processing por motivos de facilidad la lectura.
  • No usar nombre de constantes largos que son difíciles de leer.
  • Evitar usar argumentos booleanos. En su lugar es preferible ofrecer dos funciones diferentes con nombres que describan la diferencia entre ellas.
  • No asumir conocimiento de punteros. Los principiantes en C suelen encontrar dificultades con el uso de & y *, en la medida de lo posible tratar de evitar el uso de punteros.
  • Al usar la comunicación serie de cualquier tipo, permitir al usuario especificar el objeto de stream en lugar de solo “Serial”, esto hará la librería compatible con los los puertos del Arduino Mega y Due y también poder usar interfaces alternativos como el SoftwareSerial. ver el uso de begin(Stream &serial) en las librerías https://github.com/firmata/arduino y https://github.com/andrewrapp/xbee-arduino
  • Cuando se escriba una librería que ofrezca comunicación byte-stream heredada de la la clase Stream de Arduino, de forma que la librería pueda ser usada por otras librerías que acepte objetos Stream: si es posible, el método read() inmediatamente accede a los datos del buffer sin esperar a que lleguen más datos y si es posible el método write() debe guardar los datos al buffer de transmisión, pero debe esperar si el buffer no tiene suficiente espacio para guardar inmediatamente todo los datos salientes. La función yield() debe llamarse mientras se espera. De esta forma mantenemos compatibilidad con el restos de librerías Stream.

Unos ejemplos de librerías que definen realmente bien las funciones de alto nivel son:

Viendo los métodos públicos que definen es muy fácil entender que es lo que hacen.

Otro buen ejemplo de abstracción de la librerías wire (I2C) se puede ver en: https://github.com/adafruit/RTClib donde con una serie de métodos obtengo los datos del RTC siendo totalmente transparente para el usuario el uso de la librería wire.

Es frecuente que nos encontremos que algunas librerías se quedan cortas para algunas funcionalidades avanzadas, puesto que como se ha visto en la guía de estilo se tiende a simplificar. Un ejemplo de esto es la librería ethernet donde muchas de las funcionalidades del Wiznet 5100 no están implementadas en la librería, pero esto no impide que nosotros podamos añadirlas.

Más información: https://www.arduino.cc/en/Reference/APIStyleGuide

Modificar librerías

Es habitual que al usar una librería necesitemos una propiedad o un método que no esté implementado o queramos modificar el comportamiento, para ello podemos modificar localmente la librería que tengamos instalada en nuestro IDE.

En el caso que queramos colaborar en una librería hecha, podemos hacer un fork de esa librería en nuestra cuenta de github y añadir una nueva funcionalidad o corregir ese fallo e incluso podemos hacer un pull request para que se añada en la librería original nuestra modificación. También podemos tener nuestra propia librería como un fork de la librería original.

Un pull request es una petición que el propietario de un fork de un repositorio hace al propietario del repositorio original para que este último incorpore los commits que están en el fork. Explicación de pull request: http://aprendegit.com/que-es-un-pull-request/

Para modificar la librería time y añadir una funcionalidad, lo primero es hacer un fork del código https://github.com/PaulStoffregen/Time en tu repositorio, en mi caso en https://github.com/jecrespo/Time y luego clonarlo en el ordenador para modificarlo.

Ejemplo de librería Ethernet modificada: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Otros/Ethernet%20Modificada

Añado los métodos:

  • uint8_t *getRemoteIP(uint8_t remoteIP[]);//adds remote ip address
  • uint8_t *getRemoteMAC(uint8_t remoteMAC[]);
  • uint16_t getRemotePort();

Ejercicios Librerías

Hacer Librería Morse

Ejercicio: Hacer la librería Morse y probarla con los leds del montaje.

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Programacion_Arduino/tree/master/Ejercicio15-Libreria_Morse

Hacer Librería Detecta Flanco

Ejercicio: Hacer una librería que detecte un flanco basado en la clase detecta flanco del ejercicio https://github.com/jecrespo/aprendiendoarduino-Curso_Programacion_Arduino/tree/master/Ejercicio12-Clase_Detecta_Flanco_cpp .

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Programacion_Arduino/tree/master/Ejercicio18-Libreria_Detecta_Flanco

Hacer Librería Coche

Ejercicio: Hacer la librería coche para aplicar en un sketch como el visto en https://aprendiendoarduino.wordpress.com/2017/07/08/clases-y-objetos/

 
#include “Coche.h”
 
Coche MiCocheRC(6,7)
 
void setup() {
MiCoche.Arranca()
}
 
void loop() {
char valor = leeBluetooth();
 
switch (valor) {
    case ‘F’:
      MiCoche.Adelante();
      break;
    case ‘R’:
      MiCoche.Derecha();
      break;
    case ‘L’:
       MiCoche.Izquierda();
      break;
    case ‘B’:
       MiCoche.Atras();
      break;
    case ‘S’:
       MiCoche.Para();
      break;
  }
}

Crear los métodos y configurarlos:

  • Arranca()
  • Adelante()
  • Derecha()
  • Izquierda()
  • Atras()
  • Para()
  • MuestraGasolina()
  • EchaGasolina()
  • EncidendeLuces()
  • ApagaLuces()
  • Pita()

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Programacion_Arduino/tree/master/Ejercicio13-Libreria_Coche

Crear una librería para NTP

Ejercicio: A partir del ejemplo de Arduino para obtener la hora de un servidor NTP https://www.arduino.cc/en/Tutorial/UdpNtpClient, crear una librería para obtener de forma sencilla la hora con una llamada a la función readNTP().

Ver Ejercicio39-NTP para obtener fecha y hora en Arduino sin necesidad de un RTC usando NTP: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio39-NTP

Basado en:

Protocolo:

Las firmas de tiempo que se usan en NTP, son de 32 bits indicando la parte entera en segundos desde  el 1 de Enero de 1900, y una parte fraccionaria también de 32 bits. Por ello la resolución teórica de NTP sería de 232 segundos =136 años, y una resolución teórica de 2E-32 segundos, o sea 0,233 nanosegundos.

Nota: Ojo al llamar al constructor de algo p.e. ethernet sin hacer el begin ethernet antes.

Solución: https://github.com/jecrespo/simpleNTP