Ayer compré un tren de juguete y le puse motor, pilas e interruptor. Hoy estuve trabajando en una “pista” (no logré hacer vías, se resbalaba el plástico de las ruedas). Y luego, en una barrera automática.
Para trabajar sobre una superficie que pueda cambiar de lugar (para liberar la mesa), usé unas baldosas grandes que tengo en casa. En ellas fui pegando distintas cosas para guiar el tren, empezando por un tapacanto de melamina que tenía guardado:
Después de varias pruebas llegué a la solución pegando precintos mediante cinta de papel, pero podrían usarse muchas otras soluciones.
Una vez que el trencito ya funcionaba correctamente armé la barrera con el Arduino:
¿Qué se necesita?
- Placa Arduino
- Protoboard (placa de prueba / placa sin soldaduras)
- Cables
- Servo motor
- Sensor ultrasónico (distancia)
- Optativo: un buzzer, batería de 9v y conector Plug Jack para conectarlo al Arduino y usar la barrera sin la computadora
Conexiones
Lo ideal para hacer este montaje es ya haber utilizado por separado cada uno de los tres elementos: el servo motor, el buzzer y el sensor de distancia / ultrasónico.
- El servo: va conectado al pin 9, a tierra y a VCC (aquí explicación sobre cómo conectar un servo)
- cable anaranjado: va a un pin de tipo PWD (los de la tilde de la eñe), en este caso al 9
- cable color marrón: GND (tierra)
- cable color rojo: +5v
- El sensor ultrasónico:
- VCC – a 5v
- TRIG – al pin 12
- ECHO – al pin 13
- GND – a gnd
- El buzzer
- Pin 10 (el positivo)
- GND (el negativo)
Programa
Aquí comparto el código utilizado para que la barrera se levante cuando el sensor ultrasónico detecta algo cerca:
#include <Servo.h>
#define PIN_TRIG 12
#define PIN_ECO 13
int buzzer = 10;
int tones[ ] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440,466, 494};
//DO, DO#, RE, RE#, MI, FA, FA#, SOL, SOL#, A, A#, B
//Estas son las frecuencias que corresponden a cada nota, para usar en el buzzer
Servo myservo;
int pos = 0;
void setup() {
Serial.begin (9600);
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECO, INPUT);
pinMode(buzzer, OUTPUT);
myservo.attach(9);
}
void loop() {
//Este fragmento de código es para tomar la información del sensor ultrasónico HC-SR04
long duracion, distancia;
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
duracion=pulseIn(PIN_ECO, HIGH);
distancia=(duracion/2)/29;
//Aquí hacemos que la distancia se muestre en el "Monitor Serial"
Serial.println(distancia);
//Acá ponemos una condición: si la distancia es menor a doce cm, que suene el buzzer y se baje la barrera
if (distancia < 12) {
//suena el buzzer en la frecuencia indicada por la matriz que está en
tone(buzzer, tones[8]);
delay(50);
noTone(buzzer);
delay(50);
tone(buzzer, tones[8]);
delay(50);
noTone(buzzer);
delay(50);
for (pos = 130; pos >= 0; pos -= 1) { // Lleva la variable pos desde 130 grados hasta 0, de uno en uno
myservo.write(pos); // pone el servo en la posición indicada por la variable pos
delay(15); // espera 15ms
}
delay(1000);
for (pos = 0; pos <= 130; pos += 1) { // lleva la variable pos desde 0 hasta 130
myservo.write(pos); // pone el servo en la posición indicada por la variable pos
delay(15); // espera 15ms
}
}
}