O control dos motores
Imos facer unhas prácticas para controlar o movemento do mClon.
O controlador de motores:
Para poder programar o movemento dos motores debemos dar as instrucións precisas para que os motores se movan nun sentido ou no outro e a unha velocidade determinada.
No mClon o motor esquerdo polos pins AIN1(D7, sentido de xiro) e PWMA (D6, velocidade) e o motor dereito está controlado polos pins do driver BIN1(D4, sentido de xiro) e PWMB (D5, velocidade)
Declaración de variables
O primeiro que facemos, no inicio do programa, é definir os pins da placa cos que imos actuar.
const int PWMA = 6; // Pins motor esquerdo (m1) const int AIN1 =7; const int PWMB = 5; // Pins motor dereito (m2) const int BIN1 =4;
Configuración
Temos que configurar os pins anteriores como saída, pois por defecto os pins dixitais considéranse entradas.
Tamén imos poñer a instrución de que agarde a que o pulsador estea premido para evitar que comece a moverse nada máis cargar o programa e nos dea tempo a poñelo no chan. Poñémolo dentro do setup porque queremos que se execute unha soa vez.
O pulsador está conectado no pin analóxico A7 en pull-up. Os valores que nos pode dar son 0 cando está premido e cerca de 1023 cando non. A instrución while fai que agardemos mentres se cumpra que o pulsador está desactivado.
// Configuración: void setup(){ pinMode(PWMA, OUTPUT); // Configuramos os pins pinMode(AIN1, OUTPUT); pinMode(PWMB, OUTPUT); pinMode(BIN1, OUTPUT); while(analogRead(A7)>100); // agardamos mentres non se pulse o botón }
Funcións
Tal e como están conectados os motores no mClon o motor esquerdo móvese cara adiante cando AIN1=0, e cara atrás cando AIN1=1, e o motor dereito ao revés, móvese cara adiante cando BIN1=1 e cara atŕas cando BIN1=0. Pode ser moi lioso programar o movemento dando estes valores, así que imos crear unhas funcións para cada un dos motores de maneira que poidamos controlalos de forma sinxela.
Para indicar o sentido de xiro escribimos 1 cando queremos ir cara adiante e -1 cara atrás
Para indicar a velocidade introducimos un valor de 0 a 255
// motor esquerdo m1 void m1(int sentido, int velocidade) { if (sentido > 0){ digitalWrite(AIN1, 0); } else{ digitalWrite(AIN1, 1); } analogWrite(PWMA, velocidade); } // Motor dereito m2 void m2(int sentido, int velocidade) { if (sentido > 0){ digitalWrite(BIN1, 1); } else{ digitalWrite(BIN1, 0); } analogWrite(PWMB, velocidade); }
Bucle
Dentro do bucle loop() escribimos todas as instrucións que queremos que se executen continuamente.
Por exemplo, se queremos que o robot se mova cara adiante durante 1 segundo a velocidade media, cara atrás outro segundo e así indefinidamente invocaremos as funcións m1 e m2 dos motores da seguinte maneira:
void loop() { //avanza 1 segundo m1(1, 125); m2(1, 125); delay(1000); //retrocede 1 segundo m1(-1, 125); m2(-1, 125); delay(1000); }
O programa completo quedaría así:
// Declaración de variables: const int PWMA = 6; // Pins motor esquerdo const int AIN1 =7; const int PWMB = 5; // Pins motor dereito const int BIN1 =4; // Configuración: void setup(){ pinMode( PWMA, OUTPUT); // Configuramos os pins pinMode( AIN1, OUTPUT); pinMode( PWMB, OUTPUT); pinMode( BIN1, OUTPUT); while(analogRead(A7)>100); // agardamos mentres non se pulse o botón } /***** Funcións: *****/ // sentido: adiante: 1, atrás: -1 // velocidade: 0 -> 255 // motor esquerdo m1 void m1(int sentido, int velocidade) { if (sentido > 0){ digitalWrite(AIN1, 0); } else{ digitalWrite(AIN1, 1); } analogWrite(PWMA, velocidade); } // Motor dereito m2 void m2(int sentido, int velocidade) { if (sentido > 0){ digitalWrite(BIN1, 1); } else{ digitalWrite(BIN1, 0); } analogWrite(PWMB, velocidade); } /***** Bucle *****/ void loop() { //avanza 1 segundo m1(1, 100); m2(1, 100); delay(1000); //retrocede 1 segundo m1(-1, 100); m2(-1, 100); delay(1000); }
Agora falta que lle indiques que xire manténdose na súa posición (un motor vai cara adiante e outro cara atrás) ou que avance xirando (unha roda vai a máis velocidade cá outra). Deberás completar o programa anterior para facer as seguintes prácticas.
Prácticas:
1. Unha nova función: Cambia as funcións dos motores de xeito que poidamos programalos executando as instrucións m1(100); para que o motor esquerdo se mova cara adiante e m1(-100); para que se mova cara atrás. Fai o mesmo coa función do motor dereito.
2. Unha función para os dous motores: Cambia as funcións de xeito que con unha única instrución controlemos o movemento de ambos motores. Por exemplo, ao escribir m(100, -100); o motor esquerdo avanza e o motor dereito retrocede a velocidade 100.
3. Límites: Os sinais PWM só poden tomar valores desde 0 a 255. Engade o necesario para que se alguén escribe un valor maior, por exemplo m1(500); a instrución velocidade tome o valor 255.
4. Movemento: Deseña un programa que execute as seguintes accións consecutivas:
Cando prememos no pulsador:
-
O robot avanza durante 1 segundo.
-
O robot xira 1 segundo cara á esquerda
-
O robot retrocede durante 1 segundo
-
O robot xira 1 segundo cara á dereita
-
O robot avanza xirando cara á esquerda durante 2 segundos
-
O robot avanza xirando cara á dereita durante 2 segundos
-
O robot detense.
Retos:
Rodear lata
Sitúa o robot a 15 cm dunha lata de refresco. Debes programar os movementos necesarios para que a rodee sen tocala e, unha vez rodeada, avance na mesma dirección que tiña inicialmente.
Xira cara á esquerda -> avanza -> avanza xirando cara á dereita -> xira cara á esquerda -> avanza, … Controla as velocidades dos motores e os tempos para que o robot rodee a lata sen chocar contra ela.