Archivi categoria: i miei allievi

Errori comuni nell’uso di Arduino – inserimento del punto e virgola alla fine di ogni istruzione

Il punto e virgola è usato come segno di terminazione istruzione, ma non è da usare nelle istruzioni composte: if, for, while, do while e la direttiva per il preprocessore #define.

Di seguito alcuni esempi che mettono in evidenza questo tipico errore.

Versione non corretta

if (temperatura > 25);          // questo punto e virgola non è corretto
{
  digitalWrite (normaleTemp, LOW);
  digitalWrite (allarmeTemp, HIGH);
}

for (int i = 0; i < 15; i++);   // questo punto e virgola non è corretto
  digitalWrite (i, HIGH);

I punti e virgola indicati nell’esempio sopra terminano le istruzioni “if” e “for” e ciò non permetterà l’esecuzione delle istruzioni che sono presenti nel corpo delle rispettive istruzioni.

Versione corretta

if (temperatura > 25)
{
  digitalWrite (normaleTemp, LOW);
  digitalWrite (allarmeTemp, HIGH);
}

for (int i = 0; i < 15; i++)
digitalWrite (i, HIGH);

In questo caso le istruzioni presenti nel corpo della if vengono eseguite se la condizione temperatura>25 è vera, nel secondo caso, nel for, sarà eseguita l’istruzione che segue fino a quando la condizioni<15 risulta vera.

Come si può notare nel for, nel caso in cui sia presente una sola istruzione nel corpo, non è indispensabile inserire le parentesi graffe, non è comunque un errore inserirle e scrivere:

...
for (int i = 0; i < 15; i++)
{
  digitalWrite (i, HIGH);
}

Errore simile viene spesso commesso quando si usa il #define

Versione non corretta

#define PIN_LED 8;    // non bisogna inserire il punto e virgola
#define PIN_LED = 8;  // non bisogna inserire ne = e ne ;

Versione corretta

#define PIN_LED 8

il #define non richiede il punto e virgola.

Possiamo ottenere lo stesso risultato dell’istruzione precedente utilizzando const:

const byte PIN_LED = 8;

Questa scrittura rimane coerente rispetto alla scrittura delle variabili che fa uso dei simboli = e ; ma non efficiente dal punto dello spazio di memoria utilizzata rispetto alla #define.

Buon Coding a tutti 🙂

Utilizzare un orologio RTC con Arduino – Modulo Tiny RTC I2C

Scrivo questo post come base di partenza per le sperimentazioni che farò svolgere ai miei studenti nei prossimi giorni sull’uso degli RTC. L’acronimo RTC si riferisce a Real Time Clock, un orologio in tempo reale. Un RTC ed è alla base di moltissime automazioni in cui è indispensabile gestire una serie di processi in funzione di una specifica data e ora, si pensi ad esempio alla semplice gestione dell’illuminazione di un locale oppure alla realizzazione di un data logging o ancora la gestione del condizionamento automatico di un locale in funzione della data e dell’ora.
Ricordo ai miei studenti che nella sessione ordinaria del 2018 dell’esame di maturità per l’indirizzo elettronica ed elettrotecnica, articolazione di automazione, si faceva riferimento ad un sito archeologico in cui erano presenti due locali affrescati in cui era necessario controllare il numero massimo di persone presenti, gestire la temperatura in maniera diversa nel periodo invernale ed estivo ed inoltre doveva essere controllata anche l’umidità relativa.
Erano presenti inoltre domande in riferimento all’illuminazione massima all’interno dei locali ed altri quesiti a cui darete risposta durante le esercitazioni di laboratorio nelle prossime settimane.

Cito parte del testo dell’esame di maturità:


a) la temperatura deve essere mantenuta tra i 6°C e i 12°C nel periodo invernale e tra i 20°C e i 24°C nel periodo estivo; quando la temperatura scende al di sotto dei valori minimi si attivano delle piccole piastre riscaldanti, poste a 1 metro dal pavimento, fino al raggiungimento della temperatura media, mentre se la temperatura è troppo elevata si attiva il sistema di aerazione che al raggiungimento della temperatura media si disattiva;

b) l’umidità relativa deve essere mantenuta nel range 45% ±5% per evitare la proliferazione di muffe; tale livello viene garantito azionando per 10 minuti, se si è fuori dal range, gli aeratori o il sistema di nebulizzazione a pompa posto a muro.

L’obiettivo di questo post è quello di mostrare come gestire un RTC.

Il modulo utilizzato è un Tiny RTC I2C dotato di un integrato DS1307 I2C RTC di cui allego datasheet. Sulla scheda è presente una batteria tampone ricaricabile al litio LIR2032 che permette il funzionamento dell’RTC in assenza di alimentazione esterna, ovvero il mantenimento dell’ora e della data anche quando viene disconnesso dal microcontrollore che lo utilizza.

Il pilotaggio dell’RTC avviene mediante il protocollo I2C, che come già spiegato in precedenti lezioni, permette la comunicazione tra due o più dispositivi I2C utilizzando un bus a due fili più un terzo filo per il riferimento di massa comune a tutti i dispositivi.
Poiché il protocollo I2C utilizza 7 bit per indirizzare il dispositivo sul bus, il numero massimo di dispositivi collegabili sul bus è di 128 dispositivi, però il numero scende a 112 in quanto 16 indirizzi sono riservati.
Il bus è costituito da una linea dati SDA (Serial Data line), una line di clock SCL (Serial Clock line) e come detto sopra al filo di massa comune a tutti i dispositivi.

Per collegare il Tiny RTC I2C si faccia riferimento allo schema che segue:

Per poter pilotare il DS1307 è necessario installare una libreria specifica, ne esistono diverse quella che utilizzeremo sarà quella di Adafruit la RTClib. Installate la libreria: Sketch > Include Library > Manage Libraries

Si aprirà il gestore librerie, nel campo di ricerca inserite il testo RTClib come indicato nell’immagine che segue e procedere con l’installazione dell’ultima versione disponibile:

Al termine dell’installazione apparirà la voce INSTALLED a fianco della libreria installata

Con la libreria vengono resi disponibili una serie di sketch di esempio che potete aprire direttamente da: File > Examples > RTClib.

Aprite lo schetch: DS1307 di seguito indicato:

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include "RTClib.h"

RTC_DS1307 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () {
  while (!Serial); // for Leonardo/Micro/Zero

  Serial.begin(57600);
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
}

void loop () {
    DateTime now = rtc.now();

    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();

    Serial.print(" since midnight 1/1/1970 = ");
    Serial.print(now.unixtime());
    Serial.print("s = ");
    Serial.print(now.unixtime() / 86400L);
    Serial.println("d");

    // calculate a date which is 7 days, 12 hours, 30 minutes, and 6 seconds into the future
    DateTime future (now + TimeSpan(7,12,30,6));

    Serial.print(" now + 7d + 12h + 30m + 6s: ");
    Serial.print(future.year(), DEC);
    Serial.print('/');
    Serial.print(future.month(), DEC);
    Serial.print('/');
    Serial.print(future.day(), DEC);
    Serial.print(' ');
    Serial.print(future.hour(), DEC);
    Serial.print(':');
    Serial.print(future.minute(), DEC);
    Serial.print(':');
    Serial.print(future.second(), DEC);
    Serial.println();

    Serial.println();
    delay(3000);
}

Nello sketch sono presenti due righe fondamentali, che risultano commentate e che secondo necessità possiamo decommentare ed utilizzare.

Se desideriamo che l’ora e la data venga impostata non appena viene caricato sulla scheda lo sketch bisogna decommentare la riga:

rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

che permette di leggere la data e l’ora corrente in cui sono presenti le costanti predefinite all’interno dell’IDE Arduino: DATE e TIME, che si riferiscono alla data e all’ora di compilazione dello sketch, quindi non appena compilate vengono impostate e passate all’orologio che assume queste come data e ora corrente.

Nel caso si desidera impostare manualmente l’ora e la data bisognerà decommentare la riga:

rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));

inserendo data e ora corrente, ad esempio facendo riferimento alla data 08/01/2020 ore 01:37 dovrete scrivere:

rtc.adjust(DateTime(2020, 1, 8, 1, 37, 0));

La parte restante del codice si occupa di stampare sulla Serial Monitor data e ora corrente. Nel codice è presente una parte in cui viene stampato una data futura ed il numero di secondi trascorsi da una specifica data.

Ricordate che, come specificato nella setup() la seriale è impostata con una velocità di 57600 caratteri al secondo e quindi nella finestra della Serial Monitor dovrete impostare questa velocità per visualizzare il testo:

Questo il risultato:

Per i miei studenti:

Esercizio 1

Convertire nel formato italiano data e ora ottenendo un output come quello indicato nell’immagine che segue:

Esercizio 2

Realizzare uno sketch che permette l’accensione di un led connesso al pin 3 ogni minuto nell’intervallo da 0 a 15 secondi, spento nei restanti secondi all’interno del minuto. Visualizzare sulla Serial Monitor l’ora corrente.

Esercizio 3

Fare in modo che il led dal 50° al 59° secondo incominci a lampeggiare velocemente e nell’intervallo da 0 a 15 secondi sia acceso.

Esercizio 4

Stesse specifiche dell’esercizio 4 però facendo aumentare progressivamente la frequenza di lampeggio del LED all’approssimarsi del 59° secondo.

Buon lavoro 🙂

Programmare Arduino con Platform IO

L’IDE di programmazione Arduino è notoriamente semplice da utilizzare, possiede le funzionalità minime per poter scrivere, compilare e caricare sulla scheda il codice prodotto, però le operazioni messe a disposizione sono minime e solamente nella versione che è stata presentata durante la scorsa MakerFaire di Roma, di cui avevo dato notizia in un precedente post, sono state aggiunte una serie di funzionalità di editing che tendono a farlo diventare un editor di programmazione professionale.
Attualmente il nuovo IDE è ancora in versione Beta quindi si dovrà attendere qualche tempo.
Esistono molti ambienti di sviluppo professionali che aggiungono modalità di autocompletamento, facile accesso ad ogni parte del codice, numerose scorciatoie da tastiera. Tra gli abbienti più diffusi che farò sicuramente utilizzare ai miei studenti vi è Visual Studio Code di Microsoft che con l’estensione Platform IO, sviluppato in Python, fornisce un set di strumenti di nuova generazione per lo sviluppo di sistemi embedded in C / C ++. L’estensione è gratuita ed Open Source.
Le schede supportate sono moltissime, ad oggi sono 769, tra cui ESP32, ESP8266, schede della famiglia ST Nucleo e tutte le schede della famiglia Arduino.
Platform IO può essere eseguito su Windows, Mac e Linux e su piccoli computer basati su architettura ARM come: Raspberry Pi, BeagleBone, CubieBoard, Samsung ARTIK, ecc. Platform IO viene fornito con numerosi esempi e librerie.

Vantaggi

  • completamento automatico del codice C / C ++
  • Smart Code Linter che non è presente nell’IDE Arduino.
  • Supporto del tema scuro e chiaro
  • Smart Code Navigations
  • Formattazione del Codice
  • Cross-platform build system indipendente dal sistema operativo
  • File Explorer che aiuta organizzare i file.
  • Comodo gestore delle librerie, Serial Monitor evoluto e molto altro.

L’uso di PlatformIO è molto semplice e richiede pochi passaggi per l’installazione.

Installazione

Dal sito di riferimento: https://platformio.org/

far click su “install PlatformIO Now”

Sarete reindirizzati sulla pagina di riferimento di PlatfprmIO IDE

Prelevare Visual Studio Code facendo click su “Install for VSCode”, sarete reindirizzati sulla pagina di riferimento. Selezionate il sistema operativo del vostro computer e fate click su Download:

Durante il download sarete reindirizzati su una pagina che mostra le caratteristiche principali di VSCCode

Non sono necessarie installazioni, è sufficiente un doppio click per avviare l’applicazione:

Selezionate l’icona Extensions (5’ icona)

Inserite nel campo di ricerca Platform IO e troverete immediatamente l’estensione, come potete immediatamente notare VSCode può essere utilizzato per programmare anche in altri linguaggi: C/C++, C#, Python, PHP, Go, JavaScript, TypeScript, Node.js e molti altri.

Click su Install per installare l’estensione.

La fase di installazione durerà qualche minuto ed in questa fase non chiudete la finestra.

Sulla destra della finestra apparirà un messaggio che vi avverte che l’installazione è andata a buon fine, fate click su “Reload Now”

Quando l’installazione è terminata vedrete la seguente interfaccia:

Vi consiglio di riavviare VS Code Editor dopo l’installazione di Platform IO.

Ciò completa la fase di installazione di Platform IO ed è pronto per essere usato.

Realizziamo il primo Sketch ed inizieremo con il solito Blink che scriveremo all’interno di Platform IO.

Fate click su “+ New Project”

Apparirà una finestra in cui dovrete inserire il nome del programma, nel mio caso ho scelto: “blink-PIO”, selezionate poi il tipo di scheda, noterete che mentre scrivete il nome della scheda vi verrà fornito il suggerimento per il completamento, selezionate Arduino Uno, il campo “Framework” viene completato automaticamente:

Il progetto necessita di qualche secondo, giusto il tempo per creare risorse e dipendenze file.

Al termine apparirà la pagina di riferimento del progetto:

Nella struttura ad albero che compare sulla sinistra della finestra selezionate: src e successivamente main.cpp sulla destra vedrete un sketch pronto con le funzioni setup() e loop() vuoti:

Si noti che PlatformIO non ha l’accesso predefinito alle librerie Arduino, quindi ogni volta che si scrive il codice per Arduino bisogna includere sempre all’inizio dello sketch la libreria Arduino.h

#include<Arduino.h>

Incominciate a scrivere il codice, noterete immediatamente la comparsa del menù di autocompletamento:

Nella parte sinistra della finestra, nella sezione “OUTLINE” potrete spostarvi immediatamente tra le funzioni presenti nel codice:

Procediamo ora alla compilazione del codice: fate click su “PlatformIO: Build” al fondo della finestra (fascia azzurra)

Nella parte bassa della finestra trovate le funzioni: Build, Upload, Upload to Remote Device, Clean, Test, Run Task, Serial Monitor, New Terminal inoltre avete anche icone che vi mostrano: warning ed errori.

Procediamo ora alla compilazione e al trasferimento sulla scheda. Collegate la vostra scheda al computer, il riconoscimento della scheda è automatico:

Click su “PlatformIO: Upload” per trasferire il programma sulla scheda.

Se tutto è stato eseguito correttamente il LED L sulla scheda incomincerà a lampeggiare.

Buon Coding a tutti 🙂

La rinascita del Lego Mindstorms NXT 2.0 – programmiamolo in C

Di recente ho scoperto che nella scuola presso cui lavoro sono presenti una serie di Lego Minstroms NXT 2 e come credo sappiate questa versione non può essere più programmata utilizzando l’ultima versione dall’IDE grafico di Lego, quello che attualmente viene utilizzato per per la versione EV3.
In questi giorni ho ripreso in mano la vecchia versione del mattoncino per capire come recuperarlo ed utilizzarlo in ambito didattico. In passati articoli su questo blog avevo segnalato tutti i possibili linguaggi di programmazione che possono essere utilizzati con tutte le versioni di Mindstorms, tra questi però prediligo il linguaggio C in quanto i miei allievi devono utilizzarlo in altri ambiti: microcontrollori, PIC ecc… quindi un primo passo potrebbe essere quello di imparare a programmare in C realizzando robot con l’NXT 2.

Premessa importante.

On-line trovate una serie di tutorial per usare il vecchio mattoncino, alcuni consigliano di utilizzare addirittura Windows XP su un vecchio PC o su PC virtualizzato, ovvimente io sconsiglio vivamente questa strategia soprattutto perchè da anni Microsoft non supporta più XP ed inoltre mina seriamente la sicurezza del computer (virus).

Prelevate dal link indicato di seguito l’ultima versione dell’NXT-G rilasciata dalla Lego al cui interno sarà già presente il driver corretto per il vostro sistema operativo Windows 10, driver che per altro sarà indispensabili per chi intende anche programmare in C il mattoncino. Nello stesso link trovate i riferimenti per gli utenti MacOS X.

Nel caso abbiate sul vostro computer una versione precedente dell’NXT-G non più funzionate potete procedere alla sola installazione del driver NXT Fantom Driver che risolve una serie di problemi di comunicazione, inoltre questo driver permetterà di sistemare tutti i problemi che si hanno con altri ambienti di sviluppo come: LejOS, RobotC, ecc…

Pagina di riferimento per il download

Windows 10

MacOSX

Veniamo ora all’ambiente di sviluppo in C.
Vi consiglio di utilizzare Bricx Command Center (BricxCC) ambiente Open Source adatto per tutte le versioni Mindstorms: RCX, NXT ed EV3. L’IDE di programmazione funziona per tutte le versioni di Window a 64 bit.

Nella pagina trovate il link “latest version” che NON dovete prendere in considerazione in quanto vi rimanda ad una serie di versioni NON compatibili con Windows 10.

SEGUITE invece il link test release, il nome è fuorviante, ma è quello giusto.

Dopo una serie di test ho verificato che la versione corretta è quella che fa riferimento al file: bricxcc_setup_33810_20130220.exe

E’ un file autoscompattante, all’interno ritroverete la seguente struttura:

Doppio click sul file BricxCC

Comparirà la finestra “Find Brick”

Queste le impostazioni:

Port: Automatic
Brick Type: NXT
Firmware: “Standard”

Nel caso abbiate la necessità di caricare l’ultima versione del Firmware sul mattoncino potete procedere in due modi:

Modo 1 (consigliato): utilizzate NXT-G ed aggiornate il firmware

Modo 2: da BricxCC, menù Tools > Download Firmware selezionate l’ultima versione che trovate nella cartella BricxCC: lms_arm_nbcnxc_132.rfw

Per quanto riguarda le impostazioni dell’ambiente BricxCC dal menù: Edit > Preferences…

Queste le impostazioni del pannello: Compiler > NBC/NXC

Bene! Il vostro vecchio mattoncino NXT 2 è rinato 🙂 pronto per realizzare tutti i robot che desiderate.

Buon Coding a tutti 🙂

Arduino Plate v02

In queste settimane ho utilizzato in laboratorio la prima versione dell’Arduino Plate ed osservando la modalità di utilizzato da parte dei ragazzi ho effettuato alcune modifiche producendo una seconda versione che condivido con voi.

In questa nuova versione ho aumentato i fori disponibili in modo che si possano fissare altre schede elettroniche, inoltre ho aggiunto un supporto che permette di porre in verticale in due modalità diverse l’intera plate.

La posizione verticale è stata pensata per:

  • poter illustrare e mostrare meglio i collegamenti sulla scheda,
  • per ridurre gli spazi sul banco di lavoro,
  • per avere un punto di visione del circuito più comodo sul banco della classe o sulla scrivania di casa.

Inoltre il supporto è anch’esso forato e può ospitare altri elementi come ad esempio delle batterie di alimentazione che favoriscono con il loro peso la stabilità dell’intera struttura.

Nei file che condivido troverete due versioni per il supporto della plate, pensate per il taglio di compensato con spessore da 3mm e 4mm. Come sempre potete prelevare i file per il taglio laser direttamente da Thingiverse, nel caso modificate e migliorate come ritenete.

Buona sperimentazione a tutti.