Autopilot voor Blackmagic Design ATEM switcher
|
Dit project is een eenvoudige autopilot voor Atem videoswitchers van Blackmagic Design. Het is net als het vorige project “Tally light ESP32 voor Blackmagic ATEM switcher” gebaseerd op de ESP32 microcontroller. Ook voor deze autopilot gebruiken we weer de M5StickC ontwikkelmodule (van VNGsystems) die we programmeren met de Arduino IDE, maar je kunt natuurlijk elk ander ESP32 ontwikkelboard gebruiken.
Waarom automatisch schakelen?
Tijdens de Corona (COVID-19) periode zijn we allerlei evenementen live gaan streamen. Normaal gesproken zit er dan natuurlijk iemand netjes te schakelen, zoals het hoort. Maar stel, bent de enige technicus in de studio tijdens een DJ-stream van 4 uur. De pizzabezorger staat voor de deur, je moet naar het toilet, je wilt een biertje halen of moet gewoon de benen strekken. Dan wil je even achter de ATEM vandaan zonder dat de kijkers het merken. Op dat moment kun je de autopilot aanzetten. Deze zal niet zo creatief schakelen als een geoefende schakeltechnicus, maar als je niet te lang wegblijft zal niemand het merken.
Benodigdheden
Naast de M5StickC heb je ook nog wat andere zaken nodig, namelijk de Arduino IDE, ESP32 core, M5StickC libraries en de ATEM libraries. Heb je deze nog niet eerder geïnstalleerd, volg dan onderstaande stappen. Heb je dit allemaal al op je computer staan, dan kun je de sketch onderaan deze pagina nu al uitproberen.
Installeer de Arduino IDE, ESP32 core en M5StickC libraries
Zoals gewoonlijk, installeer je de Arduino IDE met de ESP32 core. Wanneer je de M5StickC gebruikt, installeer je ook de M5StickC libraries. Voor meer informatie kun je de blog “De M5StickC programmeren met de Arduino IDE” raadplegen. Gebruik je een andere ESP32 module, lees dan de blog “ESP32 met Arduino IDE op Linux en Windows“.
Installeer de ATEM Arduino libraries
Download de SKAARHOJ open projects files van Github. Kopieer de bestanden in de map “ArduinoLibs” naar de libraries map van je Arduino IDE. Als het goed is heb je dan een flink aantal nieuwe mappen in je libraries-map, zoals bijvoorbeeld Arduino/libraries/ATEM, Arduino/libraries/ATEMbase etc.
De library is compatible met Arduino (met ethernet shield) en de ESP8266 (WiFi), maar nog niet met de ESP32. Dit is eenvoudig te verhelpen door in totaal 3 wijzigingen door te voeren in de twee bestanden ATEMbase.cpp en ATEMbase.h.
In libraries/ATEMbase/ATEMbase.cpp, rond regel 50:
Zoek naar
// Set up Udp communication object: #ifdef ESP8266 WiFiUDP Udp; #else EthernetUDP Udp; #endif
en vervang dit door:
// Set up Udp communication object: WiFiUDP Udp;
In het tweede bestand, libraries/ATEMbase/ATEMbase.h, zoek rond regel 35 naar:
#ifdef ESP8266 #include <WifiUDP.h> #else #include <EthernetUdp.h> #endif
en vervang dit door het onderstaande (let op hoofletters/kleine letters):
#include <WiFiUdp.h>
De tweede wijziging in dit bestand, rond regel 60, zoek naar dit fragment:
#ifdef ESP8266 WiFiUDP _Udp; #else EthernetUDP _Udp; // UDP object for communication, see constructor. #endif
en vervang dit door:
WiFiUDP _Udp;
Je kunt de ATEM library nu in je ESP32-projecten gebruiken.


Autopilot Arduino sketch
De werking van de sketch is eenvoudig. Er wordt steeds een willekeurige (nieuwe) input gekozen als “preview”. De vorige preview wordt dan actief als “program”. Tussen het schakelen wordt gewacht. De lengte van deze periode wordt ook willekeurig gekozen, met een vooraf ingestelde minimum- en maximum tijdsduur.
In de sketch kun je de volgende zaken naar je eigen situatie aanpassen:
- clientIp: vul hier een (vrijd) IP-adres in voor de ESP32
- switcherIp: het IP-adres van de Atem switcher
- ssid: de naam van je WiFi-netwerk
- password: het wachtwoord van je WiFi-netwerk
- cameras: het aantal inputs dat je wilt gebruiken (voor Atem mini bijv. 4)
- minTime: minimale wachttijd in seconden
- maxTime: maximale wachttijd in seconden
De rest van de sketch spreekt voor zich, je kunt het zelf natuurlijk zo ingewikkeld maken als je zelf wilt.
/***************** Autopilot for Blackmagic Design Atem switcher Version 1.0 Automatic switcher/controller for Blackmagic Design ATEM video switchers, based on the M5StickC ESP32 development board and the Arduino IDE. For more information, see: https://nl.oneguyoneblog.com/2020/07/13/autopilot-voor-blackmagic-design-atem-switcher/ Based on the work of Kasper Skårhøj: https://github.com/kasperskaarhoj/SKAARHOJ-Open-Engineering ******************/ #include <M5StickC.h> #include "WiFi.h" #include <SkaarhojPgmspace.h> #include <ATEMbase.h> #include <ATEMstd.h> IPAddress clientIp(192, 168, 178, 170); // IP address of the ESP32 IPAddress switcherIp(192, 168, 178, 173); // IP address of the ATEM switcher ATEMstd AtemSwitcher; // http://www.barth-dev.de/online/rgb565-color-picker/ #define GRAY 0x0020 // 8 8 8 #define GREEN 0x0200 // 0 64 0 #define RED 0xF800 // 255 0 0 const char* ssid = "yournetwork"; const char* password = "yourpassword"; int cameras = 4; // Total number of camera inputs int ledPin = 10; // LED is on pin 10 int minTime = 3; // Min. waiting time int maxTime = 10; // Max. waiting time int programInput = 1; // Set a default program input int previewInput = 2; // Set a default preview input int timeout = 1000; // Set a default waiting time void setup() { Serial.begin(9600); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("Connecting to WiFi.."); } Serial.println("Connected to the WiFi network"); M5.begin(); // Initialize the M5StickC pinMode(ledPin, OUTPUT); // LED pin digitalWrite(ledPin, HIGH); // LED off AtemSwitcher.begin(switcherIp); // Initialize a connection to the switcher AtemSwitcher.serialOutput(true); AtemSwitcher.connect(); } void loop() { AtemSwitcher.runLoop(); // Check for packets, respond to them, keeping the connection alive static unsigned long start_time = millis(); if (millis() - start_time >= timeout) { // Time to switch? digitalWrite(ledPin, LOW); // LED on white switching programInput = previewInput; // For "program", choose the current preview input previewInput = randomNumber(); // For "preview", choose a new (random) input AtemSwitcher.changePreviewInput(previewInput); // Switch to new preview AtemSwitcher.changeProgramInput(programInput); // Switch to new program drawLabel(BLACK, GRAY, HIGH); // Display program input number on LCD display Serial.print("Program: "); // Print to the serial console Serial.println(programInput); start_time = millis(); timeout = 1000 * random(minTime, maxTime + 1); // Pick a new random time to wait befor switching again digitalWrite(ledPin, HIGH); // LED off } } void drawLabel(unsigned long int screenColor, unsigned long int labelColor, bool ledValue) { digitalWrite(ledPin, ledValue); M5.Lcd.fillScreen(screenColor); M5.Lcd.setTextColor(labelColor, screenColor); M5.Lcd.drawString(String(programInput), 15, 40, 8); } int randomNumber() { // Pseudo random non-consecutive number while (previewInput == programInput) { previewInput = random(1, cameras + 1); } return previewInput; }
Deze sketch is ook te vinden op GitHub.
Maak je eigen autopilot
Zoals de meeste projecten op deze website is dit project ook slechts een startpunt voor je eigen creatie. Pas de sketch naar eigen smaak aan of maak er iets compleet anders van. Heb je iets interessants gemaakt, laat het dan vooral weten in de commentaarsectie onder dit artikel!