Go Down

Topic: Mon petit projet Arduino :) (Read 2 times) previous topic - next topic

Tw1nseN

Hello tout le monde ;)

Voilà j'ai depuis peu une carte Arduino UNO et j'aimerais dans un premier temps me construire un robot qui évite les obstacles.
Hier j'ai modifié deux servos pour qu'ils fonctionnent en rotation continue. Cependant j'ai remarqué qu'ils ne tournent pas tous les 2 à la même vitesse (j'ai suivi ce tuto http://www.robotix.fr/tutoriel-1-53-modification-dun-servomoteur-en-moteur-a-courant-continu.html) le neutre est correctement configuré et je ne vois pas trop ce qui cloche :/

Voici le programme que j'ai écrit pour le moment (il y a juste un potard qui permet de choisir entre 4 vitesses dont l'arrêt et un BP pour l'inversion du sens de rotation). Attention je ne suis pas un pro en C :p

Code: [Select]
#include <Servo.h>
Servo moteurGauche, moteurDroit;
int neutreGauche = 75, neutreDroit = 164;

void setup()
{
  moteurGauche.attach(9);
  moteurDroit.attach(10);
  pinMode(12, INPUT); //BP inversion
  pinMode(7, OUTPUT); //LED sens 1
  pinMode(8, OUTPUT); //LED sens 2
}

void loop()
{
  int sens = digitalRead(12);
  int vitesse = map(analogRead(A0),0,1023,0,3);
  rotationMoteur(moteurGauche,neutreGauche,sens,vitesse);
  rotationMoteur(moteurDroit,neutreDroit,sens,vitesse);
  delay(50);
}

void rotationMoteur(Servo servo, int neutre, int sens, int vitesse)
{
  int v[6] = {0,5,10,50};
 
  if (sens) {
    int out = neutre + v[vitesse];
    servo.write(out);
    digitalWrite(7, LOW);
    digitalWrite(8, HIGH);
  }
  else {
    int out = neutre - v[vitesse];
    servo.write(out);
    digitalWrite(7, HIGH);
    digitalWrite(8, LOW);
  }
}


Ensuite j'aimerais avoir votre avis concernant l'alimentation de mes servos. Pour le moment ils sont alimentés par la carte UNO mais je pense peut-être me faire un shield qui combinerait la gestion de l 'alimentation pour mes 2 servos (Je compte en rajouter plus tard pour éventuellement une pince ou gadget du genre) et une sorte de proto-shield. Reste à voir pour l'encombrement...

Voici à quoi ressemble mon "montage" pour le moment (qualité portable dsl) :



J'attends vos commentaires et critiques :)

AlienArea51

salut
as-tu calibré tes servos
car à moins de dire des conneries , je pense qu'il y a une ajustable sur le servo , quand tu déclare une valeur (d'arret des servos ) celles-ci ne doivent pas tourner ,si ce n'est pas le cas, il faut tourner le potar afin  d'avoir l'arret de celles-ci.
et pourquoi ne pas avoir pris des servos à rotation continue de chez parallax (pas plus cher) ??

mais ne prends pas ça pour argent comptant ,je dis peut-etre une bétise (je n'ai pas épluché ton programme)
@+
The truth is elsewhere !!

Tw1nseN

Salut ! :)

Je n'ai pas pris de servos parallax car je fais également de l'aéro/automodélisme et j'ai une floppée de vieux servos dont je ne me sers plus :p
Calibré mes servos ? En fait avec la méthode que j'ai linkée plus haut, on supprime le portard du servo et le remplace par un pont diviseur de tension.. Il faut ensuite déterminer le "neutre" du servo, quand il est à l'arrêt. Dans mon cas j'en ai un a 75° et un à 164° .

AlienArea51

pardon ,je m'incline  :smiley-roll: :smiley-roll:

toujours est-il quand tu declare le stop des servos ,est-ce que tes servos s'arretent ..
les parallax sont aussi des servos modifies ,ils ont gardé le potar ,et supprimé la butée mécanique (je crois !) (marque Futaba)
de mon coté j'ai ce bout de programme (pour parallax avec un potar sur une entrée ana qui modifie le sens de rotation)

Quote
#include <Servo.h>

Servo myservo;  // create servo object to control a servo

int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin

void setup()
{
   Serial.begin(9600);
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop()
{
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 650, 850);     //  use it with the Parallax servo (value between 650 and 850)
  myservo.write(val);                  // sets the servo position according to the scaled value
Serial.println(val);
  delay(15);                           // waits for the servo to get there
} /quote]

@+
The truth is elsewhere !!

fdufnews

#4
Feb 17, 2011, 09:37 am Last Edit: Feb 17, 2011, 09:40 am by fdufnews Reason: 1
Les 2 servos sont identiques?
Quote
Il faut ensuite déterminer le "neutre" du servo, quand il est à l'arrêt. Dans mon cas j'en ai un a 75° et un à 164°

L'écart entre les deux neutres donne à penser qu'ils sont assez différents dans leur performances et cela pourrait expliquer ton problème.
De toute façon, il ne faut pas se leurrer, tu ne trouveras jamais 2 moteurs qui tournent à la même vitesse. Il y aura toujours un décalage qui entrainera une dérive de ta plateforme.

Première étape tu peux faire 2 tables de vitesse (au lieu de ta table 0,5,10,50) pour essayer d'appairer de manière empirique la vitesse des moteurs.
La deuxième étape c'est de placer des codeurs sur les roues pour faire un asservissement de vitesse.

Tw1nseN

Oui, c'est 2 servos Futaba S3003. Faire une deuxième table j'y ai pensé oui... Je vais p-e être d'abord essayer de simplement obtenir deux vitesses identiques et on verra par après pour la faire varier... Dommage :(

Jean-François

Normalement les servos sont alimentés en 5 Volts, tu peux essayer de "sous" alimenter le servo qui va le plus vite.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Tw1nseN

Je viens de remplacer toutes mes résistances que j'ai mis à la place du pot. j'en ai mis 4 de 2K2 (comme dans le tuto, 2 par servo ^^ ) je trouve qu'ils tournent déjà un peu plus à la même vitesse mais par contre pour en stoper un, j'ai du mal car le neutre est pile etre 74 et 75. Que faire ? chercher dans les décimales pour l 'arrêt ?

Go Up