# | Material | Descripción |
---|---|---|
1 | Arduino Un o similar. Aquesta sessió accepta qualsevol altre model d'Arduino. | |
2 | Alguns cables de Protoboard. | |
3 | Un Shield Ardumoto. | |
4 | Un parell de motors CC. | |
5 | Bluetooth HC-06. | |
6 | Portapiles per a 2 bateríes 18650 de liti. | |
7 | Bateries recarregables 18650. |
Ací teniu els enllaços perquè us descarregueu els arxius en 3D
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.
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.
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.
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:
Imprimim la base de la quadriga:
Soldem i connectem el bluetooth. No us preocupeu, a baix pose l'esquema.
I l'esquema del circuit:
Códi del App Inventor 2.
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
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:
Pantalla de conducció manual, necessitarem:
I el seu codi:
I per a finalitzar veurem la pantalla de conducció automàtica, necessitarem:
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 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í:
#includeSoftwareSerial 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); } }