Dopo la la pubblicazione dei sorgenti grafici del SumoBot ho ricevuto mail da parte di colleghi in cui mi veniva chiesto di condividere i file pdf per la versione Foam Core del piccolo robot, come mostrato nel post: SumoFoam – per realizzare velocemente una struttura per robot didattico.
Il materiale, come dettagliato nel link, si presta molto bene per realizzare agevolmente innumerevoli strutture utili per le nostre sperimentazioni di laboratorio (qualche esempio nel link allegato), il costo del materiale non è elevatissimo ed è semplice tagliarlo con un semplice cutter. Architetti e studenti di architettura conoscono bene il Foam Core in quanto lo utilizzano per realizzare plastici di ogni tipo, ho utilizzato io stesso questo materiale in passato per costruire plastici di alloggi per la realizzazione di esercitazioni di domotica con Arduino.
Condivido pertanto i file pdf che potete stampare su un foglio A4 adesivo ed incollare poi su un foglio di Foam Core.
Condivido una versione con colore del tratto rosso per il taglio laser ed una versione con tratto nero per la stampa su foglio adesivo A4
Lavoro di PCTO a.s. 2020-2021. Anno scolastico difficile, la pandemia non aiuta assolutamente nello sviluppo di attività laboratoriali a scuola e in azienda e a tal proposito ho pensato di rivedere completamente il laboratorio iniziando dalle attività di laboratorio degli studenti del 3′ anno.
Come molti colleghi e studenti sapranno il PCTO (ex alternanza scuola lavoro) svolto al terzo anno consiste nello svolgimento di un’attività che viene integralmente realizzata a scuola in cui viene svolta una simulazione d’impresa, dalla progettazione alla creazione di un prodotto, ma il periodo è complicato e lo svolgimento delle attività avverrà in parte online ed in parte in presenza, online si effettueranno tutte le operazioni progettuali e di documentazione mentre in presenza si assemblerà l’oggetto che dovrà poi essere reso prodotto. Come per gli anni passati per le classi terze propongo un’attività basata su un kit da me progettato che i ragazzi poi dovranno modificare e migliorare sia dal punto di vista meccanico che dal punto di vista elettronico e informatico. Parto da un prodotto progettato in partenza semplicemente perché i tempi, i costi ed il periodo non permettono una progettazione da zero, ma come accade ogni anno molti ragazzi a fine attività rivedono integralmente il progetto riformulando una nuova proposta.
La robotica attrae sempre e prototipare piccoli robot affascina sempre i giovani studenti, pertanto ho modificato la prima versione del SumoRobot disegnato nello scorso anno scolastico, formulando una versione che potesse essere realizzata con semplicità e a costi molto bassi.
Tutti i miei studenti, di qualsiasi classe, ormai posseggono un kit Arduino con una buona dotazione di componentistica elettronica, pertanto le esercitazioni in DaD non avvengono solamente usando simulatori, ma svolgendo praticamente loro a casa ed io a casa o a scuola le esercitazioni e allo stesso modo si opererà per l’attività di PCTO, fornendo un kit agli allievi.
Il kit consiste in un supporto di compensato da 4 mm tagliato a laser a scuola le cui parti verranno fissate utilizzando colla vinilica. Il controllo avviene mediante un Arduino Nano connesso ad una Sensor Shield V03 che permetterà agevolmente di connettere sensori e attuatori mediante semplici jumper evitando saldature.
I motori sono costituiti da due servomotori a rotazione continua, ciò consentirà di alimentare direttamente i motori dalla scheda Arduino evitando l’aggiunto di una ponte H per controllare i motori, azione che i ragazzi svolgeranno in altre esercitazioni. Due i sensori utilizzati sul robot: sensore ad ultrasuoni e sensori IR. L’alimentazione avverrà tramite una batteria da 9V. Il controllo dei movimenti del robot potrà avvenire anche remotamente via Bluetooth con Smartphone. Due gli elementi stampati in 3D, una ball caster in cui viene inserita una biglia di vetro e un supporto per il sensore ad ultrasuoni.
Durante la prima lezione gli allievi dovranno, seguendo il video allegato, assemblare tutte le parti, ricordando prima di ogni cosa di fissare la sensoristica e l’elettronica e successivamente procedere con l’incollaggio delle varie parti di compensato della struttura.
Per poter assemblare il robot bisognerà seguire il video allegato e le fotografie che seguono in cui sono evidenziate alcune parti.
E’ importante inoltre porre attenzione alla parte superiore di compensato che ha un orientamento specifico, seguire attentamente le indicazioni del video e delle fotografie.
A questa prima lezione allego la presentazione del progetto e i sorgenti grafici (pdf) in modo che anche altri colleghi o studenti possano duplicare e migliorare l’attività.
Nelle successive lezioni verranno mostrati i collegamenti elettrici delle varie parti e proposti alcuni sketch di esempio da cui partire per aggiungere le funzionalità richieste.
Presentazione del progetto.
Titolo del progetto: SumoRobot
Simulare la progettazione e la realizzazione da parte di un’azienda di un kit robotico per l’apprendimento del Coding e della Robotica per studenti della scuola media e primi due anni delle superiori.
Il Robot deve avere caratteristiche tali da poter essere impiegato in diverse tipologie di sperimentazioni didattiche:
evita ostacoli
segui linea
comando a distanza via Smartphone
modalità gara Sumo
Il kit dovrà essere corredato da:
Titolo Azienda
Titolo del prodotto (non deve essere quello dell’attività di PCTO) corredato da logo
Brochoure pubblicitaria
Manuale di istruzioni per il montaggio composto da: lista materiali e componenti, fasi di montaggio, il tutto arricchito con immagini e disegni tecnici
Manuale introduttivo alla programmazione con Arduino indirizzata alla programmazione del robot
Lista di sketch di esempi commentati e funzionanti da allegare al kit
Slide di presentazione del progetto
Sito internet di riferimento in cui raccogliere tutta la documentazione per il cliente
Note
Tutta la documentazione dovrà essere prodotta in lingua italiana ed inglese.
Il sito internet dovrà essere realizzato con Google Site e sarà visibile solo mediante account personale dello studente al gruppo di lavoro e ai docenti del Consiglio di Classe
Il diario di bordo dovrà essere prodotto con Google Documenti e dovrà collezionare l’attività svolta durante ogni giornata di lavoro
Nel diario di bordo bisognerà includere una sezione di “considerazioni personali” espresse da ogni singolo studente sull’attività svolta ed eventuali suggerimenti per il miglioramento del progetto.
La presentazione del prodotto dovrà essere realizzata con Google Presentazioni
Ogni fase costruttiva dovrà essere documentata in modo fotografico e con brevi video
Lista componenti
Sensore ultrasuoni HC-SR04
Sensor Shield per Arduino Uno Nano V3
Servomotori a rotazione continua 360° – FS90R con ruote
Cavo di Alimentazione 9V con cavo jack maschio 2.1 X 5.5 mm
Batteria 9V
Jumper Femmina-Femmina
Orientamento delle varie parti della struttura del robot
Vista frontale del robot
Vista dal basso del robot, si notano i due sensori IR fissati con vite M3 da 12 mm
Blocco supporto sensore ultrasuoni mediante due viti M3 da 12 mm
I servomotori sono fissati alla struttura mediante due fascette stringicavo. Seguire l’orientamento dei servomotori così come indicato nelle immagini che seguono, i cavi di uscita dei servomotori devono essere rivolti verso l’esterno
Nell’immagine si nota in quali fessure far passare la fascetta stringicavo
La chiusura della fascetta deve avvenire nella parte inferiore del robot mantenendo il nodo di chiusura così come indicato nell’immagine
Le ruote vanno fissate al mozzo del motore mediante apposita vite
La scheda Sensor Shield V03 va fissata ai giunti esagonali mediante vite M3 da 10 mm
Nella prossima lezione vedremo come collegare le varie parti elettroniche ed inizieremo con la programmazione del robot.
In realtà l’errore che viene commesso non è di carattere informatico, ma puramente matematico, dimenticando l’ordine con cui vengono eseguite le operazioni matematiche.
L’ordine delle operazioni segue le regole di base: moltiplicazioni e divisioni hanno precedenza massima seguono addizioni e sottrazioni. Se si vuole cambiare l’ordine di precedenza bisogna utilizzare le parentesi. Vediamo alcuni esempi.
il risultato sarà 13. Viene eseguito prima il calcolo della parentesi più interna (1+2), poi si passa alla parentesi immediatamente successiva, quindi (3 * 3) e poi il risultato viene sommato a 4.
// Esempio 03: Ordine di esecuzione operazioni matematiche in C
4
5
// per stampare una sola volta il messaggio sulla Serial Monitor
6
boolabilitaMessaggio = 0;
7
8
voidsetup() {
9
// inizializzazione della comunicazione seriale
10
Serial.begin(9600);
11
}
12
13
voidloop() {
14
// consente di visualizzare sulla Serial Monitor
15
// una sola stampa delle stringa
16
if(abilitaMessaggio == 0) {
17
// ritardo che evita la doppia stampa del messaggio
18
delay(200);
19
Serial.println("Calcolo:");
20
Serial.println("valore = ((1 + 2) * 3) + 4");
21
intvalore = ((1 + 2) * 3) + 4;
22
Serial.print("valore = ");
23
Serial.println(valore);
24
abilitaMessaggio = 1;
25
}
26
}
Ovviamente, come già spiegato precedentemente, bisognerà sempre fare attenzione che il risultato faccia parte del tipo di dati giusto, ad esempio quando effettuate una divisione tra interi il cui risultato è un numero decimale, o ancora se superate il valore massimo del tipo di dato che state utilizzando. In entrambi i casi il compilatore non vi segnalerà nessun errore.
// 60 secondi in un minuto, 60 minuti in un'ora, 24 ore in un giorno
2
longsecondi_in_un_giorno = 60 * 60 * 24;
In teoria, poiché il risultato è 86.400, questo valore potrà essere contenuto in un tipo long.
Ma in realtà il valore realmente memorizzato in “secondi_in_un_giorno” è 20.864.
86.400 supera più di due volte la dimensione di un intero, il calcolo fatto dal compilatore sarà il seguente:
86.400 – 32.768 * 2 = 20.864
Serial.println("Errore! Il valore doveva essere: 86.400");
26
Serial.println("L'errore si verifica perchè il compilatore considera i numeri di tipo int.");
27
abilitaMessaggio = 1;
28
}
29
}
Ciò accade perché il compilatore C dell’IDE di Arduino vede un’espressione aritmetica composta da soli numeri interi e quindi considera il risultato come tipo int. Per evitare questo problema bisogna dire al compilatore che deve trattare l’intera espressione come un long aggiungendo L al primo valore che viene valutato nell’espressione:
Questo post è dedicato ai miei allievi Paolo e Sami della 3B Automazione, che amano i videogiochi platform a cui ho assegnato un’attività di PCTO in cui è richiesto appunto la progettazione di un gioco elettronico di tipo platform con Arduino.
A tal proposito, per ridurre i tempi di prototipazione verrà usato un LCD Keypad Shield della Keystudio, il tutto verrà poi inserito in un contenitore stampato in 3D, sempre progettato dai due studenti e che dovrà ricordare un Game Boy.
Per le specifiche tecniche della scheda seguire il link allegato, seguono alcune indicazioni della scheda ricavati dalla pagina del prodotto ed alcuni link a risorse per la produzione di semplici videogiochi con Arduino.
La shield della Keyestudio integra su di esso un display LCD 1602 e sei pulsanti ed si inserisce su qualdsiasi scheda Arduino UNO R3 compatibile. Il display può comunicare con la scheda Arduino in due modi: ad 8 bit o a 4 bit, la connessione predefinita del display è a 4 bit. Come riportato nell’immagine che segue, al di sotto del display sono presenti 5 pulsanti di controllo (Seleziona, Su, Giù, Sinistra, Destra) e un pulsante di reset, che è collegato direttamente al reset della scheda Arduino.
I 5 pulsanti sono collegati all’ingresso analogico A0, quindi potrete monitorare lo stato dei pulsanti utilizzando un solo ingresso analogico di Arduino. Attenzione però che potrete monitorare solamente la pressione di un pulsante alla volta, quaindi la pressione contemporanea di due o più pulsanti non potrà essere identificata. La shield è inoltre dotata di un trimmer che permette la regolazione della retroilluminazione dell’LCD.
Nel caso si abbia la necessità di utilizzare i restanti pin di Arduino, non utilizzati per il controllo del display, è possibile saldare sulla scheda pin passanti femmina.
Nello sketch che segue, modificato leggermente rispetto a quello usato da Keystudio, la pressione di ogni singolo pulsante, ad esclusione del reset, corrisponderà ad uno specifico valore restituito dall’analogRead sul pin A0, la pressione di ogni pulsante restituirà un valore numerico all’interno di un intervallo specificato, così come indicato nell’immagine precedente, ciò permetterà quindi di intercettare quale pulsante è stato premuto.
I valori dell’analogRead corrispondenti al pulsante premuto verranno visualizzati anche sulla SerialMonitor.
Nei commenti nel codice la spiegazione di ogni sezione.
Abbiamo visto a lezione in cosa consiste la Modulazione di Larghezza di Impulso, in altro modo conosciuta come PWM (Pulse Width Modulation). Questo tipo di modulazione permette ad un sistema digitale di controllare dispositivi di tipo analogico in corrente continua facendo variare in modo continuo la potenza erogata, quindi moduliamo la larghezza di un impulso, ovvero la durata temporale di una serie di impulsi che regolerà l’attivazione e disattivazione del motore. Con il PWM agiamo non sulla tensione di alimentazione per controllare la velocità del motore, ma bensì sul tempo, per maggiori informazioni vi rimando alle slide: Alfabeto Arduino – Lezione 2 in cui come esempio viene controllata l’intensità luminosa di LED. (Per i miei studenti fate riferimento al libro di testo e agli appunti di teoria).
Il transistor nell’immagine che segue viene fatto funzionare in modalità ON-OFF e quindi possiamo assimilarlo ad un interruttore che si apre e si chiude in corrispondenza del segnale presente sulla base del transistor. Se il segnale sulla base è alto il transistor sarà in conduzione e il motore potrà essere alimentato (si chiude verso massa il collegamento del motore). Se il segnale sulla base del transistor è a livello basso il transistor è assimilabile ad un interruttore aperto per cui il motore risulta non alimentato (non si ha collegamento a massa). Quindi al motore verrà applicata una tensione continua proporzionale al duty cycle e quindi variando il duty cycle varieremo la velocità di rotazione del motore.
La generazione dell’onda quadra, che controlla la velocità del motore, viene eseguita da Arduino. Il diodo presente nel circuito è chiamato diodo di ricircolo ed è inserito in parallelo al motore (carico induttivo) per sopprimere i transienti elettrici ed è collegato in modo tale che non conduce quando il carico (il motore) viene alimentato.
Quando il motore viene disattivato rapidamente si avrà un picco di tensione in senso inverso perché l’induttore tenderà a mantenere costante la corrente che circola al suo interno, in questa situazione però il diodo sarà polarizzato direttamente e tutta la corrente scorrerà dall’induttore al diodo e l’energia che era stata immagazzinata dall’induttore viene dissipata in calore dalla componente resistiva dell’induttore. Inserendo il diodo si eviterà di applicare una sovratensione sul collettore del transistor evitando quindi che si danneggi.
Controlliamo con Arduino il movimento del motore
Lista Componenti
Arduino UNO R3
Resistore da 1 K Ohm
Dido: 1N4001
Transistor: 2N2222
Condensatore: 0,1 microF
Pinout transistor 2N2222
Circuito 1 di montaggio: alimentazione del motore prelevata da Arduino
Circuito 2 di montaggio: alimentazione del motore esterna ad Arduino
Esempio 1 Si faccia riferimento al circuito 1. Realizziamo uno sketch che permette la regolazione della velocità del motore inserendo un numero compreso tra 0 e 9. Il valore 0 ferma il motore, il valore 9 permette di muovere il motore alla velocità massima, valori intermedi movimenteranno il motore ad una velocità proporzionale al numero inserito.
Valori fuori dall’intervallo impostato restituiscono un messaggio di errore.
Per la realizzazione di questo sketch si utilizza la funzione isDigit() che restituisce TRUE verifica se il carattere inviato sulla Serial Monitor è un numero, altrimenti restituisce FALSE.
if(Serial.available()) { // Viene controllato se è disponibile un carattere
53
54
// definizione di una variabile di tipo char in cui memorizzare
55
// il carattere inviato ad Arduino mediante la Serial Monitor
56
57
charcarattere = Serial.read();
58
59
// La funzione isDigit restituisce TRUE se se il carattere
60
// inviato sulla Serial Monitor è un numero altrimenti restituisce FALSE
61
62
if(isDigit(carattere)) // verifica se è un numero
63
{
64
// mappiamo l'intervallo dei caratteri da '0' a '9'
65
// in un valore compreso tra 0 e 255, intervallo di valori
66
// del Duty Cycle
67
68
intvel = map(carattere, '0', '9', 0, 255);
69
analogWrite(pinMotore, vel);
70
71
Serial.print("Valore del Duty Cycle: ");
72
Serial.println(vel);
73
Serial.println("--------------------------");
74
Serial.print("Velocità impostata: ");
75
Serial.println(carattere);
76
Serial.println("==========================");
77
78
}
79
else
80
{
81
// nel caso in cui il carattere inserito non è un numero
82
// viene restituito un messaggio e stampa il carattere
83
Serial.println();
84
Serial.println("******************************");
85
Serial.print("Carattere non riconosciuto: ");
86
Serial.println(carattere);
87
Serial.println("******************************");
88
Serial.println();
89
}
90
}
91
}
Esempio 2 Si faccia riferimento al circuito 1. Realizziamo uno sketch che permette la regolazione della velocità del motore inserendo un numero compreso tra 0 e 9. Il valore 0 ferma il motore, il valore 9 permette di muovere il motore alla velocità massima, valori intermedi movimenteranno il motore ad una velocità proporzionale al numero inserito.
Valori fuori dall’intervallo impostato fermano il motore.
Per la realizzazione di questo sketch si utilizza la funzione Serial.parseInt() che legge i caratteri sulla seriali e restituisce la loro rappresentazione numerica (tipo long). I caratteri che non sono numeri interi (o con segno meno) vengono ignorati.
Nel dettaglio
I caratteri iniziali che non sono cifre o sono numeri negativi vengono ignorati;
L’analisi si interrompe quando non sono stati letti caratteri per un valore di tempo di timeout che può essere configurato oppure viene letta una non cifra;
Se non sono state lette cifre valide quando si verifica il timeout (vedere Serial.setTimeout ()), viene restituito 0; Serial.parseInt () eredita dalla classe Stream.
Esercizio 1 Aggiungere al circuito 1 due pulsanti che permettono di aumentare o diminuire la velocità del motore. Fare in modo che la velocità impostata del motore sia proporzionale ai valori numerici interi nell’intervallo tra 0 e 9, così come fatto negli esempi precedenti. Ad ogni pressione del pulsante P1 si incrementa di una unità il valore della velocità. Ad ogni pressione del pulsante P2 si decrementa la velocità del motore i una unità. All’avvio di Arduino il motore è spento. Mostrare la velocità impostata sulla serial monitor.
Esercizio 2
Aggiungere all’esercizio precedente un pulsante P3 di emergenza che alla pressione ferma il motore. Se è stata azionata l’emergenza i pulsanti P1 e P2 di incremento e decremento non funzionano. Per poter riattivare il sistema bisogna premere nuovamente P3.