diff --git a/ATEMtoNRF/ATEMtoNRF.ino b/ATEMtoNRF/ATEMtoNRF.ino index 86bc623..8054168 100644 --- a/ATEMtoNRF/ATEMtoNRF.ino +++ b/ATEMtoNRF/ATEMtoNRF.ino @@ -11,10 +11,21 @@ IPAddress ip(192, 168, 178, 30); //IP of the ATEM switcher ATEM AtemSwitcher(IPAddress(192, 168, 178, 20), 56417); -//tally LEDs -const int tallyLED[] = {2,3,4,5}; -const int tallyLEDlength = 4; -boolean tallyLEDstat[4]; +//program +boolean programStat[4] = {1,1,1,1}; +# define programStatLength 4 + +//preview +boolean previewStat[4] = {1,1,1,1}; +# define previewStatLength 4 + +//program LEDs +const int programLED[] = {2,4}; +# define programLEDlength 2 + +//preview LEDs +const int previewLED[] = {3,5}; +# define previewLEDlength 2 //init NRF RF24 radio (7, 8); @@ -27,11 +38,15 @@ unsigned long previousTime = 0; const long intervalTime = 1000; void setup(){ - for (int i=0; i < tallyLEDlength; i++){ - pinMode(tallyLED[i], OUTPUT); - digitalWrite(tallyLED[i], LOW); + for (int i=0; i < programLEDlength; i++){ + pinMode(programLED[i], OUTPUT); + digitalWrite(programLED[i], HIGH); } - + for (int i=0; i < previewLEDlength; i++){ + pinMode(previewLED[i], OUTPUT); + digitalWrite(previewLED[i], HIGH); + } + //start Ethernet Ethernet.begin(mac,ip); @@ -41,7 +56,7 @@ void setup(){ //connect to the switcher Serial.println("connect to ATEM"); - AtemSwitcher.serialOutput(true); + AtemSwitcher.serialOutput(false); AtemSwitcher.connect(); //start NRF @@ -66,15 +81,22 @@ void loop(){ if (dataChanged() || currentTime - previousTime >= intervalTime){ sendNRF(); previousTime = currentTime; + delay(20); } } void sendNRF(){ - for (int i=0; i < tallyLEDlength; i++) { - datasend = (datasend << 1) + tallyLEDstat[i]; + //program + for (int i=0; i < programStatLength; i++) { + datasend = (datasend << 1) + programStat[i]; + } + datasend = datasend << (8 - programStatLength); + //preview + for (int i=0; i < programStatLength; i++) { + datasend = (datasend << 1) + previewStat[i]; } - datasend = datasend << (8 - tallyLEDlength); - datasend = (datasend << 8) + getChecksum(datasend & 0xFF); + datasend = datasend << (8 - previewStatLength); + //datasend = (datasend << 8) + getChecksum(datasend & 0xFF); Serial.print(" datasend: "); Serial.println(datasend, BIN); @@ -83,11 +105,17 @@ void sendNRF(){ boolean dataChanged(){ boolean changed = false; - //Serial.println("tally: "); - for (int i=0; i < tallyLEDlength; i++){ - if (AtemSwitcher.getProgramTally(i+1) != tallyLEDstat[i]){ - tallyLEDstat[i] = AtemSwitcher.getProgramTally(i+1); - digitalWrite(tallyLED[i], tallyLEDstat[i]); + for (int i=0; i < programStatLength; i++){ + if (AtemSwitcher.getProgramTally(i+1) != programStat[i]){ + programStat[i] = AtemSwitcher.getProgramTally(i+1); + if(programLEDlength > i)digitalWrite(programLED[i], programStat[i]); + changed = true; + } + } + for (int i=0; i < previewStatLength; i++){ + if (AtemSwitcher.getPreviewTally(i+1) != previewStat[i]){ + previewStat[i] = AtemSwitcher.getPreviewTally(i+1); + if(previewLEDlength > i)digitalWrite(previewLED[i], previewStat[i]); changed = true; } } diff --git a/NRFtoTallylight/NRFtoTallylight.ino b/NRFtoTallylight/NRFtoTallylight.ino index 458f112..ed52bec 100644 --- a/NRFtoTallylight/NRFtoTallylight.ino +++ b/NRFtoTallylight/NRFtoTallylight.ino @@ -2,9 +2,9 @@ #include //tally LEDs -const int tallyLED[] = {2,3,4,5}; -const int tallyLEDlength = 4; -boolean tallyLEDstat[4]; +const int tallyLED[] = {2,4}; +const int tallyLEDlength = 2; +boolean tallyLEDstat[2]; # define errorLED 6 @@ -26,6 +26,12 @@ void setup(){ pinMode(errorLED, OUTPUT); digitalWrite(errorLED, HIGH); + pinMode(3, OUTPUT); + digitalWrite(3, LOW); + + pinMode(5, OUTPUT); + digitalWrite(5, LOW); + //start Serial Serial.begin(9600); Serial.println("start serial"); @@ -34,7 +40,7 @@ void setup(){ Serial.println("start NRF"); radio.begin(); radio.openReadingPipe(0, address); - radio.setPALevel(RF24_PA_LOW); + radio.setPALevel(RF24_PA_HIGH); radio.setDataRate(RF24_1MBPS); radio.setAutoAck(false); radio.disableCRC(); diff --git a/NRFtoTallylightRGB/NRFtoTallylightRGB.ino b/NRFtoTallylightRGB/NRFtoTallylightRGB.ino new file mode 100644 index 0000000..6f619bf --- /dev/null +++ b/NRFtoTallylightRGB/NRFtoTallylightRGB.ino @@ -0,0 +1,83 @@ +#include +#include + +//tally RGB LED +const int tallyLED[] = {3,5,6}; //RGB +const int tallyLEDlength = 3; +boolean tallyLEDstat[3]; + +# define RGBground 4 +# define channel 1 + +//init NRF +RF24 radio (7, 8); +const uint16_t address = 0xADB5; +uint16_t datareceive; + +//define min interval to show error +unsigned long currentTime = millis(); +unsigned long previousTime = 0; +const long errorTime = 3000; + +void setup(){ + for (int i=0; i < tallyLEDlength; i++){ + pinMode(tallyLED[i], OUTPUT); + digitalWrite(tallyLED[i], LOW); + } + + pinMode(RGBground, OUTPUT); + digitalWrite(RGBground, LOW); + + //start Serial + Serial.begin(9600); + Serial.println("start serial"); + + //start NRF + Serial.println("start NRF"); + radio.begin(); + radio.openReadingPipe(0, address); + radio.setPALevel(RF24_PA_HIGH); + radio.setDataRate(RF24_1MBPS); + radio.setAutoAck(false); + radio.disableCRC(); + radio.startListening(); + + delay(20); +} + +void loop(){ + while (!updateLoop()); + radio.read(&datareceive, sizeof(datareceive)); + Serial.print("data: "); + Serial.println(datareceive, BIN); + + if ((datareceive >> 15 - channel) & 1 == 1) setRGB(100,0,0); + else if ((datareceive >> 7 - channel) & 1 == 1) setRGB(0,30,0); + else setRGB(0,0,0); +} + +boolean updateLoop(){ + currentTime = millis(); + if (radio.available()){ + Serial.println("new package"); + previousTime = currentTime; + return true; + } + else if (currentTime - previousTime >= errorTime){ + Serial.println("timeout"); + setRGB(0,0,50); + } + return false; +} + +byte getChecksum(byte data){ + byte checksum = 0; + for (int i=8; i<8; i++) checksum += (data >> i) & 1; + return checksum; +} + +void setRGB(int r, int g, int b){ + analogWrite(tallyLED[0], r); + analogWrite(tallyLED[1], g); + analogWrite(tallyLED[2], b); +}