Felix@cajon.es
Bueno estos días estado con un kit de arduino que me compre hace tiempo y que tenia abandonado, el kit traia un coche para su montaje "sin ningún tipo de instrucciones", sin programa para arduino. Buscando encontra alguna imagen y algún video de como quedaba montado con eso me hice una idea y monte la estructura como se conectaba y programaba el arduino eso ya no tenia ni idea, pues bueno me puesto manos a la obra y esto es lo que fue surgiendo.
El kit venia con el coche de tres ruedas, un arduino chino, un doble puente en h,un servo,
un shiel de sensores y un sensor de ultrasonidos.
Lo primero como no se nada de arduino investigo un poco, llegando a la conclusion que no me termina de convencer
que con un sensor cada vez que encuentre un ostaculo tenga que parar mover el servo con el sensnor de ultrasonidos
y buscar nueva ruta, por lo que decido montarlo con 3 sensores de ultrasonidos.
Empezando descargo el IDE de arduino y miro algunos ejemplos y algun video para familiarizarme con arduino,
conecto mi arduino creo el hola mundo de arduino compilo y no me sube, primer problema, consulatando al tener
el arduino chino hay que descargarse un driver, lo descargo y todo funciona bien.
Miro documentacion de los sensores ultrasonicos y trane cuatro patas una tierra otra 5v y las otras dos una
trig para enviar una señal y la cuarta eco que recive el eco de la señal mandada y ese numero entre 58.2 da
los cm que esta el ostaculo si da 0 o menos es que esta fuera de rango.
el puente h tiene dos conexiones laterales para cada motor y luego tres conectores uno tierra otro voltaje, que permite hasta 34 volitos "me parece no recuerdo bien"
y el tercero que si dejas puesto el jumper da 5 voltios de salida para alimentar el arduino por ejemplo,
y ademas nos trae dos jumper mas para activar los dos motores uno o ninguno y cuartro pines dos para cada motor
que son el sentido de giro del motor donde le mandaremos con un pin con pwd de arduino la velocidad de giro.
Sabiendo esto
monto todo lo cableo y lo programo.
Tambien le puse un sensor de infrarojos en en suelo para que detectaria si no habia suleo para evitar caidas como escaleras etc.. pero no fue util ya que si me las detectaba pero no le da tiempo a frenar por lo que se cae.
Otro problema que tuve es que cuando lo probava conectado al ordenador todo funcionaba correctamente y en cuanto lo ponía solo me iba mal, mire la salida de voltaje del puente h hacia el arduino y me daba 4 voltios lo cual no es suficiente para alimentar el arduino, la solución mas normal habria sido poner un cargador de 6 pilas en vez de cuatro pero en ese momento no disponia de ninguno por lo que le puse un power bank directo a la entrada del usb del arduino.
// Control de cochecito con tres sensores // Programado Félix rojo // Versión 0.1 //Ruedas int velocidadIzquierda; int velocidadDerecha; int sentidoIzquierda; int sentidoDerecha; // Adelante=0 y atras=1 //Sensores ultrasonicos int TRIGIZQUIERDA=2; int ECOIZQUIERDA=3; int TRIGCENTRO=4; int ECOCENTRO=5; int TRIGDERECHA=12; int ECODERECHA=13; //Motores int MOTORIADELANTE=11; int MOTORIATRAS=10; int MOTORDADELANTE=9; int MOTORDATRAS=6; //Sensor IR int IR=8; void setup() { //Puertos de sensores pinMode(TRIGIZQUIERDA,OUTPUT); pinMode(ECOIZQUIERDA,INPUT); pinMode(TRIGCENTRO,OUTPUT); pinMode(ECOCENTRO,INPUT); pinMode(TRIGDERECHA,OUTPUT); pinMode(ECODERECHA,INPUT); //Puertos de motores pinMode(MOTORIADELANTE,OUTPUT); pinMode(MOTORIATRAS,OUTPUT); pinMode(MOTORDADELANTE,OUTPUT); pinMode(MOTORDATRAS,OUTPUT); //Puerto ir antisuicidio pinMode(IR,INPUT); Serial.begin(9600); } void loop() { marcha();//El coche se mueve antisuicidio();//Sensor que controla si hay suelo delay(100); } //funcion antisuicidio void antisuicidio(){ int suelo=0; suelo=digitalRead(IR); if(suelo==HIGH){ Serial.println("cae "); atras(100); delay(2000); } } // Función de direccion void marcha(){ int centro=sensor(TRIGCENTRO,ECOCENTRO); int derecha=sensor(TRIGDERECHA,ECODERECHA); int izquierda=sensor(TRIGIZQUIERDA,ECOIZQUIERDA); Serial.print("Sensor izquierda -> "); Serial.println (izquierda); Serial.print("Sensor centro -> "); Serial.println (centro); Serial.print("Sensor derecha -> "); Serial.println (derecha); // velocidad dependiendo de la distancia al ostaculo frontal if(centro>100){ adelante(250);// si tiene más de un metro motores a tope Serial.println("tope"); } if(centro>=30 and centro<=100){ adelante(100);// si tiene menos de un metro motores a 100 Serial.println("lento"); } if(centro<30 and centro>10){ //miro donde tengo mas sitio y giro Serial.println(izquierda); Serial.println(centro); Serial.println(derecha); if (izquierda>derecha){ giroIzquierda(); }else{ giroDerecha(); } } if(centro<11){ atras(100); Serial.println(izquierda); Serial.println(centro); Serial.println(derecha); Serial.println("atras"); delay(1000); adelante(0); } centro=sensor(TRIGCENTRO,ECOCENTRO); derecha=sensor(TRIGDERECHA,ECODERECHA); izquierda=sensor(TRIGIZQUIERDA,ECOIZQUIERDA); if (derecha<=30){ giroIzqPeque(); } if (izquierda<=30){ giroDrcPeque(); } } //Funcion gira poco izquierda void giroIzqPeque(){ int velocidad=velocidadIzquierda; velocidadMotor(MOTORIADELANTE,0); Serial.println("giro izquierda fino"); delay(500); velocidadMotor(MOTORIADELANTE,velocidad); } //Funcion gira poco derecha void giroDrcPeque(){ int velocidad=velocidadDerecha; velocidadMotor(MOTORDADELANTE,0); Serial.println("giro derecha fino"); delay(500); velocidadMotor(MOTORDADELANTE,velocidad); } //Función giro izquierda void giroIzquierda(){ velocidadMotor(MOTORIADELANTE,0); velocidadMotor(MOTORDADELANTE,100); Serial.println("giro izquierda"); delay(900); velocidadMotor(MOTORIADELANTE,100); velocidadMotor(MOTORDADELANTE,100); } //Función giro derecha void giroDerecha(){ velocidadMotor(MOTORDADELANTE,0); velocidadMotor(MOTORIADELANTE,100); Serial.println("giro Derecha"); delay(900); velocidadMotor(MOTORIADELANTE,100); velocidadMotor(MOTORDADELANTE,100); } //Funcion que hace andar al cochecito hacia adelante // Parametro 1 velocidad void adelante(int velocidad){ velocidadMotor(MOTORIADELANTE,velocidad); velocidadMotor(MOTORDADELANTE,velocidad); } //Funcion que hace andar al cochecito hacia atras // Parametro 1 velocidad void atras(int velocidad){ velocidadMotor(MOTORIADELANTE,0); velocidadMotor(MOTORDADELANTE,0); velocidadMotor(MOTORIATRAS,velocidad); velocidadMotor(MOTORDATRAS,velocidad); } //funcion que recibe dos parametros y devuelve un entero que es la distancia // parametro 1 el trig del sensor // parametro 2 el eco del sensor int sensor(int trig,int eco){ int duracion=0; int distancia=0; digitalWrite(trig,HIGH); delay(1); digitalWrite(trig,LOW); duracion=pulseIn(eco,HIGH); distancia=duracion/58,2; if (distancia<=0){distancia=400;} return distancia; } // Función que controla los motores recibe dos parametros el motor y la velocidad // parametro 1 el motor // parametro 2 la velocidad void velocidadMotor(int motor,int velocidad){ //Si el motor izquierda va hacia adelante pare el giro hacia atras if (motor==MOTORIADELANTE){ analogWrite(MOTORIATRAS,0); sentidoIzquierda=0;//guardo la variable para saber que sentido voy velocidadIzquierda=velocidad;//guardo la velocidad } //Si el motor izquierda va hacia atras pare el giro hacia adelante if (motor==MOTORIATRAS){ analogWrite(MOTORIADELANTE,0); sentidoIzquierda=1;//guardo la variable para saber que sentido voy velocidadIzquierda=velocidad;//guardo la velocidad } //Si el motor derecha va hacia adelante pare el giro hacia atras if (motor==MOTORDADELANTE){ analogWrite(MOTORDATRAS,0); sentidoDerecha=0;//guardo la variable para saber que sentido voy velocidadDerecha=velocidad;//guardo la velocidad } //Si el motor derecha va hacia atras pare el giro hacia adelante if (motor==MOTORDATRAS){ analogWrite(MOTORDADELANTE,0); sentidoDerecha=1;//guardo la variable para saber que sentido voy velocidadDerecha=velocidad;//guardo la velocidad } //analogWrite(motor,0); analogWrite(motor,velocidad); }Descargar el archivo
Podeis descargar el archivo y subirlo a vuestro arduino, lo unico fijaros en el código fuente los pines que tiene conectados.
En el video se ve el resultado final.