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!