Club robotique de Sophia-Antipolis

Accueil > Projets, études > Etudes techniques > Moteurs et performances > Servo moteur Nikko piloté par Arduino

Servo moteur Nikko piloté par Arduino

samedi 12 mars 2016, par Frédéric R.

J’ai récupéré une ancienne voiture télécommandée des années 80. Cette dernière est équipée d’un servomoteur Nikko. Il est simple à reconnaitre avec ses 6 fils !!! Mais comment l’exploiter depuis une carte Arduino ?

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.

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.