English Click this button for the international website

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.

M5Stack M5Stick-C ESP32 Mini-Ontwikkelboard
Getest en Aanbevolen door OneGuyOneBlog.com:

M5Stack M5Stick-C ESP32 Mini-Ontwikkelboard

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 for Blackmagic Design Atem switcher: switching 2-1-3-2
Autopilot voor Blackmagic Design Atem switcher: schakelen 2-1-3-2

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!

VNG Systems

M5Stack M5Stick-C ESP32 Mini-Ontwikkelboard
Getest en Aanbevolen door OneGuyOneBlog.com:

M5Stack M5Stick-C ESP32 Mini-Ontwikkelboard

Voeg een reactie toe

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *