Construire une distributeur automatique Arduino intelligent : guide méca complet
Présentation
Projet : distributeur automatique DIY piloté par Arduino. Processus complet : découpe/assemblage MDF, électronique, code Arduino.
Vidéo ou tutoriel écrit.
Vue d'ensemble
4 distributeurs (moteurs rotation continue DS04-NFC), système porteur (moteurs pas-à-pas), LCD 16×2, 4 boutons sélection, détecteur pièce.

Le porteur ajoute de la complexité pédagogique (projet fin d'études méca/électro). Idéal pour étudiants et passionnés.
Construction mécanique
Structure MDF
Panneaux MDF 8 mm découpés scie circulaire (établi maison Creativity Hero). Mesures issues modèle 3D.


Modèle 3D Thangs. Ouvertures scie sauteuse (aussi utilisable pour découpes principales). Attention : machines dangereuses.

Assemblage : colle bois + vis 3 mm, pré-perçage + fraisage, serre-joints 90° et F.

Système rail (porteur)
Tubes alu : horizontal 16 mm × 27 cm (×2), vertical 20 mm × 45 cm (×3). Alésages Forstner sur bois 18 mm.

Chariots : planche 21×21 cm, trous 8 mm, tiges filetées M8 + roulements 22 mm (horizontal : 16 mm). Problème jeu → resserrage rails (élargissement alésages, fentes perpendiculaires, tige filetée).


Démontage rails pour ajouter : boulon 5 mm gauche (poulie courroie horizontale + 2 roulements rail vertical gauche), moteur pas-à-pas horizontal droit (fixé sur MDF 8 mm + support + partie rainurée → chariot vertical).


Conteneur sur chariot horizontal (bois + colle). Réassemblage rails : époxy alésages + plaque latérale raidissement. Insertion entre rails verticaux. Résultat : coulissement excellent.


Courroie crantée horizontale : mesure, découpe, fixation chariot (collier). Moteur vertical haut (MDF + boulons), poulie bas, courroie verticale.

Distributeurs (discharge units)
Bobine hélicoïdale : fil métallique 3 mm enroulé sur bombe 7 cm. Collage pistolet colle sur servo rotation continue.


Panneau avant
Porte : charnières + loquet magnétique. Acrylique 5 mm grande ouverture, tôle alu fine petite ouverture (4 trous boutons, fentes pièces/LCD). Électronique sur tôle → fixée sur porte (boulons 5 mm).


2 micro-switches position initiale porteur. Guide pièce → bas machine. Détecteur pièce : capteur IR proximité (détection passage pièce).
Schéma électronique

Alim 12V ≥2A (2 pas-à-pas + LED porte). Buck converter LM2596 12V→5V (servos, Arduino, capteurs). Servos DS04-NFC 5V PWM. Pas-à-pas via drivers A4988. 4 boutons + 2 micro-switches → GND + pins digitales (pull-up internes).
Composants
- Convertisseur DC-DC LM2596 Buck
- LCD 16×2
- Servo rotation continue 360° DS04-NFC (×4)
- Moteur pas-à-pas NEMA 17 (×2)
- Drivers A4988 (×2)
- Capteur IR proximité
- Boutons poussoirs (×4)
- Micro switch fin de course (×2)
- Arduino (Uno/Mega)
Câblage fils volants (un peu désordonné mais fonctionnel). Bandes LED porte (éclairage intérieur).

Code Arduino
/* DIY Vending Machine - Arduino Mechatronics */
#include <LiquidCrystal.h>
#include <Servo.h>
LiquidCrystal lcd(27, 26, 25, 24, 23, 22); // rs, en, d4, d5, d6, d7
Servo servo1, servo2, servo3, servo4; // DS04-NFC
#define dirPinVertical 0
#define stepPinVertical 1
#define dirPinHorizontal 2
#define stepPinHorizontal 3
#define coinDetector 9
#define button1 13
#define button2 12
#define button3 11
#define button4 10
#define microSwitchV 15
#define microSwitchH 14
int buttonPressed;
void setup() {
lcd.begin(16, 2);
servo1.attach(4); servo2.attach(5); servo3.attach(6); servo4.attach(7);
pinMode(dirPinVertical, OUTPUT); pinMode(stepPinVertical, OUTPUT);
pinMode(dirPinHorizontal, OUTPUT); pinMode(stepPinHorizontal, OUTPUT);
pinMode(coinDetector, INPUT);
// Pull-ups internes
pinMode(button1, INPUT_PULLUP); pinMode(button2, INPUT_PULLUP);
pinMode(button3, INPUT_PULLUP); pinMode(button4, INPUT_PULLUP);
pinMode(microSwitchV, INPUT_PULLUP); pinMode(microSwitchH, INPUT_PULLUP);
// Position initiale verticale (haut)
digitalWrite(dirPinVertical, HIGH);
while (true) {
if (digitalRead(microSwitchV) == LOW) { moveUp(70); break; }
digitalWrite(stepPinVertical, HIGH); delayMicroseconds(300);
digitalWrite(stepPinVertical, LOW); delayMicroseconds(300);
}
// Position initiale horizontale (gauche)
digitalWrite(dirPinHorizontal, LOW);
while (true) {
if (digitalRead(microSwitchH) == LOW) { moveLeft(350); break; }
digitalWrite(stepPinHorizontal, HIGH); delayMicroseconds(300);
digitalWrite(stepPinHorizontal, LOW); delayMicroseconds(300);
}
}
void loop() {
lcd.clear(); lcd.setCursor(0,0); lcd.print("Insert a coin!");
while (true) { if (digitalRead(coinDetector) == LOW) break; }
delay(10);
lcd.clear(); lcd.setCursor(0,0); lcd.print("Select your item");
lcd.setCursor(0,1); lcd.print(" 1, 2, 3 or 4?");
while (true) {
if (digitalRead(button1) == LOW) { buttonPressed = 1; break; }
if (digitalRead(button2) == LOW) { buttonPressed = 2; break; }
if (digitalRead(button3) == LOW) { buttonPressed = 3; break; }
if (digitalRead(button4) == LOW) { buttonPressed = 4; break; }
}
lcd.clear(); lcd.setCursor(0,0); lcd.print("Delivering...");
switch (buttonPressed) {
case 1: // Emplacement 1 (haut gauche)
moveUp(4900); delay(200); moveLeft(1700); delay(300);
servo1.writeMicroseconds(2000); delay(950); servo1.writeMicroseconds(1500); delay(500);
moveRight(1700); delay(200); moveDown(4900); break;
case 2: // Emplacement 2 (haut droite)
moveUp(4900); delay(200);
servo2.writeMicroseconds(2000); delay(950); servo2.writeMicroseconds(1500); delay(500);
moveDown(4900); break;
case 3: // Emplacement 3 (bas gauche)
moveUp(2200); delay(200); moveLeft(1700); delay(300);
servo3.writeMicroseconds(2000); delay(950); servo3.writeMicroseconds(1500); delay(500);
moveRight(1700); delay(200); moveDown(2200); break;
case 4: // Emplacement 4 (bas droite)
moveUp(2200); delay(200);
servo4.writeMicroseconds(2000); delay(950); servo4.writeMicroseconds(1500); delay(500);
moveDown(2200); break;
}
lcd.clear(); lcd.setCursor(0,0); lcd.print("Item delivered!");
delay(2000);
}
// Fonctions déplacement pas-à-pas (quart de pas A4988)
void moveUp(int steps) {
digitalWrite(dirPinVertical, LOW);
for (int x=0; x
Explications clés
- Pull-ups : boutons/micro-switches = HIGH au repos, LOW quand pressés.
- Homing : boucle while vers micro-switches, puis léger décalage (70/350 pas).
- Détection pièce : capteur IR → LOW = pièce détectée → sortie boucle.
- Sélection : attente appui bouton → variable
buttonPressed. - Déplacement : drivers A4988 en quart de pas → 4900 pas = haut, 2200 = milieu, 1700 = gauche. Valeurs à calibrer.
- Distribution : servo rotation continue : 2000 µs = rotation, 1500 µs = arrêt. 950 ms ≈ 1 tour complet hélice.
- Retour position initiale après chaque distribution.
Simple et efficace ! Amusez-vous bien, questions en commentaires, découvrez mes projets Arduino.
Processus de fabrication
- Les distributeurs automatiques : une industrie américaine de 36,6 milliards de dollars
- Construire sa propre machine à écrire les devoirs à la maison (Traceur à stylo)
- Construire une console de contrôle Photoshop DIY avec Arduino Nano RP2040
- Créer un système Ambilight spectaculaire pour moniteur avec Arduino
- Construire un dispositif de lévitation ultrasonique avec Arduino – Guide étape par étape
- Construire un Voltmètre Intelligent avec Arduino et Smartphone – Projet DIY Facile
- Construire un Capteur de Rythme Cardiaque Infrarouge Fiable avec Arduino : Guide Étape par Étape
- Morpion sur matrice LED MAX7219 avec boîtier en carton
- Construire un voltmètre DIY avec Arduino et écran Nokia 5110