Aller au contenu


Photo

Problème avec Bouton Poussoir


  • Veuillez vous connecter pour répondre
9 réponses à ce sujet

#1 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

Posté 23 février 2012 - 11:17

Salut à tous,

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 :


montage_electronique_ppe.jpg

Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.


#2 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

Posté 23 février 2012 - 11:17

Voila le code :

#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 Microrupteurman

Microrupteurman

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 210 messages
  • Gender:Male
  • Location:Aquitaine,Gironde

Posté 24 février 2012 - 12:33

delay(10000000);

C'est pas un peu beaucoup ??

 
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 seb03000

seb03000

    @pump_upp - best crypto pumps on telegram !

  • Membres
  • PipPipPipPipPip
  • 1 193 messages
  • Location:https://t.me/pump_upp

Posté 24 février 2012 - 02:01

delay(10000000);


Oui la c'est trop long , mes le delay a 100

#5 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

Posté 24 février 2012 - 09:44

Ok, je vais faire sa, disons que j'avais mis un delay hyper long, parce que après, ben c'est la fin du programme : soit on a appuyé sur BP3 (en cas de souci) et donc la sa demande de recommencer, soit on arrive avec une position de 90 degré, et donc la, le portail ne s'ouvre plus, on affiche la position au moment ou l'on a appuyé sur BP1.

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 seb03000

seb03000

    @pump_upp - best crypto pumps on telegram !

  • Membres
  • PipPipPipPipPip
  • 1 193 messages
  • Location:https://t.me/pump_upp

Posté 24 février 2012 - 02:08

Déjà pour commencé , tu devrai nous explique chaque parcelle de ton programme , je veux dire que dans ton programme tu devrai

mètre des explicatifs , et aussi dutilisé cette balise Image IPB pour que ton programme soi lissible

#7 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

Posté 24 février 2012 - 06:50

ok pas de souci, je reprend tout sa :

#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 seb03000

seb03000

    @pump_upp - best crypto pumps on telegram !

  • Membres
  • PipPipPipPipPip
  • 1 193 messages
  • Location:https://t.me/pump_upp

Posté 27 février 2012 - 01:56

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 .

#9 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

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 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

Posté 27 février 2012 - 05:42

Ok, je cause essayer sa vendredi ! Merci beaucoup :)

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