Usare la libreria Picamera2 e Camera Module 3 è uno dei tanti modi per scattare foto co Raspberry PI. Il modo più semplice per usarla da programma è in Python, usando la libreria Picamera2. Una volta installato il modulo si può provare il codice proposto dalla documentazione ufficiale (The Picamera 2 Manual, cap 2.3):

from picamera2 import Picamera2, Preview
import time
picam2 = Picamera2()
camera_config = picam2.create_preview_configuration()
picam2.configure(camera_config)
picam2.start_preview(Preview.QTGL)
picam2.start()
time.sleep(2)
picam2.capture_file("test.jpg")

Questo programma avvia una finestra di preview, quindi in una board Raspberry Pi 4 headless (senza monitor e tastiera) può essere semplificato:

from picamera2 import Picamera2
cam = Picamera2()
cam.start()
cam.capture_file("test_1.jpg")

Se il programma è complesso e le elaborazioni sulle foto richiedono tempo, si può trarre vantaggio dall’esecuzione concorrente sui core del processore della scheda Raspberry. Python offre la libreria asyncio (Asynchronous I/O) che permette l’uso della sintassi async/await.

Quando il programma deve svolgere un compito gravoso, lo lancia in parallelo, aspettando la fine dell’esecuzione solo quando avrà bisogno dei risultati, come in figura:

picam2.start()picam2.capture_file()altro codice ...codice ...elaborazione ...ancora codice ...

Nell’esempio seguente, uso solo le api di avvio e sincronizzazione delle coroutines: le funzioni concorrenti vengono dichiarate come async e vengono lanciate in parallelo con asyncio.create_task(). Questo metodo restituisce un oggetto Task, che poi può essere usato per una sincronizzazione successiva usando il comando await:

#!/usr/bin/python3
import asyncio
from picamera2 import Picamera2

async def shot(camera):
    # … some more code …
    camera.capture_file("test_2.jpg")
    # … some more code …
   
async def main():
    cam = Picamera2()
    cam.start()
    task1 = asyncio.create_task(shot(cam))
    # … some more code …
    await task1

asyncio.run(main())

Riferimenti