• Bonsoir, je me rends juste compte que les notifications des nouveaux messages étaient limitées aux membres actifs dans les 30 derniers jours. Donc, j'ai supprimé cette option. En espérant que vous aurez bien les notifications attendues. Merci pour votre patience. Yves

Godilleur avec Arduino

Lagaffe

Bricoleur DPLG
Coucou de Lagaffe,

J'ai terminé la partie mécanique de mon robot godilleur, j'aimerais automatiser le mouvement aller-retour du bras du bonhomme en utilisant un servo comme partie opérative.
Le servo doit effectuer des mouvements aller-retour, toujours de la même amplitude (impulsion servo en variation alternative entre 1200 et 1800 µs)
Ceci à partir d'une impulsion réception entre 1200 et 1800 µs pour régler la vitesse des allers-retours de 0 à 1 aller-retour/seconde environ.

Je dispose d'un Arduino, mais je n'y connais absolument rien en programmation, un peu d'aide serait bienvenue !

Une partie du programme pompée sur le net, ça fait bien des allers-retours, il ne reste plus qu'à exploiter la sortie du récepteur pour faire varier la fréquence.
http://arduino.cc/en/Tutorial/Sweep
 
Bien que tu n'aies pas joint les photos de ta réalisation, je te donne des éléments de solutions, pour faire avancer la science. :)

Il y a une fonction standard, appelée "PulseIn()", qui mesure le temps d'une impulsion, positive ou négative, le résultat est en microsecondes.

En lisant cette valeur et en faisant varier les "delay()" en conséquence dans l'exemple que tu as trouvé, tu fais varier la vitesse de déplacement. Plus la valeur de l'impulsion sera longue, plus la vitesse de déplacement doit être élevée ou vice versa, selon ton goût.

Je recopie ton exemple, en ajoutant en rouge ce qu'il faut modifier.

Code:
// Sweep
// by BARRAGAN <http://barraganstudio.com> 
// This example code is in the public domain.

#include <Servo.h> 
 
Servo myservo;  // create servo object to control a servo 
                // a maximum of eight servo objects can be created 
 
int pos = 0;    // variable to store the servo position 
[COLOR="red"]unsigned long duration;
int mydelay = 15;[/COLOR]
 
void setup() 
{ 
[COLOR="red"]  pinMode(7, INPUT);[/COLOR]
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
} 
 
void loop() 
{ 
[COLOR="Red"]  duration = pulseIn(7, HIGH, 25000);
  if (duration) {
    // compute here the delay, depending on the pulse duration
  }[/COLOR]
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay([COLOR="red"]mydelay[/COLOR]);                  // waits for the servo to reach the position 
  } 
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay([COLOR="red"]mydelay[/COLOR]);                  // waits for the servo to reach the position 
  } 
}
Il te reste à expérimenter pour trouver les bonnes valeurs de temporisation : plus la valeur de "delay()" sera élevée, plus la vitesse sera lente.

Tu peux aussi compliquer en lisant la valeur de l'impulsion de direction sur une autre broche et en faisant varier les bornes des boucles "for()", de 180 à 91 pour aller à droite et de 90 à 1 pour aller à gauche.
 
En cherchant j'ai réussi à comprendre qu'il fallait entrer l'impulsion en 7 et remplacer "mydelay" par "duration", en divisant la valeur par un nombre pifométrique.
Régler aussi les butées pour une course droite-gauche correcte.

Ce qui donne un programme qui fonctionne nickel !
Ya puka attendre que le vernis de l'aviron soit sec et l'Arduino va trouver sa place dans le sabot.
Par rapport au sabot de la photo j'ai rajouté un système pour la direction, avec au final une reproduction exacte du mouvement de la godille réelle.

JP tu es un as !


// Sweep
// by BARRAGAN <http://barraganstudio.com>
// This example code is in the public domain.

#include <Servo.h>

Servo myservo; // create servo object to control a servo
// a maximum of eight servo objects can be created

int pos = 0; // variable to store the servo position
unsigned long duration;
int mydelay = 15;

void setup()
{
pinMode(7, INPUT);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}

void loop()
{
duration = pulseIn(7, HIGH, 25000);
if (duration) {
// compute here the delay, depending on the pulse duration
}
for(pos = 60; pos < 120; pos += 1) // goes from 60 degrees to 120 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(duration/180); // waits for the servo to reach the position
}
for(pos = 120; pos>=60; pos-=1) // goes from 120 degrees to 60 degrees
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(duration/180); // waits for the servo to reach the position
}
}
 
Lagaffe;2258170 à dit:
En cherchant j'ai réussi à comprendre qu'il fallait entrer l'impulsion en 7 et remplacer "mydelay" par "duration", en divisant la valeur par un nombre pifométrique.
Régler aussi les butées pour une course droite-gauche correcte.

Ce qui donne un programme qui fonctionne nickel !
Ya puka attendre que le vernis de l'aviron soit sec et l'Arduino va trouver sa place dans le sabot.
Par rapport au sabot de la photo j'ai rajouté un système pour la direction, avec au final une reproduction exacte du mouvement de la godille réelle.

JP tu es un as !

Mon idée était de calculer le délai une seule fois, lorsque l'impulsion a été reçue, ce qui donne ce code :
Code:
void loop() 
{ 
  duration = pulseIn(7, HIGH, 25000);
  if (duration) {
    [COLOR="Red"]mydelay = duration / 180;[/COLOR]
  }
  for(pos = 60; pos < 120; pos += 1)  // goes from 60 degrees to 120 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay([COLOR="red"]mydelay[/COLOR]);                  // waits for the servo to reach the position 
  } 
  for(pos = 120; pos>=60; pos-=1)     // goes from 120 degrees to 60 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay([COLOR="red"]mydelay[/COLOR]);                  // waits for the servo to reach the position 
  } 
}
Nous attendons tous impatiemment la vidéo maintenant ! :)
 
Haut