bonjour,
je suis nouveau dans le monde de l’Arduino et de l'automatisme (programmation en général).
pour être honnête je n'y connais rien (sauf depuis un bon mois
)
à force de recherche et de patience j'ai réussi à faire ce que je voulais, mais je pense qu'avec un regard plus aguerrie je vais encore en apprendre et améliorer mon projet:
matériels utilisés:
arduino mega 2560
afficheur I2C LCD 16x2
4x4 clavier pavé numérique à membrane
moteur pas à pas nema17
controleur tb6600
principe de fonctionnement:
au démarrage le moteur s'initialise sur sa position mini
la touche A fait faire un certain nombre de tour au moteur
la B ,C et D aussi, avec l'affichage de la consigne correspondante.
il y a deux touches de mouvement manuel
il y a deux fins de course de sécurité (ou prise d'origine)
la touche * ramène à l'origine + quelques tours
la touche # stop le moteur
ci dessous le code :je tiens à m'excuser si ça vous brule les yeux
// librairies
#include <Keypad.h>
#include "LiquidCrystal_I2C.h"
#include "Wire.h"
#include <AccelStepper.h>
//constantes
const int stepsPerRevolution = 800; // Nombre de pas du servomoteur
const byte ROWS = 4; //nombre de lignes
const byte COLS = 4; //nombre de colonnes
const int led_rouge = 32; // pin 32 led rouge
const int led_verte = 34; // pin 34 led verte
const int fin_1 = 42; // pin 42 fin de course 1
const int fin_2 = 44; // pin 44 fin de course 1
const int bouton_noir = 48; // pin 48 bouton noir
const int bouton_rouge = 50; // pin 50 bouton rouge
int val = 0; // variable pour mémoriser la valeur lue
#define STEPPIN 10 //
#define DIRPIN 11 //
#define TYPE_INTERFACE_MOTEUR 1
char touche;
char touches[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //entrées numériques où sont branchées les lignes
byte colPins[COLS] = {5, 4, 3, 2}; //entrées numériques où sont branchées les colonnes
Keypad clavier = Keypad ( makeKeymap (touches), rowPins, colPins, ROWS, COLS );
LiquidCrystal_I2C LCD(0x27, 16, 2); // définit le type d'écran lcd 16 x 2
AccelStepper stepper = AccelStepper ( AccelStepper::DRIVER, STEPPIN, DIRPIN) ;
void setup() {
{
Serial.begin (115200) ;
LCD.init(); // initialisation de l'afficheur
LCD.setBacklight(HIGH);
LCD.home ();
LCD.setCursor(1, 0);
LCD.print("hello lolo");
LCD.setCursor(1, 1);
LCD.print("attendre");
pinMode(fin_1, INPUT_PULLUP); // capteur de Prise d'origine ,butée stop
pinMode(fin_2, INPUT_PULLUP); // capteur de Prise d'origine ,butée stop
pinMode(bouton_noir, INPUT_PULLUP); // deplacement droite
pinMode(bouton_rouge, INPUT_PULLUP); // deplacement gauche
pinMode(led_rouge, OUTPUT); // voyant defaut ou attendre
pinMode(led_verte, OUTPUT); // voyant ok
digitalWrite (fin_1, HIGH);
digitalWrite (fin_2, HIGH);
digitalWrite (bouton_noir, HIGH);
digitalWrite (bouton_rouge, HIGH);
pinMode(STEPPIN, OUTPUT);
pinMode(DIRPIN, OUTPUT);
stepper.setMaxSpeed(6000.0);
stepper.setAcceleration(1000.0);
stepper.moveTo(-1000000000);
stepper.run();
val = digitalRead(fin_1);
while (val == HIGH) // tant que le moteur n'est pas à sa position d'origine je tourne et allume le voyant rouge
{
stepper.run();
digitalWrite(led_rouge, 1);
val = digitalRead(fin_1);
}
digitalWrite(led_verte, 1);
digitalWrite(led_rouge, 0);
delay(1000);
stepper.setCurrentPosition(0);
}
{
LCD.clear();
LCD.setCursor(1, 0);
LCD.print("hello lolo");
LCD.setCursor(1, 1);
LCD.print("choisir A,B,C,D");
}
while (val == LOW)
{
val = digitalRead(fin_1); stepper.moveTo(600); stepper.run();
}
}
void loop() {
{
if (digitalRead(fin_1) == 0) // teste si le fin de course a une valeur de 1
// ...on efface l'ecran , on affiche SECU et on stop le moteur
{
stepper.stop(); LCD.clear() ; LCD.setCursor(1, 0); LCD.print("securite"); LCD.setCursor(1, 1); LCD.print("STOP");
}
if (digitalRead(fin_2) == 0) // teste si le fin de course a une valeur de 1
// ...on efface l'ecran , on affiche SECU et on stop le moteur
{
stepper.stop(); LCD.clear() ; LCD.setCursor(1, 0); LCD.print("securite"); LCD.setCursor(1, 1); LCD.print("STOP");
}
{
touche = clavier.getKey();
if (touche != NO_KEY) // si une touche a été frappée -- gestion de la touche appuyée
{
if (touche == 'A') {
LCD.clear() ; LCD.setCursor(1, 0); LCD.print("votre choix"); LCD.setCursor(1, 1); LCD.print("A = 35");
}
else if (touche == 'B') {
LCD.clear() ; LCD.setCursor(1, 0); LCD.print("votre choix"); LCD.setCursor(1, 1); LCD.print("B = 40");
}
else if (touche == 'C') {
LCD.clear() ; LCD.setCursor(1, 0); LCD.print("votre choix"); LCD.setCursor(1, 1); LCD.print("C = 42-45");
}
else if (touche == 'D') {
LCD.clear() ; LCD.setCursor(1, 0); LCD.print("votre choix"); LCD.setCursor(1, 1); LCD.print("D = 50");
}
else if (touche == '#') {
LCD.clear() ; LCD.setCursor(6, 0); LCD.print("STOP"); LCD.setCursor(7, 1); LCD.print("MANU");
}
else if (touche == '*') {
LCD.clear() ; LCD.setCursor(1, 0); LCD.print("position mini"); LCD.setCursor(7, 1); LCD.print("=0");
}
}
if (touche == 'A') stepper.moveTo(40960);
stepper.run();
if (touche == 'B') stepper.moveTo(81920);
stepper.run();
if (touche == 'C') stepper.moveTo(122880);
stepper.run();
if (touche == 'D') stepper.moveTo(163840);
stepper.run();
if (touche == '#') stepper.stop();
stepper.run();
if (touche == '*') stepper.moveTo(600);
stepper.run();
}
}
if (digitalRead(bouton_noir) == 0) // teste si le bouton a une valeur de 1
// ...on fait tourner le moteur
{
stepper.setSpeed(1000); stepper.move(10); stepper.runSpeed();
}
if (digitalRead(bouton_rouge) == 0) // teste si le bouton a une valeur de 1
// ...on fait tourner le moteur dans l'autre sens
{
stepper.setSpeed(-1000); stepper.move(-10); stepper.runSpeed();
}
}
et voila encore dsl en plus il n'y a pas les couleurs!?
à vos claviers, j'attends vos remarques et critiques constructives ![]()