souci de programmation
#1
Posté 14 février 2012 - 12:26
#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
Posté 14 février 2012 - 01:05
Mes quel écran LCD possède tu , a tu un lien une photo.
@Cordialement.
#3
Posté 14 février 2012 - 01:38
Codeur? Analogique? Etat à 1? C'est un codeur analogique ou un codeur incrémental?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.
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" ???
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?int front_montant = digitalRead(7);
ca m'intéresserai aussi!Mes quel écran LCD possède tu?
#4
Posté 14 février 2012 - 01:38
#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
Posté 14 février 2012 - 02:36
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
Posté 14 février 2012 - 02:37
#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
Posté 14 février 2012 - 02:49
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
Posté 14 février 2012 - 02:58
Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.
#9
Posté 14 février 2012 - 03:23
Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.
#10
Posté 14 février 2012 - 03:28
sinon, en utilisant une interruption ca doit aussi être jouable (les pins 2 et 3 peuvent être utilisées en "External Interruption").
#11
Posté 14 février 2012 - 06:24
Encore merci de votre aide !!!
Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.
#12
Posté 14 février 2012 - 06:31
Moi c'est pareil....je ne vois pas du tout comment l'introduire et le rédiger dans mon programme.
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
Posté 14 février 2012 - 07:28
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?
#14
Posté 14 février 2012 - 07:30
#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
Posté 14 février 2012 - 07:35
Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.
#16
Posté 14 février 2012 - 08:03
Les principes gouvernent les gens honnêtes, les lois gouvernent les gens méchants.
#17
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); } } }
#18
Posté 15 février 2012 - 06:26
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
Posté 15 février 2012 - 06:43
a mon avis il fauu juste relier le moin de ton generateur et le gnd de ta carte arduino
#20
Posté 15 février 2012 - 08:44
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