r/c lights

Every thing is better with LEDs, right?

rc lights body with lights

So my r/c car needed some. Options are just buy a kit and be stuck with the vendor possibilities or DIY.

Of course DIY!!!

After some brainstorming I decided to start small.

Level 1:

  • head and tail lights
  • break lights
  • some blinking
  • switch able from the remote

Lucky for me my remote control set has 3 channels and with it's already custom firmware I can program it to cycle throug -100%, -50%,... to 100%.

And a quick look into my electronic part bins showed yeah I have all needed parts.

BoM:

  • 4x LEDs
  • 4x matching resistors
  • bains >> Arduino
  • power main r/c battery
  • some connectors ( for connecting the receiver and the LEDs, I want to be able to easily disconnect it )
  • cables
  • hot glue

Basically the Arduino is connected in parallel to channel 2 and 3 ( throttle and the button) The Arduino reads the PWN signals from the receiver and does some LEDs blinking.

Simple right? No? here is a schematic thing

rc lights schematic

HW version 1, kind of huge ;-)

rc lights perfboard version1

HW version 2, better. rc lights perfboard version2

And a PCB idea

rc lights pcb

And the Fritzing project file rc-lights-v4-arduino-mini-pro.fzz

Software:

rclightv3_serialoutput.ino

/
RC Lights by Stefan.Schmidt@knallakoff.de

Utility.h for the foreach(), pachted for IDE 1.0
v4
pro mini

http://arduino.cc/playground/Code/Utility
patch http://markus.jabs.name/2011/12/arduino-kennt-wprogram-nicht-mehr/
/
#include <Utility.h>
boolean debug = false;

//def input for 3 channel
int channel1_pin = 14;
unsigned int channel1_pulse;
int channel2_pin = 15;
unsigned int channel2_pulse;
int channel3_pin = 16;
unsigned int channel3_pulse;


int lstates[8] = {0, 0, 0, 0, 0, 0, 0, 0};  //to stor the lights start.... only 1 used until now
// only 4 are used, more to come...
byte headr = 10;
byte headl = 11;
byte backr = 3;
byte backl = 6;
byte revl = 5;
byte tr = 9;
byte tl = 12;
byte ex1 = 13;

byte lights[8] = {headr, headl, backr, backl, revl, tr, tl, ex1};



void setup(){
    if (debug){
        Serial.begin(9600);
    }
    // input setup
    pinMode(channel1_pin, INPUT);
    pinMode(channel2_pin, INPUT);
    pinMode(channel3_pin, INPUT);

    // output setup
    foreach(lights, 8, pinMode, OUTPUT);
    // by default all LEDs are on, so you can see if they are working
    foreach(lights, 8, digitalWrite, HIGH);
}

void loop()
    {  
    // Read the channles, CH1 Steering, CH2 Throttle and 
    // CH3 multi position switch, -100%, -50%, 0%, 50% and 100% on my H-GT3b with 0.41 PSX Firmware, 4 of 8 are possible positions are used
    // CH1 disabled by default I do not use it (not connected) and this add delay so it does not blink so fast ;-)

    //channel1_pulse = pulseIn(channel1_pin, HIGH, 20000);
    channel2_pulse = pulseIn(channel2_pin, HIGH, 20000);
    channel3_pulse = pulseIn(channel3_pin, HIGH, 20000);

    // Some Debug to see what is read from the channels
    if (debug){
        Serial.print("c1: ");
        Serial.print(channel1_pulse);
        Serial.print(" c2: ");
        Serial.print(channel2_pulse);
        Serial.print(" c3: ");
        Serial.println(channel3_pulse);
    }

    //begin switching depending on CH3 position
    //CH3 100% - some fast single blinking (
    if (channel3_pulse > 1900) {
        if (lstates[4]== 0){
            digitalWrite(lights[0], HIGH);
            digitalWrite(lights[1], LOW);
            digitalWrite(lights[2], LOW);
            digitalWrite(lights[3], LOW);
            } 
        if (lstates[4]== 1){
            digitalWrite(lights[0], LOW);
            digitalWrite(lights[1], HIGH);
            digitalWrite(lights[2], LOW);
            digitalWrite(lights[3], LOW);
            } 
        if (lstates[4]== 2){
            digitalWrite(lights[0], LOW);
            digitalWrite(lights[1], LOW);
            digitalWrite(lights[2], HIGH);
            digitalWrite(lights[3], LOW);
            } 
        if (lstates[4]== 3){
            digitalWrite(lights[0], LOW);
            digitalWrite(lights[1], LOW);
            digitalWrite(lights[2], LOW);
            digitalWrite(lights[3], HIGH);
            lstates[4]= -1;
            }
        lstates[4]++;    
    }

    //CH3 50% - some 4 LED blinking slower
    if ((channel3_pulse > 1700)and (channel3_pulse < 1900)) {
        if (lstates[4]== 0){
            digitalWrite(lights[0], HIGH);
            digitalWrite(lights[1], HIGH);
            digitalWrite(lights[2], HIGH);
            digitalWrite(lights[3], HIGH);
            lstates[4]= 1;
            } 
        else {
            digitalWrite(lights[0], LOW);
            digitalWrite(lights[1], LOW);
            digitalWrite(lights[2], LOW);
            digitalWrite(lights[3], LOW);
            lstates[4]= 0;
            }
        delay(150);
    }

    //CH3 0% - LEDs blinking in X pattern - slower

    if ((channel3_pulse > 1400)and (channel3_pulse < 1700)) {
        if (lstates[4]== 0){
            digitalWrite(lights[0], LOW);
            digitalWrite(lights[1], HIGH);
            digitalWrite(lights[2], LOW);
            digitalWrite(lights[3], HIGH);
            lstates[4]= 1;
            } 
        else {
            digitalWrite(lights[0], HIGH);
            digitalWrite(lights[1], LOW);
            digitalWrite(lights[2], HIGH);
            digitalWrite(lights[3], LOW);
            lstates[4]= 0;
            }
        delay(300);
    }

    //CH3 -50% - normal 4 LED on (normal light) if CH2 is beaking /reverse rear LEDs blink
    if ((channel3_pulse > 1200)and (channel3_pulse < 1400)) {
        digitalWrite(lights[0], HIGH);
        digitalWrite(lights[1], HIGH);
        digitalWrite(lights[2], HIGH);
        digitalWrite(lights[3], HIGH);
        lstates[4]= 0;
        if ((channel2_pulse < 1300)) {
            digitalWrite(lights[2], LOW);
            digitalWrite(lights[3], LOW);
            lstates[4]= 1;
            delay(30);
            }
        if ((channel2_pulse < 1300)and(lstates[4]== 1)) {
            lstates[4]= 0;
            digitalWrite(lights[2], HIGH);
            digitalWrite(lights[3], HIGH);
            delay(30);
            }
    }

    //CH3 -100% - lights off, if CH2 is beaking /reverse rear LEDs blink 
    if ((channel3_pulse > 900)and (channel3_pulse < 1200)) {
        digitalWrite(lights[0], LOW);
        digitalWrite(lights[1], LOW);
        digitalWrite(lights[2], LOW);
        digitalWrite(lights[3], LOW);
        if ((channel2_pulse < 1300)) {
            digitalWrite(lights[2], HIGH);
            digitalWrite(lights[3], HIGH);
            }
        } 
    }

Trackbacks

Trackback specific URI for this entry

This link is not meant to be clicked. It contains the trackback URI for this entry. You can use this URI to send ping- & trackbacks from your own blog to this entry. To copy the link, right click and select "Copy Shortcut" in Internet Explorer or "Copy Link Location" in Mozilla.

No Trackbacks

Comments

Display comments as Linear | Threaded

No comments

The author does not allow comments to this entry