/*
RC LEDRGB CONTROL
Contrôlez une LEDRGB via la voie des gaz de la radiocommande
Jouez avec les valeurs ch1 (entre 1000 et 2000) pour déterminer la position des 5 états sur la voie
Jouez avec les valeurs de délais pour modifier l'état ON Blink (séquence de flash)
DATE 17/02/2015 --> By Willmodelisme
DATE 19/02/2015 --> By manu_86
*/
int ch1 = 0;
int ledPinRouge = 9; // pin D9 atmega 328
int ledPinVert = 5; // pin D5 atmega 328
int ledPinBleu = 6; // pin D6 atmega 328
void setup()
{
pinMode(3, INPUT);
pinMode(9, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
}
void loop()
{
//acquisition creneau radio
ch1 = pulseIn(3, HIGH);
//detection de l'absence d'un creneau radio valide (<900ms), flash LED specifique
if (ch1<900){
//séquence de flash failsafe, jouez a modifiez les valeurs de delay du ON et du OFF
digitalWrite(9, HIGH);
delay (250);
digitalWrite(9, LOW);
delay(0);
digitalWrite(6, HIGH);
delay(250);
digitalWrite(6, LOW);
delay(0);
digitalWrite(5, LOW);
delay(0);
}
else if ((ch1>1000) && (ch1<1250))
{
digitalWrite(9, HIGH);
delay(250);
digitalWrite(9, LOW);
delay(0);
digitalWrite(5, HIGH);
delay(250);
digitalWrite(5, LOW);
delay(0);
digitalWrite(6, HIGH);
delay(250);
digitalWrite(6, LOW);
delay(0);
}
else if ((ch1>1250) && (ch1<1500))
{
digitalWrite(6, LOW);
delay(0);
digitalWrite(9, LOW);
delay(0);
digitalWrite(5, HIGH);
delay(250);
digitalWrite(5, LOW);
delay(250);
}
else if ((ch1>1500) && (ch1<1750))
{
digitalWrite(5, LOW);
delay(0);
digitalWrite(9, LOW);
delay(0);
digitalWrite(6, HIGH);
delay(250);
digitalWrite(6, LOW);
delay(250);
}
else if ((ch1>1750)){
digitalWrite(9, HIGH); //led full
digitalWrite(5, LOW);
delay(0);
digitalWrite(6, LOW);
delay(0);
}
//règle la position de la voie pour un autre état de la led, ici OFF et voie des gaz en position basse (boucle vide led éteinte)
else {}
}
Je rencontre un petit soucis entre les lignes 32 et 41, ça ne clignote pas comme je le veux, j'ai bien le clignotement rouge et bleu a la bonne valeur, mais j'ai un noir de 1 seconde avant que le clignotement reprenne.
Au début, les couleur ne s'éteignaient pas complétement et ça faisait le bazar, j'ai été obligé de rajouter des digitalWrite avec des delay a 0.
Bon, c'est vraie que je débute et c'est mon premier code dérivé de celui de Will et de Manu
Tout ça a été monté sur une arduino mini pro et 3 transistors 2N2222 (ça je sais encore les monter).
A votre bon coeur
Re: Débuguage et optimisation code.
Posté : mar. 3 mars 2015 16:24
par roudoudou
sa peut venir du fait que tu utilise des "else if"
Essaie avec:
if(...)
if(...)
if(...)
else pour voir.
Sinon, je suis pas sur que la fonction delay() fonctionne en parallele de digitalWrite().
En gros, quand tu fais un delay() , ca bloque les autres "états" en cours, comme par exemple une led alumée.
dapres la doc arduino : "No other reading of sensors, mathematical calculations, or pin manipulation can go on during the delay function, so in effect, it brings most other activity to a halt. "
Ca explique pourquoi ca marche avec ton delay(0) .
Re: Débuguage et optimisation code.
Posté : mar. 3 mars 2015 16:36
par artdeschoix
Bonjour ,
je ne peux t'aider car je commence dans le "métier" .
Cà parait assez simple mais rn fin de compte , c'est assez dur .
De plus , si , comme moi , tu ne piges pas trop l'Anglais , bonjour les dégâts !
Je pense que les "pro" d'Arduino ne vont pas tarder à réagir ...
Bonne suite ...
@+ René
Re: Débuguage et optimisation code.
Posté : mar. 3 mars 2015 17:12
par Dehas
@ Roudoudou: le premier code était avec des if(...) et j'avais déjà le soucis, c'est pour ça que j'ai mis des else if.
Dans la deuxième partie du code (ligne 47 a 58), le delay(0) fonctionne bien pour faire clignoter les leds une après l'autre, et dans tout le reste du code aussi.
Il y a juste ce point qui me chagrine.
@ Ardeschoix: pour l'anglais je me débrouille, j'ai un peu l'habitude avec le code du forum, mais sur arduino, il y a 36 façon de faire clignoter des leds, surtout des RGB
/*
RC LEDRGB CONTROL
Contrôlez une LEDRGB via la voie des gaz de la radiocommande
Jouez avec les valeurs ch1 (entre 1000 et 2000) pour déterminer la position des 5 états sur la voie
Jouez avec les valeurs de délais pour modifier l'état ON Blink (séquence de flash)
DATE 17/02/2015 --> By Willmodelisme
DATE 19/02/2015 --> By manu_86
*/
int ch1 = 0;
int ledPinRouge = 9; // pin D9 atmega 328
int ledPinVert = 5; // pin D5 atmega 328
int ledPinBleu = 6; // pin D6 atmega 328
int channel = 3;
void setup()
{
pinMode(channel, INPUT);
pinMode(ledPinRouge, OUTPUT);
pinMode(ledPinVert, OUTPUT);
pinMode(ledPinBleu, OUTPUT);
}
void loop()
{
//acquisition creneau radio
ch1 = pulseIn(channel, HIGH,25000);
//detection de l'absence d'un creneau radio valide (<900ms), flash LED specifique
if (ch1<900){
//séquence de flash failsafe, jouez a modifiez les valeurs de delay du ON et du OFF
digitalWrite(9, HIGH);
delay (250);
digitalWrite(9, LOW);
digitalWrite(6, HIGH);
delay(250);
digitalWrite(6, LOW);
digitalWrite(5, LOW);
}
if ((ch1>1000) && (ch1<1250))
{
digitalWrite(9, HIGH);
delay(250);
digitalWrite(9, LOW);
digitalWrite(5, HIGH);
delay(250);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
delay(250);
digitalWrite(6, LOW);
}
if ((ch1>1250) && (ch1<1500))
{
digitalWrite(6, LOW);
digitalWrite(9, LOW);
digitalWrite(5, HIGH);
delay(250);
digitalWrite(5, LOW);
delay(250);
}
if ((ch1>1500) && (ch1<1750))
{
digitalWrite(5, LOW);
digitalWrite(9, LOW);
digitalWrite(6, HIGH);
delay(250);
digitalWrite(6, LOW);
delay(250);
}
if ((ch1>1750)){
digitalWrite(9, HIGH); //led full
digitalWrite(5, LOW);
digitalWrite(6, LOW);
}
//règle la position de la voie pour un autre état de la led, ici OFF et voie des gaz en position basse (boucle vide led éteinte)
else {}
}
Re: Débuguage et optimisation code.
Posté : mar. 3 mars 2015 18:04
par Tomdu38
Salut,
Je regarderai ça ce soir, en revanche, quelques petites remarques :
25000 est une valeur de temporisation, ici 25ms, soit un poil plus de 20ms, le temps entre 2 impulsions radio.
Ça force l'arduino à se caler sur la lecture et ne pas se perdre en recherche d'impulsion (d'ou le temps sans flash que tu avais avant).
Tu peux virer tous les delay(0); du coup.
Re: Débuguage et optimisation code.
Posté : mar. 3 mars 2015 19:42
par Tomdu38
Tu peux aussi, au début de ta boucle, intialiser toutes des leds en low ! ça permet de s'assurer que toutes les leds en début de boucles sont éteintes.
if ((ch1>1500) && (ch1<1750))
{
digitalWrite(6, HIGH);
delay(250);
digitalWrite(6, LOW);
delay(250);
}
if ((ch1>1750)){
digitalWrite(9, HIGH); //led full
}
Voilou !
@Willmodélisme : on forme une bonne équipe !
Re: Débuguage et optimisation code.
Posté : mar. 3 mars 2015 20:10
par Dehas
T'as raison, vous formez une sacré équipe, j'ai compilé tes modif et c'est nickel, plus rapide [yahoo.gif] [yahoo.gif]
Will, faudra que tu regarde si ça passe sur une ATTiny85
Re: Débuguage et optimisation code.
Posté : mar. 3 mars 2015 20:45
par Tomdu38
ça passe large pour un Attiny85.
Quand je compile le code initiale = "Taille binaire du croquis : 1 656 octets" cf message dans le cadre noir du logiciel arduino.
Un Attiny85 = 8 000 octets de mémoire (cf datasheet ou directement quand tu la sélectionnes dans le logiciel arduino ... si tu as les librairies)
Donc c'est Ok !
A+
Tom
Re: Débuguage et optimisation code.
Posté : mar. 3 mars 2015 20:56
par willmodelisme
Pas de pb.
Je te mets ça sur un petit circuit, c'est plus facile.
Comment sont les pins sur ton ruban RGB (de gauche à droite) ?
Vert/Masse/bleu/rouge ?
Ou autre ?
Re: Débuguage et optimisation code.
Posté : mar. 3 mars 2015 21:48
par Dehas
+12v, vert, rouge, bleu, les rgb sont commandées par des masses et le +12v est commun.
Demain je vous fais une petite vidéo du fonctionnement.
Tu me dis pour le boulot.
C'est plutôt petit, 20x27 mm et il faut un fer a pointe fine.
J'ai séparé les entrées/sorties sur des pins séparé pour facilité la mise en place.
Les pins +12v et -12V sont le + et le - de l'alim des tes leds. (+ et GND sinon Tom va me taper sur les doigts )
Pour le reste:
J1: GND voie récepteur
J2: + 5V récepteur
J3: Signal récepteur
J4: + 12v LED
J5: Vert LED
J6: Rouge LED
J7: Bleu LED
Re: Débuguage et optimisation code.
Posté : mer. 4 mars 2015 17:58
par Dehas
Ben c'est nickel tout ça
Re: Débuguage et optimisation code.
Posté : mer. 4 mars 2015 18:52
par vilajea1
willmodelisme a écrit :Est ce que ça ira au niveau soudure ?
C'est plutôt petit, 20x27 mm et il faut un fer a pointe fine.
J'ai séparé les entrées/sorties sur des pins séparé pour facilité la mise en place.
Les pins +12v et -12V sont le + et le - de l'alim des tes leds. (+ et GND sinon Tom va me taper sur les doigts )
Pour le reste:
J1: GND voie récepteur
J2: + 5V récepteur
J3: Signal récepteur
J4: + 12v LED
J5: Vert LED
J6: Rouge LED
J7: Bleu LED
Hello,
Super ton circuit ! On fait comment pour t en prendre quelque un ?.
Tu fabrique toi même les circuits ? Je me lance dans l arduino et suis ce post avec grand intérêt.
Tu aurai une liste du matériel à prévoir en plus du attiny45?
Re: Débuguage et optimisation code.
Posté : mer. 4 mars 2015 19:08
par Dehas
Comme promis, voila une petite vidéo du montage et du fonctionnement.
Merci a tous ceux qui m'ont aider a finaliser le code, que voici
/*
RC LED RGB CONTROL
Contrôlez une LED RGB via la voie des gaz de la radiocommande
Jouez avec les valeurs ch1 (entre 1000 et 2000) pour déterminer la position des 5 états sur la voie
Jouez avec les valeurs de délais pour modifier l'état ON Blink (séquence de flash)
DATE 17/02/2015 --> By Willmodelisme
DATE 19/02/2015 --> By manu_86
DATE 03/03/2015 Tomdu38
DATE 04/03/2015 --> By Dehas
*/
int ch1 = 0;
int ledPinRouge = 9; // pin D9 atmega 328
int ledPinVert = 5; // pin D5 atmega 328
int ledPinBleu = 6; // pin D6 atmega 328
int channel = 3;
void setup()
{
pinMode(channel, INPUT);
pinMode(ledPinRouge, OUTPUT);
pinMode(ledPinVert, OUTPUT);
pinMode(ledPinBleu, OUTPUT);
}
void loop()
{
//acquisition creneau radio
ch1 = pulseIn(channel, HIGH,25000);
digitalWrite(9, LOW);
digitalWrite(6, LOW);
digitalWrite(5, LOW);
//detection de l'absence d'un creneau radio valide (<900ms), flash LED specifique
if (ch1<900){
//séquence de flash failsafe, jouez a modifiez les valeurs de delay du ON et du OFF
digitalWrite(9, HIGH);
delay (125);
digitalWrite(9, LOW);
digitalWrite(6, HIGH);
delay(125);
digitalWrite(6, LOW);
}
//séquence de flash entre 1000 et 1250ms (de 0 a 25% des gaz)
if ((ch1>1000) && (ch1<1250))
{
digitalWrite(9, HIGH);
delay(250);
digitalWrite(9, LOW);
digitalWrite(5, HIGH);
delay(250);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
delay(250);
digitalWrite(6, LOW);
}
//séquence de flash entre 1250 et 1500ms (de 25 a 50% des gaz)
if ((ch1>1250) && (ch1<1500))
{
digitalWrite(5, HIGH);
delay(250);
digitalWrite(5, LOW);
delay(250);
}
//séquence de flash entre 1500 et 1750ms (de 50 a 75% des gaz)
if ((ch1>1500) && (ch1<1750))
{
digitalWrite(6, HIGH);
delay(250);
digitalWrite(6, LOW);
delay(250);
}
//led full a 100% des gaz
if ((ch1>1750)){
digitalWrite(9, HIGH);
}
//règle la position de la voie pour un autre état de la led, ici OFF et voie des gaz en position basse (boucle vide led éteinte)
else {}
}
Vous avez le CI pour ATTiny58 au dessus développé par Will, en plus il vous faut
1 cordon servo
2 transistors 2N2222
2 bouts de fils rouge et noir pour l'alimentation sur la lipo
3 bout de fils rouge, vert bleu pour relier le module au bandeau de led
1 bandeau de led RGB ici -> http://www.ebay.fr/itm/P816-ruban-LED-R ... OU:FR:3160" onclick="window.open(this.href);return false;
Vous en avez 1 metre, soit 10 fois 10cm, de quoi faire.
Encore merci a tous.
Re: Débuguage et optimisation code.
Posté : mer. 4 mars 2015 20:42
par willmodelisme
Il faut un Attiny85 et 3 transistors (2n2222, 2n4401, ou tout transistor capable de tenir au moins 600mA).
Pour l'instant je n'en fais pas pour les autres, il faut que Denis valide le montage.
Je vais déjà diffuser le PCB en PJ (PDF), le code pour Attiny et le schéma sur breadboard.
Re: Débuguage et optimisation code.
Posté : mer. 4 mars 2015 20:55
par Tomdu38
Cool ! ça marche super !
J'ai modifié un peu ton code, pour qu'il soit plus facile à "modifier".
En début de code, j'ai initialisé des valeurs de delay pour chaque mode, comme ça on peut modifier dès le début la rapidité des clignotements.
J'ai aussi intégré les variables correspondant à chaque pin dans tout code, comme ça, il suffit de modifier les valeurs seulement au début.
Good Job Mr Dehas ! C'est bien fun de travailler à plusieurs sur des petits projets sympatoche comme ça !
/*
RC LED RGB CONTROL
Contrôlez une LED RGB via la voie des gaz de la radiocommande
Jouez avec les valeurs ch1 (entre 1000 et 2000) pour déterminer la position des 5 états sur la voie
Jouez avec les valeurs de délais pour modifier l'état ON Blink (séquence de flash)
DATE 17/02/2015 --> By Willmodelisme
DATE 19/02/2015 --> By manu_86
DATE 03/03/2015 Tomdu38
DATE 04/03/2015 --> By Dehas
*/
// Connection Hardware
int ch1 = 0;
int ledPinRouge = 9; // pin D9 atmega 328
int ledPinVert = 5; // pin D5 atmega 328
int ledPinBleu = 6; // pin D6 atmega 328
int channel = 3;
// Parametrage des delay de chaque plage
int delayMod0 = 125 ; // delay lorsque gaz < 900
int delayMod1 = 250 ; // delay lorsque 1000 < gaz < 1250 : (de 0 a 25% des gaz)
int delayMod2 = 250 ; // delay lorsque 1250 < gaz < 1500 : (de 25 a 50% des gaz)
int delayMod3 = 250 ; // delay lorsque 1500 < gaz < 1750 : (de 50 a 75% des gaz)
void setup()
{
pinMode(channel, INPUT);
pinMode(ledPinRouge, OUTPUT);
pinMode(ledPinVert, OUTPUT);
pinMode(ledPinBleu, OUTPUT);
}
void loop()
{
//acquisition creneau radio
ch1 = pulseIn(channel, HIGH,25000);
digitalWrite(ledPinRouge, LOW);
digitalWrite(ledPinBleu, LOW);
digitalWrite(ledPinVert, LOW);
//detection de l'absence d'un creneau radio valide (<900ms), flash LED specifique
if (ch1<900){
//séquence de flash failsafe, jouez a modifiez les valeurs de delay du ON et du OFF
digitalWrite(ledPinRouge, HIGH);
delay (delayMod0);
digitalWrite(ledPinRouge, LOW);
digitalWrite(ledPinBleu, HIGH);
delay(delayMod0);
digitalWrite(ledPinBleu, LOW);
}
//séquence de flash entre 1000 et 1250ms (de 0 a 25% des gaz)
if ((ch1>1000) && (ch1<1250))
{
digitalWrite(ledPinRouge, HIGH);
delay(delayMod1);
digitalWrite(ledPinRouge, LOW);
digitalWrite(ledPinVert, HIGH);
delay(delayMod1);
digitalWrite(ledPinVert, LOW);
digitalWrite(ledPinBleu, HIGH);
delay(delayMod1);
digitalWrite(ledPinBleu, LOW);
}
//séquence de flash entre 1250 et 1500ms (de 25 a 50% des gaz)
if ((ch1>1250) && (ch1<1500))
{
digitalWrite(ledPinVert, HIGH);
delay(delayMod2);
digitalWrite(ledPinVert, LOW);
delay(delayMod2);
}
//séquence de flash entre 1500 et 1750ms (de 50 a 75% des gaz)
if ((ch1>1500) && (ch1<1750))
{
digitalWrite(ledPinBleu, HIGH);
delay(delayMod3);
digitalWrite(ledPinBleu, LOW);
delay(delayMod3);
}
//led full a 100% des gaz
if ((ch1>1750)){
digitalWrite(ledPinRouge, HIGH);
}
//règle la position de la voie pour un autre état de la led, ici OFF et voie des gaz en position basse (boucle vide led éteinte)
else {}
}
Maintenant il faut faire le même module avec les Neopixels... d'ailleurs Dehas, pourquoi tu n'as pas utilisé des Neopixels ? Tu avais déjà les leds RGB sous la main ???
A+
Tom
Re: Débuguage et optimisation code.
Posté : mer. 4 mars 2015 21:04
par Dehas
J'ai pas de neopixels sous la main, mais j'ai repiqué le code de cleanflight, mais de la a le faire fonctionner, je ne suis pas capable !!
Re: Débuguage et optimisation code.
Posté : mer. 4 mars 2015 21:28
par Tomdu38
Ok, jpe te faire ça si tu veux. En faisant un mix de ton code, et de celui que j'ai posté sur les neopixels ça marchera sans problème.
Tu veux mode clignotant droit et gauche aussi ???
A+
Re: Débuguage et optimisation code.
Posté : mer. 4 mars 2015 21:41
par vilajea1
Hello,
Voila un bout de code fonctionnel pour la gestion des Leds Neopixel Adafruit ou autre selon la position des gaz.
Ne fonctionne que pour le ppm et sortie gaz voie 3. Code développer par un membre d'Argonay que l'on a pris et adapter pour notre utilisation.
Si quelqu'un veut faire la même chose mais pour du PWM, S-Bus, EX-Bus,... avec possibilité de choix pour la sortie des gaz voie 1 ou 3.