.. note:: Bonjour, bienvenue dans la communauté des passionnés de SunFounder Raspberry Pi, Arduino et ESP32 sur Facebook ! Explorez plus en profondeur le Raspberry Pi, l'Arduino et l'ESP32 avec d'autres passionnés. **Pourquoi nous rejoindre ?** - **Support d'experts** : Résolvez les problèmes post-vente et relevez les défis techniques grâce à l'aide de notre communauté et de notre équipe. - **Apprendre et partager** : Échangez des astuces et des tutoriels pour perfectionner vos compétences. - **Aperçus exclusifs** : Bénéficiez d'un accès anticipé aux nouvelles annonces de produits et aux avant-premières. - **Réductions spéciales** : Profitez de réductions exclusives sur nos nouveaux produits. - **Promotions festives et cadeaux** : Participez à des concours et promotions spéciales pendant les fêtes. 👉 Prêt à explorer et à créer avec nous ? Cliquez sur [|link_sf_facebook|] et rejoignez-nous dès aujourd'hui ! 1.3.2 Servo =============== Introduction ---------------- Dans cette leçon, nous allons apprendre à faire tourner le servomoteur. Composants ------------- .. image:: img/list_1.3.2.png Principe ----------- **Servomoteur** Un servomoteur est généralement composé des parties suivantes : un boîtier, un arbre, un système d'engrenages, un potentiomètre, un moteur à courant continu (DC) et une carte embarquée. .. image:: img/image121.png Son fonctionnement est le suivant : Le microcontrôleur envoie des signaux PWM (modulation de largeur d'impulsion) au servomoteur, puis la carte intégrée dans le servomoteur reçoit les signaux via la broche de signal et contrôle le moteur interne pour tourner. Par conséquent, le moteur entraîne le système d'engrenages, qui à son tour actionne l'arbre après une réduction de vitesse. L'arbre et le potentiomètre du servomoteur sont reliés ensemble. Lorsque l'arbre tourne, il entraîne le potentiomètre, ce qui permet au potentiomètre de sortir un signal de tension vers la carte intégrée. Ensuite, la carte détermine la direction et la vitesse de rotation en fonction de la position actuelle, afin qu'il puisse s'arrêter précisément à la position définie et s'y maintenir. .. image:: img/image122.png L'angle est déterminé par la durée d'une impulsion appliquée au fil de commande. C'est ce qu'on appelle la modulation de largeur d'impulsion (PWM). Le servomoteur s'attend à recevoir une impulsion toutes les 20 ms. La durée de l'impulsion déterminera jusqu'où le moteur tourne. Par exemple, une impulsion de 1,5 ms fera tourner le moteur à la position de 90 degrés (position neutre). Lorsque l'impulsion envoyée est inférieure à 1,5 ms, le servomoteur tourne vers une position et maintient son arbre de sortie à un certain nombre de degrés dans le sens antihoraire par rapport au point neutre. Lorsque l'impulsion est supérieure à 1,5 ms, l'effet inverse se produit. La largeur minimale et maximale de l'impulsion pour commander le servomoteur à se déplacer vers une position valide dépend de chaque servomoteur. En général, l'impulsion minimale sera d'environ 0,5 ms et l'impulsion maximale sera de 2,5 ms. .. image:: img/image123.jpeg Schéma de câblage ----------------------- .. image:: ../img/image337.png Procédure expérimentale --------------------------- **Étape 1 :** Construisez le circuit. .. image:: ../img/image125.png **Étape 2 :** Accédez au dossier contenant le code. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/c/1.3.2 **Étape 3 :** Compilez le code. .. raw:: html .. code-block:: gcc 1.3.2_Servo.c -lwiringPi **Étape 4 :** Exécutez le fichier compilé. .. raw:: html .. code-block:: sudo ./a.out Une fois le programme exécuté, le servomoteur tournera de 0 à 180 degrés, puis de 180 à 0 degrés, de manière circulaire. .. note:: Si le programme ne fonctionne pas après l'exécution ou si un message d'erreur s'affiche : « wiringPi.h: No such file or directory », veuillez vous référer à :ref:`faq_c_nowork`. **Code** .. code-block:: c #include #include #include #define ServoPin 1 // définit le servomoteur sur GPIO1 long Map(long value, long fromLow, long fromHigh, long toLow, long toHigh){ return (toHigh-toLow)*(value-fromLow) / (fromHigh-fromLow) + toLow; } void setAngle(int pin, int angle){ // Crée une fonction pour contrôler l'angle du servomoteur. if(angle < 0) angle = 0; if(angle > 180) angle = 180; softPwmWrite(pin, Map(angle, 0, 180, 5, 25)); } int main(void) { int i; if(wiringPiSetup() == -1){ // en cas d'échec de l'initialisation de wiringPi, affiche un message d'erreur à l'écran printf("setup wiringPi failed !"); return 1; } softPwmCreate(ServoPin, 0, 200); // initialise la broche PWM pour le servomoteur while(1){ for(i=0;i<181;i++){ // fait tourner le servomoteur de 0 à 180 degrés. delay(2); } delay(1000); for(i=181;i>-1;i--){ // fait tourner le servomoteur de 180 à 0 degrés. delay(2); } delay(1000); } return 0; } **Explication du code** .. code-block:: c long Map(long value,long fromLow,long fromHigh,long toLow,long toHigh){ return (toHigh-toLow)*(value-fromLow) / (fromHigh-fromLow) + toLow; } Crée une fonction `Map()` pour mapper la valeur dans le code suivant. .. code-block:: c void setAngle(int pin, int angle){ // Crée une fonction pour contrôler l'angle du servomoteur. if(angle < 0) angle = 0; if(angle > 180) angle = 180; softPwmWrite(pin, Map(angle, 0, 180, 5, 25)); } Crée une fonction `setAngle()` pour écrire l'angle du servomoteur. .. code-block:: c softPwmWrite(pin,Map(angle,0,180,5,25)); Cette fonction permet de modifier le cycle de service du PWM. Pour faire tourner le servomoteur de 0 à 180°, la largeur d'impulsion doit varier dans la plage de 0,5 ms à 2,5 ms lorsque la période est de 20 ms ; dans la fonction `softPwmCreate()`, nous avons défini la période à 200 x 100 us = 20 ms, nous devons donc mapper 0 ~ 180 à 5 x 100 us ~ 25 x 100 us. Le prototype de cette fonction est illustré ci-dessous. .. code-block:: int softPwmCreate(int pin, int initialValue, int pwmRange); **Paramètre pin :** N'importe quelle broche GPIO du Raspberry Pi peut être définie comme broche PWM. **Paramètre initialValue :** La largeur d'impulsion initiale est égale à initialValue fois 100 us. **Paramètre pwmRange :** La période du PWM est égale à pwmRange fois 100 us.