Aller au contenu


Photo
- - - - -

Arduino nano et projet led haute puissance


  • Veuillez vous connecter pour répondre
1 réponse à ce sujet

#1 bypbop

bypbop

    Habitué

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

Posté 02 octobre 2014 - 03:29

Bonjour à tous, je réalise un petit projet en vue d'equiper un drone. Je pilote 2 leds haute puissance 10w
Je réalise un strobe. Voila j'utilise une arduino nano et je mesure via l'entrée D4 la valeur renvoyé par mon recepteur RC pour changer de programme.

Mon probleme est que le changement de programme est assez aléatoire vu que la boucle du programme en cours doit se terminer et comme j'ai des delay cela rallonge le changement.
Parfois je saute un programme aussi ...
Comment je pourrais faire pour que le changement de programme soit instantanée ?
Mon programme.

int ledGreen = 11;
int ledBlue = 9;
int ledRed = 10;
int ledWhite = 5;
int rcreceiver;
int Prog;




void setup() {
  Serial.begin(9600);
  pinMode(ledGreen, OUTPUT);     
  pinMode(ledBlue, OUTPUT); 
  pinMode(ledRed, OUTPUT);
  
  pinMode(ledWhite, OUTPUT);
  
  pinMode(4, INPUT);
  
  Prog=1;

}

int strobe(int fadeRed, int fadeGreen, int fadeBlue)
{
  analogWrite(ledWhite, 255); 
  delay(50);
  analogWrite(ledWhite, 0); 
  delay(100);
  analogWrite(ledWhite, 255); 
  delay(50);
  analogWrite(ledWhite, 0); 
  delay(100);
  analogWrite(ledWhite, 255); 
  delay(50);
  analogWrite(ledWhite, 0); 
  delay(100);
  analogWrite(ledWhite, 255); 
  delay(50);
  analogWrite(ledWhite, 0);
  analogWrite(ledRed, fadeRed);
  analogWrite(ledGreen, fadeGreen);
  analogWrite(ledBlue, fadeBlue);
  
  delay(600);
  analogWrite(ledRed, 0);
  analogWrite(ledGreen, 0);
  analogWrite(ledBlue, 0);

}


void loop() {

if (Prog==1)
{
strobe(127,0,0);
  strobe(127,255,0);
  strobe(0,255,0);
  strobe(0,255,255);
  strobe(0,0,255);
  strobe(127,0,255);
  strobe(127,255,255);
}
    

if (Prog==2)
{
  strobe(0,255,0);   
    
    
}
if (Prog==3)
{
strobe(127,0,0);

}
if (Prog==4)
{
analogWrite(ledWhite, 0);
  analogWrite(ledRed, 0);
  analogWrite(ledGreen, 0);
  analogWrite(ledBlue, 0);

}
rcreceiver = pulseIn(4, HIGH, 25000);
if (rcreceiver <=1200)
{
Prog++;
delay(100);
if (Prog >4) Prog=1;
}
if (rcreceiver <=800)
{
Prog=4;
}
}

Cordialement,

bypbop



#2 cocothebo

cocothebo

    Membre passionné

  • Membres
  • PipPipPip
  • 341 messages
  • Gender:Male

Posté 11 octobre 2014 - 06:03

Salut,

 

Il va falloir jouer avec les interruptions matérielles si tu veux que ce soit (presque) instantané.

En gros une interruption matérielle comme son nom l'indique va interrompre immédiatement le code en cours sur un événement quelconque:

  • un timer
  • une entrée qui change
  • ...

et surtout va alors exécuter le code de ton interruption (ISR en anglais pour Interrupt Service Routine), en gros ça t'exécute une fonction (sans paramètre ni retour) que tu choisis. 

Dans ton cas il faut une interruption sur une entrée.

Sur le nano tu as deux entrées qui peuvent être utilisées pour les interruptions D2 et D3 (il me semble).

 

Après il faut utiliser la fonction attachIntterupt() (http://arduino.cc/en/Reference/AttachInterrupt).

Ca permettra de sépécifer le type d'interruption sur quelle entrée et la fonction à exécuter.

 

 

Un exemple un peu plus complet que sur le site arduino : http://www.laboelectronique.be/ardinterrupt.html






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

0 members, 0 guests, 0 anonymous users