#include #include #include /* IMPORTANT: For this sketch to compile, RC_SEQ_WITH_SOFT_RC_PULSE_IN_SUPPORT and RC_SEQ_WITH_SHORT_ACTION_SUPPORT shall be defined in PathOfTheLibraries/(Digispark)RcSeq/RcSeq.h and RC_SEQ_WITH_SOFT_RC_PULSE_OUT_SUPPORT shall be commented. This sketch demonstrates how to easily transform a proportionnal RC channel into 5 digital commands with an ATtiny85. RC Navy (2013) http://p.loussouarn.free.fr COMMMAND OF 5 digital outputs from 5 push button replacing a potentiometer in the RC transmitter: ================================================================================================ Output pins: #1, #2, #3, #4, #5 of an ATtiny85 or a Digispark The receiver output channel is connected to pin#0 of an ATtiny85 or a Digispark A furtive pressure on the push button on the transmitter toggles the corresponding output on the ATtiny85 or a Digispark connected to the receiver output channel. Version with RcSeq library inspired by: http://bateaux.trucs.free.fr/huit_sorties.html Modification at RC Transmitter side: =================================== Custom keyboard with push buttons ================================= Stick Potentiometer 1K 1K 1K 1K 1K 1K =================== .--###---+---###---+---###---+---###---+---###---+---###---. .-. .--. .-. | _.| _.| _.| _.| _.| | |O|--' | |O|-' PB1 |_| PB2 |_| PB3 |_| PB4 |_| PB5 |_| | PB# = Push Button # | | # Replaced with | | '| '| '| '| '| | |O|----># ============> |O|----------+---------+---------+---------+---------+---###---+ | | # | | 100K | |O|-- | |O|------------------------------------------------------------' '-' '--' '-' At RC Receiver side: (The following sketch is related to this ATtiny85 or Digispark) =================== .---------------. | | | ,------+------. | | VDD |1 | | +-- LED, Relay, etc... | | | | | |2 | | +-- LED, Relay, etc... | | | | | ATtiny85 |3 | | or +-- LED, Relay, etc... .------------. | | Digispark | | |-----' 0| |4 | Channel#1|--------------+ +-- LED, Relay, etc... | |-----. | | | RC | | | |5 | RECEIVER | | | +-- LED, Relay, etc... | | | | GND | | |- | '------+------' | Channel#2|- | | | |- '---------------' '------------' Note: ==== - Decoupling capacitors are not drawn. - This sketch can easily be extended to 8 outputs by using an ATtiny84 which has more pins. - This sketch cannot work if you are using DigiUSB library as this one monopolizes the "pin change interrupt vector" (which is very time sensitive). - On the other side, its possible to communicate with exterior world by using , a library mainly derived from , but which allow to share the pin change interrupt vector through the library. ================================================================================================*/ /* Channel Declaration */ enum {RC_CHANNEL, RC_CHANNEL_NB}; /* Here, as there is a single channel, we could used a simple "#define RC_CHANNEL 0" rather an enumeration */ //============================================================================================== /* Channel Signal of the Receiver */ #define RX_CHANNEL_SIGNAL_PIN 0 //============================================================================================== /* Declaration of the custom keyboard": the pulse width of the push buttons do not need to be equidistant */ enum {PUSH_BUTTON1, PUSH_BUTTON2, PUSH_BUTTON3, PUSH_BUTTON4, PUSH_BUTTON5, PUSH_BUTTON_NBR}; #define TOLERANCE 40 /* Tolerance +/- (in microseconds): CAUTION, no overlap allowed between 2 adjacent active areas . active area width = 2 x TOLERANCE (us) */ const KeyMap_t CustomKeyboard[] PROGMEM ={ {CENTER_VALUE_US(1100,TOLERANCE)}, /* PUSH_BUTTON1: +/-40 us */ {CENTER_VALUE_US(1300,TOLERANCE)}, /* PUSH_BUTTON2: +/-40 us */ {CENTER_VALUE_US(1500,TOLERANCE)}, /* PUSH_BUTTON3: +/-40 us */ {CENTER_VALUE_US(1700,TOLERANCE)}, /* PUSH_BUTTON4: +/-40 us */ {CENTER_VALUE_US(1900,TOLERANCE)}, /* PUSH_BUTTON5: +/-40 us */ }; //============================================================================================== /* Trick: a macro to write a single time the ToggleAction#() function */ #define DECLARE_TOGGLE_ACTION(Idx) \ void ToggleAction##Idx(void) \ { \ static uint32_t StartMs=millis(); \ static boolean Etat=HIGH; \ \ /* Since version 2.0 of the library, */ \ /* for reactivity reasons, inter-command delay */ \ /* shall be managed in the user sketch. */ \ if(millis() - StartMs >= 500UL) \ { \ StartMs=millis(); \ digitalWrite(Idx, Etat); \ Etat=!Etat; \ } \ } /* Declaration of the actions using the DECLARE_TOGGLE_ACTION(Idx) macro with Idx = The number of the action and the pin number (The ##Idx will be automatically replaced with the Idx value */ DECLARE_TOGGLE_ACTION(1) DECLARE_TOGGLE_ACTION(2) DECLARE_TOGGLE_ACTION(3) DECLARE_TOGGLE_ACTION(4) DECLARE_TOGGLE_ACTION(5) //============================================================================================== void setup() { RcSeq_Init(); RcSeq_DeclareSignal(RC_CHANNEL, RX_CHANNEL_SIGNAL_PIN); /* RC_CHANNEL Channel is assigned to RX_CHANNEL_SIGNAL_PIN pin */ RcSeq_DeclareCustomKeyboard(RC_CHANNEL, RC_CUSTOM_KEYBOARD(CustomKeyboard)); /* The CustomKeyboard map is assigned to the RC_CHANNEL Channel */ RcSeq_DeclareCommandAndShortAction(RC_CHANNEL, PUSH_BUTTON1, ToggleAction1);pinMode(1,OUTPUT); /* The ToggleAction1 is assigned to the PUSH_BUTTON1 push button #1 */ RcSeq_DeclareCommandAndShortAction(RC_CHANNEL, PUSH_BUTTON2, ToggleAction2);pinMode(2,OUTPUT); /* The ToggleAction2 is assigned to the PUSH_BUTTON1 push button #2 */ RcSeq_DeclareCommandAndShortAction(RC_CHANNEL, PUSH_BUTTON3, ToggleAction3);pinMode(3,OUTPUT); /* The ToggleAction3 is assigned to the PUSH_BUTTON1 push button #3 */ RcSeq_DeclareCommandAndShortAction(RC_CHANNEL, PUSH_BUTTON4, ToggleAction4);pinMode(4,OUTPUT); /* The ToggleAction4 is assigned to the PUSH_BUTTON1 push button #4 */ RcSeq_DeclareCommandAndShortAction(RC_CHANNEL, PUSH_BUTTON5, ToggleAction5);pinMode(5,OUTPUT); /* The ToggleAction5 is assigned to the PUSH_BUTTON1 push button #5 */ } //============================================================================================== void loop() { RcSeq_Refresh(); /* This function performs all the needed job asynchronously (non blocking) */ } //============================ END OF SKETCH =================================================