Plateau tournant piloté par Arduino et moteur pas-à-pas série
Composants et fournitures
| Composant | Quantité |
|---|---|
| Moteur pas-à-pas 28BYJ-48 | 1 |
| Driver de moteur pas-à-pas X113647 (base ULN2003A) | 1 |
| Moyeu de fixation universel Pololu pour arbre 5 mm | 1 |
| Arduino UNO | 1 |
| Base en bois 15 × 15 cm | 1 |
| Patins en caoutchouc (10 mm ép.) | 4 |
Outils nécessaires
- Scie à chantourner
- Perceuse avec foret 6 mm pour bois
À propos du projet
Ce projet réalise une plateforme rotative basée sur un moteur pas-à-pas 28BYJ-48, piloté via son driver X113647 (ULN2003A). La plateforme tourne dans les deux sens et est contrôlée via le moniteur série (ou Tera Term) par des commandes simples :
- R : Rotation horaire continue (plusieurs tours)
- r : Rotation de 360° horaire (un tour)
- L : Rotation anti-horaire continue
- l : Rotation de 360° anti-horaire
- S : Arrêt de la rotation
Montage mécanique
- Découpez un carré de contreplaqué 15 × 15 cm pour la base.
- Trouvez le centre (intersection des diagonales) et percez un trou de 6 mm.
- Insérez le moyeu du moteur dans ce trou pour tracer son contour.
- Découpez au plus près du contour à la scie à chantourner, de sorte que les deux trous de fixation du moteur reposent sur le bois.
- Collez les 4 patins en caoutchouc (10 mm) sous la base pour le dégagement (le moteur dépasse légèrement).
- Fixez le plateau tournant sur l'arbre du moteur via le moyeu Pololu.
Câblage
Le driver X113647 se connecte directement aux broches 4, 5, 6, 7 de l'Arduino (Bleu, Rose, Jaune, Orange du moteur). Le fil rouge du moteur va au VCC, le bleu au GND. Voir le schéma Fritzing ci-dessous.
#define motorPin1 4 // Bleu - 28BYJ-48 pin 1
#define motorPin2 5 // Rose - 28BYJ-48 pin 2
#define motorPin3 6 // Jaune - 28BYJ-48 pin 3
#define motorPin4 7 // Orange- 28BYJ-48 pin 4
// Rouge - 28BYJ-48 pin 5 (VCC)
// Bleu - 28BYJ-48 pin GND
#define STEPS_PER_TURN 2048 // Pas pour 360°
Code
Le sketch utilise la bibliothèque AccelStepper pour un contrôle fluide avec accélération. Les commandes série sont traitées en temps réel.
/* Plateau tournant série - Cesare Brizio
Basé sur : https://www.cesarebrizio.it/Arduino/Turntable.html
Schéma : https://www.tdegypt.com/wp-content/uploads/2017/08/stepper-motor-wiring.png
*/
#include <AccelStepper.h>
// Broches moteur
#define motorPin1 4
#define motorPin2 5
#define motorPin3 6
#define motorPin4 7
#define STEPS_PER_TURN 2048
int motorSpeed = 500; // Vitesse max (éviter >800 sur 28BYJ-48)
int motorAccel = 400; // Accélération
int myPos = 0; // Position de départ pour rotation 360°
int LeftTurnUp = 0; // Drapeaux direction
int RightTurnDown = 0;
int Continuous = 0; // Mode continu vs un tour
int incomingByte = 0; // Données série
// AccelStepper: 4 fils, séquence 1-3-2-4 pour 28BYJ-48
AccelStepper stepper(4, motorPin1, motorPin3, motorPin2, motorPin4);
void setup() {
Serial.begin(9600);
stepper.setMinPulseWidth(20); // Impulsions assez longues pour le driver
stepper.setMaxSpeed(motorSpeed);
stepper.setSpeed(motorSpeed);
stepper.setAcceleration(motorAccel);
stepper.setCurrentPosition(stepper.currentPosition());
stepper.runToPosition();
Serial.println("Commandes disponibles :");
Serial.println("R = rotation horaire continue");
Serial.println("r = 360° horaire");
Serial.println("L = rotation anti-horaire continue");
Serial.println("l = 360° anti-horaire");
Serial.println("S = stop");
}
void loop() {
// --- Réception commandes série ---
if (Serial.available() > 0) {
incomingByte = Serial.read();
if (incomingByte == 'R') { // Continu horaire
Serial.println("Reçu «R» - rotation horaire continue");
stepper.stop(); stepper.runToPosition(); // Arrêt rapide
LeftTurnUp = 1; RightTurnDown = 0; Continuous = 1;
stepper.setCurrentPosition(stepper.currentPosition());
stepper.setSpeed(motorSpeed);
}
if (incomingByte == 'L') { // Continu anti-horaire
Serial.println("Reçu «L» - rotation anti-horaire continue");
stepper.stop(); stepper.runToPosition();
RightTurnDown = 1; LeftTurnUp = 0; Continuous = 1;
stepper.setCurrentPosition(stepper.currentPosition());
stepper.setSpeed(motorSpeed);
}
if (incomingByte == 'r') { // Un tour horaire
Serial.println("Reçu «r» - un tour horaire");
stepper.stop(); stepper.runToPosition();
LeftTurnUp = 1; RightTurnDown = 0; Continuous = 0;
stepper.setCurrentPosition(stepper.currentPosition());
stepper.setSpeed(motorSpeed);
myPos = stepper.currentPosition();
}
if (incomingByte == 'l') { // Un tour anti-horaire
Serial.println("Reçu «l» - un tour anti-horaire");
stepper.stop(); stepper.runToPosition();
RightTurnDown = 1; LeftTurnUp = 0; Continuous = 0;
stepper.setCurrentPosition(stepper.currentPosition());
stepper.setSpeed(motorSpeed);
myPos = stepper.currentPosition();
}
if (incomingByte == 'S') { // Stop
Serial.println("Reçu «S» - arrêt");
LeftTurnUp = 0; RightTurnDown = 0;
stepper.stop(); stepper.runToPosition();
}
}
// --- Exécution mouvement ---
if (Continuous == 1) { // Mode continu
if (LeftTurnUp == 1) stepper.moveTo(10000);
if (RightTurnDown == 1) stepper.moveTo(-10000);
stepper.run();
}
if (Continuous == 0) { // Mode un tour (2048 pas)
if (LeftTurnUp == 1) stepper.moveTo(myPos + STEPS_PER_TURN);
if (RightTurnDown == 1) stepper.moveTo(myPos - STEPS_PER_TURN);
stepper.run();
}
}
Schéma Fritzing

Processus de fabrication
- Moteurs pas à pas : types, caractéristiques et applications pratiques
- Drivers intégrés simplifient la conception de moteurs pas-à-pas haute puissance
- Ventilateur à contrôle de température : système relais DIY pour refroidissement meuble multimédia
- Raspoulette : Prototype de système autonome de porte de poulailler à énergie solaire
- Tourelle Nerf Autonome DIY – Construire un Canon Nerf Intelligent avec Moteurs Pas-à-Pas, Caméra et Arduino
- Bibliothèque Complète pour Moteur Pas à Pas Bipolaire Arduino
- Véhicule Télécommandé par Android avec Raspberry Pi et Shield Moteur
- Comprendre les moteurs linéaires : de l'énergie électrique au mouvement linéaire précis
- Servomoteurs expliqués : fonctionnement et importance