Code de recherche

Leçon 89 : Utilisation d'un servomoteur continu ou 360 | Cours Arduino Pas à Pas

Leçon 89 : Utilisation d'un servomoteur continu ou 360 | Cours Arduino Pas à Pas

Avez-vous déjà souhaité faire tourner un moteur dans les deux sens aussi longtemps que vous le voulez, plutôt que de simplement balayer d'avant en arrière comme un servo standard ? C'est exactement ce qu'offre un servomoteur continu ou à 360 degrés. Contrairement à un servo standard qui se déplace vers un angle spécifique (généralement de 0 à 180 degrés), un servo continu tourne indéfiniment dans le sens horaire ou antihoraire. Cela le rend parfait pour construire de petits robots, des plateformes de caméra, ou tout projet nécessitant un contrôle de rotation continue.

Dans ce projet, nous allons construire un système de contrôle pour un servo à 360 degrés en utilisant seulement trois boutons poussoirs. Vous pourrez commander au servo de tourner dans le sens horaire, antihoraire, ou de s'arrêter à tout moment. Ce guide vous expliquera le câblage, détaillera les parties configurables du code, et vous montrera une démonstration en direct du système en action.

Voici quelques idées pratiques pour utiliser un servo continu dans vos propres projets :

  • Construire un petit robot à deux roues : Utilisez deux servos continus pour entraîner les roues, permettant des mouvements avant, arrière et des virages.
  • Créer un support de caméra panoramique et inclinable : Utilisez un servo continu pour un panoramique lent et infini d'une caméra de sécurité ou de surveillance animalière.
  • Automatiser un tapis roulant : Contrôlez un petit système de convoyeur pour trier ou distribuer des articles.
  • Concevoir un présentoir rotatif : Mettez en valeur un modèle 3D ou un produit sur une plateforme qui tourne en continu.

Matériel requis

  • Carte Arduino (Uno, Nano, etc.)
  • Servomoteur continu (360 degrés) (par exemple, FS90R, DS04-NFC)
  • 3 boutons poussoirs
  • Fils de connexion
  • Plaque d'essai (breadboard)

Guide de câblage

Le câblage de ce projet est simple. Le servomoteur a trois fils : généralement un foncé pour la masse (GND), un du milieu (souvent rouge) pour l'alimentation (5V), et un plus clair (orange, jaune ou blanc) pour le signal. Comme montré dans la vidéo, le servo est câblé à l'Arduino comme suit :

  • Masse du servo (fil foncé) : Connectez à la broche GND de l'Arduino.
  • Alimentation du servo (fil du milieu/rouge) : Connectez à la broche 5V de l'Arduino.
  • Signal du servo (fil clair) : Connectez à la broche 9 de l'Arduino.

Pour les trois boutons poussoirs, chaque bouton a deux côtés. Un côté de tous les boutons est connecté ensemble puis à la broche GND de l'Arduino. L'autre côté de chaque bouton est connecté à une broche numérique séparée, comme décrit ci-dessous (dans la vidéo à 03:40) :

  • Bouton sens horaire (CW) : Connectez à la broche 2 de l'Arduino.
  • Bouton Stop : Connectez à la broche 3 de l'Arduino.
  • Bouton sens antihoraire (CCW) : Connectez à la broche 4 de l'Arduino.
360 servo 3 push button wiring

Explication du code

Le code est conçu pour être facilement configurable. La partie la plus importante que vous devrez ajuster est le tableau sc[], qui contient les valeurs PWM spécifiques envoyées au servo pour contrôler ses actions. Ces valeurs ne sont pas universelles et doivent être calibrées pour votre servomoteur spécifique (dans la vidéo à 12:23).

int sc[]={106, 58, 0};// les commandes du servo sont dans l'ordre
        //CCW, STOP, CW

Ce tableau est le cœur du calibrage. Les valeurs sont utilisées dans cet ordre :

  • sc[0] = 106 : Cette valeur est envoyée pour faire tourner le servo dans le sens antihoraire.
  • sc[1] = 58 : C'est la valeur "stop". En raison du circuit interne, la valeur exacte qui arrête le moteur varie. Vous constaterez peut-être que votre servo tourne lentement même lorsque cette commande est envoyée, et vous devrez ajuster ce nombre légèrement pour trouver la véritable valeur "d'arrêt complet" pour votre moteur.
  • sc[2] = 0 : Cette valeur fait tourner le servo dans le sens horaire à vitesse maximale.

Vous pouvez ajuster les valeurs dans le tableau sc[] pour modifier la vitesse de rotation. Par exemple, définir sc[0] à 70 rendra la rotation antihoraire plus lente. Plus une valeur est proche de la valeur "stop" (58), plus le moteur tournera lentement dans cette direction. Les valeurs plus éloignées de 58 augmenteront la vitesse jusqu'à une limite maximale.

Il y a aussi quelques autres variables clés que vous devrez peut-être modifier. Le servoPin est défini sur 9, qui doit être une broche compatible PWM sur votre Arduino. Les broches des boutons sont définies en haut du code et peuvent être changées si nécessaire.

int servoPin = 9;// cette broche doit être une de celles avec PWM ~

#define STOPpin 3 // broche du bouton poussoir pour STOP
#define CWpin 2 //  bouton poussoir pour CW
#define CCWpin 4 // bouton poussoir pour CCW

Enfin, le tableau scText[] contient les chaînes imprimées sur le moniteur série pour le débogage. Vous pouvez les modifier si vous souhaitez afficher des messages différents.

Comment utiliser le code

Téléversez le code fourni sur votre carte Arduino. Ouvrez le moniteur série (réglé à 9600 bauds) pour voir les messages de statut. Vous pouvez maintenant contrôler le servo à l'aide des trois boutons :

  • Appuyez et maintenez le bouton CW : Le servo commencera à tourner dans le sens horaire. Le moniteur série affichera "CW" et la valeur envoyée.
  • Appuyez et maintenez le bouton CCW : Le servo commencera à tourner dans le sens antihoraire. Le moniteur série affichera "CCW" et la valeur envoyée.
  • Appuyez sur le bouton Stop : Le servo tentera de s'arrêter. Le moniteur série affichera "Stop".

Si votre servo ne s'arrête pas complètement lorsque vous appuyez sur le bouton Stop, vous devrez calibrer la valeur sc[1] dans le tableau sc[]. Essayez de modifier légèrement la valeur (par exemple, de 58 à 54 ou 52) et rechargez le code jusqu'à ce que le moteur reste parfaitement immobile.

Démonstration en direct

Dans la vidéo, le présentateur démontre le système complet. Vous pouvez voir le servo tourner dans les deux directions en fonction des pressions sur les boutons. La sortie du moniteur série est également affichée, montrant l'état actuel ("CW", "Stop" ou "CCW") et la valeur spécifique envoyée au servo. C'est un excellent outil pour déboguer et trouver les valeurs de calibration parfaites pour votre moteur spécifique. La démonstration montre également comment l'ajustement des valeurs dans le tableau sc[] affecte directement la vitesse du moteur, d'une lente progression à sa vitesse de rotation maximale.

Conclusion

Ce projet offre un moyen simple et efficace de contrôler un servomoteur à rotation continue. En comprenant le processus de calibration de la valeur "stop", vous pouvez garantir un contrôle précis dans vos propres projets de robotique et d'automatisation.

Chapitres vidéo

  • [00:05] Introduction au servomoteur à rotation continue
  • [02:02] Aperçu matériel du servo
  • [02:40] Schéma de câblage et connexions
  • [05:07] Explication du code : variables et configuration
  • [08:03] Explication du code : logique de la boucle principale
  • [09:56] La fonction servoCommand()
  • [10:54] Démonstration en direct et sortie du moniteur série
  • [12:23] Calibration de la vitesse du servo et des valeurs d'arrêt

Images

360 servo 3 push button wiring
360 servo 3 push button wiring
209-How to control a 360 servo with push buttons
Langue: C++
++
/*
 *  S05-13 Servo with 3 push buttons
 *  Demonstration of Controlling a Continuous Servo (360 servo)
 *  This code allows you to control a 360-degree servo using push buttons
 *
 * Modified by Ahmad Shamshiri for Robojax Robojax.com
 * on Jan 17, 2019 at 22:42 in Ajax, Ontario, Canada
 Watch the video instruction for this sketch: https://youtu.be/hVe4TSRV4ww

 Watch Introduction to  360 Servo video with code: https://youtu.be/b_xvu6wWafA
 You can get the wiring diagram from my Arduino Course at Udemy.com
 Learn Arduino step by step with all libraries, codes, and wiring diagrams all in one place
 visit my course now http://robojax.com/L/?id=62

 If you found this tutorial helpful, please support me so I can continue creating
 content like this. 
 or make a donation using PayPal http://robojax.com/L/?id=64

 Original code by BARRAGAN <http://barraganstudio.com>
 *
 * Code is available at http://robojax.com/learn/arduino

 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int servoPin = 9;// this pin must be one of those with PWM ~


#define STOPpin 3 // push button pin  for STOP
#define CWpin 2 //  push button for CW
#define CCWpin 4 // push button for CCW

int sc[]={106, 58, 0};// servo commands are in order
        //CCW, STOP,CW

String scText[]={"CCW","Stop","CW"};// define texts for 3 actions
int statusText;
int CWBS, CCWBS, SBS;
      //CW button status (CWBS)
      //CCW button status (CCWBS)
      //stop button status (SBS)

void setup() {
  Serial.begin(9600);
  pinMode(STOPpin,INPUT_PULLUP);// set pin for push button STOP
  pinMode(CCWpin,INPUT_PULLUP);// set pin for push button CCW
  pinMode(CWpin,INPUT_PULLUP);// set pin for push button CW

  myservo.attach(servoPin);  // attaches the servo on pin 9 to the servo object
  myservo.write(sc[1]);// send STOP command
  statusText=1;// initial value is STOP
}



void loop() {

    CCWBS = digitalRead(CCWpin);// read status of button CCW
    SBS = digitalRead(STOPpin);// read status of button STOP
    CWBS = digitalRead(CWpin);// read status of button CW

    if(CCWBS ==LOW)
    {
      servoCommand(0);
    }else if(SBS ==LOW)
    {
      servoCommand(1);
    }else if(CWBS ==LOW)
    {
      servoCommand(2);
    }

  Serial.println(scText[statusText]);
  delay(50);
}// loop



void servoCommand(int n)
{
   statusText = n;
   myservo.write(sc[n]);
   Serial.print("Going to  ");
   Serial.print(scText[n]);
   Serial.print( "(");
   Serial.print(sc[n]);
   Serial.println(")");
}

Ce dont vous pourriez avoir besoin

Ressources et références

Fichiers📁

Autres fichiers