You are on page 1of 93

LAB.

PROGRAMACIÓN II
ARDUINO ♥ C++
Instructor: Gadiel Ortez
QUE ES ARDUINO ?

 Es una plataforma de código abierto,


basada en una placa con un
microcontrolador (hardware), un
entorno de desarrollo (software), y
librerias todo esto diseñado para
facilitar el uso de la electrónica en
diversos proyectos.

 Es una pequeña computadora, que


realiza tareas especificas.
CARACTERISTICAS
 HARDWARE ARDUINO UNO

• 14 pines e/s
digital
• 6 pines PWM
• 6 e/s
analógicas
• Oscilador de
16 Mhz
• Conexión
USB
• Fuente
alimentación
• Micro
controlador
CARACTERISTICAS
ATMEL : MICROCONTROLADOR ATMEGA 168/328

Microprocesador con una arquitectura RISC de 8 bits


ARDUINO MEGA 2560
CARACTERÍSTICAS ARDUINO MEGA
CARACTERISTICAS
SOFTWARE

IDE de programación
Opensource.

Lenguajes de programación
-Processing/Wiring.
-JAVA
-C++
OTROS PLACAS Y MICRO-
CONTROLADORES
Raspberry Pi
ARM

Easy-PIC
Microchip
IDEAS DE PROYECTO!
ESTRUCTURA DE ARDUINO
 Un sketch es el nombre
que usa Arduino
para un programa.

 Existen dos funciones


especiales que son
parte de cada sketch
de Arduino:
ELECTRÓNICA BÁSICA
 Resistencia: oposición al flujo de corriente.
 Diodo: Componente electrónico que permite el paso de la
corriente en un solo sentido.

Rectificador

LED
 Fuente de Voltaje : Suministra voltaje de alimentacion para
dispositivos.

 Pulsador
PROTOBOARD
MEDICIONES CON MULTIMETRO
 Voltaje: se mide
en paralelo al elemento.

 Corriente: se mide
en serie con el elemento.
REPRESENTACIÓN NUMÉRICA

• Decimal • Binaria
Sistema de numeración que Sistema de numeración en
utiliza diez símbolos, 0- 9 el que los números se
para representar representan utilizando
determinada cantidad. solamente los símbolos
• Base :10 cero y uno (0 y 1).
• Símbolos: • Base: 2
0,1,2,3,4,5,6,7,8,9 • Símbolos: 0 , 1
CONVERSIONES ENTRE SISTEMAS

 Decimal a Binario
100 ->?
250 ->?

 Binario a Decimal
10101 ->?
10010101 ->?
TTL (TRANSISTOR-TRANSISTOR LOGIC)
 Estandarización de valores lógicos
 Es una familia lógica o lo que es lo mismo, una tecnología de
construcción de circuitos electrónicos digitales.
 La tensión nominal de alimentación de los circuitos TTL son 5 V
DC.

 Niveles de voltaje
establecidos:
LOGICA DIGITAL
AND OR
NOT
A B Salida

0 0 0
0 1 0
1 0 0
1 1 1
-IDE
-INSTALACIÓN DE
DRIVERS
-HOLA MUNDO
HOLA MUNDO !
 Led Parpadeante: Conectar un led al pin 13, haciendo se encienda durante
500 ms y se apague durante 100 ms, cíclicamente.
Objetivos:
Reconocer partes de la placa.
Familiarizarse con el entorno de programación.
Conocer ordenes como: pinMode,digitalWrite y delay.
SEMANA DOS
LENGUAJE C++
ESTRUCTURA DE ARDUINO
 Un sketch es el nombre
que usa Arduino
para un programa.

Existen dos funciones


especiales que son
parte de cada sketch
de Arduino:
VARIABLES

 Es una forma de almacenar datos para utilizarla posteriormente.


Deben ser declaradas antes de ser utilizadas. Ej.- tipo nombre=
valor inicial.

 Dos tipos :

Variables Locales: Se definen dentro de ciclos o funciones.

Variables Globales: Se definen al inicio del programa.


Función o metodo:
Es un bloque de codigo, constituido
por su nombre, tipo y parametros.

- tipo nombre(parametros){
//..bloque de codigo
}

 Punto y coma ( ; )
Debe utilizarse al final de cada linea.
TIPOS DE DATOS
 byte: valor numerico de 8 bits. (0-255)
 int :almacena numeros sin puntos decimales. (16 bits)
 long : almacena numeros grandes sin puntos
decimales. (32 bits)
 Char: es un tipo de dato que ocupa un byte de memoria y
almacena un valor de carácter.
 float : almacena numeros con punto flotante. (32 bits)
 String : almacena cadenas de texto.
 Arreglos :Coleccion de valores que son accedidos con un indice
numerico. Necesita ser declarado y asignarle valores antes de
ser utilizado.
OPERADORES DE COMPARACIÓNY
ARITMÉTICOS

 == , Igualdad
 !=, Distinto
 < , Menor
 >, Mayor
 <= , Menor o igual
 >= , Mayor o igual
 = , Asignación
OPERADORES LÓGICOS

 AND : &&
 OR : ||
 NOT: !

Operadores lógicos a nivel de bits


AND: &
OR: |
NOT: !
CONTROL DE DATOS

if (condicion) { • if (condición) {
// codigo //codigo
}
} else if (condición) {
 if (condicion) {
//codigo
//codigo }else{
} else { //codigo
// codigo
} }
CICLOS (FOR Y WHILE)
for(inicializacion; condicion;incremento){
//codigo
}

//inicializacion
while(condicion){
//codigo
//incremento
}
CONSTANTES
 true/false: constantes booleanas que definen niveles lógicos. ( True:1
:: False:0 )

 HIGH/LOW: definen los niveles o estados de un pin.


HIGH: 1 logico, ON, 5v.
LOW: 0 logico,OFF, 0v.

 INPUT/OUTPUT: definen el modo de un pin Digital como salida o


entrada.
ENTRADAS/SALIDAS DIGITALES
 pinMode(pin, modo): para configurar un pin especifico como
entrada o salida. INPUT/OUTPUT

 digitalRead(pin): Lee el estado de un pin digital obteniendo como


resultado HIGH o LOW.

 digitalWrite(pin, valor): Asigna el estado HIGH o LOW a un pin


digital especifico.
TIEMPO
 delay(ms): genera un tiempo de espera. Parametro que recibe
es en milisegundos.

 millis():devuelve el numero de milisegundos desde que la placa


arduino empezo a ejecutar el programa.

Matematicas
• min(x,y): calcula el minimo de dos numeros.
• max(x,y): calcula el maximo de dos numeros.
MEMORIA

 Flash: almacena el programa(sketch).

 SRAM: almacena variables. (Volatil)

 EEPROM: almacena información a largo plazo.


#include <EEPROM.h>
COMUNICACIÓN SERIAL
COMUNICACIÓN SERIAL
 Se utiliza para la comunicación entre la placa Arduino y un
ordenador u otros dispositivos.
 Funciones :

Serial.begin(velocidad) : Establece la velocidad de datos en bits por


segundo (baudios) para la transmisión de datos en serie.

Serial.end(): Desactiva la comunicación serie, permitiendo a los


pines RX y TX ser usados como entradas o salidas digitales.

Serial.available(): Devuelve el número de bytes (caracteres)


disponibles para ser leidos por el puerto serie.
 Serial.read() : Lee los datos entrantes del puerto serie. Devuelve
el primer byte disponible.

 Serial.parseInt() : devuelve el valor entero mas proximo en un


buffer serial de datos.

 Serial.print(): Imprime los datos al puerto serie como texto ASCII.

 Serial.println(): Imprime los datos al puerto serie como texto


ASCII , moviendo el cursos una linea abajo.

 Serial.write() : Escribe datos binarios en el puerto serie. Estos


datos se envían como un byte o una serie de bytes.
CÓDIGO ASCII: ES UNA REPRESENTACIÓN
NUMÉRICA DE UN CARÁCTER
ASCII
PRÁCTICO: EJEMPLO
Objetivos:
• Aplicar los conocimientos
teoricos adquiridos.
Ejemplo 1: Controlar el encendido
y apagado de un par de leds
utilizando la comunicacion
SERIAL.
Arduino tiene conectado dos leds,
los cuales se controlaran para que
solamente un LED oscile a la vez.
SECUENCIA DE LEDS
 Encender y apagar 4 leds secuencialmente. Conectar los leds
a los pines digitales 5,6,7 y 8.
 Objetivos:
Aprender a declarar variables.
Aprender a declarar una función y llamarla.
PRACTICA1: SEMÁFORO

 Crear la secuencia de luces de


un semáforo convencional
utilizando arduino.
SEMANA TRES
NUMEROS ALEATORIOS
 randomSeed()
randomSeed inicializa el generador de números aleatorios.

 random()
genera numeros aleatorios.

Ejemplos:
random(max) // toma el valor 0 como el minimo
random(min, max)
EJEMPLO NUMEROS ALEATORIOS
void setup(){
Serial.begin(9600);
randomSeed(analogRead(0));
}

void loop() {
randNumber = random(300);
Serial.println(randNumber);
randNumber = random(10, 20);
Serial.println(randNumber);
delay(50);
}
ARREGLOS
 Un arreglo es una colección de variables a las que podemos acceder
mediante un índice, el cual indica la posición dentro del arreglo.

Hint: * Utilizar ciclos para manipular arreglos


Sistema de Control
Entradas Salidas

Procesamiento
µC

Memoria
ENTRADAS/SALIDAS DIGITALES
 pinMode(pin, modo): para configurar un pin especifico como
entrada o salida. INPUT/OUTPUT

 digitalRead(pin): Lee el estado de un pin digital obteniendo como


resultado HIGH o LOW.

 digitalWrite(pin, valor): Asigna el estado HIGH o LOW a un pin


digital especifico.
EJEMPLO ENTRADA DIGITAL:
MONITOREAR ESTADO DEL BOTON
 Este ejemplo nos permite
monitorear el estado de un
switch estableciendo una
comunicacion serial con arduino
y la computadora.
int pushButton = 2;

void setup() {
Serial.begin(9600);
pinMode(pushButton, INPUT);
}

void loop() {
int buttonState = digitalRead(pushButton);
Serial.println(buttonState);
delay(1);
}
EJEMPLO E/S DIGITAL: SECUENCIA DE LEDS
CON PULSADOR
 Encender y apagar 4 leds secuencialmente al accionar un
pulsador. El pulsador debe estar conectado al pin 4 y los leds
a los pones 5,6,7 y 8.
 Objetivo: Aprender a conectar una entrada digital al arduino.
DIAGRAMA
ENTRADAS/SALIDAS ANALÓGICAS

 analogRead(pin): lee el valor desde un pin analógico con una


resolución de 10 bits. En un rango de (0-1023).

 analogWrite(pin,value): escribe un valor pseudo analógico usando


modulación por ancho de pulso (PWM) con una resolución de 8 bits.
Un rango de (0-255).
SENSOR DE
ROTACIÓN(POTENCIOMETRO)
 Un potenciómetro es un elemento simple que
proporciona una resistencia variable, que
podemos leer en la placa Arduino como un
valor analógico.

 La función analogRead() devuelve un número


entre 0 y 1023 que es proporcional a la
cantidad de voltaje que se aplica a la clavija.
EJEMPLO ENTRADA ANALÓGICA: CONTROLAR EL
TIEMPO DE ENCENDIDOY APAGADO DE UN LED

int potPin = 2;
int ledPin = 13;
int val = 0;
void setup () {
pinMode (ledPin, OUTPUT);
}
void loop () {
val = analogRead (potPin);
digitalWrite (ledPin, HIGH);
delay (val);
LIQUID CRYSTAL DISPLAY (LCD)
CONEXIÓN FÍSICA

Interfaz Paralela
4 Bits de Datos
2 Bits de Registro
Hitachi HD44780 drivers
LCD – LIBRERÍA LIQUIDCRYSTAL
DISPLAY
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
lcd.begin(16, 2); // Dimensiones de la LCD
lcd.print("hello, world!");
}

void loop() {
lcd.noBlink();
delay(3000);

lcd.blink();
delay(3000);
}
SEMANA CINCO
MOTORES DC

 Los pines de salida de Arduino son ideales para controlar


directamente los pequeños elementos eléctricos, como los LED. Sin
embargo, cuando se trata de dispositivos de consumos más
grandes es necesario incorporar otros dispositivos como ser un
transistor externo el cual nos es muy útil ya que se obtiene una gran
cantidad de corriente con una, mucho menor , además
incorporamos diodos para brindar mayor protección.

- +
E BC
 Utilizando transistor tipo NPN, conectaremos la carga (Motor) al
colector del transistor y el emisor al negativo . Así, cuando la señal
alta del pin de nuestro Arduino alcance la base, fluirá una pequeña
corriente de la base al emisor y la corriente a través del transistor
fluirá y el motor girará.
PRÁCTICA: CONTROLAR ENCEDIDO Y
APAGADO DE UN MOTOR DC
CÓDIGO
const int transistorPin = 9; //Conexión a Base del Transistor

void setup() {

pinMode(transistorPin, OUTPUT);
}

void loop() {

digitalWrite(transistorPin, HIGH);
delay(1000);
digitalWrite(transistorPin, LOW);
delay(1000);
}
PWM (MODULACIÓN POR ANCHO DE
PULSO)
 Es una técnica para
simular una salida
analógica con una salida
digital.

 El control digital se usa


para crear una onda
cuadrada, una señal que
conmuta constantemente
entre encendido y
apagado.
PROPORCIONALIDAD

0 𝑋
= X= 0
1023 255
512 𝑋
= X= 127
1023 255
1023 𝑋
= X= 255
1023 255
FUNCION MAP (PROPORCIONALIDAD)
MAP(VALUE, FROMLOW, FROMHIGH, TOLOW,
TOHIGH)

 Parámetros
value: el número (valor) a mapear.
void setup() {
fromLow: el límite inferior del rango Serial.begin(9600);
actual del valor. }
fromHigh: el límite superior del rango void loop() {
actual del valor. int val = analogRead(0);
toLow: límite inferior del rango val = map(val, 0, 1023, 0, 255);
deseado. Serial.print(“valor :”);
toHigh: límite superior del rango Serial.print(val);
deseado. }
 Devuelve
El valor mapeado.
PWM: MOTOR DC

Funcionamiento
Una señal lógica alta (5V) abre
la puerta y permite el paso de
la corriente, una señal de nivel
bajo (0V) cierra la puerta e
impide el paso de
corriente.
Esta señal que se debe
transmitir tiene la ventaja de
emplear un amperaje mínimo.
PRÁCTICA:
Utilizar un potenciometro
como entrada analogica
para controlar la salida
digital pwm de un motor
DC.
Aplicar conceptos de
entradas y salidas
digitales y analogicas y
mapeo de señales.
CODIGO
int pinMotor=9;
void setup() {
pinMode(pinMotor,OUTPUT);
Serial.begin(9600);
}
void loop() {
int valor = analogRead(0);
int velocidad = map(valor, 0, 1023, 0, 255);
analogWrite(pinMotor,velocidad);
Serial.print(“valor :”);
Serial.println(velocidad);
}
CONTROL DE MOTOR USANDO LA COMUNICACIÓN
SERIAL
int entrada = 0;
int pinMotor = 9;

void setup() {
// inicializar puerto serie
Serial.begin(9600);
// preparar salida digital
pinMode(pinMotor, OUTPUT);
}

void loop() {
// leer dato si disponible
if(Serial.available()){
entrada = Serial.read();
// escribir en el pin
analogWrite(pinMotor, entrada);
}
}
LED DIMMER
 int ledPin = 9;
void setup() {
//Hace Nada
}
void loop() {
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
analogWrite(ledPin, fadeValue);
delay(30);
}
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
analogWrite(ledPin, fadeValue);
delay(30);
}
}
PRÁCTICO:

 Realizar el ejercicio anterior Led Dimmer, utilizando un


potenciometro o un fotoresistor para controlar la intensidad de
la luz de un LED.
SERVOMOTORES
 Dispositivo similar a un motor
DC que tiene la capacidad de
ubicarse en cualquier posición
dentro de su rango de operación, y
mantenerse estable en dicha
posición.
 Uso de liberia <Servo.h>
#include <Servo.h>

Ejemplo Servo servoMain;

void setup() {
de Control de un servoMain.attach(10);

Servo Motor }

void loop() {

servoMain.write(45);

delay(1000);

servoMain.write(0);

delay(1000);

servoMain.write(90);

delay(1000);

servoMain.write(135);

delay(1000);

servoMain.write(180);

delay(1000);

servoMain.write(90);

delay(1000);

}
#include <Servo.h>
Servo myservo; // crear un objeto
// un maximo de 8 objetos pueden ser instanciados
int pos = 0; // variable que almacena la posicion del servo
void setup()
{
myservo.attach(9);
}

void loop()
{
for(pos = 0; pos < 180; pos += 1) // de 0 grados a 180 grados, 1 grado a la vez
{
myservo.write(pos); // Moverse a la posicion indicada en pos
delay(15); // una espera de 15 ms
}
for(pos = 180; pos>=1; pos-=1) //de 180 grados a 0 grados
{
myservo.write(pos); // Moverse a la posicion indicada en pos
delay(15); // una espera de 15 ms
}
}
SEMANA SEIS
PING (SENSOR ULTRASÓNICO)
 El Ping es un medidor de distancias por ultrasonidos. Funciona
enviando una ráfaga de ultrasonido y esperando a escuchar el eco que
se produce cuando esta rebota con el objeto y en función de ese
tiempo se obtiene la distancia.
ULTRASÓNICO ( 5 PINES)

Pin 5 Pin 1

 Lo que hay que hacer es mandar un señal de arranque en el pin 3 del


SRF04 y después leer la anchura del impulso que nos proporciona en el
pin 2. El pulso de disparo tiene que tener una anchura mínima de 10 uS.
 Hay que dejar un retardo de 10 ms desde que se hace una lectura hasta
que se realiza la siguiente, con el fin de que el circuito se estabilice.
ULTRASONICO (3 PINES)

Pin 1: tierra
Pin 2: Vcc (5v)
Pin3: Señal de ultrasonido
 Emite y recibe la señal.
 Se activa con un pulso de 2 o mas Microsegundos
CONEXIÓN FÍSICA
CONVERSIONES:

 La compañía Parallax nos provee la siguiente información:


 Tenemos 74 Microsegundos por pulgada.
 Tenemos 29 Microsegundos por centímetro.
PING 3 PINES
//Paso4: Hacer las conversiones
pulgadas= microsecondsToInches(tduracion);
const int pingPin = 7; cm = microsecondsToCentimeters(tduracion);
void setup() {
Serial.begin(9600); Serial.print(pulgadas);
} Serial.print("in, ");
Serial.print(cm);
void loop() Serial.print("cm");
{ Serial.println();

long tduracion, pulgadas, cm; delay(100);


//Paso1: Asegurar pulso limpio }
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW); long microsecondsToInches(long microseconds){
delayMicroseconds(2); return (microseconds / 74) / 2;
}
//Paso2:Emitir el Pulso
digitalWrite(pingPin, HIGH);
delayMicroseconds(5); long microsecondsToCentimeters(long microseconds){
digitalWrite(pingPin, LOW); return (microseconds / 29) / 2;
//Paso3: Modificar el Pin y capturar dato }
pinMode(pingPin, INPUT);
tduracion = pulseIn(pingPin, HIGH);

pulseIn: devuelve el tiempo(micros) en el que permanece activo el estado asignado.


PING 5 PINES
void loop(){
long duracion, cm, in;
//Paso 1: Emitir Pulso
void setup(){ digitalWrite(8,LOW);
delayMicroseconds(2);
Serial.begin(9600); digitalWrite(8,HIGH);
pinMode(8,OUTPUT); delayMicroseconds(10);
digitalWrite(pin,LOW);
pinMode(7,INPUT);
} //Paso 2: Recibir la senal
duracion=pulseIn(7,HIGH); // en
microsegundos
long conversioncms(long //Paso 3: conversion de las unidades de
msegundos){ segundos a cms/in
return (msegundos/29)/2;} cm=conversioncms(duracion);
in=conversionin(duracion);
Serial.print(cm);
long conversionin(long msegundos){ Serial.print("cms");
Serial.print(in);
return (msegundos/74)/2; Serial.println("in");
} }
SENSOR INFRARROJO
 Sharp es un sensor análogo de larga distancia Sharp, con un alcance de detección de
20cm a 150cm. La salida análoga varia de 2.8V en 20cm a 0.4V en 150cm, con un voltaje
de alimentación entre 4.5 y 5.5 VDC.
 La distancia se indica mediante una señal analógica, por lo que este sensor es muy fácil
de usar. Es un gran sensor para detectar objetos a una distancia de hasta 150cm.
Utilizar la funcion analogRead()

 Características:
Voltaje de alimentación 4.5 a 5.5 VCC
Temperatura de operación -10 a 60°C
Rango mínimo de medida: 20cm
Rango máximo de medida: 150cm
Consume 33mA
EJEMPLO
int sensorPin = 0; //pin analogico 0
int varSensor = 0;

void setup(){
Serial.begin(9600);
}

void loop(){
varSensor = analogRead(sensorPin);
Serial.print("Sensor indica: ");
Serial.print(varSensor);

delay(1000);
}
PRÁCTICO
 Utilizar un sensor infrarrojo para medir la distancia entre tres rangos
distintos:
0-100 : Encender Led Rojo e imprimir “Distancia 1”
101 -250 : Encender Led Amarillo e imprimir “Distancia 2”
251 – 400: Encender Led Verde e imprimir “Distancia 3”
EEPROM:
 El microcontrolador tiene una memoria EEPROM de 512 bytes, cuyos
datos son guardados cuando se apaga el microcontrolador.
Debemos importar la libreria a nuestro proyecto:
#include <EEPROM.h>
Funciones:
 EEPROM.write(posicionMemoria, valor a guardar)
 EEPROM.read(posicion en Memoria) // se debe asignar a una
variable
PRÁCTICO
 Almacenar 10 valores en un rango de 0 – 100 en la memoria
EEPROM. Luego evaluar cada uno de esos valores y si se encuentra
en el rango de 0-50 encender un LED Rojo y en el rango de 51-
100 encender un LED Amarillo.
FIN DEL CURSO 

You might also like