[Arduino] Réglage des bornes d’un servomoteur – Prototype 1

Je bricole depuis un moment avec des servo-moteurs et la partie la plus “délicate” avec ces petites bêtes est le réglage de la valeur basse et haute du servo.
Pour avoir un vrai 180° et le servo qui ne force pas à 0 et 180°, il convient de régler ces bornes.
Sur Arduino lorsque ‘on “attache” le servo de façon logicielle, il est possible de définir manuellement ces largeurs minimales (544 par défaut) et maximales (2400 par défaut) de l’impulsion (du PWM).

1
2
3
4
5
Servo monServo;
 
setup() {
  monServo.attach(pinServo, min, max);
}


Avec les servos analogiques (et certainement les pas chers de chez Alibaba ou Ebay) ces valeurs ne sont pas toujours justes, il convient donc de les ajuster et ce de façon généralement empirique.

Après presque 2 années de manip. à la “vas-y que j’te pousse”, je me suis remonté les brettelles et j’ai décidé de me bricoler un petit montage avec:
- un inté,
- un potar,
- une breadboard.

Rien de tonitruant, juste un montage facile et surtout un bout de programme qui va bien pour tester tranquillement les bornes.

plan de la bête

Donc le principe est simple:
- L’interrupteur sert à décider si on ajuste la valeur haute ou la valeur basse du servo (le servo se place sur l’angle correspondant, 0° ou 180°). Dans le code, je mets les Pin 2 et 3 en entrée et je les mets à 5v (pull up). Quand on ferme le circuit, la lecture donne “1”…
- Le potar permet de naviguer entre -200 et +200 autour de la valeur par défaut. On peut modifier pour diminuer l’amplitude et avoir une plus grande précision du potar. Pour la part, j’ai un potar à 190°, pas très fin donc mais suffisant pour dégrossir.
- Les valeurs du potar sont mémorisées et affichées en permanence (via le Serial Monitor).
- mise à jour des données toutes les demi secondes (500 ms) pour pas gaver l’usb.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/*
 codé par mrbbp
 le 13 oct 2012
 */
 
#include <Servo.h>
 
int sensorValue = 0;  // variable to store the value coming from the sensor
int valeurRetouchee;
Servo servo;
int sMin= 544;
int sMax= 2400;
// pins
int sensorPin = A0;
int pinMax= 2;
int pinMin = 3;
int vRMin = 0;
int vRMax = 0;
 
void setup() {
  // pour debug
  Serial.begin(9600);
  //attache servo
  servo.attach(9, sMin, sMax);
  servo.write(90);
  delay(500);
  // declare entrées inte
  pinMode(pinMin, INPUT);
  pinMode(pinMax, INPUT);
  // pullUp
  digitalWrite(pinMin, HIGH);
  digitalWrite(pinMax, HIGH);
}
 
void loop() {
  // lecture du potar
  sensorValue = analogRead(sensorPin);
 if (digitalRead(pinMin) == HIGH) {
    vRMin =  map (sensorValue, 0, 1023, -200, 200);
    servo.attach(9, sMin+vRMin,  sMax+vRMax);
    delay(50);
    servo.write(0);
    delay(100);
    Serial.print("MIN= ");
    Serial.print(sMin+vRMin);
    Serial.print(" - max= ");
    Serial.println(sMax+vRMax);
  } else {
    vRMax =  map (sensorValue, 0, 1023, -200, 200);
    servo.attach(9, sMin+vRMin, sMax+vRMax);
    delay(50);
    servo.write(180);
    delay(100);
    Serial.print("min= ");
    Serial.print(sMin+vRMin);
    Serial.print(" - MAX= ");
    Serial.println(sMax+vRMax);
  }
  delay(500);
  servo.detach();
}

Le système ne fonctionne qu’avec un seul potar mais il serait sans doute plus judicieux d’en avoir deux (un pour chaque borne), n’en ayant qu’un sous le coude, j’ai préféré faire avec et ajouter un inté (que j’avais ;) ) qui bascule d’une valeur à l’autre. Ça a le défaut de modifier la valeur encours au switch, puisque le potar n’est pas sensé être à la même position entre les deux bornes… bref.

photos du montage

J’utilise une Uno pour le truc mais un attiny85 suffirait amplement, le sketch pèse 5244 octets. Il est sans doute possible de le réduire en utilisant le print(F()).
On devrait pouvoir également utiliser un petit lcd 2×16 en I2C (une quinzaine d’euros) pour rendre indépendant de l’ordinateur… et afficher les valeurs encours.
J’aime bien les lcd en I2C, c’est facile à piloter et à brancher :) .

Si j’ai du courage et acheté les potars, je fabriquerai une version plus complète avec:
- un lcd 2×16 pour afficher les valeurs.
- 2 potars pour le réglage des valeurs de butée
- 1 potar pour l’angle ou un inté. 3 positions -> 0°, 90°(neutre), 180°
- une alim externe ou pile -> donc un interrupteur ON/OFF
- le tout dans une jolie boite de cigare ave des étiquettes dessus.


À propos de cet article