Problème avec Bouton Poussoir
#1
Posté 23 février 2012 - 11:17
Bon je rencontre un problème avec mon système, mais je ne sais pas si l'erreur viens du code, ou du branchement, c'est pourquoi je vais vous fournir les 2 (schéma + code).
Tout d'abord, mon problème : sur mon système, j'ai intégré des boutons poussoir (2 bouton qui sont a l'état 1, et quand j'appuie, ils passent à 0 : BP1 & BP3 et 2 boutons de types interrupteur : BP4 & BP5), et lorsque j'appuie dessus, cela ne change strictement rien à mon système. Normallement, un message devrai s'afficher. Ce que je trouve bizarre, c'est que j'ai intégré un encodeur rotatif (acheté sur gotronic : encodeur 3530), mais lui marche très bien, puisque j'arrive à avoir la vitesse et la position. Je ne sais donc pas du tout d'ou viens l'erreur ! HELP ME PLEASE !!
Voila le montage :
Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.
#2
Posté 23 février 2012 - 11:17
#include <stdlib.h>
#include <stdio.h>
#include <Metro.h>
#include <LiquidCrystal.h>
const int RS=12;
const int E=11;
const int D4=5;
const int D5=4;
const int D6=3;
const int D7=6;
int BP1State = 13;
int BP3State = 8;
int BP4State = 9;
int BP5State = 10;
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);
Metro ledMetro = Metro(2000);
int nbre_impulsion;
int nbre_impulsion_vitesse;
volatile int front_montant = LOW;
void setup() // fonction setup - début de l'exécution du programme
{
Serial.begin(9600);
attachInterrupt(0, counter, RISING);
pinMode(BP1State,INPUT);
pinMode(BP3State,INPUT);
pinMode(BP4State,INPUT);
pinMode(BP5State,INPUT);
digitalWrite(BP1State, HIGH);
digitalWrite(BP3State, HIGH);
digitalWrite(BP4State, LOW);
digitalWrite(BP5State, LOW);
lcd.begin(20,4);
lcd.print("LCD OK");
delay(2000);
lcd.clear();
delay(10);
}
void counter()
{
++nbre_impulsion;
++nbre_impulsion_vitesse;
}
void loop()
{
int pos_rad;
int pos_deg;
int vitesse;
int vitesse_BP1;
int position_BP1_rad;
int position_BP1_deg;
int nbre_impulsion_vitesse;
int pos_deg1;
int pos_rad1;
while (digitalRead(BP3State) == HIGH);
{
if (digitalRead(BP4State) == HIGH);
{
while (pos_deg < 90)
{
lcd.clear();
if (ledMetro.check() != 1)
{
if (digitalRead(BP1State) == LOW);
{
vitesse_BP1 = vitesse;
position_BP1_rad = pos_rad;
position_BP1_deg = pos_deg;
}
pos_rad = nbre_impulsion*(3.14/2)/90;
pos_deg = nbre_impulsion;
vitesse = vitesse = (nbre_impulsion_vitesse*(3.14/2)/90)/2;
lcd.setCursor(0,0);
lcd.print("POS DEG: ");
lcd.setCursor(9,0);
lcd.print(pos_deg);
lcd.setCursor(0,1);
lcd.print("POS RAD: ");
lcd.setCursor(9,1);
lcd.print(pos_rad);
lcd.setCursor(0,2);
lcd.print("vitesse: ");
lcd.setCursor(9,2);
lcd.print(vitesse);
}
if (ledMetro.check() == 1)
{
lcd.clear();
delay(100);
}
}
if(pos_deg >= 90)
{
lcd.clear();
delay(10);
lcd.print("INFORMATIONS AU");
lcd.setCursor(0,1);
lcd.print("POINT VOULU");
delay(2000);
lcd.clear();
delay(10);
lcd.setCursor(0,0);
lcd.print("vit. BP1: ");
lcd.setCursor(10,0);
lcd.print(vitesse_BP1);
lcd.setCursor(0,1);
lcd.print("POS DEG BP1:");
lcd.setCursor(12,1);
lcd.print(position_BP1_deg);
lcd.setCursor(0,2);
lcd.print("POS RAD BP1:");
lcd.setCursor(12,2);
lcd.print(position_BP1_rad);
delay(100000000);
}
}
if (digitalRead(BP5State) == HIGH);
{
while (pos_deg1 > 0)
{
lcd.clear();
if (ledMetro.check() != 1)
{
pos_rad1 = (3.14/2)-(nbre_impulsion*(3.14/2)/90);
pos_deg1 = 90-nbre_impulsion;
vitesse = vitesse = (nbre_impulsion_vitesse*(3.14/2)/90)/2;
lcd.setCursor(0,0);
lcd.print("POS DEG: ");
lcd.setCursor(9,0);
lcd.print(pos_deg1);
lcd.setCursor(0,1);
lcd.print("POS RAD: ");
lcd.setCursor(9,1);
lcd.print(pos_rad1);
lcd.setCursor(0,2);
lcd.print("vitesse: ");
lcd.setCursor(9,2);
lcd.print(vitesse);
if (digitalRead(BP1State) == LOW);
{
vitesse_BP1 = vitesse;
position_BP1_rad = pos_rad1;
position_BP1_deg = pos_deg1;
}
}
if (ledMetro.check() == 1)
{
lcd.clear();
delay(100);
}
}
if (pos_deg <= 0)
{
lcd.print("INFORMATIONS AU");
lcd.setCursor(0,1);
lcd.print("POINT VOULU");
delay(2000);
lcd.clear();
delay(10);
lcd.setCursor(0,0);
lcd.print("vit. BP1: ");
lcd.setCursor(10,0);
lcd.print(vitesse_BP1);
lcd.setCursor(0,0);
lcd.print("POS DEG BP1:");
lcd.setCursor(12,1);
lcd.print(position_BP1_deg);
lcd.setCursor(0,2);
lcd.print("POS RAD BP1:");
lcd.setCursor(12,2);
lcd.print(position_BP1_rad);
delay(100000000);
}
}
}
if (digitalRead(BP3State) == LOW)
{
lcd.print("! Recommencez !");
delay(10000000);
}
}
Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.
#3
Posté 24 février 2012 - 12:33
C'est pas un peu beaucoup ??delay(10000000);
Page Facebook : https://www.facebook...appartelier2.0/
Page Twitter : https://twitter.com/2Appartelier (bateau seulement)
Boutique Robot-Maker : https://www.robot-ma...er-20/produits/
Besoin d'une impression 3D grand format ? Contactez moi !
#4
Posté 24 février 2012 - 02:01
delay(10000000);
Oui la c'est trop long , mes le delay a 100
#5
Posté 24 février 2012 - 09:44
Je vais essayer en tout cas, et je vous tiendrai au courant !
Merci Beaucoup !!
PS : sinon, rien d'autre qui vous choque dans le programme ?
Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.
#6
Posté 24 février 2012 - 02:08
mètre des explicatifs , et aussi dutilisé cette balise pour que ton programme soi lissible
#7
Posté 24 février 2012 - 06:50
#include <stdlib.h> #include <stdio.h> #include <Metro.h> // librairie remplacant la librairie <time.h> #include <LiquidCrystal.h> const int RS=12; const int E=11; const int D4=5; const int D5=4; const int D6=3; const int D7=6; int BP1State = 13; //BP1 branché sur la patte 13 (digitale), il en est de meme pour les autres boutons poussoir. int BP3State = 8; int BP4State = 9; int BP5State = 10; LiquidCrystal lcd(RS, E, D4, D5, D6, D7); Metro ledMetro = Metro(2000); //temps d'une boucle, ici 2sec. int nbre_impulsion; int nbre_impulsion_vitesse; volatile int front_montant = LOW; void setup() // fonction setup - début de l'exécution du programme { Serial.begin(9600); attachInterrupt(0, counter, RISING); //fonction permettant d’incrémenter le nbre_impulsion, avec la patte digitale de mon codeur branché sur l'entrée 3 digitale pinMode(BP1State,INPUT); // déclaration de mes BP en tant que entrée pinMode(BP3State,INPUT); pinMode(BP4State,INPUT); pinMode(BP5State,INPUT); digitalWrite(BP1State, HIGH); // je ne sais plus pourquoi j'ai mis ces fonctions, je l'avais vu dans un autre programme ... peut être pour tester les BP digitalWrite(BP3State, HIGH); digitalWrite(BP4State, LOW); digitalWrite(BP5State, LOW); lcd.begin(20,4); // propriété de mon écran lcd : 20 caractère et 4 lignes lcd.print("LCD OK"); // test du lcd delay(2000); lcd.clear(); delay(10); } void counter() //ici donc ma fonction, ou macro incrémentant le nbre_impulsion { ++nbre_impulsion; ++nbre_impulsion_vitesse; // cette variable est nécéssaire, car contrairement, a nbre_impulsion, il ne se réinitialise pas en fin de boucle ledMetro.check } void loop() { int pos_rad; int pos_deg; int vitesse; int vitesse_BP1; int position_BP1_rad; int position_BP1_deg; int nbre_impulsion_vitesse; int pos_deg1; int pos_rad1; while (digitalRead(BP3State) == HIGH); // tant que je n'appuie pas sur ce bouton, ici, il sert en gros a bouton d'arret d'urgence quoi ... { if (digitalRead(BP4State) == HIGH); // cet interrupteur indique s'il est actionné que le portail partira en position fermée { while (pos_deg < 90) { lcd.clear(); if (ledMetro.check() != 1) //si le temps est different de 2sec. { if (digitalRead(BP1State) == LOW); // si l'on appuie sur ce BP, alors on enregistre la position et la vitesse a ce moment { vitesse_BP1 = vitesse; position_BP1_rad = pos_rad; position_BP1_deg = pos_deg; } pos_rad = nbre_impulsion*(3.14/2)/90; // calculs pour avoir les position en radian, degré et la vitesse, précision : mon codeur envoie 1 impulsion par degré pos_deg = nbre_impulsion; vitesse = vitesse = (nbre_impulsion_vitesse*(3.14/2)/90)/2; lcd.setCursor(0,0); // on affiche la position et la vitesse lcd.print("POS DEG: "); lcd.setCursor(9,0); lcd.print(pos_deg); lcd.setCursor(0,1); lcd.print("POS RAD: "); lcd.setCursor(9,1); lcd.print(pos_rad); lcd.setCursor(0,2); lcd.print("vitesse: "); lcd.setCursor(9,2); lcd.print(vitesse); } if (ledMetro.check() == 1) // on efface toute les 2sec. { lcd.clear(); delay(100); } } if(pos_deg >= 90) // quand la position en degré est égale a 90, ou un peu supérieure, alors on arrete, puisque le portail ne bouge plus { lcd.clear(); delay(10); lcd.print("INFORMATIONS AU"); lcd.setCursor(0,1); lcd.print("POINT VOULU"); delay(2000); lcd.clear(); delay(10); lcd.setCursor(0,0); // on affiche à ce moment la la vitesse et la position au moment ou l'on avais appuyé sur BP1 lcd.print("vit. BP1: "); lcd.setCursor(10,0); lcd.print(vitesse_BP1); lcd.setCursor(0,1); lcd.print("POS DEG BP1:"); lcd.setCursor(12,1); lcd.print(position_BP1_deg); lcd.setCursor(0,2); lcd.print("POS RAD BP1:"); lcd.setCursor(12,2); lcd.print(position_BP1_rad); delay(100000000); } } if (digitalRead(BP5State) == HIGH); //si BP5 est appuyé, c'est que le portail part en position ouverte, les calculs de positions sont donc différents { while (pos_deg1 > 0) // quand il finira de bouger, la position sera de 0 { lcd.clear(); if (ledMetro.check() != 1) { pos_rad1 = (3.14/2)-(nbre_impulsion*(3.14/2)/90); pos_deg1 = 90-nbre_impulsion; vitesse = vitesse = (nbre_impulsion_vitesse*(3.14/2)/90)/2; lcd.setCursor(0,0); lcd.print("POS DEG: "); lcd.setCursor(9,0); lcd.print(pos_deg1); lcd.setCursor(0,1); lcd.print("POS RAD: "); lcd.setCursor(9,1); lcd.print(pos_rad1); lcd.setCursor(0,2); // pour le reste, tout est pareil que quand BP4 est actionné au lieu de BP5 lcd.print("vitesse: "); lcd.setCursor(9,2); lcd.print(vitesse); if (digitalRead(BP1State) == LOW); { vitesse_BP1 = vitesse; position_BP1_rad = pos_rad1; position_BP1_deg = pos_deg1; } } if (ledMetro.check() == 1) { lcd.clear(); delay(100); } } if (pos_deg <= 0) { lcd.print("INFORMATIONS AU"); lcd.setCursor(0,1); lcd.print("POINT VOULU"); delay(2000); lcd.clear(); delay(10); lcd.setCursor(0,0); lcd.print("vit. BP1: "); lcd.setCursor(10,0); lcd.print(vitesse_BP1); lcd.setCursor(0,0); lcd.print("POS DEG BP1:"); lcd.setCursor(12,1); lcd.print(position_BP1_deg); lcd.setCursor(0,2); lcd.print("POS RAD BP1:"); lcd.setCursor(12,2); lcd.print(position_BP1_rad); delay(100000000); } } } if (digitalRead(BP3State) == LOW) { lcd.print("! Recommencez !"); // si on a appuyé sur BP3, ce message s'affiche, et le programme doit etre redémarré. delay(10000000); } }
Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.
#8
Posté 27 février 2012 - 01:56
int LED = 13; // choisir la broche pour la LED int BOUTON = 3; // Branchez le bouton poussoir a la broche 3 broches digital void setup() { pinMode(LED, OUTPUT); // déclare la LED en ( sortie ) pinMode(BOUTON, INPUT); // déclare le bouton-poussoir en ( d'entrée ) } void loop(){ val = digitalRead(BOUTON); // lire la valeur d'entrée if (val == HIGH) { // vérifier si l'entrée est ( HAUTE ) digitalWrite(LED, LOW); // LED OFF ( BASSE ) } else { digitalWrite(LED, HIGH); // LED ON ( HAUTE ) } }
Je tes détaller le code pour que tu comprène .
#9
Posté 27 février 2012 - 05:41
Voila un exemple d'un morceaux de programme pour un bouton poussoir , ça peux te servir je pense.
int LED = 13; // choisir la broche pour la LED int BOUTON = 3; // Branchez le bouton poussoir a la broche 3 broches digital void setup() { pinMode(LED, OUTPUT); // déclare la LED en ( sortie ) pinMode(BOUTON, INPUT); // déclare le bouton-poussoir en ( d'entrée ) } void loop(){ val = digitalRead(BOUTON); // lire la valeur d'entrée if (val == HIGH) { // vérifier si l'entrée est ( HAUTE ) digitalWrite(LED, LOW); // LED OFF ( BASSE ) } else { digitalWrite(LED, HIGH); // LED ON ( HAUTE ) } }
Je tes détaller le code pour que tu comprène .
Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.
#10
Posté 27 février 2012 - 05:42
Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.
0 utilisateur(s) li(sen)t ce sujet
0 members, 0 guests, 0 anonymous users