Automatitza una quadriga

Objectius

  • Presentarem el chip L298, dual full bridge per a control de motors.
  • Presentar el Shield Ardumoto.
  • Consum de fins 2 Ampers per cada motor.
  • Utilització del bluetooth.
  • Programació d'aplicació de conducció amb Appinventor.
  • Programar dos formes de conducció:
    • Conducció manual
    • Conducció automática.

Material necessari

# Material Descripción
1 placa arduino Arduino Un o similar. Aquesta sessió accepta qualsevol altre model d'Arduino.
2 placa arduino Alguns cables de Protoboard.
3 placa arduino Un Shield Ardumoto.
4 placa arduino Un parell de motors CC.
5 placa arduino Bluetooth HC-06.
6 placa arduino Portapiles per a 2 bateríes 18650 de liti.
7 placa arduino Bateries recarregables 18650.

Impressió 3D per a construir la teua pròpia quadriga.

Ací teniu els enllaços perquè us descarregueu els arxius en 3D

placa arduino

Muntatge y esquema

Aquest shield per a Arduino és capaç de controlar dos motors de corrent continu. Aquest basat en el robust xip L298 i pot proporcionar fins a 2A per canal. La placa pren l'alimentació del pin VIN de Arduino i inclou un LED blau i un altre groc per a indicar el sentit de gir en tot moment. Totes les linies del driver estan protegides per díodes per a evitar corrents inversos que puguen danyar-ho. Originalment dissenyat per SparkFun.

placa arduino

Inclou dos únics bridge, la qual cosa ens limita a dos motors CC o a un únic pas a pas, però a canvi tenim tot el control mitjançant pins directes d'Arduino.

També podem apreciar que disposa d'una xicoteta àrea de proves i prototips, on podrem soldar components el bluetooth.

El shield utilitza 2 pines d'Arduino per a controlar cada motor. Un regula l'adreça de gir i l'altre la velocitat mitjançant un senyal PWM, la qual cosa fan un total de 4 pins deixant lliures la resta.

placa arduino

El Ardumoto Shield es reserva els pins 12 i 13 per a controlar la velocitat, i els pins 3 i 11, per a controlar el sentit de gir dels motors A i B respectivament.

PIN ARDUINO US NOTES
3 PWM Motor A Valors de 0 a 255
11 PWM Motor B Valors de 0 a 255
12 Sentit Motor A Es un Bool True / False
13 Sentit Motor B Es un Bool True / False

En el costat esquerre de Ardumoto es poden veure les connexions per als motors A i B, així com un connector per a alimentar els motors independentment de l'alimentació d'Arduino.

placa arduino

No té massa importància en quina ordre connecteu els cables dels motors, sempre que ho tingueu clar. Us recomane que us fixeu en els colors dels cables i connecteu ambdues parells d'igual manera per a evitar sorpreses.

Fixar-vos també, que als laterals d'on connectem els motors hi ha un parell de LEDs de colors que indiquen l'estat del motor i el seu sentit de gir.

Les primeres connexions i mentre fem la nostra base són les següents:

placa arduino

Imprimim la base de la quadriga:

placa arduino

Soldem i connectem el bluetooth. No us preocupeu, a baix pose l'esquema.

placa arduino

I l'esquema del circuit:

placa arduino

Porgrama de conducció.

Códi del App Inventor 2.

placa arduino placa arduino

Pantalla principal, utilitzarem un botó amb un a imatge com a presentació si l'usuari prem el botó passarem a la següent pantalla, si no ho fa passats 3 segons passarem de forma automàtica

placa arduino placa arduino

Segona pantalla, l'usuari podrà seleccionar la manera de conducció: manual o automàtica. Utilitzarem dos botons amb els seus corresponents esdeveniments per a accedir a una pantalla o a una altra:

placa arduino placa arduino

Pantalla de conducció manual, necessitarem:

placa arduino
  • 1 SelectorDeLista, ho cridem conectar.
  • 1º Botó, ho cridem desconectar.
  • Una disposició en taula (3 files i 3 columnes).
  • 5 Botons, endavant, arrere, dreta, esquerra y parar.
  • Un ClienteBluetooh1.
  • Un Notificador1.

I el seu codi:

placa arduino
placa arduino
placa arduino

I per a finalitzar veurem la pantalla de conducció automàtica, necessitarem:

placa arduino
  • 1 SelectorDeLista, ho cridem conectar.
  • 1 Botó, ho cridem desconnectar.
  • Per a l'animació s'ha optat per pujar diverses imatges i anar canviant-les mitjançant un rellotge.
  • 1 botó d'inici i parar, un sol botó amb les dues funcionalitats.
  • Un ClienteBluetooh1.
  • Un Notificador1.

I el codi:

Pots descarregar el codi de l'aplicació en AppInventor2 en el següent enllaç: codi

Pots descarregar l'aplicació i instal·lar-la en el teu mòbil, en el següent enllaç: aplicació

El programa de control

El shield Ardumoto usa simplement els pines de control que es mostra en la taula de més amunt, per la qual cosa no requereix cap llibreria especial per a moure els motors sinó que utilitzem Arduino i els seus pins per a controlar el L298N i per tant la velocitat i sentit dels motors connectats.

El programa que ens presenta SparkFun és d'allò més senzill i ho anem a utilitzem com a exemple de control. Comencem amb algunes definicions:

    #include 
// definim el nostre bluetooth
SoftwareSerial btl (4, 2);
int val;

#define CW  0     //Sentido 1
#define CCW 1    //Sentido 2

#define MOTOR_A 0
#define MOTOR_B 1

const byte PWMA = 3;   // control velocitat motor A
const byte PWMB = 11; // control velocitat motor B
const byte DIRA = 12;    // Direcció motor A
const byte DIRB = 13;    // Direcció motor B


void setup()
{
  // definim els pins com a eixida
  pinMode(PWMA, OUTPUT);
  pinMode(PWMB, OUTPUT);
  pinMode(DIRA, OUTPUT);
  pinMode(DIRB, OUTPUT);
 
 // posem a low els pins del ardumoto
  digitalWrite(PWMA, LOW);
  digitalWrite(PWMB, LOW);
  digitalWrite(DIRA, LOW);
  digitalWrite(DIRB, LOW);

  // inicialissem el bluetooth
  btl.begin(9600);
}
        

I ara anem a definir un parell de funcions senzilles. La primera la utilitzem per a arrancar un dels motors (paràmetre motor) amb un sentit (dir) i velocitat donats (spd):

 void accionMotor(byte motor, byte dir, byte spd){ 

if (motor == MOTOR_A){
   digitalWrite(DIRA, dir);
   analogWrite(PWMA, spd);
  }
  else if (motor == MOTOR_B){
            digitalWrite(DIRB, dir);
            analogWrite(PWMB, spd);
       }
}
        

I la segona és encara més senzilla, per a parar un motor:

void stopMotor(byte motor){
  accionMotor(motor, 0, 0); }
        

Ara farem diverses funcions per a fer que circule cap a avant, arrere, dreta, esquerra i parar:

void adelante(){
  accionMotor(MOTOR_A, CCW, 255);
  accionMotor(MOTOR_B, CCW, 255);
}

void atras(){
  accionMotor(MOTOR_A, CW, 255);
  accionMotor(MOTOR_B, CW, 255);
}

void derecha(){
  accionMotor(MOTOR_B, CCW, 255);
  accionMotor(MOTOR_A, CCW, 0);
}
void izquierda(){
  accionMotor(MOTOR_A, CCW, 255);
  accionMotor(MOTOR_B, CCW, 0);
}

void parar(){
  stopMotor(MOTOR_A);
  stopMotor(MOTOR_B);
}
        

Per a acabar el cos principal del programa, llegirà les entrades per bluetooth i executarem les accions corresponents

void loop() {  
        if (btl.available() ){
                                  val = btl.read();
                                 delay(25);
        }
        if (val == '1'){
                 adelante();
        }
        if (val == '2'){
                         atras();
        }
        if (val == '3'){
                         izquierda();
        }
        if (val == '4'){
                        derecha();
        }
        if (val == '5'){
                       parar();
        }
       if (val == '6'){
               adelante();
               delay(3000);
               izquierda();
               delay(1000);
       }
   }
        

Podem connectar un mòdul de bluetooth, i poder controlar la nostra cuadriga amb una aplicació de mòbil.

Connectant el mòdul en els pins 2 i 4 el programa quedaria així:

#include 
SoftwareSerial btl (4, 2);
int val;
#define CW  0     //Sentido 1
#define CCW 1     //Sentido 2

#define MOTOR_A 0
#define MOTOR_B 1

const byte PWMA = 3; //control velocitat motor A
const byte PWMB = 11; //control velocitat motor B
const byte DIRA = 12; //Direcció motor A
const byte DIRB = 13; //Directio motor B




void setup()
{
  // definim els pins com a eixida
  pinMode(PWMA, OUTPUT);
  pinMode(PWMB, OUTPUT);
  pinMode(DIRA, OUTPUT);
  pinMode(DIRB, OUTPUT);

  // posem a low els pins del ardumoto
  digitalWrite(PWMA, LOW);
  digitalWrite(PWMB, LOW);
  digitalWrite(DIRA, LOW);
  digitalWrite(DIRB, LOW);

  // inicialissem el bluetooth
  btl.begin(9600);
}

void stopMotor(byte motor) {
  accionMotor(motor, 0, 0);
}

void accionMotor(byte motor, byte dir, byte spd) {
  if (motor == MOTOR_A) {
    digitalWrite(DIRA, dir);
    analogWrite(PWMA, spd);
  }
  else if (motor == MOTOR_B) {
    digitalWrite(DIRB, dir);
    analogWrite(PWMB, spd);
  }
}

void adelante() {
  accionMotor(MOTOR_A, CCW, 255);
  accionMotor(MOTOR_B, CCW, 255);
}

void atras() {
  accionMotor(MOTOR_A, CW, 255);
  accionMotor(MOTOR_B, CW, 255);
}

void derecha() {
  accionMotor(MOTOR_B, CCW, 255);
  accionMotor(MOTOR_A, CCW, 0);
}
void izquierda() {
  accionMotor(MOTOR_A, CCW, 255);
  accionMotor(MOTOR_B, CCW, 0);
}

void parar() {
  stopMotor(MOTOR_A);
  stopMotor(MOTOR_B);
}

void loop() {
  if (btl.available() ) {
    val = btl.read();
    delay(25);
  }
  if (val == '1') {
    adelante();
  }
  if (val == '2') {
    atras();
  }
  if (val == '3') {
    izquierda();
  }
  if (val == '4') {
    derecha();
  }
  if (val == '5') {
    parar();
  }
  if (val == '6') {
    adelante();
    delay(3000);
    izquierda();
    delay(1000);
  }
}