OBJETIVOS
Un objetivo a realizar es conseguir que de manera automática se mueva y evite obstáculos.
Para ello usare dos sensores de ultrasonidos que midan la distancia para evitar que choque y un puente en H para que pueda ir hacia adelante y hacia atrás y también servirá para poder girar.
Otro objetivo es poder controlarlo de manera manual, pudiendo regularle la velocidad e indicarle la dirección, esto lo llevare a cabo mediante una aplicación en android usando el app inventor y un modulo de bluetooth (HC-06), que le pasara la información del dispositivo android a la arduino.
Usando también el puente en H para cambiar el sentido y la dirección.
ESQUEMA Y PCB DEL PUENTE EN H
Lo primero ha sido realizar el esquema y la simulacion del puente en H en ISSIS en el que he usado los componentes:
-2 Transistores BD135 .
-2 Transistores BD136.
-2 Transistores 2N2222.
-4 Diodos 1N4007.
- 4Resistencias de 0,6W (2 de 22 Ohmios y 2 de 470 Ohmios).
-3 Conectores de 2 pines.
Tras comprobar en la simulación su correcto funcionamiento se puede pasar a la construcción de la pcb, sacar la placa y montarla.
Puente en H finalizado
Tras realizar el montaje completo de los puentes en H he comprobado su funcionamiento, con buen resultado. Desde arduino se le da la señal al puente para que vaya el motor en una dirección o en otra. El motor se alimenta con 12V que pasan a través del driver y con una señal de PWM al driver se controla su velocidad.
Aplicacion en Android
Con una aplicacion en android se va a poder controlar el movimiento del coche y decirle que se comporte tanto de manera automática como manual, y poder controlar la velocidad y direccion cuando se encuentre en modo manual.
La aplicacion la he realizado a traves del MIT App Inventor 2 y se comunicara con arduino a traves de un modulo de bluetooth HC-06. La comunicacion se hara a traves de cadenas con el app Inventor, al pulsar un boton se le enviara una cadena por el puerto serie al Arduino Mega y este actuará en consecuencia.
Por ejemplo, si se quiere que el coche avance mas rapido se le pulsara al boton mas, este le enviara al arduino por serie la palabra "mas" y hara que la velocidad se incremente 40.
Así quedara la pantalla de la aplicación:
Para que la aplicación funcione la programación se hace a través de bloques. Así es como quedan los bloques tras programar toda la aplicación:
Comunicación de Arduino Mega con Arduino Uno
En el arduino Uno irán conectados los dos ultrasonidos y llevará el programa que hace que cuando un ultrasonido detecte un obstáculo a menos de 30 centímetros activa una salida y cuando sea el otro ultrasonido pondrá otra diferente. El arduino Mega estará conectado a esas dos patillas leyendo en que estado se encuentran, los datos los guarda en dos variables y actúa en consecuencia con ellas.
Programa Arduino Uno
#define PIN_TRIGD 9
#define PIN_ECHOD 5
#define PIN_TRIGT 6
#define PIN_ECHOT 3
void setup() {
Serial.begin(9600);
pinMode(PIN_TRIGD, OUTPUT);
pinMode(PIN_ECHOD, INPUT);
pinMode(PIN_TRIGT, OUTPUT);
pinMode(PIN_ECHOT, INPUT);
pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
}
void loop()
{
long distanciaD,distanciaT;
distanciaD = medir(PIN_TRIGD,PIN_ECHOD);
Serial.print("Delantero :");
Serial.println(distanciaD);
distanciaT = medir(PIN_TRIGT,PIN_ECHOT);
Serial.print("Trasero :");
Serial.println(distanciaT);
delay(100);
if(distanciaD<=30){
digitalWrite(13,HIGH);
}
else{
digitalWrite(13,LOW);
}
if(distanciaT<=30){
digitalWrite(12,HIGH);
}
else{
digitalWrite(12,LOW);
}
}
long medir(int PIN_TRIG,int PIN_ECHO)
{
long tiempo, distancia;
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH);
digitalWrite(PIN_TRIG, LOW);
tiempo = pulseIn(PIN_ECHO, HIGH);
distancia = (tiempo/2) / 29;
return distancia;
}
#define atras1 32
#define motor1 5
#define adelante2 31
#define atras2 33
#define motor2 6
#define inter 40
String readString;
int der,izq;
int velocidad1=0,velocidad2=0,acel1=51,acel2=acel1/4;
int valadelante1,valatras1;
int valadelante2,valatras2;
int valinter;
int i=0,j=0,a=0,m=0;
void setup(){
Serial.begin(9600);
Serial.println("todo va bien ... de momento");
pinMode(22,INPUT);
pinMode(24,INPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
pinMode(inter,INPUT);
pinMode(atras1,OUTPUT);
pinMode(motor1,OUTPUT);
pinMode(adelante1,OUTPUT);
pinMode(atras2,OUTPUT);
pinMode(motor2,OUTPUT);
pinMode(adelante2,OUTPUT);
digitalWrite(adelante1,HIGH);
digitalWrite(adelante2,HIGH);
digitalWrite(12,LOW);
digitalWrite(11,LOW);
}
void loop(){
valadelante1 = digitalRead(adelante1);
valatras1 = digitalRead(atras1);
valadelante2 = digitalRead(adelante2);
valatras2 = digitalRead(atras2);
valinter = digitalRead(inter);
der = digitalRead(22); //sensor derecho
izq = digitalRead(24); //sensor izquierdo
analogWrite(motor1,velocidad1);
analogWrite(motor2,velocidad2);
while (Serial.available()) {
delay(10);
if (Serial.available() >0) {
char c = Serial.read();
readString += c;
}
}
if(readString.length() >0){
if(readString == "aon"){
Serial.println("auto");
m=0;
a=1;
}
if(readString == "mon"){
Serial.println("manual");
a=0;
m=1;
}
if(readString == "3on"){ //adelante
Serial.println("adelante");
digitalWrite(atras1,LOW);
digitalWrite(atras2,LOW);
digitalWrite(adelante1,HIGH);
digitalWrite(adelante2,HIGH);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
velocidad1=velocidad2;
delay(400);
}
if(readString == "2on"){ //atras
Serial.println("atras");
digitalWrite(adelante1,LOW);
digitalWrite(adelante2,LOW);
digitalWrite(atras1,HIGH);
digitalWrite(atras2,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
velocidad1=velocidad2;
delay(400);
}
if(readString == "mas"){ //+velocidad
Serial.println("+");
velocidad1=velocidad1+acel1;
velocidad2=velocidad2+acel1;
if(velocidad1>=255){
velocidad1=255;
}
if(velocidad2>=255){
velocidad2=255;
}
}
if(readString == "menos"){
Serial.println("-");
velocidad1=velocidad1-acel1;
velocidad2=velocidad2-acel1;
if(velocidad1<=0){
velocidad1=0;
}
if(velocidad2<=0){
velocidad2=0;
}
}
if(readString == "izq"){
Serial.println("izquierda");
velocidad2=velocidad1/4;
}
if(readString == "der"){
Serial.println("derecha");
velocidad1=velocidad2/4;
}
readString="";
}
//*************************//
if(valinter==HIGH){
//Modo interruptor en on
if(a==1){
valadelante1 = digitalRead(adelante1);
valatras1 = digitalRead(atras1);
valadelante2 = digitalRead(adelante2);
valatras2 = digitalRead(atras2);
valinter = digitalRead(inter);
der = digitalRead(22); //sensor derecho
izq = digitalRead(24); //sensor izquierdo
analogWrite(motor1,velocidad1);
analogWrite(motor2,velocidad2);
//Entra en modo automatico
Serial.println("Automatico");
while (Serial.available()) {
delay(10);
if (Serial.available() >0) {
char c = Serial.read();
readString += c;
}
}
if(readString.length() >0){
if(readString == "aon"){
Serial.println("auto");
m=0;
a=1;
}
if(readString == "mon"){
Serial.println("manual");
a=0;
m=1;
}
readString="";
}
//Sensor delantero choca o izquierdo
if((((der==HIGH)&&(izq==HIGH))||((der==LOW)&&(izq==HIGH)))&&(valadelante1==HIGH)&&(valadelante2==HIGH)){
Serial.println("obstaculo grande, o izquierdo");
velocidad1 = velocidad1 - acel1;
velocidad2 = velocidad2 - acel1;
if((velocidad1<=0)&&(velocidad2<=0)){
velocidad1=0,velocidad2=0;
digitalWrite(adelante1,LOW);
digitalWrite(adelante2,LOW);
delay(700);
digitalWrite(atras1,HIGH);
digitalWrite(atras2,HIGH);
i = 1;
}
}
//atras y giro
if(((i>=1)&&(i<=8))&&(valatras1==HIGH)&&(valatras2==HIGH)){
Serial.println("vamos patras");
velocidad1 = velocidad1 + acel2;
velocidad2 = velocidad2 + acel1;
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
if(velocidad2>=255){
velocidad2=255;
}
if(velocidad1>=51){
velocidad1=51;
}
i++;
}
//parada y marcha alante
if(i>8){
Serial.println("fin de la marcha atras");
velocidad1=0;
velocidad2=0;
digitalWrite(atras1,LOW);
digitalWrite(atras2,LOW);
delay(700);
digitalWrite(adelante1,HIGH);
digitalWrite(adelante2,HIGH);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
i=0;
}
//Sin obstaculos
if(((der==LOW)&&(izq==LOW))&&(valadelante1==HIGH)&&(valadelante2==HIGH)){
Serial.println("No obstaculos");
velocidad1 = velocidad1 + acel1;
velocidad2 = velocidad2 + acel1;
if(velocidad1>=255){
velocidad1=255;
}
if(velocidad2>=255){
velocidad2=255;
}
}
//sensor derecho
if(((der==HIGH)&&(izq==LOW))&&(valadelante1==HIGH)&&(valadelante2==HIGH)){
Serial.println("obstaculo a la derecha");
velocidad1 = velocidad1 - acel1;
velocidad2 = velocidad2 - acel1;
if((velocidad1<=0)&&(velocidad2<=0)){
velocidad1=0,velocidad2=0;
digitalWrite(adelante1,LOW);
digitalWrite(adelante2,LOW);
delay(700);
digitalWrite(atras1,HIGH);
digitalWrite(atras2,HIGH);
j = 1;
}
}
//atras y giro a derecha
if(((j>=1)&&(j<=8))&&(valatras1==HIGH)&&(valatras2==HIGH)){
Serial.println("vamos patras otra vez");
velocidad1 = velocidad1 + acel1;
velocidad2 = velocidad2 + acel2;
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
if(velocidad2>=51){
velocidad2=51;
}
if(velocidad1>=255){
velocidad1=255;
}
j++;
}
//parada y marcha alante
if(j>8){
Serial.println("y paramos");
velocidad1=0;
velocidad2=0;
digitalWrite(atras1,LOW);
digitalWrite(atras2,LOW);
delay(700);
digitalWrite(adelante1,HIGH);
digitalWrite(adelante2,HIGH);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
j=0;
}
delay(500);
}
if(m==1){
valadelante1 = digitalRead(adelante1);
valatras1 = digitalRead(atras1);
valadelante2 = digitalRead(adelante2);
valatras2 = digitalRead(atras2);
valinter = digitalRead(inter);
der = digitalRead(22); //sensor derecho
izq = digitalRead(24); //sensor izquierdo
analogWrite(motor1,velocidad1);
analogWrite(motor2,velocidad2);
Serial.println(velocidad1);
Serial.println("*******");
Serial.println(velocidad2);
//Entra en modo manual para control en app
Serial.println("MANUAL");
while (Serial.available()) {
delay(10);
if (Serial.available() >0) {
char c = Serial.read();
readString += c;
}
}
if(readString.length() >0){
if(readString == "aon"){
Serial.println("auto");
m=0;
a=1;
}
if(readString == "mon"){
Serial.println("manual");
a=0;
m=1;
}
if(readString == "3on"){ //adelante
Serial.println("adelante");
digitalWrite(atras1,LOW);
digitalWrite(atras2,LOW);
digitalWrite(adelante1,HIGH);
digitalWrite(adelante2,HIGH);
delay(400);
}
if(readString == "2on"){ //atras
Serial.println("atras");
digitalWrite(adelante1,LOW);
digitalWrite(adelante2,LOW);
digitalWrite(atras1,HIGH);
digitalWrite(atras2,HIGH);
delay(400);
}
if(readString == "mas"){ //+velocidad
Serial.println("+");
velocidad1=velocidad1+acel1;
velocidad2=velocidad2+acel1;
if(velocidad1>=255){
velocidad1=255;
}
if(velocidad2>=255){
velocidad2=255;
}
}
if(readString == "menos"){
Serial.println("-");
velocidad1=velocidad1-acel1;
velocidad2=velocidad2-acel1;
if(velocidad1<=0){
velocidad1=0;
}
if(velocidad2<=0){
velocidad2=0;
}
}
readString="";
}
delay(500);
}
}
if(valinter==LOW){
//Modo off ni caso
Serial.println("OFF");
digitalWrite(8,LOW);
digitalWrite(9,LOW);
velocidad1=0;
velocidad2=velocidad1;
while (Serial.available()) {
delay(10);
if (Serial.available() >0) {
char c = Serial.read();
readString += c;
}
}
if(readString.length() >0){
if(readString == "aon"){
Serial.println("auto");
m=0;
a=1;
}
if(readString == "mon"){
Serial.println("manual");
a=0;
m=1;
}
readString="";
}
}
}
Programa Arduino Mega
#define adelante1 30#define atras1 32
#define motor1 5
#define adelante2 31
#define atras2 33
#define motor2 6
#define inter 40
String readString;
int der,izq;
int velocidad1=0,velocidad2=0,acel1=51,acel2=acel1/4;
int valadelante1,valatras1;
int valadelante2,valatras2;
int valinter;
int i=0,j=0,a=0,m=0;
void setup(){
Serial.begin(9600);
Serial.println("todo va bien ... de momento");
pinMode(22,INPUT);
pinMode(24,INPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
pinMode(inter,INPUT);
pinMode(atras1,OUTPUT);
pinMode(motor1,OUTPUT);
pinMode(adelante1,OUTPUT);
pinMode(atras2,OUTPUT);
pinMode(motor2,OUTPUT);
pinMode(adelante2,OUTPUT);
digitalWrite(adelante1,HIGH);
digitalWrite(adelante2,HIGH);
digitalWrite(12,LOW);
digitalWrite(11,LOW);
}
void loop(){
valadelante1 = digitalRead(adelante1);
valatras1 = digitalRead(atras1);
valadelante2 = digitalRead(adelante2);
valatras2 = digitalRead(atras2);
valinter = digitalRead(inter);
der = digitalRead(22); //sensor derecho
izq = digitalRead(24); //sensor izquierdo
analogWrite(motor1,velocidad1);
analogWrite(motor2,velocidad2);
while (Serial.available()) {
delay(10);
if (Serial.available() >0) {
char c = Serial.read();
readString += c;
}
}
if(readString.length() >0){
if(readString == "aon"){
Serial.println("auto");
m=0;
a=1;
}
if(readString == "mon"){
Serial.println("manual");
a=0;
m=1;
}
if(readString == "3on"){ //adelante
Serial.println("adelante");
digitalWrite(atras1,LOW);
digitalWrite(atras2,LOW);
digitalWrite(adelante1,HIGH);
digitalWrite(adelante2,HIGH);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
velocidad1=velocidad2;
delay(400);
}
if(readString == "2on"){ //atras
Serial.println("atras");
digitalWrite(adelante1,LOW);
digitalWrite(adelante2,LOW);
digitalWrite(atras1,HIGH);
digitalWrite(atras2,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
velocidad1=velocidad2;
delay(400);
}
if(readString == "mas"){ //+velocidad
Serial.println("+");
velocidad1=velocidad1+acel1;
velocidad2=velocidad2+acel1;
if(velocidad1>=255){
velocidad1=255;
}
if(velocidad2>=255){
velocidad2=255;
}
}
if(readString == "menos"){
Serial.println("-");
velocidad1=velocidad1-acel1;
velocidad2=velocidad2-acel1;
if(velocidad1<=0){
velocidad1=0;
}
if(velocidad2<=0){
velocidad2=0;
}
}
if(readString == "izq"){
Serial.println("izquierda");
velocidad2=velocidad1/4;
}
if(readString == "der"){
Serial.println("derecha");
velocidad1=velocidad2/4;
}
readString="";
}
//*************************//
if(valinter==HIGH){
//Modo interruptor en on
if(a==1){
valadelante1 = digitalRead(adelante1);
valatras1 = digitalRead(atras1);
valadelante2 = digitalRead(adelante2);
valatras2 = digitalRead(atras2);
valinter = digitalRead(inter);
der = digitalRead(22); //sensor derecho
izq = digitalRead(24); //sensor izquierdo
analogWrite(motor1,velocidad1);
analogWrite(motor2,velocidad2);
//Entra en modo automatico
Serial.println("Automatico");
while (Serial.available()) {
delay(10);
if (Serial.available() >0) {
char c = Serial.read();
readString += c;
}
}
if(readString.length() >0){
if(readString == "aon"){
Serial.println("auto");
m=0;
a=1;
}
if(readString == "mon"){
Serial.println("manual");
a=0;
m=1;
}
readString="";
}
//Sensor delantero choca o izquierdo
if((((der==HIGH)&&(izq==HIGH))||((der==LOW)&&(izq==HIGH)))&&(valadelante1==HIGH)&&(valadelante2==HIGH)){
Serial.println("obstaculo grande, o izquierdo");
velocidad1 = velocidad1 - acel1;
velocidad2 = velocidad2 - acel1;
if((velocidad1<=0)&&(velocidad2<=0)){
velocidad1=0,velocidad2=0;
digitalWrite(adelante1,LOW);
digitalWrite(adelante2,LOW);
delay(700);
digitalWrite(atras1,HIGH);
digitalWrite(atras2,HIGH);
i = 1;
}
}
//atras y giro
if(((i>=1)&&(i<=8))&&(valatras1==HIGH)&&(valatras2==HIGH)){
Serial.println("vamos patras");
velocidad1 = velocidad1 + acel2;
velocidad2 = velocidad2 + acel1;
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
if(velocidad2>=255){
velocidad2=255;
}
if(velocidad1>=51){
velocidad1=51;
}
i++;
}
//parada y marcha alante
if(i>8){
Serial.println("fin de la marcha atras");
velocidad1=0;
velocidad2=0;
digitalWrite(atras1,LOW);
digitalWrite(atras2,LOW);
delay(700);
digitalWrite(adelante1,HIGH);
digitalWrite(adelante2,HIGH);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
i=0;
}
//Sin obstaculos
if(((der==LOW)&&(izq==LOW))&&(valadelante1==HIGH)&&(valadelante2==HIGH)){
Serial.println("No obstaculos");
velocidad1 = velocidad1 + acel1;
velocidad2 = velocidad2 + acel1;
if(velocidad1>=255){
velocidad1=255;
}
if(velocidad2>=255){
velocidad2=255;
}
}
//sensor derecho
if(((der==HIGH)&&(izq==LOW))&&(valadelante1==HIGH)&&(valadelante2==HIGH)){
Serial.println("obstaculo a la derecha");
velocidad1 = velocidad1 - acel1;
velocidad2 = velocidad2 - acel1;
if((velocidad1<=0)&&(velocidad2<=0)){
velocidad1=0,velocidad2=0;
digitalWrite(adelante1,LOW);
digitalWrite(adelante2,LOW);
delay(700);
digitalWrite(atras1,HIGH);
digitalWrite(atras2,HIGH);
j = 1;
}
}
//atras y giro a derecha
if(((j>=1)&&(j<=8))&&(valatras1==HIGH)&&(valatras2==HIGH)){
Serial.println("vamos patras otra vez");
velocidad1 = velocidad1 + acel1;
velocidad2 = velocidad2 + acel2;
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
if(velocidad2>=51){
velocidad2=51;
}
if(velocidad1>=255){
velocidad1=255;
}
j++;
}
//parada y marcha alante
if(j>8){
Serial.println("y paramos");
velocidad1=0;
velocidad2=0;
digitalWrite(atras1,LOW);
digitalWrite(atras2,LOW);
delay(700);
digitalWrite(adelante1,HIGH);
digitalWrite(adelante2,HIGH);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
j=0;
}
delay(500);
}
if(m==1){
valadelante1 = digitalRead(adelante1);
valatras1 = digitalRead(atras1);
valadelante2 = digitalRead(adelante2);
valatras2 = digitalRead(atras2);
valinter = digitalRead(inter);
der = digitalRead(22); //sensor derecho
izq = digitalRead(24); //sensor izquierdo
analogWrite(motor1,velocidad1);
analogWrite(motor2,velocidad2);
Serial.println(velocidad1);
Serial.println("*******");
Serial.println(velocidad2);
//Entra en modo manual para control en app
Serial.println("MANUAL");
while (Serial.available()) {
delay(10);
if (Serial.available() >0) {
char c = Serial.read();
readString += c;
}
}
if(readString.length() >0){
if(readString == "aon"){
Serial.println("auto");
m=0;
a=1;
}
if(readString == "mon"){
Serial.println("manual");
a=0;
m=1;
}
if(readString == "3on"){ //adelante
Serial.println("adelante");
digitalWrite(atras1,LOW);
digitalWrite(atras2,LOW);
digitalWrite(adelante1,HIGH);
digitalWrite(adelante2,HIGH);
delay(400);
}
if(readString == "2on"){ //atras
Serial.println("atras");
digitalWrite(adelante1,LOW);
digitalWrite(adelante2,LOW);
digitalWrite(atras1,HIGH);
digitalWrite(atras2,HIGH);
delay(400);
}
if(readString == "mas"){ //+velocidad
Serial.println("+");
velocidad1=velocidad1+acel1;
velocidad2=velocidad2+acel1;
if(velocidad1>=255){
velocidad1=255;
}
if(velocidad2>=255){
velocidad2=255;
}
}
if(readString == "menos"){
Serial.println("-");
velocidad1=velocidad1-acel1;
velocidad2=velocidad2-acel1;
if(velocidad1<=0){
velocidad1=0;
}
if(velocidad2<=0){
velocidad2=0;
}
}
readString="";
}
delay(500);
}
}
if(valinter==LOW){
//Modo off ni caso
Serial.println("OFF");
digitalWrite(8,LOW);
digitalWrite(9,LOW);
velocidad1=0;
velocidad2=velocidad1;
while (Serial.available()) {
delay(10);
if (Serial.available() >0) {
char c = Serial.read();
readString += c;
}
}
if(readString.length() >0){
if(readString == "aon"){
Serial.println("auto");
m=0;
a=1;
}
if(readString == "mon"){
Serial.println("manual");
a=0;
m=1;
}
readString="";
}
}
}
El apartado de eficiencia energética lo he tenido en cuenta en mi proyecto en:
-El uso de fuentes conmutadas en vez de fuentes lineales, con alta eficiencia del 88%.
-El uso de diodos leds, que tienen mínimo consumo.
-La incorparación de un interruptor con el que poder apagar el coche cuando no se este usando.
Diagrama de bloques
Este es el diagrama de bloques donde se muestran todos los pasos por los que puede pasar el proyecto y su funcionamiento
Gantt Proyect
¿Qué tipo de acciones automáticas podrá realizar? ¿Y el control manual desde un portátil o un móvil?
ResponderEliminar