// WORKING VERSION WITH RENARD PROTOCOL USING SERIAL3 (PINS 14 TO FTDI RX AND 15 TO FTDI TX) | |
// This code was written by Victor Perez for doityourselfchristmas.com based on the code from Zparticle, Si_champion and Neil Tapp. | |
// To adapt the code to your case, just change this top section, with the #define lines. | |
// Includes the watchdog timer library | |
#include <avr/wdt.h> | |
// KG add for renard. Include the Arduino Renard library by Bill Porter | |
#include <Arduino-Renard.h> | |
// This sets how many channels will vixen be sending. Can be set to any number from 1 to 48 for Arduino Mega, and 1 to 18 for Arduino Uno. | |
#define CHANNEL_COUNT 8 | |
Renard renard; //KG add for renard | |
byte incomingByte[CHANNEL_COUNT]; //KG add for renard | |
// speed for the com port for talking with vixen. From 9600 to 115200. Use the same speed as set in Vixen. | |
#define VIXEN_COM_SPEED 57600 | |
// Timeout waiting for serial input before going to random mode (in milliseconds). | |
#define TIME_OUT 1000 | |
// If the relays turn On and Off opposite to Vixen sequence, change "#define MODE NOT_INVERTED" for "#define MODE INVERTED" | |
#define NOT_INVERTED 0 | |
#define INVERTED 1 | |
#define MODE NOT_INVERTED | |
// which pins control which channels | |
// You can change these assignment to use different pins, but be very careful to not repeat the same pin number for 2 channels. | |
// DO NOT use pings 0 and 1, as those are for the serial port to talk to the computer. | |
#define CH01 5 | |
#define CH02 6 | |
#define CH03 7 | |
#define CH04 8 | |
#define CH05 9 | |
#define CH06 10 | |
#define CH07 11 | |
#define CH08 12 | |
int channels[] = {CH01,CH02,CH03,CH04,CH05 ,CH06,CH07,CH08}; | |
// KG subtract for renard - int incomingByte[CHANNEL_COUNT]; | |
int i = 0; // Loop counter | |
volatile unsigned long timer_a = 0; // new line | |
//setup the pins/ inputs & outputs | |
void setup(){ | |
renard.begin((uint8_t*)&incomingByte, CHANNEL_COUNT, &Serial3, 57600); //KG add for renard | |
// enable the watchdog timer with a time of 1 second. If the board freezes, it will reset itself after 1 second. | |
wdt_enable(WDTO_1S); | |
// specifically for the UNO | |
//sei(); | |
// initalize PWM Channels / Pins | |
for (i=0; i < CHANNEL_COUNT; i++){ | |
pinMode(channels[i], OUTPUT); | |
} | |
// set all the realys to off to start with | |
if (MODE == NOT_INVERTED) { | |
for (i=0; i < CHANNEL_COUNT; i++){ | |
digitalWrite(channels[i], LOW); | |
} | |
} | |
else { | |
for (i=0; i < CHANNEL_COUNT; i++){ | |
digitalWrite(channels[i], HIGH); | |
} | |
} | |
testSequence(); | |
// set up Serial according to the speed defined above. | |
Serial.begin(VIXEN_COM_SPEED); | |
} | |
void loop(){ | |
if (renard.receive()) { //KG modified from VictorPV original | |
wdt_reset(); // resets the watchdog | |
timer_a = millis (); // new line | |
int uno = Serial.read(); | |
if (MODE == NOT_INVERTED) { | |
for (i=0; i < CHANNEL_COUNT; i++){ | |
int value = incomingByte[i]; | |
if (value > 5) { | |
analogWrite(channels[i], value); | |
} | |
else { | |
digitalWrite(channels[i], LOW); | |
} | |
} | |
} | |
else { | |
for (i=0; i < CHANNEL_COUNT; i++){ | |
int value = incomingByte[i]; | |
if (value < 25) { | |
analogWrite(channels[i], (255-value)); | |
} | |
else { | |
digitalWrite(channels[i], HIGH); | |
} | |
} | |
} | |
} | |
// Random mode code. Random mode starts if no serial input has been received in TIME_OUT millisenconds | |
else { | |
wdt_reset(); // resets the watchdog | |
unsigned long diff = millis() - timer_a; | |
if (diff >= TIME_OUT) { | |
timer_a = millis (); | |
int random_a = 0; | |
for (i=0; i < CHANNEL_COUNT; i++){ | |
random_a = random(0, 2); | |
if (random_a == 0) { | |
digitalWrite(channels[i], LOW); | |
} | |
else { | |
digitalWrite(channels[i], HIGH); | |
} | |
} | |
} | |
} | |
} | |
void testSequence(){ | |
if (MODE == NOT_INVERTED) { | |
for (i=0; i < CHANNEL_COUNT; i++){ | |
wdt_reset(); // resets the watchdog | |
digitalWrite(channels[i], HIGH); | |
delay (500); | |
digitalWrite(channels[i], LOW); | |
} | |
} | |
else { | |
for (i=0; i < CHANNEL_COUNT; i++){ | |
wdt_reset(); // resets the watchdog | |
digitalWrite(channels[i], LOW); | |
//kg delay (500); | |
//kg digitalWrite(channels[i], HIGH); | |
} | |
} | |
} |
I am building your project but for some reason, this code won't compile in Arduino ide could you help me out?
c:\Users\lyons\OneDrive\Documents\Arduino\light show\light show.ino: In function 'void setup()':
c:\Users\lyons\OneDrive\Documents\Arduino\light show\light show.ino:51:59: error: 'Serial3' was not declared in this scope
renard.begin((uint8_t*)&incomingByte, CHANNEL_COUNT, &Serial3, 57600); //KG add for renard
^~~~~~~
c:\Users\lyons\OneDrive\Documents\Arduino\light show\light show.ino:51:59: note: suggested alternative: 'Serial'
renard.begin((uint8_t*)&incomingByte, CHANNEL_COUNT, &Serial3, 57600); //KG add for renard
^~~~~~~
Serial
Compilation error: Error: 2 UNKNOWN: exit status 1
Hmm are you compiling for an Arduino Uno or the ESP8266 or what?
It's possible in more recent versions of the serial library for the ESP8266 they changed which port is serial 3, or renamed it to something else maybe? I switched to using Falcon controllers and haven't looked at the wireless stuff since then, and I'm finishing up my Masters degree this year so I don't have time to dig into it, sorry!
Thanks, good luck with your degree.
If using a UNO remove the serial number it should read like this
renard.begin((uint8_t*)&incomingByte, CHANNEL_COUNT, &Serial, 115200); //KG add for renard
This program was written for the Mega which will allow Serial3
https://www.arduino.cc/reference/en/language/functions/communication/serial/
Can we do it without ardiuno and esp genric module using nodemcu.