Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Sesión 3 (Práctica)
• Sensores
• Actuadores
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Índice
1. Sensores a. Infrarrojos b. Ultrasonidos
2. Actuadores a. Servomotor b. Motores
3. Comunicación a. Infrarrojos (mando a distancia)
a. Control de actuadores
b. Bluetooth (AppInventor) a. Sensores adicionales
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Referencia
• Para dudas referentes a cómo usar una función o a qué funciones hay disponibles – http://arduino.cc/en/Reference/HomePage
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Sensores
• Infrarrojos – Tres módulos KY-033 – Emisor-Receptor de infrarrojos – Potenciómetro para sensibilidad del sensor
• Resistencia variable de Puente de Wheatstone
– Pines • Tierra (G) • Alimentación (V+) • Señal (S)
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Sensores
• Infrarrojos (Instalación y conexión) – No hay hoja de características en internet – Suelen ser sensores analógicos
• Conectamos los pines de señal del sensor a los pines A3, A4 y A5 de la Sensor Shield
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Infrarrojos Código Lecturas Analógicas
#include <SoftwareSerial.h>
#define IR_LEFT 3
#define IR_CENTER 4
#define IR_RIGHT 5
int L,C,R;
void setup() {
Serial.begin (57600);
}
void loop() {
//read the input
L = analogRead(IR_LEFT);
C = analogRead(IR_CENTER);
R = analogRead(IR_RIGHT);
//print the values
Serial.print (L);
Serial.print(",");
Serial.print (C);
Serial.print(",");
Serial.println (R);
}
Sensores
• ¿Qué lecturas tenemos en el terminal Serie?
• ¿Qué ocurre si ajustamos el potenciómetro?
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Infrarrojos Código Lecturas Digitales (cambiar pines a D9, D10 y D11)
#include <SoftwareSerial.h>
#define IR_LEFT 11
#define IR_CENTER 10
#define IR_RIGHT 9
int L,C,R;
void setup() {
Serial.begin (57600);
pinMode (IR_LEFT,INPUT);
pinMode (IR_CENTER,INPUT);
pinMode (IR_RIGHT,INPUT);
}
void loop() {
//read the input
L = digitalRead(IR_LEFT);
C = digitalRead(IR_CENTER);
R = digitalRead(IR_RIGHT);
//print the values
Serial.print (L);
Serial.print(",");
Serial.print (C);
Serial.print(",");
Serial.println (R);
}
Sensores
• ¿Qué tenemos que hacer para seguir una línea?
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Sensores
• Ultrasonidos – Sensor HC-SR04 – Cuatro pines
• Tierra (GND) • Alimentación (VCC) • Disparador o trigger (Trig) • Receptor (Echo)
– Especificaciones • Ángulo efectivo: 15º • Rango distancia: 2-500 cm • Resolución: 1 cm • Frecuencia del
ultrasonido: 40 kHz
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Sensores
• Ultrasonidos (Instalación y conexión) – ftp://imall.iteadstudio.com/Modules/IM120628012_
HC_SR04/DS_IM120628012_HC_SR04.pdf
– Necesita dos pines digitales: trigger envía un pulso, mientras que echo lo lee • Conectamos el pin de trigger a D9 y el echo a D10
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Librería Ultrasonic
• Fichero de cabecera – http://imall.iteadstudio.com/electronic-
components/sensor/distance-sensors/im120628012.html /* Ultrasonic.h - Library for HR-SC04 Ultrasonic Ranging Module.
Created by ITead studio. Alex, Apr 20, 2010.
iteadstudio.com */
#ifndef Ultrasonic_h
#define Ultrasonic_h
#define CM 1
#define INC 0
class Ultrasonic
{
public:
Ultrasonic(int TP, int EP);
long Timing();
long Ranging(int sys);
private:
int Trig_pin;
int Echo_pin;
long duration,distance_cm,distance_inc;
};
#endif
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
• Ultrasonidos • Código comprobación de funcionamiento
#include <Ultrasonic.h>
#define US_TRIG 9
#define US_ECHO 10
Ultrasonic ultrasonic(US_TRIG, US_ECHO);
void setup() {
Serial.begin(57600);
}
void loop() {
Serial.print(ultrasonic.Ranging(CM));
Serial.println(" cm");
delay(100);
}
Sensores
• ¿Vale para algo el retardo del final? Quítalo a ver qué pasa
• Une este código al de IR para mostrar ambas medidas
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Sensores
• Por si se os queda corto – http://dx.com/p/arduno-37-in-1-sensor-
module-kit-black-142834 (36,28€)
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Actuadores
• Servomotor – Tower Pro SG90
• Peso: 9g • Dimensiones: 23x12.2x29mm • Torque: 1.8kg/cm(4.8V) • Velocidad de operación: 0.1sec/60degree(4.8v) • Voltaje de funcionamiento: 4.8V • Rango de temperaturas: 0℃ – 55℃ • Rango de giro: 180º
– Giro de barrido del sensor de ultrasonidos
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Actuadores
• Servomotor – Librería standard Servo.h. Atención:
• “The Servo library supports up to 12 motors on most Arduino boards and 48 on the Arduino Mega. On boards other than the Mega, use of the library disables analogWrite() (PWM) functionality on pins 9 and 10, whether or not there is a Servo on those pins.”
– Sólo necesita una salida digital • Conectar en pin D8 (naranja)
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Control de posición Ejemplo knob modificado para usar puerto serie
#include <Servo.h>
#include <SoftwareSerial.h>
#define SERVO_US 8
Servo myservo; // servo object
int val; // value from serial
void setup()
{
// Indica el pin del servo
myservo.attach(SERVO_US);
Serial.begin(57600);
Serial.println("Ang(0-180)");
}
void loop()
{
if (Serial.available())
{
val = Serial.parseInt();
Serial.print("Recibido: ");
Serial.println(val, DEC);
myservo.write(val);
}
}
Actuadores
• Añade un retardo que tenga en cuenta cuánto tiempo tardará el servo en llegar a la posición indicada. Pista: deberás hacer uso de la función myservo.read()
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Barrido Ejemplo sweep modificado para no bloquear tareas mientras barre
#include <Servo.h>
#include <SoftwareSerial.h>
#define SERVO_US 8 // Pin servo
Servo myservo; // servo object
int val = 0;
int inc = 1;
void setup()
{
myservo.attach(SERVO_US);
}
void loop()
{
myservo.write(val);
delay(5);
// Vemos si hay que cambiar
la direccion
if (val==180) {inc = -1;}
if (val==0) {inc = 1;}
// Actualizamos la posicion
val += inc;
}
Actuadores
• Monitoriza la posición del servo por puerto serie • Añade el sensor de rango para encontrar el ángulo en que
se encuentra el objeto más cercano (Difícil)
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Actuadores
• Motores DC – Polaridad de los motores
• No provoca daños en el motor, pero cambia el sentido de giro
– Indicar movimiento continuo hacia delante • Si alguno de los motores gira hacia atrás, tiene la
polaridad al revés
– ¡¡¡Sin colocar aún las ruedas!!!
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Motores (conexión)
Sensor Shield
Motor Controller
D2 IN4 D5 (PWM) ENB
D4 IN3 D3 IN2
D6 (PWM) ENA D7 IN1
Cuidado con los colores: Marrón D5 Amarillo D3
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Comprobación de polaridad Movimiento de los cuatro motores en el mismo sentido
// Motor A
#define DIR1MA 7
#define DIR2MA 3
#define ENABLEA 6
// Motor B
#define DIR1MB 4
#define DIR2MB 2
#define ENABLEB 5
void setup ()
{
pinMode (DIR1MA, OUTPUT);
... // Todos en modo OUTPUT
pinMode (ENABLEB, OUTPUT);
}
void loop ()
{
avanza();
}
void avanza()
{
digitalWrite(DIR1MA,LOW);
digitalWrite(DIR2MA,HIGH);
digitalWrite(DIR1MB,LOW);
digitalWrite(DIR2MB,HIGH);
digitalWrite(ENABLEA,HIGH);
digitalWrite(ENABLEB,HIGH);
}
void retrocede()
{
digitalWrite(DIR1MA,HIGH);
digitalWrite(DIR2MA,LOW);
digitalWrite(DIR1MB,HIGH);
digitalWrite(DIR2MB,LOW);
digitalWrite(ENABLEA,HIGH);
digitalWrite(ENABLEB,HIGH);
}
Actuadores
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Actuadores
• Motores DC – Ejecuta el código y comprueba la polaridad – Coloca las ruedas y asegúrate de que no rozan
con la estructura – Antes de poner el robot en el suelo (se
estrellaría), cambia el programa anterior para 1. Mover el robot alternativamente hacia delante y
hacia atrás cada segundo 2. Mover el robot describiendo un cuadrado
1. Añadir dos funciones para girar a izquierda y a derecha
2. Calcular el tiempo que tarda en girar 90º en cada sentido
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Actuadores
• Motores DC – Control de velocidad mediante modulación de
ancho de pulso (PWM) – Arduino no tiene salidas
analógicas (caras) – ENA controla la velocidad
del motor A – ENB controla la velocidad
del motor B – Duty Cycle (porcentaje de
ciclo en nivel alto)
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Motores DC Ejemplo usando salidas PWM
// Motor A
#define DIR1MA 7
#define DIR2MA 3
#define ENABLEA 6
// Motor B
#define DIR1MB 4
#define DIR2MB 2
#define ENABLEB 5
void setup ()
{
pinMode (DIR1MA, OUTPUT);
... // Todos en modo OUTPUT
}
void loop ()
{
avanza(180); delay(1000);
retrocede(180); delay(1000);
}
void avanza(int speed)
{
digitalWrite(DIR1MA,LOW);
digitalWrite(DIR2MA,HIGH);
digitalWrite(DIR1MB,LOW);
digitalWrite(DIR2MB,HIGH);
analogWrite(ENABLEA,speed);
analogWrite(ENABLEB,speed);
}
void retrocede(int speed)
{
digitalWrite(DIR1MA,HIGH);
digitalWrite(DIR2MA,LOW);
digitalWrite(DIR1MB,HIGH);
digitalWrite(DIR2MB,LOW);
analogWrite(ENABLEA,speed);
analogWrite(ENABLEB,speed);
}
Actuadores
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Motores DC Ejemplo con velocidades variables: ¿Qué hace el programa?
// Motor A
...
unsigned long time;
int speed;
int dir;
void setup ()
{
pinMode (DIR1MA, OUTPUT);
...
time = millis ();
speed = 0;
dir = 1;
}
void loop ()
{
analogWrite (ENABLEA, speed);
analogWrite (ENABLEB, 255-speed);
// set direction
if (1 == dir) {
digitalWrite (DIR1MA, LOW);
digitalWrite (DIR2MA, HIGH);
digitalWrite (DIR1MB, HIGH);
digitalWrite (DIR2MB, LOW);
}
else {
digitalWrite (DIR1MA, HIGH);
digitalWrite (DIR2MA, LOW);
digitalWrite (DIR1MB, LOW);
digitalWrite (DIR2MB, HIGH);
}
if (millis () - time> 3000) {
time = millis ();
speed += 20;
if (speed> 255)
{speed = 0;}
if (1 == dir)
{dir = 0;}
else
{dir = 1;}
}
}
Actuadores
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Infrarrojos (Mando a distancia): Control de movimiento // Librerias
#include <IRremote.h>
#include <Servo.h>
// Motor A
#define DIR1MA 7
#define DIR2MA 3
#define ENABLEA 6
// Motor B
#define DIR1MB 4
#define DIR2MB 2
#define ENABLEB 5
// Ultrasonidos
#define US_SERVO 8
// Infrarrojos (PINES ANALOGICOS)
#define IR_L 3
#define IR_C 4
#define IR_R 5
// Otros pines
#define LED 13
#define RECV_PIN 11
// Variables IR
IRrecv irrecv(RECV_PIN);
decode_results results;
long lectura=0;
// Variables US
Servo myservo;
void setup()
{
pinMode(LED, OUTPUT);
... //Todos los pines digitales a OUTPUT
myservo.attach(US_SERVO);
Serial.begin(57600);
Serial.println("Aceptamos barco:");
irrecv.enableIRIn(); // Start receiver
}
void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
if (results.value!=0xFFFFFFFF) {
lectura = results.value;
}
switch(lectura) {
case 0xFF6897:
digitalWrite(LED, HIGH);
break;
case 0xFF9867:
digitalWrite(LED, LOW);
break;
case 0xFF629D:
avanza(200);
delay(200);
break;
default:
detente();
diqueno(3);
}
irrecv.resume(); // Receive the next value
}
}
void avanza(int vel) { ... }
void detente() { ... }
void diqueno(int veces) { ... }
Comunicación
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Proyecto
• Navegación autónoma – El robot debe moverse hacia delante,
buscando obstáculos con el sensor de ultrasonidos
– Si encuentra un obstáculo, retrocede ligeramente y gira 90º
– El robot sigue moviéndose hacia delante
ETSII – UCLM Curso de Robótica Móvil con Arduino, 3ª Edición Febrero 2014
Fin de la tercera
sesión de práctica
FIN