Robotica 2

Programma di Robotica  della classe quarta (aggiornato al 2023)

Numero di ore/settimana: 3 ore

Numero di ore/a.s.: 99 ore

Libro di testo


Modulo 1

PROGRAMMAZIONE CON MACCHINA A STATI

Macchine a stati

Esempi di macchine a stati

Forme di Moore o di Mealy

Parcheggio

Passaggio a livello

Ruota della fortuna

Robot da cucina

Tastierino numerico

Esercizi vari


Modulo 2

DISEGNO E STAMPA 3D  (vale come corso PCTO)

Disegno 3D con Onshape

Tazza

Braccio manipolatore (base, braccio e composizione con movimenti)


Modulo 3

LINEFOLLOWER 

Conversione dello Zumo-Robot in Linefollower

Controllo on-off senza modificare scheda sensori

Studio del robot 3PI - tecnica di lettura sensori con pin digitali

Progettazione e realizzazione nuova scheda sensori

Controllo proporzionale - derivativo - integrativo

Realizzazione programma e collaudo


Modulo 4

MICROCONTROLLORE ATMEGA328 e PORT MANIPULATION

Caratteristiche e piedinatura

Memoria RAM e rete logica dei Pin di I/O

Port manipulation (registri, operatori bit a bit, puntatori)

Realizzare un segnale PWM con il port manipulation

Timer

Calcolo durata di una istruzione

Realizzare un segnale PWM con i timer

Gestione ADC con i registri


Modulo 5 - opzionale (vale come corso PCTO)

LABVIEW

Pannello frontale

Diagramma a blocchi

Esempi di utilizzo


Modulo 6 - opzionale

ROBOT RESCUE LINE

Robot 3PI

Arduino mega e scheda MEGA 2560 PRO

Scelta sensori, motoriduttori, servomotori e alimentazione

Progettazione schema robot

Macchina a taglio laser 

Inkscape

Progettazione e realizzazione base robot con macchina a taglio laser 

Progettazione e realizzazione braccio

Realizzazione software e collaudo robot



Anni scolastici precedenti

Prova di verifica

Una gru portuale serve per caricare container su una nave. La gru è dotata di un sistema di caricamento magnetico dei container e può spostare i container verso l’alto, verso il basso e verso la nave sul piano orizzontale.

È stato stabilito che ogni volta che un container viene posizionato sotto la nave in una apposita area, l’operatore attraverso un pannello di controllo abbassa il gancio magnetico fino a toccare il container, lo aziona, tira su il container, lo sposta verso la nave in modo da posizionarsi sopra la nave, abbassa il container, lo sgancia, si riposiziona sopra la banchina.

Si vuole realizzare un dispositivo elettronico capace di controllare la gru con queste specifiche

1) RA0 e RA1: controllo tramite driver dell’altezza del gancio magnetico;

2) RA2 e RA3: pulsanti per gestire l’altezza gancio magnetico;

3) RB0 e RB1: controllo tramite driver dello spostamento del gancio magnetico verso la nave e viceversa;

4) RB2 e RB3: pulsanti per gestire lo spostamento del gancio magnetico verso la nave e viceversa;

5) RB4: sensore di prossimità che avverte il microcontrollore che il container è sotto il gancio, il microcontrollore deve bloccare lo spostamento del gancio verso il basso;

6) RB5: led che si accende quando RB4 è attivo;

7) RB6: controllo driver gestione calamita gancio;

8) RB7: pulsante di accensione e spegnimento della calamita del gancio;

9) RA4: pulsante conferma sgancio, va premuto dopo aver premuto e rilasciato pulsante collegato a RB7.

Facendo le ipotesi aggiuntive che si ritengono necessarie, tra cui quello di prevedere un sistema di correzione software antirimbalzo di 100ms, si scriva un programma in linguaggio C per un microcontrollore PIC16F84 che gestisca il sistema di comando della gru.

Bozza soluzione

#include "pic.h"

unsigned long giorno;

long entrate=0;

void setup(void)

{

    TRISA=0b11100;  // RA0 - RA1  driver gestione motore controllo altezza gancio

                  // RA2 – RA3 pulsanti  controllo altezza gancio

                   // RA4  pulsante conferma sgancio

    TRISB=0b10011100;  // RB0 - RB1  collegati al driver gestione motore controllo spostamento orizzontale gancio

                // RB2 - RB3 pulsanti  controllo spostamento orizzontale gancio

                // RB4 sensore gancio

                // RB5 led che indica prossimità gancio-container

                // RB6 driver gestione calamita gancio

                // RB7 pulsante per gestire calamita

    // impostazione OPTION

    T0CS=0;  // Timer0 impostato come timer

    PSA=0;  // Prescaler assegnato al Timer0

    PS0=1;  // Prescaler divide per 4

    PS1=0;

    PS2=0;

    // con prescaler TclockTimer=Tclock*4*4=4us

  

    // impostazione INTCON

    T0IE=1;  // Abilita interrupt sul overflow del Timer0

    GIE=1;    // Abilita interrupt

}

unsigned long time=0, time1=0;

 

void interrupt isr(void)             // interrupt program

{

    time++;

    time1++;  // ipotesi aggiuntiva: led lampeggia durante spostamenti

    if (time1=250 && led)

    {

        time1=0;

        RB5=!RB5;

    }

    TMR0=0x06;   // Timer0 da 6 a 256 => 250 volte 4 us = 1 ms

    T0IF=0; // azzeramento flag di interrupt Timer0

}

 

int stato=0, gancio_attivo=0, led=0, sensore_attivo=0;

void loop(void)      // ipotesi aggiuntiva: resistenze di pull-up abilitate → pulsanti funzionano in logica inversa

{

    if (!RA2 && !stato)  // comando alza

    {

        stato=1;

        time=0;

    } 

    if (time ==100 && stato==2) // antirimbalzo di 100ms

    {

        stato=0;

        RA0=1;

        led=1;

    }  

    if (RA2 && stato==2) // ferma

    {

        stato=0;

        RA0=0;

    }  

    if (!RA3 && !stato)  // comando abbassa

    {

        stato=3;

        time=0;

    } 

    if (time ==100 && stato==3) // antirimbalzo di 100ms

    {

        stato=4;

        RA1=1;

    }  

    if ((RA3 ||  (RB4 && !sensore_attivo) ) && stato==4 )   // ferma

    {

        stato=0;

        sensore_attivo=1;

        RA1=0;

        led=0;

        if (RB4) RB5=1;  // accende led sensore

    }  

    if (!RB2 && !stato)    // comando avvicina

    {

        stato=5;

        time=0;

    } 

    if (time ==100 && stato==5)   // antirimbalzo di 100ms

    {

        stato=6;

        RB0=1;

    }  

    if (RB2 && stato==6)   // ferma

    {

        stato=0;

        RB0=0;

    }  

    if (!RB3 && !stato)  // comando allontana

    {

        stato=7;

        time=0;

    } 

    if (time ==100 && stato==7) // antirimbalzo di 100ms

    {

        stato=8;

        RB1=1;

    }  

    if (RB3 && stato==8) // ferma

    {

        stato=0;

        RB1=0;

    }  

    if (!RB7 && !stato && !gancio_attivo)  // comando aggancia

    {

        stato=9;

        time=0;

    } 

    if (time ==100 && stato==9)  // antirimbalzo di 100ms

    {

        stato=10;

        RB6=1; 

        gancio_attivo=1;

    } 

    if (RB7 && stato==10) stato=0;

    if (!RB7 && !stato && gancio_attivo)    // comando aggancia

    {

        stato=11;

        time=0;

    }

    if (time ==100 && stato==11) stato=12;    // antirimbalzo di 100ms

    if (RB7 && stato==12) stato=13;

    if (!RA4 && stato==13)

    {

        stato=14;

        time=0;

    }

    if (time ==100 && stato==14)  // antirimbalzo di 100ms

    {

        stato=15; 

        gancio_attivo=0;

        RB6=0;

    } 

}

void main(void)

{

    setup();

    while(1) loop();

}   

Prova di verifica sul Robot Sumovore

Domande di preparazione alla prova scritta sul Sumovore (Datasheet)

In merito al robot Sumovore si risponda alle seguenti domande con un massimo di 20 parole, tenendo conto che:

1) le porte NOT sono dei trigger con le soglie 0,9 e 3,2V

2) il driver L293 ha una soglia ViL di 0,2V e una soglia ViH di 2,3V

3) che la carica del condensatore ha il seguente andamento.

1. spiegare come il QRD1114 genera il livello logico alto in uscita dalla porta NOT

2. spiegare come il QRD1114 genera il livello logico basso in uscita dalla porta NOT

3. verificare con i dovuti passaggi e calcoli se la tensione sul diodo led IR corrisponde a 1,7V (dal datasheet si ricava Ifoward=20mA e Vcc=5V)

4. verificare con i dovuti passaggi e calcoli se la corrente sul diodo led IR corrisponde a 50mA (dal datasheet si ricava Vfoward=1,7V e Vcc=5V)

5. spiegare la funzione del diodo D8

6. scrivere il calcolo del tempo di ritardo ΔT legato alla scarica del condensatore C13 sulla resistenza R13 e trovare il ritardo in millisecondi

7. spiegare cosa succede al LED7 quando l'ingresso della prima porta NOT ha una transizione da livello logico alto a livello logico basso

8. spiegare cosa succede al LED7 quando l'ingresso della prima porta NOT ha una transizione da livello logico basso a livello logico alto

9. spiegare la funzione del diodo D2

10. spiegare cosa succede al motore quando l'ingresso della prima porta NOT ha una transizione da livello logico alto a livello logico basso

11. spiegare cosa succede al motore quando l'ingresso della prima porta NOT ha una transizione da livello logico basso a livello logico alto

12. scrivere il calcolo del tempo di ritardo ΔT legato alla scarica del condensatore C11 sulla resistenza R20 e trovare il ritardo in millisecondi

13. scrivere il calcolo del tempo di ritardo ΔT legato alla carica del condensatore C11 attraverso la resistenza R20 e trovare il ritardo in millisecondi

14. spiegare la funzione del dispositivo IR

15. scrivere il calcolo del tempo di ritardo ΔT legato alla scarica del condensatore C3 sulla resistenza R3 e trovare il ritardo in millisecondi

16. scrivere il calcolo del tempo di ritardo ΔT legato alla carica del condensatore C3 attraverso la resistenza R3 e trovare il ritardo in millisecondi

17. spiegare cosa succede all'uscita “To IR Left” quando sul pin 1 del “Left Det1” si ha una transizione da livello logico basso a livello logico alto

18. spiegare cosa succede all'uscita “To IR Left” quando sul pin 1 del “Left Det1” si ha una transizione da livello logico alto a livello logico basso

19. quando si accende il LED1?

20. che tipo di segnale si trova sul pin 3 del 555?

21. per quale motivo è stato inserito un BJT?

22. a che servono LED4 e LED5?

23. a che serve il trimmer TP1?

24. che succede se il cursore del trimmer viene portato alle due estermità?

25. che corrente c'è nel diodo Led IR se Vd=1,7V?

Domande per la preparazioene alla prova di verifica su PICduino

1) Quanti sono i pin di ingresso/uscita digitali del microntrollore PIC16F84?

2) Quanti connettori femmina vengono montati su PICduino? Quanti pin hanno?

3) Quanti connettori maschio vengono montati su PICduino? Quanti pin hanno?

4) Quale è la distanza tra i pin in millesimi di pollice e in millimetri?

5) Le piste che arrivano ai connettori femmina su quale layer sono? Perchè?

6) Le piste che arrivano ai connettori maschio su quale layer sono? Perchè?

7) Quanti morsetti a vite vengono montati su PICduino? Quanti contatti hanno?

8) Le piste che arrivano ai morsetti a vite su quale layer sono? Perchè?

9) A che serve la resistenza da 330 ohm?

10) Come si è calcolato il valore di 330 ohm?

11) A che serve la resistenza da 10 kohm?

12) A che serve la presa USB?

13) A che serve il morsetto a vite?

14) A che serve il connettore femmina a 3 pin del Reset? Perché un pin non è collegato?

15) A che serve il diodo 1N5817? Perchè è stato individuato quel diodo?

16) A che serve il quarzo?

17) A che servono i due condensatori da 22 pF?

18) A che serve il condensatore da 100 nF? Perchè è posizionato vicino al PIC?

19) A che serve il connettore maschio a 5 pin indicato con Program?

20) A che serve il connettore femmina a 6 pin indicato con +5V e GND?

21) In quanti modi si può alimentare PICduino e come?

22) Peché c'è un pin non collegato nel connettore RA?

23) Su quale layer sono le scritte? Perchè?

24) Quanto sono larghe le piste in millesimi di pollice e in millimetri?

25) Quanto sono larghe le piazzole in millesimi di pollice e in millimetri?

26) Quanto sono larghi i fori in millesimi di pollice e in millimetri?

27) A che serve il led?

28) Perchè la carcassa del connettore USB non è stata collegata a massa?

29) Quanto sono larghe le vias in millesimi di pollice e in millimetri?

30) A che servono le scritte "K"?

31) A che servono le scritte "1"?

32) Quali sono le dimensioni della basetta?

32) A quali distanze sono stati collocati i connettori femmina sulla basetta e perchè?

33) E' possibile usare uno shield di Arduino su PICduino?

34) Che distanza c'è tra i pin del morsetto a vite?

35) Le piste verdi su che layer sono?

36) Le piste rosse su che layer sono?

PIC16F84

Programmi in C per il microcontrollore PIC16F84

Materiale di preparazione alla prova di verifica

Quanti sono i pin che possono essere configurati come uscite del PIC16F84?

Quanti sono i pin che possono essere configurati come ingressi del PIC16F84?

Ci sono dei pin che configurati come uscite sono open-drain? Se ci sono quanti sono?

A che serve il registro TRISA?

Che funzione ha il registro PORTB?

Che funzione ha il registro PORTA?

Ci sono dei pin configurati come ingressi che sono collegati a un trigger di schmitt ? Se ci sono quanti sono?

A che serve il Timer0?

Se si imposta il Prescaler al massimo, si assegna al Timer0 e si abilita T0IE, ogni quanto tempo si scatena l'interrupt?

Quanti flag si trovano nel registro INTCON?

A che serve il bit GIE?

Che funzione hanno le porte tri-state collegate internamente ad ogni pin?

Se si mette MCLR a massa che succede?

A che serve il pin T0CKI?

Come funziona il pin RB0/INT?

Come si passa dall'accesso al banco 0 della RAM al banco 1?

Come si disabilitano le resistenze di pull-up sui pin della PORTB?

Se collego un quarzo tra i pin OSC1 e OSC2 il clock del PIC non funziona. Cosa manca?

Che differenza c'è tra VDD e VSS?

A che serve il bit T0CS?

Che funzione ha il bit PSA?

Per mettere il prescaler al massimo come devo configurare i bit PS2, PS1, PS0?

A che serve il bit INTF?

Dove si trova il bit EEIF?

Con un quarzo da 1 MHz, assegnando il prescaler al WatchDog, quanto ci mette il Timer0 ad andare in overflow?

Con un quarzo da 4 MHz quanto occorre per eseguire un'istruzione?

A cosa serve lo satack?

Dove si trova lo stack?

Quanti tipi di memorie ci sono nel PIC16F84?

SUMOVORE

Domande di preparazione alla prova di verifica n.2

Preso in esame lo schema del robot Sumovore

Si spieghi con massimo 3 righe la funzione:

1) dei dispositivi QRD1114

2) del filtro D8-C13-R13

3) del filtro D7-C14-R12

4) dei led LED6 e LED7

5) del filtro R20-C11

6) del filtro R21-C12

7) dei driver collegati ai due motori in cc

Si descriva il comportamento del circuito quando il sensore alto passa sulla linea bianca

Si descriva il comportamento del circuito quando il sensore basso passa sulla linea bianca

Svolgere il calcolo del ritardo del filtro D8-C13-R13 sul passaggio al livello alto di un ingresso del 74AC14 (soglie 0,9V e 3,2V)

Si descriva il funzionamento del partito di tensione (2 x 47kohm) all'ingresso del trigger (pin 17)

Descrivere il funzionamento delle resistenze R18 e R19

Descrivere il funzionamento del filtro C3-R3

Come viene prodotto il segnale a 38KHz?

Come viene rilevato il segnale a 38kHz?

Che funzione ha il transistor 2N2222 collegato al pin3 del 555?

Come funziona il temporizzatore dei 5 secondi?

Per quale motivo è stato scelto un LM2937 al posto di un 7805?

A che serve il trimmer TP1 a fianco del 555?

A che serve il trimmer TP4 sul circuito "5 second startup"?

Quando si accende il led1?

Quando si accende il led6?

A che serve il trimmer TP2 a fianco del QRD1114?

Anno scolastico 2013-14

Materiale di preparazione alla prova di verifica

Questionario di preparazione alla verifica

1) Disegnare lo schema elettrico con un pulsante (e degli altri componenti necessari) collegato al PIC16F84 in modo che, quando si preme il pulsante, il microcontrollore PIC esegue il programma di interrupt, utilizzando il pin RB0/INT, che è attivo basso.

2) Il registro INTCON contiene i bit di abilitazione per tutti i tipi di interrupt.

Completare le istruzioni riportate di seguito per configurare il registro INTCON in modo che premendo il pulsante si attiva un interrupt, e in modo che tutte le altre fonti di interrupt sono disabilitati.

    INTCON = 0b... ... ... ... ... ... ... ... ...;

3) Completare le istruzioni per configurare tutti i pin di PORTA e i quattro pin meno significativi di PORTB come ingressi e i quattro pin più significativi di PORTB come uscite,

     ... ... ... ... ... = 0b... ... ... ... ... ... ... ... ...;

     ... ... ... ... ... = 0b... ... ... ... ... ... ... ... ...;

4) Un microcontrollore PIC è utilizzato per controllare il funzionamento di un ascensore in un parcheggio multipiano. Se un passeggero preme l'interruttore di allarme il programma avvisa l'operatore della sorveglianza facendo lampeggiare un LED sul pannello di controllo e attivando il suono di un cicalino. Il LED lampeggia con una frequenza di 2 Hz fino a quando l'operatore preme un pulsante di reset.

Spiegare il motivo per cui è meglio che l'interruttore di allarme provochi un interrupt, piuttosto che includere una sezione di codice nel programma principale per vedere se l'interruttore è stato premuto o no.

Il programma di interrupt viene chiamato Allarme e la prima linea di codice è:

interrupt isr()

Il programma di interrupt fa uso di un sottoprogramma Quarto() che crea un ritardo di 0.25 secondi,

poi fa uso di un sottoprogramma Senti() che controlla un LED collegato al bit 0 e PORTB,

controlla un cicalino collegato al bit 1 di PORTB,

controlla l'interruttore di allarme collegato al bit 0 di PORTA.

Scrivere il codice del programma Senti().

Secondo questionario di preparazione alla verifica

Quali tipi di variabili si devono utilizzare per realizzare nel PIC16F84 un ritardo molto lungo con il linguaggio C?

· Completare il seguente programma di interrupt in C per un PIC16F84 che gestisce differenti situazioni:

1) se RA0 ha un fronte in salita si accende RB0

2) se RB4 o RB5 cambiano stato si accende RB1

3) se RB6 cambia stato ed è bassa si accende RB2

4) se RB7 cambia stato ed è alta si accende RB3

interrupt isr()

{

    ...

    ...

    ...

    RBIF=0;

    INTF=0;

}

· Scrivere il codice di setup() per programmare i pin per la gestione del programma precedente.

· Scrivere due programmi in C per fare accendere 22 led con 2 PIC16F84. Quando il primo PIC ha acceso l'ultimo led mette il livello logico alto su RB7 che è collegato a RA0 del secondo PIC. Il secondo PIC, una volta avuto il consenso su RA0, inizia ad accendere i propri led. Quando il secondo PIC ha acceso l'ultimo led mette il livello logico alto su RB7 che è collegato a RA0 del primo PIC. Alla fine si deve vedere sempre un led acceso che gira su un cerchio di 24 led.

· Scrivere un programma in C per la gestione di ascensore con un PIC16F84. Sull'ascensore ci sono tre pulsanti (PianoT, Piano1, Piano2). Quando vengono premuti il PIC comanda il motore avanti o indietro per un tempo regolabile via software.

· Aggiungere al precedente programma in C per l'ascensore con un PIC16F84 la gestione dei pulsanti di chiamata. Ad ogni piano c'è un pulsante (ChiamataT, Chiamata1, Chiamata2). Quando vengono premuti il PIC controlla che l'ascensore non sia in movimento e comanda il motore avanti o indietro in modo da arrivare al piano della chiamata.

· Scrivere un programma in C per la gestione di un passaggio a livello con un PIC16F84. Il passaggio a livello riceve il comando di chiusura dalla centrale: il pin RB0 va alto. Dal momento che si riceve il comando il PIC accende due led lampeggianti alternativamente su RB1 e RB2 per un tempo regolabile via software. Al termine del tempo viene abbassata la sbarra mettendo RB3 = 1 e le luci da lampeggianti diventano fisse.

ESERCIZI PROVA DI VERIFICA

ESERCIZIO 1

Scrivere un programma in C per un PIC16F84, con un clock a 4 MHz, per fare lampeggiare un led con un periodo di 500 ms se l'ingresso RB0=1, o con  un periodo di 250 ms se l'ingresso RB0=0.

ESERCIZIO 2

Scrivere un programma in C per un PIC16F84, con un clock a 1 MHz, per fare lampeggiare due led alternativamente con un periodo di 500 ms se l'ingresso RB0=1, o insieme con  un periodo di 250 ms se l'ingresso RB0=0.

ESERCIZIO 3

Scrivere un programma in C per un PIC16F84, con un clock a 1 MHz, per fare lampeggiare un led con un periodo di 500 ms se l'ingresso RB0=1, se invece l'ingresso RB0=0 lampeggia un altro led con  un periodo di 250 ms.

ESERCIZIO 4

Scrivere un programma in C per un PIC16F84, con un clock a 20 MHz, che accenda 8 led nel seguente modi:

- se RA0=0 gli 8 led di accendono uno dopo l'altro fino ad avere tutti i led accesi, poi lampeggiano tutti insieme per 2 s, poi si spengono tutti e si inizia da capo ad accendere un led per volta ripartendo dal primo

- se RA0=1 gli 8 led di accendono uno alla volta, uno dopo l'altro, fino ad avere solo l'ultimo led acceso, poi l'ultimo led lampeggia per 2 s, poi si accendono uno alla volta, sempre uno dopo l'altro, ma al contrario fino ad avere solo il primo led acceso, poi il primo led lampeggia per 2 s e si inizia da capo.

Il tempo che deve intercorrere tra l'inizio di un'accensione e l'inizio di un'altra deve essere di 200 ms.

ESERCIZIO della LINEA per fare il pane