Vous êtes sur la page 1sur 16

Vehculo controlado por mvil

- Ramn Arjona Quiones


- Andrea Fernndez Garca IES Vicente Aleixandre 2014

ndice:

1. Finalidad

2. Bsqueda de informacin

3. Funcionamiento de los subsistemas
*Hardware
*Programacin

4. Desarrollo del proyecto
*Hardware
*Programacin

5. Valoracin personal y aportacin individual










1. Finalidad

- La finalidad de este proyecto es controlar un coche mediante un programa (la app), que se
comunica con Arduino y el coche mediante un dispositivo bluetooth conectado a Arduino. La
app nos permite controlar el coche para que se mueva hacia delante, izquierda, derecha y
atrs mandando diferentes letras a Arduino (f, l, ry b respectivamente). Tambin
incluye dos barras que nos permiten controlar la velocidad del coche y la intensidad de los
faros, enviando <x__> e <y__> (__=cualquier nmero del 0 al 255) respectivamente.
Si no se presiona nada, el coche se detendr (manda una s). Los motores funcionan
conectados como puente en h, que es un circuito electrnico que permite a un motor girar
en ambos sentidos, gracias a los cuatro interruptores que se abren y cierran para controlar
el sentido de giro.



Puente h









- El objetivo con el que vamos a la feria de las ciencias es que el coche se mueva bien, que
el bluetooth no se desconecte y que funcionen correctamente las dos barras (velocidad y
faros). Hemos pensado en aadir, si da tiempo, unos intermitentes que se enciendan
dependiendo del lado al que giremos, y a lo mejor un pitido al ir marcha atrs.

- Descomposicin del problema:






- Esquema de entradas y salidas:






2. Bsqueda de informacin

Lo primero que buscamos es la programacin del coche en Arduino, en la pgina de la
aplicacin:
http://es.appszoom.com/android_applications/tools/arduino-controlled-robot_inuri.html

El programa nos muestra el funcionamiento del coche, y nos ha servido para programar
nuestro propio programa:
https://github.com/srebroa/Arduino/blob/master/Arduino_controlled_robot/Arduino_contr
olled_robot.ino

Tambin hemos tenido que informarnos sobre el cdigo ASCII para entender una parte del
programa:
http://es.wikipedia.org/wiki/ASCII

Pgina sobre la conexin Android-Bluetooth-Arduino:
http://geekytheory.com/conectar-android-con-arduino-por-bluetooth-capitulo-1/



Interfaz de la aplicacin






3. Funcionamiento de los subsistemas
Aqu tenemos cmo funcionan los diferentes elementos del
coche por separado:
Mdulo Bluetooth para Arduino


Motor

Motor Driver


4. Desarrollo del proyecto

a. Hardware

Lista de materiales:


Fritzing:












b. Software


Programa para encender y apagar un led (con bluetooth)


const int ledPin = 5; // Led conectado al pin 5
int incomingByte; // Guarda el ltimo dato recibido

void setup() {
// Establece conexin con el puerto serie
Serial.begin(9600);
// Estabece el led como salida
pinMode(ledPin, OUTPUT);
}

void loop() {
// Guarda el ltimo bit en la variable
incomingByte = Serial.read();
// Si recibe una f (botn para hacer que el coche avance en la app)
if (incomingByte == 'f') {
digitalWrite(ledPin, HIGH); //El led se enciende
}
// Si recibe una b (botn para hacer que el coche retroceda en la app)
if (incomingByte == 'b') {
digitalWrite(ledPin, LOW); //El led se apaga
}
}
Programa para controlar el led PWM con el teclado:

/*
CODIGO QUE PERMITE MANDAR PWM AL LED DESDE PUERTO SERIE
Hay que mirar el codigo ASCII
Los caracteres se envian como codigo decimal y se interpretan en ASCII
Por ejemplo el 0 se envia como 48, el > como 62

*/
const int ledPin = 10; // El pin al que est conectado el led.
int value=0;
char ch; //lee lo que escribimos en el puerto serie.
int pwmValue=0; //El valor que va a tomar el led.
int lectura =0; //Puede ser 1 o 0. Ve si escribimos o no.

void setup() {
// Establece conexin con el puerto serie
Serial.begin(9600);
}

void loop() {
// Comprueba si est recibiendo datos:
if (Serial.available() > 0) { //Si recibe algn byte,
ch=Serial.read(); //ch es igual a lo que escribimos en el puerto serie


if(ch==60){ //Si escribimos un < (60 en ASCII),
lectura=1; //Lee
}

if(lectura==1){ //Si lee,
if(ch>= '0' && ch<= '9'){ // Si es un caracter ASCII entre 0 y el 9 (podria haber puesto entre 48 y 57),
value=(value*10)+(ch-48); // Acumula el valor, en codigo ASCII el 0=48, 1=49...
}

else if (ch==62) // > uso como finalizador
{
pwmValue=value; // Guarda el valor en la variable pwmValue
Serial.println(pwmValue); // Lo imprime por pantalla
value=0; // Dejamos lista para volver a escribir en ella
lectura=0; //Establecemos que no est leyendo nada.
}
}
}
analogWrite(10,pwmValue); // Escribimos el valor en el LED
}

Programa para encender dos leds PWM (con bluetooth)

constintledblanco=9//Ledblancoconectadoaldigital9.
constintledrojo=10//Ledrojoconectadoaldigital10.
intvalue=0
charch//Leeelltimobitescritoenelpuertoserie
intpwmValueM=0//ElvalorPWMquepondremosalledblanco
intpwmValueL=0//ElvalorPWMquepondremosalledrojo
booleanlectura=0//Empiezaaleerodejadehacerlo.Solopuedeser0o1.
intesx=0//Indicasiestamosdeslizandosobrelabarradearribaodeabajo.
intesy=0

voidsetup(){
Serial.begin(9600)//Establececonexinconelpuertoserie
analogWrite(ledblanco,255)//Haceparpadearlosdosledsparacomprobarqueestnbienconectados.
analogWrite(ledrojo,255)
delay(1000)
analogWrite(ledblanco,0)
analogWrite(ledrojo,0)
}

voidloop(){
//Compruebasirecibedatos:
if(Serial.available()>0){
//Leeelltimobitenviado
ch=Serial.read()
if(ch==60){//Sileeun60(<enASCII),
lectura=1//Empiezaaleer
}
if(ch=='x'){//Sileeunax,eslabarradearriba
esx=1
}
if(ch=='y'){//Sileeunay,eslabarradeabajo
esy=1
}
if(lectura==1){
if(ch>='0'&&ch<='9'){//SiesuncaracterASCIIentre0yel9

value=(value*10)+(ch'0')//Acumulaelvalor,encodigoASCIIel0=48,1=49...
}
elseif(ch==62)//>usocomofinalizador
{
if(esx==1){//Siesx(labarradearriba)
pwmValueM=value//GuardaelvalorenlavariablepwmValueM
Serial.print("pwmValueM=")//Loimprimeporpantalla
Serial.println(pwmValueM)//Imprimeelvalor
value=0//Dejamoslistaparavolveraescribirenella
lectura=0//Dejadeleer
esx=0//Fijaesxa0
}
if(esy==1){//Siesy(labarradeabajo)
pwmValueL=value//GuardaelvalorenlavariablepwmValueL
Serial.print("pwmValueL=")//Loimprimeporpantalla
Serial.println(pwmValueL)//Imprimeelvalor
value=0//Dejamoslistaparavolveraescribirenella
lectura=0//Dejadeleer
esy=0//Fijaesya0.
}

}
}

analogWrite(ledblanco,pwmValueM)//EscribimoselvalorenelLEDblanco
analogWrite(ledrojo,pwmValueL)//EscribimoselvalorenelLEDrojo
}























Programa definitivo para controlar el coche (en proceso)

// Variables de motores:
int inA = 4; //Los cuatro in son los pines a los que va conectado el motor driver
int inB = 5;
int inC = 6;
int inD = 7;
int pwmMIpin= 10; //Los dos pines conectados a los motores para regular la velocidad.
int pwmMDpin=11;


//Variables de luces:
int pwmL1pin=3; //Los dos pines PWM a los que van conectados los leds blancos
int pwmL2pin=9;
int lednarD=2; //Y los dos pines a los que van conectados los intermitentes
int lednarI=8;
int estadoled=LOW;
long intervalo=200;
long previousMillis=0;
unsigned long currentMillis=0;


// Variables de comunicacion:
int value=0;
int pwmMvalue=255; //Velocidad del coche
int pwmLvalue=0; //Intensidad de los faros
int incomingByte; //ltimo bit recibido
int esx=0; //Indica si es la barra de arriba o la de abajo sobre la que estamos deslizando.
int esy=0;
boolean lectura=0; //Puede ser uno o cero. Reconoce si estamos mandando algo.

void setup() {
pinMode (inA, OUTPUT);
pinMode(inB, OUTPUT);
pinMode(inC, OUTPUT);
pinMode(inD, OUTPUT); //Establece los cuatro pines del motor driver como salidas.
pinMode(lednarD, OUTPUT);
pinMode(lednarI,OUTPUT);
Serial.begin(9600); //Establece conexin con el puerto serie
}
void go_forward(){ //Rutina para que el coche avance
digitalWrite(inA, HIGH);
digitalWrite(inB, LOW);
digitalWrite(inC, LOW);
digitalWrite(inD, HIGH);
}
void go_back(){ //Rutina para que el coche retroceda
digitalWrite(inA, LOW);
digitalWrite(inB, HIGH);
digitalWrite(inC, HIGH);
digitalWrite(inD, LOW);
}
void turn_right(){ //Rutina para que el coche gire a la derecha
digitalWrite(inA, LOW);
digitalWrite(inB, HIGH);
digitalWrite(inC, LOW);
digitalWrite(inD, HIGH);
}
void turn_left(){ //Rutina para que el coche gire a la izquierda
digitalWrite(inA, HIGH);
digitalWrite(inB, LOW);
digitalWrite(inC, HIGH);
digitalWrite(inD, LOW);
}
void parar(){ //Rutina para que el cohe pare
digitalWrite(inA, LOW);
digitalWrite(inB, LOW);
digitalWrite(inC, LOW);
digitalWrite(inD, LOW);
}
void loop() {

unsigned long currentMillis=millis();
if (Serial.available() > 0) { //Si recibe datos,
incomingByte = Serial.read(); //Acumula el ltimo bit en incomingByte

if (incomingByte == 'f') { //SI es f (botn de arriba),
go_forward(); //Va hacia alante
digitalWrite(lednarD, LOW);
digitalWrite(lednarI, LOW);
}
if (incomingByte == 'b') { //Si es b (botn de abajo),
go_back(); //Va hacia atrs
digitalWrite(lednarD, LOW);
digitalWrite(lednarI, LOW);
}
if (incomingByte == 'r') { //Si es r (botn de la derecha);
turn_right(); //Gira a la derecha
digitalWrite(lednarD, HIGH);
digitalWrite(lednarI, LOW);
}
if (incomingByte == 'l') { //Si es l (botn de la izquierda),
turn_left(); //Gira a la izquierda
digitalWrite(lednarD, LOW);
digitalWrite(lednarI, HIGH);
}
if (incomingByte == 's') { //Si es s (no se pulsa nada),
parar(); //El coche se para.
digitalWrite(lednarD, LOW);
digitalWrite(lednarI, LOW);
}

if(incomingByte==60){ //Si lee un 60 (< en ASCII),
lectura=1; // Empieza a leer
}
if (incomingByte == 'x'){ //Si lee una x, es la barra de arriba
esx=1;
}
if (incomingByte== 'y'){ //Si lee una y, es la barra de abajo
esy=1;
}
if (lectura==1){
if(incomingByte>= '0' && incomingByte<= '9'){ // Si es un caracter ASCII entre 0 y el 9

value=(value*10)+(incomingByte-'0'); // Acumula el valor, en codigo ASCII el 0=48, 1=49...
}
else if (incomingByte==62) // > uso como finalizador
{
if(esx==1) { //Si es x (la barra de arriba)
pwmLvalue=value; // Guarda el valor en la variable pwmLvalue (focos)
Serial.print("pwmLvalue="); // Lo imprime por pantalla
Serial.println(pwmLvalue); // Imprime el valor
value=0; // Dejamos lista para volver a escribir en ella
lectura=0; //Deja de leer
esy=0; //Fija esy a 0.
}
if(esy==1) { //Si es y (la barra de abajo)
pwmMvalue=value; // Guarda el valor en la variable pwmMvalue (velocidad)
Serial.print("pwmMvalue="); // Lo imprime por pantalla
Serial.println(pwmMvalue); //Imprime el valor
value=0; // Dejamos lista para volver a escribir en ella
lectura=0; //Deja de leer
esx=0; //Fija esx a 0

}
}
analogWrite(pwmMIpin,pwmMvalue); // Fija la velocidad al valor impuesto
analogWrite(pwmMDpin,pwmMvalue);
analogWrite(pwmL1pin,pwmLvalue); // Fija la luz al valor impuesto
analogWrite(pwmL2pin,pwmLvalue);
}
}
}
5. Valoracin personal y aportacin individual

+ Valoracin personal:

- Ramn: creo que ha sido muy interesante el diseo y desarrollo de este proyecto, ya que
hemos podido aplicar los conocimientos de Arduino que habamos aprendido, junto con la
parte prctica del montaje del coche. Me ha servido para aprender el funcionamiento de los
motores y bluetooth, y para aprender ms sobre Arduino. En mi opinin, aunque hayamos ido
un poco ajustados de tiempo, con dos personas ha bastado para hacerlo.



- Andrea: A nivel personal, pensaba que no iba a dar la altura en este proyecto, pero a
medida que se ha ido realizando el proyecto, me he ido esforzando ms, tanto en entender
la programacin de Arduino como en el montaje del coche en s. He aprendido ms sobre
todo lo que habamos practicado a lo largo de todo el curso y aumentado mi nivel de
comprensin que creo que es uno de los objetivos del proyecto. Ha sido muy gratificante
despus de estos dos meses, poder ver como el coche funcionaba, aunque con pequeos
fallos, que a fin de cuentas estamos aprendiendo a encontrarlos y buscarles soluciones. He
terminado el proyecto con mucha satisfaccin y muy contenta con mi compaero de grupo.



+ Aportacin individual:
- Ramn: 100%
- Andrea: 100%