Sesión 3 (Práctica) •
•
Sensores Actuadores
Índice 1. Sensores a. Infrarrojos b. Ultrasonidos
2. Actuadores a. Servomotor b. Motores
3. Comunicación a. Infr Infrar arrrojos ojos (man (mando do a dis distanci ancia) a) a. Control de de ac actuadores
b. Blue Bluettoot ooth (App (AppIn Invvent entor) or) a. Sensores ad adicionales
Referencia •
Para dudas referentes a cómo usar una función o a qué funciones hay disponibles –
http://arduino.cc/en/Reference/HomePage
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)
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
Sensores Infrarrojos Código Lecturas Analógicas #include
#define IR_LEFT 3 #define IR_CENTER 4 #define IR_RIGHT 5
void loop() { //read the input L = analogRead(IR_LEFT); C = analogRead(IR_CENTER); R = analogRead(IR_RIGHT);
int L,C,R;
//print the values Serial.print (L); Serial.print(","); Serial.print (C); Serial.print(","); Serial.println (R);
void setup() { Serial.begin (57600); } } •
¿Qué lecturas tenemos en el terminal Serie?
•
¿Qué ocurre si ajustamos el potenciómetro?
Sensores Infrarrojos Código Lecturas Digitales (cambiar pines a D9, D10 y D11) #include #define IR_LEFT 11 #define IR_CENTER 10 #define IR_RIGHT 9
void loop() { //read the input L = digitalRead(IR_LEFT); C = digitalRead(IR_CENTER); R = digitalRead(IR_RIGHT);
int L,C,R; void setup() { Serial.begin (57600); pinMode (IR_LEFT,INPUT); pinMode (IR_CENTER,INPUT); pinMode (IR_RIGHT,INPUT); } •
//print the values Serial.print (L); Serial.print(","); Serial.print (C); Serial.print(","); Serial.println (R); }
¿Qué tenemos que hacer para seguir una línea?
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
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 •
Librería Ultrasonic •
Fichero de cabecera –
http://imall.iteadstudio.com/electroniccomponents/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
Sensores •
Ultrasonidos •
Código comprobación de funcionamiento
#include #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); } •
¿Vale para algo el retardo del final? Quítalo a ver qué pasa
•
Une este código al de IR para mostrar ambas medidas
Sensores •
Por si se os queda corto –
http://dx.com/p/arduno-37-in-1-sensormodule-kit-black-142834 (36,28€)
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
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)
Actuadores Control de posición Ejemplo knob modificado para usar puerto serie #include #include #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); } }
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()
Actuadores Barrido Ejemplo sweep modificado para no bloquear tareas mientras barre #include #include void loop() #define SERVO_US 8 // Pin servo { myservo.write(val); Servo myservo; // servo object delay(5); // Vemos si hay que cambiar int val = 0; la direccion int inc = 1; if (val==180) {inc = -1;} if (val==0) {inc = 1;} void setup() // Actualizamos la posicion { val += inc; myservo.attach(SERVO_US); } } • •
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)
Actuadores •
Motores DC –
Polaridad de los motores •
–
Indicar movimiento continuo hacia delante •
–
No provoca daños en el motor, pero cambia el sentido de giro Si alguno de los motores gira hacia atrás, tiene la polaridad al revés
¡¡¡Sin colocar aún las ruedas!!!
Motores (conexión) Cuidado con los colores: Marrón D5 Amarillo D3
Sensor Motor Shield Controller D2 IN4 D5 (PWM) ENB D4 IN3 D3 IN2 D6 (PWM) ENA D7 IN1
Actuadores 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 •
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. 2.
Añadir dos funciones para girar a izquierda y a derecha Calcular el tiempo que tarda en girar 90º en cada sentido
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)
Actuadores 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 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;} }
Comunicación Infrarrojos (Mando a distancia): Control de movimiento // Librerias #include #include // 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) { ... }
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
FIN Fin de la tercera sesión de práctica