Add-on per il Raspberry PI


Alla fine non ho resistito alla voglia di trafficare un po' sulla "bestiolina" qui sopra e me la sono regalata. Il Raspberry PI, che all'ombra dello stellone diventa Lampone Pi Greco, racchiude in una scheda delle dimensioni di una carta di credito un computer decoroso, con tanto di audio, video full HD, 4 porte USB e connettori dedicati alle periferiche esterne. Il sistema operativo è caricato su una scheda microSD; il più comune è derivato dalla distro Debian di Linux, ma sono scaricabili altri sistemi operativi orientati ad utilizzi specifici o perfino una versione di Android. Il suo impiego tipico è nei sistemi "embedded" dove, grazie alla connettività verso l'esterno e alle varie possibilità di programmazione, può operare da PLC, proto-board in stile Arduino, server di vario tipo. Le possibilità sono davvero tante e internet offre una gamma molto ampia di esempi, librerie software, guide, schede di espansione...
Nel mio caso, l'idea è quella di implementare un server APRS con gateway sulla rete internet,. Per il momento mi sto "facendo le ossa" e attualmente ho configurato un router wifi "al contrario" e relativo server DHCP, ad uso wi-fi extender; in futuro ho in mente un server di archiviazione NAS, e magari un server di stampa.Con un consumo elettrico di un paio di watt, l'aggeggio rimarrà acceso ininterrottamente senza monitor nè tastiera, solo una chiavetta wi-fi per l'accesso alla rete e una seriale RS232 per il modem radio. Per quanto riguarda la seriale è possibile utilizzare un convertitore USB/RS232, ma il piccoletto ha una UART bella e pronta con accesso dal "pettinone" a 40 pin presente sulla scheda; dunque basta adattare i livelli TTL a 3.3 volt allo standard RS232 ed il gioco è fatto. Integrati dedicati quali il MAX3232 sono proprio pensati per questo scopo e schedine già pronte sono acquistabili per qualche euro. Per una volta niente saldatore? Non se ne parla nemmeno, naturalmente! Il problema è che i classici NOT a transistor non funzionano perchè i livelli 0/3.3 volt non rientrano nelle specifiche dello standard. Sul connettore però sono presenti anche i 5 volt che bastano al corretto riconoscimento degli stati logici della linea TXD, quindi ho pensato di utilizzare il "rail" a 3.3 volt dal lato raspberry e quello a 5 volt lato TNC/PC. Visto che stava prendendo forma una schedina aggiuntiva ho pensato di implementare anche la funzione di chiusura del sistema operativo (shutdown) particolarmente utile in quanto, come in qualunque computer, lo spegnimento "brutale" tramite l'interruttore di alimentazione non è troppo salutare. Il risultato è questo:


Lo schema non ha bisogno di commenti; ogni transistor inverte lo stato logico del segnale corrispondente adattando nel contempo le tensioni, D1 interviene quando la linea RXD lato RS232 è a stato logico 1, cioè -12 volt. La scheda utilizza un connettore a 10 pin per raggiungere i segnali necessari ed è stata fresata con un dremel-clone su uno sfrido di piastra ramata. Le linee RXD/TXD della UART fanno capo ai rispettivi pin, mentre per lo spegnimento ho utilizzato la linea GPIO4 del processore alla quale ho connesso un pulsante che chiude verso massa. Tramite software viene attivata una resistenza di pull-up interna grazie alla quale viene rilevata la pressione del pulsante e attivato lo spegnimento del sistema mediante un apposito script. L'attivazione della procedura e quindi lo "spegnimento in corso" è visibile mediante l'accensione di un piccolo LED connesso alla linea GPIO3.

Costruzione
Il montaggio non presenta difficoltà e la realizzazione si porta a termine in un paio d'ore. Quello che ci vuole quando il tempo è scarso! Il connettore a 10 pin va montato sul lato rame della piastra; un minimo di attenzione ed il gioco è fatto.
Non resta che inscatolare il tutto, in quanto il RasPI, come dicono gli anglofoni, arriva a casa "nudo". Naturalmente sono in vendita contenitori dedicati di tutte le fogge e colori, ma spesso costano oltre 10 euro, praticamente la metà del computer. Ecco che ancora una volta è intervenuto il DIYer-braccino, quindi ho recuperato il contenitore di un ricevitore DTT defunto. Qualche foro per il passaggio dei cavi ed il montaggio del connettore ed ecco il risultato. Decoroso, tutto sommato...
E' il momento di occuparsi della parte software. Il raspberry può eseguire comandi tramite script, che automatizzano ciò che potrebbe essere immesso tramite tastiera, oppure mandare in esecuzione programmi compilati con un qualsiasi linguaggio di programmazione fra quelli disponibili per il sistema. Per ottenere il mio scopo ho consultato qualche tutorial in rete e di conseguenza ho personalizzato uno script in Python. Eccolo:

#! /usr/bin/env python
# Carico le librerie necessarie a gestire gli input/uotput e il delay
import subprocess
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
# imposto GPIO4 (pin 7) come ingresso e attivo la resistenza di pull-up
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# imposto GPIO3 (pin 5) come uscita
GPIO.setup(3, GPIO.OUT)
# imposto GPIO3 basso, LED spento
GPIO.output(3, 0)
# Attendo la pressione del pulsante
wait_for_edge(4, GPIO.FALLING)
# Pulsante premuto, accendo il LED e immetto il comando di spegnimento del sistema
GPIO.output(3, 1)
subprocess.call(['shutdown -h now "System halted by GPIO action"'], shell=True)
# Attendo 2 secondi, poi rilascio le risorse. Tutto fatto.
time.sleep(2)
GPIO.cleanup()

Affinchè questo file sia eseguibile e attivo già dall'accensione occorre, come si conviene in ogni sistema Linux, settare gli attributi del file e aggiungere il comando opportuno alla "catena" di script eseguiti all'avvio del sistema. Seguendo le ottime guide in rete le operazioni sono alla portata di tutti. Per la cronaca, nel mio caso ho aggiunto una riga al file /etc/rc.local:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
# Lancio dello script per spegnimento del sistema
sudo ./home/pi/scripts/s_down &
exit 0

E' la prima volta che mi cimento con questo linguaggio, quindi ho modificato solo alcune righe per poter accendere il led alla pressione del pulsante ed avere così conferma che il comando di spegnimento è in esecuzione. Dallo spegnimento del led all'effettivo alt del sistema passano ancora alcuni secondi; è saggio attendere che il led verde "act" a bordo scheda smetta di lampeggiare prima di togliere alimentazione.
Accertato (con un monitor collegato o una console remota) che il pulsante di spegnimento fa il suo dovere è il momento di occuparsi della seriale. Con l'installazione standard la UART permette di effettuale un login remoto tramite terminale esterno, ma in questo modo rimane impegnata per questo servizio e non è disponibile per le applicazioni. Occorre quindi disabilitare questa funzione tramite la utility "raspi-config" che ha una apposita voce di menu. Ho anche modificato la velocità di default della RS232 ai canonici 9600 baud in previsione di collegarci il tnc. Al termine di tutto ciò un piccolo test di lettura e scrittura ha confermato il funzionamento della scheda ed il corretto setup del sistema. Wunder bar!


praz2004 chiocciola libero punto it