Manual de Arduino Trainer v1.0
Manual de Arduino Trainer v1.0
Manual de Uso
Diciembre, 2017
Introducción
Elementos de Arduino Trainer v1.0
Arduino Trainer: Leds integrados ( D3, D5, D6 )
Arduino Trainer: Sensor Ultrasónico ( D2, D4 )
Arduino Trainer: Salidas para módulo L9110 ( D7, D8, D9, D10 )
Arduino Trainer: Conexión de módulo driver de motores L9110
Arduino Trainer: Pulsadores ( D12, D13 )
Arduino Trainer: Sensor de línea ( A0 A1 A2 A3 )
Arduino Trainer: Salida Buzzer ( D11 )
Arduino Trainer: Conector Bluetooth ( RX, TX )
Arduino Trainer: Conector I2C
Arduino Trainer: Conector de Alimentación
Alimentando Arduino UNO
Analizando el pin VIN de Arduino Trainer v1.0
Alimentando Arduino Trainer v1.0 con Arduino UNO
Arduino Trainer v1.0 es un shield diseñado para introducirse de forma sencilla en el mundo
Arduino y la programación.
Un shield ( del inglés escudo, o más propiamente placa ) es una placa de circuito impreso
( PCB , de Printed Circuit Board ) que se encaja sobre Arduino UNO, y que añade nuevas
funcionalidades a la placa Arduino original. Para ello incluye componentes electrónicos que se
conectan directamente a las patillas de Arduino. Esto elimina el cableado necesario para conectar
los componentes, lo cual es fuente de problemas para modelos con cierta complejidad.
A modo de ejemplo, consideremos un circuito con un sensor ultrasónico, dos LEDs y dos
interruptores. Para conectar todos estos componentes necesitaremos de 8 a 12 cables en una placa
protoboard. Este tipo de placas es ideal para prototipos, pero a medida que añadimos componentes,
el cableado se vuelve engorroso, propenso a fallos, y difícil de diagnosticar en caso de error. Si
integramos todos estos componentes en una placa shield, el cableado se reduce o elimina casi en su
totalidad.
Arduino Trainer integra los siguientes elementos hardware:
• Tres LEDS conectados a salidas PWM
• Dos pulsadores
• Conector I2C
• Conector para módulo bluetooth como puente para la programación mediante AppInventor
• Pulsador de RESET
El diseño del shield permite realizar innumerables prácticas, y su límite viene dado por la
imaginación del usuario. Como recurso didáctico en el aula, Arduino Trainer facilita el aprendizaje
en grupo, ya que ArduinoTrainer elimina el cableado de componentes, y simplifica las conexiones,
por lo que evita los problemas derivados de la complejidad de las conexiones. De este modo,
podemos centrarnos en conceptos de programación, evitando los fallos derivados de un mal
conexionado del hardware.
Es preciso indicar que dichos programas no son exclusivos de Arduino Trainer, y pueden ser
ejecutados en Arduino UNO, sin necesidad de conectar Arduino Trainer. Obviamente, los elementos
hardware ( LEDs, interruptores, etc …) deberán conectarse externamente ( por ejemplo en una placa
breadboard ), de modo que cualquier persona que quiera utilizarlos debe tan solo conocer la
asignación de pines de Trainer, y cablear los elementos adecuados en los pines asignados.
#define LED_ROJO 3
#define LED_AMARILLO 5
#define LED_VERDE 6
void setup()
{
pinMode( LED_ROJO , OUTPUT );
pinMode( LED_AMARILLO , OUTPUT );
pinMode( LED_VERDE , OUTPUT );
}
void loop()
{
digitalWrite( LED_ROJO , HIGH );
delay( 1000 );
digitalWrite( LED_ROJO , LOW );
delay( 1000 );
digitalWrite( LED_AMARILLO , HIGH );
delay( 1000 );
digitalWrite( LED_AMARILLO , LOW );
delay( 1000 );
digitalWrite( LED_VERDE , HIGH );
Los LEDs emplean salidas que admiten modulación PWM. Esto significa que podemos
controlar el brillo de cada uno mediante la funcion analogWrite( valor ) , con valor en el rango { 0 –
255 }.
• HCSR04_TRIGGER: pin 2
• HCSR04_ECHO: pin 4
El siguiente ejemplo muestra cómo programar el sensor y visualizar los datos a través del
Monitor Serie del IDE de Arduino:
#define HCSR04_ECHO 4
#define HCSR04_TRIGGER 2
void setup()
{
pinMode(HCSR04_TRIGGER , OUTPUT);
pinMode(HCSR04_ECHO , INPUT);
[Link]( 115200);
}
void loop()
{
int gap;
for(;;)
{
gap = Distance_StandardTest();
[Link]( "Distancia ... "+ String(gap) + " cm.");
delay( 500);
}
}
/*
Funcion: Distance_StandardTest()
Devuelve en cm la distancia del sensor HCSR04 al objeto más cercano
Funcionamiento:
1) Lanzamos un pulso de señal cuadrado. Para ello el pin TRIGGER
a) Lo ponemos a LOW, y esperamos un tiempo a que se estabilice ( por si estaba en nivel HIGH )
// Pulso en TRIGGER
digitalWrite(HCSR04_TRIGGER , LOW);
delayMicroseconds(5);
digitalWrite(HCSR04_TRIGGER, HIGH);
delayMicroseconds(5);
digitalWrite(HCSR04_TRIGGER, LOW);
// Pulso de ECHO
duracion = pulseIn(HCSR04_ECHO , HIGH) ;
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
void setup()
{
[Link](115200); // Open serial monitor at 115200 baud to see ping results.
}
void loop()
{
delay(50); // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between
pings.
unsigned int uS = [Link](); // Send ping, get ping time in microseconds (uS).
[Link]("Ping: ");
[Link](uS / US_ROUNDTRIP_CM); // Convert ping time to distance in cm and print result (0 = outside set
distance range)
[Link]("cm");
}
El conector posee ademas tomas para alimentación ( VIN ) y masa ( GND ), de modo que
podemos acceder a pines de alimentación. Esto es especialmente útil si queremos conectar servos en
los pines D9 y D10 ( salida PWM ), ya que el conector se ajusta al proporcionado por dichos servos.
En este punto, es necesario indicar que el pin central VIN de cada conector no se
encuentra conectado a ningún pin de alimentación, por lo que si conectamos un servo ( por
ejemplo en D9 ), este no funcionará. Para ello, es preciso conectar cualquier pin VIN al conector 5V
Supply. D este modo, el servo quedará conectado a la alimentación.
En el epígrafe “Analizando el pin VIN de Arduino Trainer v1.0” se analiza con detalle las
posibilidades de conectar estos pines adecuadamente.
Hablar de Arduino y robótica nos conduce inexorablemente a hablar de robots con motores y
ruedas. En este sentido, este conector se ha diseñado para conectar un par de motores a Arduino
Trainer, para crear un coche-robot. Aunque hay muchos tipos de robots con ruedas, los más
adecuados para personas que se inician en el mundo de la robótica son:
Las entradas {A_IA , A-IB } permiten controlar un motor ( digamos el izquierdo ), mientras
que { B-IA , B-IB } permiten controlar el segundo. De las dos entradas { A-IA , A-IB }
de este modo, la salida analógica permite conducir al motor con un rango de velocidades en el rango
{ 0 – 255 }, de un modo similar a la salida PWM del programa Fade visto anteriormente. En otras
palabras, podemos hacer que el motor vaya a mayor o menor velocidad.
Para conectar el driver L9110 a Arduino Trainer v1.0 podemos utilizar el siguiente esquema
de conexionado, con los colores que se muestran en las imágenes posteriores:
• Si ambas están entradas están a nivel alto ( H ) o bajo ( L ), el motor permanecerá parado
• Si una entrada está a nivel alto, y otra a bajo, el motor funciona en un sentido u otro, ya que
el voltaje en { OA, OB } cambia de polaridad.
Esta tabla no muestras las propiedades PWM del driver, y asume como entrada niveles
lógicos ( alto o bajo ) en vez de analógicos, pero el funcionamiento en ambos casos es similar.
El siguiente programa permite verificar el funcionamiento de los dos motores del driver L9110.
Sencillamente, hace que vayan ambos en una dirección, y luego en otra.
void setup()
{
pinMode( MOTOR_IZDO_DIR , OUTPUT );
pinMode( MOTOR_IZDO_SPD , OUTPUT );
pinMode( MOTOR_DCHO_DIR , OUTPUT );
pinMode( MOTOR_DCHO_SPD , OUTPUT );
}
void loop()
{
int vel = 200; // velocidad = { 0 , 255 }
Forward_Motor_Left( vel );
Forward_Motor_Right( vel );
PARA;
Stop_Motor_Left();
Stop_Motor_Right();
PARA;
Reverse_Motor_Left( vel );
#define SWITCH_D13 12
Los pines D12 y D13 de Arduino UNO se configuran como entradas PULL-UP
( INPUT_PULLUP ), y se conectan a los switches. La otra patilla de los conectores se conecta a
masa, En este caso, cuando leemos los pines D12 o D13, obtendremos un valor
#define SWITCH_D12 13
#define SWITCH_D13 12
void setup()
{
pinMode( SWITCH_D12 , INPUT_PULLUP ); // Enable internal pull-up resistor
pinMode( SWITCH_D13 , INPUT_PULLUP ); // Enable internal pull-up resistor
}
La siguiente funcion devuelve el valor del pulsador D12 ( 1 Si está pulsado, 0 en caso
contrario )
int Switchd12_esta_pulsado(void)
{
return !digitalRead( SWITCH_D12 );
}
void setup()
{
pinMode( LED_ROJO , OUTPUT );
pinMode( SWITCH_D12 , INPUT_PULLUP );
pinMode( SWITCH_D13 , INPUT_PULLUP );
}
void loop(void)
{
if( Switchd12_esta_pulsado() )
digitalWrite( LED_ROJO , HIGH );
else if( Switchd13_esta_pulsado() )
digitalWrite( LED_ROJO , LOW );
}
/*
Funcion: Switch_esta_pulsado(void)
Devuelve 1 si el pulsador esta siendo presionado, 0 si no
*/
int Switchd12_esta_pulsado(void)
{
return !digitalRead( SWITCH_D12 );
}
/*
Funcion: Switch_esta_pulsado(void)
Devuelve 1 si el pulsador esta siendo presionado, 0 si no
*/
int Switchd13_esta_pulsado(void)
{
return !digitalRead( SWITCH_D13 );
}
El sensor de línea se puede separar con facilidad de la placa de Arduino Trainer, ya que la
placa posee un corte que facilita dicha operación. De esta forma podemos disponer del sensor de
línea en la posición más adecuada dentro de nuestro robot.
Sensor de línea ( vista inferior ). Diodos emisores aislados Sensor de línea ( vista superior )
En presencia de luz, la salida de cada sensor infrarrojo es alta, mientras que en ausencia de
luz, la salida del sensor es baja. Para mejorar la respuesta del sensor, se debe aislar el LED emisor
( aislados con capuchones negros, imagen superior izquierda ), o bien con una tira de cartón negro
de 5 mm de ancho, que se inserta entre la fila de sensores emisores y receptores. De este modo, el
sensor receptor no capta emisión lateral del emisor.
hay disponible un conjunto de programas que ejemplifican el manejo de arrays, paso y devolución
desde una función, etc.
// Constantes de preprocesador
#define PARA delay(500)
void setup()
{
// No es necesario iniciar las entradas analógicas
[Link]( 115200 );
}
void loop()
{
int s1 , s2 , s3 , s4;
int ind;
for(;;)
{
s1 = analogRead( A0 );
s2 = analogRead( A1 );
s3 = analogRead( A2 );
s4 = analogRead( A3 );
PARA;
5V
Según la fórmula del divisor de tensión
10 K
Vout = ( LDR ) 5V
R1
( R1 + LDR )
Vout ( A4 , A5 )
• LDR iluminada: 0 a 1K
• LDR en oscuridad: 50K a Megaohmios
Con estos datos, si conectamos una LDR a la entrada A4 ( a la patilla del conector, la otra
patilla a masa GND ) y la iluminamos, debemos obtener un valor bajo en la entrada A4 de Arduino
UNO, por lo que la lectura de A4 con analogRead( A4 ) debe devolver un valor cercano a 0. En el
otro caso, si mantenemos sin iluminar la LDR, el valor esperado debe ser cercano a 5V ( y
analogRead( A4 ) debe devolver un valor cercano a 1024 )
Estas dos fotoresistencias se pueden emplear en el caso de un robot que siga un haz de
luz, por ejemplo una linterna. A modo de ejemplo, consultar el siguiente enlace
Un zumbador ( dispositivo que emite pitidos, como el de las alarmas de los despertadores )
es un dispositivo piezoeléctrico ( varía su volumen al ser atravesado por una corriente eléctrica ),
mientras que un altavoz se basa en una bobina electromagnético. Ambos generan el sonido haciendo
vibrar una membrana.
Existe una función que genera una nota ( la cual es una señal cuadrada ), denominada note().
Su sintaxis es
por ejemplo,
[Link]
Buzzer Piezoeléctrico
/* declaración de variables */
int spk=11; // altavoz a GND y pin 11
int c[5]={131,262,523,1046,2093}; // frecuencias 4 octavas de Do
int cs[5]={139,277,554,1108,2217}; // Do#
int d[5]={147,294,587,1175,2349}; // Re
int ds[5]={156,311,622,1244,2489}; // Re#
int e[5]={165,330,659,1319,2637}; // Mi
int f[5]={175,349,698,1397,2794}; // Fa
int fs[5]={185,370,740,1480,2960}; // Fa#
int g[5]={196,392,784,1568,3136}; // Sol
int gs[5]={208,415,831,1661,3322}; // Sol#
int a[5]={220,440,880,1760,3520}; // La
int as[5]={233,466,932,1866,3729}; // La#
int b[5]={247,494,988,1976,3951}; // Si
void nota(int a, int b); // declaración de la función auxiliar. Recibe dos números enteros.
void setup()
{
/*******************/
/* STAR WARS */
/*******************/
/**** tema principal ****/
nota(d[1],150);noTone(spk);delay(50);
nota(d[1],150);noTone(spk);delay(50);
nota(d[1],150);noTone(spk);delay(50);
nota(g[1],900);noTone(spk);delay(150);
nota(d[2],900);noTone(spk);delay(50);
nota(c[2],150);noTone(spk);delay(50);
nota(b[1],150);noTone(spk);delay(50);
nota(a[1],150);noTone(spk);delay(50);
nota(g[2],900);noTone(spk);delay(150);
nota(d[2],900);noTone(spk);delay(100);
nota(c[2],150);noTone(spk);delay(50);
nota(b[1],150);noTone(spk);delay(50);
nota(a[1],150);noTone(spk);delay(50);
nota(g[2],900);noTone(spk);delay(150);
nota(d[2],900);noTone(spk);delay(100);
nota(c[2],150);noTone(spk);delay(50);
nota(b[1],150);noTone(spk);delay(50);
nota(c[2],150);noTone(spk);delay(50);
nota(a[1],1200);noTone(spk);delay(2000);
void loop()
{
}
El puerto serie necesita una conexión mediante cable, aunque podemos eliminarlo por medio
de diversos dispositivos:
Es posible utilizar otros pines de Arduino diferentes a RX y TX, usando una biblioteca
denominada Software Serial, la cual reasigna los pines TX y RX. Sin embargo, Arduino Trainer
emplea los pines originales RX/TX.
Para programar una aplicación, deberemos crear un programa para Arduino UNO, y otro
( usando AppInventor ) en nuestro teléfono móvil. Un programa típico mostrará en el teléfono una
serie de botones, sliders, etc., los cuales al ser manipulados enviarán una serie de caracteres de
control a Arduino. Por su parte, el programa en Arduino leerá periódicamente el puerto serie, y
recibirá los caracteres enviados por el teléfono. Posteriormente, según el carácter recibido se
ejecutarán las instrucciones de programa pertinentes ( encender un LED, apagar un motor, etc ).
Obvia decir que en el interfaz de AppInventor debemos incluir el componente cliente bluetooth, y
tal vez un temporizador. El uso del temporizador es necesario para recibir datos de Arduino UNO, y
la aplicación, cada cierto tiempo ( digamos un segundo ), puede chequear si se ha recibido algún
dato de Arduino.
Por otra parte, el programa en Arduino debería muestrear continuamente el puerto serie. Esto
se consigue con el siguiente programa:
#define LED 3
void setup()
{
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
[Link](9600);
}
void loop()
{
static int bytein;
if([Link]() > 0)
{
bytein = [Link]();
switch (bytein)
{
case '0':
digitalWrite(LED, LOW);break;
case '1':
digitalWrite(LED, HIGH);break;
}
}
}
Por otra parte, en AppInventor debemos crear una aplicación. A continuación se muestra un
ejemplo de cómo encender / apagar un LED. Este programa debe ser cargado en el teléfono.
Imágenes de LEDs:
NOTA: Este ejemplo asume que el lector posee cierta experiencia con AppInventor, así como un
conocimiento básico de Arduino. Por otra parte, se ha evitado todo tipo de control de errores, y el
diseño del layout se ha simplificado con fines didácticos.
El bus I2C, desarrollado por Philips, es un bus serie de datos. Junto con el puerto serie, y el
bus SPI, constituyen los tres principales sistemas de comunicación de Arduino UNO. También se
conoce con las siglas TWI ( Two Wires Interface ), y constituye un medio de comunicar Arduino
UNO con hardware periférico mediante dos cables, los cuales son:
El bus es síncrono, y por tanto la señal de reloj se comparte entre todos los dispositivos
conectados. Por otra parte, la arquitectura es maestro-esclavo. Arduino UNO actúa como maestro,
y es el que inicia la comunicación. Posteriormente, los esclavos pueden mandar o recibir datos con
el dispositivo maestro.
El bus I2C presenta una particularidad, consistente en que las líneas de datos deben
disponer de resistencias de pull-up ( conectadas a 5V ) de un valor entre 1K a 10K ( el valor típico
es de 4K7 ).
En la placa Arduino, los terminales I2C se comparten con las entradas analógicas A4 ( SDA )
y A5 (SCL ). Como vimos anteriormente, estas entradas analógicas se conectan al conector LDR,
visto anteriormente, y disponen de resistencias de pull-up, de valor 10K.
En la actualidad, existe mucho hardware conectable mediante el bus I 2C a Arduino, entre los
que podemos destacar el módulo de pantalla LCD.
Otra utilidad del conector de alimentación es la de alimentar a los pines VIN del conector
múltiple macho D7 a D10. Como hemos dicho anteriormente, dichos pines no tienen conexión
eléctrica a Arduino UNO, ya que de fábrica el pin VIN de Arduino Trainer no se encuentra soldado.
Si quisiéramos por ejemplo conectar un Servo, deberemos conectar cualquier pin VIN del conector
múltiple D7 a D10 con algún pin 5V Supply del conector de alimentación. Con esto, el micromotor
del Servo quedará alimentado a 5V Supply.
Los siguientes epígrafes tratan con detalle esta cuestión.
Es importante comprender que esta salida regulada de 5V puede ser a su vez entrada de
alimentación. En otras palabras, por este pin podemos conectar una fuente externa de 5V, pero en
este caso, el regulador integrado en Arduino UNO quedará sin funcionamiento, ya que para que
actúe debe recibir alimentación bien por VIN, bien por la alimentación externa.
Alimentación de 6 voltios ( por ejemplo, un pack de 4 pilas de 1,5 V ): Conexión al pin VIN.
Arduino Trainer v1.0 aplica las características anteriores de Arduino UNO, con la salvedad
de que el pin VIN se encuentra sin conectar, dejando dicha posibilidad al usuario. Dicho pin VIN
se conecta a su vez al conector múltiple macho VIN de las salidas D7 a D10, diseñado para
conectar Servos ( D9 D10 ) o bien entradas/salidas digitales ( D7 D8 ) como sensores externos, o
bien salidas por transistor para gobernar relés.
Queremos remarcar que dicha patilla VIN alimenta al conector múltiple macho VIN de los
pines D7 D8 D9 D10. En la configuración de fábrica dicho conector no tiene alimentación. Si
por ejemplo conectamos un Servo a la salida D9 ( PWM ), dicho Servo no funcionará, ya que el
conector pertinente no tiene alimentación en el pin VIN.
Esta característica permite alimentar Servos con una alimentación superior a 5V, en el
caso de un robot con Servos de rotación contínua, los cuales se alimentan a 6 voltios.
Si no queremos hacer uso de esta característica, debemos conectar cualquiera de los pines
VIN del conector múltiple macho D7 a D10 a 5V Supply. Esta configuración se puede conseguir
de un modo similar si soldamos por la cara superior el pin VIN, en la fila de pines que se conectan
a Arduino UNO, y lo conectamos al conector 5V Supply. Así conseguiremos alimentar con 5V los
pines VIN del conector múltiple macho D7 a D10, sin alimentar por este pin a UNO. Esta es la
configuración recomendada.
• En esta configuración, debemos conectar la salida del Battery Pack USB al conector 5V
Supply - GND Supply. Arduino Trainer v1.0 alimentará a su vez a Arduino UNO mediante
la entrada 5V de Arduino UNO.
• El conector múltiple macho VIN de los pines D7 a D10 no tienen alimentación, para lo cual
debemos conectar cualquier pin VIN del conector D7 a D10 a 5V Supply.
Esta es la configuración mas compleja, ya que el pin VIN de Trainer v1.0 puede conectarse o
no al pin VIN de UNO. Es por esto que esta configuración se recomienda solo a usuarios
expertos, que hayan entendido claramente el esquema de alimentación de Arduino UNO.
Para conseguir que Arduino Trainer v1.0 alimente a Arduino UNO, debemos soldar el pin
VIN de Arduino Trainer v1.0 por debajo de la placa, para que entre en el conector VIN de UNO.
Por la cara de arriba, soldaremos los cables de alimentación externa VIN. Así, si alimentamos ( por
ejemplo 6 V mediante con 4 pilas de 1,5 V ) a Trainer, este a su vez alimentará al regulador de 5V
de Arduino. Asimismo, el conector múltiple VIN del conector D7 a D10 se alimentará con la misma
alimentación VIN externa ( los mismos 6 V de la alimentación externa ).
Hispalis RobIOTics
Contacto: hispalisrobiotics@[Link]