Introducció a la robòtica en trenta-una classes/Setzè dia: controlar cotxe amb motors pas a pas des del mòbil o tauleta

Avui, continuant l’aplicació que vam començar la setmana passada, hem afegit botons per a poder controlar el cotxe per bluetooth. Obrim App Inventor, veiem el projecte que ja teníem, fem Project, Save project as, i donem un nom nou. Això ho fem per tenir desat el vell projecte, i poder-lo recuperar. Bé, ara haurem de fer lloc. Esborrem el botó llistar i el quadre de texte, que ja no ens calen, ara que ja hem comprovat que podem connectar-nos al nostre mòdul bluetooth. Haurem de posar quatre botons nous, que serviran per anar endavant, endarrera, a esquerra i a dreta. Com que ens agradaria repartir els quatre botons en un rombe, aprofitarem les eines que té de graella per a fer una graella de 3×3, i posar les quatre tecles en cadascuna de les cel.les del mig de cada un dels quatre costats. De l’esquerra, despleguem layout, i arrosseguem TableArrangement. A la dreta, canviem columns a 3 i rows a 3. Arrosseguem un botó a dins d’aquest layout que hem definit, en cadascun dels quatre punts cardinals. Etiquetem cada botó amb la direcció que li correspon: endavant, endarrera, esquerra, dreta. Per tal que ens sigui més fàcil de trobar cada un dels botons quan editem els blocs, els canviem el nom button.. pel de la seva funció. La cosa, fins ara, queda com la imatge que segueix:

creem botons per a dirigir el cotxe
creem botons per a dirigir el cotxe

Ara, cal programar el comportament de cada tecla. Per exemple, farem que en prémer, respectivament endavant, endarrera, esquerra, dreta, s’envii a l’arduino 1, 2, 3, i 4. En deixar cadascuna de les tecles, farem enviar un 0, per tal d’informar que ja no volem anar

més en aquella direcció, i fer aturar els motors.

Anem a blocks, cliquem a endavant, i arrosseguem when endavant.TouchDown. Cliquem a BluetootClient1, i arrosseguem CallBluetoothClient1.Send1ByteNumber a dins de l’anterior. Cliquem a math i arrossegem la peça amb el 0 fins que encaixi al costat dret de

l’anterior. Cliquem al 0 i hi posem un 1.

Anem a blocks, cliquem a endavant, i arrosseguem when endavant.TouchUp. Cliquem a BluetootClient1, i arrosseguem CallBluetoothClient1.Send1ByteNumber a dins de l’anterior. Cliquem a math i arrossegem la peça amb el 0 fins que encaixi al costat dret de

l’anterior.

Amb això, ja tenim la funcionalitat de la tecla endavant. Fem el mateix per a les altres tres tecles. Ens queda quelcom així:

donem funcionalitat als botons
donem funcionalitat als botons

Una vegada ho tenim, tornem a build, crear QR, escanejem amb el mòbil o tauleta, i instal.lem aquesta nova versió.

Ara ens cal el programa de l’arduino: partim del muntatge del sisè dia de classe, i el programa més complet del setè dia de classe. Hi afegim el bluetooth del dia anterior. Ho trobareu tot en els blog de les classes passades.

El programa ens ha quedat:

#include <SoftwareSerial.h>
SoftwareSerial BTSerial(10, 11); // RX | TX
int ordre; // variable on desarem la ordre rebuda
void setup() { // configurem els 8 pins que emprem com a sortides
    pinMode(2,OUTPUT);
    pinMode(3,OUTPUT);
    pinMode(4,OUTPUT);
    pinMode(5,OUTPUT);pinMode(6,OUTPUT);
    pinMode(7,OUTPUT);
    pinMode(8,OUTPUT);
    pinMode(9,OUTPUT);
    BTSerial.begin(9600);
}

void loop() { // llegim el port sèrie i actem segons el número rebut
    if (BTSerial.available()){
        ordre=BTSerial.read();
    }
    if (ordre==1){
        endavant(5); // anem 5 passos a l’esquerra
    }
    if (ordre==2){
        endarrera(5); // anem 5 passos a l’esquerra
    }
    if (ordre==3){
        esquerra(5); // anem 5 passos a l’esquerra
    }
    if (ordre==4){
        dreta(5); // anem 5 passos a l’esquerra
    }
}

void esquerra(int passos) {
    while(passos >0){
        digitalWrite(2,1);
        digitalWrite(3,0);
        digitalWrite(4,0);
        digitalWrite(5,0);
        digitalWrite(6,1);
        digitalWrite(7,0);
        digitalWrite(8,0);
        digitalWrite(9,0);
        delayMicroseconds(1000);
        digitalWrite(2,1);
        digitalWrite(3,1);
        digitalWrite(4,0);
        digitalWrite(5,0);
        digitalWrite(6,1);
        digitalWrite(7,1);
        digitalWrite(8,0);
        digitalWrite(9,0);
        delayMicroseconds(1000);
        digitalWrite(2,0);
        digitalWrite(3,1);
        digitalWrite(4,0);
        digitalWrite(5,0);
        digitalWrite(6,0);
        digitalWrite(7,1);
        digitalWrite(8,0);
        digitalWrite(9,0);
        delayMicroseconds(1000);
        digitalWrite(2,0);
        digitalWrite(3,1);
        digitalWrite(4,1);
        digitalWrite(5,0);
        digitalWrite(6,0);
        digitalWrite(7,1);
        digitalWrite(8,1);
        digitalWrite(9,0);
        delayMicroseconds(1000);
        digitalWrite(2,0);
        digitalWrite(3,0);
        digitalWrite(4,1);
        digitalWrite(5,0);
        digitalWrite(6,0);
        digitalWrite(7,0);
        digitalWrite(8,1);
        digitalWrite(9,0);
        delayMicroseconds(1000);
        digitalWrite(2,0);
        digitalWrite(3,0);
        digitalWrite(4,1);
        digitalWrite(5,1);
        digitalWrite(6,0);
        digitalWrite(7,0);
        digitalWrite(8,1);
        digitalWrite(9,1);
        delayMicroseconds(1000);
        digitalWrite(2,0);
        digitalWrite(3,0);
        digitalWrite(4,0);
        digitalWrite(5,1);
        digitalWrite(6,0);
        digitalWrite(7,0);
        digitalWrite(8,0);
        digitalWrite(9,1);
        delayMicroseconds(1000);
        digitalWrite(2,1);
        digitalWrite(3,0);
        digitalWrite(4,0);
        digitalWrite(5,1);
        digitalWrite(6,1);
        digitalWrite(7,0);
        digitalWrite(8,0);
        digitalWrite(9,1);
        delayMicroseconds(1000);
        passos=passos-1;
    }
}
void dreta(int passos) {
    while(passos >0) {
        digitalWrite(2,0);
        digitalWrite(3,0);
        digitalWrite(4,0);
        digitalWrite(5,1);
        digitalWrite(6,0);
        digitalWrite(7,0);
        digitalWrite(8,0);
        digitalWrite(9,1);
        delayMicroseconds(1000);
        digitalWrite(2,0);
        digitalWrite(3,0);
        digitalWrite(4,1);
        digitalWrite(5,1);
        digitalWrite(6,1);
        digitalWrite(7,0);
        digitalWrite(8,1);
        digitalWrite(9,1);
        delayMicroseconds(1000);
        digitalWrite(2,0);
        digitalWrite(3,0);
        digitalWrite(4,1);
        digitalWrite(5,0);
        digitalWrite(6,0);
        digitalWrite(7,0);
        digitalWrite(8,1);
        digitalWrite(9,0);
        delayMicroseconds(1000);
        digitalWrite(2,0);
        digitalWrite(3,1);
        digitalWrite(4,1);
        digitalWrite(5,0);
        digitalWrite(6,0);
        digitalWrite(7,1);
        digitalWrite(8,1);
        digitalWrite(9,0);
        delayMicroseconds(1000);
        digitalWrite(2,0);
        digitalWrite(3,1);
        digitalWrite(4,0);
        digitalWrite(5,0);
        digitalWrite(6,0);
        digitalWrite(7,1);
        digitalWrite(8,0);
        digitalWrite(9,0);
        delayMicroseconds(1000);
        digitalWrite(2,1);
        digitalWrite(3,1);
        digitalWrite(4,0);
        digitalWrite(5,0);
        digitalWrite(6,1);
        digitalWrite(7,1);
        digitalWrite(8,0);
        digitalWrite(9,0);
        delayMicroseconds(1000);
        digitalWrite(2,1);
        digitalWrite(3,0);
        digitalWrite(4,0);
        digitalWrite(5,0);
        digitalWrite(6,1);
        digitalWrite(7,0);
        digitalWrite(8,0);
        digitalWrite(9,0);
        delayMicroseconds(1000);
        digitalWrite(2,1);
        digitalWrite(3,0);
        digitalWrite(4,0);
        digitalWrite(5,1);
        digitalWrite(6,1);
        digitalWrite(7,0);
        digitalWrite(8,0);
        digitalWrite(9,1);
        delayMicroseconds(1000);
        passos=passos-1;
    }
}

void endarrera(int passos) {
    while(passos >0) {
        digitalWrite(2,1);
        digitalWrite(3,0);
        digitalWrite(4,0);
        digitalWrite(5,0);
        digitalWrite(6,0);
        digitalWrite(7,0);
        digitalWrite(8,0);
        digitalWrite(9,1);
        delayMicroseconds(1000);
        digitalWrite(2,1);
        digitalWrite(3,1);
        digitalWrite(4,0);
        digitalWrite(5,0);
        digitalWrite(6,0);
        digitalWrite(7,0);
        digitalWrite(8,1);
        digitalWrite(9,1);
        delayMicroseconds(1000);
        digitalWrite(2,0);
        digitalWrite(3,1);
        digitalWrite(4,0);
        digitalWrite(5,0);
        digitalWrite(6,0);
        digitalWrite(7,0);
        digitalWrite(8,1);
        digitalWrite(9,0);
        delayMicroseconds(1000);
        digitalWrite(2,0);
        digitalWrite(3,1);
        digitalWrite(4,1);
        digitalWrite(5,0);
        digitalWrite(6,0);
        digitalWrite(7,1);
        digitalWrite(8,1);
        digitalWrite(9,0);
        delayMicroseconds(1000);
        digitalWrite(2,0);
        digitalWrite(3,0);
        digitalWrite(4,1);
        digitalWrite(5,0);
        digitalWrite(6,0);
        digitalWrite(7,1);
        digitalWrite(8,0);
        digitalWrite(9,0);
        delayMicroseconds(1000);
        digitalWrite(2,0);
        digitalWrite(3,0);
        digitalWrite(4,1);
        digitalWrite(5,1);
        digitalWrite(6,1);
        digitalWrite(7,1);
        digitalWrite(8,0);
        digitalWrite(9,0);
        delayMicroseconds(1000);
        digitalWrite(2,0);
        digitalWrite(3,0);
        digitalWrite(4,0);
        digitalWrite(5,1);
        digitalWrite(6,1);
        digitalWrite(7,0);
        digitalWrite(8,0);
        digitalWrite(9,0);
        delayMicroseconds(1000);
        digitalWrite(2,1);
        digitalWrite(3,0);
        digitalWrite(4,0);
        digitalWrite(5,1);
        digitalWrite(6,1);
        digitalWrite(7,0);
        digitalWrite(8,0);
        digitalWrite(9,1);
        delayMicroseconds(1000);
        passos=passos-1;
    }
}

void endavant(int passos) {
    while(passos >0) {
        digitalWrite(2,0);
        digitalWrite(3,0);
        digitalWrite(4,0);
        digitalWrite(5,1);
        digitalWrite(6,1);
        digitalWrite(7,0);
        digitalWrite(8,0);
        digitalWrite(9,0);
        delayMicroseconds(1000);
        digitalWrite(2,0);
        digitalWrite(3,0);
        digitalWrite(4,1);
        digitalWrite(5,1);
        digitalWrite(6,1);
        digitalWrite(7,1);
        digitalWrite(8,0);
        digitalWrite(9,0);
        delayMicroseconds(1000);
        digitalWrite(2,0);
        digitalWrite(3,0);
        digitalWrite(4,1);
        digitalWrite(5,0);
        digitalWrite(6,0);
        digitalWrite(7,1);
        digitalWrite(8,0);
        digitalWrite(9,0);
        delayMicroseconds(1000);
        digitalWrite(2,0);
        digitalWrite(3,1);
        digitalWrite(4,1);
        digitalWrite(5,0);
        digitalWrite(6,0);
        digitalWrite(7,1);
        digitalWrite(8,1);
        digitalWrite(9,0);
        delayMicroseconds(1000);
        digitalWrite(2,0);
        digitalWrite(3,1);
        digitalWrite(4,0);
        digitalWrite(5,0);
        digitalWrite(6,0);
        digitalWrite(7,0);
        digitalWrite(8,1);
        digitalWrite(9,0);
        delayMicroseconds(1000);
        digitalWrite(2,1);
        digitalWrite(3,1);
        digitalWrite(4,0);
        digitalWrite(5,0);
        digitalWrite(6,0);
        digitalWrite(7,0);
        digitalWrite(8,1);
        digitalWrite(9,1);
        delayMicroseconds(1000);
        digitalWrite(2,1);
        digitalWrite(3,0);
        digitalWrite(4,0);
        digitalWrite(5,0);
        digitalWrite(6,0);
        digitalWrite(7,0);
        digitalWrite(8,0);
        digitalWrite(9,1);
        delayMicroseconds(1000);
        digitalWrite(2,1);
        digitalWrite(3,0);
        digitalWrite(4,0);
        digitalWrite(5,1);
        digitalWrite(6,1);
        digitalWrite(7,0);
        digitalWrite(8,0);
        digitalWrite(9,1);
        delayMicroseconds(1000);
        passos=passos-1;
    }
}