arduino  RC Navy (2012)

Exemple asynchrone avec la librairie <RcSeq>:

Le sketch: Le potentiomètre d'une voie d'un émetteur RC est remplacé par 8 Bouton-Poussoirs commutant des résistances. L'arduino lit une impulsion RC d'un récepteur, et détermine le Bouton-Poussoir qui a été appuyé parmi les 8 déclarés. A chaque Bouton-Poussoir appuyé, une action est complémentée.
Ce sketch montre comment utiliser la macro DECLARE_ACTION() pour déclarer plusieurs fois la même action (ici 8 fois). Les valeurs d'impulsions centrales sont à ajuster par rapport au comportement de chaque modèle d'émetteur RC. Ce sketch est prévu pour un ATtiny84.

L'utilisateur notera la clarté et la concision du sketch.

Note: ce sketch est inspiré de celui d'Alain Claverie et adapté à la libraire <RcSeq>.

Le câblage sur le site d'Alain:

Remplacement d'un potentiomètre par des Bouton-Poussoirs et résistances
Note: il est parfaitement possible de faire tourner ce sketch sur un ATtiny85 en limitant à 4 Boutons-Poussoirs. Il faudra cependant ajuster l'affectation des broches.

#include <RcSeq.h>
#include <TinyPinChange.h> /* Ne pas oublier d'inclure la librairie <TinyPinChange> qui est utilisee par la librairie <RcSeq> */
#include <SoftRcPulseIn.h> /* Ne pas oublier d'inclure la librairie <SoftRcPulseIn> qui est utilisee par la librairie <RcSeq> */
#include <SoftRcPulseOut.h> /* Ne pas oublier d'inclure la librairie <SoftRcPulseOut> qui est utilisee par la librairie <RcSeq> */

/*================= COMMMANDE DE 8 SORTIES ON/OFF PAR 8 INTERS POUSSOIR ========================
Les 8 relais ou sont connectés aux broches n°1,2,3,4,5,6,7,8 d'un ATtiny84
La voie du récepteur est connecté à la prise n°0 de l'ATtiny84
Un appui furtif sur un bouton fait actionne le relais correspondant qui reste collé.
Un deuxième appui furtif sur le même bouton fait décoller le relais correspondant.
Version avec librairie <RcSeq> par RC Navy d'apres l'exemple de http://bateaux.trucs.free.fr/huit_sorties.html

.---------------.
| |
| .------+------.
| | VDD |1
| | +-- LED, Relais, etc...
| | |
| | |2
| | +-- LED, Relais, etc...
| | |
| | |3
| | +-- LED, Relais, etc...
.--------------. | | |
| |-----' 0| |4
| Voie 1|--------------+ +-- LED, Relais, etc...
| |-----. | ATtiny84 |
| RECEPTEUR RC | | | |5
| |- | | +-- LED, Relais, etc...
| Voie 2|- | | |
| |- | | |6
'--------------' | | +-- LED, Relais, etc...
| | |
| | |7
| | +-- LED, Relais, etc...
| | |
| | |8
| | +-- LED, Relais, etc...
| | GND |
| '------+------'
| |
'---------------'
================================================================================================*/

/* Declaration des voies */
enum {RC_VOIE=0, NBR_VOIES_RC}; /* Ici, comme il n'y a qu'une voie, on aurait pu faire un simple "#define RC_VOIE 0" a la place de l'enumeration */

//==============================================================================================
/* Declaration du signal du recepteur */
#define BROCHE_SIGNAL_RECEPTEUR_VOIE 0

#define DELAI_ENTRE_CMD_MS 500UL

//==============================================================================================
/* Declaration d'un clavier "Maison": les impulsions des Boutons-Poussoirs n'ont pas besoin d'etre equidistantes */
enum {BP1=0, BP2, BP3, BP4, BP5, BP6, BP7, BP8, NBR_BP};
#define TOLERANCE 40 /* Tolerance en + ou en - (en micro-seconde): ATTENTION, il ne doit pas y avoir recouvrement entre 2 zones actives adjacentes. Zone active = 2 x TOLERANCE (us) */
KeyMap_t ClavierMaison[] PROGMEM ={ {VALEUR_CENTRALE_US(1100,TOLERANCE)}, /* BP1: +/-40 us */
{VALEUR_CENTRALE_US(1200,TOLERANCE)}, /* BP2: +/-40 us */
{VALEUR_CENTRALE_US(1300,TOLERANCE)}, /* BP3: +/-40 us */
{VALEUR_CENTRALE_US(1400,TOLERANCE)}, /* BP4: +/-40 us */
{VALEUR_CENTRALE_US(1600,TOLERANCE)}, /* BP5: +/-40 us */
{VALEUR_CENTRALE_US(1700,TOLERANCE)}, /* BP6: +/-40 us */
{VALEUR_CENTRALE_US(1800,TOLERANCE)}, /* BP7: +/-40 us */
{VALEUR_CENTRALE_US(1900,TOLERANCE)}, /* BP8: +/-40 us */
};

//==============================================================================================
/* Astuce: une macro pour n'ecrire qu'une seule fois la fonction ActionX() */
#define DECLARE_ACTION(Idx) \
void Action##Idx(void) \
{ \
static uint32_t DebutMs=millis(); \
static boolean Etat=HIGH; \
/* Depuis la version 2.0 de la lib <RcSeq>, pour */ \
/* des raisons de reactivite, la tempo inter-commande */ \
/* doit etre geree dans le sketch utilisateur. */ \
if(millis() - DebutMs >=
DELAI_ENTRE_CMD_MS) \
{ \
DebutMs=millis(); \
digitalWrite(Idx, Etat); \
Etat=!Etat; \
} \
}

/* Declaration des actions en utilisant la macro DECLARE_ACTION(Idx) avec Idx = le numero de l'action et de la pin (le ##Idx sera remplace automatiquement par la valeur de Idx */
DECLARE_ACTION(1)
DECLARE_ACTION(2)
DECLARE_ACTION(3)
DECLARE_ACTION(4)
DECLARE_ACTION(5)
DECLARE_ACTION(6)
DECLARE_ACTION(7)
DECLARE_ACTION(8)

//==============================================================================================
void setup()
{
RcSeq_Init();
RcSeq_DeclareSignal(RC_VOIE, BROCHE_SIGNAL_RECEPTEUR_VOIE);
RcSeq_DeclareClavierMaison(RC_VOIE, RC_CLAVIER_MAISON(ClavierMaison));
RcSeq_DeclareCommandeEtActionCourte(RC_VOIE, BP1, Action1);pinMode(1,OUTPUT);
RcSeq_DeclareCommandeEtActionCourte(RC_VOIE, BP2, Action2);pinMode(2,OUTPUT);
RcSeq_DeclareCommandeEtActionCourte(RC_VOIE, BP3, Action3);pinMode(3,OUTPUT);
RcSeq_DeclareCommandeEtActionCourte(RC_VOIE, BP4, Action4);pinMode(4,OUTPUT);
RcSeq_DeclareCommandeEtActionCourte(RC_VOIE, BP5, Action5);pinMode(5,OUTPUT);
RcSeq_DeclareCommandeEtActionCourte(RC_VOIE, BP6, Action6);pinMode(6,OUTPUT);
RcSeq_DeclareCommandeEtActionCourte(RC_VOIE, BP7, Action7);pinMode(7,OUTPUT);
RcSeq_DeclareCommandeEtActionCourte(RC_VOIE, BP8, Action8);pinMode(8,OUTPUT);
}
//==============================================================================================
void loop()
{
RcSeq_Rafraichit();
}
//============================ FIN DU PROGRAMME =================================================

Retour