Guía Arduino
Guía Arduino
LABORATORIO Nº 12
Objetivo.-.
Aprender la estructura de programación y las funciones basicas para la programacion en
arduino.
Marco teórico.-
Para realizar la programación se tiene que tomar en cuenta los siguientes puntos:
Cada instrucción (a excepción de las funciones y librerías) deben terminar con un
punto y coma “;” .
Cada función debe tener un inicio y un final y estos se definen con llaves “{ }” .
Funciones básicas
void setup() Su principal función es la de configuración del Arduino para inicializar los
modos de trabajos delos pines (entrada o salida) o el puerto serial.
Ejemplo:
void setup()
{
pinMode(pin, OUTPUT); // configura el 'pin' como salida
}
void loop() Función utilizada para que el programa se ejecute de forma cíclica.
Ejemplo:
void loop()
{
digitalWrite(pin, HIGH); // pone en uno (on, 5v) el ´pin´
delay(1000); // espera un segundo (1000 ms)
digitalWrite(pin, LOW); // pone en cero (off, 0v.) el ´pin´
delay(1000);
}
1
LABORATORIO Nº15 MOTOR DC
Ejemplo:
pinMode(13, OUTPUT);
pinMode(9, INPUT);
Ejemplo:
digitalWrite(13, HIGH);
digitalWrite(8, LOW);
Ejemplo:
delay(1000);
delay(2000);
delay(100);
Programación y Circuito.-
Enciende un LED por un segundo y lo apaga por el mismo tiempo
2
LABORATORIO Nº15 MOTOR DC
• Una vez terminada la secuencia modifique los tiempos para que practique.
3
LABORATORIO Nº15 MOTOR DC
LABORATORIO Nº 13
Objetivo.-.
Identificar las variables de programacion, operadores y tipos de entradas de datos para la
programacion de arduino.
Marco teórico.-
Las variables se utilizan básicamente para almacenar información útil para nuestro
programa como puede ser: valor de un sensor, el resultado de una operación matemática
o cualquier dato que querremos conservar en el código.
Las variables generalmente se declaran antes de la función void setup, con esto la variable
se vuelve global y puede ser utilizada en cualquier parte del código, si se declara dentro de
una función en específico solo se puede utilizar en esa función debido a que se vuelve
local.
Para declarar una variable primero especificamos el tipo de variable, seguido del nombre
de la variable y podemos asignarle un valor de inicio o no, al final lleva punto y coma
Ejemplo:
int dato = 3;
int x;
Boolean (Booleano), un booleano solo puedo tomar dos valores: falso o verdadero
Declaración en Arduino: boolean x = 0;
Int (Entero), principal tipo de datos para almacenar números, es de 2 bytes y tiene
un rango de -32768 a 32767. Declaración en Arduino: int y = 4000;
Float (Flotante), tipo de datos que utiliza puntos decimales, generalmente su uso es
en operaciones matemáticas, Declaración en Arduino: float z = 1.7;
Char (Carácter), tipo de datos que almacena una variable tipo carácter de 1 byte, su
uso principal es para texto: char letra = ‘a’; (el carácter debe ir entre comillas
sencillas)
4
LABORATORIO Nº15 MOTOR DC
• Aritméticos:
= Asignación, ejemplo: int x = 8;
* Multiplicación, ejemplo x = x * y;
/ División, ejemplo x = x / y;
• Comparativos:
== Igual a, ejemplo x == 8;
Arduino tiene la capacidad de leer entradas digitales por cualquiera de sus pines, incluso en
los pines análogos, el arduino lee un cambio de voltaje de 0 a 5 volts, donde 0 = 0 o false, y
5v = 1 o true. Las entradas digitales generalmente se utilizan para la lectura de botones o
cualquier señal que cambie de 0 a 5 volts.
En donde pin representa el número del pin por donde vamos a conectar la entrada digital.
Para leer una entrada digital generalmente se debe utilizar una variable tipo booleana.
Ejemplo:
boolean x; x = digitalRead(4);
Comunicación Serial
5
LABORATORIO Nº15 MOTOR DC
Ejemplo:
void setup()
{
Serial.begin(9600); // abre el Puerto serie y configura la velocidad a 9600 bps
}
Serial.println(); Imprime los datos al puerto serial como texto ASCII y ademas agrega un
salto de linea.
Entrada análoga
analogRead(); Lee el valor en voltaje del pin analógico especificado, los ADC de arduino
tienen una resolución de 10 bits, esto quiere decir que proporciona una lectura de
5volts/1024 unidades.
Ejemplo:
void setup()
{
Serial.begin(9600); // configura el puerto serie a 9600bps
}
void loop()
{
Serial.println(analogRead(0)); // envía valor analógico
delay(1000); // espera 1 segundo
}
6
LABORATORIO Nº15 MOTOR DC
Condicional if
EJ:
if (x < 45){
//accion a
}
else{
//accion b
}
Leer una entrada análoga y mostrar por la pantalla del computador (consola serial) el valor
luego de girar el potenciómetro
7
LABORATORIO Nº15 MOTOR DC
//------------------------------------
//Declara puertos de entradas y salidas
//------------------------------------
int pulsador=2; //Pin donde se encuentra el pulsador, entrada
int led=13; //Pin donde se encuentra el LED, salida
//------------------------------------
//Funcion principal
//------------------------------------
void setup() // Se ejecuta cada vez que el Arduino se inicia
{
pinMode(pulsador, INPUT); //Configurar el pulsador como una entrada
pinMode(led,OUTPUT); //Configurar el LED como una salida
8
LABORATORIO Nº15 MOTOR DC
}
//------------------------------------
//Funcion ciclicla
//------------------------------------
void loop() // Esta funcion se mantiene ejecutando
{ // cuando este energizado el Arduino
//Condicional para saber estado del pulsador
if (digitalRead(pulsador)==HIGH)
{
//Pulsador oprimido
digitalWrite(led,HIGH); //Enciende el LED
}
else
{
//Pulsador NO oprimido
digitalWrite(led,LOW); //Apaga el LED
}
}
//Fin programa
Ejemplo 3.-Lectura Serial de una Entrada Digital
Leer una entrada digital y mostrar por la pantalla del computador (consola serial) el estado
del pulsador cuando es oprimido
9
LABORATORIO Nº15 MOTOR DC
}
void loop() // Esta funcion se mantiene ejecutando
{ // cuando este energizado el Arduino
//Guardar en una variable entera el valor del boton 0 ó 1
int estado = digitalRead(boton);
//Condicional para saber estado del pulsador
if (estado==1)
{
// Pulsado
Serial.println("Pulsado"); //Imprime en la consola serial
} // "Pulsado"
else
{
// No esta pulsado
Serial.println("NO Pulsado"); //Imprime en la consola serial
} // "NO Pulsado"
delay(100); //Retardo para la visualización de datos en la consola
}
//Fin programa
10
LABORATORIO Nº15 MOTOR DC
LABORATORIO Nº 14
PANTALLA LCD
Objetivo.-.
Aprender a programar una pantalla LCD para representar los datos que necesitemos
visualizar.
Marco teórico.-
Pantalla LCD
Dentro de la computación física, tenemos sensores y actuadores. Estos componentes son las
interfaces hardware que ponen en contacto el mundo físico con el mundo virtual. Al igual
que con los ordenadores tenemos teclado, ratón, altavoces, etc…, con las placas
microcontroladoras como Arduino, tenemos hardware que harán la misma función. En este
caso vamos a ver un actuador, una pantalla LCD con Arduino.
Para utilizar una pantalla LCD debemos incluir una librería que se llama LiquidCrystal:
11
LABORATORIO Nº15 MOTOR DC
Circuito y Programación.-
El siguiente programa es un ejemplo básico para comenzar a utilizar nuestra pantalla y
probar que las conexiones se encuentran correctas. Al cargarlo debemos ver la palabra
HOLA MUNDO en pantalla LCD y además una animación del texto moviéndose en la
pantalla. Hemos comentado lo más posible el código de manera que sea fácil de entender.
*/
#include <LiquidCrystal.h>
// CONSTRUCTOR PARA LA PANTALLA LCD 16X2
// AQUI SE CONFIGURAN LOS PINES PARA LA COMUNICACION CON LA PANTALLA
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup()
{
// INDICAMOS QUE TENEMOS CONECTADA UNA PANTALLA DE 16X2
lcd.begin(16, 2);
// MOVER EL CURSOR A LA PRIMERA POSICION DE LA PANTALLA (0, 0)
lcd.home();
// IMPRIMIR "INGENIERIA" EN LA PRIMERA LINEA
lcd.print("INGENIERIA");
// MOVER EL CURSOR A LA SEGUNDA LINEA (1) PRIMERA COLUMNA (0)
lcd.setCursor ( 0, 1 );
// IMPRIMIR OTRA CADENA EN ESTA POSICION
lcd.print("ELECTROMECANICA");
12
LABORATORIO Nº15 MOTOR DC
// ESPERAR UN SEGUNDO
delay(1000);
}
void loop()
{
// EN EL CICLO PRINCIPAL SOLAMENTE RECORREMOS EL MENSAJE DE UN LADO A OTRO
// VARIABLE PARA CONTROL DE CICLOS
int i;
// DESPLAZAR LA PANTALLA A LA DERECHA 2 VECES
for ( int i = 0; i < 5; i++ ) {
lcd.scrollDisplayRight();
delay (1000);
}
// DESPLAZAR LA PANTALLA A LA IZQUIERDA 2 VECES
for ( int i = 0; i < 5; i++ ) {
lcd.scrollDisplayLeft();
delay (1000);
}
}
Otro de los usos comunes de la pantalla LCD de 16×2 es mostrar valores medidos por sensores
analogicos. El siguiente programa esta diseñado para ser un ejemplo de como desplegar el valor
medido por un sensor en la pantalla, en este ejemplo estaremos utilizando un potenciómetro
conectado a la entrada analógica A0 para simular la entrada del sensor. Se ha comentado el código
para que se facilite la comprensión:
#include <LiquidCrystal.h>
void setup()
{
// INDICAMOS QUE TENEMOS CONECTADA UNA PANTALLA DE 16X2
lcd.begin(16, 2);
// MOVER EL CURSOR A LA PRIMERA POSICION DE LA PANTALLA Y BORRAR (0, 0)
lcd.clear();
// IMPRIMIR CADENA EN LA PRIMERA POSICION
lcd.print(" ELECTROMECANICA ");
// ESPERAR UN SEGUNDO
delay(1000);
}
void loop()
{
13
LABORATORIO Nº15 MOTOR DC
// IMPRIMIR VALORES EN LA SEGUNDA LINEA, COMENZANDO POR EL VALOR DIRECTO DEL ADC
lcd.setCursor(0, 1);
lcd.print(val);
// IMPRIMIR EL VALOR EN VOLTAJE, DESPUES DE LA LECTURA DEL ADC
lcd.setCursor(6, 1);
lcd.print(volts, 1);
Utilizar el sensor LM35 para medir la temperatura y luego visualizar en una pantalla LCD 16x2, la
lectura del sensor se debe visualizar en grados celsio y kelvin.
14
LABORATORIO Nº15 MOTOR DC
LABORATORIO Nº 15
Objetivo.-.
Controlar la velocidad y el sentido de un motor DC usando el microcontrolador Aarduino.
Marco teórico.-
Motor DC
Un motor de corriente continua convierte la energía eléctrica en mecánica. Se compone
de dos partes: el estator y el rotor.
El estator es la parte mecánica del motor donde están los polos del imán.
El rotor es la parte móvil del motor con devanado y un núcleo, al que llega la corriente a
través de las escobillas.
Cuando la corriente eléctrica circula por el devanado del rotor, se crea un campo
electromagnético. Este interactúa con el campo magnético del imán del estator. Esto
deriva en un rechazo entre los polos del imán del estator y del rotor creando un par de
fuerza donde el rotor gira en un sentido de forma permanente.
Si queremos cambiar el sentido de giro del rotor, tenemos que cambiar el sentido de la
corriente que le proporcionamos al rotor; basta con invertir la polaridad de la pila o
batería.
PUENTE H L293D
Para controlar un motor DC desde Arduino, tendremos que usar un driver para motores
para proporcionarle más corriente al motor ya que las salidas del Arduino sólo dan 40mA.
De esta manera, con el driver podemos alimentar el motor con una fuente de alimentación
externa.
El L293D es un integrado para controlar motores DC que usa el sistema puente en H. ¿Qué
es el puente en H? Es un sistema para controlar el sentido de giro de un motor DC usando
cuatro transistores. En la imagen vemos que los transistores se comportan como
15
LABORATORIO Nº15 MOTOR DC
La modulación por ancho de pulsos (también conocida como PWM, siglas en inglés de pulse-
width modulation) de una señal o fuente de energía es una técnica en la que se modifica el
ciclo de trabajo de una señal periódica para controlar la cantidad de energía que se envía a
una carga.
Instrucción utilizada en arduino para controlar un pin PWM, arduino ya cuenta con una
librería interna la cual se utiliza en cuanto el programa localiza la instrucción y la misma
librería nos simplifica el trabajo y solo nos pide la cantidad de porcentaje de PWM que
deseamos entregar
Instrucción Map
Con la función map(), podemos adaptar un valor de un rango determinado a otro con un
rango diferente, es decir, podemos “escalar” una señal a nuestra conveniencia.
Sintaxis:
map(value, fromLow, fromHigh, toLow, toHigh)
Parámetros:
value : el valor a mapear.
fromLow : el límite inferior del rango actual del valor.
fromHigh : el límite superior del rango actual del valor.
toLow : el límite inferior del rango objetivo del valor.
16
LABORATORIO Nº15 MOTOR DC
Cuando el potenciómetro este entre el valor medio y el valor mínimo el motor debe
girar en sentido anti horario (ver la gráfica para mayor entendimiento)
Cuando el potenciómetro este entre el valor medio y el valor máximo el motor debe
girar en sentido horario (ver la gráfica para mayor entendimiento)
Sabemos que hay que atacar los pins 2 y 7 del L293D desde dos salidas del Arduino. En estas dos
salidas habrá un PWM a cada una. Pero tenemos que invertir un PWM. ¿Qué quiere decir invertir?
17
LABORATORIO Nº15 MOTOR DC
Pues que cuando en un PWM tengamos un pulso a un valor alto, en el otro PWM el mismo pulso
sea valor bajo. En la imagen lo entenderemos de una manera más gráfica.
Nosotros usaremos la parte de la izquierda (los diodos externos en el L293D están dentro).
Cómo se aprecia en la imagen, los pins 3 y 6 son las salidas y se conectan a los bornes del
18
LABORATORIO Nº15 MOTOR DC
motor. Y los pins 2 y 7 son las entradas donde conectaremos las salidas del Arduino.
Dependiendo que valor ponemos entre los pins 2 y 7 el motor girará en un sentido o en
otro.
void setup()
{
//Inicializamos los pins de salida
pinMode(pin2,OUTPUT);
pinMode(pin7, OUTPUT);
}
void loop()
{
//Almacenamos el valor del potenciómetro en la variable
valorpote=analogRead(pote);
19
LABORATORIO Nº15 MOTOR DC
pwm2 = map(valorpote, 0, 1023, 255, 0); //El PWM 2 esta invertido respecto al PWM 1
//Sacamos el PWM de las dos salidas usando analogWrite(pin,valor)
analogWrite(pin2,pwm1);
analogWrite(pin7,pwm2);
}
PRÁCTICA PARA EL ALUMNO:
20
LABORATORIO Nº16 CONTROL DE MOTOR PASO A PASO
LABORATORIO Nº 16
Objetivo.-
Diseñar e implementar en base al microcontrolador arduino un circuito que me permita el
control de giro de un motor PAP,
Marco teórico.-
El motor de paso a paso es un motor muy distinto al de corriente contínua, ya que como
indica su nombre no realiza giros continuos, sino con un paso de un ángulo determinado
por el motor.
El ángulo de paso del motor depende del número de bobinas por el que está compuesto,
por lo tanto el giro completo depende de la magnitud de este ángulo de paso; por ejemplo
si es un motor con 90⁰ por paso, realizará un giro completo en 4 pasos.
Este motor es muy utilizado en los campos de la robótica y automatización ya que permite
un control más exacto del movimiento angular.
22
LABORATORIO Nº16 CONTROL DE MOTOR PASO A PASO
23
LABORATORIO Nº16 CONTROL DE MOTOR PASO A PASO
Circuito y Programación.-
Para los siguientes ejemplos de programación se utilizara el siguiente circuito, ya que se
explican diferentes formas de realizar la programación.
24
LABORATORIO Nº16 CONTROL DE MOTOR PASO A PASO
A) PROGRAMACION MANUAL
/*
Programa que realiza un giro completo del motor 28BYJ-48 en conjunto con el
controlador basado en ULN2003, detiene 5 segundos y luego comienza nuevamente. La
secuencia es la de paso completo simple (wave drive) energizando de a una bobina por
vez.
*/
void setup() {
pinMode(IN1, OUTPUT); // todos los pines como salida
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void loop() {
25
LABORATORIO Nº16 CONTROL DE MOTOR PASO A PASO
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
delay(demora);
/*
Programa que realiza un giro completo del motor 28BYJ-48 en conjunto con el controlador
basado en ULN2003, detiene 5 segundos y luego comienza nuevamente. La secuencia es la
de paso completo simple (wave drive) energizando de a una bobina por vez utilizando una
matriz para su definicion.
26
LABORATORIO Nº16 CONTROL DE MOTOR PASO A PASO
*/
void setup() {
pinMode(IN1, OUTPUT); // todos los pines como salida
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void loop() {
27
LABORATORIO Nº16 CONTROL DE MOTOR PASO A PASO
/*
Programa que realiza un giro completo del motor 28BYJ-48 en conjunto con el controlador
basado en ULN2003, detiene 5 segundos y luego comienza nuevamente. La secuencia es la
de paso completo con dos bobinas para una maximo torque utilizando una matriz para su
definicion.
*/
void setup() {
pinMode(IN1, OUTPUT); // todos los pines como salida
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void loop() {
{
for (int i = 0; i < 4; i++) // bucle recorre la matriz de a una fila por vez
{ // para obtener los valores logicos a aplicar
digitalWrite(IN1, paso[i][0]); // a IN1, IN2, IN3 e IN4
digitalWrite(IN2, paso[i][1]);
digitalWrite(IN3, paso[i][2]);
digitalWrite(IN4, paso[i][3]);
delay(demora);
}
}
29
LABORATORIO Nº16 CONTROL DE MOTOR PASO A PASO
{0, 1, 1, 0},
{0, 0, 1, 0},
{0, 0, 1, 1},
{0, 0, 0, 1},
{1, 0, 0, 1}
};
void setup() {
pinMode(IN1, OUTPUT); // todos los pines como salida
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void loop() {
30
LABORATORIO Nº16 CONTROL DE MOTOR PASO A PASO
SetSpeed(rpm)
Esta función nos sirve únicamente para ajustar la velocidad de giro del eje de nuestro
motor. El parámetro que recibe dicha función es un número entero, el cual representa la
velocidad de rotación (en RPM) que deseamos darle a nuestro motor. Por lo tanto no es
una función que retorne ningún valor.
Aunque esta función acepta que se le ingrese cualquier número entero, debemos
respetar la frecuencia máxima admisible entre pulsos dada por el fabricante del motor.
Para el caso en concreto del 28BYJ-48 este valor es de 100 Hz, es decir un delay o demora
entre pulsos de 1/100=0.01 segundos o 10 milisegundos. Con la finalidad de asegurarnos
de que el valor que ingresemos a la función setSpeed cumpla con esta especificación
podemos realizar el siguiente cálculo:
1 RPM: 1 vuelta/min = 1 vuelta cada 60 seg, pero para dar una vuelta necesita dar 2048
pasos
60/2048= 0,02929 seg*1000
=29,3 milisegundos
2 RPM: 2 vuelta/min = 1 vuelta cada 30 seg, pero para dar una vuelta necesita dar 2048
pasos
30/2048= 0,01464 seg*1000
=14,6 milisegundos
3 RPM: 3 vuelta/min = 1 vuelta cada 20 seg, pero para dar una vuelta necesita dar 2048
pasos
20/2048= 0,00976 seg*1000
=9,8 milisegundos = 10 milisegundos
31
LABORATORIO Nº16 CONTROL DE MOTOR PASO A PASO
Step(steps)
Esta función manda a girar el motor una cantidad especifica de pasos igual al valor del
parámetro steps ingresado en la misma. La velocidad de rotación en cada paso estará
determinada por la llamada más reciente de la función setSpeed(). Si queremos invertir el
sentido de giro de nuestro motor basta con colocar la cantidad de pasos precedida por el
signo menos. Por ejemplo, si quimereamos que nuestro 28BYJ-48 diera un cuarto de
vuelta en sentido contrario al original debemos hacer la siguiente llamada
setSpeed(-512);
void setup() {
motor1.setSpeed(2); // en RPM (valores de 1, 2 o 3 para 28BYJ-48)
}
void loop() {
motor1.step(512); // cantidad de pasos
delay(2000); // demora de 2 seg. por cuestiones practicas
}
void setup() {
motor1.setSpeed(2); // en RPM (valores de 1, 2 o 3 para 28BYJ-48)
}
void loop() {
motor1.step(512); // cantidad de pasos
32
LABORATORIO Nº16 CONTROL DE MOTOR PASO A PASO
Sensor LM35
33
LABORATORIO Nº 17 SERVOMOTOR
LABORATORIO Nº 17
SERVOMOTOR
Objetivo.-.
Conocer el funcionamiento y el manejo de un servomotor.
Marco teórico.-
Servomotor
Un servomotor o comúnmente llamado servo, es un motor DC con la capacidad de ubicar
su eje en una posición o ángulo determinado, internamente tiene una caja reductora la
cual le aumenta el torque y reduce la velocidad, un potenciómetro encargado de sensar la
posición del eje y una pequeña tarjeta electrónica que junto al potenciómetro forman un
control de lazo cerrado.
Todos los servos usados para robótica, tiene un conector de 3 cables. VCC (rojo), GND
(Marrón) y Señal (Naranja):
La señal o dato que hay que enviarle al servo es una señal de PWM donde el tiempo en
alto es equivalente al ángulo o posición del servo. Estos valores pueden variar y van desde
0.5 a 1 milisegundo para la posición 0° y 2 a 2.4 milisegundos para la posición de 180°, el
periodo de la señal debe ser cercano a 20 milisegundos.
34
LABORATORIO Nº 17 SERVOMOTOR
attach(Pin)
Establece el pin indicado en la variable servo. Ej: servo.attach(2);
attach(Pin,min,max)
Establece el pin indicado en la variable servo, considerando min el ancho de pulso para la
posición 0° y max el ancho de pulso para 180°.Ej: servo.attach(2,900,2100);
write(angulo)
Envía la señal correspondiente al servo para que se ubique en el ángulo indicado, ángulo
es un valor entre 0 y 180°. Ej: servo.write(45);
writeMicroseconds(tiempo)
Envía al servo el ancho de pulso=tiempo en microsegundos. Ej:
servo.writeMicroseconds(1500);
read ()
Lee la posición actual del servo, devuelve un valor entre 0 y 180. Ej: angulo=read () ;
attached(Pin)
Verifica si la variable servo está unido al pin indicado, devuelve true o false. Ej:
if(attached(2))
35
LABORATORIO Nº 17 SERVOMOTOR
detach(pin)
Separa la variable Servo del pin indicado. Ej: servo. detach(2);
Circuito y Programación.-
Ejemplo 1
Programar el arduino para que el servomotor se establezca en 3 posiciones en los ángulos
0º, 90º y 180º, en cada posición se debe detener 1 segundo.
void loop() {
// Desplazamos a la posición 0º
servoMotor.write(0);
// Esperamos 1 segundo
delay(1000);
36
LABORATORIO Nº 17 SERVOMOTOR
void loop() {
// Vamos a tener dos bucles uno para mover en sentido positivo y otro en sentido
negativo
// Para el sentido positivo
for (int i = 0; i <= 180; i++)
{
// Desplazamos al ángulo correspondiente
servoMotor.write(i);
// Hacemos una pausa de 25ms
delay(25);
}
// Para el sentido negativo
for (int i = 179; i > 0; i--)
{
// Desplazamos al ángulo correspondiente
servoMotor.write(i);
// Hacemos una pausa de 25ms
delay(25);
}
}
37
LABORATORIO Nº 17 SERVOMOTOR
#include <Servo.h>
Servo myservo; //creamos un objeto servo
void setup()
{
myservo.attach(9); // asignamos el pin 9 al servo.
Serial.begin(9600);
}
void loop()
{
int adc = analogRead(A0); // realizamos la lectura del potenciometro
int angulo = map(adc, 0, 1023, 0, 180); // escalamos la lectura a un valor entre 0 y 180
myservo.write(angulo); // enviamos el valor escalado al servo.
Serial.print("Angulo: ");
Serial.println(angulo);
delay(10);
}
void setup() {
Serial.begin(9600);
38
LABORATORIO Nº 17 SERVOMOTOR
void loop() {
if (Serial.available() > 0) {
String grados = "";
do {
grados = grados + (char)Serial.read();
//Serial.println(grados);
delay(5);
}
while (Serial.available() > 0);
Serial.println("Movido a la posición: " + (String)grados);
posicion = grados.toInt();
myservo.write(posicion);
Serial.println("Escribe la posición donde mover el servo (0 - 180)");
}
}
40
LABORATORIO Nº 18 SENSOR DE ULTRASONIDOS
LABORATORIO Nº 18
SENSOR DE ULTRASONIDOS
Objetivo.-.
Conocer el sensor de ultrasonidos, su funcionamiento y programacion en arduino.
Marco teórico.-
Sensor de ultrasonidos
Un sensor de ultra sonidos es un dispositivo para medir distancias. Su funcionamiento se
base en el envío de un pulso de alta frecuencia, no audible por el ser humano. Este pulso
rebota en los objetos cercanos y es reflejado hacia el sensor, que dispone de un micrófono
adecuado para esa frecuencia.
Midiendo el tiempo entre pulsos, conociendo la velocidad del sonido, podemos estimar la
distancia del objeto contra cuya superficie impacto el impulso de ultrasonidos
El rango de medición teórico del sensor HC-SR04 es de 2cm a 400 cm, con una resolución
de 0.3cm. En la práctica, sin embargo, el rango de medición real es mucho más limitado,
en torno a 20cm a 2 metros.
El motivo de dividir por dos el tiempo (además de la velocidad del sonido en las unidades
apropiadas, que hemos calculado antes) es porque hemos medido el tiempo que tarda el
pulso en ir y volver, por lo que la distancia recorrida por el pulso es el doble de la que
queremos medir.
LABORATORIO Nº 18 SENSOR DE ULTRASONIDOS
42
LABORATORIO Nº 18 SENSOR DE ULTRASONIDOS
Funcion pulsein()
Lee un pulso (HIGHo LOW) en un pin. Por ejemplo, si el valor es alto, pulseIn () espera a
que el pin pase a nivel HIGH, se inicia el tiempo, espera a que el pin pase a nivel LOW y
para el cronómetro. Devuelve la longitud del impulso en microsegundos o 0 si no se recibe
un pulso completo dentro del tiempo de espera.
Sintaxis
pulseIn (pin, value)
Parámetros
pin: el número de pin en el que desea leer el pulso. (int)
value: tipo de pulso a leer: HIGH o LOW. (int)
timeout (opcional): el número de microsegundos que espera a que el pulso se
complete: la función devuelve 0 si el pulso completo no se recibe dentro del
tiempo de espera. Por defecto es de un segundo (unsigned long).
Circuito y Programación.-
Realiza la medición de distancia con un sensor ultrasónico HC-SR04 conectado al arduino
a. Programación sin librería
43
LABORATORIO Nº 18 SENSOR DE ULTRASONIDOS
void setup() {
Serial.begin(9600);//iniciailzamos la comunicación
pinMode(Trigger, OUTPUT); //pin como salida
pinMode(Echo, INPUT); //pin como entrada
digitalWrite(Trigger, LOW);//Inicializamos el pin con 0
}
void loop()
{
long t; //timepo que demora en llegar el eco
long d; //distancia en centimetros
digitalWrite(Trigger, HIGH);
delayMicroseconds(10); //Enviamos un pulso de 10us
digitalWrite(Trigger, LOW);
Serial.print("Distancia: ");
Serial.print(d); //Enviamos serialmente el valor de la distancia
Serial.print("cm");
Serial.println();
delay(100); //Hacemos una pausa de 100ms
}
// ---------------------------------------------------------------------------
// Medir distancia aproximadamente 20 veces por segundo.
// ---------------------------------------------------------------------------
44
LABORATORIO Nº 18 SENSOR DE ULTRASONIDOS
#include <NewPing.h>
#define TRIGGER_PIN 2 // pin del arduino conectado al pin trigger del sensor ultrasonico.
#define ECHO_PIN 3 // pin del arduino conectado al pin echo del sensor ultrasonico.
#define MAX_DISTANCE 200 // Distancia máxima que queremos hacer ping (en centímetros). La
distancia máxima del sensor es de 400-500 cm.
void setup() {
Serial.begin(115200); //
}
void loop() {
delay(50); // Esperar 50 ms entre pings (unos 20 pings / seg). 29ms debe ser el menor
retraso entre pings.
Serial.print("Ping: ");
Serial.print(sonar.ping_cm()); // Enviar ping, obtener la distancia en cm e imprimir el resultado (0 =
fuera del rango de distancia establecido)
Serial.println("cm");
}
Medir distancia de forma cualitativa (con los colores de tres leds) mediante el sensor de
ultrasonidos. el LED rojo debe encender si algun objeto está a menos de 20 centímetros, amarillo
si está entre 20 y 40 centímetros, y verde si está a más de 40 centímetros, además de mostrar la
distancia en una pantalla LCD.
45
LABORATORIO Nº 18 SENSOR DE ULTRASONIDOS
LABORATORIO Nº 19
SENSOR DE COLOR
Objetivo.-
Diseñar e implementar en base al microcontrolador arduino la deteccion de color
mediante el sensor TCS230
Marco teórico.-
Sensor De Color TCS230
Internamente, el TCS230 está formado por una matriz de fotodiodos de silicona junto con
un conversor de frecuencia, en un único integrado CMOS.
La matriz dispone de 8 x 8 fotodiodos de 110 µm, de los cuales 16 tienen filtros azules, 16
verdes, 6 rojos, y 16 no tienen filtro. Los fotodiodos están distribuidos de forma que
minimizan el efecto la incidencia no uniforme de la luz.
La salida del TCS3200 es una onda cuadrada del 50% duty, cuya frecuencia es proporcional
a la intensidad luminosa. La tensión de alimentación del sensor es de 2.7V a 5.5V.
Sin embargo, podemos emplearlo para distinguir entre colores básicos. Por ejemplo,
podemos emplearlo para reconocer el color de una tarjeta o un objeto, y guiar a un robot
en un recorrido
El TCS230 tiene cuatro entradas digitales S0, S1, S2, y S3, y una salida digital Out. Para
conectarlo a Arduino necesitaremos emplear al menos 3 pines digitales.
En primer lugar debemos alimentar el módulo conectando los pines Gnd y Vcc del TCS230,
respectivamente, a Gnd y Vcc de Arduino.
Por otra parte, los pines S2 y S3 seleccionan el color a medir. Deberemos conectarlos a dos
Salidas digitales de Arduino.
Red Blue Clear Green
S2 Low Low High High
S3 Low High Low High
Finalmente, conectamos la salida del sensor Out a una entrada digital de Arduino.
Circuito y Programación.-
Ejemplo 1 Lectura de la frecuencia de cada color
Lectura y visualización de la frecuencia de salida en el monitor serie. En esta parte,
anotaremos los valores de frecuencia al colocar diferentes colores frente al sensor.
Siempre se debe hacer lectura de las frecuencias ya que existen varias tonalidades de cada
color, y los valores usados por cada estudiante siempre serán distintos
47
LABORATORIO Nº 19 SENSOR DE COLOR
//
// Cableado de TCS3200 a Arduino
//
#define S0 1
#define S1 2
#define S2 3
#define S3 4
#define salidaSensor 5
void setup() {
// Definiendo las Salidas
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
48
LABORATORIO Nº 19 SENSOR DE COLOR
49
LABORATORIO Nº 19 SENSOR DE COLOR
const int s3 = 4;
const int out = 5;
int rojo = 0;
int verde = 0;
int azul = 0;
void setup(){
Serial.begin(9600);
pinMode(s0,OUTPUT);
pinMode(s1,OUTPUT);
pinMode(s2,OUTPUT);
pinMode(s3,OUTPUT);
pinMode(out,INPUT);
digitalWrite(s0,HIGH);
digitalWrite(s1,HIGH);
}
void loop(){
color();
Serial.print(" ");
Serial.print(rojo, DEC);
Serial.print(" ");
Serial.print(verde, DEC);
Serial.print(" ");
Serial.print(azul, DEC);
if (rojo < azul && verde > azul && rojo < 40)
{
Serial.println(" Rojo");
}
else if (azul < rojo && azul < verde && verde < rojo)
{
Serial.println(" Azul");
}
void color()
{
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
rojo = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
50
LABORATORIO Nº 19 SENSOR DE COLOR
digitalWrite(s3, HIGH);
azul = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
digitalWrite(s2, HIGH);
verde = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
}
NOTA: Para detectar los colores se deben hacer tres cubos cada uno de los colores
mencionados
51
LABORATORIO Nº 20 TECLADO MATRICIAL
LABORATORIO Nº 20
TECLADO MATRICIAL
Objetivo.-
Aprender que es un teclado matricial 4×4, como conectarlo a la tarjeta Arduino y por
ultimo como realizar la programación para la visualización de los caracteres del teclado en
el monitor serial del Software Arduino.
Marco teórico.-
Teclado Matricial
Teclado matricial 4×4: Un teclado matricial no es más que una matriz de botones, los
teclados comunes poseen los valores 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, *, #, A, B, C, D, estos
caracteres ocupan las 16 teclas de un teclado 4×4, para que estos teclados realicen la
función de una matriz, cada casilla es asignada a una fila o a una columna, esto para que el
software Arduino reconozca las teclas presionadas gracias a la libreria Keypad.
Como se puede ver en la imagen superior de lado derecho se aprecian las filas y columnas
así como la asignación de cada tecla.
El teclado matricial cuanta con 8 puntos de conexion, debido a la libreria de Arduino esta
conexión resulta muy fácil al no requerir resistencias u otros elementos aparte claro de
cables o jumpers. Tal y como se ve en la siguiente imagen la conexión del primer pin del
teclado se conecta a la entra digital numero 2 de Arduino, despues de eso todo se conecta
en una fila seguida
52
LABORATORIO Nº 20 TECLADO MATRICIAL
Ahora deberemos declarar las filas y columnas que posee nuestro teclado
const byte filas = 4; //Con esto definimos que utilizaremos las 4 filas de nuestro teclado
const byte columnas = 4; //Con esto definimos que utilizaremos las 4 columnas de nuestro
teclado
byte pinesF[filas] = {9,8,7,6}; //Ahora definiremos los pines de Arduno a los que estarán
conectadas las filas de nuestra matriz (para referirnos a estas conexiones en la
programación usaremos “pinesF”
byte pinesC[columnas] = {5,4,3,2}; //Ahora definiremos los pines de Arduno a los que
estarán conectadas las columnas de nuestra matriz (para referirnos a estas conexiones en
la programación usaremos “pinesC“
{‘1′,’2′,’3′,’A’},
{‘4′,’5′,’6′,’B’},
{‘7′,’8′,’9′,’C’},
{‘*’,’0′,’#’,’D’}
};
char tecla; // ahora deberemos definir la variable tecla, como su nombre lo indica es la
tecla que se mostrara al presionarla en el teclado
void loop() {
if (tecla != 0) // casi para terminar abrimos un ciclo if para preguntar si tecla es diferente
que 0
53
LABORATORIO Nº 20 TECLADO MATRICIAL
Circuito y Programación.-
Tras la carga de la programación a Arduino al abrir el monitor serial de Arduino y presionar
una tecla en el teclado matricial, el carácter se imprime correctamente en el monitor.
#include<Keypad.h>
const byte filas = 4;
const byte columnas = 4;
byte pinesF[filas] = {9,8,7,6};
byte pinesC[columnas] = {5,4,3,2};
char teclas[filas][columnas] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
Keypad teclado = Keypad(makeKeymap(teclas), pinesF, pinesC, filas, columnas);
char tecla;
void setup() {
Serial.begin(9600);
}
void loop() {
tecla = teclado.getKey();
if (tecla != 0)
Serial.print(tecla);
}
54
LABORATORIO Nº 20 TECLADO MATRICIAL
55
LABORATORIO Nº21 BLUETOOTH
LABORATORIO Nº 21
BLUETOOTH
Objetivo.-
Diseñar e implementar un circuito digital en base al microcontrolador Arduino que permita
la comunicación Bluetooth, veremos cómo configurarlo y cómo enviar y recibir datos
desde un dispositivo Android. Se controlarán Leds y algunos actuadores desde una
aplicación creada para nuestro smatphone Android, usando MIT App Inventor.
Marco teórico.-
Módulo Bluetooth
El Bluetooth es un estándar de comunicación inalámbrica que permite la transmisión de
datos a través de radiofrecuencia en la banda de 2,4 GHz. Existen muchos módulos
Bluetooth para usarlos en nuestros proyectos de electrónica, pero los más utilizados son
los módulos de JY-MCU, ya que son muy económicos y fáciles de encontrar en el mercado.
Son módulos pequeños y con un consumo muy bajo que nos permitirán agregar
funcionalidades Bluetooth a nuestro Arduino. Estos módulos contienen el chip con una
placa de desarrollo con los pins necesarios para la comunicación serie.
Existen dos modelos de módulos Bluetooth: el HC-05 que puede ser maestro/esclavo
(master/slave), y el HC-06 que solo puede actuar como esclavo (slave). Los módulos
Bluetooth pueden configurarse como Maestro o Esclavo. Esto quiere decir que un módulo
configurado como Maestro es el que inicia el emparejamiento o conexión, mientras que
un módulo configurado como Esclavo espera a que otros se conecten a él.
Físicamente, los dos módulos son muy parecidos, solo varían algunas conexiones. Los pins
que encontraremos son los siguientes:
56
LABORATORIO Nº21 BLUETOOTH
Se suele utilizar una velocidad de 9600 baudios porque esa es la velocidad a la que se
comunica el HC-06 por defecto. En cuanto al setup() declaramos los pines como entradas o
salidas con la función pinMode(), dependiendo de lo que tengamos conectado al Arduino
(por ejemplo, un LED, un pulsador, un servo...).
A la hora de conectar el HC-06 con nuestro teléfono Android, pedirá una contraseña para
establecer la conexión. Por defecto es: 1234
57
LABORATORIO Nº21 BLUETOOTH
Circuito y Programación.-Ejemplo 1
Controlar dos LEDs, los cuales se pueden encender y apagar desde el smartphone. A través
del Bluetooth llegan datos de tipo “char" por parte del móvil. El Arduino decide qué acción
ejecutar de acuerdo al dato que recibe, por ejemplo, si recibe la letra 'A' entonces
enciende un LED y si recibe la letra 'B' lo apaga. (En el circuito se usa un arduino mega pero
también se puede utilizar el arduino uno)
Pasos:
Cargar el código a nuestro arduino con modulo bluetooth desconectado
Descargar e instalar la aplicación en nuestro Smartphone (CD)
Activar el Bluetooth de nuestro Smartphone y entrar a la aplicación
Conectar el modulo Bluetooth y encender nuestro arduino con el circuito también
conectado y realizar la alimentación.
Desde la aplicación emparejar el bluetooh del arduino con el del Smartphone
Encender y apagar los led desde nuestro smartphone
void setup() {
pinMode(led_1, OUTPUT);
pinMode(led_2, OUTPUT);
Serial.begin(9600);
}
58
LABORATORIO Nº21 BLUETOOTH
void loop() {
Circuito y Programación.-Ejemplo 2
Controlar el PWM en una salida de nuestro arduino, para variar el ángulo de un
servomotor. En este caso en particular, utilizamos deslizadores para enviar datos variables
los cuales modificarán el ángulo del servo además también podemos variar el ángulo del
servomotor con 5 pulsadores (0º, 45º, 90º, 135º, 180º) desde el smatphone.
59
LABORATORIO Nº21 BLUETOOTH
void setup()
{
myservo.attach(9); // attach servo signal wire to pin 9
//Setup usb serial connection to computer
Serial.begin(9600);
void loop()
{
//Read from bluetooth and write to usb serial
if(bluetooth.available()> 0 ) // receive number from bluetooth
{
int servopos = bluetooth.read(); // save the received number to servopos
Serial.println(servopos); // serial print servopos current number received from
bluetooth
myservo.write(servopos); // roate the servo the angle received from the android app
}
60
LABORATORIO Nº21 BLUETOOTH
Controlar un motor paso a paso desde nuestro Smartphone a través del Módulo Bluetooth,
desde el Smartphone podemos controlar el sentido de giro del motor (sentido horario y
sentido antihorario con botones) y la velocidad de giro de nuestro motor (con un deslizador).
61