Está en la página 1de 106

Un

paseo por la tecnología


El objetivo de esta presentación es mostrar las posibilidades de uso de la
plataforma Arduino para acercar la tecnología en niveles de secundaria

• Arduino: HW base para el desarrollo


• IDE Arduino : SW de la plataforma
• Entornos Programación Gráfica basados en bloques
• Scratch,Ardublock, Miniblock,MindPlus
• Herramientas y extensiones:
• RaspberryPi/Python
• Processing
• Fritzing
• Android
Arduino es una compañía
opensource sin animo de lucro
nacida en la educación para ofrecer
una plataforma compuesta por:
•  Hardware
•  IDE (Interfaz de Desarrollo)
•  Concepto Opensource
•  Esquemas HW
•  Librerias
•  Comunidad
Arduino Permite interaccionar con el Modulos:
mundo físico a través de multitud de • Sensores : Salida Analógica y digital
módulos sin necesidad de tener • Botones
conocimientos de electrónica • Leds
• Reles
• Motores : continuos/servos/paso
Arduino es un microcontrolador
independiente , NO hace falta que Seleccionar
pines

esté conectado a un PC para


desarrollar su cometido

Una vez desarrollado el algoritmo se


convierte y envía a la placa que sólo
actuar
IDE Inicializar
Valores

necesitará alimentación
El Firmawe ejecutará una pequeña
inicialización y luego un bucle Leer
Valores
continuo de lectura de valores y
envío de salidas digitales por los
pines.
Filosofía uso de montajes con Arduino
Una de las características que hace
tan potente el desarrollo con
Arduino es la existencia de
centenares de modulos que están
preparados para ser conectados
directamente a arduino y realizan
funciones especificas.

Normalmente los sensores


devuelven valores analógicos entre
0-5v en 1024 valores diferentes
Los módulos I2c permiten un
protocolo de transmisión de datos
más alto nivel
Los actuadores (servos, motores,
relays, etc…) reciben valores de
pulsos PWM o +5v
La mayor parte de los módulos se
pueden manejar con entradas y
salidas digitales simples
Sin embargo, las librerías permiten
simplificar el uso de modulos
complejos como:
- Lcds ,displays, keypad
- Relojes en tiempo real
- Dispositivos I2C
- Acelerómetros
- Motores
- Tarjetas de proximidad
- Comunicación inalámbrica
- Tarjeta SD, GPS
Lectura botón sin librería
Lectura botón con librería
#include<LCDKeypad.h>
intread_LCD_buttons(){!
adc_key_in = analogRead(0); ! LCDKeypadlcd;
if (adc_key_in< 50) returnbtnRIGHT; IntbuttonPressed=lcd.button());!
if (adc_key_in< 250) returnbtnUP;
if (adc_key_in< 450) returnbtnDOWN;
if (adc_key_in< 650) returnbtnLEFT
if (adc_key_in< 850) returnbtnSELECT;
returnbtnNONE;
}!
El hardware en china está mucho mas barato.
Es posible comprar en Ebay con garantia de paypal, pero hay ciertas tiendas
con comportamiento demostrado de fiabilidad que facilitan la busqueda de
componentes, CASI en todas ellas se paga con paypal. De más barata a
menos
Aliexpress ( No Paypal, tiempos de entrega 30-60 días)
buyincoins.com
Fasttech
Bangood.com
dx.com
Bangood y Dx tienen el mayor surtido y DX tienen numerosos comentarios de
los usuarios que ayudan a la hora de usar el componente.
Para proyectos comerciales hace falta factura , eBay tiene tiendas en España
con precios al doble-triple de los mencionados.
Bangood
Mega2560 R3 ATmega2560- €10.55
Arduino-Uno Board €6.53
Smart Robot Car Chassis €7.53
37 In 1 Sensor Module Kit €31.91
NRF24L01 2.4GHz Wireless €1.42
5V 2 Channel Relay €2.10
Mini PIR Motion €1.43
TowerPro SG90 Mini Gear servo €2.11
Arduino Compatible SD Card €1.22
TDS1307 Real Time Clock €1.53
5 Channel Tracking Sensor €3.92
Motor Drive Shield L293D €3.16
Keypad Shield Blue €3.76
Scratch es un lenguaje gráfico
desarrollado por el Mit para iniciar a
los niños y adolescentes a la
prógramación.
Scratch permite interacciónes
gráficas y la versión para Arduino
(S4A leidoScracthfor Arduino)
incluye la interacción simple con
éste
Permite iniciar el uso de Arduino sin
ningún conocimiento de
programación
Grupos
controles

arrastrar
Arduino tiene cargado un Firmware disponible en la web de S4a que lee
continuamente el puerto serie e interpreta que debe hacer.

Basicamente tiene ordenes del tipo “dime que hay en el pin XX” y “escribe
en el pin yy”.

Limitaciones: No es posible por defecto utilizar las librerias de módulos


complejos o utilizar todos los pines de arduino , ya que S4a tiene
predeterminado que algunos son de lectura , otros de servo, y otros
digitales.
Con un poco de ayuda (hay mucha información en su web) es posible
preparar arduino con las librerias que hagan falta.
• Arduino corre independientemente •  Conexión por cable o bluetooth
una vez separado del PC continua
• Comunicación independiente • S4A permite la comunicación entre
compleja arduinos a traves del PC
• Arduino permite usar librerias y pines •  en S4A hay que tocar el
indistintamente firmwarearduino y de S4A para
• Compilar y enviar librerias y pines
• Resultados interactivos
http://www.opiron.com/portfolio/tutorial-sobre-ardublock
http://www.opiron.com/portfolio/tutorial-sobre-ardublock
- Raspberry : ordenador con linuxdebian con capacidades de GPIO de muy
bajo consumo capaz de correr la mayor parte de las herramientas de
desarrollo . Cuenta con librerías de tratamiento de imagen Opencv .
Habitualmente son el cerebro en las aplicaciones de domótica/robótica y
de Internet de las cosas.
- Processing: Sistema gráfico portable para hacer aplicaciones en pc usando
arduino como adquisiócin de datos
- Fritzing: permite la esquematización de montajes de manera gráfica
- Android: se usa habitualmente con apps que usan bluetooth para manejar
Arduino a distancia y recibir información.
-  ! appInventor: Permite con un interfaz similar a Scracth y
Ardublock generar aplicaciones simples para Android
http://blog.minibloq.org
Abrir/guardar Ver Mon
Enviar a Arduino
Ver Mon
Dado que el arduino maneja 5 volts y para encender el LED
necesitamos entre 5 y 20 mA (miliamperes) necesitamos
conectar una resistencia ya que de lo contrario
quemaríamos el LED.
Según la ley de ohm V= I * R
La diferencia de potencial ( leds rojos) es 2 volts.
Entonces:
R = V/I R=5v- 2v /15mA R= 3 v /0.015 A

R= 200 ohms
El Lenguaje Usado está basado en C, Int led = 13;
genera ficheros con extensión (.ino) : voidsetup() {
pinMode(led, OUTPUT);
}
voidloop() {
digitalWrite(led, HIGH)
delay(1000);
digitalWrite(led, LOW);
delay(1000);
}

Instrucciones:
int variable = valor;
pinMode(pin,OUTPUT/INPUT);
digitalWrite(numero, HIGH/LOW);
delay (milisegundos);
El uso de delay() impide hacer acciones paralelas mientras esta instrucción está
activa. (verdad a medias ---- ya veremos las interrupciones ….).

long currentMillis = millis();


Int interval=0

if (currentMillis - previousMillis >= interval

previousMillis = currentMillis;

Instrucciones:

Millis (milisegundos) : tiempo desde


que se encendió la placa Arduino.
Instrucciones:
int variable = valor; // estado del boton

pinMode(pin,OUTPUT/INPUT); // de entrada ! el boton


// de salida ! el led
digitalWrite(numero, HIGH/LOW); // ! Encender /apagar led
variable=digitalRead(pin) // leer estado botón !
delay (milisegundos);

Control

If (Condicion) ! Acción
Constantes
Niveles Lógicos
false: se define como 0 (cero).
true: es cualquier número distinto que 0 (normalmente 1)
Niveles de Voltaje
HIGH: 5[V] en una salida y mayor que 3[V] en una entrada.
LOW: 0[V] en una salida y menor que 2[V] en una entrada.
Tipos de Datos

boolean : True/False ! a= True


char : [-127, 128] ! char dato = ‘A’;char dato = 65;
byte : [0,255] ! byte b = B10010 ; byte = 200;
int: [-32768, 32767] !int valorInt =23456;
long: [-231,231] ! long valor = 2345678;
float: [-3.438,3.438] !float valorSensor = 4.7657;
arrays : int pinPWM[] = {3, 5, 6, 9, 10, 11};
char mensaje[] = “El dato llego”;
x++ ; // aumenta x en uno
x--; // disminuye n uno
x += y; // equivalente a la expresión x = x + y;
x -= y; // equivalente a la expresión x = x - y;
x *= y; // equivalente a la expresión x = x * y;
x /= y; // equivalente a la expresión x = x / y;
OPERADORES LÓGICOS

TRUE && TRUE ! TRUE AND


TRUE && FALSE ! FALSE
TRUE || FALSE ! TRUE OR
!TRUE ! FALSE NOT

!TRUE || FALSE ! FALSE NO VERDAD O FALSO


Arduino tiene una resistencia interna que se puede activar, haciendo el
circuito del interruptor más simple : pinMode(2,INPUT_PULLUP);
Realizar dos montajes, uno que realice el efecto del coche fantastico y otro
que realice varias secuencias de flash y recorridos por los leds.
Funciones

int delayVal()
{
int v; // crea una variable temporal 'v'
v= analogRead(pot); // lee el valor del potenciómetro
v /= 4; // convierte 0-1023 a 0-255
return v; // devuelve el valor final
}
1º: Todos encendidos , todos apagados, alternativos (el multi blink!)
2º : Recorre hacia arriba encendiendo y hacia abajo apagando los leds con un retraso entre cada acción de 200 ms
3º: haz 5 veces:
encender hacia arriba y apagar desde abajo
4º : empieza desde el centro y enciende en paralelo hacia afuera volviendo al centro apagandolo
5º : haz el coche fantastico ☺

El concepto de la subrutina.
a-Mete todo el código en diferentes subrutinas y llama a la serie completa 1,2,3,4,5
b-Pon un parámetro a la subrutina para determinar la velocidad de una de las series y escribe un loop
donde se hace dicha subrutina cada vez mas rápido.
c-Por ejemplo empezar con retrasos de 300 ms y llegar a retrasos de 30 ms y volver a empezar.
void loop()
{
int x = 1;
for (int i = 0; i > -1; i = i + x){
analogWrite(PWMpin, i);
if (i = 255) x = -1;
delay(10);
}
}
setup(){
Int pot=3;
pinMode(pot, INPUT);
loop(){
delay(leePotenciometroYloDevuelveDivididoPor4(());
}
int leePotenciometroYloDevuelveDivididoPor4(){
int v; // crea una variable local v
v= analogRead(pot); // lee el valor del potenciómetro, pot es global
v /= 4; // convierte 0-1023 a 0-255
return v; // devuelve el valor final
}
setup(){
Int pot=3;
pinMode(pot, INPUT);
loop(){
delay(leePotenciometroYloDevuelveDivididoPorX(4)); // espera según lo que lea en
pin 3 partido por lo que diga el parámetro, en este caso 4
}
int leePotenciometroYloDevuelveDivididoPorX(int divisor)
{
int v; // crea una variable local v
v= analogRead(pot); //usa variable global pot
v = v/divisor; // divide por el valor enviado por parámetro
return v; // devuelve el valor final
}
Sintaxis
while (expresion){
// sentencia(s)
}

Ejemplo

Int var = 0;
while (var < 200){ do
// haz algo {
var++; delay(50);
} x = readSensors();
} while (x < 100);
Instrucciones:
int variable = valor; // estado del POTENCIOMETRO 0-1023
// valor de parpadeo
Int pin = A3 // constante de pin analógico!!!!!!!

pinMode(pin,OUTPUT/INPUT); // de entrada ! el potenciometro


// de salida ! el led
digitalWrite(numero, HIGH/LOW); // ! Encender /apagar led
Variable=analogRead(pin) // leer estado botón !
delay (milisegundos);

Control

If (Condicion) ! Acción

Conversión

val = map(val, 0, 1023, 0, 255);


Porque son necesarios?:

Muchos sensores son resistencias que varían de acuerdo a


ciertas magnitudes que toman del mundo real: luz, ruido,
fuerza, etc.
Para un microcontrolador, como Arduino, es mucho más
sencillo medir voltajes, -> Agregando otra resistencia fija,
formando así un divisor de voltaje.
A medida que la resistencia variable cambia su valor, la el valor
Vout irá variando, permitiendo al microcontrolador, establecer
lecturas en base al voltaje recibido.
Porque son necesarios?:

Muchos sensores son resistencias que varían de


acuerdo a ciertas magnitudes que toman del
mundo real: luz, ruido, fuerza, etc.
Para un microcontrolador, como Arduino, es
mucho más sencillo medir voltajes, -> Agregando
otra resistencia fija, formando así un divisor de
voltaje.
A medida que la resistencia variable cambia su
valor, la el valor Vout irá variando, permitiendo al
microcontrolador, establecer lecturas en base al
voltaje recibido.
Se desea utilizar la fotoresistencia para medir la luz ambiente. En ausencia de
luz, tiene una resistencia de 1[MΩ ] y con luz ambiente (aprox 10[lux]), 50[KΩ ].
Encontrar el rango de valores que serán leídos por la placa
Se desea utilizar la fotoresistencia para medir la luz ambiente. En ausencia de
luz, tiene una resistencia de 1[MΩ ] y con luz ambiente (aprox 10[lux]), 50[KΩ ].
Encontrar el rango de valores que serán leídos por la placa
Los sensores no son ideales, tienen errores en la medida:
•  De escala (Min,max) : Calibración
•  durante un periodo inicial se guardan los valores más pequeños y
más altos dados por el sensor
•  De inexactitud : Averaging (Suavizado o Smoothing),
• Se guardan en un array los n últimos valores y se trabaja con la
media
int sensorMin = 1023;
int sensorMax = 0;
while (millis() < 5000) {
sensorValue = analogRead(sensorPin)
if (sensorValue > sensorMax) {
sensorMax = sensorValue; }
if (sensorValue < sensorMin) {
sensorMin = sensorValue; }
}
int numLecturas = 10;
Int lecturas[numLecturas];
int readIndex = 0;
int total = 0;
int media = 0;
Int inputPin = A0;

void setup() {
for (int estaLectura = 0; estaLectura < numLecturas; estaLectura++) {
lecturas[estaLectura] = 0; }
}
void loop() {
total = total - Lecturas[readIndex];
lecturas[readIndex] = analogRead(inputPin);
total += Lecturas[readIndex];
readIndex += 1;
if (readIndex >= numLecturas) readIndex = 0;
media = total / numLecturas;
delay(1);
}
switch (var) {
case 1:
//hacer algo cuando sea igual a 1
break;
case 2:
//hacer algo cuando sea igual a 2
break;
default:
// si nada coincide, ejecuta el "default"
// el "default" es opcional
}
- Modificar el programa anterior para que muestre por el monitor
serie los valores leidos en el pin analógico

- Modificar el programa anterior para variar la duración del led


según un valor introducido por el monitor serie usando switch

-  Avanzado : https://www.arduino.cc/en/Tutorial/SerialEvent
- Cuando se produce un evento serie se ejecuta el código
Sólo algunos pines digitales tienen PWM

analogWrite(pin, valor);
En un led : Brillo variable
En un servo: Ángulo de giro
A- Crear un script que vaya desde 0 a 255 y de nuevo a cero en PWM sobre un led
Un servo es un motor con un interfaz digital que permite ángulos precisos
mediante PWM.
Se quiere mover un servo a distintas posiciones según el potenciometro
marque más o menos resistencia
Librería servo

Uso de una librería:

#include <Servo.h>
Servo myservo;
void setup() {
myservo.attach(9);
myservo.write(90); //servo.read() devuleve el último valor pasado a write
}
void loop() {}
Medir la distrancia mediante un sensor SR04 Ultrasonic Sensor:
Verde: Via libre (> distancia) Rojo : Obstáculo cerca
Poner distancia en Serial.println()

pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Medir la distrancia mediante un sensor SR04 Ultrasonic Sensor:

digitalWrite(TrigPin, LOW)
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);

cm = pulseIn(EchoPin, HIGH) / 58.0; //conversión en cm


cm = (int(cm * 100.0)) / 100.0; //dos decimales
1- Modifica el ejemplo anterior para incluir un pitido cuando se enciende el
led Rojo:
tone(pin, frequency)
tone(pin, frequency, duration)
noTone()

2- Haz un Arpa sonica!

(probad valores para ver los tonos)

map(value, fromLow, fromHigh, toLow, toHigh)


Mostrar por el puerto serie la temperatura y humedad. Si se quiere ser “pro”,
realizar suavizado de la medida.
Incluir la librería , copiando el archivo desde : http://bit.ly/1Mhs9sd
en arduino/libraries (en Windows en Archivos de programa), si no existe el
directorio , crearlo.

En el código:

#include "DHT.h”

float h = dht.readHumidity();
float t = dht.readTemperature();
Incluir la librería , copiando el archivo desde : http://bit.ly/1U0fQZH
en arduino/libraries (en Windows en Archivos de programa), si no existe el
directorio , crearlo. Mostrar hora real en puerto serie. Investiga otras
funciones y utiliza el reloj para mostrar una alarma en un led a las en punto.

En el código:

#include <DS1307RTC.h>
#include <Time.h> void print2digits(int number) {
#include <Wire.h> if (number >= 0 && number < 10) {
Serial.write('0');
if (RTC.read(tm)) { }
print2digits(tm.Hour); Serial.print(number);
print2digits(tm.Minute);; }
print2digits(tm.Second);
Serial.print(tm.Day);
Serial.print(tm.Month);
Serial.print(tmYearToCalendar(tm.Year));
}
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(57600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}

Serial.println("Goodnight moon!");

// set the data rate for the SoftwareSerial port


mySerial.begin(4800);
mySerial.println("Hello, world?");
}
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(57600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}

Serial.println("Goodnight moon!");

// set the data rate for the SoftwareSerial port


mySerial.begin(4800);
mySerial.println("Hello, world?");
}

También podría gustarte