Automatisme avec Arduino - Simulation GRAFCET
Projet de simulation d'une machine d'encaissage industrielle en utilisant Arduino et
des servomoteurs pour remplacer les vérins pneumatiques. Le programme reproduit
le GRAFCET fourni et permet de simuler le cycle complet avec des entrees/sorties
adaptees.
1. Probleme
La machine d'encaissage suit un GRAFCET industriel impliquant plusieurs verins pneumatiques,
vannes et moteurs.
L'objectif est de remplacer ces composants par des equivalents Arduino pour simuler le cycle
complet sur table.
Les verins sont remplaces par des servomoteurs, les vannes et moteurs sont simules par des LEDs
ou des sorties logiques, et les capteurs sont simules par des boutons poussoirs (fin de course,
detection presence).
Le GRAFCET fourni dans l'enonce decrit les etapes du cycle de production, de la mise en place des
bouteilles jusqu'au vissage des bouchons.
2. Composants
Table de correspondance entre les composants industriels et leurs equivalents Arduino :
Composant industriel Fonction Equivalent Arduino
Verin A Mise en place bouteille Servo A
Verin B Transfert convoyeur Servo B
Verin C Remplissage Servo C
Verin G Mise en place bouchon Servo G
Verin E Vissage Servo E
Vanne D Ouverture/fermeture remplissage LED / relais
Convoyeur Deplacement bouteilles Moteur DC
Capteurs fin de course Detection position verin Boutons poussoirs
BP Marche Lancement cycle Bouton
BP Arret Arret en fin de cycle Bouton
Arret d'urgence Arret immediat Bouton rouge
3. Mini-cours Arduino
Arduino est une plateforme microcontroleur qui permet de lire des capteurs (entrees) et de
commander des actionneurs (sorties).
Structure d'un programme :
- setup() : initialisation des entrees/sorties
- loop() : boucle principale executee en continu
Les composants sont relies a des broches numeriques ou analogiques, configurees en INPUT ou
OUTPUT.
int bouton = 2;
int led = 13;
void setup() {
pinMode(bouton, INPUT);
pinMode(led, OUTPUT);
}
void loop() {
int etat = digitalRead(bouton);
if (etat == HIGH) {
digitalWrite(led, HIGH);
} else {
digitalWrite(led, LOW);
}
}
4. Exemples de programmation
Voici quelques exemples pour programmer chaque composant separement avant d'aborder le
GRAFCET complet.
// LED + bouton poussoir
int bouton = 2;
int led = 13;
void setup() {
pinMode(bouton, INPUT_PULLUP);
pinMode(led, OUTPUT);
}
void loop() {
if (digitalRead(bouton) == LOW) {
digitalWrite(led, HIGH);
} else {
digitalWrite(led, LOW);
}
}
// Servo moteur
#include <Servo.h>
Servo verin;
int boutonServo = 2;
void setup() {
[Link](9);
pinMode(boutonServo, INPUT_PULLUP);
}
void loop() {
if (digitalRead(boutonServo) == LOW) {
[Link](90);
} else {
[Link](0);
}
}
5. Programmation du GRAFCET complet
#include <Servo.h>
#define BP_MARCHE 2
#define BP_ARRET 3
#define BP_URGENCE 4
#define FC_A 5
#define FC_B 6
#define FC_C 7
#define FC_G 8
#define MOTEUR_CONV 9
#define VANNE_D 10
#define LED_VISSE A2
Servo servoA, servoB, servoC, servoG, servoE;
int etape = 0;
bool marche = false;
void setup() {
pinMode(BP_MARCHE, INPUT_PULLUP);
pinMode(BP_ARRET, INPUT_PULLUP);
pinMode(BP_URGENCE, INPUT_PULLUP);
pinMode(FC_A, INPUT_PULLUP);
pinMode(FC_B, INPUT_PULLUP);
pinMode(FC_C, INPUT_PULLUP);
pinMode(FC_G, INPUT_PULLUP);
pinMode(MOTEUR_CONV, OUTPUT);
pinMode(VANNE_D, OUTPUT);
pinMode(LED_VISSE, OUTPUT);
[Link](11);
[Link](12);
[Link](13);
[Link](A0);
[Link](A1);
stopAll();
}
void loop() {
if (digitalRead(BP_MARCHE) == LOW) marche = true;
if (digitalRead(BP_ARRET) == LOW) marche = false;
if (digitalRead(BP_URGENCE) == LOW) {
marche = false;
stopAll();
etape = 0;
}
if (!marche) return;
switch (etape) {
case 0:
etape = 1;
break;
case 1:
[Link](90);
if (digitalRead(FC_B) == LOW) etape = 2;
break;
case 2:
[Link](90);
if (digitalRead(FC_A) == LOW) {
[Link](0);
etape = 3;
}
break;
case 3:
[Link](90);
digitalWrite(VANNE_D, HIGH);
delay(2000);
digitalWrite(VANNE_D, LOW);
[Link](0);
etape = 4;
break;
case 4:
[Link](90);
if (digitalRead(FC_G) == LOW) {
[Link](90);
digitalWrite(LED_VISSE, HIGH);
delay(2000);
digitalWrite(LED_VISSE, LOW);
[Link](0);
[Link](0);
etape = 1;
}
break;
}
}
void stopAll() {
digitalWrite(MOTEUR_CONV, LOW);
digitalWrite(VANNE_D, LOW);
digitalWrite(LED_VISSE, LOW);
[Link](0);
[Link](0);
[Link](0);
[Link](0);
[Link](0);
}