Aller au contenu


Photo
- - - - -

souci de programmation


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

#1 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

Posté 14 février 2012 - 12:26

Bonjour, je suis en train de finir mon projet de ppe, mais il reste une chose sur laquelle je bloque : une partie du programme. Je code avec une Arduino uno, relié a un écran lcd et a un codeur (http://www.gotronic.fr/art-encodeur-rotatif-3530-12123.htm). En fait, j'ai branché le codeur sur une entrée analogique (jusque-là, pas de souci) et je dois l'incrémenter dans mon programme : a chaque foi que son état est 1, je dois incrémenter, et afficher cette valeur sur le lcd, mais sa ne marche pas. Je met le programme si dessous :


#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=2;


LiquidCrystal lcd(RS, E, D4, D5, D6, D7);
Metro ledMetro = Metro(2000);



void setup() // fonction setup - début de l'exécution du programme
{
Serial.begin(9600);
lcd.begin(20,4);
lcd.print("LCD OK");
delay(2000);
lcd.clear();
delay(10);
}

void loop()
{


int nbre_impulsion;
int pos_rad;
int pos_deg;
lcd.clear();

while (pos_deg != 90)

{

lcd.clear();

if (ledMetro.check() != 1)
{

int front_montant = digitalRead(7);
for (int nbre_impulsion = 0; nbre_impulsion < 90;++nbre_impulsion)
{
++nbre_impulsion;
}

pos_rad = nbre_impulsion*(3.14/2)/90;
pos_deg = nbre_impulsion;

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);

}

if (ledMetro.check() == 1)
{
lcd.clear();
delay(100);
}

}

voila, je précise que la librairie metro.h sert a gérer le temps (tant que le temps est différent de 5 secondes, Faire ...)

Merci par avance pour vos réponses

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


#2 seb03000

seb03000

    @pump_upp - best crypto pumps on telegram !

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

Posté 14 février 2012 - 01:05

Tu possède une carte Arduino uno plus un Encodeur rotatif 3530 plus un écran LCD.

Mes quel écran LCD possède tu , a tu un lien une photo.

@Cordialement.

#3 jarran29

jarran29

    Membre

  • Membres
  • 20 messages

Posté 14 février 2012 - 01:38

Intervention sans grande connaissance, mais ca me sert de questions aussi ^^.

En fait, j'ai branché le codeur sur une entrée analogique (jusque-là, pas de souci) et je dois l'incrémenter dans mon programme : a chaque foi que son état est 1, je dois incrémenter, et afficher cette valeur sur le lcd, mais sa ne marche pas.

Codeur? Analogique? Etat à 1? C'est un codeur analogique ou un codeur incrémental?

Si j'ai bien compris, on peut configurer les AI en DI chez arduino... Je ne vois pas de fonction qui configurerai la pin en digital, et non plus en analog.

for (int nbre_impulsion = 0; nbre_impulsion < 90;++nbre_impulsion)
{
++nbre_impulsion;
}
à quoi sert ce bout de code?
tu redéclares nbre_impulsion dans ton for, donc la variable n'est "utilisable" qu'entre les accolades (si je me souviens bien de la portée des variable), et est indépendant du nbre_impulsion déclaré au début du du loop().
aussi, tu incrémentes deux fois ta variable par boucle for (première fois dans le for, deuxième entre les accolades), pourquoi?
donc ce for n'est qu'une delayer équivalent à 45 "temps de cycles" ???

int front_montant = digitalRead(7);

J'imagine que c'est ca ton point d'entrée de ton codeur. Mais tu n'utilises pas front_montant ailleurs? De plus, là tu détectes un niveau haut, pas un front. N'y a t il pas d'entrée d'interruption sur une Uno?

Mes quel écran LCD possède tu?

ca m'intéresserai aussi!
"Avoir des idées est toujours plus facile que de les réaliser."

#4 Microrupteurman

Microrupteurman

    Pilier du forum

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

Posté 14 février 2012 - 01:38

Si ca peut t'aider voila le code que j'utilise pour afficher sur le serial monitor le compte.

#define encoder0PinA  2
#define encoder0PinB  3


volatile double encoder0Pos = 0;
volatile boolean PastB = 0;
volatile boolean update = false;
double distance = 0;
void setup() 
{
Serial.begin(115200);

  pinMode(encoder0PinA, INPUT);
  //turn on pullup resistor
  digitalWrite(encoder0PinA, HIGH);
  pinMode(encoder0PinB, INPUT); 
  //turn on pullup resistor
  digitalWrite(encoder0PinB, HIGH);

  attachInterrupt(1, doEncoderB, FALLING); 
}

void loop()
{  
  if (update){
    update = false;
    PastB? encoder0Pos++:encoder0Pos--;
    Serial.print(encoder0Pos,DEC);
  }
}

void doEncoderB()
{
  PastB=(boolean)digitalRead(encoder0PinA);
  update = true; 
}

 
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 !
 


#5 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

Posté 14 février 2012 - 02:36

Alors pour l'écran, c'est le meme que celui ci (ou a peut près, je l'ai trouvé en salle SI ...) : http://www.gotronic.fr/art-afficheur-lcd1602blc-2232.htm

Pour le codeur, je l'ai testé en branchant sur une entrée analogique, (et je vois sur le serial que dès que je tourne l'axe, les valeurs changent, donc on a 0 ou 1) via le programme suivant :

void setup() {
Serial.begin(9600);
pinMode(7, INPUT);
}

void loop() {
int sensorValue = digitalRead(7);
Serial.println(sensorValue);
}


Pour ce qui en est de la variable front_montant, ce n'est qu'une variable décrivant l'état du codeur. Pour la variable nbre_impulsion, c'est le nombre d'impulsions envoyés par le codeur pendant l'exécution du programme.

Ensuite, j'avais pas fais gaffe que j'avais incrémenté 2 fois, donc j'ai viré la partie du programme suivante : for (int nbre_impulsion = 0; nbre_impulsion < 90;++nbre_impulsion)
je vais juste laisser ++nbre_impulsion, je pense que sa doit suffire :)

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


#6 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

Posté 14 février 2012 - 02:37

Voila donc le nouveau programme :

#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=2;


LiquidCrystal lcd(RS, E, D4, D5, D6, D7);
Metro ledMetro = Metro(2000);



void setup() // fonction setup - début de l'exécution du programme
{
Serial.begin(9600);
lcd.begin(20,4);
lcd.print("LCD OK");
delay(2000);
lcd.clear();
delay(10);
}

void loop()
{


int nbre_impulsion;
int pos_rad;
int pos_deg;
lcd.clear();

while (pos_deg != 90)

{

lcd.clear();

if (ledMetro.check() != 1)
{

int front_montant = digitalRead(7);
If (front_montant == 1)
{
++nbre_impulsion;
}

pos_rad = nbre_impulsion*(3.14/2)/90;
pos_deg = nbre_impulsion;

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);

}

if (ledMetro.check() == 1)
{
lcd.clear();
delay(100);
}

}

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


#7 Microrupteurman

Microrupteurman

    Pilier du forum

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

Posté 14 février 2012 - 02:49

Les codeur, c'est digital.

 
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 !
 


#8 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

Posté 14 février 2012 - 02:58

Oui, c'est pour cela que je met la patte du codeur sur une entrée digitale ...

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


#9 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

Posté 14 février 2012 - 03:23

Maintenant, mon programme fonctionne, mais il y a un souci : lorsque l'etat de mon codeur est 1, il le reste parfois quelques secondes. Par conséquent, la valeur nombre d'impulsion s’incrémente plusieurs fois. Il me faudrait donc un fonction qui sorte de la boucle dès que l'on a incrémenté une fois, mais je ne sais pas du tout comment faire, ni comment m'y prendre ...

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


#10 jarran29

jarran29

    Membre

  • Membres
  • 20 messages

Posté 14 février 2012 - 03:28

il faut que tu ais une variable qui mémorise l'état précédent, histoire de réellement détecter les fronts montants.

sinon, en utilisant une interruption ca doit aussi être jouable (les pins 2 et 3 peuvent être utilisées en "External Interruption").
"Avoir des idées est toujours plus facile que de les réaliser."

#11 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

Posté 14 février 2012 - 06:24

Tu n'aurai pas un exemple a tout hasard ? Je viens de regarder sur le site arduino, et le mode intéressant serait : RISING, mais je ne vois pas du tout comment l'introduire et le rédiger dans mon programme.

Encore merci de votre aide !!! :)

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


#12 Microrupteurman

Microrupteurman

    Pilier du forum

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

Posté 14 février 2012 - 06:31

je ne vois pas du tout comment l'introduire et le rédiger dans mon programme.

Moi c'est pareil....

 
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 !
 


#13 jarran29

jarran29

    Membre

  • Membres
  • 20 messages

Posté 14 février 2012 - 07:28

ba, je peux pas savoir pour vous, hein? je ne connais pas du tout les possibilités de l'arduino... je ne fais que me baser sur mes vieux cours de µP...

mais bon, comme ca, à froid et sans avoir testé :

void setup()
{
  int nbre_impulsion = 0;
  attachInterrupt(2, counter, RISING);
  // initialisation du LCD
}

void loop()
{
  // affichage des données sur le LCD
}

void counter()
{
  ++nbre_impulsion;
}
sur un front montant sur la pin 2, le système interrompt loop() pour exécuter une fois counter()

par contre, question : tu ne gères pas le sens de rotation de ton codeur?
"Avoir des idées est toujours plus facile que de les réaliser."

#14 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

Posté 14 février 2012 - 07:30

#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=2;


LiquidCrystal lcd(RS, E, D4, D5, D6, D7);
Metro ledMetro = Metro(2000);

void incrementation()
{
int nbre_impulsion;
nbre_impulsion = nbre_impulsion++;
}



void setup() // fonction setup - début de l'exécution du programme
{
Serial.begin(9600);
lcd.begin(16,2);
attachInterrupt(0, incrementation, RISING);
lcd.print("LCD OK");
delay(2000);
lcd.clear();
delay(10);
}



void loop()
{

int nbre_impulsion;
int pos_rad;
int pos_deg;
lcd.clear();

while (pos_deg != 90)

{

lcd.clear();

if (ledMetro.check() != 1)
{

pos_rad = nbre_impulsion*(3.14/2)/90;
pos_deg = nbre_impulsion;

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);

}

if (ledMetro.check() == 1)
{
lcd.clear();
delay(100);
}

}

}


Ce programme est il correct ?
De plus, comme j'ai mis attach interrupt 0, je dois donc mettre ma patte sur la broche digitale 1 ?

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


#15 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

Posté 14 février 2012 - 07:35

Pour le sens de rotation, ce n'est pas important. En fait, ce que je veux faire ici est une sous-partie d'un programme, ceci dis, il s'agit d'une sous partie assez importante ...

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


#16 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

Posté 14 février 2012 - 08:03

Apparemment, cela ne marche pas, la fonction attach interrupt ne doit pas bien fonctionner ...

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


#17 jarran29

jarran29

    Membre

  • Membres
  • 20 messages

Posté 14 février 2012 - 08:47

void incrementation()
{
int nbre_impulsion;
nbre_impulsion = nbre_impulsion++;
}
1) en déclarant dans la fonction, la variable n'est pas "lisible" de l'extérieur. soit tu la déclares dans le setup (en volatile peut être, je ne sais plus...), et elle sera dispo pour tout le programme, soit tu la passes en paramètre de la fonction (mais je ne sais pas si c'est possible en arduino).
2)soit tu fais "nbre_impulsion++"; ou bien "nbre_impulsion = nbre_impulsion + 1". sinon, c'est brouillon (et je ne suis pas sûr que ca marche).

attachInterrupt(0, incrementation, RISING);
les pins "external interrupt" sont 2 et 3 si je me souviens bien (qui sont respectivement 0 et 1 en paramètre, et non pas le n° de pin comme je l'ai cru précédement).

après réflexion, je te conseille le code suivant :

#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=2;

LiquidCrystal lcd(RS, E, D4, D5, D6, D7);
Metro ledMetro = Metro(2000);

int nbre_impulsion = 0;

void incrementation()
{
  nbre_impulsion++;
}

void setup() // fonction setup - début de l'exécution du programme
{
  Serial.begin(9600);
  attachInterrupt(0, incrementation, RISING);

  lcd.begin(16,2);
  lcd.print("LCD OK");
  delay(2000);
  lcd.clear();

  delay(10);
}

void loop()
{
  int pos_rad;
  int pos_deg;
  lcd.clear();

  while (pos_deg != 90)
  {
    lcd.clear();

    if (ledMetro.check() != 1)
    {
      pos_rad = nbre_impulsion*(3.14/2)/90;
      pos_deg = nbre_impulsion;

      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);
    }

    if (ledMetro.check() == 1)
    {
      lcd.clear();
      delay(100);
    }
  }
}

"Avoir des idées est toujours plus facile que de les réaliser."

#18 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

Posté 15 février 2012 - 06:26

Finalement, mon programme marche !!!
Merci beaucoup !!

Par contre, je voudrai rajouter des boutons poussoir, mais g un problème : je fais un test (exactement comme pour le codeur) et j'ai remarqué que si le bouton poussoir est alimenté par le 5V de ma carte Arduino, je trouve des valeurs cohérentes : j'appui le BP = 1, je lache, le BP = 0. Mais si jamais je branche mon bouton poussoir sur un générateur 5V, cela me fais n'importe quoi, cela affiche 0,1,0,0,0,1 ... sa que je n'appuie dessus ...

Tu ne serai pas pourquoi cela fais sa ?

Disons que c'est bien embettant car lorsque ma carte Arduino ne sera plus alimenté par le port USB, il faudra l'alimenter avec le génerateur 5V.

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


#19 julkien

julkien

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 032 messages
  • Gender:Male

Posté 15 février 2012 - 06:43

salut

a mon avis il fauu juste relier le moin de ton generateur et le gnd de ta carte arduino

#20 Valent81320

Valent81320

    Membre

  • Membres
  • 60 messages
  • Gender:Male

Posté 15 février 2012 - 08:44

Je l'ai déjà relié. J'ai aussi relié le +5V avec le + du générateur (sinon, la carte ne peut pas s'allumer).

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