Construcció d'un cotxe teledirigit i autònom amb Arduino i Android


1. Introducció

El següent projecte té la finalitat didàctica de la construcció un cotxe teledirigit amb les següents característiques:
  • El comandament manual del cotxe es fa mitjançant l'acceleròmetre d'un mòbil Android. És a dir inclinant el mòbil a esquerra o dreta feim girar el cotxe, o inclinant envant i enrera el mòbil feim avançar o retrocedir el cotxe.
  • Disposa d'un mode automàtic (fa ús d'un mòdul d'ultrasons) per esquivar objectes de forma autònoma.
  • Disposa de clàxon accionat des de l'aplicació Android.



2. Components

Arduino Uno o equivalent
Microcontrolador Arduino Uno o equivalent. S'ha utilitzat en el projecte una placa genèrica compatible amb driver CH340
hc-06
Mòdul Bluetooth HC-06
hc-sr04
Mòdul d'ultrasons hc-sr04
servo sg90
Servo motor Tower Pro SG90 per la direcció
L293D
Controlador del motor L298N
brunzidor
Brunzidor
Motor CC amb reductora
Motor CC amb reductora per l'eix tractor
Condesandor 0.1uF
Condensador ceràmic de de 1uF o 0.1uF el qual s'ha de soldar entre els pols del motor de CC
Mini protoboard
Mini protoboard
jumpers
Jumpers de connexió ràpida
portapilas
Portapilas AA
rodes
Rodes

3. Mutatge del xassís i connexió dels components

front

lateral


superior

posterior

Connexió de l'alimentació.

Usarem 4 piles AA de 1,5Vper tant la tensió d'alimentació serà de 6V.
Del portapiles connectarem el positiu (cable vermell) a una filera superior o node positiu i el negre a una filera de la part de baix que serà el node negatiu o terra.
Del node positiu donarem tensió d'alimentació a l'arduino al pin Vin i del node negatiu connectarem a un dels dos pins GND de l'arduino.
Conectarem la sortida de 5V de l'arduino a una columna qualsevol de la protoboard per tal de poder alimentar a aquesta tensió el mòdul de Bluetooth HC-06, el servo i el mòdul d'ultrasons HC-S04.

alimentacio
Connexió del Servo per la direcció.


Connexió servo
Connexió del Mòdul Bluetooth

El pin Rx de l'Arduino s'ha de connectar al Tx del HC-06 i el Tx de l'Arduino al Rx del HC-06. Es important que aquests dos cables estiguin desconnectats quan és carrega un programa a l'Arduino. Si no els desconnectam la càrrega no es realitzarà

connexió bluetooth
Connexió del mòdul de ultrasons

Aquest mòdul no anirà connectar sobre la protoboard, sinó que haurà d'anar situat a la part davantera del cotxe a sobre la direcció.
  • El primer pin Vcc anirà conectat a la columna de la protoboard que hem tret els 5V de l'Arduino.
  • El pin Trigger anirà connectat al  pin digital  4 de l'arduino.
  • El pin Echo anirà connectat al  pin digital  3 de l'arduino.
  • El pin Gnd al node de terra de la protoboard.

hc-sr04

Connexió del L298N i el motor DC

  • "Salida al motor B" al motor
  • Connectar Vin i GND
  • ENB al pin digital 5 (D5)
  • IN3 al pin digital 10
  • IN4 al pin digital 11

connexio l293d
Connexió del brunzidor
buzzer


4. Aplicació Android amb MIT App Inventor 2

designer
blocsbt
accelerometre
events

5. Programació de la placa Arduino

Nota: Perquè el programa compili correctament s'ha de descarregar i instal.lar la llibreria Ultrasonic.h del següent enllaç: http://www.ardublog.com/library-for-arduino-ultrasonic-ranging-hc-sr04/

Codi font:

/************************************************************
 * Sketch per control per bluetooth d'un cotxe teledirit.
 * Data: 01/04/2016
 * Autor: T.Salas (salas.toni@gmail.com)
 ***********************************************************/

#include <Servo.h>
#include <Ultrasonic.h>

String readStr="";
String marxa;
String gir;
long intGir;
char c;

int servoPin = 9;
int claxonPin = 7;

int trigPin = 4;
int echoPin = 3;

int avantPin = 10;
int enreraPin = 11;
int potenciaPin = 5;

long distAturada = 40; //distancia a la que se aturarà quan detecte un obstable.

Servo servoMotor;
Ultrasonic ultrasonic(trigPin,echoPin); // (Trig PIN,Echo PIN)

boolean modeAutomatic = false;
//boolean modeAutomatic = true;

void setup(){

pinMode( avantPin, OUTPUT);
pinMode( enreraPin, OUTPUT);
pinMode( claxonPin, OUTPUT );
pinMode( trigPin, OUTPUT );
pinMode( echoPin, INPUT );
pinMode( potenciaPin, OUTPUT );

analogWrite( avantPin, 0 ); //inicialmet el cotxe estarà aturat
analogWrite( enreraPin, 0 );
analogWrite( potenciaPin, 0 );

digitalWrite( claxonPin, LOW );

Serial.flush();
delay(100);
servoMotor.attach( servoPin );
Serial.begin(9600);
delay(100);

servoMotor.write(90);
}

bool HihaObstable() {
long dist1;
dist1 = ultrasonic.Ranging(CM);
//Serial.println(dist1);
delay(60); //evita que es pugui tornar a solicitar la distància en un temps prudencial perquè funcioni correntamen el sr04
return( dist1 <= distAturada );
}

void pilotAutomatic() {

if( HihaObstable() ) {

//Atura
digitalWrite(avantPin,LOW);
digitalWrite(enreraPin,LOW);
analogWrite( potenciaPin, 0 );
delay(250);

//reculam
servoMotor.write(90);
//reculam 1 segon
digitalWrite(avantPin,LOW);
digitalWrite(enreraPin,HIGH);
analogWrite( potenciaPin, 255 );
delay(500);

//giram a esquerra
servoMotor.write(0);
//reculam 1 segon
digitalWrite(avantPin,LOW);
digitalWrite(enreraPin,HIGH);
analogWrite( potenciaPin, 255 );
delay(1000);
//aturam
servoMotor.write(90);
digitalWrite(avantPin,LOW);
digitalWrite(enreraPin,LOW);
analogWrite( potenciaPin, 0 );
delay(250);


} else {
//ves envant
servoMotor.write(90);
digitalWrite(avantPin,HIGH);
digitalWrite(enreraPin,LOW);
analogWrite( potenciaPin, 255 );
}
}

void loop() {

if (Serial.available() > 0) {

c = char(Serial.read());

if(c=='*'){

if( readStr.equals( "Claxon_on" ) ) {
digitalWrite( claxonPin, HIGH );

} else if( readStr.equals( "Claxon_off" ) ) {
digitalWrite( claxonPin, LOW );

} else if( readStr.equals( "Automatic_on" ) ) {
modeAutomatic = true;

} else if( readStr.equals( "Automatic_off" ) ) {
modeAutomatic = false;

} else if( modeAutomatic ) {
pilotAutomatic();

} else if( !modeAutomatic ) { //marxa#gir*

marxa = readStr.substring(0, readStr.indexOf('#'));

if( marxa.equals("Aturat")) {
digitalWrite(avantPin,LOW);
digitalWrite(enreraPin,LOW);
analogWrite( potenciaPin, 0 );
}
if( marxa.equals("Envant")) {
digitalWrite(avantPin,HIGH);
digitalWrite(enreraPin,LOW);
analogWrite( potenciaPin, 255 );
}
if( marxa.equals("Enrera")) {
digitalWrite(avantPin,LOW);
digitalWrite(enreraPin,HIGH);
analogWrite( potenciaPin, 255 );
}

gir=readStr.substring( readStr.indexOf('#')+1, readStr.length() );
intGir = gir.toInt();
intGir = map(intGir, -90, 90, 0, 180); //passam a graus.
servoMotor.write(intGir);
}

readStr="";

} else {

readStr += c;

}

} else if( modeAutomatic ) { //En mode automàtic l'app android no envia dades per bluetooth

pilotAutomatic();

}

}

6. Cotxes fets pels alumnes i cursa    

Pendent de publicació