Bonjour, je cherche à faire un affichage de l'heure et uniquement de l'heure avec un moteur pas à pas 28BJY... à des fins didactiques pour petits enfants...
Et mon problème est pour le bouton poussoir utilisé pour l'initialisation (dans void initialisation) je dois laisser mon doigt sur le bouton poussoir jusqu'à ce que l'aiguille unique commandée par le mot p a p arrive sur le fin de course. J'aimerai ne pas devoir laisser mon doigt sur le b-poussoir.
Le code est ci-dessous. Une idée pour résoudre ce problème?
Merci
// progamme test pour commander un moteur pas à pas
//afin d'apprendre à lire l'heure pour les petits et uniquement
//les heures dans un premier temps
//didiersee
#include <Stepper.h> // librairie moteur pas a pas
int nombreDePas = 32*64; // = 2048 pas
int fin_1 = 2; //declaration fin de course 1 sur borne 2
int etat_fin_1; // declaration de la variable etat du fin de course pour stocker val
int bpoussoir = 3; // déclaration Bpoussoir sur borne 4 si ON avance une heure
int bpoussoir2 = 4;// déclaration Bpoussoir2 sur borne 3 si ON avance de 2 heures
int bpoussoir3 = 5;// déclaration Bpoussoir3 sur borne 5 si ON on initialise
// initialize the stepper library on pins 8 through 11:
Stepper monMoteur(nombreDePas, 9, 11, 10, 8);
//*********************************************************
void setup() {
monMoteur.setSpeed(9);// set the speed at 60 rpm:
monMoteur.step(0);// avance de zero pas
pinMode(fin_1, INPUT); //déclaration des entrées sorties
pinMode(bpoussoir, INPUT_PULLUP);
pinMode(bpoussoir2, INPUT_PULLUP);
pinMode(bpoussoir3, INPUT_PULLUP);
Serial.begin(9600);// initialize the serial port:
delay(500);
}
//-----------------------------------------------------------
void loop() {
if (digitalRead(bpoussoir3)==LOW)
{
initialise();
}
if (digitalRead(bpoussoir)==LOW) //comme pullup LOW => bpoussoir enclenché
{
monMoteur.step(170); // moteur avance de 170 pas (une heure)
Serial.println("une heure est passee");
}
if (digitalRead(bpoussoir2)==LOW)
{
monMoteur.step(340);
Serial.println("deux heures sont passees");
delay(500);
}
}
//====================================================
void initialise()
{
boolean etat_fin_1 = digitalRead(fin_1);//lecture du contact fin de course 1
while (digitalRead(fin_1)==LOW) // si fin course ouvert
{
monMoteur.step(10);// le moteur va avancer de 10 pas jusqu'à ce quil trouve fin course
}
if (digitalRead(fin_1)==HIGH)
{
monMoteur.step(0);
Serial.println("fin de course ferme");
Serial.println("horloge en position zero");
}
}
J'ai du mal à voir où est le problème dans ton code. Le while assure d'exécuter la tâche sans interruptions jusqu'à fermeture de ta fin de course. Par contre tu ne fixes pas le potentiel de la broche de détection fin de course.
pinMode(fin_1, INPUT); //déclaration des entrées sorties
En l'absence de schéma, je suppose que le contact fin_1 est en PULL_DOWN et qu'il y a une résistance de ~10kOhm entre cette pin et le GND? Et que ce contact est connecté au +5v.
Est-ce-que le texte "fin de course ferme" et "horloge en position zero" s'affiche plusieurs fois?
Oui jpbbricole le texte "fin de course ferme" et "horloge en position zero" s'affiche plusieurs fois.
Pour le fin de course c'est un contact qui place la borne 2 directement au + et je n'ai pas mis de résistance PULL_DOWN, c'est indispensable à votre avis?
Merci
Je ne comprends pas zlika "Par contre tu ne fixes pas le potentiel de la broche de détection fin de course"
Pour le fin de course c'est un contact qui place la borne 2 directement au + et je n'ai pas mis de résistance PULL_DOWN.
Merci
didiersee:
Oui jpbbricole le texte "fin de course ferme" et "horloge en position zero" s'affiche plusieurs fois.
Pour le fin de course c'est un contact qui place la borne 2 directement au + et je n'ai pas mis de résistance PULL_DOWN, c'est indispensable à votre avis?
Merci
La répétition des textes provient du fait que tu n'as pas mis de résistance sur l'entrée fin_1 contre GND.
2 solutions pour résoudre le problème, mettre une résistance de ~10k Ohm entre la broche fin_1 et le GND.
2ème solution sans composant, mettre GND à la place de +5v sur le contact de fin de course et configurer l'entrée fin_1 comme les entrées des boutons poussoir
inMode(fin_1, INPUT_PULLUP);
Et dans la void initialise()
change les HIGH en LOW et vice-versa
Lorsque ton contact fin de course et ouvert, la broche de l'arduino n'est relié à rien du tout et son potentiel varie au gré des ondes et des parasites électriques. Tu as donc des déclenchements intempestifs lors de tes digitalRead lorsque le signal de la broche se promène vers le 5V.
Pour éviter cela, on utilise une résistance d'une centaine de kΩ pour 'forcer' le potentiel de la broche sur le 0V (pull-down) ou le VCC (pull-up).
Cependant, tu peux utiliser une résistance interne à la broche de l'arduino en utilisant l'instruction:
pinMode(pin, INPUT_PULLUP)
qui va fixé le potentiel de la broche à Vcc.
Dans ton cas (et avec ton code actuel) , tu utilises ton fin de course pour fixer le potentiel à Vcc donc, au repos, tu dois 'forcer' le potentiel de ta broche à 0V avec une résistance de 100kΩ relié à 0V.
Sinon tu peux faire le choix de relier ton fin de course au 0V et d'utiliser
pinMode(fin_1, INPUT_PULLUP);
pour activer la résistance interne qui reliera la broche à Vcc.
Un grand merci à vous deux tous les problèmes sont résolus j'ai adopté votre solution du pullup pour le fin de course comme pour les boutons poussoirs.
Encore merci ;). Vous pourriez peut-être me renseigner un bon tuto pour actionner 12 boutons poussoir avec des résistances sur une entrée analogique par exemple A0. Vous l'aurez compris ceci afin de pouvoir utiliser un arduino nano sans devoir utiliser toutes les pins qui ne seront par ailleurs suffisamment nombreuses puisqu'il m'en faudra 13 (12h00 + R a ZERO) +4 pour le moteur pas à pas.
De ce que j'ai vu sur le web le résultat HIGH est donné au dessus de 3V il ne reste donc que deux volts à diviser par 12 pour obtenir 12 tensions différentes avec la formule du pont diviseur Vout = R2 ÷ (R1 + R2) × V1.
Merci
13 boutons poussoirs, c'est l'équivalent d'un clavier de 34 touches + 1 bouton poussoir (ou éventuellement 44). Si la disposition ne te convient pas, tu peux néanmoins les câbler de la même manière ce qui te permettra d'utiliser la librairie d'un clavier. sinon tu peux toujours voir du coté d'un clavier ou extension I/O sur bus I2C.
Pour étendre les entrées numériques, jusqu'à 64 (8x8) des petits modules
En i2C qui se chaînent et on peut en utiliser 8 par bus.
Avec la bibliothèque PCF8574-Master.
Voilà ça fonctionne presque complètement le presque justifie votre aide.
En fait j'ai les 13 boutons poussoirs, 12 pour les heures et le 13 pour remettre à zero.
Le moteur pas à pas est monté avec une petite aiguille en plexi comprenant un aimaint pour actionner le read ce qui arrête le moteur pour la remise à zero.
Il n'y a qu'une chose qui ne fonctionne pas c'est le bouton poussoir 7 donc pour 7 heures. J'ai essayé sur la pin13 puis sur A6 mais rien n'y fait, j'ai changé de poussoir malgré que je ne constatais rien d'anormal à l'Ohmmètre. Le code est ci-dessous vous verrez en commentaire entre /-----/ le code qui pose problème et dès que je le laisse en commentaire comme dans le code attaché tout fonctionne??? Le schéma est en attaché.
Sur la console série j'ai tout le temps 7 heures sont passées même en enlevant le poussoir de la bredboard.
Quelqu'un a une idée pour résoudre ce problème?
Merci
// progamme test pour commander un moteur pas à pas
//afin d'apprendre à lire l'heure sur horloge classique pour les petits et uniquement
//les heures dans un premier temps
//didiersee
#include <Stepper.h> // librairie moteur pas a pas
int nombreDePas = 32*64; // = 2048 pas
int fin_1 = 2; //declaration fin de course 1 sur borne 2
int etat_fin_1; // declaration de la variable etat du fin de course pour stocker val
int bpoussoir = 3; // déclaration Bpoussoir sur borne 3 si ON (avance de 1 heure)
int bpoussoir2 = 4; // déclaration Bpoussoir2 sur borne 4 si ON (avance de 2 heures)
int bpoussoir3 = 5; // déclaration Bpoussoir3 sur borne 5 si ON (avance de 3 heures)
int bpoussoir4 = 6; //déclaration Bpoussoir4 sur borne 6 si ON (avance de 4 heures)
int bpoussoir5 = 7; // déclaration Bpoussoir5 sur borne 7 si ON (avance de 5 heures)
int bpoussoir6 = 12; //déclaration Bpoussoir6 sur borne 12 si ON (avance de 6 heures)
int bpoussoir7 = A6; // déclaration Bpoussoir7 sur borne 13 si ON (avance de 7 heures)
int bpoussoir8 = A0; // déclaration Bpoussoir8 sur borne A0 si ON (avance de 8 heures)
int bpoussoir9 = A1; // déclaration Bpoussoir9 sur borne A1 si ON (avance de 9 heures)
int bpoussoir10 = A2; // déclaration Bpoussoir11 sur borne A2 si ON (avance de 10 heures)
int bpoussoir11 = A3; // déclaration Bpoussoir12 sur borne A3 si ON (avance de 11 heures)
int bpoussoir12 = A4; // déclaration Bpoussoir12 sur borne A4 si ON (avance de 12 heures)
int bpoussoir13 = A5; // initialise le moteur à la position zero ou 12hrs
Stepper monMoteur(nombreDePas, 9, 11, 10, 8);
/* INT1 => fil jaune => vers borne 8 arduino
* INT2 => fil orange => vers borne 9 arduino
* INT3 => fil rouge => vers borne 10 arduino
* INT4 => fil bleu => vers borne 11 arduino
*/
//*********************************************************
void setup() {
monMoteur.setSpeed(9);// set the speed at 60 rpm:
monMoteur.step(0);// avance de zero pas
//déclaration des entrées sorties
pinMode(fin_1, INPUT_PULLUP); // contact magnétique
pinMode(bpoussoir, INPUT_PULLUP);
pinMode(bpoussoir2, INPUT_PULLUP);
pinMode(bpoussoir3, INPUT_PULLUP);
pinMode(bpoussoir4, INPUT_PULLUP);
pinMode(bpoussoir5, INPUT_PULLUP);
pinMode(bpoussoir6, INPUT_PULLUP);
pinMode(bpoussoir7, INPUT_PULLUP);
pinMode(bpoussoir8, INPUT_PULLUP);
pinMode(bpoussoir9, INPUT_PULLUP);
pinMode(bpoussoir10, INPUT_PULLUP);
pinMode(bpoussoir11, INPUT_PULLUP);
pinMode(bpoussoir12, INPUT_PULLUP);
pinMode(bpoussoir13, INPUT_PULLUP);
Serial.begin(9600);// initialize the serial port:
delay(100);
}
//-----------------------------------------------------------
void loop() {
if (digitalRead(bpoussoir13)==LOW) //comme pullup LOW => bpoussoir enclenché
{
initialise();
}
if (digitalRead(bpoussoir)==LOW) //comme pullup LOW => bpoussoir enclenché
{
monMoteur.step(170); // moteur avance de 170 pas (une heure)
Serial.println("1 heure est passee");
delay(20);
}
if (digitalRead(bpoussoir2)==LOW)
{
monMoteur.step(341);
Serial.println("2 heures sont passees");
delay(20);
}
if (digitalRead(bpoussoir3)==LOW)
{
monMoteur.step(511);
Serial.println("3 heures sont passees");
delay(20);
}
if (digitalRead(bpoussoir4)==LOW)
{
monMoteur.step(681);
Serial.println("4 heures sont passees");
delay(20);
}
if (digitalRead(bpoussoir5)==LOW)
{
monMoteur.step(851);
Serial.println("5 heures sont passees");
delay(20);
}
if (digitalRead(bpoussoir6)==LOW)
{
monMoteur.step(1021);
Serial.println("6 heures sont passees");
delay(20);
}
[color=red]/*if (digitalRead(bpoussoir7)==LOW)
{
monMoteur.step(1191);
Serial.println("7 heures sont passees");
delay(20);
}*/[/color]
if (digitalRead(bpoussoir8)==LOW)
{
monMoteur.step(1361);
Serial.println("8 heures sont passees");
delay(20);
}
if (digitalRead(bpoussoir9)==LOW)
{
monMoteur.step(1530);
Serial.println("9 heures sont passees");
delay(20);
}
if (digitalRead(bpoussoir10)==LOW)
{
monMoteur.step(1701);
Serial.println("10 heures sont passees");
delay(20);
}
if (digitalRead(bpoussoir11)==LOW)
{
monMoteur.step(1871);
Serial.println("11 heures sont passees");
delay(20);
}
if (digitalRead(bpoussoir12)==LOW)
{
monMoteur.step(2041);
Serial.println("12 heures sont passees");
delay(20);
}
}
//====================================================
void initialise()
{
boolean etat_fin_1 = digitalRead(fin_1);//lecture du contact fin de course 1
while (digitalRead(fin_1)==HIGH) // si fin course ouvert (inverse pcq pullup)
{
monMoteur.step(10);// le moteur va avancer de 10 pas jusqu'à ce qu'il trouve fin course
}
if (digitalRead(fin_1)==LOW)
{
monMoteur.step(0);
Serial.println("fin de course ferme");
Serial.println("horloge en position zero");
}
}
Bonjour jpbbricole voilà j'ai remplacé if (digitalRead(bpoussoir7)==LOW) par if (digitalRead(bpoussoir9)==LOW) et j'ai placé le if de bouton poussoir9 en remarque.
Et bien ça fonctionne normalement aussi??
Une idée pour moi?
Merci
La broche A6 ne fonctionne pas en numérique mais la broche 13 ne devrait pas poser problème. Ton programme me semble bon. Dans le doute, fait un petit programme qui lit l'état d'une broche et l'affiche dans le moniteur pour vérifier. Tu peux aussi faire le test en sortie avec une led et une résistance de 330Ω.
Edit: en regardant différents schémas de la nano, il semble que la broche 13 soit reliée à une led via une résistance. Tu devrais le voir avec le test en sortie. Si c'est le cas, il faudra retirer la Led (ou la résistance) pour pouvoir l'utiliser comme les autres broches en entrée. Sinon tu peux inverser la logique en supprimant l'utilisation du pull-up, en reliant ton poussoir sur Vcc est en rajoutant une résistance de ~10kΩ entre ta broche 13 et GND. Ou autre solution plus simple, tu utilises la broche 13 en sortie pour commander le moteur et tu utilises celle du moteur pour ton entrée.
sinon pour ajouter 16 entrées sorties d'un coup il y a aussi le MCP23017 (on peut monter à 128 entrées/sorties) et qui sait fonctionner par interruption, pas besoin de "poller" en permanence