Débuguage et optimisation code.

Modérateur : Dehas

Avatar du membre
Dehas
Administrateur du site
Messages : 16171
Enregistré le : ven. 3 juin 2011 12:50
Réputation : 5
Localisation : Saint Dié des Vosges
Genre :
Contact :

Débuguage et optimisation code.

Message non lu par Dehas »

Salut a tous
Une petite aide des connaisseur pour me donner un coup de main pour débuguer et optimiser ce code

Code : Tout sélectionner

    /*
        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 :rouge:
Tout ça a été monté sur une arduino mini pro et 3 transistors 2N2222 (ça je sais encore les monter).
A votre bon coeur :gene3:


Avatar du membre
roudoudou
Pilote toutes catégories
Messages : 833
Enregistré le : dim. 11 mai 2014 18:19
Réputation : 0
Contact :

Re: Débuguage et optimisation code.

Message non lu 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) .


MT220mm - ZMR250 - Alien 560 - DART450 - DART 400 - Blade Nano QX FPV - F450 , ....
ma page fb sur les quads : https://www.facebook.com/lapatpatrouille
artdeschoix
Pilote toutes catégories
Messages : 3153
Enregistré le : lun. 18 févr. 2013 21:05
Réputation : 0

Re: Débuguage et optimisation code.

Message non lu 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é 8|


Tarot FY 680 Pro - GPS Naza V2
DJI450V2 - GPS NAZA V1
Futaba T8FG/T14SG



Avatar du membre
Dehas
Administrateur du site
Messages : 16171
Enregistré le : ven. 3 juin 2011 12:50
Réputation : 5
Localisation : Saint Dié des Vosges
Genre :
Contact :

Re: Débuguage et optimisation code.

Message non lu 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 :faché1:


Avatar du membre
willmodelisme
Pilote toutes catégories
Messages : 2095
Enregistré le : sam. 2 juin 2012 17:20
Réputation : 0
Localisation : essonne 91

Re: Débuguage et optimisation code.

Message non lu par willmodelisme »

Essaye ça:

Code : Tout sélectionner

 /*
            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 {}
                }


Image
Avatar du membre
Tomdu38
Pilote toutes catégories
Messages : 1104
Enregistré le : dim. 19 mai 2013 17:01
Réputation : 0

Re: Débuguage et optimisation code.

Message non lu par Tomdu38 »

Salut,

Je regarderai ça ce soir, en revanche, quelques petites remarques :

quand tu déclares :

Code : Tout sélectionner

int ledPinRouge = 9;  // pin D9 atmega 328         
int ledPinVert = 5;   // pin D5 atmega 328
int ledPinBleu = 6;   // pin D6 atmega 328   
L'objectif est de réutiliser le nom de ta variable dans ton code, donc au lieu de :

Code : Tout sélectionner

{
                  pinMode(3, INPUT);           
                  pinMode(9, OUTPUT);         
                  pinMode(5, OUTPUT);
                  pinMode(6, OUTPUT);
                }
Tu peux écrire

Code : Tout sélectionner

                          
                  pinMode(ledPinRouge , OUTPUT);         
                  pinMode(ledPinVert , OUTPUT);
                  pinMode(ledPinBleu , OUTPUT);
et ça dans tout ton code.

Autre remarque, quand tu déclares

Code : Tout sélectionner

   int ch1;
Il est important que tu lui donnes une valeurs au départ. Je te conseille de remplacer cette déclaration par :

Code : Tout sélectionner

   int ch1 = 0;
Au moins, tant que ta valeur n'est pas lue, elle sera égale à 0 et non une valeur aléatoire qui peut poser problème !

A+


Service de découpe CNC pour les membres du forum NON DISPO POUR LE MOMENT
FPV Racer 250 (HomeMade)
*** In 4S high trust ***
Avatar du membre
Dehas
Administrateur du site
Messages : 16171
Enregistré le : ven. 3 juin 2011 12:50
Réputation : 5
Localisation : Saint Dié des Vosges
Genre :
Contact :

Re: Débuguage et optimisation code.

Message non lu par Dehas »

[yahoo.gif] [yahoo.gif] [yahoo.gif] , c'est bon, faut que je compare ton code au miens :super: :super:


Avatar du membre
willmodelisme
Pilote toutes catégories
Messages : 2095
Enregistré le : sam. 2 juin 2012 17:20
Réputation : 0
Localisation : essonne 91

Re: Débuguage et optimisation code.

Message non lu par willmodelisme »

J'ai fais le debugage, Tomdu à fait l'optimisation :amen:
Une équipe de choc [yahoo.gif]

PS: code édité avec les recommandations de Tom dans mon post plus haut.


Image
Avatar du membre
willmodelisme
Pilote toutes catégories
Messages : 2095
Enregistré le : sam. 2 juin 2012 17:20
Réputation : 0
Localisation : essonne 91

Re: Débuguage et optimisation code.

Message non lu par willmodelisme »

Dehas a écrit :[yahoo.gif] [yahoo.gif] [yahoo.gif] , c'est bon, faut que je compare ton code au miens :super: :super:
La seule vrai correction:

Code : Tout sélectionner

 ch1 = pulseIn(channel, HIGH,25000);
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.


Image
Avatar du membre
Tomdu38
Pilote toutes catégories
Messages : 1104
Enregistré le : dim. 19 mai 2013 17:01
Réputation : 0

Re: Débuguage et optimisation code.

Message non lu 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.

Code : Tout sélectionner

void loop()
                {         
                 //acquisition creneau radio
                 ch1 = pulseIn(channel, HIGH,25000);
                         digitalWrite(9, LOW);    
                         digitalWrite(6, LOW);
                         digitalWrite(5, LOW);
Par conséquent, dans tes modes "d'éclairage", plus besoin de préciser que ta led reste éteinte. ex :

Code : Tout sélectionner

                    digitalWrite(9, HIGH);
                         delay (250);
                         digitalWrite(9, LOW);    
                         digitalWrite(6, HIGH);
                         delay(250);                     
                         digitalWrite(6, LOW);
                         digitalWrite(5, LOW);
Devient

Code : Tout sélectionner

                    digitalWrite(9, HIGH);
                         delay (250);
                         digitalWrite(9, LOW);    
                         digitalWrite(6, HIGH);
                         delay(250);                     
                         digitalWrite(6, LOW);
                         
j'ai supprimé digitalWrite5

ici :

Code : Tout sélectionner

                if ((ch1>1250) && (ch1<1500))
                 {
                        digitalWrite(6, LOW);
                        digitalWrite(9, LOW);
                        digitalWrite(5, HIGH);
                        delay(250);
                        digitalWrite(5, LOW);
                        delay(250);
                 }
ça devient

Code : Tout sélectionner

                if ((ch1>1250) && (ch1<1500))
                 {
                        digitalWrite(5, HIGH);
                        delay(250);
                        digitalWrite(5, LOW);
                        delay(250);
                 }
et sur la fin

Code : Tout sélectionner

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);
                        
                  }
devient :

Code : Tout sélectionner

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 ! :50: :hehe:


Service de découpe CNC pour les membres du forum NON DISPO POUR LE MOMENT
FPV Racer 250 (HomeMade)
*** In 4S high trust ***
Avatar du membre
Dehas
Administrateur du site
Messages : 16171
Enregistré le : ven. 3 juin 2011 12:50
Réputation : 5
Localisation : Saint Dié des Vosges
Genre :
Contact :

Re: Débuguage et optimisation code.

Message non lu 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 :langue2:


Avatar du membre
Tomdu38
Pilote toutes catégories
Messages : 1104
Enregistré le : dim. 19 mai 2013 17:01
Réputation : 0

Re: Débuguage et optimisation code.

Message non lu 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


Service de découpe CNC pour les membres du forum NON DISPO POUR LE MOMENT
FPV Racer 250 (HomeMade)
*** In 4S high trust ***
Avatar du membre
willmodelisme
Pilote toutes catégories
Messages : 2095
Enregistré le : sam. 2 juin 2012 17:20
Réputation : 0
Localisation : essonne 91

Re: Débuguage et optimisation code.

Message non lu 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 ?


Image
Avatar du membre
Dehas
Administrateur du site
Messages : 16171
Enregistré le : ven. 3 juin 2011 12:50
Réputation : 5
Localisation : Saint Dié des Vosges
Genre :
Contact :

Re: Débuguage et optimisation code.

Message non lu 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.


Avatar du membre
willmodelisme
Pilote toutes catégories
Messages : 2095
Enregistré le : sam. 2 juin 2012 17:20
Réputation : 0
Localisation : essonne 91

Re: Débuguage et optimisation code.

Message non lu par willmodelisme »

Tu as un lien vert tes LED stp ?


Image
Avatar du membre
Dehas
Administrateur du site
Messages : 16171
Enregistré le : ven. 3 juin 2011 12:50
Réputation : 5
Localisation : Saint Dié des Vosges
Genre :
Contact :

Re: Débuguage et optimisation code.

Message non lu par Dehas »

C'est celle là
http://www.ebay.fr/itm/P816-ruban-LED-R ... OU:FR:3160" onclick="window.open(this.href);return false;
En France et pas cher !!


Avatar du membre
willmodelisme
Pilote toutes catégories
Messages : 2095
Enregistré le : sam. 2 juin 2012 17:20
Réputation : 0
Localisation : essonne 91

Re: Débuguage et optimisation code.

Message non lu par willmodelisme »

Est ce que ça ira au niveau soudure ?

ImageImage

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


Image
Avatar du membre
Dehas
Administrateur du site
Messages : 16171
Enregistré le : ven. 3 juin 2011 12:50
Réputation : 5
Localisation : Saint Dié des Vosges
Genre :
Contact :

Re: Débuguage et optimisation code.

Message non lu par Dehas »

Ben c'est nickel tout ça :super:


Avatar du membre
vilajea1
Tricopter
Messages : 69
Enregistré le : ven. 10 mai 2013 15:34
Réputation : 0
Localisation : 74160-près de Genève

Re: Débuguage et optimisation code.

Message non lu par vilajea1 »

willmodelisme a écrit :Est ce que ça ira au niveau soudure ?

ImageImage

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?


Bientôt Yunnec Typhonn H
Vortex pro 250 immersionRC
Vortex 285 immersionRc
Xugong V2
Radio Jeti DS-16
FF9 Futaba UHF immersion RC
Trex 550, mini V-bar
Gopro 4, Mobius

....
Avatar du membre
Dehas
Administrateur du site
Messages : 16171
Enregistré le : ven. 3 juin 2011 12:50
Réputation : 5
Localisation : Saint Dié des Vosges
Genre :
Contact :

Re: Débuguage et optimisation code.

Message non lu 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

Code : Tout sélectionner

        /*
                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.


Avatar du membre
willmodelisme
Pilote toutes catégories
Messages : 2095
Enregistré le : sam. 2 juin 2012 17:20
Réputation : 0
Localisation : essonne 91

Re: Débuguage et optimisation code.

Message non lu 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.

Image


Image
Avatar du membre
Tomdu38
Pilote toutes catégories
Messages : 1104
Enregistré le : dim. 19 mai 2013 17:01
Réputation : 0

Re: Débuguage et optimisation code.

Message non lu 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 !

Voici le code :

Code : Tout sélectionner

 /*
                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


Service de découpe CNC pour les membres du forum NON DISPO POUR LE MOMENT
FPV Racer 250 (HomeMade)
*** In 4S high trust ***
Avatar du membre
Dehas
Administrateur du site
Messages : 16171
Enregistré le : ven. 3 juin 2011 12:50
Réputation : 5
Localisation : Saint Dié des Vosges
Genre :
Contact :

Re: Débuguage et optimisation code.

Message non lu 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 !!


Avatar du membre
Tomdu38
Pilote toutes catégories
Messages : 1104
Enregistré le : dim. 19 mai 2013 17:01
Réputation : 0

Re: Débuguage et optimisation code.

Message non lu 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+


Service de découpe CNC pour les membres du forum NON DISPO POUR LE MOMENT
FPV Racer 250 (HomeMade)
*** In 4S high trust ***
Avatar du membre
vilajea1
Tricopter
Messages : 69
Enregistré le : ven. 10 mai 2013 15:34
Réputation : 0
Localisation : 74160-près de Genève

Re: Débuguage et optimisation code.

Message non lu 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.

libraire : FastLED

Code : Tout sélectionner

/* CPPM2LED
  goebish 2014
  for m328 @ 16 MHz
  Date 01/03/2015 --> attafr
  Date 03/03/2015 --> Jeff
*/

#include <FastLED.h> // (lib available at https://github.com/FastLED/FastLED/archive/master.zip )
// see https://github.com/FastLED/FastLED/wiki/Pixel-reference for reference

// reglages
#define NUM_LEDS 8 // nombre de leds

#define WS2812_pin 4 // Pin de connection pour le Din Adafruit

#define PPM_pin 3    // PPM input

#define PPM_MIN 1000
#define PPM_MAX 2000

#define CHANNELS 5

enum chan_order{
  AILERON,
  ELEVATOR,
  THROTTLE,
  RUDDER,
  AUX1,
  AUX2
};
// end settings

CRGB leds[NUM_LEDS];
volatile uint16_t ppm[CHANNELS];

void setup() {
  // init leds
  FastLED.addLeds<NEOPIXEL, WS2812_pin>(leds, NUM_LEDS);
  FastLED.showColor(CRGB::Black);
  // init ppm values
  for(int i=0; i<CHANNELS; i++) {
    ppm[i] = 1520;
  }
  // init ppm counter
  TCCR1A = 0;  //reset timer1
  TCCR1B = 0;
  TCCR1B |= (1 << CS11);  //set timer1 to increment every 0.5µs (@16Mhz)
  // init ppm interrupt
  attachInterrupt(PPM_pin - 2, read_ppm, CHANGE);
  delay(100);
}

void loop()
{
  // set leds hue according to throttle value
  // FastLed hue chart: http://i.imgur.com/0utnZcB.jpg
  uint8_t hue = map( ppm[THROTTLE], PPM_MIN, PPM_MAX, 144 /*light blue*/, 0 /*red*/);
  uint8_t hug = 255; // map( ppm[ELEVATOR], PPM_MIN, PPM_MAX, 144 /*light blue*/, 0 /*red*/);
  FastLED.showColor( CHSV( hue, hug, 255));
  delay(25);
}

void read_ppm()
{
  #define PPM_SCALE 1L
  static unsigned int pulse;
  static unsigned long counterPPM;
  static byte chan;
  counterPPM = TCNT1; // x 0.5µs
  TCNT1 = 0;
  if(counterPPM < 1020 ) {  // pulse (< 510µs)
    pulse = counterPPM;
  }
  else if(counterPPM > 3820 ) {  // sync pulse (> 1910µs)
    chan = 0;
  }
  else{  // values between 510µs and 2420µs will end up here
    if(chan < CHANNELS) {
      ppm[chan]= (counterPPM + pulse) >> PPM_SCALE;
    }
    chan++;
  }
}

Je mettrai le schéma dès que j'ai un peu de temps.

A+


Bientôt Yunnec Typhonn H
Vortex pro 250 immersionRC
Vortex 285 immersionRc
Xugong V2
Radio Jeti DS-16
FF9 Futaba UHF immersion RC
Trex 550, mini V-bar
Gopro 4, Mobius

....
Répondre

Retourner vers « Codes et Programmations »