Tally light ESP32 voor Blackmagic ATEM switcher
|
In het vorige artikel schreef ik over het opzetten van een low-budget studio voor het streamen van live video tijdens de Corona (COVID-19) lockdown. Inmiddels heeft de studio een paar upgrades ondergaan. Zo hebben we nu ook de beschikking over een Blackmagic Design ATEM Mini Pro videoswitcher met 4 camera’s. Dit zijn consumentencamera’s zonder tally light. In deze blog laat ik zien hoe je met behulp van een ESP32 microcontroller, in dit geval een M5StickC afkomstig van VNGsystems in Gouda, zelf ESP32 Tally lights kunt maken.


Tally Light
Een “tally light” (Wikipedia) is een rood indicatielampje dat je meestal bovenop op professionele videocamera’s tegenkomt. Het wordt vooral gebruikt bij opnames met meerdere camera’s. Het lampje geeft aan of een camera “live” (“program”) is. Dit is zowel voor mensen vóór de camera als de cameraman zelf handig om te weten. De cameraman weet dan bijvoorbeeld dat hij z’n camera stil moet houden, en de mensen voor de camera weten in welke camera ze moeten kijken.


Soms wordt naast rood ook de kleur groen gebruikt om aan te geven dat het beeld van de camera actief is als “preview”. De tally lights worden aangestuurd door de video switcher. In dit geval gebruiken we een Blackmagic Design ATEM Mini Pro en gaat de communicatie draadloos via WiFi.
Blackmagic Design ATEM Mini Pro video switcher
De Blackmagic Design ATEM Mini Pro video switcher is een complete videoproductie- en streaming studio in een klein kastje. Er zijn o.a. inputs voor 4 HDMI bronnen en een output voor HDMI preview. Je kunt de ATEM Mini in bijvoorbeeld OBS Studio als videobron gebruiken d.m.v. de USB-aansluiting. De computer ziet de ATEM Mini dan als een webcam elke je in OBS Studio aan een scene kunt toevoegen.


Je kunt de ATEM Mini met de knoppen bedienen, of op afstand met een PC of Mac met de Blackmagic video switcher software via LAN. We zullen de communicatie via LAN benutten voor dit tally light-project.
M5StickC: ESP32 ontwikkelmodule
Voor een eerste versie van dit Tally Light-project gebruik ik een M5StickC ESP-32 ontwikkelmodule. Met deze module kun je snel en eenvoudig projecten ontwikkelen en testen. De module heeft naast een ESP32-microcontroller (met ingebouwde WiFi en Bluetooth) een kleine TFT LCD, accu en LED. Ik heb deze module eerder gebruikt voor het project COVID-19 CORONA Tracker: ESP32 & Arduino IDE.
ATEM Arduino libraries
Voor het programmeren van de M5StickC gebruiken we de bekende Arduino IDE. Daarnaast maken we gebruik van Arduino libraries ontwikkeld door Kasper Skårhøj van SKAARHOJ. Kasper heeft niet alleen een library gemaakt maar ook het communicatieprotocol van de ATEM switchers gedocumenteeerd. De libraries zijn op het moment van schrijven alleen geschikt voor een Arduino (met ethernet shield) of ESP8266 (WiFi), dus we moeten een paar kleine aanpassingen doen om deze met de ESP32 te laten werken.
ESP32 Tally light met M5StickC
Dit was voorlopig genoeg informatie, we gaan nu aan de slag. Voor dit project zullen we de volgende stappen doorlopen:
- Installeer de Arduino IDE en maak deze gereed voor het programmeren van de M5StickC.
- Installeer de ATEM Arduino libraries en maak deze geschikt voor de ESP32.
- Gebruik de sketch uit dit artikel om de tally light te testen.
- Pas de sketch naar eigen smaak aan en verbeter deze.
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.
Voorbeeldsketch tally light met ESP32 voor arduino IDE
Als voorbeeld heb ik onderstaande sketch gemaakt. Voordat je deze naar je ESP32 kunt uploaden moet je de volgende instellingen aanpassen:
- ssid: de SSID van je draadloze netwerk
- password: het wachtwoord van het netwerk
- cameraNumber: het nummer van de camera (1-4) voor welke je de ESP32 als tally light gaat gebruiken
- het IP-adres van de ESP32 (elke module heeft een vrij IP-adres nodig)
- het IP-adres van de ATEM switcher
Als dit allemaal aangepast is kun je de sketch naar je ESP32 uploaden. Kijk naar de seriële monitor voor eventuele foutmeldingen. Als het schern van de M5StickC zwart blijft, dan is het verbinden met WiFi mislukt. Controleer dan de SSID en het wachtwoord.
/***************** Tally light ESP32 for Blackmagic ATEM switcher Version 2.0 A wireless (WiFi) tally light for Blackmagic Design ATEM video switchers, based on the M5StickC ESP32 development board and the Arduino IDE. For more information, see: https://oneguyoneblog.com/2020/06/13/tally-light-esp32-for-blackmagic-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 cameraNumber = 4; int ledPin = 10; int PreviewTallyPrevious = 1; int ProgramTallyPrevious = 1; void setup() { Serial.begin(9600); // Start the Ethernet, Serial (debugging) and UDP: WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("Connecting to WiFi.."); } Serial.println("Connected to the WiFi network"); // initialize the M5StickC object M5.begin(); pinMode(ledPin, OUTPUT); // LED: 1 is on Program (Tally) digitalWrite(ledPin, HIGH); // off // Initialize a connection to the switcher: AtemSwitcher.begin(switcherIp); AtemSwitcher.serialOutput(0x80); AtemSwitcher.connect(); } void loop() { // Check for packets, respond to them etc. Keeping the connection alive! AtemSwitcher.runLoop(); int ProgramTally = AtemSwitcher.getProgramTally(cameraNumber); int PreviewTally = AtemSwitcher.getPreviewTally(cameraNumber); if ((ProgramTallyPrevious != ProgramTally) || (PreviewTallyPrevious != PreviewTally)) { // changed? if ((ProgramTally && !PreviewTally) || (ProgramTally && PreviewTally) ) { // only program, or program AND preview drawLabel(RED, BLACK, LOW); } else if (PreviewTally && !ProgramTally) { // only preview drawLabel(GREEN, BLACK, HIGH); } else if (!PreviewTally || !ProgramTally) { // neither drawLabel(BLACK, GRAY, HIGH); } } ProgramTallyPrevious = ProgramTally; PreviewTallyPrevious = PreviewTally; } 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(cameraNumber), 15, 40, 8); }
Als het uploaden gelukt is en een verbinding met het netwerk en de ATEM switcher tot stand is gebracht, zal de M5StickC de status van de in de code aangegeven camera weergeven:
- Het display geeft het nummer van de camera weer (1-4);
- Als de camera niet actief is zal het display donker zijn;
- Als de camera actief is als “preview” dan zal het display groen kleuren;
- Als de camera actief is als “program” dan zal het display rood kleuren en de ingebouwde rode LED van de M5StickC oplichten.
Deze code kun je ook vinden op GitHub.
Pas de sketch aan en verbeter deze
Zoals gewoonlijk op dit blog is deze informatie slechts bedoeld als startpunt voor je eigen project. Met deze sketch en aanwijzingen kun je snel iets eenvoudigs in elkaar zetten, om vervolgens naar eigen inzicht aan te passen en te perfectioneren. Heb je er zelf iets interessants mee gemaakt? Laat het weten in de commentaren onder dit artikel!
He Hallo!
Dank voor de uitleg. Zeer waardevol voor mij!
Ik begrijp dat er sinds kort ook een Plus-versie op de markt is/komt met een batterij die langer blijft werken.
Is deze uitleg en programmmering ook geschikt voor die Plus versie?
Dank voor het antwoord.
Groet,
Daan
Hé, Ik heb de code geplaatst. Echter als ik de aanpassingen doen zoals beschreven in
ATEMbase.h en ATEMbase.cpp krijg ik fouten. Als ik de aanpassingen niet doe geeft de monitor aan “conecting to wifi.
Zijn dit bekende probelemen? Kan je me verderhelpen?
Thanks voor de tutorial, erg waardevol!
Ik heb besloten de LilyGO TTGO T-Display hiervoor te gebruiken, echter krijg ik foutmeldingen uiteraard omdat het board anders is. Ik ben een beginner, heb je tips waar ik meer algemene informatie kan krijgen over het programmeren van dergelijke microcontrollers?
Hallo, ik maak dankbaar gebruik van deze prachtige sketch. Het werkt geweldig met Atem switcher icm PTZ camera’s, waarbij de M5 StickC de voeding krijgt via de USB van de PTZ camera. Nu heb ik hetzelfde programma op de M5Stick-C Plus gezet, maar dat geeft geen goed beeld op het display. Is daar een aanvullende programmering voor ? Ik zou ook graag de RGB-LED module aan de M5Stick-C Plus willen toevoegen om een extra Rode LED te hebben die gelijktijdig aan gaat als de rode LED in de M5Stick aan gaat. Heeft iemand hier ervaring mee? Vast bedankt voor jullie reacties, Jochem
Bedankt voor de heldere uitleg. Ik heb 5 PTZ camera’s en wil graag dit project gaan uitvoeren. Ik begrijp alleen niet hoe de M5 communiceert met de ATEM. Is dit gewoon een Wifi router aan de ATEM koppelen ?
Ik vraag me af met welke ATEM software versie dit werkt?
Heb namelijk zelf enige tijd hardware panelen gebouwd gebaseerd op de SkaarHoj library maar nadat Blackmagic het volledige protocol omgooide werkte dit niet meer. zie ook: https://www.skaarhoj.com/discover/blackmagic-atem-switcher-protocol
“August 2018: The free open source SKAARHOJ provided Arduino Libraries will only work with ATEM Software Control firmware versions up to 7.5.0.”
Hou er trouwens wel rekening mee dat er een maximaal aantal gelijktijdige connecties (5 voor een TVS HD) op een ATEM mixer mogelijk is, dit verschilt per model. Als je dit aantal overschrijdt loopt de mixer vast en is deze niet meer te bedienen!
Ik probeer het 1 en ander uit te voeren, maar krijg iedere keer aan het einde de volgende boodschap:
Leaving…
Hard resetting via RTS pin…
daarna blijft hij hangen.
Wat is de oplossing
Hoi,
Dit is echt geniaal. Ik heb het eind 2020 geïmplementeerd en het werkt nog steeds als een zonnetje, zonder onderhoud, met de nieuwste softwareversie van Blackmagic en de ATEM Mini Pro.
Dank!
Bij ons werkt het ook perfect, al hebben we wel eens gehad dat de bediening niet werkt, mogelijk door een IP conflict ? Weet iemand of er een maximum zit in het aantal aan te sluiten tally lights ? Ik heb ergens gehoord dat de Atem maximaal 7 IP adressen aan kan (inclusief switcher, mixer ed), in mijn geval zou ik dan maximaal 4 tally lights kunnen gebruiken.
@Jochem, zoals ik hierboven ook al wel eens heb aangeven zit er een maximum aan het aantal gelijktijdige connecties. Voor een Atem Television Studio HD is dat bijvoorbeeld 5.
Teveel connecties kunnen ervoor zorgen dat de mixer vastloopt en dat er niet meer mee te communiceren valt. Pas na een harde power cycle komt de connectie dan weer terug.