venerdì 19 Aprile 2024
Home / Curiosità / Tasto di accensione/spegnimento – 2020 edition

Tasto di accensione/spegnimento – 2020 edition

Premessa

Aggiungere un pulsante di accensione e spegnimento a Raspberry Pi è una classica domanda che tutti gli utenti, prima o poi, si sono trovati a porre o a dover dare risposta. Tutti i modelli di Raspberry Pi, infatti, non dispongono di interruttore di accensione: per accenderli basta alimentarli, per spegnerli, occorre impartire un comando si shutdown dal sistema. Questo porterà il Raspberry in uno stato di spegnimento, ma per riaccenderlo da tale stato, occorre togliere e poi ridare alimentazione. Non comodissimo.

Raspberry Pi consuma poco (a seconda del modello si va dal “irrisorio” al “davvero poco” al “poco-poco”), quindi spesso, anche per evitare noie, non è una cattiva idea lasciarlo sempre acceso, sopratutto se svolge anche compiti da server. Ma quando è alimentato a batteria o è inserito in qualche progetto più grande, poterlo accendere e spegnere con un pulsante (o un segnale/contatto) è una bella comodità.

Un’altra guida?

Su queste pagine, in passato, sono già comparse altre guide su come accendere e spegnere il Raspberry Pi tramite comandi esterni:

  1. Connettore P6/RUN (accensione/riavvio)
  2. Pulsante accensione e spegnimento

C’era quindi davvero bisogno della terza guida? Sì, perché le cose cambiano, evolvono, spesso per il meglio, e un sito come www.raspberryitaly.com nasce proprio per evitare di continuare a seguire guide e tutorial non aggiornati. Ora le cose, in questo campo, sono molto più semplici.

Questa guida ti insegnerà ad aggiungere un pulsante con cui potrai accendere il Raspberry Pi quando è spento, e spegnerlo quando è acceso.

Ma lo vedremo presto.

Pulsante

Per accendere e spegnere il Raspberry Pi, vi servirà quindi un pulsante. Cosa è un pulsante? Detto anche “interruttore momentaneo”, “bottone” o “tasto”, un pulsante è un elemento di comando che consente il contato tra due conduttori fintanto che è premuto. Potete scegliere quello che trovate, o che vi piace di più esteticamente, per questo utilizzo: i valori di tensione e corrente con cui lo andremo a impiegare sono così piccoli che in sostanza qualsiasi pulsante andrà benissimo, dal vecchio campanello di casa della nonna, al tasto comprato on-line, passando per i classici pulsanti nei kit Raspberry / Arduino. A dirla tutta, potete utilizzare anche un interruttore o deviatore, con un po’ di ingegno. 

Al pulsante andranno collegati (tipicamente saldati) due fili, che andranno poi a intestarsi sul GPIO di Raspberry Pi. Il consiglio è quindi di usare 2 cavetti jumper, oppure un solo cavetto jumper femmina-femmina tagliato a metà, in cui interporre il pulsante. Se non sapete saldare, potete collegare i fili ai piedini del pulsante (quelli che fanno a capo a due lati diversi del contatto interno) attorcigliandoli e poi fissandoli con colla termica.

Accensione

Nel bootloader (una parte del firmware di Raspberry) è stata aggiunta dal 12/04/2012 una funzione sconosciuta ai più: è possibile accendere un Raspberry Pi collegando tra loro i pin GPIO 3 e GND (praticamente i pin fisici 5 e 6). Mettendo in continuità questi due piedini, il Raspberry Pi partirà con il boot. Collegate quindi al pin 5 e 6 i due cavetti che fanno capo al pulsante, non importa l’ordine. Quando premete il pulsante, il Raspberry Pi si accende. A differenza dell’ utilizzo dei pin P6/RUN, qualsiasi pressione a Raspberry Pi acceso non provoca nessun reset brutale e quindi nessun possibile danno alla SD. Limite: il GPIO3 è usato anche da I2C. Se abilitate I2C, l’accensione funzionerà, ma poi quando è acceso e il pin sarà impegnato da I2C, lo spegnimento con tale pin non può funzionare. E essendo assegnato nel bootloader, il pin di accensione non è modificabile.

Spegnimento

opzione A

Bene, ora potete accendere il Raspberry solo premendo un pulsante. Eccitante vero? Ma ora, come facciamo a spegnerlo, con lo stesso pulsante? Andiamo a editare il file /boot/config.txt , quindi, lanciamo una finestra del terminale (o usiamo SSH da remoto) e digitiamo

Scorriamo verso il fondo del file, e aggiungiamo questa riga:

Ora premiamo CTRL+X per uscire, S per confermare e INVIO per mantenere lo stesso nome del file. Per finire, digitare quanto segue per spegnere il Raspberry Pi:

Bene, attendete che si spenga, e che il LED verde cessi ogni attività. Dopo aver contato fino a 10, potete riaccendere il Raspberry con il vostro nuovo tasto di accensione (tanto lo so che non vedete l’ora di farlo!). Una volta acceso e partito il sistema, una ulteriore pressione sul pulsante, dovrebbe invocare l’uscita dal sistema e lo spegnimento del Raspberry. Avete finito!

Opzione B: il caro vecchio Python

Non funziona lo spegnimento? Nemmeno sul mio Pi4. Ma non temete, facciamo in altro modo. Sempre da una finestra del terminale, digitate:

Questo file non esiste, quindi nano aprirà un file vuoto.

Incollateci questo testo:

Ora uscite sempre con CTRL+X, poi S e INVIO. Se siete più comodi, potete usare qualsiasi altro editor di testo o editor Python, l’importante è che salviate il file con estensione .py

Lo script

Preso pari-pari dagli esempi della libreria Gpiozero, è semplice ma efficace: nelle prime tre righe andremo a importare le librerie che ci necessitano: Button da gpiozero, per gestire il pulsante, check_call da subprocess, per lanciare un comando shell e pause da signal, per mantenere attivo il programma quando l’interprete arriva alla fine. Infatti il tutto è gestito in logica interrupt: grazie alla forma “when_held” (cioè fai qualcosa quando viene tenuto premuto) di gpiozero e a “pause()”che mantiene il programma attivo in attesa di un evento, si può programmare per interrupt in modo estremamente semplice, senza dover ricorrere a cicli infiniti che impegnano comunque risorse. Nella quarta e quinta riga, def shutdown definisce una funzione che lancia il comando “sudo poweroff” tramite la libreria check-call. Proseguendo, shutdown_btn definisce il pulsante con Button: 3 come GPIO3 e 2 come hold_time, che significa che lo considera premuto quando lo teniamo premuto per 2 secondi di fila (è possibile variare questo valore a seconda delle vostre preferenze). Usare una pressione lunga, ci permette di evitare shutdown indesiderati nel caso si toccasse il pulsante inavvertitamente. L’ultima riga prima della pausa, dice: quando shutdown_btn viene tenuto premuto, lancia la funzione shutdown.

Provate il funzionamento dello script lanciandolo 

E poi tenendo premuto il pulsante collegato prima. Raspberry pi dovrebbe uscire dal sistema e spegnersi.

Avvio automatico

Bene, ora non ci resta che mettere in avvio automatico lo script Python, in modo che venga lanciato a ogni avvio.Questo si può fare in una infinità di modi diversi, io ve ne mostro uno (basato su rc.local) ma nulla vieta di usare cron, o altri script che lanciano un programma all’avvio. Se non dovesse funzionare, controllate sempre i permessi, i percorsi dei file, e quale utente va a eseguire il comando. Magari parliamone nella discussione dedicata sul forum.

Riavviamo quindi il Raspberry sempre con il nostro pulsante tuttofare. Quando è partito, sempre da una finestra del Terminale, digitate:

Per editare il file rc.local. In basso, prima della riga “exit 0“, mettete un’altra riga:

Questa invocherà il nostro script. la & finale serve per lanciarlo in background. Ora avete un Raspberry Pi con un elegante pulsante per accenderlo e per spegnerlo!

In caso di dubbi, la discussione sul forum è a vostra disposizione.

Se volete restare aggiornati, seguiteci anche sui nostri social: FacebookTwitter, Youtube, Telegram.

A proposito di Zzed

Appassionato di informatica alternativa, ma perenne novellino di Linux..

Vedi Anche

Raspberry Pi AI Camera

Nuovi Hardware Ufficiali Raspberry Pi

Anticipazioni sui futuri prodotti ufficiali Raspberry Pi!

Powered by themekiller.com