Le forum a migré vers l'adresse suivante:

Forum

Masquer ce message

Simple-Duino Index du Forum



Reécriture du programme d'un robot Dagu Hexapod.


 
Poster un nouveau sujet   Répondre au sujet    Simple-Duino Index du Forum -> Arduino & Électronique -> Projets -> Vos projets
Sujet précédent :: Sujet suivant  
Auteur Message
Guid0
Débutant

Hors ligne

Inscrit le: 29 Oct 2013
Messages: 16
Masculin
Niveau d'éléctronique: Débutant

MessagePosté le: Dim 3 Nov - 16:54 (2013)    Sujet du message: Reécriture du programme d'un robot Dagu Hexapod. Répondre en citant

PublicitéSupprimer les publicités ?
J'ai fait l'acquisition d'un kit mini bot. Il y a deux robot réalisable, et avec mon fils nous avons monté l'hexapod :


J'ai rapidement regardé le programme fourni et j'en suis vite arrivé à la conclusion qu'il est écrit un peu à l'arrache à partir du code d'un autre robot.

De plus j'ai remarqué une des rares annotations dans cettes section de code :

Citation:

  //----------------------------- play tune on powerup / reset -----------------------------------------
  //                        tone command is not used to save memory

  int melody[] = {
    262,196,196,220,196,1,247,262    };
  int noteDurations[] = {
    4,8,8,4,4,4,4,4    };
  for (byte Note = 0; Note < 8; Note++)                         // Play eight notes
  {
    long pulselength = 1000000/melody[Note];                   
    long noteDuration = 1000/noteDurations[Note];
    long pulses=noteDuration*1000/pulselength;
    if (pulselength>100000)                                     // Play pause
    {
      delay(noteDuration);
    }
    else
    {
      for(int p=0;p<pulses;p++)                                 // tone command not used to save memory
      {
        digitalWrite(Speakerpin,HIGH);
        delayMicroseconds(pulselength/2);
        digitalWrite(Speakerpin,LOW);
        delayMicroseconds(pulselength/2);
      }
      int pauseBetweenNotes = noteDuration * 0.30;
      delay(pauseBetweenNotes);
    }
  }



Cette section du code joue une mélodie en envoyant des impulsions a intervalles plus ou moins long sur le haut parleur. L'annotation 'tone command not used to save memory' laisse entendre que la carte ne dispose pas de beaucoup de mémoire. Je n'ai pas trouvé de spécifications sur le site, je ne sais donc pas vraiment de ce dont je dispose. Pas beaucoup sans doute.

J'ai donc l'intention de reprendre l'écriture de ce petit gadget à titre d'exercice pour me lancer dans la programmation d'arduino.
____________________________
Projet en cours :
Reécriture programme robot
Revenir en haut
arnaud39
Débutant

Hors ligne

Inscrit le: 01 Avr 2013
Messages: 378
Masculin
Niveau d'éléctronique: Dieu vivant

MessagePosté le: Dim 3 Nov - 20:28 (2013)    Sujet du message: Reécriture du programme d'un robot Dagu Hexapod. Répondre en citant

C'est une bonne chose de réécrire un code, c'est comme ça qu'on se perfectionne ! Si j'ai bien compris tu veux le réécrire a ta façon avec une mélodie différente c'est bien ça ?
____________________________
Ancien admin du forum, co-fondateur tutoarduino.com
Revenir en haut
Guid0
Débutant

Hors ligne

Inscrit le: 29 Oct 2013
Messages: 16
Masculin
Niveau d'éléctronique: Débutant

MessagePosté le: Dim 3 Nov - 22:41 (2013)    Sujet du message: Reécriture du programme d'un robot Dagu Hexapod. Répondre en citant

Non, pas juste changer la mélodie, ça c'est simple. Je vais reprendre le code pour le rendre plus à mon goût, en particulier mieux le découper en fonction. Je ne suis pas encore sur, car je n'ai pas eu trop de temps à y consacrer, mais il me semble que certaines variables déclarées ne sont pas utilisées. Globalement, cela ressemble à un code bricolé à partir d'un autre prévu pour un autre montage.
Demain, je prendrai le temps de décrire le robot, et ce qu'il fait avec le code actuel. Pour les curieux, il est téléchargeable ici.
____________________________
Projet en cours :
Reécriture programme robot
Revenir en haut
Guid0
Débutant

Hors ligne

Inscrit le: 29 Oct 2013
Messages: 16
Masculin
Niveau d'éléctronique: Débutant

MessagePosté le: Lun 4 Nov - 09:21 (2013)    Sujet du message: Reécriture du programme d'un robot Dagu Hexapod. Répondre en citant

La photo du robot  est dans le premier post. Je rajoute un lien vers les schémas disponibles dans la notice. Je ne suis pas très calé en électronique, aussi si vous les commentez j'en serai ravi.

Il est composé de 3 cartes, 4 servos, 2 supports 2 piles AA et de quelques pièces mécaniques simples.
1-Carte compatible Arduino. elle comporte :
    un switch on/off 
    une diode
    3 paire de pin pour jumper non utilisé.
  Elle supporte une catre 'oeil' et une carte 'haut parleur'.
  Les bornes d'alimentations 'BAT'
  Des broches pour les servo noté Right hip, Left Hip, Right Knee et Left Knee. Cela correspond au montage 'bipède'
2-Carte Haut Parleur.
  1 haut parleur.
  En J5 un brochage où viens se brancher la carte de conversion vers USB lorsque qu'on veut charger un programme.
  2 diode (une rouge, une blanche)
  Je pense qu'il y a le récepteur IR ce communication avec la télécommande (universelle TV)
3-Carte Oeil IR
  Une serie de 8 capteurs IR disposé par paires (haut, bas gauche et droite).
  4 diode IR pour émission de flash de lumière.
L'animation du robot se fait par 4 servos.
1 pour la tête (composé de la carte compatible support des deux autres (haut parleur derrière et oeil devant) qui permet une rotation gauche droite.
2 pour les paires de pattes avant/arrière de chaque côté. Les pattes avant/arrière d'un même côté son actionnée par un seul servo en en même sens (axe servo vertical, les pieds décrivent un secteur de cercle à plat, dans le même sens, façon 'dromadaire')
1 pour les deux pattes du milieu. Il s'agit en fait de béquilles basculante. L'axe du servo est horizontal dans le sens longitudinal, ce qui permet de faire reposer le robot sur 3 pattes, deux avant/arrière d'un côté et un mileu côté opposé.

Le robot peut donc avancer ou reculer par petit pivotement successif autour du pied milieu posé (alternativement le gauche et le droit)
Le rendu et assez inefficace saccadé et lent, mais vraiment sympathique, et avec les petits son émis en fonction de la présence ou non d'un objet détecté, le robot a un facteur affectif assez fort.
____________________________
Projet en cours :
Reécriture programme robot
Revenir en haut
arnaud39
Débutant

Hors ligne

Inscrit le: 01 Avr 2013
Messages: 378
Masculin
Niveau d'éléctronique: Dieu vivant

MessagePosté le: Lun 4 Nov - 10:22 (2013)    Sujet du message: Reécriture du programme d'un robot Dagu Hexapod. Répondre en citant

D'accord je vois, tu veux avoir un code propre et claire alors
____________________________
Ancien admin du forum, co-fondateur tutoarduino.com
Revenir en haut
Guid0
Débutant

Hors ligne

Inscrit le: 29 Oct 2013
Messages: 16
Masculin
Niveau d'éléctronique: Débutant

MessagePosté le: Lun 4 Nov - 10:40 (2013)    Sujet du message: Reécriture du programme d'un robot Dagu Hexapod. Répondre en citant

Oui, c'est un exercice pour apprendre...
____________________________
Projet en cours :
Reécriture programme robot
Revenir en haut
sticky
Débutant

Hors ligne

Inscrit le: 10 Juil 2013
Messages: 49
Niveau d'éléctronique: Débutant

MessagePosté le: Lun 4 Nov - 18:48 (2013)    Sujet du message: Reécriture du programme d'un robot Dagu Hexapod. Répondre en citant

Très bon projet, j'avais fais la même chose sur un petit robot acheté sur roboshop il y a 2 ans et croit moi c'est très formateur
____________________________
un débutant
Revenir en haut
Guid0
Débutant

Hors ligne

Inscrit le: 29 Oct 2013
Messages: 16
Masculin
Niveau d'éléctronique: Débutant

MessagePosté le: Ven 8 Nov - 13:13 (2013)    Sujet du message: Reécriture du programme d'un robot Dagu Hexapod. Répondre en citant

Un petit point sur le projet.
Je vous livre le code de ce que j'ai fait pour le moment. Le capteur fonctionne et ma fonction de son également. Les sorties séries sont activées pour étudier le fonctionnement et les valeurs rendues par le capteur IR. Je ferai peut être quelques modifications physique du capteur afin d'améliorer ses performances, mais cela sort un peu du sujet arduino.
Citation:

/*===========================================================================================================
 |                                              MyMiniHexaPod                                               |
 |                                                                                                          |
 |                                  Re ecriture du code du robot Dagu HexaPod                               |
 |       fonctionalités  :                                                                                  |
 |            Détection d'objet                                                                             |
 |            Suivi d'objet                                                                                 |
 |                                                                                                          |
 |                                                                                                          |
 |                                                                                                          |
 |                                                                                                          |
 |         Une partie du code est repris du code fourni par Dagu                                            |
 |         Ces sections sont commentees en anglais                                                          |
 |         Des sections sont inspirees du code de Dagu, avec des modifications et annotations               |
 |                                                                                                          |
 ==========================================================================================================*/

#include <Servo.h>

// define IO pins

// ===== SERVO PINS =====
#define llegpin         6  // digital pin  6 - Left  hip   servo
#define neckpin         5  // digital pin  5 - Right hip   servo
#define mlegpin         8  // digital pin  8 - Left  knee  servo
#define rlegpin         7  // digital pin  7 - Right knee  servo


// ==== IR EYE PINS =====
#define IRpin          13  // digital pin 13 - IR    Eye   LEDs
#define Uppin           3  // analog  pin  3 - upper eye   sensor
#define Downpin         1  // analog  pin  1 - lower eye   sensor
#define Leftpin         2  // analog  pin  2 - left  eye   sensor
#define Rightpin        0  // analog  pin  0 - right eye   sensor

// ==== IR FEET PINS ====
#define LeftIRpin      10  // digital pin 10 - left  foot  IR LED
#define RightIRpin      9  // digital pin  9 - right foot  IR LED
#define Leftsensorpin   5  // analog  pin  5 - left  foot  IR sensor
#define Rightsensorpin  4  // analog  pin  4 - right foot  IR sensor

// ==== IR COMS PINS ====
#define IRIpin          3  // digital pin  3 - IR Interrupt
#define IRXpin          0  // digital pin  0 - IR RX
#define ITXpin          1  // digital pin  1 - IR TX
#define ITMpin          4  // digital pin  4 - IR TX modulate (38KHz)

// == LED/SPEAKER PINS ==
#define LEDpin          2  // digital pin  2 - General purpose LED
#define Speakerpin      4  // digital pin  4 - Speaker output

// CONSTANTES
#define TeteLRmin         600
#define TeteLRmax        2100
#define TeteLRcenter     1350

#define IRbalanceLR      -100                       //Correction du capteur IR à ajuster par test en decommentant les lignes de mise au point.       

// Variables globales

int echoGisement ;
int echoDistance ;
int tetePosition = TeteLRcenter ;




// define servos
//Servo Lleg;
//Servo Rleg;
//Servo Mleg;
Servo Neck;





/*......................................................................................................................
 |                              Fonctions                                                                               |
 */
 
//                            ----------------------
//                            |        myBeep      |
//                            ----------------------

// fait emettre un son de duree int duration (musical 1 pour blanche, 2 pour noir, 4 pour croche...) et de son int note
// sur la pin int speaker (qui doit avoir ete configuree)
// Le code Dagu notait tone() not used to save memory : gain environ 1Ko sur 7Ko dispo.

void myBeep(int note , int duration , int speaker)
{
  long pulselength = 1000000 / note ;                      //calcul de la longuer d'une onde en temps de la note (tempo fixe 1000*mS)
  long pulses = note / duration ;
  //MISE AU POINT
  Serial.print ( duration );
  Serial.print (" / ");
  Serial.println ( note );
  for(int p=0;p<pulses;p++)                                // tone command not used to save memory
  {
    digitalWrite ( speaker , HIGH );
    delayMicroseconds ( pulselength/2 );                   // 1/2 pulsation haute
    digitalWrite ( speaker , LOW );
    delayMicroseconds ( pulselength/2 );                   // 1/2 pulsation basse
  }
//   tone ( speaker , note , noteDuration ) ;         // decommenter pour comparer le gain en memoire
}



//                            ----------------------
//                            |      myStep        |
//                            ----------------------

// faire nStep pas dans le sens motion (-1 : arrière, 0 : sur place, 1 : avant) en tournant vers steer (-1 : gauche, 0 tout droit, 1 : à droite)

//void myStep ( int nStep , int steer , int motion )
//{
//
//}


//                            ----------------------
//                            |    myVueDistance   |
//                            ----------------------

// retourne une valeur evaluant la distance d'un objet (valeur augmentant si objet proche)
// ordre 1000 si proche, retourne 0 si inf à 100

int myVueDistance()
{
  int upIRvalue;
  int downIRvalue;
  int leftIRvalue;
  int rightIRvalue;
  int distance;

  // section de code reprise
  digitalWrite(IRpin,HIGH);                                     // turn on IR LEDs to read TOTAL IR LIGHT (ambient + reflected)
  delayMicroseconds(100);                                        // Allow time for phototransistors to respond. (may not be needed)
  upIRvalue=analogRead(Uppin);                                  // TOTAL IR = AMBIENT IR + LED IR REFLECTED FROM OBJECT
  downIRvalue=analogRead(Downpin);                              // TOTAL IR = AMBIENT IR + LED IR REFLECTED FROM OBJECT
  leftIRvalue=analogRead(Leftpin);                              // TOTAL IR = AMBIENT IR + LED IR REFLECTED FROM OBJECT
  rightIRvalue=analogRead(Rightpin);                            // TOTAL IR = AMBIENT IR + LED IR REFLECTED FROM OBJECT


  digitalWrite(IRpin,LOW);                                      // turn off IR LEDs to read AMBIENT IR LIGHT (IR from indoor lighting and sunlight)
  delayMicroseconds(100);                                        // Allow time for phototransistors to respond. (may not be needed)
  upIRvalue=upIRvalue-analogRead(Uppin);                        // REFLECTED IR = TOTAL IR - AMBIENT IR
  downIRvalue=downIRvalue-analogRead(Downpin);                  // REFLECTED IR = TOTAL IR - AMBIENT IR
  leftIRvalue=leftIRvalue-analogRead(Leftpin);                  // REFLECTED IR = TOTAL IR - AMBIENT IR
  rightIRvalue=rightIRvalue-analogRead(Rightpin);               // REFLECTED IR = TOTAL IR - AMBIENT IR

  distance=(leftIRvalue+rightIRvalue+upIRvalue+downIRvalue)/4;  // distance of object is average of reflected IR

  // fin de section reprise

  return distance ;




//                            ----------------------
//                            |    myVueGisement   |
//                            ----------------------

// retourne une valeur evaluant le gisement d'un objet
// negatif si à gauche, positif si à droite
// la constante IRbalanceLR permet d'ajuster le biais du capteur


int myVueGisement ()
{
  int upIRvalue;
  int downIRvalue;
  int leftIRvalue;
  int rightIRvalue;
  int gisement;

  // section de code reprise
  digitalWrite(IRpin,HIGH);                                     // turn on IR LEDs to read TOTAL IR LIGHT (ambient + reflected)
  delayMicroseconds(100);                                        // Allow time for phototransistors to respond. (may not be needed)


  leftIRvalue=analogRead(Leftpin);                              // TOTAL IR = AMBIENT IR + LED IR REFLECTED FROM OBJECT
  rightIRvalue=analogRead(Rightpin);                            // TOTAL IR = AMBIENT IR + LED IR REFLECTED FROM OBJECT


  digitalWrite(IRpin,LOW);                                      // turn off IR LEDs to read AMBIENT IR LIGHT (IR from indoor lighting and sunlight)
  delayMicroseconds(100);                                        // Allow time for phototransistors to respond. (may not be needed)


  leftIRvalue=leftIRvalue-analogRead(Leftpin);                  // REFLECTED IR = TOTAL IR - AMBIENT IR
  rightIRvalue=rightIRvalue-analogRead(Rightpin);               // REFLECTED IR = TOTAL IR - AMBIENT IR
  // fin de section reprise

  gisement = rightIRvalue-leftIRvalue;                    //calcule un gisement exprime en difference de lumiere recu entre la gauche et la droite
                                                          //gisement est negatif si l'objet est a gauche, positif s'il est a droite
  gisement = gisement + IRbalanceLR ;                     //correction du bias de capteur                                                       
  return gisement;

}


//_____________________________SETUP________________________________________________
void setup()

{
  //  Lleg.attach(llegpin);                                         // assign processor pin to Lleg servo
  //  Rleg.attach(rlegpin);                                         // assign processor pin to Rleg servo
  //  Mleg.attach(mlegpin);                                         // assign processor pin to Mleg servo
  Neck.attach(neckpin);                                         // assign processor pin to Neck servo



  pinMode(IRpin,OUTPUT);                                        // White LED
  pinMode(LEDpin,OUTPUT);                                       // Red LED
  pinMode(Speakerpin,OUTPUT);                                   // Speaker
  //  digitalWrite(IRIpin,1);                                       // turn on D3 pullup resistor for IR receiver interrupt pin

  //----------------------------- play tune on powerup / reset -----------------------------------------
  //                        tone command is not used to save memory

  int melody[] = {
    262,196,196,220,196,1,247,262      };
  int noteDuration[] = {
    4,8,8,4,4,4,4,4      };
//MISE AU POINT
  Serial.begin(9600);
  for (byte note = 0; note < 8; note++)                         // Play eight notes
  {
    Serial.print ("note : ");
    Serial.println(melody [note]);
    if ( melody[note] !=1)
    {
      myBeep ( melody[note] , noteDuration[note] ,Speakerpin);
      int pauseBetweenNotes = noteDuration[note] * 0.30;
      delay(pauseBetweenNotes);
    }
    else delay (1000/noteDuration[note]);
  }
}


//--------------------------LOOP----------------------------------------------------
void loop()

{
  delay(30);
  echoDistance = myVueDistance();
  // MISE AU POINT
  Serial.print ("  echoDistance :");
  Serial.println ( echoDistance );
  if ( echoDistance > 200 )
  {
    myBeep (echoDistance,132,Speakerpin);
    echoGisement = myVueGisement();
    // MISE AU POINT
    Serial.print ("  echoGisement :");
    Serial.print ( echoGisement );
    while ( echoGisement < -10  &&  echoGisement > 10 )
    {
      tetePosition = tetePosition + echoGisement ;
      // MISE AU POINT
      Serial.print ("  tetePosition :");
      Serial.println ( tetePosition );
      Serial.print ("  echoDistance :");
      Serial.println ( echoDistance );
      Serial.print ("  echoGisement :");
      Serial.println ( echoGisement );
      //Neck.writeMicroseconds(tetePosition);
    }
  }
  else
  {
//    myBeep(880,64,Speakerpin);
  }
}



Merci pour les deux trois petites remarques qui m'ont aidées. Et si vous vous lancez dans un projet équivalent, ne passez pas trop de temps d'affilé sur l'écran : notre cerveau organique gomme les coquilles, il faut toujours relire son propre code comme si on ne l'avait jamais vu...

Prochaine étape : je vais établir et coder l'algo de la fonction de marche myStep()...
____________________________
Projet en cours :
Reécriture programme robot
Revenir en haut
Admin
Fondateur

Hors ligne

Inscrit le: 12 Avr 2012
Messages: 860
Masculin
Niveau d'éléctronique: Pro

MessagePosté le: Ven 8 Nov - 19:05 (2013)    Sujet du message: Reécriture du programme d'un robot Dagu Hexapod. Répondre en citant

Notre forum Arduino a aussi pour but de faire partager vos montages même sans rapport avec l'Arduino donc n'hésites pas à poster les modifs que tu apporteras au capteur, ça peut aider des membres !!
____________________________
http://simple-duino.com
Revenir en haut
Guid0
Débutant

Hors ligne

Inscrit le: 29 Oct 2013
Messages: 16
Masculin
Niveau d'éléctronique: Débutant

MessagePosté le: Mer 13 Nov - 14:09 (2013)    Sujet du message: Reécriture du programme d'un robot Dagu Hexapod. Répondre en citant

Nouvelle étape.
J'ai fini de coder les fonctions basiques que je voulais mettre au point pour initier mon fiston à la programmation.
J'ai donc refais les fonctions
myVueDistance() , myVueGisement(), MyBeep() et myStep.
J'ai ensuite codé rapidement un exemple d'utilisation qui donne sensiblement le même résultat que le code d'origine : le robot attend de détecter quelque chose dans son champ, il essaye de le suivre de la tête et se déplace pour essayer de se maintenir face à ce qu'il détecte et à une distance assez proche, mais pas trop. Globalement, il a un comportement de petit animal qui joue.
On y rajoute quelques sons et le résultat est plutôt amusant.
Je vous livre le résultat :

Citation:

/*===========================================================================================================
 |                                              MyMiniHexaPod                                               |
 |                                                                                                          |
 |                                  Re ecriture du code du robot Dagu HexaPod                               |
 |       fonctionalités  :                                                                                  |
 |            Détection d'objet                                                                             |
 |            Suivi d'objet                                                                                 |
 |                                                                                                          |
 |                                                                                                          |
 |                                                                                                          |
 |                                                                                                          |
 |         Une partie du code est repris du code fourni par Dagu                                            |
 |         Ces sections sont commentees en anglais                                                          |
 |         Des sections sont inspirees du code de Dagu, avec des modifications et annotations               |
 |                                                                                                          |
 ==========================================================================================================*/

#include <Servo.h>

// define IO pins

// ===== SERVO PINS =====
#define llegpin         6  // digital pin  6 - Left  hip   servo
#define neckpin         5  // digital pin  5 - Right hip   servo
#define mlegpin         8  // digital pin  8 - Left  knee  servo
#define rlegpin         7  // digital pin  7 - Right knee  servo


// ==== IR EYE PINS =====
#define IRpin          13  // digital pin 13 - IR    Eye   LEDs
#define Uppin           3  // analog  pin  3 - upper eye   sensor
#define Downpin         1  // analog  pin  1 - lower eye   sensor
#define Leftpin         2  // analog  pin  2 - left  eye   sensor
#define Rightpin        0  // analog  pin  0 - right eye   sensor

// ==== IR FEET PINS ====
#define LeftIRpin      10  // digital pin 10 - left  foot  IR LED
#define RightIRpin      9  // digital pin  9 - right foot  IR LED
#define Leftsensorpin   5  // analog  pin  5 - left  foot  IR sensor
#define Rightsensorpin  4  // analog  pin  4 - right foot  IR sensor

// ==== IR COMS PINS ====
#define IRIpin          3  // digital pin  3 - IR Interrupt
#define IRXpin          0  // digital pin  0 - IR RX
#define ITXpin          1  // digital pin  1 - IR TX
#define ITMpin          4  // digital pin  4 - IR TX modulate (38KHz)

// == LED/SPEAKER PINS ==
#define LEDpin          2  // digital pin  2 - General purpose LED
#define Speakerpin      4  // digital pin  4 - Speaker output

// CONSTANTES
#define TeteLRmin         600
#define TeteLRmax        2100
#define TeteLRcenter     1350

#define LlegCenter        1500
#define RlegCenter        1500
#define MlegCenter        1400

#define Stride        200
#define Twist         180

#define IRbalanceLR      -100                       //Correction du capteur IR à ajuster par test en decommentant les lignes de mise au point.  

#define DistanceDetect   200                        //Constante de seuil de detection
#define DistanceClosest  800                        //Constante de proximite max

// Variables globales

int echoGisement ;
int echoDistance ;
int tetePosition = TeteLRcenter ;
int midLegPos  = 0 ;
int fbMotion   = 0 ;
int lrSteer    = 0 ;




// define servos
Servo Lleg;
Servo Rleg;
Servo Mleg;
Servo Neck;





/*......................................................................................................................
 |                              Fonctions                                                                               |
 */
 
//                            ----------------------
//                            |        myBeep      |
//                            ----------------------

// fait emettre un son de duree int duration (musical 1 pour blanche, 2 pour noir, 4 pour croche...) et de son int note
// sur la pin int speaker (qui doit avoir ete configuree)
// Le code Dagu notait tone() not used to save memory : gain environ 1Ko sur 7Ko dispo. 

void myBeep(int note , int duration , int speaker)
{
  long pulselength = 1000000 / note ;                      //calcul de la longuer d'une onde en temps de la note (tempo fixe 1000*mS)
  long pulses = note / duration ;
  //MISE AU POINT
//  Serial.print ( duration );
//  Serial.print (" / ");
//  Serial.println ( note );
  for(int p=0;p<pulses;p++)                                // tone command not used to save memory
  {
    digitalWrite ( speaker , HIGH );
    delayMicroseconds ( pulselength/2 );                   // 1/2 pulsation haute
    digitalWrite ( speaker , LOW );
    delayMicroseconds ( pulselength/2 );                   // 1/2 pulsation basse
  }
//   tone ( speaker , note , noteDuration ) ;         // decommenter pour comparer le gain en memoire
}



//                            ----------------------
//                            |      myStep        |
//                            ----------------------

// faire nStep pas dans le sens motion (-1 : arriere, 0 : sur place, 1 : avant) en tournant vers steer (-1 : gauche, 0 tout droit, 1 : a droite)
// et basculement du balancier (midPos)
// Les constantes LlegCenter, RlegCenter, MlegCenter, Stride et Twist doivent avoir été définies.
// Les servo Lleg, Rleg, MLeg doivent avoir été attachés
// retourne midPos après basculement (midPos = midPos*(-1))


int myStep ( int midPos , int steer , int motion )
{
 int midLeg = midPos ;
 int traction[]={ -1 , -1 , 0 , 1 , 1 } ;             //matrice de résoluiton du doublet direction-steer
 int leftStep  = traction [2+steer+motion] ;        //sens de propultion de chaque cote en fonction de direction et steer
 int rightStep = traction [2-steer+motion] ;
 
 Lleg.writeMicroseconds(LlegCenter+midPos*leftStep*Stride);
 Rleg.writeMicroseconds(RlegCenter+midPos*rightStep*Stride);
 if (midLeg == 0)
 {
   midLeg = 1 ;
 }
 else
 {
   midLeg *=-1 ;
 }
 delay(100) ;
 Mleg.writeMicroseconds (MlegCenter+midLeg*Twist) ;
 delay(100) ;
 return midLeg;
}


//                            ----------------------
//                            |    myVueDistance   |
//                            ----------------------

// retourne une valeur evaluant la distance d'un objet (valeur augmentant si objet proche)
// ordre 1000 si proche, retourne 0 si inf √† 100

int myVueDistance()
{
  int upIRvalue;
  int downIRvalue;
  int leftIRvalue;
  int rightIRvalue;
  int distance;

  // section de code reprise
  digitalWrite(IRpin,HIGH);                                     // turn on IR LEDs to read TOTAL IR LIGHT (ambient + reflected)
  delayMicroseconds(100);                                        // Allow time for phototransistors to respond. (may not be needed)
  upIRvalue=analogRead(Uppin);                                  // TOTAL IR = AMBIENT IR + LED IR REFLECTED FROM OBJECT
  downIRvalue=analogRead(Downpin);                              // TOTAL IR = AMBIENT IR + LED IR REFLECTED FROM OBJECT
  leftIRvalue=analogRead(Leftpin);                              // TOTAL IR = AMBIENT IR + LED IR REFLECTED FROM OBJECT
  rightIRvalue=analogRead(Rightpin);                            // TOTAL IR = AMBIENT IR + LED IR REFLECTED FROM OBJECT


  digitalWrite(IRpin,LOW);                                      // turn off IR LEDs to read AMBIENT IR LIGHT (IR from indoor lighting and sunlight)
  delayMicroseconds(100);                                        // Allow time for phototransistors to respond. (may not be needed)
  upIRvalue=upIRvalue-analogRead(Uppin);                        // REFLECTED IR = TOTAL IR - AMBIENT IR
  downIRvalue=downIRvalue-analogRead(Downpin);                  // REFLECTED IR = TOTAL IR - AMBIENT IR
  leftIRvalue=leftIRvalue-analogRead(Leftpin);                  // REFLECTED IR = TOTAL IR - AMBIENT IR
  rightIRvalue=rightIRvalue-analogRead(Rightpin);               // REFLECTED IR = TOTAL IR - AMBIENT IR

  distance=(leftIRvalue+rightIRvalue+upIRvalue+downIRvalue)/4;  // distance of object is average of reflected IR

  // fin de section reprise

  return distance ;




//                            ----------------------
//                            |    myVueGisement   |
//                            ----------------------

// retourne une valeur evaluant le gisement d'un objet 
// negatif si à gauche, positif si à droite
// la constante IRbalanceLR permet d'ajuster le biais du capteur


int myVueGisement ()
{
  int upIRvalue;
  int downIRvalue;
  int leftIRvalue;
  int rightIRvalue;
  int gisement;

  // section de code reprise
  digitalWrite(IRpin,HIGH);                                     // turn on IR LEDs to read TOTAL IR LIGHT (ambient + reflected)
  delayMicroseconds(100);                                        // Allow time for phototransistors to respond. (may not be needed)


  leftIRvalue=analogRead(Leftpin);                              // TOTAL IR = AMBIENT IR + LED IR REFLECTED FROM OBJECT
  rightIRvalue=analogRead(Rightpin);                            // TOTAL IR = AMBIENT IR + LED IR REFLECTED FROM OBJECT


  digitalWrite(IRpin,LOW);                                      // turn off IR LEDs to read AMBIENT IR LIGHT (IR from indoor lighting and sunlight)
  delayMicroseconds(100);                                        // Allow time for phototransistors to respond. (may not be needed)


  leftIRvalue=leftIRvalue-analogRead(Leftpin);                  // REFLECTED IR = TOTAL IR - AMBIENT IR
  rightIRvalue=rightIRvalue-analogRead(Rightpin);               // REFLECTED IR = TOTAL IR - AMBIENT IR
  // fin de section reprise

  gisement = rightIRvalue-leftIRvalue;                    //calcule un gisement exprime en difference de lumiere recu entre la gauche et la droite
                                                          //gisement est negatif si l'objet est a gauche, positif s'il est a droite
  gisement = gisement + IRbalanceLR ;                     //correction du bias de capteur                                                       
  return gisement;

}


//_____________________________SETUP________________________________________________
void setup()

{
  Lleg.attach(llegpin);                                         // assign processor pin to Lleg servo
  Rleg.attach(rlegpin);                                         // assign processor pin to Rleg servo
  Mleg.attach(mlegpin);                                         // assign processor pin to Mleg servo
  Neck.attach(neckpin);                                         // assign processor pin to Neck servo



  pinMode(IRpin,OUTPUT);                                        // White LED
  pinMode(LEDpin,OUTPUT);                                       // Red LED
  pinMode(Speakerpin,OUTPUT);                                   // Speaker
  //  digitalWrite(IRIpin,1);                                       // turn on D3 pullup resistor for IR receiver interrupt pin

  //----------------------------- play tune on powerup / reset -----------------------------------------
  //                        tone command is not used to save memory

  int melody[] = {
    262,196,196,220,196,1,247,262      };
  int noteDuration[] = {
    4,8,8,4,4,4,4,4      };
//MISE AU POINT
//  Serial.begin(9600);
  for (byte note = 0; note < 8; note++)                         // Play eight notes
  {
//    Serial.print ("note : ");
//    Serial.println(melody [note]);
    if ( melody[note] !=1)
    {
      myBeep ( melody[note] , noteDuration[note] ,Speakerpin);
      int pauseBetweenNotes = noteDuration[note] * 0.30;
      delay(pauseBetweenNotes);
    }
    else delay (1000/noteDuration[note]);
  }
}


//--------------------------LOOP----------------------------------------------------
void loop()

{
  echoDistance = myVueDistance();
  // MISE AU POINT
//  Serial.print ("  echoDistance :");
//  Serial.println ( echoDistance );
  if ( echoDistance > DistanceDetect )
  {
    myBeep (echoDistance,132,Speakerpin);
    echoGisement = myVueGisement();
    // MISE AU POINT
//    Serial.print ("  echoGisement :");
//    Serial.print ( echoGisement );
    if ( echoGisement < -10  ||  echoGisement > 10 )
    {
      tetePosition = tetePosition + (echoGisement / 3);
      // MISE AU POINT
//      Serial.print ("  tetePosition :");
//      Serial.println ( tetePosition );
//      Serial.print ("  echoDistance :");
//      Serial.println ( echoDistance );
//      Serial.print ("  echoGisement :");
//      Serial.println ( echoGisement );
      Neck.writeMicroseconds(tetePosition);
      if (tetePosition > (TeteLRcenter-150) && tetePosition < (TeteLRcenter+150))
      {
        lrSteer = 0;
      }
      else
      {
       if (tetePosition < TeteLRcenter - 150)
        {
          lrSteer = -1 ;
        }
       if (tetePosition > TeteLRcenter + 150)
        {
          lrSteer = 1 ;
        }
      }
    }
    if ( echoDistance > DistanceClosest )
    {
      fbMotion = -1 ;
    }
  else
    {
      fbMotion = 1 ;
    }
  //Test motiom   
  midLegPos = myStep (midLegPos,lrSteer,fbMotion);
  }
  else
  {
    myBeep(880,64,Speakerpin);
    fbMotion = 0 ;
    tetePosition = int((tetePosition+TeteLRcenter)/2);
    Neck.writeMicroseconds(tetePosition);
    delay (100);
  }
}





J'ai pu faire faire à mon fiston un algo simple en utilisant ces fonctions et juste en touchant loop(). Il a réussit en l'orientant un peu, à faire une logique qui fait que le robot avance s'il ne détecte rien en dessous d'une certaine distance de seuil, et qu'il recule en dessous de cette distance. Cool

Je vais maintenant m'attaquer à la partie réponse au commande IR de la télécommande.
____________________________
Projet en cours :
Reécriture programme robot
Revenir en haut
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 10:34 (2017)    Sujet du message: Reécriture du programme d'un robot Dagu Hexapod.

Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Simple-Duino Index du Forum -> Arduino & Électronique -> Projets -> Vos projets Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  

Index | creer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Powered by phpBB
Propulsé par Simple-Duino