Dit project beschrijft de ontwikkeling van een aangepaste controller voor de Soonpho M7 Pan-Tilt-kop, bedoeld om de beperkingen van de originele, rudimentaire controller te omzeilen. Door gebruik te maken van een ESP32-S3 en een NRF24L01 module, wordt het mogelijk om de kop nauwkeurig en programmatisch aan te sturen.
De technische implementatie bestaat uit drie delen:
- Hardware: Een goedkope opstelling op basis van de ESP32-S3-Zero.
- Firmware: In Rust geschreven software die de communicatie tussen de USB-verbinding en de pan-tilt-kop via SPI beheert.
- Python Driver: Een
serialdriver die een API biedt voor functies zoals het bewegen naar specifieke coördinaten (moveto), continue beweging voor tracking (movevec), en het bedienen van de sluiter (shutterdown).
Deze uitbreiding maakt geavanceerde toepassingen mogelijk, zoals astrofotografie met actieve tracking, image stitching en live motion tracking met YOLO-visiemodellen.
Soonpho M7 Pan-Tilt-kop Controller
Dit project bevat twee directories waarmee volledige controle over een Soonpho M7 Pan-Tilt-kop kan worden verkregen.
De Soonpho M7 is een van de meest betaalbare pan-tilt-koppen op de markt met de mogelijkheid om 360 graden te draaien. De meegeleverde controller is echter vrij beperkt en staat alleen rudimentaire programmering toe voor het maken van bewegende timelapse-opnames.
Dit project maakt willekeurige aansturing van de pan-tilt-kop mogelijk, inclusief de sluiterfunctie, door gebruik te maken van een combinatie van aangepaste hardware, firmware en een eenvoudige Python-bibliotheek. Gebruikers met meer expertise in dit type fotografie kunnen dit gebruiken voor geavanceerde toepassingen, zoals astrofotografie met actieve tracking of image stitching voor het maken van zeer gedetailleerde beelden. Dit project biedt de benodigde tools om de pan-tilt-kop direct aan te sturen voor gebruik in complexere software.
Componenten
Hardware
Dit project maakt gebruik van een ESP32-S3 en een NRF24L01, met geschatte BOM-kosten van $10.
De pin-outs zijn in de firmware (main.rs) als volgt ingesteld, gebruikmakend van de SPI2-bus op een ESP32-S3:
| NRF24 Pin | ESP32-S3 Pin |
| CE | GPIO1 |
| CS | GPIO2 |
| SCK | GPIO3 |
| MOSI | GPIO4 |
| MISO | GPIO5 |
| IRQ | GPIO6 |
Hardware-afbeeldingen
- Aangepaste controller: ESP32-S3 verbonden met NRF24L01.
- Originele controllerboard: Let op de toegevoegde NRF24L01. Deze chip maakt verbinding en functioneert identiek aan de miniatuurversie die bij de originele controller wordt geleverd.
- Voorbeeld van bewegingstracking: Live motion tracking met behulp van een aangepaste Soonpho M7 en een custom YOLO-visiemodel.
Firmware (pt-head-embassy)
Het primaire firmware-bestand is rust/pt-head-embassy/src/bin/main.rs. Deze firmware beheert de volgende hoofdfuncties:
- Het opzetten van een verbinding met de pan-tilt-kop.
- Het verwerken van inputcommando's via de USB-verbinding (
/dev/ttyACM0).
- Het outputten van statusinformatie naar de USB-verbinding.
- Communiceren met de pan-tilt-kop via de NRf24L01-modules over SPI.
Builden
- Verbind je ESP32.
- Voer het volgende commando uit om de firmware te bouwen en te uploaden:
cargo build --release && cargo run
Python Driver
Het belangrijkste onderdeel is de serial_driver, die de communicatie over seriële poorten met de ESP32-firmware afhandelt. Er zijn enkele andere bestanden inbegrepen die helpen bij real-time controlesystemen:
stopwatch: Biedt een stopwatch-API voor het timen van specifieke taken.
signal_proc: Bevat een eenvoudige bibliotheek voor het voortschrijdend gemiddelde om onderbroken inputs glad te strijken.
Installatie
# Maak een venv aan
python -m venv .venv
source .venv/bin/activate
pip3 install pyserial
# pyserial vereist root-toegang, tenzij de permissies op
# /dev/ttyACM0 handmatig worden aangepast
su root
source .venv/bin/activate
python3 python/usb_comms/main.py
API Referentie: python/usbcomms/serialdriver.py
Dit zijn de belangrijkste publieke methoden van de SerialDriver-klasse. Deze klasse vertrouwt op de PySerial-bibliotheek om met de ESP32 te communiceren.
SerialDriver(serial_device)
Initialiseert de driver met het pyserial-apparaat. Zie python/usb_comms/main.py voor een voorbeeld van de configuratie.
move_to(rotation, tilt)
Beweegt de kop naar de opgegeven graden voor rotatie en tilt. De maximale tilt-hoek is 50.7°.
move_vec(vertical, horizontal)
Gebruikt een vector met een bereik van [-1, 1] voor de verticale en horizontale component om de pan-tilt-kop in een specifieke richting te bewegen in plaats van naar een specifiek punt. Dit is nuttig voor continue motion tracking. Let op: de snelheidsregeling op beide assen is vrij grof, met slechts 8 verschillende snelheden.
shutterdown(durationms)
Houdt de sluiter ingedrukt voor het opgegeven aantal milliseconden. Dit commando sluit beweging uit; het zal dus een actieve beweging onderbreken. De sluiter kan echter al vanaf 10ms worden ingedrukt, waardoor dit weinig problemen zou moeten opleveren.
read_status()
Leest de huidige pan- en tilt-status uit de kop en geeft deze terug als een tuple van graden (rotation, tilt).
Elk van bovenstaande commando's wordt afgesloten door de status uit te lezen van de ESP32.
Soonpho M7 Pan-Tilt-kop Controller
Dit project bevat twee directories waarmee volledige controle over een Soonpho M7 Pan-Tilt-kop kan worden verkregen.
De Soonpho M7 is een van de meest betaalbare pan-tilt-koppen op de markt met de mogelijkheid om 360 graden te draaien. De meegeleverde controller is echter vrij beperkt en staat alleen rudimentaire programmering toe voor het maken van bewegende timelapse-opnames.
Dit project maakt willekeurige aansturing van de pan-tilt-kop mogelijk, inclusief de sluiterfunctie, door gebruik te maken van een combinatie van aangepaste hardware, firmware en een eenvoudige Python-bibliotheek. Gebruikers met meer expertise in dit type fotografie kunnen dit gebruiken voor geavanceerde toepassingen, zoals astrofotografie met actieve tracking of image stitching voor het maken van zeer gedetailleerde beelden. Dit project biedt de benodigde tools om de pan-tilt-kop direct aan te sturen voor gebruik in complexere software.
Componenten
Hardware
Dit project maakt gebruik van een ESP32-S3 en een NRF24L01, met geschatte BOM-kosten van $10.
De pin-outs zijn in de firmware (main.rs) als volgt ingesteld, gebruikmakend van de SPI2-bus op een ESP32-S3:
| NRF24 Pin | ESP32-S3 Pin |
| CE | GPIO1 |
| CS | GPIO2 |
| SCK | GPIO3 |
| MOSI | GPIO4 |
| MISO | GPIO5 |
| IRQ | GPIO6 |
Hardware-afbeeldingen
- Aangepaste controller: ESP32-S3 verbonden met NRF24L01.
- Originele controllerboard: Let op de toegevoegde NRF24L01. Deze chip maakt verbinding en functioneert identiek aan de miniatuurversie die bij de originele controller wordt geleverd.
- Voorbeeld van bewegingstracking: Live motion tracking met behulp van een aangepaste Soonpho M7 en een custom YOLO-visiemodel.
Firmware (pt-head-embassy)
Het primaire firmware-bestand is rust/pt-head-embassy/src/bin/main.rs. Deze firmware beheert de volgende hoofdfuncties:
- Het opzetten van een verbinding met de pan-tilt-kop.
- Het verwerken van inputcommando's via de USB-verbinding (
/dev/ttyACM0).
- Het outputten van statusinformatie naar de USB-verbinding.
- Communiceren met de pan-tilt-kop via de NRf24L01-modules over SPI.
Builden
- Verbind je ESP32.
- Voer het volgende commando uit om de firmware te bouwen en te uploaden:
cargo build --release && cargo run
Python Driver
Het belangrijkste onderdeel is de serial_driver, die de communicatie over seriële poorten met de ESP32-firmware afhandelt. Er zijn enkele andere bestanden inbegrepen die helpen bij real-time controlesystemen:
stopwatch: Biedt een stopwatch-API voor het timen van specifieke taken.
signal_proc: Bevat een eenvoudige bibliotheek voor het voortschrijdend gemiddelde om onderbroken inputs glad te strijken.
Installatie
# Maak een venv aan
python -m venv .venv
source .venv/bin/activate
pip3 install pyserial
# pyserial vereist root-toegang, tenzij de permissies op
# /dev/ttyACM0 handmatig worden aangepast
su root
source .venv/bin/activate
python3 python/usb_comms/main.py
API Referentie: python/usbcomms/serialdriver.py
Dit zijn de belangrijkste publieke methoden van de SerialDriver-klasse. Deze klasse vertrouwt op de PySerial-bibliotheek om met de ESP32 te communiceren.
SerialDriver(serial_device)
Initialiseert de driver met het pyserial-apparaat. Zie python/usb_comms/main.py voor een voorbeeld van de configuratie.
move_to(rotation, tilt)
Beweegt de kop naar de opgegeven graden voor rotatie en tilt. De maximale tilt-hoek is 50.7°.
move_vec(vertical, horizontal)
Gebruikt een vector met een bereik van [-1, 1] voor de verticale en horizontale component om de pan-tilt-kop in een specifieke richting te bewegen in plaats van naar een specifiek punt. Dit is nuttig voor continue motion tracking. Let op: de snelheidsregeling op beide assen is vrij grof, met slechts 8 verschillende snelheden.
shutterdown(durationms)
Houdt de sluiter ingedrukt voor het opgegeven aantal milliseconden. Dit commando sluit beweging uit; het zal dus een actieve beweging onderbreken. De sluiter kan echter al vanaf 10ms worden ingedrukt, waardoor dit weinig problemen zou moeten opleveren.
read_status()
Leest de huidige pan- en tilt-status uit de kop en geeft deze terug als een tuple van graden (rotation, tilt).
Elk van bovenstaande commando's wordt afgesloten door de status uit te lezen van de ESP32.