Salut,
Ce tutoriel est un prolongement de l’épisode 6 - Une débutante dans le décor - Ep6 - Quelques automatismes (Arduino Nano), comment réaliser des automatismes en mode “lego” basé sur la plateforme Arduino Nano.
Objectif : pas de fer à souder, pas de câblage compliqué, pas de résistance/condo/… à rajouter et bien sur un prix mini mini. Si tu sais brancher un M84, tu sais utiliser un Arduino à la sauce Julaye !
Ce tutoriel démarre avec l’idée assez classique de motoriser les portes d’un bâtiment, au hasard, l’atelier moteur ou la remise de mon dépôt diesel de Obourg.
Débutante intégrale au début de mes activités, j’ai acheté des servo moteurs chez Faller ainsi qu’un boitier de servo-commande.
Référence des servos 180726 (12 € pièce) :
https://www.faller.de/fr/fr/Produits/Construction-d-installations/Electronique/Servo-sid12271.html
Référence du servocommande 180725 (50 €) :
Cout de l’automatisation de quatre servos chez Faller : 100 € !
Et puis je me suis aperçue que l’Arduino Nano pouvait commander jusqu’à 6 servo-moteurs … avec une interface de programmation intégrée à l’environnement de développement :
Vous remarquerez au passage que j’évite l’alimentation 16V requise par la servo-commande Faller, les servos ont tendance à être en 3.3V, alimentation disponible directement sur l’Arduino.
Bilan de ce tutoriel : je vais revendre mon boitier de servocommande et en achetant les quatre servo-moteurs sur la Bay (4€ pièce) avec un Arduino Nano (6€), c’est plus de 75 euros que j’aurais pu économiser.
Alors un servo-moteur, c’est quoi déjà ? un moteur à courant continue qui prend des positions particulières exprimées sous forme d’angle.
J’ai trouvé un article passionnant à lire et que je vous conseille, n’ayant pas envie de paraphraser ce document :
et
Pour mon tutoriel, j’ai ajouté une interface de détection de présence Infra Rouge (IR). La porte s’ouvre sur détection et se ferme sinon.
Cette interface IR coute quelques euros (12€ les 5 pièces) :
https://www.amazon.fr/gp/product/B07V6YR2P7/ref=ppx_yo_dt_b_asin_title_o06_s00
Voici le montage sur ma paillasse à Dakar :
Mon Arduino est alimenté par le port USB de mon ordinateur. Je n’avais pas emmené d’alimentation autonome.
Bien évidemment, cette carte de détection IR peut être remplacée par une entrée de contact (présence d’une locomotive sur la voie), un bouton poussoir, une sortie de M83/M84 … ou une combinaison de tout ça.
Du coup le montage est assez classique :
-
le rouge du servo sur le 3.3V de l’Arduino
-
le noir du servo sur le GND de l’Arduino
-
le orange du servo (la commande PWM) sur une sortie de l’Arduino
-
le rouge du détecteur sur le 5V de l’Arduino
-
le noir du détecteur sur le GND de l’Arduino
-
le jaune du détecteur (signal) sur une entrée de l’Arduino
Le programme est plutôt simplissime, il gère deux positions sur le servo : porte ouverte (90°) ou fermée (0°), et il est possible de régler la vitesse de fermeture et d’ouverture de la porte (fixée à environ 1 seconde dans le code ci-après).
// Servo Faller v0.1
// (c) Julie Dumortier, 2021
// licence GPL
//
// Evolutions
// v0.1 première version sur plateforme de démonstration
// Un serveur moteur a un connecteur à trois fils : +, - et signal.
// le + est typiquement de couleur rouge et doit être connecté au 5V de l'Arduino
// le - est typiquement de couleur marron ou noir et doit être connecté au GND de l'Arduino
// le signal est typiquement de couleur jaune ou orange et doit être connecté à une sortie digital
// inclure les définitions pour la commande d'un servo
#include <Servo.h>
// utiliser une PIN pour envoyer un signal PWM sur le servo
#define SERVO_PIN 2
// cette PIN allume la led infrarouge à la fréquence de 38 Khz
#define ENABLE_PIN 3
// cette PIN détecte l'infrarouge
#define SIGNAL_PIN 4
// créer un objet Servo pour la référence 180726
// documentation Arduino : https://www.arduino.cc/reference/en/libraries/servo/
Servo servoFaller;
// variable pour stocker l'angle de variation (0 à 90)
int servoAngle;
// trigger pour décider qu'un objet est présent ou absent
int trigger = 32;
// fonction qui détecte la présence d'un objet
bool objetDetect()
{
int n = 0;
int d = 0;
digitalWrite(ENABLE_PIN, HIGH);
while (n<64) {
n = n + 1;
if(!digitalRead(SIGNAL_PIN)) {
d = d + 1;
}
delay (1);
}
digitalWrite(ENABLE_PIN, LOW);
if (d>trigger) {
Serial.print("objet détecté d=");
Serial.println(d);
return true;
}
Serial.print("aucun objet d=");
Serial.println(d);
return false;
}
void OuvrePorte()
{
digitalWrite(LED_BUILTIN,HIGH);
for (int i=0;i<=90;i++) { // pour chaque angle entre 0 et 90
servoFaller.write(i); // positionne sur l'angle i
delay(10); // impacte la vitesse d'ouverture (pause de 10 ms entre chaque déplacement)
}
Serial.println("Porte ouverte");
}
void FermePorte()
{
digitalWrite(LED_BUILTIN,LOW);
for (int i=90;i>=0;i--) { // pour chaque angle entre 90 et 0
servoFaller.write(i); // positionne sur l'angle i
delay(10); // impacte la vitesse de fermeture (pause de 10 ms entre chaque déplacement)
}
Serial.println("Porte fermée");
}
// le code de démarrage du Nano
void setup() {
// debug mode sur la console de l'IDE
Serial.begin(57600);
// pour afficher la présence, utilise la led interne à l'Arduino
pinMode(LED_BUILTIN,OUTPUT);
digitalWrite(LED_BUILTIN,LOW);
// enable le détecteur
pinMode(ENABLE_PIN, OUTPUT);
digitalWrite(ENABLE_PIN, HIGH);
// Signal de détection en entrée
pinMode(SIGNAL_PIN, INPUT);
// attache le PIN utilisé pour le servo pour lui envoyer un signal.
servoFaller.attach(SERVO_PIN);
// assure toi que la porte soit bien fermée
FermePorte();
}
// le code executé en permanence
bool objetPresent = false;
void loop() {
if (objetDetect()) {
if (!objetPresent) {
objetPresent = true;
OuvrePorte();
}
} else {
if (objetPresent) {
objetPresent = false;
FermePorte();
}
}
}
J’ai tourné une petite vidéo de l’exécution de mon programme :
Merci de votre attention,
Retrouvez tous les épisodes de la débutante en clickant ici !