Motorizza il tuo Natale!


Informatica / sabato, Gennaio 25th, 2020

Natale si avvicina, i bambini stanno già pensando ai regali che Babbo Natale gli porterà, ma tu sei un Maker e stai già progettando il prossimo entusiasmante progetto con il tuo fedele seguace: RaspberryPi.

Se ancora non hai nessunae idea, te ne propongo una io e con questa scusa possiamo vedere insieme come usare il RaspberryPi con l’aiuto dell’immancabile libreria GpioZero, i precisi motori stepper, l’oscilloscopio Piscope e un led RGB.

Premetto che questa guida si basa su Raspbian Stretch (non Lite) perché necessitiamo delle GTK3 per usare l’oscilloscopio, mentre ho scelto il kit motore passo/passo e controller perché è facile e pratico.

Requisiti:

  • Kit motore step, in questo caso Motore: 28BYJ
  • 48 5V, controller: ULN2003APG;
  • LED RGB;
  • Un alimentatore per RaspberryPi, in grado di erogare una corrente sufficiente a alimentare tutti gli elementi;
  • Un client SSH con X11, se usato tramite console (ad esempio, MobaXterm).

Funzionamento:

L’uso dei motori stepper non è intuitivo come può esserlo per i motori comuni, per ottenere precisione necessitano di una sequenza di impulsi precisa e ben scandita, la quale si troverà nel relativo datasheet del motore.

Fonte Wikipedia: “...I motori passo-passo sono motori che, a differenza di tutti gli altri, hanno come scopo quello di mantenere fermo l’albero in una posizione di equilibrio: se alimentati si limitano infatti a bloccarsi in una ben precisa posizione angolare. Solo indirettamente è possibile ottenerne la rotazione: occorre inviare al motore una serie di impulsi di corrente, secondo un’opportuna sequenza, in modo tale da far spostare, per scatti successivi, la posizione di equilibrio. È così possibile far ruotare l’albero nella posizione e alla velocità voluta semplicemente contando gli impulsi ed impostando la loro frequenza, visto che le posizioni di equilibrio dell’albero sono determinate meccanicamente con estrema precisione…

Guardando la foto del kit si nota che ci sono 4 pin con scritto IN1, IN2, IN3, IN4 i quali comandano i relativi elettromagneti, alimentati dai due pin – e + a 5V.

Per verificare la posizione dei pin sul connettore GPIO, si può usare il comando pinout, introdotto nelle ultime versioni di GpioZero.

Collegamenti:

I questa guida ho scelto di collegare gli elettromagneti del mio kit motore, cosi:

IN1 -> GPIO6
IN2 -> GPIO13
IN3 -> GPIO19
IN4 -> GPIO26
“–”   -> 0V
“+”  -> 5V

Il LED RGB viene gestito tramite tre pin, uno per ogni colore primario (Red, Green, Blue) ed un pin comune: il negativo o il positivo in base al vostro modello 

In questa guida ho scelto di usare i pin:

V (positivo)-> 3.3V (Se invece hai il comune andrà collegato a GND)
Red -> 10
Green -> 9
Blue -> 11

Software

Requisiti:

I requisiti software sono: Python3, GpioZero, GTK3 e piscope. Se come me lo usi da remoto, servirà anche un client SSH che supporta X11.
Usando Raspbian Stretch (non Lite) avrai già tutto preinstallato tranne piscope, l’oscilloscopio, che useremo dopo.
Nel caso avessi problemi con le installazioni, chiedi aiuto nel nostro forum.

L’oscilloscopio piscope necessita del servizio usato da pigpio installabile tramite apt, anche se non sarà proprio l’ultimissima versione.

sudo apt-get update
sudo apt-get install -y pigpio python-pigpio python3-pigpio

Ora che abbiamo il servizio di monitoraggio disponibile: avviamolo con sudo pigpiod , mentre per fermarlo basterà un semplice killall.

sudo killall pigpiod

Procediamo con l’installazione di piscope

wget abyz.co.uk/rpi/pigpio/piscope.tar
tar xvf piscope.tar
cd PISCOPE
make hf
make install

Completata l’installazione sarà sufficiente avviarlo dopo il servizio pigpiod.

piscope &

Per usarlo tramite SSH dobbiamo far passare i comandi X11 tramite console, e per farlo necessitiamo di un client SSH che lo supporti, sinceramente consiglio l’uso di MobaXterm che di default ha già tutto configurato. Presta attenzione a non avviarlo come root, cioè col comando preceduto da sudo, perché darà errore.

Script:

Gli script si posso scrivere in mille modi, quindi sentiti libero di perfezionarlo a piacere in base alla tue abilità, lo scopo di questa guida è solo dare uno spunto semplice per iniziare a creare un progetto interessante.
Creiamo lo script con il nostro editor preferito o l’IDE di Python3, mentre da console basterà

nano natale.py

Per il motore passo/passo, importiamo solo ciò che ci serve dalla libreria gpiozero e da time

from gpiozero import OutputDevice # importo l'oggetto OutputDevice
from  time import sleep           # importo la pausa

Purtroppo gpiozero ancora non ha un classe dedicata ai motori stepper, quindi useremo quella per un dispositivo di output generico OutputDevice, di cui useremo i valori (1,0) per comodità, al posto di on e off.

Prepariamo il motore assegnando ai pin GPIO del RaspberryPi la class OutputDevice

IN1 = OutputDevice(6)
IN2 = OutputDevice(13)
IN3 = OutputDevice(19)
IN4 = OutputDevice(26)


Prepariamo una comoda variabile V per assegnare il tempo/velocità di rotazione del motore.

V = 0.001 # Velocita, tempo di attesa tra un elettromagnete e l'altro

Ora, la parte difficile: la sequenza di accensione degli elettromagneti, ricavabile tramite il datasheet del motore scelto. In questo caso è un motore 28BYJ-48.

seq = [[1,0,0,1], [1,0,0,0], [1,1,0,0], [0,1,0,0], [0,1,1,0], [0,0,1,0], [0,0,1,1], [0,0,0,1]]   #sequenza presa dal datasheet

In sostanza per eseguire uno step i pin devono venire accesi e spenti in sequenza, intervallati dalla pausa V . Scrivendo questa riga abbiamo creato un array chiamato seq, i cui valori potranno venir richiamati tramite seq[posizione] , esempio seq[1] sarà uguale a [1,0,0,1] , perché il primo indice è sempre zero.

Il bello del kit usato è che ha dei led che si attivano in base al pin attivato.

Creiamo una funzione di richiamare a piacere tramite step(n° di step)

def step(N):               # funzione per andare avanti di n step     
    for x in range(N):     # ciclo per tot step inviati alla funzione        
        for I in range(8): # ciclo per 8 sequenze dei pin per eseguire uno step            
            IN1.value,IN2.value,IN3.value,IN4.value = seq[I]            
            sleep(V)       # aspetta tra un elettromagnete e l'altro, cioè la velocita

e proviamola con

step(512)       # Quando serve basta scrivere step(numero di step da fare)

step() chiama la funzione e 512 viene assegnato alla variabile N, la quale determina quante volte eseguire il ciclo step completo.

Ovviamente è semplificato al massimo ed il valore di un giro completo è sempre ricavabile dal datasheet del motore.

Come esercizio propongo di provare a creare il movimento in senso contrario, invertendo la stessa sequenza e di provare i vari valori di pausa V.

Il LED RGB:

Essendo un progetto di Natale ci servono le luci colorate, quindi riprendiamo ciò che abbiamo letto nell’ articolo Rss, WordPress e Gpio le notifiche in stile Raspberry Pi sul’uso del LED RGB, ma attenzione, in questo caso avrà il pin 3.3V e non GND.

from gpiozero import RGBLEDrgb = RGBLED(10,9,11,False)

Il pin GPIO 10 sarà il rosso, il 9 il verde, l’11 il blue e False determina che useremo il pc 3.3V

Poi riprendiamo il comodo comando che avevo preparato nell’altra guida per usare un linguaggio più umano nello script, cosi invece di ricordarci (0,0,1), basterà scrivere blu.

rosso, verde, blu , bianco, giallo, viola, azzurro, nero = (1,0,0), (0,1,0), (0,0,1), (1,1,1), (1,1,0), (1,0,1), (0,1,1), (0,0,0)

Per le funzioni complete della classe RGBLED vi invito a leggere la documentazione ufficiale

Il nostro LED RGB è cosi pronto a illuminare il nostro presepe con semplicita ed effetto scenico.

rgb.pulse(on_color=azzurro,fade_in_time=1,fade_out_time=2)

rgb è il nome che abbiamo scelto per questo RGB LED, potreste averne altri.
Pulse attiverà una luce pulsante
on_color determina il colore, per questo il comando di prima semplifica le cose
fade_in_time e fade_out_time determinano quando deve restare acceso e spento.

Extra:

Non ha niente a che fare col natale, ma un oscilloscopio ci aiuta a capire un po’ meglio come stanno lavorano le porte GPIO in tempo reale.

Colleghiamoci al nostro RaspberryPi e avviamo il server pigpiod e piscope, se usiamo ssh sarà necessiaro attivare la funzione X11 del client.

sudo pigpiod

piscope &

Piscope farà vedere in tempo reale i valori high/low dei pin PGIO, potremmo selezionare solo i pin preferiti e zoommare il grafico.
Avviamo il tutto tramite

sudo pigpiod ; piscope & python3 natale.py

Ottimo: abbiamo la base pronta per fare ciò che più ci piace! Ora basta solo scegliere cosa animare ed illuminare a festa!

ArtAttack:

Ora inizia la parte stile ArtAttack:

1. posizioniamo il nostro RaspberryPi, motore e LED dentro ad una scatola da scarpe
2. fissiamo il motore e il LED
3. tagliamo la parte alta di una bottiglia d’acqua a base quadrata e attacchiamo il tappo al motore , cosi lo sfondo sarà intercambiabile
4. incolliamo sulla bottiglia una striscia, con disegnati cielo e tetti delle case, di giorno e di notte, nei quattro lati
5. tagliamo un buco quadrato davanti alla scatola, per far vedere il paesaggio
6. incolliamo il disegno di Babbo Natale davanti alla finestrella creata
7. mettiamo il LED dove preferiamo, per la luce del paesaggio
8. programmiamo il nostro script per far ruotare degli step necessari per vedere un lato del paesaggio, poi aspettare un tot di tempo
9. programmiamo il LED per simulare la luce solare in base all’ora del giorno, oppure luci casuali

Sprigiona la tua fantasia e crea qualcosa di unico da condividere con tutti, proponi il tuo progetto nel forum, potenzialo con musiche, sensori di distanza, comandi vocali, relè e tutto ciò che ti passa per la testa; si potrebbe creare qualcosa legato ai lancia spaziali partendo dalla guida Raspberry Pi e i lanci spaziali .

Link utili:

Datasheet 28BYJ-48

Dettagli sul motore 28BYJ-48

Documentazione gpiozero

Descrizione Motore Stepper

Simulatore fuoco