Programme de test du Kit Arduino Inventor

Les cartes Arduino, les platines

Programme de test du Kit Arduino Inventor

Message non lude Cassiope34 » Mer 25 Avr 2012 12:17

Voici un petit programme (patchwork de plusieurs sources) qui devrait me servir à m'initier à l'Arduino tout en essayant d'exploiter de manière sympa mon kit Arduino Inventor + Deuligne + Mémoire + Capteur de distance GP2D120 Sharp + une balle de ping-pong pendue ou posée sur un rail...

Le but : fabriquer un Ball & Beam (déplacement d'une balle de ping-pong sur une barre horizontale) ou bien un rééquilibre d'une balle de ping-pong pendu au bout d'un fil comme doit le faire un grutier avec sa charge par exemple.
+ un bargraph à 8 leds via un registre à décalage (74HC595) pour indiquer la position de la balle,
+ 2 leds (jaune variante en fonction de la distance, rouge pour indiquer "hors capteur")
+ 1 led RGB qui varie sa couleur en fonction de la distance
+ 1 servo pour contrôler la position de la balle...
+ un contrôle de l'alimentation externe (accu)

Une question me bloque un peu : où devrais-je placer le plus judicieusement possible un delay() et de quelle valeur, pour que tout ait le temps de bien fonctionner ?
Par exemple, j'ai lu que le capteur Sharp nécessitait 36ms pour bien fonctionner correctement ...!
Il me semble que Le Deuligne et les CAN aussi demandent un petit delay pour faire correctement leur travail !?
Sachant que je voudrais aussi l'affichage de l'heure en temps réel bien sûr ;) mais aussi l'état de l'accu contrôlé plus périodiquement...!

Il faut aussi que je comprenne si je peux utiliser les pins 9,10,11 (utilisés je crois bien par le shield Mémoire) pour piloter la led RGB !?

Code: Tout sélectionner
    // Date and time functions using a DS1307 RTC connected via I2C and Wire lib

    #include <Wire.h>      // librairie I2C
    #include "RTClib.h"    // gestion de l'Heure
    #include <Deuligne.h>  // gestion du LCD Deuligne I2C Snootlab

    // Object initialization
    Deuligne lcd;
    RTC_DS1307 RTC;
   const int voltNow = A2;     // pin réservée pour surveiller la tension de l'accu...
   const int sensorPin = A3;   // select the input pin for the SHARP GP2D120   ( capteur de distance IR )
   const int servoBal = 5;     // select the pin for the SERVO (PWM)      ( pour le balancier )
   const int Jaune = 3;        // select the pin for the LED JAUNE (PWM)  ( intensité varie avec la distance captée )
   const int Rouge = 2;        // select the pin for the LED ROUGE        ( objet trop loin ! )
   
   // RGB LED leads connected to PWM pins        ( la couleur varie avec la distance captée )
   const int RED_LED_PIN = 9;
   const int GREEN_LED_PIN = 10;
   const int BLUE_LED_PIN = 11;

   int rgb_colors[3];
   int redIntensity;
   int greenIntensity;
   int blueIntensity;

   // variable to store the value coming from the sensor   
   int sensorValue = 0;     
   
   //The 74HC595 uses a serial communication link which has three pins   ( bargraphe indicateur de la position de la balle de ping-pong )
   int data = 4;
   int clock = 7;
   int latch = 8;
   

    void setup () {
      Wire.begin();
      RTC.begin();
      lcd.init(); // LCD panel initializatino

      if (! RTC.isrunning()) {
        lcd.print("RTC is NOT running!");
        // following line sets the RTC to the date & time this sketch was compiled
        RTC.adjust(DateTime(__DATE__, __TIME__));
      }
    
     pinMode(Rouge, OUTPUT);  // LED indiquant une trop grande distance
     pinMode(data, OUTPUT);   // bargraph de visualisation de la position de la balle de ping-pong
     pinMode(clock, OUTPUT); 
     pinMode(latch, OUTPUT); 
  }

    void loop () {
   AffHeure();
   sensorValue = map(analogRead(sensorPin), 0, 1023, 0, 255);
      
   AffDist(sensorValue);
   BarGraph(sensorValue);
   getRGB(sensorValue, 0xff, 0xff, rgb_colors);

   redIntensity = rgb_colors[0];
   greenIntensity = rgb_colors[1];
   blueIntensity = rgb_colors[2];

   // Display the requested color
   analogWrite(RED_LED_PIN, 255-redIntensity);
   analogWrite(GREEN_LED_PIN, 255-greenIntensity);
   analogWrite(BLUE_LED_PIN, 255-blueIntensity);
    }
   
   

// ***** les fonctions *******

void BarGraph(int sensorV) {    // BarGraph de 8 leds avec le 74HC595 en fonction du capteur IR GP2D120
   byte ledCharSet[7] = {B11000000,B01100000,B00110000,B00011000,B00001100,B00000110,B00000011};
   int allume = map(sensorV, 0, 255, 0, 7);
   
   digitalWrite(latch, LOW);
   shiftOut(data, clock, MSBFIRST, allume);
   digitalWrite(latch, HIGH);
}

void AffDist(int sensor) {   // affichage de la valeur du capteur de distance IR GP2D120 + les 2 LEDs
   lcd.setCursor(0, 1);
    lcd.print("Dist ");
   lcd.setCursor(6, 1);
   lcd.print(sensor);
   if (sensor>254) {
      digitalWrite(Rouge,HIGH);  // allume la led ROUGE = distance trop grande
      }
   else
      {
      digitalWrite(Rouge,LOW);      // �teind la led ROUGE
      analogWrite(Jaune, sensor);     // intensit� de la led JAUNE proportionnelle � la distance (sensor)
      }
}

void getRGB(int hue, int sat, int val, int colors[3]) {
   // (from http://www.kasperkamperman.com/blog/arduino/arduino-programming-hsb-to-rgb/)
  /* convert hue, saturation and brightness ( HSB/HSV ) to RGB
    The dim_curve is used only on brightness/value and on saturation (inverted).
    This looks the most natural.
  */

//  val = dim_curve[val];
//  sat = 255-dim_curve[255-sat];

  int r;
  int g;
  int b;
  int base;

  if (sat == 0) { // Acromatic color (gray). Hue doesn't mind.
    colors[0]=val;
    colors[1]=val;
    colors[2]=val;
  } else  {

    base = ((255 - sat) * val)>>8;

    switch(hue/60) {
    case 0:
        r = val;
        g = (((val-base)*hue)/60)+base;
        b = base;
   break;

    case 1:
        r = (((val-base)*(60-(hue%60)))/60)+base;
        g = val;
        b = base;
   break;

    case 2:
        r = base;
        g = val;
        b = (((val-base)*(hue%60))/60)+base;
   break;

    case 3:
        r = base;
        g = (((val-base)*(60-(hue%60)))/60)+base;
        b = val;
   break;

    case 4:
        r = (((val-base)*(hue%60))/60)+base;
        g = base;
        b = val;
   break;

    case 5:
        r = val;
        g = base;
        b = (((val-base)*(60-(hue%60)))/60)+base;
   break;
    }

    colors[0]=r;
    colors[1]=g;
    colors[2]=b;
  }
}

void AffHeure () {  // affichage de l'heure en haut � droite du LCD
   lcd.setCursor(0, 0);
   DateTime now = RTC.now();
   lcd.print(now.day(), DEC);
   lcd.print('/');
   if (now.month()<10) lcd.print('0');
   lcd.print(now.month(), DEC);
   lcd.setCursor(8, 0);
   lcd.print(now.hour(), DEC);
   lcd.print(":");
   if (now.minute()<10) lcd.print('0');
   lcd.print(now.minute(), DEC);
   lcd.print(":");
   if (now.second()<10) lcd.print('0');
   lcd.print(now.second( ), DEC);
}


merci à tous

@+
Dernière édition par Cassiope34 le Mer 25 Avr 2012 12:28, édité 1 fois.
Cassiope34
 
Messages: 102
Inscription: Lun 16 Avr 2012 14:35

Re: Programme de test du Kit Arduino Inventor

Message non lude Lionel » Mer 25 Avr 2012 12:27

Bonjour,

10 & 11 sont utilisées pour la carte SD si vous ne placez pas de carte SD, c'est dispo a priori,
la 9 peut être dispo, il y a juste la led bleue du shield mémoire dessus, il suffit de retirer la résistance pour la rendre de nouveau dispo
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 732
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: Programme de test du Kit Arduino Inventor

Message non lude Cassiope34 » Mer 25 Avr 2012 14:37

Oups ! quelle résistance Lionel ? sur le shield Mémoire ?
Peut-être que je vais utiliser la pin 6 ;)

Je ne compte effectivement pas dans ce petit programme utiliser la SD.

Euh, une petite idée pour le delay() ?

Merci Lionel.

@+
Cassiope34
 
Messages: 102
Inscription: Lun 16 Avr 2012 14:35

Re: Programme de test du Kit Arduino Inventor

Message non lude Lionel » Mer 25 Avr 2012 14:57

Ben si c'est pour ne pas embêter le capteur sharp (d'après ce que vous signifiez), il faut faire en sorte de ne pas le lire trop souvent, cependant, je vous déconseille d'utiliser la fonction delay(), elle est bloquante et vous empêchera de corriger le positionnement ou de faire du calcul pendant ce temps.

Voyez du coté de l'exemple blink without delay

et oui, c'est sur le shield mémoire que je suggérait d'enlever la résistance
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 732
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: Programme de test du Kit Arduino Inventor

Message non lude Cassiope34 » Mer 25 Avr 2012 15:23

Merci Lionel pour la piste millis() .

C'est vrai que dans la mesure ou les shields sont empilés, la led du shield Mémoire n'est plus très visible de toute façon !
Disons que je préfère ne rien couper pour l'instant ;)

Il me reste maintenant à chercher ou à inventer l'algorythme qui va bien pour piloter le servo qui va s'occuper de la balle de ping-pong :? :)

@+
Cassiope34
 
Messages: 102
Inscription: Lun 16 Avr 2012 14:35

Re: Programme de test du Kit Arduino Inventor

Message non lude Lionel » Mer 25 Avr 2012 15:29

Voyez peut être du coté de la régulation PID
https://github.com/br3ttb/Arduino-PID-Library
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 732
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: Programme de test du Kit Arduino Inventor

Message non lude Cassiope34 » Mer 25 Avr 2012 16:32

Je comprend ce qu'est la régulation PID, mais de là à savoir l'implémenter dans mon code... :?
Disons que la consigne serait la distance entre le capteur et la balle si elle n'a pas bougée depuis 2 secondes par exemple, mais exploiter correctement la régulation PID pour envoyer la bonne valeur au servo (au mien aussi :lol: ) me semble d'un niveau que je n'ai pas encore ! ;) :D

@+
Cassiope34
 
Messages: 102
Inscription: Lun 16 Avr 2012 14:35


Retourner vers Arduino

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités

cron