Merci forcerouge !
tu as compris c'est exactement ça
-----
Merci forcerouge !
tu as compris c'est exactement ça
C'est pas que ce soit compliqué, c'est juste que c'est pas ce qui était dit dans le message #27:
"e souhaite que le moteur reparte dans l'autre sens même si le bouton reste enclenché plus de trois secondes"
Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
encore une fois l'objet de cette discussion était un programme simplifié pour tester les interrupteurs de fin de course sans le joystick et uniquement avec un moteur
Bon, j'ai essaye de te coder le truc (en reprenant ce qui avait ete deja fait par Ysan Delaverge) mais:
1) je suis debutant en programmation donc il y a surement de bien meilleures methodes, plus propres et plus efficientes.
2) je n'ai pas l'environnement Arduino installe sur ce PC donc je n'ai pas pu tester les eventuelles erreurs/fautes de frappe/manques de parentheses, etc qu'il pourrait avoir, a toi donc de corriger si necessaire.
En principe ca devrait marcher je pense.
L'idee c'est de faire tourner la boucle principale loop uniquement pour checker l'etat des butees. Si une des butees est activee, alors le programme switchera immediatement vers la fonction correspondante, chaque fonction permettant des deplacements dans toutes les directions, sauf une: celle de la butee (a regler individuellement pour chaque butee).
Si aucune butee n'est active, alors le programme switchera vers la fonction autorisant tous les deplacements.
Seul souci c'est que ca risque de moins bien marcher si deux butees sont actives en meme temps. A toi de voir comment regler le souci mais nul doute que c'est a la portee de n'importe quel programmeur present sur ce forum
En attendant ce code peut peut etre te depanner, donc le voici:
Bonne continuationconst byte PIN_VITESSE_MOTEUR_A = 3;
const byte PIN_SENS_MOTEUR_A = 12;
const byte PIN_FREIN_MOTEUR_A = 9;
const byte PIN_VITESSE_MOTEUR_B = 11;
const byte PIN_SENS_MOTEUR_B = 13;
const byte PIN_FREIN_MOTEUR_B = 8;
const byte PIN_JOYSTICK_X = A2;
const byte PIN_JOYSTICK_Y = A3;
int fin_coursex1 = 10;
int fin_coursex2 = 7;
int fin_coursey1 = 6;
int fin_coursey2 = 5;
void setup() {
Serial.begin(115200);
pinMode(PIN_VITESSE_MOTEUR_A, OUTPUT);
digitalWrite(PIN_VITESSE_MOTEU R_A, LOW);
pinMode(PIN_VITESSE_MOTEUR_B, OUTPUT);
digitalWrite(PIN_VITESSE_MOTEU R_B, LOW);
pinMode(PIN_SENS_MOTEUR_A, OUTPUT);
digitalWrite(PIN_SENS_MOTEUR_A , LOW);
pinMode(PIN_SENS_MOTEUR_B, OUTPUT);
digitalWrite(PIN_SENS_MOTEUR_B , LOW);
pinMode(PIN_FREIN_MOTEUR_A, OUTPUT);
digitalWrite(PIN_FREIN_MOTEUR_ A, LOW);
pinMode(PIN_FREIN_MOTEUR_B, OUTPUT);
digitalWrite(PIN_FREIN_MOTEUR_ B, LOW);
pinMode(fin_course1, INPUT); //ne pas oublier de mettre une resistance de pullup avec l'interruteur. Regarde sur le net si tu ne sais pas ce que c'est
pinMode(fin_course2, INPUT); //idem, pullup necessaire
}
//fonction principale
void loop() {
int pos_fin_courseX1 = digitalRead(fin_coursex1);
int pos_fin_coursex2 = digitalRead(fin_coursex2);
int pos_fin_coursey1 = digitalRead(fin_coursey1);
int pos_fin_coursey2 = digitalRead(fin_coursey2);
if(pos_fin_course1 == 1){ //remplace 1 par 0 si tu constates que ca fait l'inverse de ce qui est demande
fincoursex1();} //si le contacteur de fin de course est active, le programme va sortir immediatement de la fonction loop pour aller a la fonction fincoursex1
if(pos_fin_course2 == 1){ //idem
fincoursex2();}
if(pos_fin_coursey1 == 1){ //idem
fincoursey1();}
if(pos_fin_coursey2 == 1){ //idem
fincoursey2();}
else{
normalrun();} //Si aucun contacteur n'est enclenche, le programme sort de la boucle pour aller a la fonction normalrun. Il reviendra a la boucle une fois cette fonction effectuee.
}
//fonction de butee fin de course axe X cote 1
void fincoursex1() {
int joystickX = analogRead(PIN_JOYSTICK_X);
int joystickY = analogRead(PIN_JOYSTICK_Y);
if (joystickX > 700) { //disons qu'il est en butee a ce moment la donc il ne doit plus bouger. Si dans la realite tu constates que c'est l'inverse, alors intervertis avec la ligne du dessous (<300)
digitalWrite(PIN_VITESSE_MOTEU R_A, LOW);
}
else if (joystickX < 300) {
// Sinon si la valeur X est strictement inférieur à 300 le moteur A recule
digitalWrite(PIN_VITESSE_MOTEU R_A, HIGH);
digitalWrite(PIN_SENS_MOTEUR_A , LOW);
}
else {
// Sinon si la valeur X est comprise entre 300 et 700 (bornes inclusent) le moteur A ne bouge pas
digitalWrite(PIN_VITESSE_MOTEU R_A, LOW);
}
if (joystickY > 700) {
// Si la valeur Y est strictement supérieur à 700 le moteur B avance
digitalWrite(PIN_VITESSE_MOTEU R_B, HIGH);
digitalWrite(PIN_SENS_MOTEUR_B , HIGH);
}
else if (joystickY < 300) {
// Sinon si la valeur Y est strictement inférieur à 300 le moteur B recule
digitalWrite(PIN_VITESSE_MOTEU R_B, HIGH);
digitalWrite(PIN_SENS_MOTEUR_B , LOW);
}
else {
// Sinon si la valeur Y est comprise entre 300 et 700 (bornes inclusent) le moteur B ne bouge pas
digitalWrite(PIN_VITESSE_MOTEU R_B,LOW);
}
}
//fonction de butee fin de course axe X cote 2
void fincoursex2() {
int joystickX = analogRead(PIN_JOYSTICK_X);
int joystickY = analogRead(PIN_JOYSTICK_Y);
if (joystickX > 700) {
digitalWrite(PIN_VITESSE_MOTEU R_A, HIGH);
digitalWrite(PIN_SENS_MOTEUR_A , HIGH);
}
else if (joystickX < 300) { //butee: moteur arrete
digitalWrite(PIN_VITESSE_MOTEU R_A, LOW);
}
else {
digitalWrite(PIN_VITESSE_MOTEU R_A, LOW);
}
if (joystickY > 700) {
digitalWrite(PIN_VITESSE_MOTEU R_B, HIGH);
digitalWrite(PIN_SENS_MOTEUR_B , HIGH);
}
else if (joystickY < 300) {
digitalWrite(PIN_VITESSE_MOTEU R_B, HIGH);
digitalWrite(PIN_SENS_MOTEUR_B , LOW);
}
else {
digitalWrite(PIN_VITESSE_MOTEU R_B,LOW);
}
}
//fonction de butee fin de course axe Y cote 1
void fincoursey1() {
int joystickX = analogRead(PIN_JOYSTICK_X);
int joystickY = analogRead(PIN_JOYSTICK_Y);
if (joystickX > 700) {
digitalWrite(PIN_VITESSE_MOTEU R_A, HIGH);
digitalWrite(PIN_SENS_MOTEUR_A , HIGH);
}
else if (joystickX < 300) {
digitalWrite(PIN_VITESSE_MOTEU R_A, HIGH);
digitalWrite(PIN_SENS_MOTEUR_A , LOW);
}
else {
digitalWrite(PIN_VITESSE_MOTEU R_A, LOW);
}
if (joystickY > 700) { //butee
digitalWrite(PIN_VITESSE_MOTEU R_B,LOW);
}
else if (joystickY < 300) {
digitalWrite(PIN_VITESSE_MOTEU R_B, HIGH);
digitalWrite(PIN_SENS_MOTEUR_B , LOW);
}
else {
digitalWrite(PIN_VITESSE_MOTEU R_B,LOW);
}
}
//fonction de butee fin de course axe Y cote 2
void fincoursey2() {
int joystickX = analogRead(PIN_JOYSTICK_X);
int joystickY = analogRead(PIN_JOYSTICK_Y);
if (joystickX > 700) {
digitalWrite(PIN_VITESSE_MOTEU R_A, HIGH);
digitalWrite(PIN_SENS_MOTEUR_A , HIGH);
}
else if (joystickX < 300) {
digitalWrite(PIN_VITESSE_MOTEU R_A, HIGH);
digitalWrite(PIN_SENS_MOTEUR_A , LOW);
}
else {
digitalWrite(PIN_VITESSE_MOTEU R_A, LOW);
}
if (joystickY > 700) {
digitalWrite(PIN_VITESSE_MOTEU R_B, HIGH);
digitalWrite(PIN_SENS_MOTEUR_B , HIGH);
}
else if (joystickY < 300) { //butee
digitalWrite(PIN_VITESSE_MOTEU R_B,LOW);
}
else {
digitalWrite(PIN_VITESSE_MOTEU R_B,LOW);
}
}
//fonction lorsqu'aucune butee n'est activee
void normalrun(){
int joystickX = analogRead(PIN_JOYSTICK_X);
int joystickY = analogRead(PIN_JOYSTICK_Y);
if (joystickX > 700) {
// Si la valeur X est strictement supérieur à 700 le moteur A avance
digitalWrite(PIN_VITESSE_MOTEU R_A, HIGH);
digitalWrite(PIN_SENS_MOTEUR_A , HIGH);
}
else if (joystickX < 300) {
// Sinon si la valeur X est strictement inférieur à 300 le moteur A recule
digitalWrite(PIN_VITESSE_MOTEU R_A, HIGH);
digitalWrite(PIN_SENS_MOTEUR_A , LOW);
}
else {
// Sinon si la valeur X est comprise entre 300 et 700 (bornes inclusent) le moteur A ne bouge pas
digitalWrite(PIN_VITESSE_MOTEU R_A, LOW);
}
if (joystickY > 700) {
// Si la valeur Y est strictement supérieur à 700 le moteur B avance
digitalWrite(PIN_VITESSE_MOTEU R_B, HIGH);
digitalWrite(PIN_SENS_MOTEUR_B , HIGH);
}
else if (joystickY < 300) {
// Sinon si la valeur Y est strictement inférieur à 300 le moteur B recule
digitalWrite(PIN_VITESSE_MOTEU R_B, HIGH);
digitalWrite(PIN_SENS_MOTEUR_B , LOW);
}
else {
// Sinon si la valeur Y est comprise entre 300 et 700 (bornes inclusent) le moteur B ne bouge pas
digitalWrite(PIN_VITESSE_MOTEU R_B,LOW);
}
}
Il serait plus simple de tester juste après les if, si la butée concernée est activée et si oui, mettre vitessemoteur_* à 0...
ça ajouterait juste 4 lignes, et ça permettrait de virer tout ce qui (ailleurs dans le programme) concerne les 3 secondes d'attente, puisque apparemment ce n'est plus d'actualité. Au total, le programme serait considérablement raccourci.Code:if (joystickX > 700) { // Si la valeur X est strictement supérieur à 700 le moteur A avance digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH); digitalWrite(PIN_SENS_MOTEUR_A, HIGH); } else if (joystickX < 300) { // Sinon si la valeur X est strictement inférieur à 300 le moteur A recule digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH); digitalWrite(PIN_SENS_MOTEUR_A, LOW); } else { // Sinon si la valeur X est comprise entre 300 et 700 (bornes inclusent) le moteur A ne bouge pas digitalWrite(PIN_VITESSE_MOTEUR_A, LOW); } if (joystickY > 700) { // Si la valeur Y est strictement supérieur à 700 le moteur B avance digitalWrite(PIN_VITESSE_MOTEUR_B, HIGH); digitalWrite(PIN_SENS_MOTEUR_B, HIGH); } else if (joystickY < 300) { // Sinon si la valeur Y est strictement inférieur à 300 le moteur B recule digitalWrite(PIN_VITESSE_MOTEUR_B, HIGH); digitalWrite(PIN_SENS_MOTEUR_B, LOW); } else { // Sinon si la valeur Y est comprise entre 300 et 700 (bornes inclusent) le moteur B ne bouge pas digitalWrite(PIN_VITESSE_MOTEUR_B,LOW); }
Mais avant de coder, il faut savoir 2 choses:
1) les butées xmin, xmax, ymin et ymax seront reliées à quelles broches de l'Arduino?
2) Lorsqu'elles seront activées, passeront-elles du niveau haut au niveau bas, ou l'inverse?
Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
Merci à vous deux
xmin = 4
xmax = 5
ymin = 6
ymax = 7
En mode actif, elle seront au niveau haut.
Peut etre, mais je ne vois pas comment puisque vitesse moteur est un parametre commun a tous les sens de deplacement. Or il faut que ca puisse bouger si on donne l'instruction d'aller du cote oppose a la butee quand bien meme cette butee serait activee.
Peut etre n'ais je pas bien compris ce que tu veux dire?
Euh sauf erreur de ma part j'ai deja retire ces parties non?
Ca c'est extremement simple a modifier par la suite.Au total, le programme serait considérablement raccourci.
Mais avant de coder, il faut savoir 2 choses:
1) les butées xmin, xmax, ymin et ymax seront reliées à quelles broches de l'Arduino?
2) Lorsqu'elles seront activées, passeront-elles du niveau haut au niveau bas, ou l'inverse?
Merci forcerouge
j'ai compilé ton code en corrigeant les fautes de frappes et il fonctionne.
Je le teste ce soir sur mon moteur et vous tiens au courant !
Forcerouge, je ne parlais pas de ton programme, je n'ai pas encore eu le temps de l'examiner! Je parlais du mien.
Voici le code modifié. En fait, les diverses déclarations sont plus longues que le programme proprement dit!
Pour les capteurs de fin de course, je trouverais préférable de les mettre actifs au potentiel bas, comme le bouton du joystick, et d'utiliser le pullup de l'arduino, comme pour le joystick z.Code:const byte PIN_VITESSE_MOTEUR_A = 3; const byte PIN_SENS_MOTEUR_A = 12; const byte PIN_FREIN_MOTEUR_A = 9; const byte PIN_VITESSE_MOTEUR_B = 11; const byte PIN_SENS_MOTEUR_B = 13; const byte PIN_FREIN_MOTEUR_B = 8; const byte PIN_JOYSTICK_X = A2; const byte PIN_JOYSTICK_Y = A3; const byte PIN_JOYSTICK_Z = A4; // Bouton, pas potentiomètre actif si LOW /!\ const byte PINxmin = 4;// actif si HIGH const byte PINxmax = 5;// actif si HIGH const byte PINymin = 6;// actif si HIGH const byte PINymax = 7;// actif si HIGH // Variables "axe1Joystick" et "axe2Joystick": pas besoin d'avoir des variables globales void setup() { pinMode(PIN_VITESSE_MOTEUR_A, OUTPUT); digitalWrite(PIN_VITESSE_MOTEUR_A, LOW); pinMode(PIN_VITESSE_MOTEUR_B, OUTPUT); digitalWrite(PIN_VITESSE_MOTEUR_B, LOW); pinMode(PIN_SENS_MOTEUR_A, OUTPUT); digitalWrite(PIN_SENS_MOTEUR_A, LOW); pinMode(PIN_SENS_MOTEUR_B, OUTPUT); digitalWrite(PIN_SENS_MOTEUR_B, LOW); pinMode(PIN_FREIN_MOTEUR_A, OUTPUT); digitalWrite(PIN_FREIN_MOTEUR_A, LOW); pinMode(PIN_FREIN_MOTEUR_B, OUTPUT); digitalWrite(PIN_FREIN_MOTEUR_B, LOW); pinMode(PIN_JOYSTICK_Z, INPUT_PULLUP); // L'activation de la résistance de tirage est obligatoire pour le bouton poussoir en Z sinon les valeurs lues seront aléatoires. pinMode (PINxmin, INPUT); pinMode (PINxmax, INPUT); pinMode (PINymin, INPUT); pinMode (PINymax, INPUT); } void loop() { int joystickX = analogRead(PIN_JOYSTICK_X); int joystickY = analogRead(PIN_JOYSTICK_Y); byte joystickZ = digitalRead(PIN_JOYSTICK_Z); byte xmin = digitalRead(PINxmin); byte xmax = digitalRead(PINxmax); byte ymin = digitalRead(PINymin); byte ymax = digitalRead(PINymax); if (joystickX > 700 && joystickZ == HIGH && xmax == LOW) { // Si la valeur X est strictement supérieur à 700 le moteur A avance digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH); digitalWrite(PIN_SENS_MOTEUR_A, HIGH); } else if (joystickX < 300&& joystickZ == HIGH && xmin == LOW) { // Sinon si la valeur X est strictement inférieur à 300 le moteur A recule digitalWrite(PIN_VITESSE_MOTEUR_A, HIGH); digitalWrite(PIN_SENS_MOTEUR_A, LOW); } else { // Sinon si la valeur X est comprise entre 300 et 700 (bornes inclusent) le moteur A ne bouge pas digitalWrite(PIN_VITESSE_MOTEUR_A, LOW); } if (joystickY > 700 && joystickZ == HIGH && ymax == LOW) { // Si la valeur Y est strictement supérieur à 700 le moteur B avance digitalWrite(PIN_VITESSE_MOTEUR_B, HIGH); digitalWrite(PIN_SENS_MOTEUR_B, HIGH); } else if (joystickY < 300 && joystickZ == HIGH && xmin == LOW) { // Sinon si la valeur Y est strictement inférieur à 300 le moteur B recule digitalWrite(PIN_VITESSE_MOTEUR_B, HIGH); digitalWrite(PIN_SENS_MOTEUR_B, LOW); } else { // Sinon si la valeur Y est comprise entre 300 et 700 (bornes inclusent) le moteur B ne bouge pas digitalWrite(PIN_VITESSE_MOTEUR_B,LOW); } }
Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
ok Yvan
j'essaierai ce soir avec le pullup
merci
oui, parce que sinon, tu vas te retrouver avec le même fonctionnement erratique qu'avec le joystick Z.
Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
Cela fonctionne Yvan !!! (en mettant PULLUP)
merci beaucoup à toi et merci à forcerouge pour son aide également
Super! Tu nous montreras quelques photos de ton montage à l'occasion?
Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
oui si tu veux
le truc c'est que mon montage est un panneau de 3m par 2.50m donc je suis pas sur que le rendu photo montre quelque chose de clair
A moins que tu ne veuilles voir que les branchements arduino ?
photographie généreusement qu'on puisse voir clairement de quoi il s'agit. Le forum permet de télécharger des images sans limitation.
Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)