Aller au contenu


Photo

Petit robot à roues, moteur réducteur miniature POLOLU 993, arduino


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

#1 robotland

robotland

    Nouveau membre

  • Membres
  • 3 messages

Posté 04 juillet 2011 - 05:27

Bonjour,

J'ai acheté un Moteur réducteur miniature "POLOLU 993" :
http://www.lextronic.notebleue.com/P4234-moteur-reducteur-miniature-pololu-993.html

J'aimerais le contrôler avec l'arduino uno, j'ai fait le programme suivant :

void setup()
{
pinMode(motorPin, OUTPUT);
}
/*
* loop() – this function will start after setup finishes and then repeat
* we call a function called motorOnThenOff()
*/
void loop()                     // run over and over again
{
motorOnThenOff();
//motorOnThenOffWithSpeed();
//motorAcceleration();
}
/*
* motorOnThenOff() – turns motor on then off
* (notice this code is identical to the code we used for
* the blinking LED)
*/
void motorOnThenOff(){
  int onTime = 2500;  //the number of milliseconds for the motor to turn on for
  int offTime = 1000; //the number of milliseconds for the motor to turn off for
  
  digitalWrite(motorPin, HIGH); // turns the motor On
  delay(onTime);                // waits for onTime milliseconds
  digitalWrite(motorPin, LOW);  // turns the motor Off
  delay(offTime);               // waits for offTime milliseconds
}
/*
* motorOnThenOffWithSpeed() – turns motor on then off but uses speed values as well
* (notice this code is identical to the code we used for
* the blinking LED)
*/
void motorOnThenOffWithSpeed(){
  
  int onSpeed = 200;  // a number between 0 (stopped) and 255 (full speed)
  int onTime = 2500;  //the number of milliseconds for the motor to turn on for
  
  int offSpeed = 50;  // a number between 0 (stopped) and 255 (full speed)
  int offTime = 1000; //the number of milliseconds for the motor to turn off for
  
  analogWrite(motorPin, onSpeed);   // turns the motor On
  delay(onTime);                    // waits for onTime milliseconds
  analogWrite(motorPin, offSpeed);  // turns the motor Off
  delay(offTime);                   // waits for offTime milliseconds
}
/*
* motorAcceleration() – accelerates the motor to full speed then
* back down to zero
*/
void motorAcceleration(){
  int delayTime = 50; //milliseconds between each speed step
  
  //Accelerates the motor
  for(int i = 0; i < 256; i++){ //goes through each speed from 0 to 255
    analogWrite(motorPin, i);   //sets the new speed
    delay(delayTime);           // waits for delayTime milliseconds
  }
  
  //Decelerates the motor
  for(int i = 255; i >= 0; i--){ //goes through each speed from 255 to 0
    analogWrite(motorPin, i);   //sets the new speed
    delay(delayTime);           // waits for delayTime milliseconds
  }
}

mais ça ne marche pas.

J'aimerais en fait construire un petit robot à roues, mais il faut d'abord que je contrôle ce moteur avec l'arduino, pourriez-vous m'aider en me donnant un programme qui fonctionne avec ce type de moteur ?

Savez-vous où on achète des fils électriques ?

J'ai aussi acheté un capteur infrarouge :
http://www.lextronic.fr/P1749-telemetre-infrarouge-sharp-gp2d120.html

Si vous avez un exemple de programme pour ça, merci.


Merci de votre aide.

#2 philou-RX

philou-RX

    Habitué

  • Membres
  • PipPip
  • 261 messages
  • Gender:Male
  • Location:Riviera - Vaudoise

Posté 04 juillet 2011 - 06:12

Bonsoir à tous,

Je ne suis pas du tout un expert en Arduino, et ca fait longtemps que je me suis pas mis à la prog micro, mais il me semble que dans ton programme, tu n'as pas de fonction "main" (page principale) qui commande l'appel de toutes des fonctions,...

Attends quand même la réponse des autres membres du fofo, mais c'est un début de solution.

Amicalement Philou
Amicalement PHILOU QUI a BU, BOIRA !!! VU euh non BU! alcoolique non, assoiffé OUI^^ :P :|

#3 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 04 juillet 2011 - 07:53

Bonjour

Essais ce code qui a été écrit à la fois pour les mêmes moteurs mais également pour les télémètres Sharp

Il est possible que tu doivent le modifier car le modèle de Sharp n'est pas le même donc la formule multiplicatrice doit être différente.
Par contre, il comporte également des lignes de code pour des µrupteurs que tu pourras facilement les désactiver.

/*
1er programme de Mon-Robot_1
Ce programme fait tourner les roues en marche avant
si l'un des deux µrupteurs est fermé, la roue oposée au coté du µrupteur tourne en sens inverse pendant 1 seconde
Un télémetre regle la vitesse des roues en marche avant
Plus le Télémetre est proche d'un obstacle plus la vitesse reduit
Plus l'obstacle est loin du télémetre plus les moteurs tournent vite.
la vitesse des roues en marche arrierre est fixée à 75 soit la vitesse minimum
*/

int pwm_a = 3;  //Controle du PWM du moteur 1 sur la Pin Num 3
int pwm_b = 11;  //Controle du PWM du Moteur 2 sur la pin Num 11
int dir_a = 12;  //Controle de direction du moteur 1 Sur la pin Num 12
int dir_b = 13;  //Controle de direction du moteur 1 Sur la pin Num 13
int Sw_1 = 10;  //Controle du switcj de direction du moteur 1 Sur la pin Num 10
int Sw_2 = 9;   //Controle du switch de direction du moteur 2 Sur la pin Num 9
int varSpeed = 255;

void setup()
{
  pinMode(pwm_a, OUTPUT);  //Declare la pin 3 en sortie
  pinMode(pwm_b, OUTPUT);  //Declare la pin 11 en sortie
  pinMode(dir_a, OUTPUT);  //Declare la pin 12 en sortie
  pinMode(dir_b, OUTPUT);  //Declare la pin 13 en sortie
  pinMode(Sw_1, INPUT);   //Declare la pin 10 en entrée
  digitalWrite(Sw_1, HIGH);   // PullUp
  pinMode(Sw_2, INPUT);   //Declare la pin 9 en entrée
  digitalWrite(Sw_2, HIGH);   // pullUp

  
  
  analogWrite(pwm_a, varSpeed);  //Demarre le moteur 1 en vitesse lente (10/255)  
  analogWrite(pwm_b, varSpeed);  //Demarre le moteur 2 en vitesse lente (10/255)
  Serial.begin(9600);
  
}

void loop()
{
  int val = analogRead(0);
  val = 65 * pow((val * 0.0048828125), -1.10);
  //val = map(val, 0, 1023, 75, 255);
  analogWrite(pwm_a, varSpeed);  //Demarre le moteur 1 en vitesse lente (10/255)  
  analogWrite(pwm_b, varSpeed);  //Demarre le moteur 2 en vitesse lente (10/255)
  varSpeed = val*2;
  digitalWrite(dir_a, LOW);  //Sens de rotation du moteur 1 Normal
  digitalWrite(dir_b, LOW);  //Sens de rotation du moteur 2 Normal
  //delay(1000);                // Les moteurs tounent 1 seconde
        Serial.print(digitalRead(Sw_1));
        Serial.print(digitalRead(Sw_2));
        Serial.print(digitalRead(varSpeed));
        /*
        Serial.print(digitalRead(pwm_a));
        Serial.print(digitalRead(pwm_<img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />);
        Serial.print(digitalRead(dir_a));
        Serial.print(digitalRead(dir_<img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />);
        */
       
 
  if (digitalRead(Sw_1) == LOW)  //Condition si Switch 1 Fermé
    {
      digitalWrite(dir_a, HIGH);  //Sens de rotation du moteur 1 inversé
      digitalWrite(dir_b, LOW);  //Sens de rotation du moteur 1 inversé
      varSpeed = 75;
      analogWrite(pwm_a, varSpeed);  //Demarre le moteur 1 en vitesse lente (10/255)  
      analogWrite(pwm_b, varSpeed);  //Demarre le moteur 2 en vitesse lente (10/255)
      delay(500);    // Les moteurs tournent 1 seconde
        Serial.print(digitalRead(Sw_1));
        Serial.print(digitalRead(Sw_2));
        Serial.print(digitalRead(varSpeed));
       /* 
        Serial.print(digitalRead(pwm_a));
        Serial.print(digitalRead(pwm_<img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />);
        Serial.print(digitalRead(dir_a));
        Serial.print(digitalRead(dir_<img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />);
        */

       
    }

  if (digitalRead(Sw_2) == LOW)  //Condition si Switch 2 Fermé
    {
      digitalWrite(dir_a, LOW);  //Sens de rotation du moteur 1 inversé
      digitalWrite(dir_b, HIGH);  //Sens de rotation du moteur 1 inversé
      varSpeed = 75;
      analogWrite(pwm_a, varSpeed);  //Demarre le moteur 1 en vitesse lente (10/255)  
      analogWrite(pwm_b, varSpeed);  //Demarre le moteur 2 en vitesse lente (10/255)
      delay(500);    // Les moteurs tournent 1 seconde
        Serial.print(digitalRead(Sw_1));
        Serial.print(digitalRead(Sw_2));
        Serial.print(digitalRead(varSpeed));
       /* 
        Serial.print(digitalRead(pwm_a));
        Serial.print(digitalRead(pwm_<img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />);
        Serial.print(digitalRead(dir_a));
        Serial.print(digitalRead(dir_<img src='http://www.robot-maker.com/forum/public/style_emoticons/<#EMO_DIR#>/cool.gif' class='bbc_emoticon' alt='B)' />);
        */
    }

  
 // digitalWrite(dir_a, HIGH);  //Sens de rotation du moteur 1 inversé
  //digitalWrite(dir_b, LOW);  //Sens de rotation du moteur 1 inversé
  //delay(1000);               // Les moteurs tournent 1 seconde
  
  //analogWrite(pwm_a, 150);   //Demarre le moteur 1 en vitesse rapide (150/255)
  //analogWrite(pwm_b, 150);   //Demarre le moteur 2 en vitesse rapide (150/255)
  //delay(1000);               // Les moteurs tounent 1 seconde
  
  //digitalWrite(dir_a, LOW);  //Sens de rotation du moteur 1 Normal
  //digitalWrite(dir_b, HIGH);  //Sens de rotation du moteur 2 Normal
  //delay(1000);                // Les moteurs tournent 1 seconde
  
  //analogWrite(pwm_a, 100);  //Demarre le moteur 1 en vitesse moyene (100/255)
  //analogWrite(pwm_b, 100);  //Demarre le moteur 2 en vitesse moyene (100/255)
  //delay(1000);              // Les moteurs tournent 1 seconde
}

Cdlt
Yves

 


#4 Jbot

Jbot

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 801 messages
  • Gender:Male
  • Location:Paris

Posté 05 juillet 2011 - 09:24

La vraie question est :
As tu un controlleur de moteur ? (pour envoyer de la puissance au moteur)

Une arduino seule ne peut pas piloter un moteur, il faut une interface de puissance entre les deux.


Malédiction du Créatif :
Plus vous avez d’idées et moins vous arrivez à les structurer.





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

0 members, 0 guests, 0 anonymous users