Nota

Benvenuto nella community Facebook SunFounder Raspberry Pi, Arduino ed ESP32!

  • Ottieni supporto tecnico e aiuto nella risoluzione dei problemi.

  • Impara e condividi progetti, suggerimenti e tutorial.

  • Accedi in anteprima a nuovi prodotti e aggiornamenti.

  • Goditi sconti esclusivi e omaggi.

👉 Unisciti a noi qui: [here]

Modulo Fotocamera Pan-Tilt

../../_images/pan_tilt.jpg

Nota

La serie Pironman 5 non include un modulo fotocamera. Devi procurartene uno da solo o acquistarlo dal nostro sito web ufficiale:

In questa sezione imparerai come configurare e controllare un modulo fotocamera Pan-Tilt utilizzando due servo SG90 collegati direttamente ai pin GPIO. Alla fine di questa sezione, avrai un modulo Pan-Tilt completamente installato e funzionante, pronto per i tuoi progetti.

Collegamento Hardware

Prima di iniziare, assicurati che il tuo Raspberry Pi sia spento.

Schema di Collegamento:

Dispositivo

Pin GPIO

Pin Fisico

Servo Pan (Arancione)

GPIO17

Pin 11

Servo Tilt (Arancione)

GPIO18

Pin 12

VCC (Rosso)

5V

Pin 2 o 4

GND (Marrone)

GND

Pin 6, 9, 14, 20, 25, 30, 34, 39

Modulo Fotocamera

Interfaccia CSI

Collega alla porta camera

Avvertimento

Sebbene i servo SG90 possano assorbire energia direttamente dal pin 5V del Raspberry Pi durante i test, un uso prolungato o il movimento simultaneo di entrambi i servo potrebbe causare cali di tensione e instabilità del sistema. Per progetti a lungo termine, considera l’uso di un alimentatore esterno da 5V (assicurando una terra comune con il Raspberry Pi).

Collegamento Passo-Passo:

  1. Collega i servo:

    • Collega il filo del segnale arancione del servo Pan a GPIO17 (pin fisico 11)

    • Collega il filo del segnale arancione del servo Tilt a GPIO18 (pin fisico 12)

    • Collega i fili rossi VCC di entrambi i servo a un pin 5V (pin fisico 2 o 4)

    • Collega i fili marroni GND di entrambi i servo a qualsiasi pin GND (es., pin fisico 6)

  2. Collega la fotocamera:

    • Solleva delicatamente il fermaglio di plastica sul connettore CSI della fotocamera

    • Inserisci il cavo a nastro della fotocamera con i contatti metallici rivolti lontano dalla porta Ethernet

    • Premi il fermaglio di plastica verso il basso per fissare il cavo

Testare il Servo

Prima di eseguire l’esempio completo di Pan-Tilt, testiamo ciascun servo individualmente per assicurarci che funzionino correttamente.

1. Abilita GPIO e I2C (se necessario):

sudo raspi-config
# Naviga a: Interface Options -> I2C -> Enable
# Riavvia dopo l'abilitazione

2. Script di test semplice per servo:

Crea un file di test servo_test.py:

#!/usr/bin/env python3
# servo_test.py - Test semplice del servo

from gpiozero import Servo
import time

# Test del servo Pan su GPIO17
pan = Servo(17, min_pulse_width=0.5/1000, max_pulse_width=2.5/1000)

print("Testing Pan servo (GPIO17)...")
print("Moving to 0° position...")
pan.value = -1  # 0°
time.sleep(2)

print("Moving to 90° position...")
pan.value = 0   # 90°
time.sleep(2)

print("Moving to 180° position...")
pan.value = 1   # 180°
time.sleep(2)

pan.close()
print("Pan servo test complete")

3. Esegui il test:

python3 servo_test.py

Se il servo si muove agevolmente attraverso tutte le posizioni, ripeti il test per il servo Tilt cambiando il numero del pin in 18.

Testare la Fotocamera

1. Abilita l’interfaccia fotocamera:

sudo raspi-config
# Naviga a: Interface Options -> Camera -> Enable
# O per sistemi più recenti: Interface Options -> Legacy Camera -> Enable
sudo reboot

2. Test di acquisizione della fotocamera:

Per Raspberry Pi OS Bullseye e versioni successive (usando libcamera):

# Scatta una foto di test
libcamera-jpeg -o test.jpg -t 2000 --width 640 --height 480

# Anteprima del flusso della fotocamera
libcamera-hello -t 0

Per sistemi più vecchi (usando raspistill):

# Scatta una foto di test
raspistill -o test.jpg -t 2000 -w 640 -h 480

# Anteprima del flusso della fotocamera
raspivid -t 0

3. Verifica la foto:

ls -l test.jpg
# Apri l'immagine (se hai un'interfaccia grafica)
xdg-open test.jpg

Esempio Pan-Tilt

Ora combiniamo il controllo del servo e la funzionalità della fotocamera in un programma completo di controllo Pan-Tilt. Questo esempio ti permette di controllare la direzione della fotocamera usando i tasti WSAD e scattare foto con il tasto T.

1. Crea lo script di controllo Pan-Tilt:

nano ptz_wsad_simple.py

Copia il seguente codice:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# ptz_wsad_simple.py - Controllo PTZ con tasti WSAD, versione ultra semplice

from gpiozero import Servo
import os
from datetime import datetime

# Inizializza i servo
# Parametri SG90: larghezza impulso min 0.5ms (0°), larghezza impulso max 2.5ms (180°)
pan = Servo(17, min_pulse_width=0.5/1000, max_pulse_width=2.5/1000)
tilt = Servo(18, min_pulse_width=0.5/1000, max_pulse_width=2.5/1000)

# Posizione iniziale (centro)
pan.value = 0
tilt.value = 0

print("\n=== Controllo PTZ SG90 ===")
print("W: Su")
print("S: Giù")
print("A: Sinistra")
print("D: Destra")
print("T: Scatta foto")
print("C: Centro")
print("Q: Esci")
print("-" * 30)

def take_photo():
    """Funzione per scattare foto"""
    # Crea la directory delle foto se non esiste
    photo_dir = "/home/pi/Pictures/ptz"
    os.makedirs(photo_dir, exist_ok=True)

    # Genera nome file con timestamp
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    filename = f"{photo_dir}/ptz_{timestamp}.jpg"

    # Scatta foto usando libcamera (per Raspberry Pi Bullseye e successivi)
    # Alternativa per sistemi più vecchi: usa raspistill
    os.system(f"libcamera-jpeg -o {filename} -t 1 --width 640 --height 480")

    # Comando alternativo per sistemi più vecchi:
    # os.system(f"raspistill -o {filename} -t 1 -w 640 -h 480")

    print(f"Foto salvata: {filename}")

try:
    while True:
        # Ricevi input dall'utente
        cmd = input("Inserisci comando: ").lower().strip()

        if cmd == 'w':
            # Muovi su (aumenta angolo tilt)
            tilt.value = min(1.0, tilt.value + 0.2)
            print(f"↑ Su ({tilt.value:.1f})")

        elif cmd == 's':
            # Muovi giù (diminuisci angolo tilt)
            tilt.value = max(-1.0, tilt.value - 0.2)
            print(f"↓ Giù ({tilt.value:.1f})")

        elif cmd == 'a':
            # Muovi sinistra (diminuisci angolo pan)
            pan.value = max(-1.0, pan.value - 0.2)
            print(f"← Sinistra ({pan.value:.1f})")

        elif cmd == 'd':
            # Muovi destra (aumenta angolo pan)
            pan.value = min(1.0, pan.value + 0.2)
            print(f"→ Destra ({pan.value:.1f})")

        elif cmd == 't':
            # Scatta foto
            take_photo()

        elif cmd == 'c':
            # Centra il PTZ
            pan.value = 0
            tilt.value = 0
            print("PTZ centrato")

        elif cmd == 'q':
            # Esci dal programma
            print("Uscita dal programma")
            break

        else:
            print("Comando non valido, usa W/S/A/D/T/C/Q")

except KeyboardInterrupt:
    print("\nProgramma interrotto dall'utente")

finally:
    # Pulisci le risorse GPIO
    pan.close()
    tilt.close()
    print("GPIO puliti")

2. Rendi eseguibile lo script:

chmod +x ptz_wsad_simple.py

3. Esegui il controller Pan-Tilt:

python3 ptz_wsad_simple.py

4. Controlla la fotocamera:

  • Premi W/S per inclinare su/giù

  • Premi A/D per panoramica sinistra/destra

  • Premi T per scattare una foto (salvata in /home/pi/Pictures/ptz/)

  • Premi C per centrare la fotocamera

  • Premi Q per uscire

Acquisizione Fotocamera:

Lo script usa libcamera-jpeg (per le versioni più recenti di Raspberry Pi OS) per acquisire le foto. Le foto vengono salvate automaticamente con timestamp per evitare sovrascritture.