MENU

Progettiamo un robot evita ostacoli (parte 1)

Progettiamo un robot evita ostacoli (parte 3)

maggio 1, 2018 Comments (0) Guide e Tutorial, Rubriche

Progettiamo un robot evita ostacoli (parte 2)

Esercizi

Led 1

Vogliamo implementare il codice in modo tale che il LED sia acceso per 3 secondi, poi spento per altri 3 e così via.
La funzione delay(x) permette di interrompere il programma per il tempo x (espresso in millisecondi) ed è quella dunque adatta allo scopo.
Si pu`o utilizzare la funzione analogWrite(pin,val) al posto di digitalWrite(pin,state) ricordando che HIGH=255 e LOW=0.

Figura 11

Lo schema è quello di fig. 11, mentre il codice è presentato qui sotto.

Led 2

Realizziamo i collegamenti sempre come in fig. 11.

Lo scopo dell’esercizio è accendere il led in modo che inizialmente sia acceso con una intensità media, poi sia spento ed infine acceso con la luminosità massima.

Qui viene presentato il codice che svolge il compito richiesto.

Led 3

Per quest’ultimo esempio con il led, si vuole implementare il codice in modo che la luminosità del LED parta da zero e venga incrementata di 5 ogni 30 millisecondi.

E` intuitivo pensare di utilizzare la funzione delay(x) per determinare l’intervallo di tempo tra un’esecuzione e l’altra del loop(); meno intuitivo per chi è alle prime armi con la programmazione capire che per poter regolare l’intensità della luce del led c’è bisogno di una variabile aggiuntiva che è dunque possibile aggiornare durante l’esecuzione dello sketch. Inoltre, si deve definire la quantità di cui incrementare detta variabile.

Procediamo quindi alla creazione delle variabili luminosita (nota bene: senza accento!) e incremento.

I collegamenti da eseguire sono sempre quelli di fig. 11.

Come si può leggere dalla documentazione ufficiale di Arduino (o da questa guida), ci sono due cose da tenere a mente:

  • la  funzione analogWrite(pin,val) accetta valori tra 0 e 255: occorrerà implementare dei meccanismi di controllo per evitare comportamenti indesiderati del programma;
  • non si possono utilizzare accenti se non nei commenti al programma.

La soluzione presentata di seguito, ha come meccanismo di controllo il cambio di segno della variabile incremento: l’idea è che raggiunto il massimo (255), si proceda a spegnere il led progressivamente andando a sottrarre l’incremento definito all’inizio; raggiunto poi il minimo (0), si cambia nuovamente segno e il led ricomincia ad accendersi.
Un’altra soluzione valida è quella di resettare il valore della luminosità, riportandolo a 0 quando viene raggiunto il massimo (ad esempio utilizzando un if.

Qui il listato del programma.

Motore 1

Nel primo esempio andremo a far funzionare il motore nelle due direzioni (avanti e indietro) facendolo accendere e spegnere per un tempo prefissato.
Si realizzino i collegamenti come in fig. 12. Fare attenzione nel collegamento del ponte H alla breadboard – i pin del L293d sono facili da piegare e spezzare.

Figura 12

Per poter dare il segnale corretto al motore è necessario indicare la velocità di rotazione che si vuole in una variabile apposita e in altre due variabili indicare i pin a cui collegheremo il motore. Questo perché la prima variabile sarà legata ad un particolare pin del ponte H, ENABLE, detto anche PWM (pulse width modulation) che dà al segnale la forma richiesta che sarà poi trasmessa sotto forma di corrente ai motori assegnati alle altre due.

Per scrivere il codice, le funzioni da utilizzare saranno analogWrite(pin,val), digitalWrite(pin,state), delay(x).

La soluzione è visibile qui sotto.

Motore 2

Nel prossimo esempio daremo effettivamente dei comandi in tempo reale ad Arduino: non avendo devices di comunicazione appositi, sfrutteremo la libreria di Arduino Serial che permette la comunicazione seriale via USB tra pc e scheda. Il pc, più precisamente il Monitor Seriale, farà da controller.
Per comunicazione seriale si intende un tipo di trasmissione e ricezione di dati un bit per volta, vantaggiosa poiché richiede in certi casi anche un solo cavo. Si può realizzare anche una comunicazione in parallelo, che permette di inviare 8 bit (1 byte) alla volta, ma richiede un cavo per ogni bit e quindi generalmente costi maggiori.

I collegamenti sono gli stessi di fig. 12.

Le funzioni della libreria Serial che useremo sono le seguenti:

  • Serial.begin(val):  va messa nel setup() e indica la velocità di comunicazione tra i due dispositivi;
  • Serial.read(): legge una stringa dalla linea di comando del Monitor Seriale;
  • Serial.print(String): stampa a video il testo contenuto in String ;
  • Serial.flush(): funzione di attesa di completamento di trasmissione (o di segnale).

Le istruzioni che fanno sì che ad un certo tasto corrisponda una certa azione si possono organizzare in una serie di istruzioni condizionali: switch - case, if, else - if, ecc.
Si assegnino al tasto 8 del computer una direzione, al 2 un’altra e al tasto 5 l’arresto dei motori.
Nota bene: nella scrittura del codice, i numeri devono essere scritti tra apostrofi (‘8’, ‘2’) poiché la variabile in cui verranno “inseriti” i tasti che premiamo sarà di tipo char.

Qui il codice soluzione.

Ultrasuoni 1

Si realizzi un dispositivo che restituisca la distanza in centimetri da un ostacolo, stampando a video il valore.

Il modello HC SR-04 che abbiamo a disposizione non richiede librerie particolari, ma solo l’uso delle funzioni:

    • delayMicroseconds(x): come delay ma esprime il tempo in \(10^{-6}\) secondi;
    • pulseIn(pin,STATE): fornisce la durata dell’impulso in microsecondi.

Per convertire il tempo di lettura si devono usare dei valori consigliati nel datasheet dell’HC SR-04. Per i nostri scopi occorre dividere la metà (perché la metà?) della durata del segnale per 28.5 per ottenere una misura di distanza in centimetri.
NOTA: la lettura non sarà molto precisa ma a questo livello trascureremo questo fattore.

Si realizzino i collegamenti come in figura.

Figura 13

Qui il codice soluzione.

Ultrasuoni 2

In quest’ultimo esempio, molto simile al precedente, faremo funzionare un oggetto in base alle letture di un altro: più precisamente, faremo accendere e spegnere un LED a seconda di quanto lontano o vicino si trovi un ostacolo.

Si realizzino i collegamenti come in fig. 13.

Il codice rimane identico per la parte relativa al sensore ultrasuoni.
Si pensi ad un modo per indicare alla scheda quando accendere il LED, in base alla distanza dell’oggetto dal sensore. Ricordare di includere nel setup() anche il pin relativo al LED: questo potrebbe sembrare un errore banale ma è invece piuttosto frequente.

Nel prossimo articolo raggiungeremo l’obiettivo di questa guida, ovvero la costruzione e la programmazione di un robot evita ostacoli funzionante.

Crediti

La seguente guida è stata realizzata da Gruppo Efesto ed è una trascrizione ed impaginazione delle slides di supporto utilizzate nel corso delle lezioni tenute da membri del Gruppo Efesto nel corso del 2017 presso le scuole superiori A. Volta e I. Newton di Roma.

Riferimenti

    1. Adrirobot. Modulo bluetooth transceiver host slave/master tipo hc-05. http://www.adrirobot.it/Modulo_hc-05/modulo_hc-05.htm
    2. Arduino.cc. How to spot a counterfeit Arduino. https://www.arduino.cc/en/Products/Counterfeit
    3. Arduino.cc. Un po’ di storia. https://playground.arduino.cc/Italiano/StoriaDiArduino
    4. Hernando Barragàn. La storia non raccontata di Arduino. https://arduinohistory.github.io/it.html.
    5. Elec. Freaks. Hc sr-04 datasheet. http://www.micropik.com/PDF/HCSR04.pdf.
    6. IlSole24Ore. Arduino, ecco le ragioni dello scontro. Quel marchio conteso tra Italia e Usa. http://www.ilsole24ore.com/art/tecnologie/2015-02-22/arduino-ecco-ragioni-scontro-quel-marchio-conteso-italia-e-usa-154735.shtml?uuid=ABlLezyC&refresh_ce=1
    7. Processing. https://processing.org/.
    8. 10 anni di Arduino. https://www.wired.it/gadget/computer/2014/03/28/10-anni-di-arduino/

 

Tags: , , , , , , , , ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

error: EEEH?! VOLEVI!