ESP32 et moteur SG90

le moteur SG90 est une petite unité fréquemment utilisé en modélisme. Il se pilote facilement avec un ESP32 ou autre micro-controleur. Voici comment tester son fonctionnement.

Il est livré avec un connecteur Dupont compatible avec l’ESP32. Sauf que les broches ne sont pas dans le bon ordre sur le SG90. Il s’alimente avec 3 fils : 5V, GND et data. On peut trouver ces 3 broches contigües sur l’ESP32 à condition d’inverser les fils 5V et GND. Faisable avec une aiguille pour sortir le connecteur de son logement

Ensuite un simple code Arduino permet de le mettre en action.

#include <ESP32Servo.h>

Servo monServo;
const int pinServo = 13; // GPIO 13

void setup() {
  // Configuration de la fréquence standard pour un servo (50 Hz)
  monServo.setPeriodHertz(50);
  
  // Attache le servo au GPIO 13 avec les largeurs d'impulsion min/max du SG90 (500µs à 2400µs)
  monServo.attach(pinServo, 500, 2400);
}

void loop() {
  monServo.write(0);    // Position 0°
  delay(1000);
  
  monServo.write(90);   // Position 90° (centre)
  delay(1000);
  
  monServo.write(180);  // Position 180°
  delay(1000);
}

ou bien un code ESPHOME

esphome:
  name: esp32-servo
  friendly_name: ESP32 Servo SG90

esp32:
  board: esp32dev

# Connexion Wi-Fi et API Home Assistant (à adapter)
wifi:
  ssid: "2.4GHz-MEMOIRE-VIVE"
  password: "xxxxxxxxxxxxxxxx"

api:
logger:
ota:
  platform: esphome

# Optionnel : active l'interface web intégrée pour tester le curseur sans Home Assistant
web_server:
  port: 80

# 1. Définition de la sortie PWM sur le GPIO 13 à 50 Hz (fréquence requise pour un servo)
output:
  - platform: ledc
    id: pwm_output
    pin: GPIO13
    frequency: 50Hz

# 2. Définition du composant Servo
servo:
  - id: my_servo
    output: pwm_output

# 3. Création d'un curseur (slider) de 0 à 180 degrés
number:
  - platform: template
    name: "Angle Servo SG90"
    min_value: 0
    max_value: 180
    step: 1
    optimistic: true
    icon: "mdi:axis-arrow"
    set_action:
      then:
        - servo.write:
            id: my_servo
            level: !lambda 'return (x - 90.0) / 90.0;'