E10_com_protocoder

Benvenuto! In questa introduzione imparerai a programmare e controllare un PrintBot con un terminale e utilizzando Protocoder. Protocoder è uno strumento di sviluppo per applicazioni su smartphone, che ti permette di creare velocemente programmi e interfacce utente. Protocoder è stato sviluppato da Victor Díaz. Puoi trovare ulteriori informazioni e scaricare Protocoder qui. Useremo Protocoder come un interfaccia per comunicare con la scheda ZUMT BT-328 via Bluetooth, e faremo muovere a piacimento il PrintBot Evolution o lo useremo in modalità automatica: inseguitore di linea, inseguitore di luce e evita ostacoli. Useremo due programmi per controllare il PrintBot Evolution:

  1.  Codice Protocoder: memorizza l’interfaccia grafica e le funzioni da inviare alla scheda ZUM attraverso il Bluetooth del terminale.
  2.  Codice ZUM BT-328: memorizzerà il programma del PrintBot, come le modalità operative o la comunicazione Bluetooth.

Puoi scaricare i codici alla fine di questo post. Prima di utilizzare il codice per Protocoder dovrai installarlo sul tuo terminale (puoi scaricarlo da qui).

Codice Protocoder

Per modificare il codice Protocoder, per prima cosa accedi alla applicazione dal tuo terminale e inserisci l’indirizzo IP che appare nella parte bassa della videata del tuo browser nel tuo computer.
ip_protocoderScarica il codice che trovi alla fine di questo post e carica il file printbot_evolution_protocoder.proto sul tuo terminale. Entra nella cartella in cui si trova il file (solitamente la cartella downloads), clicca sul codice Protocoder e apparirà una finestra di dialogo.  Seleziona “apri con Protocoder”.  Seleziona le opzioni di installazione nella finestra che si apre. Ora puoi usare e modificare il codice contenuto nel programma.E10_com_protocoderUna volta che hai importato il file con suffisso .proto, vedrai apparire il progetto nella linguetta MIEI PROGETTI del browser. Clicca sull’icona e vedrai il codice di programma. Varie parti possono essere distinte nel codice:

  1. Creare i pulsanti: crea un pulsante con del testo, utile per indicare a cosa serve. Per crearli utilizzeremo un codice come questo:

    All’interno del codice, dichiariamo il pulsante con var btnSiguelinas, e ad ogni pulsante dobbiamo dare un nome differente per evitare conflitti di interpretazione. Poi con ui.addButton, affermiamo che la variabile btnSiguelineas sarà un pulsante. In ordine tra parentesi, scriveremo il testo che apparirà nel pulsante, la posizione X e Y, la larghezza ed altezza del pulsante. Dopodichè dovremo indicare la funzione eseguita quando si preme il pulsante, in questo caso, inviare la parola siguelinas (insegui linea) via Bluetooth.
  2. Creare pulsanti con immagini

    Dichiariamo il pulsante con var btn180, ma questa volta è differente in quanto stiamo usando un’immagine al posto di un testo. Poi con ui.addImageButton, possiamo impostare la variabile btn180 come una immagine con proprietà di pulsante. All’interno delle parentesi e in ordine, scriveremo la posizione X e Y, la larghezza e l’altezza del pulsante ed il nome dell’immagine che vogliamo appaia nel pulsante. Dobbiamo anche indicare la funzione che verrà eseguita quando il pulsante viene premuto, che in questo caso è inviare la parola 180 con il Bluetooth. Per aggiungere un immagine o qualsiasi file, trascinalo semplicemente dal tuo archivio sul computer nel contenitore in basso a destraT. Tieni a mente che più semplice è il nome, e più facile sarà il codice di programma.
    archivos
  3. Creare i pulsanti per il pannello utente (dashboard): Per includerli, possiamo farlo nello stesso modo che per i pulsanti per i dispositivi, ma invece di usare il prefisso ui, useremo il prefisso dashboard. In automatico non appare la dashboard, dovrai cambiare dashboard.show(false); con dashboard.show(true);.
  4. Funzioni che collegano o scollegano il Bluetooth: Questi sono inclusi all’interno delle variabili btnConectar e btnDesconectar. Creiamo anche la variabile btClient, che verrà utilizzata per  “interagire” con il Bluetooth.
    1. Collegamento: Per collegarsi, per prima cosa devi creare un pulsante con il testo “Connect Bluetooth” e all’interno della funzione che viene attivata quando premi il pulsante, scriveremo il codice che connette il Bluetooth.

      All’interno della funzione, come quando viene connesso il Bluetooth, dichiariamo la variabile bluetoothOn – che ha la funzione di “segnalare” la connessione/disconnessione – e a cui assegnamo il valore 1 e la trasparenza del pulsante viene portata al valore 0, che lo fa diventare interamente trasparente. Aggiungiamo anche qualche animazione come saltare e faremo vibrare il dispositivo quando viene connesso.
    2. Disconnessione: per disconnetere, dobbiamo creare un pulsante con la scritta “Disconnetti” ed all’interno della funzione attivata quando viene premuto il pulsante, inseriremo la disconnessione del bluetooth.

      All’interno di questa funzione, oltre a disconnettere il Bluetooth, dichiareremo una variabile BluetoothOn – la quale “segnala” la connessione/disconnessione del bluetooth – viene assegnato il valore 0 e la trasparenza del pulsante viene portata a 255, che diventa opaco.
  5. Funzione per inviare e ricevere dati dalla funzione Bluetooth: La funzione per la trasmissione dei dati con Bluetooth è :

    Questa funzione non ha un pulsante, dato che verrà chiamata ogni volta che verrà premuto il pulsante, ad eccezzione di quando viene connesso/disonnesso via Bluetooth. Per inviare dati via Bluetooth, useremo il comando btClient.send(“=”+str+”+”); .  Per esempio questa funzione invia il comando di avanzamento in avanti della macchina: =avanzar+. Questo è un modo di programmare, ma tu puoi trovare altri modi per ottenere lo stesso risultato.  I caratteri  = y + sono usati per segnalare l’inizio e la fine di una trasmissione.

    1. Inviare dati via Bluetooth: Per inviare dati attraverso il Bluetooth , useremo la funzione con il testo racchiuso tra virgolette, per esempio, per inviare la parola retroceder (torna indietro) useremo il comando:  send(“retroceder”);

Codice per Arduino

Per vedere e modificare il codice da installare sulla scheda Arduino, scarica il pacchetto che trovi alla fine di questo post, e clicca sul file  printbot_evolution_arduino.ino. Se non hai installato sul tuo computer la IDE di Arduino o altra IDE per leggere questo file, vai su Programmare con Arduino e ProtoCoder per makers, e scarica la IDE che preferisci. Trovi anche molte informazioni su Arduino e ProtoCoder. Una volta che hai aperto il file, puoi distinguere varie parti del codice di programma:

  1. Dichiarare variabili e includere librerie: dichiareremo tutte le variabili che useremo nel programma:

    Useremo alcune variabili per dire ad Arduino a quali pins abbiamo connesso le “vitamine”,  o altro come delays, per cambiare l’esecuzione del programma. Se i giri non sono corretti o vuoi cambiare gli angoli, puoi cambiare le variabili giro_180, giro_90, giro_45 and giro_30.
  2. Setup: Nella funzione setup, una delle funzioni obbligatorie in Arduino (in aggiunta a loop), inizializzeremo il programma ed i componenti utilizzati. Il codice nella funzione setup è:

    In questa funzione, avviamo la porta seriale alla velocità di 19200 bauds/s, che corrisponde alla velocità del modulo Bluetooth di cui è dotata la scheda ZUM BT-328.
    Poi dobbiamo indicare dove sono collegati i servo, fermare i servo in movimento e ruotare il servo che muove il sensore ad ultrasuoni bat in posizione centrale.
    Per finire, useremo il comando pinMode(pin,mode) per impostare i pins come INPUT o OUTPUT a seconda dell’esigenza.
  3. Loop: All’interno della funzione loop, un’altra funzione obbligatoria, interpreteremo ed utilizzeremo i dati ricevuti:

    All’interno di questa funzione, possiamo vedere il comando if (Serial.available() >0) che corrisponde, in un linguaggio “umano”, a: se è arrivato un dato alla porta seriale, allora esegui i seguenti comandi. In questo caso, i comandi chiamano la funzione readFromAndroid();. Questa funzione legge i dati inviati dalla applicazione sviluppata con Protocoder. L’altro comando all’interno del loop è writeData();. Questa funzione è utilizzata per abilitare differenti modalità di controllo (sia manuale che esterno), una volta che il dato ricevuto dalla funzione precedente è stato letto.
  4. readFromAndroid();:

    Al posto di questa funzione, avremmo potuto utilizzare la funzione readString(); ma sarebbe stata letta più lentamente, causando un ritardo nella ricezione del comando inviato dal programma Protocoder al PrintBot Evolution.
  5. writeData();: Questa funzione controlla il flusso del programma, legge i dati ricevuti dalla funzione readFromAndroid()  ed esegue un comando o un altro in risposta a quel dato.
  6. Funzioni di movimento: Queste sono le funzioni che permettono al PrintBot Evolution di muoversi. Queste sono: avanzar (andare avanti), retroceder (indietro), parar (stop), izquierda (sinistra), derecha (destra), derecha, giro_180_grados (gira di 180°), izquierdaLineas (dritto a sinistra) and derechaLineas (dritto a destra). Possiamo utilizzare queste funzioni in qualsiasi momento, semplicemente chiamandole. Per esempio, per girare di 180 gradi useremo questo comando:
  7. Funzioni modalità: Queste sono funzioni che impostano il PrintBot Evolution con modalità automatiche.
    1. Inseguitore di linea: Questo automatismo usa i sensori infrarossi per individuare quando il sensore è sopra una linea. Le funzioni speciali izquierdaLineas e derechaLineas sono usate in questo modalità per muovere una sola ruota, al posto di due con direzioni diverse, per eseguire il movimento.
    2. Evita ostacoli: Questo automatismo usa i sensori ad ultrasuoni per individuare oggetti per evitare di andargli addosso. Il codice di questa funzione è:

      In questa funzione, dobbiamo individuare le variabili izq, drch and cent che definisco la posizione del mini servo che muove il sensore ad ultrasuoni. Queste posizioni sono rispettivamente sinistra, destra e centro, ma tu puoi modificarle o creare nuove posizioni. Poi dobbiamo verificare se ci sono ostacoli in direzione del sensore usando la funzione buscaObstaculos() usata per tutte le posizioni, trasmettendo l’angolo a cui è orientato il servo come dato. Il codice per questa funzione è:

      All’interno di questa funzione, puoi cambiare la massima distanza utilizzata per individuare gli ostacoli, o in altre parole, la distanza che determina se un oggetto è un ostacolo oppure no. Per afre questo, vengono usate le funzioni ausiliarie Distance e TP_init, che attivano il sensore bat, inviano un seganle ad ultrasuoni, calcolano il tempo intercorso tra il segnale di andata e l’eco di ritorno, e in base a questo tempo calcolano la distanza. Una volta che sappiamo di fronte a quale posizione si trova l’ìostacolo, possiamo far muovere il PrintBot nella zona libera.
    3. Inseguitore di luce: Questo automatismo muove il PrintBot direttamente verso la luce più intensa.  Per fare questo, dobbiamo leggere il valore di ogni pin collegato ai moduli LDR (resistori dipendenti dalla luce), comparare i valori, girare dalla parte di maggior luminosità e far procedere il PrintBot dritto per 1 secondo.

Puoi vedere questo nel seguente video:

 

 

Ricorda che puoi cambiare ogni parametro usato nelle funzioni. Questi sono gli esercizi che raccomandiamo:

  • Cambiare le icone dell’applicazione ProtoCoder includendo immagini nei pulsanti che hanno solo testo.
  • Usare i sensori ad infrarossi per individuare gli angoli. Puoi vedere un esempio qui.
  • You can create a button so that your PrintBot moves its head and makes a sound.

Se vuoi imparare di più su Arduino, ProtoCoder e robotica, puoi seguire questo corso: Programmare con Arduino e ProtoCoder per makers