Archivi categoria: elettronica

PCTO A.S. 2020 – 2021 – SumoBot – lezione 2

In questa lezione vedremo come collegare e controllare i servomotori a rotazione continua di SumoBot.
Fate riferimento allo schema di collegamento che segue, in cui i servomotori vengono connessi ai pin 4 e 5 della Sensor Shield per Arduino Uno Nano V3, come si nota a fianco di ogni pin è disponibile l’alimentazione, infatti troviamo sempre il positivo, indicato con la lettera V e il GND indicato con la lettera G. Come ribadito nella lezione 1 utilizziamo una Sensor Shield perchè permette rapidamente di realizzare tutti i collegamenti senza la necessità i dover ricorrere ad una breadboard oppure alla saldatura dei cavi.

Per questa lezione vengono indicati solo i collegamenti ai motori, non verranno collegati ne il sensore ad ultrasuoni e ne i sensori ad infrarossi.

Per quanto riguarda l’utilizzo dei servomotori a rotazione continua fare riferimento alla slide: Alfabeto di Arduino – Lezione 6, ma per completezza riporto di seguito la spiegazione adattandola all’utilizzo con SumoBot.

Il servomotore è costituito in genere da tre cavi connessi ad un connettore femmina con passo standard tra i fori di 2,54 mm quindi facilmente utilizzabile con qualsiasi strip che ne permette il collegamento ad esempio su una breadboard oppure ai pin maschio della Sensor Shield che utilizziamo per SumoBot.

I fili di connessione possono assumere colori diversi in funzione della marca del servo.

Pinout del servomotore

  • Filo ROSSO: +V
  • Filo NERO o MARRONE: GND
  • Filo BIANCO o ARANCIO o BIANCO o BLU: Segnale

Nel servomotori adottati per questa esperienza i fili di connessione sono:

  • Filo ROSSO: +V
  • Filo MARRONE: GND
  • Filo ARANCIO: Segnale

Collegamenti

Guardando SumoBot frontalmente, collegheremo il motore di destra al pin 4 e il motore di sinistra al pin 5.

Principio di funzionamento del servomotore a rotazione continua

Notoriamente i servomotori possono effettuare una rotazione che oscilla tipicamente da 0 a 180, esistono inoltre modelli che consentono una rotazione inferiore tra 0 e 120 gradi, questi tipi di servomotori possono essere modificati facendo in modo che possano effettuare una rotazione continua, ovvero tra 0 e 360 gradi, ma in commercio sono disponibili servomotori di diverse dimensioni che funzionano in questa modalità. Nel kit utilizzato per la realizzazione di SumoBot utilizziamo due servomotori FS90R.

Sul servomotore a rotazione continua possiamo controllare da programma il senso di rotazione e in modo non molto preciso anche la velocità.

Il funzionamento di un servomotore a rotazione continua è simile a quella di un motore in corrente continua con la differenza che non necessitano di appositi shield per poter funzionare.
Rispetto ad altri tipi di motori in CC offrono scelte limitate per il controllo della velocità e limitazioni di alimentazione.

L’alimentazione potrà avvenire direttamente Attraverso Arduino o mediante alimentazione esterna. L’alimentazione dei motori di SumoBot avverrà direttamente dalla scheda Arduino.

Caratteristiche tecniche

  • Velocità di funzionamento a 4,8V: 110RPM
  • Velocità di funzionamento a 6V: 130RPM
  • Coppia di stallo a 4,8V: 1.3kg.cm/18.09oz.in
  • Coppia di stallo a 6V: 1.5kg.cm/20.86oz.in
  • Tensione operativa: 4.8-6V
  • Sistema di controllo: Analogico
  • Angolo di rotazione: 360 gradi
  • Impulso richiesto: 900-2100us
  • Materiale ingranaggi: Plastica
  • Dimensioni: 2,32×1,25×2,2 cm
  • Peso: 9g

Programmazione

/*
 * Prof. Maffucci Michele
 * SumoRobot
 * Data: 26.01.2021
 * 
 * Sketch 01: rotazione oraria e antioraria continua
 * 
 * Note:
 *          Per l'orientamento del robot 
 *          guardare SumoBot anteriormente
 *       
 *          180: max velocità in senso antiorario
 *          90 : servomotori fermi
 *          0  : max velocità in senso orario
 *            
 */

// inclusione della libreria servo.h per il controllo dei servomotori
#include <Servo.h>

// Creazione oggetti servo
Servo motoreDX;  // Inizializzazione del servomotore destro
Servo motoreSX;  // Inizializzazione del servomotore sinistro

byte pinDx = 4;     // Inizializza del pin 4 a cui è connesso il pin segnale del servo destro
byte pinSx = 5;     // Inizializza del pin 5 a cui è connesso il pin segnale del servo sinistro
int  durata = 250;  // Durata movimento (orario/antiorario)
int  ferma = 3000;  // Durata dello stop

void setup() {

  // attach() consente di definire a quale pin viene connesso il servomotore
  // e lo collega all'oggetto che gestisce il servomotore
  
  motoreDX.attach(pinDx); // pinDx collegato al motore destro
  motoreSX.attach(pinSx); // pinSxcollega to al motore sinistro
}

void loop() {
  orarioRobot();     // Rotazione in senso orario del robot
  stopRobot();       // Stop rotazione per un tempo fissato (vedere variabile ferma)
  antiorarioRobot(); // Rotazione in senso antiorario del robot
  stopRobot();       // Stop rotazione per un tempo fissato (vedere variabile ferma)
}

// rotazione del robot in senso antiorario
void antiorarioRobot(void) {
  motoreDX.write(150);  // Rotazione oraria del motore DX
  motoreSX.write(150);  // Rotazione antioraria del motore SX
  delay(durata);        // durata: durata della rotazione
}

// rotazione del robot in senso orario
void orarioRobot(void) {
  motoreDX.write(30);    // Rotazione antioraria del motore DX
  motoreSX.write(30);    // Rotazione oraria del motore SX
  delay(durata);         // durata: durata della rotazione
}

// stop del robot
void stopRobot(void) {
  motoreDX.write(90);   // Ferma il motore DX
  motoreSX.write(90);   // Ferma il motore SX
  delay(ferma);         // Durata dello stop
}

Per quanto riguarda il controllo dei servomotori seguire la spiegazione inserita come commento all’interno del codice, ricordo comunque che per controllare i servomotori sono necessarie  4 operazioni:

  1. includere la libreria Servo.h
  2. creazione dell’oggetto Servo. motoreDx e motoreSx saranno i due oggetti su cui opererete
  3. assegnare un nome al pin di controllo del servomotore (filo arancione nello schema)
  4. indicare nel setup il metodo attach() che permette di legare gli oggetti motoreDx e motoreSx ai pin su Arduino nell’esempio 4 e 5 a cui abbiamo assegnato i nomi pinDx e pinSx.

All’interno del codice utilizziamo il metodo write() che per i servomotori a rotazione continua permette il passaggio, all’oggetto motoreDx e motoreSx, la direzione e la velocità di rotazione del motore:

  • passando il valore 0 gradi al metodo write() il servo ruota alla massima velocità in una direzione.
  • passando il valore 90 gradi al metodo write() poniamo il servo in stop (posizione “neutra”)
  • passando il valore 180 gradi al metodo write() il servo di ruotare in senso opposto alla massima velocità.

Nel codice che segue SumoBot ripeterà continuamente una rotazione oraria di 250 millisecondi, si fermerà per 3 secondi e riprenderà la rotazione in senso antiorario per 250 millisecondi.

Per effettuare questa operazione vengono definite 3 funzioni:

  • orarioRobot()
  • stopRobot()
  • antiorarioRobot()

Nel codice si può notare che nella funzione antiorarioRobot() viene passato al metodo write() non il valore 180 che farebbe ruotare il robot alla massima velocità, ma un valore inferiore, nel nostro caso 150, ciò ridurrà la velocità di rotazione.

In  modo analogo accade per la funzione orarioRobot() in cui invece di passare il valore 0 alla metodo write(), che lo farebbe ruotare alla massima velocità in senso orario, passiamo un valore maggiore, 30, che lo farà ruotare ad una velocità inferiore.

La fermata del robot avviene utilizzando la funzione stopRobot() in cui viene passato il valore 90 al metodo write(), ciò fermerà i motori.

Si noti che i motori potranno ruoteranno in un senso o in un altro, oppure potranno essere fermati non solo invocando il metodo write, ma bisognerà sempre inserire un delay() in cui viene specificato per quanto tempo il metodo deve agire.

Esercizio 01

Far compiere a SumoBot rotazioni continue di 90 gradi in senso orario inserendo un intervallo di 3 secondi ad ogni quarto di giro

Esercizio 02

Far compiere a SumoBot una rotazione continua di 360° con intervalli di 3 secondi ad ogni quarto di giro, raggiunti i 360° far cambiare il senso di rotazione ripetendo le fermate di 3 secondi ad ogni quarto di giro.

Esercizio 03

Individuare quanto tempo necessita per far effettuare una rotazione di 45° in senso orario a SumoBot e realizzare un programma che permetta di fare le seguenti operazioni:

  1. rotazione di 45° in senso orario
  2. fermate di 3 secondi
  3. rotazione in senso antiorario di 90°
  4. fermata

Buon Making a tutti 🙂

Arduino – realizzare un sensore di seduta a pressione con un tubo di gomma

Questa mattina, durante la realizzazione e l’analisi dei problemi per il progetto di PCTO: “misura di sedentarietà delle persone sedute alla scrivania” che stanno realizzando i miei studenti di 3′ Elettronica, è nata l’esigenza di associare un doppio controllo per la valutazione della presenza della persona seduta alla scrivania, un controllo effettuato con PIR HC-SR501 ed un sensore di forza resistivo (FSR) inserito all’interno del cuscino della seduta.

Per evitare l’acquisto di un sensore di forza resistivo e non pesare sulle finanze dei ragazzi le modalità sono tre:

  • richiesta alla scuola
  • compra il Prof.
  • farlo costruire ai ragazzi

l’acquisto da parte della scuola o mia non è un problema, ma la terza soluzione è quella che in questo momento prediligo, perché può essere realizzata in 5 minuti, credo che possa gratificare di più lo studente Maker in erba 🙂 , inoltre ritengo importante che gli allievi assumano la capacità di costruire il sensore perché ne dovranno ottimizzare l’uso, scontrandosi inevitabilmente con una serie di variabili fisiche che dovranno gestire.

Ma come si costruisce il sensore?

E’ indispensabile piccolo tubo cilindrico non trasparente, preferibilmente nero che possa essere compresso e al termine della compressioni ritorni abbastanza velocemente nella sua posizione di riposo. Possiamo ricavare il tubo sguainando un cavo elettrico o cavo di rete, oppure come ho fatto in questo tutorial, prendendo una guaina termorestingente.

Inserire un diodo LED ad un’estremità del cilindro e dalla parte opposta inserire un LDR.
Collegare il sistema nella solita modalità, inserendo in serie al LED un resistore da 220 Ohm e creando un partitore di tensione tra l’LDR e un resistore da 10KOhm, così come indicato nel circuito indicato di seguito.

Come test di funzionamento utilizzare il semplice sketch che trovate di seguito, nei commenti la spiegazione di tutte le parti del codice.

Aprite la Serial Monitor e premete e rilasciate il tubo

/*
 * Prof. Michele Maffucci
 * Data 01.03.2021
 * 
 * Oggetto: sensore di seduta a pressione
 * 
*/

// variabile in cui verrà memorizzato il valore presente sul pin A0
const int misura = A0;

// valore restituito dall'analogRead
int val = 0;

// pin a cui è connesso il LED del sensore di seduta
int pinLed = 2;

// LED che segnala la seduta della persona
int pinLedAlert = 13;

void setup() {
  // Inizializzazione della Serial Monitor
  Serial.begin(9600);

  // ledPin è il pin a cui è connesso il LED del sensore di seduta
  pinMode(pinLed, OUTPUT);

  // pinLedAlert è il pin a cui è connesso il LED che segnala la seduta della persona
  pinMode(pinLedAlert, OUTPUT);

  // Attivazione del LED del sensore di seduta
  digitalWrite(pinLed, HIGH);

  // Messaggio di avvio
  Serial.println("Sistema di rilevazione seduta");
  Serial.println("-----------------------------");
  Serial.println(""); 
  delay(1000);
}

void loop() {
  // analogRead leggerà il valore su A0 restituendo un valore tra 0 e 1023
  val = analogRead(misura);

  // il valore di controllo nell'if deve essere sperimentato in funzione
  // delle necessità costruttive (ad es. la lunghezza del tubo)

  // se vero la persona è seduta
  if (val >= 100) {
    digitalWrite(pinLedAlert, HIGH);                      // accensione del LED di avviso
    Serial.println("Persona NON seduta alla scrivania");  // segnalazione di assenza persona
    Serial.print("Valore letto dal sensore = ");          // Stringa di stampa 
    Serial.println(val);                                  // Valore restituito dall'AnalogRead
    Serial.println("");                                   // Stampa linea vuota di separazione
    delay(1000);                                          // Intervallo di 1 secondo tra ogni stampa
  }
  else
  {
    digitalWrite(pinLedAlert, LOW);                       // spegnimento del LED di avviso
    Serial.println("Persona seduta alla scrivania");      // segnalazione di presenza persona
    Serial.print("Valore letto dal sensore = ");          // Stringa di stampa 
    Serial.println(val);                                  // Valore restituito dall'AnalogRead
    Serial.println("");                                   // Stampa linea vuota di separazione
    delay(1000);                                          // Intervallo di 1 secondo tra ogni stampa
  }
}

Il risultato sulla Serial Monitor è il seguente

Il valore di soglia scelto deve essere ricavato sperimentalmente in funzione della lunghezza e della trasparenza del tubo.

Buon Making a tutti 🙂

Raspberry Pi Pico – conosciamo la scheda ed installiamo MicroPython

Raspberry Pi Pico è una nuovissima scheda di prototipazione elettronica estremamente potente ed economica che monta il microcontrollore RP2040 costituito da un Cortex-M0+. La scheda è prodotta da Raspberry Pi ed ha un costo estremamente contenuto, circa € 4,5.
La scheda ha una dimensione simile a quella di un Arduino Nano, però rispetto alle  schede della famiglia Arduino che montano microcontrollori ATmega, possiede una potenza di calcolo e di memoria superiore. Inoltre è possibile programmarla in MicroPython, C e C++.

La scheda è stata messa in vendita qualche settimana fa e non appena commercializzata ho deciso di acquistarne 10 schede, ulteriori 10 schede mi arriveranno tra qualche giorno ciò mi permetterà di gestire un’intera classe di studenti e le prime sperimentazioni le effettuerò con i miei studenti di  5′ Elettronica e Automazione a cui assegnerò il compito di sviluppare le esercitazioni che poi utilizzerò nel prossimo anno scolastico con i miei studenti di 3′ del percorso elettronica e automazione.
Come prima attività in DaD ho chiesto ai miei allievi di realizzare in autonomia un documento di presentazione del prodotto e una tabella di confronto con le schede Arduino che montano microcontrollori ATmega tutto ciò mi farà risparmiare tempo e ci permetterà di concentraci sull’attività pratica in laboratorio.

Con questo post ne voglio presentare  le caratteristiche tecniche e la modalità di installazione del firmware ed un esempio di programmazione in MicroPython. Sul sito di riferimento potete trovare tutta la documentazione necessaria per utilizzare la scheda.

Pico viene venduto senza piedini di collegamento, quindi dovrete acquistarli e procedere poi voi a sedarli sulla scheda, quindi armatevi di tanta pazienza ed utilizzando una breadboard per fissare i pin, procedete con la saldatura.

Per maggiori informazioni seguire il link per la pagina di riferimento della scheda.

Caratteristiche tecniche

L’RP2040 è il primo microcontrollore di Raspberry Pi. I due core del processore Cortex-M0+ del  Pico funzionano a 48 MHz, anche se questo può essere modificato nel software fino a 133 MHz.

La RAM del microcontrollore è incorporata nello stesso chip dei core del processore, è costituita da sei banchi di memoria  per un totale di 264kB (264.000 byte) di RAM statica (SRAM). La RAM viene utilizzata per memorizzare i vostri programmi e i dati di cui hanno bisogno i programmi.

L’RP2040 include 30 pin GPIO (general-purpose input / output) multifunzione, 26 dei quali sono collegati a connettori pin fisici sul vostro Pico e uno dei quali è collegato a un LED integrato sulla scheda. Tre di questi pin GPIO sono collegati a un convertitore analogico-digitale (ADC), mentre un altro canale ADC è collegato a un sensore di temperatura su chip.

L’RP2040 include due UART (ricevitore-trasmettitore asincrono universale), due SPI (Serial Periferal Interface) e due bus I2C (Inter-Integrated Circuit) per i collegamenti a dispositivi hardware esterni come sensori, display, convertitori digitale-analogico (DAC) e molto altro. Il microcontrollore include anche un ingresso/uscita programmabile (PIO), che consente al programmatore di definire nuove funzioni hardware e bus nel software.

Il  Pico include un connettore micro USB, che permette un collegamento seriale UART-over-USB al microcontrollore RP2040 per la programmazione e l’interazione e che alimenta il chip. Tenendo premuto il pulsante BOOTSEL quando si collega il cavo, il microcontrollore passerà alla modalità “Dispositivo di archiviazione di massa USB”, consentendo di caricare il nuovo firmware.

L’RP2040 include anche un on-chip clock e timer, che permette di tenere traccia in modo preciso dell’ora e della data. Il clock può memorizzare l’anno, il mese, il giorno, il giorno della settimana, l’ora, i minuti e i secondi e tiene automaticamente traccia del tempo trascorso finché viene fornita l’alimentazione alla scheda. RP2040 include il single-wire debug (SWD)  un debug hardware a tre fili nella parte inferiore del tuo Pico.

Pinout del Raspberry Pi Pico

 

 

 

Caratteristiche tecniche

  • CPU: 32-bit dual-core ARM Cortex-M0+ at 48MHz, configurabile fino a 133MHz
  • RAM: SRAM da 264kB disposi in 6 banchi indipendenti configurabili
  • Memoria: flash RAM esterna da 2MB
  • GPIO: 26 pins
  • ADC: 3 × 12-bit ADC pin
  • PWM: 16
  • Clock: Orologio e timer accurati su chip con anno, mese, giorno, giorno della settimana, ora, secondi e calcolo automatico dell’anno bisestile
  • Sensori: Sensore di temperatura On-chip connesso connesso ad un ADC 12-bit
  • LED: LED su scheda indirizzabile dall’utente
  • Connessioni bus: 2 × UART, 2 × SPI, 2 × I2C, Programmable Input/Output (PIO)
  • Hardware Debug: Single-Wire Debug (SWD)
  • Mount Options: pin passanti
  • Alimentazione: 5 V via micro USB, 3.3 V via 3V3 pin, o 2–5V via VSYS pin

Installare MicroPython

Dopo che avete effettuato le saldature dei pin abbiamo bisogno di installare MicroPython sulla scheda. Colleghiamo un cavo micro USB alla porta micro USB del vostro Pico.
Per installare MicroPython sul vostro Pico dovrete scaricarlo da Internet. Questa operazione è da fare una sola volta, dopo averlo installato rimarrà sul vostro Pico a meno che voi non decidiate di sostituirlo con qualcos’altro.

Mantenete premuto “BOOTSEL” nella parte superiore del tuo Pico, vicino al connettore USB, quindi, tenendolo ancora premuto, collega l’altra estremità del cavo micro USB a una delle porte USB del vostro computer Raspberry Pi o altro computer. Contate tre secondi, dopo di che rilasciate il pulsante “BOOTSEL”. Dovreste vedere il vostro  Pico apparire come un’unità rimovibile, come se avessimo collegato un’unità flash USB o un disco rigido esterno. Sul vostro computer verrà aperta una finestra per aprire l’unità (la scheda) che avete connesso.

Nella finestra del vostro File Manager, vedrete due file sul  Pico: INDEX.HTM e INFO_UF2.TXT. Il file  INFO_UF2.TXT contiene informazioni sul  Pico tra cui la versione del bootloader attualmente in esecuzione sul Pico.

Il file, INDEX.HTM, contiene tutte le informazioni utili per usare il Pico, fate doppio clic, sarete reindirizzati sulla pagina di benvenuto da cui reperire tutte le informazioni che servono per iniziare. Fate clic sulle schede scorrete la pagina per accedere alle guide, ai progetti e alla raccolta di libri: una libreria di documentazione tecnica dettagliata che copre tutto, dal funzionamento interno del microcontrollore RP2040 il cuore della vostra scheda, alla programmazione in Python e C / C ++.

Leggete tutte le informazioni sulla pagina, andate in “Getting started with MicroPython” e fate clic sul pulsante “Scarica file UF2” per scaricare il firmware MicroPython, che è un piccolo file che contiene MicroPython per il vostro Pico. Il download dal sito di riferimento richiede pochissimi secondi.

Una volta scaricato, andate nella vostra cartella Download cercate il file “micropython” seguito da una data e dall’estensione “uf2”. Fare clic e tenere premuto il pulsante del mouse sul file UF2, quindi trascinatelo sull’unità di archiviazione rimovibile di Pico (quindi all’interno del Pico). Posizionalo sulla finestra e rilascia il pulsante del mouse per rilasciare il file sul vostro Pico.

Dopo qualche secondo il vostro Pico scomparirà dal vostro File Manager e potreste anche vedere un messaggio del vostro sistema operativo che vi dice che un’unità è stata rimossa senza essere stata espulsa: non preoccupatevi, non è successo nulla di grave, ciò accade perchè quando avete trascinato il file del firmware MicroPython sul Pico, avete detto di eseguire il flashing del firmware nella  memoria interna di Pico. Per fare il flashing il Pico esce dalla modalità speciale in cui lo avete  inserito con il pulsante “BOOTSEL” (modalità periferica USB), vedrete lampeggiare il LED sulla scheda, ciò indica che Pico ora esegue MicroPython.

Bene! Ora siete pronti per iniziare a programmare in MicroPython su Raspberry Pi Pico! 🙂

Installiamo l’IDE Thonny per programmare in MicroPython.

Scarichiamo ora l’IDE di programmazione Thonny, vedremo in una lezione successiva come utilizzare Visual Studio Code.

Andate sul sito https://thonny.org e scaricate la versione per il vostro sistema operativo

Doppio click sull’applicazione, si aprirà la seguente finestra:

Configuriamo ora l’IDE per poter programmare il Pico, dal menù > Strumenti > Opzioni… selezionare “Interprete”

Scegliere MicroPython (Raspberry Pi Pico)

Determiniamo ora la porta seriale di connessione a cui abbiamo collegato il Pico, possiamo effettuare questa operazione oppure manualmente selezionate quella identificata da una lunga serie di 0 che termina con 1

Dal menù Strumenti > Gestione plug-in… inserire nel campo di ricerca “machine”

Si avvierà l’installazione, al termine chiudete la finestra.

Vediamo ora come effettuare il blink del LED sulla scheda.
Scrivimi all’interno dell’area di programmazione il seguente codice, fate attenzione all’indentazione, come sapete in Python è importante.

import machine
import utime

led_onboard = machine.Pin(25, machine.Pin.OUT)

while True:
    led_onboard.value(1)
    utime.sleep(1)
    led_onboard.value(0)
    utime.sleep(1)

La prima linea di codice:

import machine

Questa prima linea di codice è importantissima in quanto vi consentirà di lavorare con MicroPython sul Pico, importerà la libreria “machine” che contiene tutte le istruzioni necessarie che permettono per fare comunicare MicroPython con Pico ed altri dispositivi compatibili con MicroPython.
Senza questa linea di codice non sarete in grado di controllare nessuno dei pin GPIO di Pico e non potrete controllare il LED sulla scheda.

La seconda linea di codice

import utime

Importa la libreria di MicroPython: “utime”. Questa libreria gestisce tutto ciò che ha a che fare con il tempo, dalla misurazione all’inserimento di ritardi.

led_onboard = machine.Pin(25, machine.Pin.OUT)

Questa riga definisce un oggetto chiamato led_onboard, che è il nome che assegniamo noi per fare riferimento al LED sulla scheda, possiamo tecnicamente utilizzare qualsiasi nome, possibilmente meglio scegliere nomi che abbiamo attinenza con la funzionalità dell’oggetto in modo da rendere più semplice la lettura del programma.
Come si può notare la funzione machine.Pin() è costituita da due parametri: il pin a cui è connesso il LED, il 25, seguito dalla modalità con cui viene usato il pin, OUT. Per chi ha familiarità con la programmazione con Arduino noterà che l’azione è la medesima, cambia solo la sintassi.

Definiamo un loop infinito in cui andremo ad inserire le istruzioni che vogliamo vengano ripetute per sempre.

while True:

Analizziamo le istruzioni nel corpo del while

led_onboard.value(1)

Questa linea di codice imposta il pin ad HIGH però da sola non permetterà ancora l’accensione del LED, è necessario indicare per quanto tempo il LED starà ad HIGH con la riga di codice che segue manteniamo ad 1 (HIGH) il Led per 1 secondo

utime.sleep(1)

Allo stesso modo impostiamo a 0 (LOW) il il pin a cui è connesso il LED

led_onboard.value(0)

facciamo in modo che questo stato duri per 1 secondo:

utime.sleep(1)

Fare ora clic sull’icona play per eseguire lo script:

il LED sulla scheda inizierà a lampeggiare

Per fermare l’esecuzione dello script sulla scheda fare click su STOP

Nel caso in cui invece desiderate rendere l’esecuzione automatica non appena il Pico viene connesso ad una fonte di alimentazione, rinominate il file in main.py e salvatelo sulla scheda

Buon Coding a tutti 🙂

PCTO A.S. 2020 – 2021 – SumoBot – lezione 1

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
  • Arduino Nano (originale o compatibile) nella versione compatibile che utilizza un convertitore da USB a Seriale tipo CH340G è indispensabile installare un driver specifico
  • 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.

Buon Making a tutti 🙂

Arduino: utilizzo del metodo parseInt() per la conversione di un stringa di testo che rappresenta un numero in un numero

Nel primo esercizio della lezione: Arduino: Stepper 28BYJ-48 – AccelStepper library veniva chiesto di impostare i parametri di azionamento del motore passo paso da Serial Monitor, questa operazione può essere svolta usando la classe toInt(), ma in modo più efficace e semplice possiamo usare la classe parseInt(). In questa breve lezione un esempio di controllo del lampeggio di un LED da Serial Monitor mediante l’uso di parseInt().

È possibile ricevere numeri con più di una cifra utilizzando i metodi parseInt e parseFloat che semplificano l’estrazione di valori numerici da seriale. (Funziona anche con Ethernet e altri oggetti derivati dalla classe Stream)

Serial.parseInt() e Serial.parseFloat() leggono i caratteri seriali e restituiscono la loro rappresentazione numerica.

I caratteri non numerici prima del numero vengono ignorati e il numero termina con il primo carattere che non è una cifra numerica (o “.” Se si utilizza parseFloat). Se non ci sono caratteri numerici nell’input, le funzioni restituiscono 0, quindi bisogna controllare i valori zero e gestirli in modo appropriato.

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.

Se avete la Serial Monitor configurata per inviare una nuova riga o un ritorno a capo (o entrambi) quando fate clic su invia, parseInt o parseFloat proveranno ad interpretare il return come numero, ma poiché il ritorno a capo non è un numero il valore restituito da parseInt o parseFloat sarà zero.

Nell’esempio che segue un invio imposta blinkRitardo a zero il che implica che il LED non lampeggia.

// Prof. Maffucci Michele
// 10.11.2020
// Impostazione del delay del Blink da tastiera

int lampeggioRitardo = 0;
int chiave = 0;
void setup()
{
  Serial.begin(9600); // inizializzazione della serial monitor
  pinMode(LED_BUILTIN, OUTPUT); // imposta il pin come output
}
void loop()
{
  // ritardo per evitare una doppia scrittura
  // della prima stampa a monitor
  delay(1000);

  // consente di visualizzare sulla Serial Monitor
  // una sola stampa delle stringa
  if (chiave == 0) {
    Serial.print("Inserisci il ritardo in millisecondi: ");
    chiave = 1;
  }

  // Controlla se è disponibile almeno un carattere sulla seriale
  // La Serial.available() restituisce
  // 1 se presente un cattere,
  // 0 se non è presente un carattere
  
  if (Serial.available())
  {
    int r = Serial.parseInt(); // in r viene memorizzato il valore inserito in numero
    if (r != 0) {
      lampeggioRitardo = r;
      Serial.println(lampeggioRitardo);

      // abilita alla stampa di una nuova stringa:
      // "Inserisci il ritardo in millisecondi: "
      chiave = 0;
    }
  }
  lampeggio(); // funzione che fa lampeggiare il LED su Arduino
}

// il LED lampeggia con i tempi di
// accensione e spegnimento determinati da lampeggioRitardo
void lampeggio()
{
  digitalWrite(LED_BUILTIN, HIGH);
  delay(lampeggioRitardo); // il delay dipende dal valore in lampeggioRitardo
  digitalWrite(LED_BUILTIN, LOW);
  delay(lampeggioRitardo);
}

Esercizio 1
Dato un LED RGB connesso ad Arduino, realizzare un selettore che da Serial Monitor consente di controllare l’accensione e lo spegnimento del rosso, del verde e del blu

Esercizio 2
Svolgere l’esercizio 1 della lezione Stepper 28BYJ-48 – AccelStepper library usando la parseInt()