Raspberry Pi Zero headless via USB

Da lumacawiki.

Introduzione

È possibile accedere alla console del Raspberry Pi Zero senza usare monitor e tastiera, senza rete (senza SSH), e senza UART (via porta seriale, ovvero senza cavo USB-TTL o come si chiama collegato sui pin 8 e 10 del pettine GPIO).
In pratica è possibile collegare un normale cavo mini USB alla relativa porta del Raspberry Pi Zero e, oltre ad alimentarlo (quindi non c'è nemmeno bisogno di un alimentatore) è possibile vedere sul PC una porta seriale (su Linux /dev/ttyACM0) e con un programma per la comunicazione seriale (minicom, screen, GTKTerm, ecc.) collegarsi alla console.

Inoltre, ma questo non verrà trattato in questo articolo, è possibile configurare il Raspberry Pi Zero come unità disco (stile chiavetta USB), o usare la porta USB come porta di rete, vedere il Raspberry Pi come una webcam, e altre cose. Queste robe vengono chiamate Linux USB Gadget modules.

How to

Installare Raspbian sulla scheda micro SD

Google è vostro amico.

Configurare i moduli

Prima di inserire la scheda micro SD nel Raspberry, montatela sul PC.

Modificate il file config.txt (che si trova nel mountpoint tipo /run/media/user/boot/).
In fondo aggiungete

dtoverlay=dwc2
Modificate poi il file
cmdline.txt
(che si trova nella stessa directory del precedente).

Subito dopo la voce rootwait aggiungete

modules-load=dwc2,g_serial

Non va mai come dovrebbe

A questo punto la configurazione non è finita. Va abilitato e fatto partire un servizio, e l'unico modo è quello di fare il boot del Raspberry. Chiaramente per abilitare e far partire il servizio gestito da systemd, servirebbe una shell.
Le varie guide che si trovano in giro, dicono di collegare un monitor e una tastiera per completare questa fase, oppure usare la connessione seriale classica USB-TTL (o come si chiama) sui piedini 8 e 10. MA SE IO NON HO A DISPOSIZIONE MONITOR TASTIERA E CAVO USB-TTL??

Abilitare il servizio getty@ttyGS0.service senza shell

Allora sempre prima di inserire la scheda SD nel raspberry, ossia averla ancora montata sul PC, andare nel mountpoint rootfs (tipo sempre sotto /run/media/user/boot/) e aggiungete nel file /etc/rc.local, prima della riga exit 0

sleep 10 && systemctl enable getty@ttyGS0.service --now &

Perché sleep 10 e antani? Perché sebbene systemctl enable nomeservizio --now abiliti il servizio al boot successivo e inoltre faccia lo start del servizio, lo start durante il primo boot previene il completamento del boot stesso, ossia non compare mai il login. Ossia dopo l'enable, cioè al riavvio successivo, tutto funzionerebbe. Così facendo (sleep 10) si fa completare il boot e a quel punto si abilita e si fa partire il servizio in un colpo solo. E senza bisogno di accedere per altre vie al Raspberry.

Questa riga si può poi cancellare una volta effettuato il primo accesso.

Pronti

Inserite la scheda SD nel Raspberry Pi. Collegate unicamente il cavo USB to Micro USB alla porta marcata USB del Raspberry Pi Zero (non alla porta marcata PWR) e siete a posto.
Dopo poco (vedete dmesg sul PC) troverete la porta /dev/ttyACM0 (o su Windoz una porta COM, ma non ho provato). Usate Minicom, GTKTerm o che ne so, usando i classici valori 115200 8-N-1. Per esempio screen /dev/ttyACM0 115200 e dopo qualche secondo dovrebbe apparire una richiesta di login.

A differenza del classico collegamento seriale (UART), non vedrete il processo di boot.

GTKTermRPiZero.png

Riferimenti

https://blog.gbaman.info/?p=699
https://forum.armbian.com/topic/1735-tutorial-use-armbian-to-set-up-rpi-zero-for-g_serial-connection/
https://learn.adafruit.com/turning-your-raspberry-pi-zero-into-a-usb-gadget/serial-gadget