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

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