Contrairement aux servo-moteurs habituels, le modèle de Nikko, dispose de 6 fils. La première chose à faire est donc de déterminer à quoi peuvent bien servir une telle collection !
Je démonte avec précaution en enlevant les 4 vis situées au dessous du moteur.
Une fois démonté, c’est plus simple. En réalité on comprend assez facilement qu’il s’agit d’un simple moteur à courant continu largement démultiplié avec un ensemble d’engrenages (kit de motoréducteur) et le tout est relié à un potentiomètre.
Pour piloter le moteur, il suffit d’alimenter ce dernier avec une tension de 6V. L’ensemble d’engrenage assure ensuite la transmission d’un couple important mais empêche le moteur de réaliser des tours complets. Le moteur que j’utilise permet un angle de 120° environ. En inversant la polarité aux bornes du moteur, ce dernier tourne dans le sens inverse.
Lorsque le moteur tourne, il entraine la rotation du potentiomètre. Le rôle de ce dernier est simplement de retourner une valeur de résistance qui varie proportionnellement à la position courante du moteur.
Le code couleur des fils le suivant :
Noir : alimentation moteur
Orange : alimentation moteur
Bleu : antiparasite relié à la carcasse
Blanc milieu du potentiomètre
Vert : extrémité du potentiomètre
Jaune : extrémité du potentiomètre
La consommation maximum du moteur est mesurable lorsque le moteur est bloqué (forcé en position maximum). Le mien consomme environ 0,7A. C’est trop pour le brancher directement à une carte Arduino directement.
Pour connecter ce Servo-moteur, j’utilise simplement un pont en H. Le L9110(environ 2€) fera l’affaire. Il sera alimenté par l’alimentation du servo-moteur.
La commande du pont en H se fera par 2 pin capable de faire du PWM de la carte Arduino (pin10 et Pin11 dans le code donné en exemple).
- Les deux extrémités du potentiomètre (fils vert et jaune) sont reliés aux bornes de l’alimentation du servo-moteur (la polarité n’a pas d’importance).
- Le milieu du potentiomètre (fil blanc) est relié à une pin analogique de la carte Arduino (A0 dans le code donné en exemple).
- Les bornes du moteur (fils noir et orange) sont reliés aux sorties du pont en H
- L’antiparasite peut être connecté à la masse de l’alimentation du servo-moteur.
Pour finir, il ne faut pas oublier de relier la masse de l’alimentation du servo-moteur à la masse de la carte Arduino (masse commune).
Le code suivant met en oeuvre le servo-moteur de type Nikko (6fils) avec le programme de type "essuie-glace" : Le Servo moteur tourne dans un sens puis dans le sens opposé et recommence.
/*
auteur : Frédéric RALLO
mise en oeuvre d'un servo-moteur de type Nikko (6fils).
Essuie-glace : Le Servo moteur tourne dans un sens puis dans le sens opposé et recommence
ATTENTION, il faut utliser un pont en H comme le L9110 par exemple
connextion de l'Arduino
PIN 10 (output PWM) : pont en H (IN1a)
PIN 11 (output PWM) : pont en H (IN2a)
PIN A0 (input) : potentiomètre (fil blanc) du servo-moteur
connextion du pont en H
IN1a <-- PIN 10 (pilotage en PWM)
IN2a <-- PIN 11 (pilotage en PWM)
VCC <-- +6V servo-moteur (ATTENTION ne par relié à la carte Arduino)
GND w-- GND servo-moteur (ATTENTION MASSE COMMUNE avec Arduino + Alim Servo)
connexion des fils du servo-moteur :
Noir : alimentation moteur (6V, 0,7A via pont en H IN1a)
Orange : alimentation moteur (6V, 0,7A via pont en H IN2a)
Bleu : antiparasite relié à la carcasse (GND)
Blanc milieu du potentiomètre
Vert : extrémité du potentiomètre (GND ou 6V)
Jaune : extrémité du potentiomètre (GND ou 6V)
*/
int const INFO = A0;
int const IN1 = 10;
int const IN2 = 11;
int const SEUIL_HAUT = 500;
int const SEUIL_BAS = 200;
int const VITESSE_FONCTIONNEMENT_SERVO = 100;
int const EPSILON = 5;
int position_servo;
int old_val = -1;
// initialisation
void setup() {
// la carte arduino envoie un signal en sortie (output).
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(INFO, INPUT);
Serial.begin(9600);
}
// retourne la position (moyenne sur 10 lectures)
int pos_servo(){
long pos = 0L;
for (int i=0 ; i<10 ; i++){
pos = pos+ analogRead(INFO);
}
return pos/10;
}
// boucle infinie
void loop() {
Serial.println("------------------------- ALLER");
analogWrite(IN1, VITESSE_FONCTIONNEMENT_SERVO);
digitalWrite(IN2, LOW);
do {
//position_servo = analogRead(INFO);
position_servo = pos_servo();
if ( abs(old_val-position_servo)>EPSILON ) Serial.println(position_servo);
old_val = position_servo;
delay(1);
}while(position_servo < SEUIL_HAUT);
Serial.println(" ------------------------- RETOUR");
digitalWrite(IN1, LOW);
analogWrite(IN2, VITESSE_FONCTIONNEMENT_SERVO);
do {
position_servo = pos_servo();
if ( abs(old_val-position_servo)>EPSILON ) Serial.println(position_servo);
old_val = position_servo;
delay(1);
}while(position_servo > SEUIL_BAS);
}
Il reste à modifier les valeurs des seuil selon les besoins de l’application. Pour l’asservissement, il faut lire la valeur retourné par le potentiomètre. Cette dernière (comprise entre SEUIL_BAS et SEUIL_HAUT) indique la position courante du moteur. Il est alors possible de réaliser un asservissement.