Archivi tag: arduino

EduRobot – ASL (Alternanza Scuola Lavoro) – Manuale di costruzione – 1/3

Al terzo anno, presso l’istituto dove attualmente lavoro, l’ITIS G.B. Pininfarina di Moncalieri (To), gli studenti svolgono un’attività di azienda simulata e per l’occasione, visto i tempi brevi di cui si dispone ho ripreso un progetto di qualche anno fa EduRobot (trovate i riferimenti seguendo il link), un kit robotico con struttura in legno a bassissimo costo che sviluppai come parte di un modulo di automazioni che svolsi in altra scuola.

L’idea è quella di simulare un’azienda che sviluppa e produce kit robotici per la didattica per l’insegnamento del Coding per gli studenti di scuola media. Gli studenti sulla base del kit che ho prodotto, dovranno costruirlo, programmarlo, pensare a soluzioni per migliorarlo sia dal punto di vista hardware che software, realizzare la manualistica e depliant pubblicitari in lingua inglese.

Questo manuale di lavoro vuole essere la guida per i miei allievi di 3A Automazione e 3B Automazione e per tutti coloro che intendono realizzare un robot.

La struttura è costituita da un supporto in legno su cui collocare tutta l’elettronica, la struttura potrete realizzarla di qualsiasi altro materiale o forma in quanto gli elementi di base sono realizzati in 3D e si adattano a qualsiasi supporto, per recuperare il materiale precedente acquistato riutilizzerò la base di EduRobot.

Per chi desidera stampare gli elementi seguite il link alla pagina di Thingiverse dove ho reso disponibile tutti i file, troverete gli elementi che si adattano ad EduRobot e gli elementi generici che potrete usare per qualsiasi robot.

Per i miei allievi: tutti gli elementi sono stati già stampati e la breadboard è già fissata su un supporto in legno.

Nei file stl che trovate su Thingiverse ho aggiunto un il file: Supporti-Motori-Universale.stl da sostituire a Supporti-Motori-EduRobot.stl nel caso in cui voi non basate la vostra costruzione su EduRobot.

Nel prossimo futuro sostituirò la batteria di alimentazione da 9V con una batteria LiPo.

Il manuale è strutturato in 3 parti

  1. Manuale di costruzione (questa pagina)
  2. Manuale collegamenti elettrici
  3. Manuale di programmazione

Per i miei studenti del Pininfarina

  • Tutta l’attività sarà valutata.
  • Sarà fornito un kit già montato che dovrà essere condiviso tra la 3A Automazione e 3B Automazione in modo che, nel caso di dubbi, possiate usarlo come riferimento.
  • Tutti gli elementi stampati in 3D dovranno essere fissati con delle viti metalliche. Ricordo a tutti di non forzare troppo il serraggio delle viti in quanto potreste rompere gli elementi stampati in 3D.
  • Tutti gli elementi consegnati sono di proprietà del sottoscritto e poiché userò questi elementi anche in altre classi vi chiedo la massima cura nella gestione dei materiali, nel caso di problemi non esitate a contattarmi.
  • Questa manualistica di assemblaggio sarà conservata nella sezione EduRobot di questo sito.
  • Attenzione alla gestione dei motori! I cavi di collegamento sono saldati ai due poli del motore, questi sono estremamente delicati, per evitare rotture ho utilizzato una fascetta di plastica che dovrebbe evitare il distacco.
  • Nella kit fornito aggiungerò un quantitativo di dadi e viti maggiore a quello realmente necessario, saranno tutti di misura M3.
  • Non sono richiesti attrezzi aggiuntivi, all’interno del kit avete ha disposizione anche un piccolo cacciavite a stella sufficiente per la costruzione del robot, se preferite potete utilizzare anche gli strumenti disponibili in laboratorio.
  • Nel caso di rotture di qualsiasi apparato comunicare tempestivamente al docente presente in aula e poi a me in modo da poter sostituire tempestivamente l’oggetto (ma spero ciò non accadrà 😉 ).
  • Al termine di ogni lezione riporre all’interno del contenitore fornito tutti i semilavorati.
  • Ogni scatola è numerata, su di essa è indicato il numero del gruppo e la classe.
  • In ogni scatola troverete un piccolo contenitore dove riporre le minuterie.
  • Ogni robot è numerato. Il numero del robot NON coincide con il numero della scatola.
  • Non sono richieste saldature.

Procedimento

Orientamento del robot

Nelle spiegazioni si farà riferimento all’orientamento specificato nelle immagini che seguono:

Passo 1

Per questa fase avrete bisogno di:

  • breadboard
  • alloggiamento batteria di scorta
  • due dadi M3
  • due viti M3 da 12 mm
  • giravite a stella

Fissare sulla basetta di compensato con due viti da 12 mm la breadboard (già fissata su basetta di legno) e l’alloggiamento per la batteria di riserva.

Passo 2

Per questa fase avrete bisogno di:

  • caster ball
  • due dadi M3
  • due viti M3 da 10 mm
  • giravite a stella

Fissare la caster ball facendo attenzione all’orientamento, l’elemento di rinforzo obliquo deve essere orientato come riportato in figura, i dadi M3 devono entrare nella sede della struttura della caster ball, serrare il tutto con viti da 10 mm.

Passo 3

Per questa fase avrete bisogno di:

  • elementi realizzati al passo precedente
  • due supporti motori
  • quattro dadi M3
  • quattro viti M3 da 12 mm
  • giravite a stella

Fissare i motori alla basetta di compensato mantenendo la testa delle viti verso il lato inferiore del robot così come indicato nell’immagine.

Passo 4

Per questa fase avrete bisogno di:

  • elementi realizzati al passo precedente
  • due motori
  • quattro dadi M3
  • quattro viti M3 da 25 mm
  • giravite a stella

Fissare i motori ai supporti usando due viti da 25 mm. L’orientamento dei motori deve essere con i punti di saldatura dei fili verso l’interno della struttura, così come indicato nell’immagine che segue. Far passare i cavi dei motori attraverso i fori quadrati.

Passo 5

Per questa fase avrete bisogno di:

  • scheda motori L298N
  • supporto scheda motori
  • 3 dadi M3
  • 3 viti M3 da 10 mm
  • giravite a stella

Avvitare la scheda motori L298N con 3 viti da 12 mm.

Verificate che i jumper siano disposti come rappresentati nell’immagine che segue:

Passo 6

Per questa fase avrete bisogno di:

  • elementi assemblati del passo precedente
  • scheda Arduino
  • supporto compensato
  • 4 dadi M3
  • 4 viti M3 da 35 mm
  • supporto scheda Arduino
  • giravite a stella

Sul lato superiore della basetta di compensato posizionare il supporto per la scheda Arduino ed inserire le 4 viti M3 da 35 mm e su di esso inserire la scheda L298N in modo da realizzare una struttura a sagwitch.

Passo 7

Per questa fase avrete bisogno di:

  • elementi assemblati del passo precedente
  • 2 dadi M3
  • 2 viti M3 da 10 mm
  • batteria da 9V
  • jack connessione batteria
  • giravite a stella

Avvitare con due viti da 10 mm l’alloggiamento per la batteria da 9V mantenendo i due svasi del supporto batteria verso il lato sinistro come indicato nell’immagine.

Passo 8

Per questa fase avrete bisogno di:

  • elementi assemblati del passo precedente
  • 2 ruote

Inserire le ruote. Fate attenzione! Non spingete con forza. Il profilo del foro e del mozzo sono costituiti da un mozzo smussato è l’inserimento può avvenire in un solo modo.

Passo 9

Per questa fase avrete bisogno di:

  • elementi assemblati del passo precedente
  • batteria 9V di riserva

Inserire la batteria aggiuntiva nella sede al di sotto del robot. Questa batteria servirà inoltre per appesantire il robot nella parte anteriore ed evitare che in accelerazione il robot si alzi anteriormente.

Buon lavoro 🙂

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 🙂

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 🙂