Aller au contenu


Photo
- - - - -

Projet led de puissance avec arduino


  • Veuillez vous connecter pour répondre
6 réponses à ce sujet

#1 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 25 juin 2015 - 08:14

Bonjour à tous voila je travail sur un projet comportant 2 leds de 10w que je veux commander via une arduino et un signal rc.

 

 

Voila j'ai fait ma première interruption qui calcul le signal pwm du recepteur et en fonction de ce signal j'essaye de basculer d'un programme à l'autre ....

 

 

Le problème c'est que je n'arrive pas à charger mes sequences depuis !!!

 

Voila j'ai fait ceci :

 

 

Je rentre bien dans ma fonction chargement mais rien du tt !!!

 
volatile unsigned long timer_start;
volatile int pulse_time; 


volatile int last_time;


int ledGreen = 11;
int ledBlue = 9;
int ledRed = 10;
int ledWhite = 5;
int rcPin = 2;


// qd je mets cette sequence ici mon sequenceur fonctionne bien l'interruption aussi mais aucun chargement des autres sequences ...


int Sequence[][5] = {
    {255, 0  , 0 , 0  , 50},
    {0, 0  , 0 , 0  , 200},
    {255, 0  , 0 , 0  , 50},
    {0, 0  , 0 , 0  , 200},
    {255, 0  , 0 , 0  , 50},
    {0, 0  , 0 , 0  , 200},
    {0, 255  , 0 , 0 , 50},
    {0, 0  , 0 , 0  , 50},
    {0, 255  , 0 , 0 , 50},
    {0, 0 , 0 , 0 , 500},
    };


unsigned long top,delai;
int tache=0;  // tache en cours
boolean tacheDone=false;  // indique si la tache a été executé ou pas encore




int prog;
void chargement()
{
Serial.print("Programme :");
Serial.println(prog);


    if (prog==0){
    Serial.println("PRG 00000"); // je rentre bien dans le chargement 
    int Sequence[][5] = {
    {0, 0  , 0 , 0 , 1000},
    {0, 0 , 0 , 0 , 1000},
    };
    
    }
    if (prog==1){
    int Sequence[][5] = {
    {255, 0  , 0 , 0  , 50},
    {0, 0  , 0 , 0  , 200},
    {255, 0  , 0 , 0  , 50},
    {0, 0  , 0 , 0  , 200},
    };
    }
    if (prog==2){
    int Sequence[][5] = {
    {0, 255  , 0 , 0 , 1000},
    {0, 0 , 0 , 0 , 1000},
    };
    }


}




void calcSignal()
{
      if(digitalRead(rcPin) == HIGH)
          {
              timer_start = micros();
          }


          else
          {
            
            if(timer_start > 0)
            {
                
                pulse_time = ((volatile int)micros() - timer_start);
                timer_start = 0;
            
            }
          }
    
  if(pulse_time >1850 && last_time <=1100){
    prog++;
    if (prog>2){prog=0;}
    chargement();
    last_time = pulse_time;
  }
  else
  {
    last_time = pulse_time;
  }
}


void setup()
{
    timer_start = 0;
    prog = 0;
    pinMode(ledGreen, OUTPUT);     
    pinMode(ledBlue, OUTPUT); 
    pinMode(ledRed, OUTPUT);
    pinMode(ledWhite, OUTPUT);
    pinMode(rcPin, INPUT);
    
    top = millis();
    
    attachInterrupt(0, calcSignal, CHANGE);
    Serial.begin(9600);




}


void loop()
{
// gestionnaire du sequenceur de taches
  if((top+delai)<=millis()) {
    tache +=1;
    if (tache > (sizeof(Sequence)/10)-1){tache=0;}
    tacheDone = false;
    top=millis();
  }
  
// sequenceur de taches
  if (tacheDone == false){
      analogWrite(ledWhite,Sequence[tache][0]);
      analogWrite(ledRed,Sequence[tache][1]);
      analogWrite(ledGreen,Sequence[tache][2]);
      analogWrite(ledBlue,Sequence[tache][3]);
      delai=Sequence[tache][4];
      tacheDone =true;


}


}
 
Merci bcp pour votre aide
cdlt,
bypbop


#2 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 26 juin 2015 - 09:25

Après lecture rapide, ton problème est dans la fonction de chargement : tu as déclaré "Sequence" de manière globale comme un tableau de tableaux de taille 5 d'entiers, et tu veux le modifier dans cette fonction, mais en fait, tu redéclares une variable locale à la fonction du même nom.
Plusieurs solutions :
- soit tu modifies ta fonction chargement pour ne pas redéclarer ta variable. Attention, tu risques de rencontrer des problèmes de taille de la structure pour des séquences de longueur différente.
- soit tu déclares toutes les séquences que tu veux pouvoir afficher globalement (dans un tableau tridimensionnel ?), et tu utilises cette troisième dimension pour préciser la séquence sur laquelle tu travailles (donc ta fonction chargement consiste principalement à modifier cet index). Autant ça me semble assez facile en C++, autant avec les limitations d'Arduino, ça risque d'être un peu plus galère.

Une remarque : essaie d'utiliser autant que possible des #define ou des variables globales const pour les "magic numbers" que tu mets dans ton code (le 10 de "sizeof(Sequence)/10" ou la taille de 5 des élements de tes séquences). Ca permet de rendre le code un peu plus explicite, et si tu veux changer une valeur qui apparaît plusieurs fois dans le code, c'est plus simple (mieux vaut passer la variable d e5 à 12 plutôt que de remplacer dans tout le code).
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#3 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 26 juin 2015 - 12:38

Bonjour R1D1,

 

 

hier j'ai pu remarquer que cela venait bien de la en faisant qques test !!!

 

Oui en fait j'utilise tt le temps le mm tableau donc aucun changement de programme :-(

 

Pour les tableaux en tri dimension aprés qques recherches aucune piste ...

 

De plus le fait de faire un tableau unique en 3 dimensions cela va ptete obliger d'avoir des sequences de mm tailles non ?

 

cordialement,

bypbop 



#4 Microrupteurman

Microrupteurman

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 210 messages
  • Gender:Male
  • Location:Aquitaine,Gironde

Posté 26 juin 2015 - 02:05

Pourquoi ne pas les commander avec un servo et un ou 2 bouton poussoir ? C'est bien du rc ?


 
Page Facebook : https://www.facebook...appartelier2.0/
Page Twitter :  https://twitter.com/2Appartelier (bateau seulement)
Boutique Robot-Maker : https://www.robot-ma...er-20/produits/

Besoin d'une impression 3D grand format ? Contactez moi !
 


#5 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 27 juin 2015 - 10:39

Bonjour l jnterruption fonctionne bien donc ca serait dommage de ne pas l utiliser.

#6 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 211 messages
  • Gender:Male
  • Location:Autriche

Posté 29 juin 2015 - 04:45

Oui en fait j'utilise tt le temps le mm tableau donc aucun changement de programme :-(
 
Pour les tableaux en tri dimension aprés qques recherches aucune piste ...
 
De plus le fait de faire un tableau unique en 3 dimensions cela va ptete obliger d'avoir des sequences de mm tailles non ?

Ca sera le même problème dans tous les cas : vu qu'il n'y a pas à ma connaissance de moyen d'allouer dynamiquement de la mémoire sur Arduino, je ne vois pas comment faire, avec la structure de ton programme, pour manipuler des séquences de différentes tailles.
Peut-être en utilisant un String, mais il faut creuser l'idée : en stockant ta séquence sous forme String seq="rvvrb" et en te servant de seq.length() pour gérer la taille dynamiquement.
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#7 bypbop

bypbop

    Habitué

  • Membres
  • PipPip
  • 273 messages
  • Gender:Male
  • Location:Lille

Posté 29 juin 2015 - 11:13

Bonjour R1D1,

 

je m en suis sorti comme cela :

 

Maintenant j'arrive à changer de programme facilement ... 

/*
    Séquenceur
*/

const int ledWhite = 5;
const int ledRed = 10;
const int ledGreen = 11;
const int ledBlue = 9;
const int rcPin = 2;

const int Sequence[][6] = {    // Num prog,   ledWhite,   ledRed,   ledGreen,   ledBlue,   delai //
    {0, 0,   0,   0,   0,   0   },    // Prog 0
    
    {1, 255, 0,   0,   0,   50  },    // Prog 1
    {1, 0,   0,   0,   0,   200 },
    {1, 255, 0,   0,   0,   50  },
    {1, 0,   0,   0,   0,   200 },
    {1, 255, 0,   0,   0,   50  },
    {1, 0,   0,   0,   0,   200 },
    {1, 0,   255, 0,   0,   50  },
    {1, 0,   0,   0,   0,   50  },
    {1, 0,   255, 0,   0,   50  },
    {1, 0,   0,   0,   0,   500 },
    
    {2, 255, 0,   0,   0,   50  },
    {2, 0,   0,   0,   0,   200 },
    {2, 255, 0,   0,   0,   50  },
    {2, 0,   0,   0,   0,   200 },
    {2, 255, 0,   0,   0,   50  },
    {2, 0,   0,   0,   0,   200 },
    {2, 0,   0,   255, 0,   50  },    // Prog 2
    {2, 0,   0,   0,   0,   50  },
    {2, 0,   0,   255, 0,   50  },
    {2, 0,   0,   0,   0,   500 },
    
    {3, 255, 0,   0,   0,   50  },
    {3, 0,   0,   0,   0,   200 },
    {3, 255, 0,   0,   0,   50  },
    {3, 0,   0,   0,   0,   200 },
    {3, 255, 0,   0,   0,   50  },
    {3, 0,   0,   0,   0,   200 },
    {3, 0,   0,   0,   255, 50  },    // Prog 3
    {3, 0,   0,   0,   0,   50  },
    {3, 0,   0,   0,   255, 50  },
    {3, 0,   0,   0,   0,   500 },
    
    {4, 0,   255, 0,   0,   50  },    // Prog 4
    {4, 0,   0,   0,   0,   50  },
    {4, 0,   0,   255, 0,   50  },
    {4, 0,   0,   0,   0,   50  },
    {4, 0,   0,   0,   255, 50  },
    {4, 0,   0,   0,   0,   50  },
    {4, 0,   255, 255, 0,   50  },
    {4, 0,   0,   0,   0,   50  },
    {4, 0,   0,   255, 255, 50  },
    {4, 0,   0,   0,   0,   50  },
    {4, 0,   255, 0,   255, 50  },
    {4, 0,   0,   0,   0,   50  },
    {4, 0,   255, 255, 255, 50  },
    {4, 0,   0,   0,   0,   50  },
    
    {5, 0,   255, 0,   0,   200  },    // Prog 5
    {5, 0,   0,   255, 0,   200  },
    {5, 0,   0,   0,   255, 200  },
    {5, 0,   255, 255, 0,   200  },
    {5, 0,   0,   255, 255, 200  },
    {5, 0,   255, 0,   255, 200  },
    {5, 0,   255, 255, 255, 200  },
    {5, 255, 0,   0,   0,   50  },
    {5, 0,   0,   0,   0,   200 },
    {5, 255, 0,   0,   0,   50  },
    {5, 0,   0,   0,   0,   200 },
    {5, 255, 0,   0,   0,   50  },
    {5, 0,   0,   0,   0,   200 },
    
    {6, 0,   255, 0,   0,   5000  },    // Prog 6
    {6, 0,   0,   255, 0,   5000  },
    {6, 0,   0,   0,  255,  5000  },
    {6, 0,   255, 255, 0,   5000  },
    {6, 0,   0,   255,  255,5000  }, 
    {6, 0,   255,   0, 255, 5000  },
    {6, 0,   255, 255, 255, 5000  }   
  };                                

volatile unsigned long timer_start = 0;
volatile unsigned long pulse_time = 0; 
unsigned long last_time = 0;

unsigned long top, delai;
int prog = 0;
int tache = 0;  // tache en cours
boolean tacheDone = false;  // indique si la tache a été executé ou pas encore


void setup()
{
  pinMode(ledGreen, OUTPUT);     
  pinMode(ledBlue, OUTPUT); 
  pinMode(ledRed, OUTPUT);
  pinMode(ledWhite, OUTPUT);
  pinMode(rcPin, INPUT);

  top = millis();

  attachInterrupt(0, calcSignal, CHANGE);
  Serial.begin(9600);
}


void loop()
{
  // gestion du numéro de programme
  if(pulse_time >1850 && last_time <=1100)
  {
    prog++;
    if (prog > 6) 
    {
      prog = 0;
    }
    last_time = pulse_time;
    tache=0;
    tacheDone = false;
    top = millis();
    Serial.print("Programme ");
    Serial.print(prog);
    Serial.print(" ...");
  }
  else
  {
    last_time = pulse_time;
  }

  // sequenceur de taches
  if (tacheDone == false && Sequence[tache][0] == prog)
  {
    analogWrite(ledWhite, Sequence[tache][1]);
    analogWrite(ledRed, Sequence[tache][2]);
    analogWrite(ledGreen, Sequence[tache][3]);
    analogWrite(ledBlue, Sequence[tache][4]);
    delai = Sequence[tache][5];
  }
  
  // gestionnaire du sequenceur de taches
  if((millis() - top) >= delai || Sequence[tache][0] != prog)
  {
    tache += 1;
    top = millis();
    if (tache > (sizeof(Sequence)/sizeof(Sequence[0])) || Sequence[tache][0] > prog)
    {
      tache=0;
      //tacheDone = true;
      delai = 0;
    }
  }
}


/***************** INTERRUPTION ***************************/

void calcSignal()
{
  if(digitalRead(rcPin) == HIGH)
  {
    timer_start = micros();
  }
  else
  {
    if(timer_start > 0)
    {
      pulse_time = (micros() - timer_start);
      timer_start = 0;
    }
  }
}

mais bon si je veux faire une fonction fade in fade out ... ca va etre chooo :-(

j'ai qu'une séquence maintenant tout est regroupé à l'intérieur !

 

Cordialement,

bypbop






0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users