
Specifiche
- All’avvio RB parte con la presentazione di un video (VIDEO_01). Il VIDEO_01 viene ripetuto in loop.
- Al verificarsi di un evento (in questo caso la pressione di un pulsante) si interrompe il primo video e ne parte un secondo (VIDEO_02).
- Una volta terminata la visione del VIDEO_02, riprende il VIDEO_01 dal punto in cui e’ stato interrotto
Materiale
- Raspberry PI 3
- Scheda da 16GB
- Pulsante
- Resistenza 10K
- Cavetti per collegamenti
Sistema operativo: Raspberry PI OS FULL (Ex Raspbian)
- Parte ‘immediatamente’
- Per partire non ha bisogno dell’inserimento di nome-utente e password (di default pi e raspberry). La password la reimposto in rb
- Settaggio veloce: lingua, password, network e aggiornamento sistema (che prende un po’ piu’ di tempo)
Nota 1: In futuro testare il lavoro su Raspberry PI OS LITE
Nota 2: Ho cercato di lavorare con ‘Ubuntu-MATE’ per RB: lento, problemi con VNC e non ha abilitato alcuni repository necessari. ABBANDONATO
Collegamenti con il Raspberry
Vnc-Server
Su Raspberry PI OS FULL VNC e’ preinstallato. Per attivarlo richiamare il tool di configurazione raspi-config: sudo raspi-config. Selezionare Interfacing Options dal menu, poi l’opzione VNC e infine attivarla con Yes.
Server Ssh
Non necessario, ma potrebbe essere utile. Dovrebbe essere preinstallato, in caso contrario: sudo apt-get install openssh-server.
Senza questo comando sudo /etc/init.d/ssh restart da dare a RB, SSH non funziona. Per evitare di darlo ogni volta è stato inserito in /etc/rc.local prima dell’istruzione exit 0
Crontab
Nei sistemi operativi Linux, il comando crontab consente di pianificare l’esecuzione automatica periodica di attività o script. Ogni attività schedulata è chiamata cron job.
Istruzioni
crontab -e: permette di aggiungere/modificare/eliminare le attivita’ schedulatecrontab -l: permette di verificare le attivita’ schedulate, senza poterle modificare
In verità, il comando che mi ha permesso di proseguire senza intoppi (dove viene anche specificato l’utente) è il seguente: sudo crontab -u pi -e
Eventi
Oltre a gestire eventi “temporali”, il cron job può attivare script al riavvio del server linux con l’istruzione
@reboot /PATH/NOME_SCRIPT.sh
Lo script realizzato che deve essere lanciato all’avvio è uno script scritto in PYTHON che, in alcuni casi, non partiva. La soluzione è stata quella di inserire il cron job con la seguente istruzione:
@reboot sleep 20 && python3 /home/pi/Desktop/SwapVideo/SwapVideo.py >> /dev/null 2>&1
- Sleep di 20 secondi per permettere al sistema di caricarsi.
- Nel file di log, in alcuni casi, ho trovato il seguente messaggio di errore: “info (No MTA installed, discarding output…“. Questo accade perchè i lavori cron, a volte, producono output e il demone tenta di inviarlo via email. Se non si ha bisogno di quell’output, il modo più semplice per risolvere il problema è scartarlo direttamente dal crontab inviando il tutto ad un device NULLO :
>> /dev/null 2>&1. - Il file di log è il seguente: /var/log/cron.log
Visualizzazione del video
Per la visualizzazioe dei video, in un primo momento, ho utilizzato omxplayer (preinstallato su RB) richiamato da python con subprocess, ma la cosa non mi ha convinto molto.
Una soluzione più elegante, a mio parere, è possibile utilizzando il modulo omxplayer-wrapper all’interno di python. Per la sua installazione: pip3 install omxplayer-wrapper
Circuito
File
La cartella SwapVideo, creata sul Desktop, deve contenere i seguenti file:
- SwapVideo.py
- Video_01.mp4
- Video_02.mp4
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#!/usr/bin/env python3 import RPi.GPIO as GPIO from omxplayer.player import OMXPlayer from time import sleep import subprocess # ============================================ # Restitutisce la durata di un video in sec. # -------------------------------------------- def get_durata(filename): result = subprocess.run(["ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", filename], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) return int(float(result.stdout)) # ============================================== # Definizioni varabili video (percorso completo) # ----------------------------------------------- Video_01 = "/home/pi/Desktop/SwapVideo/Video_01.mp4" Video_02 = "/home/pi/Desktop/SwapVideo/Video_02.mp4" durata_video_02=get_durata(Video_02) # settaggio PIN per l'INPUT # -------------------------------------------- my_pin=21 GPIO.setmode(GPIO.BCM) GPIO.setup(my_pin,GPIO.IN) # LOOP primo video # -------------------------------------------- player_01 = OMXPlayer(Video_01, args=['--loop'], dbus_name="omxplayer.player_01") val=0 # associato al valore del pin while True: val=GPIO.input(my_pin) if val==1: # attende rilascio while val==1: val=GPIO.input(my_pin) sleep(.5) # PAUSA e NASCONDE video1 player_01.pause() player_01.hide_video() # VISUALIZZA video2 player_02 = OMXPlayer(Video_02, dbus_name="omxplayer.player_02") player_02.show_video() player_02.play() # Attende visualizzazione completa video2 e lo chiude sleep(durata_video_02) player_02.quit() # Riprende visualizzazione video1 player_01.show_video() player_01.play() |
Conclusione
- Preparare MicroSD con Raspberry PI OS FULL
- Settare lingua, password e network
- Aggiornare il sistema
- Attivare VNC Server (raspi-config)
- Per utilizzare SSH (opzionale) inserire all’interno del file /etc/rc.local l’istruzione
/etc/init.d/ssh restartprima diexit 0 - Copiare nella cartella /home/pi/Desktop/SwapVideo i file: SwapVideo.py, Video_01.mp4 e Video02.mp4 (da VNC Viewer, SSH o collegando la MicroSD al pc)
- Inserire il cron job
@reboot sleep 20 && python3 /home/pi/Desktop/SwapVideo/SwapVideo.py >> /dev/null 2>&1dopo aver digitato sudo crontab -u pi -e - Realizzare il circuito.
Per i test ho realizzato un secondo script (SwapVideo_KEY.py) dove viene gestito l’evento da tastiera e non con un pulsante.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
#!/usr/bin/env python3 from omxplayer.player import OMXPlayer from time import sleep import subprocess # ============================================ # Restitutisce la durata di un video in sec. # -------------------------------------------- def get_durata(filename): result = subprocess.run(["ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", filename], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) return int(float(result.stdout)) # ============================================== # Definizioni varabili video (percorso completo) # ----------------------------------------------- Video_01 = "/home/pi/Desktop/SwapVideo/Video_01.mp4" Video_02 = "/home/pi/Desktop/SwapVideo/Video_02.mp4" durata_video_02=get_durata(Video_02) # LOOP primo video # -------------------------------------------- player_01 = OMXPlayer(Video_01, args=['--loop'], dbus_name="omxplayer.player_01") # ============================================================= # MENU DI CONTROLLO # ============================================================= selezione = 0 while True: print ("\n") print ("-----------------------------------") print (" OPERAZIONI") print ("-----------------------------------") print (" s. Swap Video") print (" x. Esci") print ("-----------------------------------") selezione = input("Opzione: ") #*********************************** if selezione in ["s","S"]: # PAUSA e NASCONDE video1 player_01.pause() player_01.hide_video() print (" >>> IN ATTESA DELLA FINE DEL VIDEO") # VISUALIZZA video2 player_02 = OMXPlayer(Video_02, dbus_name="omxplayer.player_02") player_02.show_video() player_02.play() # Attende visualizzazione completa video2 e lo chiude sleep(durata_video_02) player_02.quit() # Riprende visualizzazione video1 player_01.show_video() player_01.play() #*********************************** elif selezione in ["x","X"]: print (">>> CIAO!!!!") player_01.quit() break #*********************************** else: print (" >>> OPZIONE NON VALIDA") #*********************************** |
