Omet navegació

2. Control cotxe de 2 motors amb el Bluetooth i telèfon

Anem a crear una aplicació per controlar 2 motor reductors connectats a una Arduino UNO amb el shield Motor 1-2 i amb un integrat Bluetooth HC06 com mostra l'esquema següent:

Cotxe amb Bluetooth

Les potetes de l'integrat HC06 les connectem de la forma:

VCC a 5V d'Arduino

GND al comú d'Arduino

TX a port 2 d'Arduino

RX a port 3 d'Arduino

 D'aquesta forma els ports RX i TX d'Arduino que hi són al 0 i 1 queden lliures per comunicar amb l'ordinador amb el cable USB, així podem carregar programes sense haver de desconnectar els ports RX i TX del HC06 ja que els hem assignat al 2 i 3.

NOTA IMPORTANT: Cal que connectes les potes dels motors A i B de forma que al posar el programa de la secció 6bis2 i a la secció «void loop( ) actives sols les ordres següents:

motor1onH( );

motor2onH( );

i el cotxe vaja cap endavant. Fins que no es complisca aquesta condició no pots continuar seguint aquestes instruccions.

El programa per fer carregar a Arduino i fer interaccionar el cotxe amb el telèfon mòbil és aquest:


// Copyleft (C) 2019 Carles Ferrando Garcia
// License: GNU GPL v3 http://www.gnu.org/copyleft/gpl.html 
// funcions motor1 i motor2
// En aquest programa utilitzem les funcions motor1onH() , motor1off() , motor1on1() , motor1onHpols(x) , motor1onApols(x)  [on x varia de 0 a 100]
// En aquest programa utilitzem les funcions motor2onH() , motor2off() , motor2on1() , motor2onHpols(x) , motor2onApols(x)  [on x varia de 0 a 100]

//definim ports motor 1 o motor dret
//Recorda que el Motor 1 el fem girar horariament si activem el pin 8, i el fem girar anti horariament  si activem el pin 9. Si activem el PWM 10 i el motor 1 tindrà una ona quadrada
int contacte1motor1 = 8;    
int contacte2motor1 = 9;    
int activaPWMmotor1 = 10;

//definim ports motor 2 o motor esquerre
// Recorda que el Motor 2 el fem girar horariament si activem el pin 12, i el fem girar anti horariament si si activem el pin 13. Si activem el PWM 11 i el motor 1 tindrà una ona quadrada
int contacte1motor2 = 12;    
int contacte2motor2 = 13;    
int activaPWMmotor2 = 11;

#include <SoftwareSerial.h>
 
SoftwareSerial serial(2,3);
// Recorda posar al HC06 bluetooth RX pin 2 , TX pin 3
  
void setup() {
// Configura els ports motor 1 con eixides
pinMode(contacte1motor1, OUTPUT);
pinMode(contacte2motor1, OUTPUT);
pinMode(activaPWMmotor1, OUTPUT);

// Configura els ports motor 2 con eixides
pinMode(contacte1motor2, OUTPUT);
pinMode(contacte2motor2, OUTPUT);
pinMode(activaPWMmotor2, OUTPUT);
  
  serial.begin(9600); // Monitor bluetooth per connectar amb mòbil
  Serial.begin(9600); // Monitor Serial per comunicar amb l'ordinador
}
 
void loop() {
  if(serial.available())
  {
    char caracter= serial.read();
    Serial.println(caracter);
   switch(caracter){
      case '0':// Cotxe avant, els 2 motors en mode Horari
       motor1onH();
       motor2onH(); 
        break;
      case '1'://Cotxe enrere, el dos motors en mode antiHorari
       motor1onA();
       motor2onA(); 
        break;
      case '2'://Cotxe gira esquerra, motor 1 H i motor 2 aH
       motor1onH();
       motor2onA();
        break;
      case '3'://Cotxe gira dreta, motor 1 aH i motor 2 H
       motor1onA();
       motor2onH();
        break;
      case '4'://Cotxe atura motors, motor 1 i motor 2 aturats
        motor1off();
        motor2off();
        break;
   }//Final switch 
  } //Final if
 // Ací és pot afegir més codi
 
}// Final void loop

//___________ FUNCIONS MOTOR 1
      
//
//anem a crear la funció activar el motor 1 en sentit Horari  
void motor1onH()
    {
// engeguem  el motor1 en sentit Horari
digitalWrite(contacte1motor1, HIGH);   
digitalWrite(contacte2motor1, LOW);  
    }
      
//
//anem a crear la funció per aturar el motor 1
void motor1off()
  {
// desactivem el motor1 per poder parar-lo
digitalWrite(contacte1motor1, LOW);   
digitalWrite(contacte2motor1, LOW);
  }

//
//anem a crear la funció engega motor 1 en sentit Antihorari
void motor1onA()
  {
// engeguem el motor1 en sentit Antihorari
digitalWrite(contacte1motor1, LOW);  
digitalWrite(contacte2motor1, HIGH);     
   }


//Anem a crear la funcio engega el motor 1 en sentit Horari polsat al «pols %» polsat
void motor1onHpols (int pols)
  {
 float escriuD= pols/100.0*255.0;
 int escriuE=int(escriuD);  
// activa el PWMmotor1 per poder engegar-lo
digitalWrite(activaPWMmotor1, HIGH);
// engeguem  el motor1 en sentit enrere al pols% del puls possible
analogWrite(contacte1motor1,escriuE);   
analogWrite(contacte2motor1,0);  
  }


//Anem a crear la funcio engega el motor 1 en sentit Antihorari polsat al «pols %» polsat
void motor1onApols (int pols)
  {
 float escriuD= pols/100.0*255.0;
 int escriuE=int(escriuD);  
// activa el PWMmotor1 per poder engegar-lo
digitalWrite(activaPWMmotor1, HIGH);
// engeguem  el motor1 en sentit enrere al pols% del puls possible
analogWrite(contacte1motor1,0);   
analogWrite(contacte2motor1,escriuE);  
  } 
  
//_________ FUNCIONS MOTOR 2
      
//
//anem a crear la funció activar el motor 2 en sentit Horari  
void motor2onH()
    {
// engeguem  el motor 2 en sentit Horari
digitalWrite(contacte1motor2, HIGH);   
digitalWrite(contacte2motor2, LOW);  
    }
      
//
//anem a crear la funció per aturar el motor 1
void motor2off()
  {
digitalWrite(contacte1motor2, LOW);  
digitalWrite(contacte2motor2, LOW); 
  }

//
//anem a crear la funció engega motor 2 en sentit 1ntihorari
void motor2onA()
  {
// engeguem el motor1 en sentit Antihorari
digitalWrite(contacte1motor2, LOW);  
digitalWrite(contacte2motor2, HIGH);     
   }


//1nem a crear la funcio engega el motor 2 en sentit Horari polsat al «pols %» polsat
void motor2onHpols (int pols)
  {
 float escriuD2= pols/100.0*255.0;
 int escriuE2=int(escriuD2);  
// activa el PWMmotor2 per poder engegar-lo
digitalWrite(activaPWMmotor2, HIGH);
// engeguem  el motor1 en sentit enrere al pols% del puls possible
analogWrite(contacte1motor2,escriuE2);   
analogWrite(contacte2motor2,0);  
  }


//Anem a crear la funcio engega el motor 2 en sentit Antihorari polsat al «pols %» polsat
void motor2onApols (int pols)
  {
 float escriuD2= pols/100.0*255.0;
 int escriuE2=int(escriuD2);  
// activa el PWMmotor2 per poder engegar-lo
digitalWrite(activaPWMmotor2, HIGH);
// engeguem  el motor1 en sentit enrere al pols% del puls possible
analogWrite(contacte1motor2,0);   
analogWrite(contacte2motor2,escriuE2);  
  } 

Ara mateix sols et falta activar el servei Bluetooth al teu mòbil, i des de la Play Store instal·lar l'app «Bluetooth Terminal». Després aparelles amb el telèfon el dispositiu insegur HC06 que té per contrasenya 1234.

Bluetooth Terminal

A continuació envies consecutivament el text 0, 1, 2, 3, 4 (sense les comes) i prems «Send» després de cada número. Veuràs com els motors s'engeguen o s'aturen depenent del número que envies o s'aturem tots si prems i envies el 4.

Ara anem a obrir la interfície de l'AppInventor i anem a fer una aplicació senzilla per controlar els motors amb 5 botons.

Afegeix al dissenyador els elements següents:

- De «Interfaz de usuario» pren «SelectorDeLista» i anomena-lo SelectBluetooth

- De «Disposición» pren «Disposiciónvertical» i no cal que li canvie el nom. Els botons i etiquetes aniran tots dins de la disposició vertical.

- De «Interfaz de usuario» pren 4 «Botón» i anomena-los btAvant , btEnrere, btGiraDreta, btGiraEsquerra. Posa en cada botó una imatge feta amb GIMP amb una fletxa que mostre cap a on va el cotxe.

- De «Interfaz de usuario» pren 1 «Botón» i anomena-lo btAtura. Canvia la forma i el color per deixar-lo roig.

- De «Interfaz de usuario» pren 1 «Etiqueta» i anomena-lo «etiqueta» però no li poses títol , deixa-la sense contingut « ».

- De «Conectividad» pren «ClienteBluetooth» i solta-la dins de la pantalla «Screen1» que anirà a la secció «Componentes no visibles».

- De «Sensores» pren «Reloj» i solta-la dins de la pantalla «Screen1» que anirà a la secció «Componentes no visibles».

L'aspecte serà aquest:

appInvent-disenyador Cotxe_Bluetooth

Ara canvia el dissenyador per la finestra de «Blocks» i programa els blocs següents:

appInvent blocs1-2-3 Cotxe

appInvent blocs 4-5-6 Cotxe

appInvent bloc7 Cotxe

A continuació anem a «Generar» i premem el botó per generar la APP en format APK.

genera APK Cotxe

Després quan isca la finestra per escanejar el codi QR ho escanegem.

appInvent codi generat Cotxe

Carreguem l'aplicació al telèfon, li donem permisos per executar-se i l'executem.

Premem el selector de Bluetooth i triem aparellar el bluetooth HC06 de l'Arduino.

BTT_No Connect Cotxe

El HC-06 és un integrat de classe insegura amb contrasenya 1234.

BTT_Scan Cotxe

Després ja podem provar el botons per engegar i controlar el cotxe o aturar-lo.

BTT Connect Cotxe

Cal tindre en compte que l'abast del Bluetooth són de 10 metres. No pots superar aquesta distancia per controlar el cotxe. Hi ha altres models que arriben als 200 metres però són lògicament més cars.