Piloter un servo-moteur avec le kit HiFive1 à cœur Risc-V

Pour prendre la main sur une nouvelle plate-forme électronique, la manip de base (hello world) est de faire clignoter une led. C’est vrai qu’avec une simple led on peut déjà «afficher» quelques informations, il suffit pour cela de la faire clignoter de plusieurs manières différentes pour obtenir l’état du système que l’on veut connaître.

C’est simple, c’est visuel et c’est rigolo. Seulement c’est vraiment très basique et on pourrait innover un peut dans le «Hello World de l’électronique». Par exemple en faisant bouger un servomoteur !

Le signal de commande d’un servo-moteur est assez simple, il faut envoyer une pulsation de largeur 1ms (min) à 2 ms (max) toute les 20ms.

Si on utilise un petit servo-moteur en 5v comme celui-là en plus, il suffit de l’alimenter par le 5 volt du kit et ça roule.

On trouve des propositions de montages pour piloter des servomoteurs sur le site d’arduino, mais le code donné ne fonctionne pas (encore?) avec le HiFive1 puisque la bibliothèque Servo n’est pas implémentée pour le Risc-V.

Avec un microcontrôleur comme le Hifive1 même pas besoin d’utiliser des trucs compliqués comme les PWM ou les timer. En effet le core pédale tellement vite (320Mhz) qu’une simple commutation dans la boucle principale avec des délais bien ajustés suffisent à générer le signal de pilotage correctement.

Pour un essais rapide, on peut simplement utiliser l’IDE d’arduino comme je l’avais expliqué dans un précédent article.

La fonction générant le signal utilise des delayMicroseconds():

void servo(int pos){
  digitalWrite(pwmpin, HIGH);
  delayMicroseconds(pos);
  digitalWrite(pwmpin, LOW);
  delayMicroseconds(16000); 
  delayMicroseconds(4000); 
}

D’après la doc la fonction de delaymicroseconds ne peut pas attendre plus de 16383 microsecondes. Du coup pour dépasser les 20ms on va l’appeler deux fois 😉

Le «pilotage» du servo se fait via une entrée bouton, quand on appui sur le bouton le servomoteur est en position minimal et quand on relâche le bouton le servomoteur se met en position maximal.


  if (readbtn == HIGH) {
   servo(1000);
  } else {
   servo(2000);
  }

Le code complet:


int pwmpin = 9; // pwm servo pin
int btnpin = 7; // «input button»
int readbtn = LOW;

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(pwmpin, OUTPUT);
  pinMode(btnpin, INPUT);
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
}

void servo(int pos){
  digitalWrite(pwmpin, HIGH);
  delayMicroseconds(pos);
  digitalWrite(pwmpin, LOW);
  delayMicroseconds(16000); 
  delayMicroseconds(8000); 
}

// the loop function runs over and over again forever
void loop() {
  readbtn = digitalRead(btnpin);
  if (readbtn == HIGH) {
   servo(1000);
  } else {
   servo(2000);
  }
}

Une petite vidéo du fonctionnement du montage :

Voila, c’était rigolo de bidouiller le kit HiFive1 avec l’IDE playscool d’arduino, mais maintenant il va falloir passer à des trucs plus sérieux en utilisant du code C (puis assembleur) via la toolchain gnu de compilation.

À suivre donc…

Ce contenu a été publié dans électronique, programmation, avec comme mot(s)-clé(s) , , , . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *