Aqui estamos realizando la prueba del control de servos por medio del celular, y este video muestra el resultado:
sábado, 22 de junio de 2013
trabajo finalizado, ultima prueba!!!
una vez realizado todos los circuitos, unimos primero la parte del arduino para ver que funcionara y si se moviera el carro, después se le colocaron los servos que mueven el tanque de gas para el lanzallamas. Una vez realizado todo el ensamblaje, este es el resultado del proyecto:
Programa del Arduino y control con la aplicación "Bluetooth RC".
Puedes descargar el programa que hicimos aquí MachineGun Arduino.
Éste es el código de Arduino:
#include <Servo.h>
Servo x;
Servo y;
Servo shoot;
int pos1;
int pos2;
int motorA = 2;
int motorB = 3;
int dirA = 4;
int dirB = 5;
int luz = 11;
int led=13;
char c;
boolean apuntar = false;
void adelante();
void reversa();
void parado();
void derecha();
void izquierda();
void adelanteDerecha();
void adelanteIzquierda();
void atrasDerecha();
void atrasIzquierda();
void encenderLuz();
void setup(){
Serial.begin(9600);
pinMode(led, OUTPUT);
pinMode(motorA, OUTPUT);
pinMode(motorB, OUTPUT);
pinMode(dirA, OUTPUT);
pinMode(dirB, OUTPUT);
pinMode(luz, OUTPUT);
x.attach(9);
y.attach(10);
shoot.attach(8);
x.write(90);
y.write(90);
shoot.write(50);
}
void loop(){
while (Serial.available()) {
if (Serial.available() >0) {
c = Serial.read();
}
}
if(apuntar == false){
switch(c){
case 'F':
adelante();
break;
case 'B':
reversa();
break;
case 'S':
parado();
break;
case 'L':
izquierda();
break;
case 'R':
derecha();
break;
case 'G':
adelanteIzquierda();
break;
case 'I':
adelanteDerecha();
break;
case 'H':
atrasIzquierda();
break;
case 'J':
atrasDerecha();
break;
case 'W':
encenderLuz();
break;
case 'w':
apagarLuz();
break;
case 'X':
apuntar = true;
break;
case 'v':
shoot.write(50);
break;
}
}
else{
switch(c){
case 'B': //HACIA ARRIBA
pos1++;
if(pos1 > 100){
pos1=100;
}
y.write(pos1);
break;
case 'F': //HACIA ABAJO
pos1--;
if(pos1 < 60){
pos1=60;
}
y.write(pos1);
break;
case 'L':
pos2++;
if(pos2>180){
pos2=180;
}
x.write(pos2);
break;
case 'R':
pos2--;
if(pos2<0){
pos1=0;
}
x.write(pos2);
break;
case 'x':
apuntar = false;
break;
case 'V':
shoot.write(100);
break;
case 'v':
shoot.write(50);
break;
}
delay(5);
}
}
void adelante(){
digitalWrite(motorA,HIGH);
digitalWrite(motorB,LOW);
digitalWrite(led,HIGH);
}
void reversa(){
digitalWrite(motorA,LOW);
digitalWrite(motorB,HIGH);
digitalWrite(led,HIGH);
}
void parado(){
digitalWrite(motorA,LOW);
digitalWrite(motorB,LOW);
digitalWrite(led,LOW);
digitalWrite(dirA,LOW);
digitalWrite(dirB,LOW);
}
void izquierda(){
digitalWrite(dirB,LOW);
digitalWrite(dirA,HIGH);
digitalWrite(led,HIGH);
}
void derecha(){
digitalWrite(dirB,HIGH);
digitalWrite(dirA,LOW);
digitalWrite(led,HIGH);
}
void adelanteIzquierda(){
digitalWrite(dirB,LOW);
digitalWrite(dirA,HIGH);
digitalWrite(motorB,LOW);
digitalWrite(motorA,HIGH);
digitalWrite(led,HIGH);
}
void adelanteDerecha(){
digitalWrite(dirB,HIGH);
digitalWrite(dirA,LOW);
digitalWrite(led,HIGH);
digitalWrite(motorA,HIGH);
digitalWrite(motorB,LOW);
}
void atrasIzquierda(){
digitalWrite(dirB,LOW);
digitalWrite(dirA,HIGH);
digitalWrite(motorB,HIGH);
digitalWrite(motorA,LOW);
digitalWrite(led,HIGH);
}
void atrasDerecha(){
digitalWrite(dirB,HIGH);
digitalWrite(dirA,LOW);
digitalWrite(led,HIGH);
digitalWrite(motorB,HIGH);
digitalWrite(motorA,LOW);
}
void encenderLuz(){
digitalWrite(luz,HIGH);
}
void apagarLuz(){
digitalWrite(luz,LOW);
}
Control del auto mediante la aplicación y cómo utilizamos los botones:
Éste es el código de Arduino:
#include <Servo.h>
Servo x;
Servo y;
Servo shoot;
int pos1;
int pos2;
int motorA = 2;
int motorB = 3;
int dirA = 4;
int dirB = 5;
int luz = 11;
int led=13;
char c;
boolean apuntar = false;
void adelante();
void reversa();
void parado();
void derecha();
void izquierda();
void adelanteDerecha();
void adelanteIzquierda();
void atrasDerecha();
void atrasIzquierda();
void encenderLuz();
void setup(){
Serial.begin(9600);
pinMode(led, OUTPUT);
pinMode(motorA, OUTPUT);
pinMode(motorB, OUTPUT);
pinMode(dirA, OUTPUT);
pinMode(dirB, OUTPUT);
pinMode(luz, OUTPUT);
x.attach(9);
y.attach(10);
shoot.attach(8);
x.write(90);
y.write(90);
shoot.write(50);
}
void loop(){
while (Serial.available()) {
if (Serial.available() >0) {
c = Serial.read();
}
}
if(apuntar == false){
switch(c){
case 'F':
adelante();
break;
case 'B':
reversa();
break;
case 'S':
parado();
break;
case 'L':
izquierda();
break;
case 'R':
derecha();
break;
case 'G':
adelanteIzquierda();
break;
case 'I':
adelanteDerecha();
break;
case 'H':
atrasIzquierda();
break;
case 'J':
atrasDerecha();
break;
case 'W':
encenderLuz();
break;
case 'w':
apagarLuz();
break;
case 'X':
apuntar = true;
break;
case 'v':
shoot.write(50);
break;
}
}
else{
switch(c){
case 'B': //HACIA ARRIBA
pos1++;
if(pos1 > 100){
pos1=100;
}
y.write(pos1);
break;
case 'F': //HACIA ABAJO
pos1--;
if(pos1 < 60){
pos1=60;
}
y.write(pos1);
break;
case 'L':
pos2++;
if(pos2>180){
pos2=180;
}
x.write(pos2);
break;
case 'R':
pos2--;
if(pos2<0){
pos1=0;
}
x.write(pos2);
break;
case 'x':
apuntar = false;
break;
case 'V':
shoot.write(100);
break;
case 'v':
shoot.write(50);
break;
}
delay(5);
}
}
void adelante(){
digitalWrite(motorA,HIGH);
digitalWrite(motorB,LOW);
digitalWrite(led,HIGH);
}
void reversa(){
digitalWrite(motorA,LOW);
digitalWrite(motorB,HIGH);
digitalWrite(led,HIGH);
}
void parado(){
digitalWrite(motorA,LOW);
digitalWrite(motorB,LOW);
digitalWrite(led,LOW);
digitalWrite(dirA,LOW);
digitalWrite(dirB,LOW);
}
void izquierda(){
digitalWrite(dirB,LOW);
digitalWrite(dirA,HIGH);
digitalWrite(led,HIGH);
}
void derecha(){
digitalWrite(dirB,HIGH);
digitalWrite(dirA,LOW);
digitalWrite(led,HIGH);
}
void adelanteIzquierda(){
digitalWrite(dirB,LOW);
digitalWrite(dirA,HIGH);
digitalWrite(motorB,LOW);
digitalWrite(motorA,HIGH);
digitalWrite(led,HIGH);
}
void adelanteDerecha(){
digitalWrite(dirB,HIGH);
digitalWrite(dirA,LOW);
digitalWrite(led,HIGH);
digitalWrite(motorA,HIGH);
digitalWrite(motorB,LOW);
}
void atrasIzquierda(){
digitalWrite(dirB,LOW);
digitalWrite(dirA,HIGH);
digitalWrite(motorB,HIGH);
digitalWrite(motorA,LOW);
digitalWrite(led,HIGH);
}
void atrasDerecha(){
digitalWrite(dirB,HIGH);
digitalWrite(dirA,LOW);
digitalWrite(led,HIGH);
digitalWrite(motorB,HIGH);
digitalWrite(motorA,LOW);
}
void encenderLuz(){
digitalWrite(luz,HIGH);
}
void apagarLuz(){
digitalWrite(luz,LOW);
}
Control del auto mediante la aplicación y cómo utilizamos los botones:
Control de los sevomotores.
Información sobre los servos, funcionamiento y construcción: Servomotores.
Código para controlar los servomotores que usamos para apuntar: Aim.
#include <Servo.h> //INCLUIMOS LA LIBRERIA SERVO
Servo x; //DECLARAMOS EL OBJETO SERVO QUE MUEVE EL LANZA LLAMAS EN EL EJE X
Servo y; //DECLARAMOS EL OBJETO SERVO QUE MUEVE EL LANZA LLAMAS EN EL EJE Y
int pos1; //DECLARAMOS LA VARIABLE DE LA POSICION DEL SERVO X
int pos2; //DECLARAMOS LA VARIABLE DE LA POSICION DEL SERVO Y
char c;
void setup(){
Serial.begin(9600);
x.attach(9); //EL SERVO X ESTA CONECTADO AL PIN 9
y.attach(10); //EL SERVO Y ESTA CONECTADO AL PIN 10
x.write(90); //EL SERVO X TIENE UNA POSICION INICIAL A 90 GRADOS
y.write(90); //EL SERVO Y TIENE UNA POSICION INICIAL A 90 GRADOS
}
void loop(){
while (Serial.available()) {
if (Serial.available() >0) {
c = Serial.read();
}
}
switch(c){
case 'F': //HACIA ARRIBA
pos1++;
if(pos1 > 100){ //MAXIMO PARA QUE EL LANZA LLAMAS NO GOLPEE CON EL TANQUE
pos1=100;
}
y.write(pos1);
break;
case 'B': //HACIA ABAJO
pos1--;
if(pos1 < 60){ //MAXIMO PARA QUE EL LANZA LLAMAS NO QUEME EL TANQUE
pos1=60;
}
y.write(pos1);
break;
case 'L': //IZQUIERDA
pos2++;
if(pos2>180){
pos2=180;
}
x.write(pos2);
break;
case 'R': //DERECHA
pos2--;
if(pos2<0){
pos1=0;
}
x.write(pos2);
break;
}
delay(5);
}
Código para controlar los servomotores que usamos para apuntar: Aim.
#include <Servo.h> //INCLUIMOS LA LIBRERIA SERVO
Servo x; //DECLARAMOS EL OBJETO SERVO QUE MUEVE EL LANZA LLAMAS EN EL EJE X
Servo y; //DECLARAMOS EL OBJETO SERVO QUE MUEVE EL LANZA LLAMAS EN EL EJE Y
int pos1; //DECLARAMOS LA VARIABLE DE LA POSICION DEL SERVO X
int pos2; //DECLARAMOS LA VARIABLE DE LA POSICION DEL SERVO Y
char c;
void setup(){
Serial.begin(9600);
x.attach(9); //EL SERVO X ESTA CONECTADO AL PIN 9
y.attach(10); //EL SERVO Y ESTA CONECTADO AL PIN 10
x.write(90); //EL SERVO X TIENE UNA POSICION INICIAL A 90 GRADOS
y.write(90); //EL SERVO Y TIENE UNA POSICION INICIAL A 90 GRADOS
}
void loop(){
while (Serial.available()) {
if (Serial.available() >0) {
c = Serial.read();
}
}
switch(c){
case 'F': //HACIA ARRIBA
pos1++;
if(pos1 > 100){ //MAXIMO PARA QUE EL LANZA LLAMAS NO GOLPEE CON EL TANQUE
pos1=100;
}
y.write(pos1);
break;
case 'B': //HACIA ABAJO
pos1--;
if(pos1 < 60){ //MAXIMO PARA QUE EL LANZA LLAMAS NO QUEME EL TANQUE
pos1=60;
}
y.write(pos1);
break;
case 'L': //IZQUIERDA
pos2++;
if(pos2>180){
pos2=180;
}
x.write(pos2);
break;
case 'R': //DERECHA
pos2--;
if(pos2<0){
pos1=0;
}
x.write(pos2);
break;
}
delay(5);
}
viernes, 21 de junio de 2013
Circuitos de Control para los motores (puente H con relevadores y transistores).
TODO ESTO LO MONTAMOS EN UN CHASIS DE UN AUTO A CONTROL REMOTO.
MT1 ES EL MOTOR TRASERO QUE DA LA DIRECCIÓN.
MT2 ES EL SERVO DELANTERO QUE CONTROLA LA DIRECCIÓN.
La potencia a las salidas del integrado L293 no eran suficientes para mover los motores a la velocidad deseada, nosotros optamos por hacer un puente H con relevadores y transistores. Los transistores los utilizamos para amplificar la señal del Arduino ya que las bobinas de los relevadores consumen mucha corriente. Como los relees son mecánicos no hay perdidas a la salida así que los motores reciben casi todo el voltaje y toda la corriente. Diseñamos el siguiente circuito:
Seguimos utilizando el L293 para el servo de la dirección, los 600mA del integrado son suficientes para moverlos y ahorramos espacio al no poner más relevadores.
Material:
Pines del Transistor BC547.
MT1 ES EL MOTOR TRASERO QUE DA LA DIRECCIÓN.
MT2 ES EL SERVO DELANTERO QUE CONTROLA LA DIRECCIÓN.
La potencia a las salidas del integrado L293 no eran suficientes para mover los motores a la velocidad deseada, nosotros optamos por hacer un puente H con relevadores y transistores. Los transistores los utilizamos para amplificar la señal del Arduino ya que las bobinas de los relevadores consumen mucha corriente. Como los relees son mecánicos no hay perdidas a la salida así que los motores reciben casi todo el voltaje y toda la corriente. Diseñamos el siguiente circuito:
Seguimos utilizando el L293 para el servo de la dirección, los 600mA del integrado son suficientes para moverlos y ahorramos espacio al no poner más relevadores.
Material:
- 1 Batería 9v (de preferencia utiliza la original del auto a control remoto).
- 1 LED.
- 4 resistencias 330 ohms.
- 1 Switch.
- 3 Relevadores de 5v.
- 3 Transitores BC547 (BJT).
- 1 Arduino.
- 1 Diodo rectificador
- 1 Protoboard.
- Alambre para proto.
Pines del Transistor BC547.
Puente H
Un Puente H o Puente en H es un circuito electrónico que
permite a un motor eléctrico DC girar en ambos sentidos, avance y retroceso.
Son ampliamente usados en robótica y como convertidores de potencia. Los
puentes H están disponibles como circuitos integrados, pero también pueden
construirse a partir de componentes discretos.
El término "puente H" proviene de la típica
representación gráfica del circuito. Un puente H se construye con 4
interruptores (mecánicos o mediante transistores). Cuando los interruptores S1
y S4 (ver primera figura) están cerrados (y S2 y S3 abiertos) se aplica una
tensión positiva en el motor, haciéndolo girar en un sentido. Abriendo los
interruptores S1 y S4 (y cerrando S2 y S3), el voltaje se invierte, permitiendo
el giro en sentido inverso del motor.
El término puente H proviene de la típica representación gráfica del circuito.
El término puente H proviene de la típica representación gráfica del circuito.
El término "puente H" proviene de la típica
representación gráfica del circuito. Un puente H se construye con 4
interruptores (mecánicos o mediante transistores). Cuando los interruptores S1
y S4 (ver primera figura) están cerrados (y S2 y S3 abiertos) se aplica una tensión
positiva en el motor, haciéndolo girar en un sentido. Abriendo los
interruptores S1 y S4 (y cerrando S2 y S3), el voltaje se invierte, permitiendo
el giro en sentido inverso del motor.
Con la nomenclatura que estamos usando, los interruptores S1
y S2 nunca podrán estar cerrados al mismo tiempo, porque esto cortocircuitaría
la fuente de tensión. Lo mismo sucede con S3 y S4.
Más información: Puente H wikipedia
Lanza Llamas
Para el Lanzallamas utilizamos un desodorante montado sobre dos servos que lo mueven en los ejes xy y un tercer servo para presionar la válvula y disparar.
Lo montamos de la siguiente manera:
Hicimos una pieza que encajara en la boquilla de la válvula para que al jalarla con el servo la presionara y saliera el desodorante.
Amarramos alambre a cada extremo de la pieza que hicimos y luego los sujetamos a un clavo para que el servo pudiera tirar de él.
Lo montamos de la siguiente manera:
Sujetamos un servo a la parte trasera para presionar la válvula.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglw4EPxvcwMIx3-eao0a1rR55VX_ahusE9DOTxU7PZMIHJoF03HD29SK9l0zxgddahyphenhyphenUUrb90nOvc9XyBag3toZs3DaF9qq2rASO36OTFVnQL3SDI01Mi4ReUe9obVM_hKneKhcdt2RIk/s400/20130622_002723.jpg)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg63orrnnCbctz3ujTKf4XVBwMXEFoisVvOEKHPmaWs_EE0ejOzjWQ6OEgb2DVZqN3AB_rnHEXBWZGh9qseX-g8oqd8CVQIdQ_neilFdW2BEW9SdDYSFgF13UeBArrTsYX2EDR6urD6RyI/s400/20130622_002731.jpg)
Suscribirse a:
Entradas (Atom)