Skip to content

Instantly share code, notes, and snippets.

@jakabo27
Created November 19, 2018 05:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jakabo27/6c8744bd83709da24937ba6515981c06 to your computer and use it in GitHub Desktop.
Save jakabo27/6c8744bd83709da24937ba6515981c06 to your computer and use it in GitHub Desktop.
// 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);
}
}
}
@lyonschris2004
Copy link

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

@jakabo27
Copy link
Author

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!

@lyonschris2004
Copy link

Thanks, good luck with your degree.

@garbo5005
Copy link

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/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment