Vous êtes sur la page 1sur 38

18/05/2017

1
18/05/2017

TALLER 17TO57ES003 (18 y 25/5/17) 8h


Robtica i programaci en
Arduino
http://webs.ono.com/matoleot/arduino2

Marcos Toms Leirs Otero

2
18/05/2017

ndice de Contenidos

1. Introduccin al mundo de Arduino

2. Desmenuzando Arduino

3. Programacin y simulacin

4. Prcticas reales mediante C

5. Ejemplos empleando un coche/robot

3
18/05/2017

1. Introduccin al mundo de Arduino.

VS

Aplicaciones

4
18/05/2017

IoT

2. Desmenuzando Arduino
Arduino Uno
16 Mhz, Flash 32 KB, SRam 2KB, EEPROM 1KB, Rango tensin 7/12V. BootLoader 05 KB. ICSP.
14 IO Digitales (De las cuales: 6 PWM, 2 Serie, 2 Interrupciones, 4 SPI), 6 In Analgicas (2 I2C).

5
18/05/2017

BUSES
SPI Serial Peripheral
Interface

I2C Inter-Integrated
Circuit

6
18/05/2017

Arduino Nano
Caractersticas similares al Arduino Uno, pero diminuto, ideal para empotrar.

Arduino Mega (Y DUE) 2560


16 Mhz, Flash 256KB, Sram 8KB, EEPROM 4KB, Rango tensin 6/20V. BootLoader 8 KB. ICSP.
54 IO Digitales (De las cuales: 15 PWM, 4 Serie, 6 Interrupciones, 4 SPI, 2 I2C), 16 In Analgicas.

7
18/05/2017

Arduino Atiny85
Tan solo 6 I/Os, 2 de ellas admiten PWM y 3 analgicas. 8Kb de memoria de
programa Flash. 512 bytes de EEPROM. 512 bytes de SRAM. 20Mhz usando un cristal
externo

Arduino 101 Ind. y Nano Wi-Fi

8
18/05/2017

CLONES: http://www.pinguino.cc/

Clon con
Microcontrolador
PIC de Microchip Inc.

9
18/05/2017

Escudos (Shield)

LCD

Entrenador

EtherNet

GamePad

10
18/05/2017

Sensores
Ana./Dig.
Humedad
Choque
Ultrasonidos
Color
Presencia/Mov.
Giroscopio
Temperatura
Tensin
Intensidad
Luz
RFID
Acstico
Lluvia
Calidad del Aire
Tctil
Proximidad
IR

Actuadores
Controladoras
de motores

Rels

Motor DC

11
18/05/2017

Servo

Controladora mini de
motores DC
Paso a paso (Stepper)

Reloj
Mdulos BlueTooth

Mando IR

Wi-Fi

Amplificador

12
18/05/2017

GSM RF 433 Mhz

RF 2400 Mhz Matriz Led

Lector/Grabador SD Mp3

Cmara

Teclado

13
18/05/2017

Conexiones de las IOs


CONEXIN E INSTALACIN DE LOS SENSORES Y ACTUADORES

Resistencias pull-up, pull-down , limitadoras y entradas analgicas.

pinMode(pin, INPUT) // activa las resistencias internas,


// configurando el pin como entrada
digitalWrite(pin, HIGH); // Pone el pin a 1 (pull-up)

14
18/05/2017

CONEXIN SENSOR IR (TCRT5000 Y CNY-70)

CONEXIN ULTRASNICO (HC-SR04)

TRIG (OUT) ECHO (IN)

15
18/05/2017

CONEXIN CONTROLADORA DE MOTORES (L298N)

CONEXIN SERVO MOTOR (FUTABA S3003)

16
18/05/2017

EN NUESTRO CASO, PIEZAS DEL COCHE/ROBOT ARDUINO ESCOGIDO PARA EL TALLER

Y DEBEMOS CONSEGUIR ESTO

17
18/05/2017

CABLEADO DE LA ALIMENTACIN DC A 6V

CONEXIONES REALES DE LA ALIMENTACIN

18
18/05/2017

AHORA LA SEAL DE LOS SENSORES

CABLEADO DE LA CONTROLADORA DE MOTORES

19
18/05/2017

3. Programacin y Simulacin
Scratch S4A http://s4a.cat/index_es.html

Por puerto ICSP (Ideal para quemarel BootLoader)


(In-Circuit Serial Programming)

20
18/05/2017

Programacin mediante C.
https://www.arduino.cc/ (V. Actual IDE 1.8.2)
PARTES DE UN
PROGRAMA

Comentarios
Libreras
Constantes
Variables globales
Funciones

Configuracin{

Bucle main{

Programa
HolaMundo.ino

Arduino WEB Editor (https://create.arduino.cc/editor)

21
18/05/2017

Simulaciones online
123d.circuits.io (https://circuits.io/)

*** Protoboard ***

Tambin existe http://fritzing.org/home/ (no simula)

EJEMPLOS: COMENTARIOS, CONSTANTES, VARIABLES E INSERCCIN DE LIBRERAS

/* Comentarios de int v;
varias int v=5;
lneas
*/ char ch; // x
char * msg; // xx
// Comentario de una lnea
float distancia;
float distancia=0.0;
#define SF 2 boolean toggle=false;
const int SF=2; long F;
long F1, F2;
#include<Servo.h> long F=0x00FFA25D // 64 bits en hex

double x;
char str1[3]={a,b,c}; // \0
char str2[]=arduino; static double x=0;
unsigned int;
char * strs[]={uno,dos} ; volatile int cnt=0; // usado en interrupciones

22
18/05/2017

EJEMPLOS: EL BLOQUE SETUP ()

pinMode(npin, OUTPUT|INPUT); // cfg pin

// Ejemplo
pinMode(2, OUTPUT);
pinMode(variable, INPUT); // admite variable

digitalWrite(npin, HIGH|LOW); // escribe en pin

// Ejemplos
digitalWrite(2, HIGH);
digitalWrite(2, 0); // admite 0|1
digitalWrite(variable, 1); // admite variable
digitalWrite(variable, LOW);

/* Falta hablar de funciones de libreras especficas


que se usan mucho en este bloque, como la del
puerto serie, control de servos, control de mandos IR,
gestin de buses etc. */

EJEMPLOS: FUNCIONES HABITUALES


digitalWrite(npin, HIGH|LOW); // escribe en pin digital (ya visto)

analogWrite(npin, [0-254]); // escribe en un puerto PWM

// Ejemplos
analogWrite(npin, 0); // mnimo
analogWrite(npin, 254); // mximo
analogWrite(npin, variable); // admite variable

var = analogRead(npinAx ); // lee puerto analgico Ax, rango [0-1023]

delay (1000); // pausa en ms, un segundo en este caso


delay(variable * 100); // admite variable, es habitual un factor multiplicador
delayMicroseconds(5); // pausa en s, ideal para pequeos retardos

pulseIn(npin,HIGH); // o LOW, retorna longitud del pulso o 0

toggle!=toggle; // invierte el estado lgico

etiqueta: // admite salto


goto etiqueta;

23
18/05/2017

SENTENCIAS DE CONTROL (admiten break y continue)

if (condicion1){ while (1)


----- -----
----- -----
} else if (condicion2){ }
-----
----- do{
}else{ -----
----- -----
----- }while(condicion)
}
switch (var)
for (int i=0; i<8; i++){ case 1: ----- break;
----- case 2: ----- break;
----- default: ----- break;
} }

PROCEDIMIENTOS Y FUNCIONES

void miprocedimiento(int a, int b){


-----
-----
}

int mifuncion(int c){


int r=c+5;
return r;
}

24
18/05/2017

EJEMPLO : CONTROL IOs DIGITALES


// Control IO Digital

#define SLI 7 // Asigna pin a un sensor


const int LED=13; // Asigna pin a un Led

int sensorI; // Crea variable para la lectura

void setup() {
pinMode(SLI, INPUT); // Configuracion pin SENSOR como entrada
pinMode(LED, OUTPUT); // Led13 como salida
}

void loop(){
sensorI=digitalRead(SLI); // lee sensor

if(!sensorI){ // Si ha ledo sensor (lgica negativa)


digitalWrite(LED,HIGH); // Enciende LED 13 interno
}else{
digitalWrite(LED,LOW); // Apaga LED 13 interno
}
}

EJEMPLO: MANEJO DE CADENAS Y DE LA CONSOLA SERIE


char inChar; String string=""; // OJO String con la S en mayscula

//Configuracion de puerto serial y reserva variable string


void setup() {
Serial.begin(9600);
string.reserve(200); // Para concatenar usar string.concat(parametro);
}

void loop(){
if (Serial.available()){
inChar = Serial.read();
string+=inChar;

//Imprime la variable con los caracteres acumulados hasta la ","


if (inChar==','){
Serial.print("Lectura: "); // admite Serial.print(variable, HEX)
Serial.println(string);
string="";
}
}
}

NOTA: Serial.println(results.value, HEX); // Se puede ver en HEX, muy usado en mandos IR

25
18/05/2017

EJEMPLO: CONTROL ENTRADAS ANALGICAS


const int sensorPin = A5; // sensor
int sensorValue; // variable [0- 1023]

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

void loop() {
sensorValue = analogRead(sensorPin); // realizar la lectura

//mandar mensaje a puerto serie en funcin del valor leido


if (sensorValue > 255) { // 1024/4
Serial.print(sensorValue);
Serial.println(" - Mayor que 1,25V"); // 5v/4
}
else {
Serial.print(sensorValue);
Serial.println(" - Menor que 1,25V");
}
delay(1000);
}

// NOTAS: value = fmap(sensorValue, 0, 1023, 0.0, 5.0); // cambia escala

analogReference(DEFAULT|INTERNAL|INTERNAL1V1|INTERNAL2V56|EXTERNAL);

EJEMPLO: EL SENSOR ULTRASNICO HC-SR04 (DE DISTANCIA)

#define SF_TRIG A4 // Definimos los pines del sensor ultrasnico HC-SR04


#define SF_ECO A5
long duracion_SF, distancia_SF; // Variables para la distancia

void setup() {
Serial.begin(9600); // Para mostrar respuesta en la consola serie
pinMode(SF_TRIG, OUTPUT); // Configuracion de los pines SENSOR distancia
pinMode(SF_ECO, INPUT);
} // Fin de setup

void loop(){
digitalWrite(SF_TRIG, LOW); // Medida de distancia sensor SF
delayMicroseconds(2);
digitalWrite(SF_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(SF_TRIG, LOW);
duracion_SF = pulseIn(SF_ECO, HIGH);
distancia_SF = (duracion_SF/2) / 29;
Serial.print(distancia_SF); // Imprimo distancia
Serial.println("cm SF");
delay(500); // Espero para nueva medida
} // Fin loop

26
18/05/2017

EJEMPLO: CONTROL DE MOTORES DC (L298N)


const int MDF = 6; // IN2 Mot. Derecho Forward.
const int MDB = 5; // IN1 Mot. Derecho Back.
const int MIF = 11; // IN4 Mot. Izquierdo Forward.
const int MIB = 10; // IN3 Mot. Izqquirdo Back.

// Declaramos la variable de velocidad motores


int vvel = 190; // Velocidad por defecto

void setup() {
pinMode(MIF, OUTPUT); // Configuracin de los pines MOTORES como salidas
pinMode(MIB, OUTPUT);
pinMode(MDF, OUTPUT);
pinMode(MDB, OUTPUT);
}// Fin de setup

void loop(){
//adelante
analogWrite(MIB,0);
analogWrite(MDB,0);
analogWrite(MIF,vvel);
analogWrite(MDF,vvel);
delay(2000);

//derecha_tanque
//atrs analogWrite(MIB, 0);
analogWrite(MIF, 0); analogWrite(MDF, 0);
analogWrite(MDF, 0); analogWrite(MIF, vvel);
analogWrite(MIB, vvel); analogWrite(MDB, vvel);
analogWrite(MDB, vvel); delay(1000);
delay(2000);
//parar
//izquierda_tanque analogWrite(MIB,0);
analogWrite(MIF, 0); analogWrite(MDB,0);
analogWrite(MDB, 0); analogWrite(MIF,0);
analogWrite(MIB, vvel); analogWrite(MDF,0);
analogWrite(MDF, vvel);
delay(1000); } // Fin de loop

27
18/05/2017

EJEMPLO: NMEROS ALEATORIOS (*)


long randNumber;
int i=0;

void setup(){
Serial.begin(9600);
randomSeed(analogRead(A0));
}

void loop() {
if(i<7){
for (i=1;i<7;i++){
// Obtiene un random numero de 1 a 49
randNumber = random(1, 50);

Serial.print(randNumber); // Imprime La Primitiva


Serial.print(" ");
delay(50);
}
}
}

Ejemplo BT: Arduino BT RC Controller & BT Terminal

28
18/05/2017

EJEMPLO: Bluetooht
// OJO existe la librera #include <SoftwareSerial.h> para cualquier entrada.
char inChar;

void setup(){
Serial.begin(9600);
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
}

void loop(){
if (Serial.available()){
inChar = Serial.read();
Serial.println(inChar);

if (inChar=='e'){
digitalWrite(13, HIGH);
Serial.println("Enciendo LED ");
}else if(inChar=='a'){
digitalWrite(13, LOW);
Serial.println("Apago LED ");
}
}
}

MANEJO DE INTERRUPCIONES
Para la lectura de un dato en una entrada de un microcontrolador podemos emplear los
mtodos de Consulta de Estado (Pulling) o las Interrupciones.
(Los microprocesadores admiten tambin el DMA)

El DUE tambin admite HIGH.

attachInterrupt(nint, f_resp, mode); // activa ints


attachInterrupt(digitalPinToInterrupt(), f_resp, mode);

volatile int contadorG; // Si la , f_resp usa algn tipo de


variable global contador, se recomienda el uso de
volatile en la definicin para evitar problemas.

29
18/05/2017

EJEMPLO: INTERRUPCIONES (*)

const int LED=13;

void leyoSLI(){
digitalWrite(LED,HIGH); // Enciende LED 13
Serial.println("sensorI a: 0");
}
void leyoSLD(){
digitalWrite(LED,LOW); // Apaga LED 13 interno
Serial.println("sensorD a: 0");
}

void setup() {
attachInterrupt(0,leyoSLD,LOW); // Activa interrupcin y asigna funcin de respuesta
attachInterrupt(1,leyoSLI,LOW); // Activa interrupcin y asigna funcin de respuesta
// Con int's NO se requiere pinMode(SLI, INPUT)...
Serial.begin(9600);
pinMode(LED, OUTPUT); // Led13 como salida
}

void loop(){
while(1){
delay(1000); // Bucle infinito
}
} // Fin de loop

LIBRERAS (https://www.arduino.cc/en/pmwiki.php?n=Reference/Libraries)

#include <LCD.h>
#include <LiquidCrystal_I2C.h>

30
18/05/2017

Programacin EXTRA
EJEMPLO: CONTROL DE MOTORES SERVO (*)
#include <Servo.h>

Servo servomotor; // Crea objeto servo


int angulo=112; // ngulo por defecto, rango [0-180]
#define PINSERVO 9 // Guarda pin 9 PWM para servo

void setup() {
servomotor.attach(PINSERVO); // Asigna pin al motor servo
servomotor.write(angulo); // Situa motor en x
delay(1500);
}

void loop() {
angulo=47;
servomotor.write(angulo); // Situa motor en x
delay(1500);
angulo=112;
servomotor.write(angulo); // Situa motor en x
delay(1500);
angulo=177;
servomotor.write(angulo); // Situa motor en x
delay(1500);
angulo=112;
servomotor.write(angulo); // Situa motor en x
delay(1500);
}

NOTA: angulo=constrain(angulo,0,180); // Restringe el valor entre 0-180


posicion = map(posicion, 0, 1023, 0, 179); // Escala los valores

EJEMPLO MANDO IR (*)

// Ejemplo: Mando IR By: MaToLeOt (-_-)

#include <IRremote.h> // Carga librera

int RECV_PIN = 2;

IRrecv irrecv(RECV_PIN); // Crea objeto y asigna pin del sensor IR


decode_results results; // Asigna variable para la decodificacin

void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Inicia el receptor IR
}

void loop() {

if (irrecv.decode(&results)) {
Serial.println(results.value, HEX); // HEX opcional (si no DEC)
irrecv.resume(); // Se prepara para el prximo valor
}
delay(100);
}

31
18/05/2017

EJEMPLO MANDO IR CON INTERRUPCIN (*)


#include <IRremote.h> // Libreria para el mando IR
// Librera en: ...arduino/libraries/Arduino-IRremote-master/IRremote.h (Contributed libreras)

// Constantes a recibir en DEC


const long CERO = 16738455; // Constante a recibir al pulsar 0 en DEC
const long UNO = 16724175; // Constante a recibir al pulsar 1 en DEC

// MANDO IR EN LA I/O 2 POR INT


int RECV_PIN = 2; // Pin 2
IRrecv irrecv(RECV_PIN); // Asigna pin para el receptor IR y fija funcin respuesta
decode_results results; // Variable resultado de la decodificacin
long datorx=0; // A 0 nada recibido

// FUNCIONES /////////////////////
void mandoir(){
if (irrecv.decode(&results)) { //
Serial.println(results.value); // Vemos comando recibido. Admite (results.value, HEX)
datorx=results.value;
irrecv.resume(); // Espera siguiente valor
}
} // FIN FUNCIONES ////////////////

void setup() {
Serial.begin (9600); // Para analizar respuesta
irrecv.enableIRIn(); // Arranca receptor IR
// Activa interrupcin a funcin para el mando IR en el pin 2 (flanco subida)
attachInterrupt(digitalPinToInterrupt(2),mandoir,RISING);
}// Fin de setup

void loop(){
while(true){ // Bucle infinito
delay(1000);
}
} // Fin de loop

Modelos comerciales

32
18/05/2017

33
18/05/2017

Zowi (El robot de Clan)

Otto Build
Build You Own Robot in Two Hours!
http://www.instructables.com/id/Otto-Build-You-Own-Robot-in-Two-Hours/

34
18/05/2017

Maxibot
Gx386 Max
(Reformado)

35
18/05/2017

(-_-) Marcos Toms Leirs Otero (-_-)

Ejemplo real empleando un coche/robot


a) Modo esquiva objetos
b) Modo Sigue lneas

LO VEREMOS EN PRCTICAS !!!


DIY hacker makes a home made laser drone robot
https://www.youtube.com/watch?v=Dt6iREOLF-I

36
18/05/2017

// PRCTICAS (Mnimas)
NM1 Hola mundo (a b c d e)
NM2 Sensor digital IR (a b)
NM3 Entrada analgica (a b)
NM4 Sensor ultrasnico (a b)
NM5 Control motor DC (a b)
NM6 Esquiva objetos (a b)
NM7 Sigue lneas (a b)
NM8 Control remoto serie (a b)

// PRCTICAS (Ampliacin)
NA1 Motor Servo
NA2 Robot de Ivn
NA3 Esquiva objetos con 3 sensores
NA4 Teclado
NA5 Caja de Sensores y Actuadores
NA6 Mando IR
NA7 Arduino Nano
NA8 Arduino Mega
NA9 Mezclemos todo

37
18/05/2017

38

Vous aimerez peut-être aussi