Aller au contenu


Photo
- - - - -

Librairie IRremote

Pas asez rapide

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

#1 Guyon Gilles

Guyon Gilles

    Nouveau membre

  • Membres
  • 4 messages

Posté 11 avril 2018 - 10:48

Bonjour
 
Pour une application utilisant un ruban de leds adressables j'ai besoin de modifier un scénario par une télécommande IR à l'intérieur
de boucle rapide (le scénaroi)
La bibliothèque IRremote utilisant une broche "normale" n'est pas assez rapide
Connaissez vous un équivalent mais fonctionnant avec une broche d'interruption externe ?
Je suis sous Arduino UNO

Merci d'avance pour vos réponses

Gilles



#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 7 911 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 11 avril 2018 - 10:55

Pouvez vous partager le code déjà utilisé et qui n'est pas assez rapide? 
Peut être que nous pouvons vous proposer des modification dans votre code actuel pour que cela fonctionne mieux ...


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !

 

Les réalisations de Mike118  

 

 

 


#3 Guyon Gilles

Guyon Gilles

    Nouveau membre

  • Membres
  • 4 messages

Posté 11 avril 2018 - 11:02

C'est la librairie IrRemote-master :

 

https://github.com/z...rduino-IRremote

 

Cela me semble long d'essayer de la modifier, non ?

 

Gilles



#4 arobasseb

arobasseb

    Membre chevronné

  • Modérateur
  • PipPipPipPip
  • 690 messages
  • Gender:Male
  • Location:BORDEAUX (33)
  • Interests:Informatique, robotique et sciences technique en générale.

Posté 11 avril 2018 - 11:11

Je pense que mike118 parlait de ton code qui utilise la librairie

#5 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 7 911 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 11 avril 2018 - 11:25

Je pense que mike118 parlait de ton code qui utilise la librairie

 

Exactement, 
 

Sans avoir de détails je me dit qu'il se peut que ça ne soit pas la librairie qui soit lente mais la façon dont on s'en sert dans le code qui fait que la réponse est lente =)


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !

 

Les réalisations de Mike118  

 

 

 


#6 Guyon Gilles

Guyon Gilles

    Nouveau membre

  • Membres
  • 4 messages

Posté 11 avril 2018 - 01:09

Le voici...

Au passage le "goto sortir;" de la ligne 298, avec le" sortir:" de la ligne 103 refuse de "se compiler"

Les lignes sont commentées pour l'instant

Je sais le goto n'est pas l'idéal  mais me semble pratique ici

Bien cordialement

Gilles

Fichier(s) joint(s)



#7 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 7 911 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 11 avril 2018 - 01:32

Après avoir rapidement regardé votre code je pense qu'on peut drastiquement l'optimiser pour que la valeur soit de la télécommande soit lue plus vite ;) 

Le problème c'est que vous mettez des delay un peu partout ... Et que pendant ces délais, c'est autant de temps qui se passe sans que le récepteur soit lut. 

Je vous conseil d'utiliser la fonction millis() 

 

et de faire à chaque fois que vous voulez attendre 1s  : 

 

reftime = millis() ; 

while (reftime - millis() > 1000) {

 // Ajouter le code pour lire la técommande ici ... 

}

 

 

Vous attendrez les 1 seconde mais pendant ce temps la valeur sera lue ... 

 

Pour le goto on verra ça dans un second temps quand votre problème initiale sera réglé ;) ( vous ouvrirez alors un second sujet ;)


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !

 

Les réalisations de Mike118  

 

 

 


#8 Guyon Gilles

Guyon Gilles

    Nouveau membre

  • Membres
  • 4 messages

Posté 14 avril 2018 - 03:43

Bonjour

Merci pour votre réponse

J'ai suivi vos conseils (en enlevant les morceaux de programme inutiles pour l'instant pour faciliter étude :-))

C'est mieux avec le while...

Je joins le nouveau .ino et une copie du moniteur dans un fichier pdf

Mon objectif :

i=0 les leds s'allument toutes en rouge avec une luminosité qui augmente de 0 au max par pas de 20ms environ, puis décroissance vers 0 avec le même pas

i=1, idem en vert

i=2 idem en bleu

i=3 idem en blanc

avec mes delay(20) et sans lecture de la télécommande c'est ok

Avec le while et lecture télécommande

pbs :

* i=0, avec 100ms de delta t la lecture n'est pas toujours bonne (voir Word) ; je voudrais descendre à 20ms de deltat t

* i=1,2,3 le programme ne passe plus par les while ! (augmentation et diminution  très rapides de l'éclairage des couleurs restantes)

 

Bizarre

 

Cordialement

Gilles Guyon

Fichier(s) joint(s)



#9 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 7 911 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 15 avril 2018 - 07:03

Bon je te propose cette version : 

#include <IRremote.h> //bibliotheque de decodage, ATTENTION ne fonctionne qu'avec la bibliothèque "Arduino-IRremote-master" à installer (j'ai les deux d'installés !!!)
#include <FastLED.h>

//déclaration des constantes :

const int IR_BROCHE = 5;         //shield IR de sunfounder sur broche 5
#define LED_BROCHE     11        // Numéro de broche de la bande de LEDs
#define LED_TYPE    WS2812B      // Définition du type de LEDs
#define COLOR_ORDER GRB          // Définition de l'ordre des couleurs
#define NOMBRE_LED   60          // Définition du nombre de leds (ici 60)
int sortir;

// Chaque led représente un élément d'un tableau. Pour modifier les données d'une led on viendra modifier l'élément correspondant dans le tableau led.
CRGB led[NOMBRE_LED];            //tableau à 60 colonne, numérotation à partir de 0

// Définition d'une liste "Couleur", qui contiendra les "couleurs" nécessaires à nos scénaris (dans le setup) :
CRGB Couleur[5];

//Déclaration des variables, objet (Capteur IR) :
IRrecv irrecv(IR_BROCHE);        //création de l'objet "irrecv"
decode_results resultat;         //mettre le résultat du décodage dans resultat

//déclaratin des variables :
int luminosite = 0;              //luminosité de la led (0 : éteinte, 255 max)
uint32_t ref_temps;                   //pour la gestion du temps

uint8_t scenario = 0;

//***************fin entête déclarative**************************
void setup()
{
  Serial.begin(9600);         //initialisation du moniteur série
  Serial.println("Début setup");
  irrecv.enableIRIn();        //activation de la bibliothèque IR
  FastLED.addLeds<LED_TYPE, LED_BROCHE, COLOR_ORDER>(led, NOMBRE_LED).setCorrection( TypicalLEDStrip );  //mise en place générateur de scénario

  //Mise en place de la liste des "couleurs" utilisées dans le programme :
  Couleur[0] = CRGB(255, 0, 0);    // Rouge
  Couleur[1] = CRGB(0, 255, 0);   // Vert
  Couleur[2] = CRGB(0, 0, 255);  // Bleu
  Couleur[3] = CRGB(255, 255, 255); // Blanc
  Couleur[4] = CRGB(0, 0, 0);     // Éteint

  Serial.println("Fin setup");
}//***************************fin du setup***********************************

void loop() {
  // put your main code here, to run repeatedly:
  switch (scenario) {
    case 0: 
     //erreur
     scenario = IRcode();  
    break;
    case 1 : 
     scenario1();
    break; 
    case 2: 
     //scenario2();
    break;
    case 3 : 
     //scenario3();
    break; 
    case 4 : 
     // Arrêt
     scenario = IRcode(); 
    break;    
  }
}


uint8_t IRcode() {
  static uint8_t result = 0;
  //sortir:    //retour ici si demande d'arrêt scénario par télécommande
  //choix scénario par télécommande à IR :
  if (irrecv.decode(&resultat)) //si le récepteur IR reçoit des données
  {
    //Serial.print("Commande IR reçue, code hexa : ");
    //Serial.println ( resultat.value , HEX) ;
    //code 1 = 0xFF30CF, code 2 = 0xFF18E7, code 3 = 0xFF7A85, code arrêt = 0xFFA25D, code pause/lecture = 0xFF22DD
    if (resultat.value == 0xFF30CF) result = 1;
    else if (resultat.value == 0xFF18E7) result = 2;
    else if (resultat.value == 0xFF7A85) result = 3;
    else if (resultat.value == 0xFFA25D) result = 4;
    else resultat = 0;
    irrecv.resume();    //reset le récepteur et le prépare pour recevoir un autre code
  }
  return result;
}

//**********************sous programmes***********************************
//scénario 1****************************************************************************************************
void scenario1()
{
  uint8_t change = 0;
  for (int i = 0; i < 4 ; i++) //pour les 4 premières couleurs définies en setup
  {
    for (int z = 0; z < 60 ; z++) //pour les 60 leds (n° 0 à 59)
    {
      led[z] = Couleur[i];    //affectation leds <-> couleur (la même ici)
    }
    // Boucle for permettant d'augmenter progressivement la luminosité
    for ( luminosite = 0; luminosite <= 250; luminosite++)
    {
      FastLED.setBrightness(luminosite);
      FastLED.show();
      ref_temps = millis();
      while ((millis() - ref_temps <= 20) & !change) 
      {
        scenario = IRcode();
        if(scenario != 1){
          change = 1;
          break;
        }
      }
      if (change)  break;
    }
    // Boucle for permettant de diminuer progressivement la luminosité
    for ( luminosite = 250; luminosite >= 0; luminosite = --)
    {
      FastLED.setBrightness(luminosite);
      FastLED.show();
      ref_temps = millis();
      while ((millis() - ref_temps <= 20) & !change) 
      {
        scenario = IRcode();
        if(scenario != 1){
          change = 1;
          break;
        }
      }
      if (change)  {
        for (int i=0;i<=NOMBRE_LED;i++)   //optionnel on éteint la lumière avant de partir
        {
         led[i]=CRGB::Black;
        }
        break;
      }
    }
  }//fin boucle for
  Serial.println("Fin scenario 1");
}//fin scénario 1


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !

 

Les réalisations de Mike118  

 

 

 





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

0 members, 0 guests, 0 anonymous users