Archivi categoria: arduino

Errori comuni nell’uso di Arduino – utilizzo scorretto dei tipi float e integer

Continuo la segnalazione degli errori più comuni che riscontro nella correzione delle esercitazioni su Arduino che svolgo con i miei allievi.

Capita molto spesso per errore di effettuare calcoli in cui i valori appartengono a tipi diversi, ad esempio quando dividiamo un numero di tipo float ed un numero di tipo int. L’operazione è permessa dal compilatore in quanto l’operazione può essere sfruttata dal programmatore, ma se non si conosce come funzionano le conversioni di tipo in C si rischia di commettere errori.

L’operazione di conversione di tipo è conosciuta anche come typecasting e converte una variabile da un tipo di dato a un altro e può avvenire nelle due direzioni, ad esempio da float ad int o da int a float

Ricordo che:

Il tipo di dato int viene usato per gestire numeri interi, quindi senza decimali e memorizzano valori a 16 bit (2 byte) nel range da 32.767 a -32.768

Il tipo di dato float è usato per i numeri in virgola mobile per la rappresentazione di numeri piccolissimi o grandissimi con o senza segno e con o senza decimali. I float sono memorizzati utilizzando 32 bit (4 byte) nel range tra 3,4028235E+38 a -3,4028235E+38.

int pippo = 4;
float pluto = 10 / pippo; // verificate se questa operazione è corretta
Serial.println(pluto);

Cosa vi aspettate venga visualizzato sulla Serial Monitor?
Dovreste verificare che la divisione restituisce il valore 2, anche se l’operazione dovrebbe restituire il valore 2,5.

Il compilatore vi mostrerà solamente il valore intero.
Per evitare questo problema potete agire in due modi.

Modo 1

Possiamo convertire gli interi in float, in modo che il compilatore sappia trattarli come float anziché interi:

int pippo = 4;
float pluto = (float)10 / (float)pippo;
Serial.println(pluto);

Modo 2

Potete aggiungere un decimale al valore di tipo float, nel caso del valore 10 il valore decimale che possiamo aggiungere è 0, quindi scriveremo il numero come 10.0

int pippo = 4;
float pluto = 10.0 / pippo; // verificate se questa operazione è corretta
Serial.println(pluto);

Qual è il metodo migliore? Dipende, probabilmente il secondo metodo risulta più chiaro e snello nella scrittura, ma siete liberi di scegliere quello che preferite.

Buona Sperimentazione 🙂

EduRobot il ritorno

Prossima settimana per le classi terze impegno di Alternanza Scuola Lavoro presso l’ITIS G.B. Pininfarina, attività di azienda simulata, purtroppo sono stati ridotti i tempi grazie alla legge di bilancio e quindi cosa fare per le due classi 3 Automazione che seguo?

Ho strutturato un’attività derivata da una parte di un modulo didattico di automazione e microcontrollori che sviluppai negli scorsi anni e che ho riadattato nei contenuti e nella forma per poter essere sviluppata in una settimana, come ho disegnato il tutto?

Obiettivo:

ci si pone nelle condizioni di un’azienda che vuole produrre kit robotici per la didattica, l’obiettivo è assemblare i kit che fornirà il Prof., produrre esempi di codice, sviluppare miglioramenti nella struttura e nel codice, pensare al materiale pubblicitario, sviluppare la documentazione tecnica e pubblicitaria in italiano e in inglese.

Per accelerare i tempi ho ripreso il progetto EduRobot sviluppato qualche anno fa, un kit in legno molto semplice nella struttura e nell’elettronica, il progetto si era perso tra gli scatoloni della mia soffitta 🙂

Ho riesumato il tutto e realizzato alcuni elementi 3D adattandoli ai fori già presenti sulla basetta di compensato, in questo modo il kit diventa più semplice nell’assemblaggio.

Curiosamente ho notato che con 4 piccoli elementi stampati in 3D è possibile realizzare un robot semplice di qualsiasi forma si desidera, potreste fissare questi elementi su una basetta rigida: compensato, plexiglass, cartone, ecc… Mi sto convincendo che diventerà uno degli ausili che utilizzerò nei prossimi mesi a scuola, perché?

“Poca spesa tanta resa” 🙂

Per ridurre gli spazi ho impilato un L298N Dual H-Bridge su un Arduino.
Per ora ho utilizzato come fonte di alimentazione una batteria da 9V, certamente so che non è la soluzione migliore, ma pensando a due classi 3, risulta la soluzione che nei tempi e nelle disponibilità economiche risulta più vantaggiosa, modificare il tutto con una pratica batteria LiPo è molto semplice… ci penserò nei prossimi mesi.
Per bilanciare meglio il robot ho aggiunto come peso un batteria aggiuntiva di riserva posta in prossimità della caster ball. Sto già disegnando adattamenti per Raspberry Pi e BBC micro:bit che cercherò di rendere disponibile nel breve.

Certamente entro lunedì proporrò un breve manuale di costruzione e programmazione (riprendo molte cose che ho già realizzato e scritto su queste pagine) per quanto riguarda i sorgenti per la stampa 3D anche questi saranno disponibili da lunedì su Thingiverse, in modo che anche altri, spero, possano utilizzare il materiale per sviluppare attività didattiche.

Tanto merito per la riuscita di questo piccolo progetto alla mia nuova Anet A8 sta stampando giorno e notte da 3 giorni 🙂

A presto.

Errori comuni nell’uso di Arduino – confondere uguaglianza con assegnamento

Durante le attività di formazione e la correzione dei compiti dei miei studenti sull’uso di Arduino ho l’abitudine di documentare gli errori per poi segnalarli all’interno delle mie dispense. Poiché sto sistemando il percorso che svolgo nelle classi 3’ Automazioni presso l’ITIS G.B. Pininfarina di Moncalieri (To) incomincio a pubblicare su questo sito le brevi note collezionate nel mio Evernote, faranno parte di una lezione più ampia, ma ho necessità che vengano usate subito dai ragazzi. Quindi nei prossimi giorni ritroverete su questo sito piccole “pillole” che costituiranno qualcosa di più esteso a scuola e durante i corsi per gli adulti.

Errore: confondere uguaglianza con assegnamento

E’ probabilmente uno degli errori più frequenti, confondere in C l’operatore di assegnamento =  con quello di uguaglianza ==

Con le impostazioni di default dell’IDE Arduino, nella sezione Compiler warning, l’errore non verrà rilevato:

quindi nell’utilizzo di una istruzione if :

If (pippo = pluto)

In questo caso accadrà che il compilatore assegnerà il valore di pluto  a pippo , inoltre bisogna ricordare che in C il valore 0   viene utilizzato per indicare uno stato logico FALSO e qualsiasi altro numero viene utilizzato per identificare un valore VERO, pertanto se il valore di pippo  è diverso da 0 (perché pluto  diverso da 0), la condizione dell’if sarà sempre vera, quindi le istruzioni all’interno dell’if saranno sempre eseguite.

Provate ad eseguire lo sketch che segue, dovreste notare, che pur avendo usato l’operatore di assegnamento, la stringa: Stampo questo messaggio perché l’if è sempre vero  viene stampata sulla Serial Monitor:

int pippo;
int pluto = 1;


void setup() {
  Serial.begin(9600);
}

void loop() {
  if (pippo = pluto) {
    Serial.println("Stampo questo messaggio perché l'if è sempre vero");
  }
}

Allo stesso modo se provate ad eseguire lo sketch che segue, l’istruzione contenuta nell’if non verrà mai eseguita, mentre l’istruzione fuori dall’if sarà sempre eseguita:

int pippo;
int pluto = 0;


void setup() {
  Serial.begin(9600);
}

void loop() {
  if (pippo = pluto) {
    Serial.println("Stampo questo messaggio perché l'if è sempre vero");
  }
  Serial.println("Non eseguo le istruzioni dell'if perchè la condizione è sempre falsa");
}

Per avere una segnalazione da parte del compilatore, sempre dalle impostazioni, nella sezione Compiler warning, selezionate “All”:

Compilando nuovamente uno degli sketch proposti sopra potrete visualizzare il warning, ma ricordate che il programma verrà comunque eseguito:

Buona sperimentazione 🙂

L’ITIS Pininfarina alla 6° edizione del Festival dell’Innovazione e della Scienza.

L’edizione del Festival dell’Innovazione e della Scienza, che si svolge dal 14 al 21 di ottobre ha come focus: “pensa alla salute”.

Il calendario ricco ed articolato testimonia come la rassegna sia ormai diventata una delle più importanti del territorio nazionale a livello di divulgazione scientifica. Il record di presenze dello scorso anno testimonia come il Festival sia un vero e proprio motore di promozione del territorio. L’edizione 2018 consolida e rafforza le collaborazioni strette in area metropolitana rendendo protagonisti del Festival i comuni di Torino, Caselle Torinese, Castiglione Torinese, Collegno, Grugliasco, Leinì, Moncalieri, Nichelino, Rivoli e San Mauro Torinese.
Dal 14 al 21 ottobre, nella città di Settimo Torinese e nei principali luoghi di aggregazione culturale degli altri comuni coinvolti andrà in scena un programma ricchissimo di incontri, caffè scientifici, eventi, exhibit e laboratori finalizzati ad affrontare e valorizzare a tutto tondo le tematiche e i trend più attuali relativi al tema della salute. Dal corpo all’ambiente, dall’alimentazione alla medicina senza dimenticare lo sport, la prevenzione e il benessere della persona.

Anche quest’anno l’ITIS Pininfarina parteciperà al festival nella giornata del 20 di ottobre con attività condotte da un gruppo di allievi di ogni specializzazione dell’istituto che saranno tutor per gli studenti di scuola media.
Io e l’amico Stefano Mercurio abbiamo la fortuna di essere gli insegnanti degli studenti del Pininfarina e coordineremo le attività.

I laboratori svolti dai nostri studenti metteranno in evidenza come la scuola possa diventare un laboratorio aperto, in cui la creatività dei singoli allievi possa esprimersi, un luogo in cui l’aggregazione e il vivere bene insieme favorisce l’apprendimento e la voglia di essere cittadini attivi.

Luogo

BIBLIOTECA ARCHIMEDE
Piazza Campidoglio 50

Settimo Torinese

Il programma

Due attività di Coding

Attività 1

Mattina dalle 10 alle 12
Titolo: Arduino primi circuiti
Descrizione: Gli studenti insegnano ai bambini a realizzare semplici circuiti con Arduino

Attività 2

Pomeriggio dalle 14 alle 16,30
Titolo: Coding a scuola con BBC micro:bit
Descrizione: Attività di Coding e Making con BBC micro:bit, un piccolo computer (4×5 cm), la piattaforma è ideale per lo sviluppo di attività di Coding con forte interazioni con il mondo reale.

All’interno dell’attività 2 sono previste due azioni

Attività 1: Coding con micro:bit e gare robotiche di caccia al tesore e sumo.
Attività 2: Montaggio ed esposizione di robot e sistemi di automazione realizzati con Arduino. Gare robotiche sumo.

La partecipazione  è gratuita ed è possibile prenotarsi fino ad esaurimento posti attraverso il form allegato.

Vi aspettiamo 🙂

Esperienza di laboratorio: verifica della tabella di verità del Flip Flop SR (Set-Reset) con integrato 7402 ed Arduino

Il più semplice circuito digitale di memoria è il flip-flop Set-Reset. Esso è costituito da due ingressi identificati con il nome Set e Reset ed una uscita indicata con .
Accade spesso che i flip flop sono dotati, anche dell’uscita .

In un dispositivo di memoria l’uscita dipende:

  • dalla particolare combinazione che assumono le variabili di ingresso
  • dallo stato precedente assunto dall’uscita Q.

Lo stato precedente dell’uscita lo indichiamo con .

Flip-flop SR con porte NOR

Il simbolo logico, la tabella della verità e la soluzione circuitale a porte logiche NOR di un flip-flop S-R sono indicate nell’immagine che segue:

Combinazioni

Combinazione SR=00

Combinazione di riposo in quanto l’uscita conserva lo stato precedente (Q=Qo).

Combinazione SR=01

Posto R=1, l’uscita Q si porta a 0 indipendentemente dallo stato precedente.

Combinazione SR=10

Posto S=1, l’uscita Q si porta a 1 indipendentemente dallo stato precedente.

Combinazione SR=11

Questa combinazione è da evitare in quanto dal punto di vista logico risulta incongruente, non ha alcun senso comandare il flip-flop per memorizzare lo 0 (R=1) oppure l’1 (S=1).

Modalità di memorizzazione di 1 bit

Per memorizzare 1:

  • Passo 1: impostare S=1 e R=0.
  • Passo 2: impostare lo stato di riposo: S=0 e R=0.

l’uscita conserva lo stato precedente: Q=Qo=1

Per memorizzare 0:

  • Passo 1: S=0 e R=1.
  • Passo 2: impostare lo stato di riposo: S=0 e R=0.

l’uscita conserva lo stato precedente: Q=Qo=0


Ripasso sul funzionamento della porta NOR

L’operazione può essere effettuata su due o più variabili di ingresso. Se chiamiamo con A e B le variabili di ingresso e con Y la variabile di uscita, la somma logica negata assumerà lo stato logico 1 solo se tutte le variabili di ingresso sono allo stato 1, in tutti gli altri casi l’uscita assumerà il valore 1.

La somma logica negata corrisponde al collegamento di una OR seguita da una porta NOT.

si legge A NOR B

Nella figura che segue è mostrata la tabella della verità con le quattro possibili combinazioni delle variabili di ingresso A e B è il simbolo logico corrispondente. Nella colonna Y sono indicati i valori della variabile di uscita Y che soddisfa la definizione della porta logica NOR.


Verifica funzionamento come Flip-Flop S-R

Passo 1

Impostare S=0 e R=1.

L’uscita Q=0, infatti l’uscita Q della porta 2 va a 0 perché l’ingresso R=1.

Su tutti e due gli ingressi della porta 1 abbiamo 0 per cui la sua uscita va ad 1.
Dovreste aver notato che le due uscite sono complementari tra loro.

Passo 2

Impostare la combinazione di riposo: R=0 e S=0.

L’uscita Q nella fase precedente era stata portata a 0 (Qo=0), l’uscita della porta 1 resta ad 1 come conseguenza l’uscita della porta 2 rimane a 0 (Q=0).

Passo 3

Impostare S=1 e R=0.

L’uscita della porta 1 va a 0 come conseguenza, poiché R=0, l’uscita della porta 2 commuta ad 1: Q=1.

Passo 4

Impostare la combinazione di riposo: R=0 e S=0.

L’uscita Q nella fase precedente era stata portata a 1 (Qo=1), l’uscita della porta 1 resta a 0 come conseguenza l’uscita della porta 2 rimane a 1 (Q=1).

Passo 5

Impostare S=1 e R=1 (combinazione proibita)

Le uscite di entrambe le porte NOR commuteranno a 0.
In questo caso, le due uscite non saranno più complementari tra loro.
Inoltre se impostate contemporaneamente R=0 e S=0 entrambe le uscite si porteranno ad 1 e poi a 0 e così via.

Accadrà inoltre che per i diversi tempi di ritardo di propagazione del segnale elettrico in ciascuna porta, uno delle due porte NOR propagherà l’1 in uscita prima dell’altra porta.

Diventa aleatorio il valore dell’uscita Q che, pertanto, potrà trovarsi a 0 oppure a 1. Anche per questo motivo è da evitare la combinazione della tabella della verità: S=1 e R=1.


Fase 1: Verifica tabella di verità del Flip-Flop SR con integrato 7402

Realizzare il circuito e verificare la tabella di verità del Flip-Flop SR.

Lista componenti:

  • IC 7402 (Quad 2 Input NOR)
  • N. 2 R: 10 KOhm
  • N. 2 R: 180 Ohm
  • N. 1 LED Rosso
  • N. 1 LED Verde
  • N 2. Switch

Schema elettrico

Schema di montaggio

Pinout 7402


Fase 2: Realizzare un simulatore di Flip-Flop SR con Arduino

Dato lo sketch Arduino che segue, non commentato, comprenderne il funzionamento, commentare ogni parte e derivare il circuito elettronico di montaggio.

Fasi operative:

  • realizzare lo schema di montaggio in Fritzing;
  • realizzazione pratica del circuito;
  • verifica del funzionamento del circuito;
  • segnalare eventuali correzioni/miglioramenti da effettuare allo sketch.
int pinQ = 10;
int pinQneg = 9;
int pinSet = 8;
int pinReset = 7;

int pinLedSet = 5;
int pinLedReset = 4;

int statoOutNorReset = 0;
int statoOutNorSet = 0;

int statoOutNorResetSuc = 0;
int statoOutNorSetSuc = 0;

boolean statoQ = 0;
boolean statoQneg = 0;
  
void setup()
{
  pinMode(pinSet, INPUT);
  pinMode(pinReset, INPUT);

  pinMode(pinQ, OUTPUT);
  pinMode(pinQneg, OUTPUT);

  pinMode(pinLedSet, OUTPUT);
  pinMode(pinLedReset, OUTPUT);
}

void loop()
{
  boolean statoSet = digitalRead(pinSet);
  boolean statoReset = digitalRead(pinReset);

  if (statoSet == 1) {
    digitalWrite(pinLedSet, HIGH);
  } else {
    digitalWrite(pinLedSet, LOW);
  }

  if (statoReset == 1) {
    digitalWrite(pinLedReset, HIGH);
  } else {
    digitalWrite(pinLedReset, LOW);
  }

  statoOutNorSet = statoQneg;
  statoOutNorReset = statoQ;
  
  statoOutNorResetSuc = !(statoReset || statoOutNorSet);
  statoOutNorSetSuc = !(statoSet || statoOutNorReset);
  
  digitalWrite(pinQ, statoOutNorReset);
  digitalWrite(pinQneg, statoOutNorSet);

  statoQneg = statoOutNorSetSuc;
  statoQ = statoOutNorResetSuc;
}

Si ricorda è obbligatorio:

  • inserire un’intestazione come indicato nell’immagine che segue, in cui indicare:
    • Cognome e Nome
    • Classe
    • Esercizio/Sommario funzionamento
  • tutto il codice deve essere commentato;
  • tutto il codice deve essere correttamente indentato;
  • ogni allievo dovrà utilizzare 1 singola scheda Arduino;
  • il codice dovrà essere consegnato al docente su Google Classroom secondo le indicazioni date a lezione.

Buon lavoro 🙂