LFO : Line Follower Organ

Parlez nous de vos projets et de vos idées, imaginez des applications

LFO : Line Follower Organ

Message non lude EricDuino » Ven 9 Nov 2012 11:38

Bonjour,

J'ai inventé un instrument de musique mécanique nommé en Anglais : Line Follower Organ :D

LFO_x600.JPG
LFO_x600.JPG (156.07 Kio) Vu 1623 fois




C'est un robot AirDuino ( voir " Projet AirDuino " >> viewtopic.php?f=32&t=519 ) équipé d'un petit haut parleur sur la sortie 11 et qui exécute le code suivant :

Code: Tout sélectionner
/* EricDuino 14-10-2012
 
 Suite ImagiLAN et dicussion Ursula de Usinette.org
 mise en musique, la ligne et ses virages sont une partition...
 
  Spécial #Démo de ligne : capteur 8 x CNY70 sur I2C
 
  // infos matérielles
 led rouge sur 0
 led orange sur 1
 Rec IR sur 2
 led verte sur 3
 BP sur 6
 HP/Buzzer musical sur 11
 
 */
// Librairies
#include <Wire.h>    // pour l'I2C
// Les reglages //

//
// les variables de vitesse et de calcul des commandes moteur
int vmax = 180; // A regler par robot
int vmin = 30;





int vreduit = 0; // calculé
int erreurinflexion = 2; //2>#1v2, 3>#6pi // valeur d'erreur ou on inverse le moteur
int vmaxback = vmin+((vmax-vmin)/2); // valeur max du pmw en back





int vision = 0;
// positionligne : derive - décalage : transformation de vision en nb relatif a la position
// du centre, gauche = negatif, centre = 0, droite = positif  // non c'est le contraire !!
int positionligne = 0;

// les variables du PID. les constantes ne sont pas definies en variables !
int proportional = 0;
int integral = 0;
int derivative = 0;
int last_proportional = 0;
double Output = 0;

// les pins du SN754410
#define EN12 9 // Left Motor Enable Pin EN1,2
#define IN1A 8 // LeftRight Motor Direction Pin 1A
#define IN2A 7 // Left Motor Direction Pin 2A
#define EN34 10 // Right Motor Enable Pin EN3,4
#define IN3A 5 // Right Motor Direction  3A
#define IN4A 4 // Right Motor Direction  4A

////////////////////////
// la fonction moteur //
////////////////////////

#define FORW 1 // Forward
#define BACK 0 // Backward
// M1 = Moteur Gauche M2 = Moteur Droit
void Motor_Control (int M1_DIR, int M1_EN, int M2_DIR, int M2_EN) // Motor control function
{
  ////////// M1 ////////////////////////
  if (M1_DIR == FORW) // Set M1 Motor Direction
  {
    digitalWrite (IN1A, LOW); // HIGH, Rotate clockwise
    digitalWrite (IN2A, HIGH); // LOW, Rotate clockwise
  }
  else
  {
    digitalWrite (IN1A, HIGH); // LOW, Anti Rotate clockwise
    digitalWrite (IN2A, LOW); // HIGH, Anti Rotate clockwise
  }

  analogWrite (EN12, M1_EN);

  /////////// M2 //////////////////////
  if (M2_DIR == FORW) // Set M2 Motor Direction
  {
    digitalWrite (IN3A, HIGH); // HIGH, Rotate clockwise
    digitalWrite (IN4A, LOW); // LOW, Rotate clockwise
  }
  else
  {
    digitalWrite (IN3A, LOW); // LOW, Anti Rotate clockwise
    digitalWrite (IN4A, HIGH); // HIGH, Anti Rotate clockwise
  }

  analogWrite (EN34, M2_EN);

}


/////////////////////////////
// La fct lectureCapteur() //
/////////////////////////////

void lectureCapteur() // Lecture du capteur I²C
{

Wire.requestFrom(32, 1);    // request 1 bytes from slave device 32
  while(Wire.available())    // slave may send less than requested
  { 
    vision = Wire.read();  // receive a byte as character
  }
  // Serial.print("vision : ");
  //Serial.println(vision, BIN);
}
/////////////////////////
// La fct suiviLigne() //
/////////////////////////
void suiviLigne()
{
  // attention les valeurs binaires du capteur sont inversées
  // par rapport au sens reel  : positionligne negatif = ligne à droite


  if (vision == B10000000) positionligne = -5;
  if (vision == B11000000) positionligne = -5;
  if (vision == B01000000) positionligne = -5;
  if (vision == B01100000) positionligne = -4;
  if (vision == B00100000) positionligne = -3;
  if (vision == B00110000) positionligne = -2;
  if (vision == B00010000) positionligne = -1;

  if (vision == B00011000) positionligne = 0;

  if (vision == B00001000) positionligne = 1;
  if (vision == B00001100) positionligne = 2;
  if (vision == B00000100) positionligne = 3;
  if (vision == B00000110) positionligne = 4;
  if (vision == B00000010) positionligne = 5;
  if (vision == B00000011) positionligne = 5;
  if (vision == B00000001) positionligne = 5;

  //Serial.print("positionligne : ");
  //Serial.println(positionligne); 

  // The "proportional" term should be 0 when we are on the line.
  proportional = positionligne;
  // Compute the derivative (change) and integral (sum) of the position.
  derivative = proportional - last_proportional;
  integral += proportional;
  // Remember the last position.
  last_proportional = proportional;
  // Compute the difference between the two motor power settings,
  // m1 - m2.  If this is a positive number the robot will turn
  // to the right.  If it is a negative number, the robot will
  // turn to the left, and the magnitude of the number determines
  // the sharpness of the turn.
  Output = proportional*0.8 + integral*0 + derivative*3; // commenté pour desactver pid
  //Output = positionligne; // non commenté pour desactver pid

  //Serial.print("Output : ");
  //Serial.println(Output); 

  // Calcul des commandes moteur

  if (Output > 5) Output = 5;
  if (Output < -5) Output = -5;

  if (Output == 0) {
    Motor_Control (FORW, vmax, FORW, vmax);
  }
  if (Output > 0 && Output < erreurinflexion) {
    vreduit = vmax - ( (vmax - vmin) * Output/erreurinflexion );
    Motor_Control (FORW, vreduit, FORW, vmax );
  }
  if (Output >= erreurinflexion && Output <= 5) {
    vreduit = vmin + ( (vmaxback - vmin)*(Output - erreurinflexion) / (5 - erreurinflexion) );
    Motor_Control (BACK, vreduit, FORW, vmax );
  }
  if (Output < 0 && Output > -erreurinflexion) {
    vreduit = vmax - ( (vmax - vmin) * -Output/erreurinflexion );
    Motor_Control (FORW, vmax, FORW, vreduit );
  }
  if (Output <= -erreurinflexion  && Output >= -5) {
    vreduit = vmin + ( (vmaxback - vmin)*(-Output - erreurinflexion) / (5 - erreurinflexion) );
    Motor_Control (FORW, vmax, BACK, vreduit );
  }

  //Serial.print("vreduit : ");
  //Serial.println(vreduit); 

}

/////////////////////////
// La fct biduleMusical() //
/////////////////////////
void biduleMusical()
{
 
  if (positionligne == -5) {
    tone(11,330);
  }
 
  if (positionligne == -4) {
    tone(11,349);
  }
  if (positionligne == -3) {
    tone(11,370);
  }
  if (positionligne == -2) {
    tone(11,392);
  }
  if (positionligne == -1) {
    tone(11,415);
  }
  if (positionligne == 0) {
    tone(11,440);
  }
  if (positionligne == 1) {
    tone(11,466);
  }
  if (positionligne == 2) {
    tone(11,494);
  }
  if (positionligne == 3) {
    tone(11,523);
  }
  if (positionligne == 4) {
    tone(11,554);
  }
  if (positionligne == 5) {
    tone(11,587);
  }
 
 
   
} //fin de biduleMusical


//////////////
// le setup //
//////////////
void setup()
{
  //Serial.begin(9600); // pour le serial monitor

  Wire.begin();        // join i2c bus (address optional for master)


  // les pins SN754410NE
  pinMode(EN12, OUTPUT);
  pinMode(IN1A, OUTPUT);
  pinMode(IN2A, OUTPUT);
  pinMode(EN34, OUTPUT);
  pinMode(IN3A, OUTPUT);
  pinMode(IN4A, OUTPUT);

  digitalWrite(EN12, LOW);
  digitalWrite(IN1A, LOW);
  digitalWrite(IN2A, LOW);
  digitalWrite(EN34, LOW);
  digitalWrite(IN3A, LOW);
  digitalWrite(IN4A, LOW);

  // les autres pins
  pinMode(0, OUTPUT);  // LED rouge
  pinMode(1, OUTPUT);  // LED orange
  pinMode(3, OUTPUT);  // LED verte
 
  pinMode(11, OUTPUT);  // pour la musique

  digitalWrite(0, LOW);
  digitalWrite(1, LOW);
  digitalWrite(3, LOW);

  pinMode(6, INPUT);     // LE BP 
  digitalWrite(6, HIGH); // Pullup du BP

  //la pause top départ
  while (digitalRead(6) == 1){
    /*    //att appui BP
     digitalWrite(3, HIGH);  //on allume la led
     
     delay(100);
     digitalWrite(3, LOW);  //on eteint la led
     
     delay(300);*/
  }
  digitalWrite(3, HIGH);  //on allume la led

  delay(3000);

  digitalWrite(1, HIGH); //on allume la led
}
/////////////////////////
//la boucle principale //
//      LA Loop        //
/////////////////////////

void loop() {


  lectureCapteur();

  suiviLigne();
 
  biduleMusical(); // pour la musique fct de positionligne

  delay(10);


} // fin de loop




D'autres infos sur http://ericduino.fr/lfo-line-follower-organ/

EricDuino :geek:
Avatar de l’utilisateur
EricDuino
 
Messages: 225
Inscription: Sam 5 Mai 2012 10:10
Localisation: Toulouse

Re: LFO : Line Follower Organ

Message non lude gallegojm » Dim 11 Nov 2012 14:50

Génial!
Je crois urgent de demander au gouvernement actuel d'en imposer l'usage sur toutes les voitures de série :lol:
Par contre, à la vue de la vidéo, il me semble que le programmateur n'aura pas son permis ( temps 0:22 , 0:27 ...) et s'il l'a déjà, je ne donne pas cher des points qui lui reste ( temps 0:50 ) :?
gallegojm
 
Messages: 33
Inscription: Jeu 13 Sep 2012 15:23

Re: LFO : Line Follower Organ

Message non lude EricDuino » Sam 17 Nov 2012 11:12

Avatar de l’utilisateur
EricDuino
 
Messages: 225
Inscription: Sam 5 Mai 2012 10:10
Localisation: Toulouse


Retourner vers Vos projets, vos idées

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron