bonjour je suis en terminale SSi et pour mon projet je fais une brouette Electrique mais j'ai 2 problèmes dans mon programme .
Explication du projet: faire accélérer un moteur avec un capteur de force ou une poignée électrique .pour ça choix d'un mode automatique (capteur de force) ou manuel (poignée).
1ere question : Est-il possible d'avoir une variable qui peut varier seulement entre un certain nombre définit dans le programme (dans mon cas il faudrait 0 à 400) car dans mon cas j'ai des valeur en dessous de 0 (j'ai -1) et je voudrais faire en sorte que mon moteur commence à tourner seulement quand ça passe à 1 .donc je me demande si c'est possible de définir la limite d'une variable .
2ieme problème : quand je suis en mode manuel (poignée électrique ) et que j’accélère quand la valeur arrive à 400 le programme passe à la condition suivante alors qu'elle est pas juste donc ça devrai pas .Ce bug arrive seulement quand je suis à cette valeur ce qui fais que mon moteur se met à changer brusquement de sens .donc je me demande à quoi est du cette erreur. Car la conditions suivant fais tourner le moteur dans l'autre sens pour la marche arrière .
voici mon programme :
#include "DualG2HighPowerMotorShield.h"
#include "HX711.h"
#define calibration_factor -4630.0
#define DOUT 5
#define CLK 4
DualG2HighPowerMotorShield24v14 md;
HX711 scale(DOUT, CLK);
int pinBouton1;
int pinBouton2;
int pinBouton3;
void setup(){
Serial.begin(115200);
scale.begin(5, 4);
scale.set_scale(calibration_factor);
scale.tare();
md.init();
pinBouton1=12;
pinMode(pinBouton1,INPUT);
pinBouton2=10;
pinMode(pinBouton2,INPUT);
pinBouton3=9;
pinMode(pinBouton3,INPUT);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop(){
boolean etatBouton1=digitalRead(pinBouton1);
boolean etatBouton2=digitalRead(pinBouton2);
boolean etatBouton3=digitalRead(pinBouton3);
if (etatBouton2==HIGH){ //clef on
digitalWrite(LED_BUILTIN, HIGH);
//Serial.print(pinBouton2);
//Serial.println("-clef");
if (etatBouton1==HIGH){ //mode automatique
int jauge1 = (scale.get_units());
int f = jauge1 / 10;
unsigned int w = (f *400)/4;
md.enableDrivers();
md.setM1Speed(w);
Serial.print(w);
Serial.println("-auto v moteur");
} else {
if (etatBouton1==LOW){ //manuel
if (etatBouton3==LOW){//marche avant
int v=analogRead(A3);
int k= ((v*0.6079)-114);
md.enableDrivers();
md.setM1Speed(k);
Serial.print(k);
Serial.println("-manuel avant v moteur");
}else{
if (etatBouton3==HIGH){ //marche arriere
int val=analogRead(A3);
int x= -((val*0.6079)-114);
md.enableDrivers();
md.setM1Speed(x);
Serial.print(x);
Serial.println("-manuel arriere v moteur");
}
}
}else {
md.disableDrivers();
}
}
}
}
merci d'avance pour l'aide apportée elle sera toujours bonne à prendre .
Est-il possible d'avoir une variable qui peut varier seulement entre un certain nombre définit dans le programme
pas sans coder mais il y a la fonction [url=https://www.arduino.cc/reference/en/language/functions/math/constrain/]constrain()[/url].
Attention à la remarque de la doc
Because of the way the constrain() function is implemented, avoid using other functions inside the brackets, it may lead to incorrect results.
==> donc procéder toujours en deux temps. changer la variable, puis la contraindre.
Exemple:
Disons que la variable que vous voulez contraindre s'appelle x et les bornes xMin et xMax. Vous faites
x =....; // vous modifiez votre variable
x = constrain(x, xMin, xMax); // vous vous assurez qu'elle reste entre les 2 bornes
Notez que digitalRead() ne retourne pas un boolean (true ou false) mais HIGH ou LOW, une valeur numérique. Il conviendrait pour la cohérence de déclarer vos etatBouton en byte
get_units() retourne un float à voir suivant vos valeur quand vous faites
int jauge1 = (scale.get_units());
int f = jauge1 / 10;
unsigned int w = (f *400)/4;
si vous ne perdez pas des trucs en route à cause du calcul en entier. La formule est aussi ridicule, vous divisez par 10 puis après re-multipliez par 400 puis re-divisez par 4... au final ça veut dire que vous multipliez par 10... essayez avec unsigned int w = scale.get_units() * 10;
quand vous faites
int v=analogRead(A3);
int k= ((v*0.6079)-114);
avez vous regardé la tension qui arrive sur A3? est-ce compatible avec votre arduino, quelle est la gamme de valeur ?
en général, on ne fait pas des trucs compliqués (appel de fonctions...).
Dans beaucoup de cas, on ne fait qu'incrémenter la variable (ajouter +1), dans une boucle.
A chaque fois qu'on incrémente, on teste la valeur pour la contraindre dans l'intervalle.
bonjour merci à tous pour vos réponse j'ai réussi à régler le problème ne rajoutant x = constrain(x, xMin, xMax)
donc je n'ai plus aucun des 2 problème .
J'ai une dernière question pourquoi quand j'appuis sur le bouton 3 au lieux de faire varier la vitesse normalement le moteur se met t-il à tourner à fond .Alors que le code est le même que au dessus et que celui au dessus marche normalement ?
en effet j'ai bien regardé le calcul de x et grâce à vous il marche bien mieux . Pour la broche A3 je suis entre 190 et 849 et j'ai un arduino uno . et je sais que je n'ai pas de problème de shield car il a une plage de -400 à 400 pour les valeurs . je ne peux actuellement pas vous montrer mon résultat pour w mais je le ferai dès que possible .
Et je n'ai pas encore eu le temps de regardé pour change etatbouton par byte et je j'avais sauté cette ligne . je vous recontacte demains soir pour vous donner les résultat .merci
bonjou alors déjà en mettant les byte ça marche mieux pour mon bug de boutton mais par contre en lisant les valeurs dans arduino ça marche et j'ai bien ce que je veux.par contre quand je teste en vrai ça ne marche ^pas le moteur tourne directement à fond et ça m fais ça seulement pour mon bouton3.
Sinon voici ma nouvelle version de programme:
#include "DualG2HighPowerMotorShield.h"
#include "HX711.h"
#define calibration_factor -4630.0
#define DOUT 5
#define CLK 4
DualG2HighPowerMotorShield24v14 md;
HX711 scale(DOUT, CLK);
const byte pinBouton1=12;
const byte pinBouton2=10;
const byte pinBouton3=9;
void setup(){
Serial.begin(115200);
scale.begin(5, 4);
scale.set_scale(calibration_factor);
scale.tare();
md.init();
pinMode(pinBouton1,INPUT);
pinMode(pinBouton2,INPUT);
pinMode(pinBouton3,INPUT);
}
void loop(){
boolean etatBouton1=digitalRead(pinBouton1);
boolean etatBouton2=digitalRead(pinBouton2);
boolean etatBouton3=digitalRead(pinBouton3);
if (etatBouton2==true){ //clef on
digitalWrite(LED_BUILTIN, HIGH);
//Serial.print(pinBouton2);
//Serial.println("-clef");
if (etatBouton1==true){ //mode automatique
int w = (scale.get_units())*9;
w = constrain(w, 0, 400);
md.enableDrivers();
md.setM1Speed(w);
Serial.print(w);
Serial.println("-auto v moteur");
} else {
if (etatBouton1==false){ //manuel
if (etatBouton3==false){//marche avant
int v=analogRead(A3);
int k= ((v*0.6079)-116.5);
k = constrain(k, 0, 399);
md.enableDrivers();
md.setM1Speed(k);
Serial.print(k);
Serial.println("-manuel avant v moteur");
}else{
if (etatBouton3==true){ //marche arriere
int l=analogRead(A3);
int x= (((l*0.6079)-116.5))*-1;
x = constrain(x, -400, 0);
md.enableDrivers();
md.setM1Speed(x);
Serial.print(x);
Serial.println("-manuel arriere v moteur");
}
}
}else {
md.disableDrivers();
}
}
}
}
et voici les valeurs de A3: j'ai fais une montée rapide pour ne pas avoir trop de valeur
manuel avant v moteur
0-manuel avant v moteur
0-manuel avant v moteur
1-manuel avant v moteur
1-manuel avant v moteur
2-manuel avant v moteur
2-manuel avant v moteur
2-manuel avant v moteur
3-manuel avant v moteur
3-manuel avant v moteur
4-manuel avant v moteur
5-manuel avant v moteur
6-manuel avant v moteur
6-manuel avant v moteur
8-manuel avant v moteur
8-manuel avant v moteur
9-manuel avant v moteur
10-manuel avant v moteur
11-manuel avant v moteur
12-manuel avant v moteur
14-manuel avant v moteur
16-manuel avant v moteur
17-manuel avant v moteur
18-manuel avant v moteur
19-manuel avant v moteur
21-manuel avant v moteur
22-manuel avant v moteur
23-manuel avant v moteur
25-manuel avant v moteur
27-manuel avant v moteur
28-manuel avant v moteur
30-manuel avant v moteur
31-manuel avant v moteur
33-manuel avant v moteur
34-manuel avant v moteur
36-manuel avant v moteur
38-manuel avant v moteur
40-manuel avant v moteur
42-manuel avant v moteur
43-manuel avant v moteur
46-manuel avant v moteur
49-manuel avant v moteur
50-manuel avant v moteur
52-manuel avant v moteur
54-manuel avant v moteur
56-manuel avant v moteur
58-manuel avant v moteur
60-manuel avant v moteur
62-manuel avant v moteur
65-manuel avant v moteur
67-manuel avant v moteur
69-manuel avant v moteur
71-manuel avant v moteur
73-manuel avant v moteur
76-manuel avant v moteur
78-manuel avant v moteur
80-manuel avant v moteur
82-manuel avant v moteur
84-manuel avant v moteur
85-manuel avant v moteur
88-manuel avant v moteur
90-manuel avant v moteur
92-manuel avant v moteur
94-manuel avant v moteur
96-manuel avant v moteur
99-manuel avant v moteur
100-manuel avant v moteur
102-manuel avant v moteur
105-manuel avant v moteur
107-manuel avant v moteur
109-manuel avant v moteur
110-manuel avant v moteur
113-manuel avant v moteur
115-manuel avant v moteur
116-manuel avant v moteur
119-manuel avant v moteur
121-manuel avant v moteur
123-manuel avant v moteur
125-manuel avant v moteur
127-manuel avant v moteur
129-manuel avant v moteur
131-manuel avant v moteur
133-manuel avant v moteur
136-manuel avant v moteur
138-manuel avant v moteur
140-manuel avant v moteur
142-manuel avant v moteur
144-manuel avant v moteur
146-manuel avant v moteur
148-manuel avant v moteur
150-manuel avant v moteur
153-manuel avant v moteur
155-manuel avant v moteur
158-manuel avant v moteur
160-manuel avant v moteur
162-manuel avant v moteur
164-manuel avant v moteur
166-manuel avant v moteur
168-manuel avant v moteur
171-manuel avant v moteur
173-manuel avant v moteur
175-manuel avant v moteur
177-manuel avant v moteur
179-manuel avant v moteur
181-manuel avant v moteur
183-manuel avant v moteur
186-manuel avant v moteur
188-manuel avant v moteur
189-manuel avant v moteur
192-manuel avant v moteur
194-manuel avant v moteur
196-manuel avant v moteur
198-manuel avant v moteur
200-manuel avant v moteur
202-manuel avant v moteur
204-manuel avant v moteur
206-manuel avant v moteur
208-manuel avant v moteur
211-manuel avant v moteur
212-manuel avant v moteur
215-manuel avant v moteur
217-manuel avant v moteur
219-manuel avant v moteur
220-manuel avant v moteur
223-manuel avant v moteur
225-manuel avant v moteur
227-manuel avant v moteur
230-manuel avant v moteur
231-manuel avant v moteur
233-manuel avant v moteur
236-manuel avant v moteur
237-manuel avant v moteur
240-manuel avant v moteur
242-manuel avant v moteur
244-manuel avant v moteur
246-manuel avant v moteur
249-manuel avant v moteur
251-manuel avant v moteur
253-manuel avant v moteur
255-manuel avant v moteur
257-manuel avant v moteur
260-manuel avant v moteur
262-manuel avant v moteur
265-manuel avant v moteur
267-manuel avant v moteur
269-manuel avant v moteur
271-manuel avant v moteur
274-manuel avant v moteur
276-manuel avant v moteur
279-manuel avant v moteur
282-manuel avant v moteur
284-manuel avant v moteur
287-manuel avant v moteur
289-manuel avant v moteur
292-manuel avant v moteur
294-manuel avant v moteur
297-manuel avant v moteur
299-manuel avant v moteur
302-manuel avant v moteur
305-manuel avant v moteur
307-manuel avant v moteur
310-manuel avant v moteur
313-manuel avant v moteur
315-manuel avant v moteur
318-manuel avant v moteur
320-manuel avant v moteur
323-manuel avant v moteur
326-manuel avant v moteur
328-manuel avant v moteur
330-manuel avant v moteur
333-manuel avant v moteur
336-manuel avant v moteur
338-manuel avant v moteur
341-manuel avant v moteur
344-manuel avant v moteur
347-manuel avant v moteur
349-manuel avant v moteur
352-manuel avant v moteur
355-manuel avant v moteur
357-manuel avant v moteur
360-manuel avant v moteur
362-manuel avant v moteur
365-manuel avant v moteur
368-manuel avant v moteur
371-manuel avant v moteur
373-manuel avant v moteur
376-manuel avant v moteur
378-manuel avant v moteur
381-manuel avant v moteur
385-manuel avant v moteur
388-manuel avant v moteur
390-manuel avant v moteur
393-manuel avant v moteur
395-manuel avant v moteur
397-manuel avant v moteur
396-manuel avant v moteur
396-manuel avant v moteur
396-manuel avant v moteur
395-manuel avant v moteur
395-manuel avant v moteur
396-manuel avant v moteur
396-manuel avant v moteur
396-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
396-manuel avant v moteur
397-manuel avant v moteur
396-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
396-manuel avant v moteur
396-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
396-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
397-manuel avant v moteur
398-manuel avant v moteur
par contre quand je teste en vrai ça ne marche ^pas le moteur tourne directement à fond
vous envoyez bien la commande
int v=analogRead(A3);
int k= ((v*0.6079)-116.5);
k = constrain(k, 0, 399);
md.enableDrivers();
md.setM1Speed(k);
Serial.print(k);
Serial.println("-manuel avant v moteur");
merci pour ses dernières informations et j'ai cherché de mon coté et vu que j'avais déjà eu se problème .Et j'ai remarqué que un pin que le shield était utilisé par celui-ci et par un de mes boutons donc ça ne pouvais pas marcher .
C'est mon avis mais je trouve le bibliothèque de cette carte mal faite ou mal optimisé car elle utilise énormément de pin et heureusement pour mon projet j'utilise seulement 1 seul moteur ce qui fais que j'ai mis la moitié des pin à 0. Voila c'est juste mon avis surtout que les pin utilisé ne sont pas indiqué il faut allé les cherché sois même et pour un novice ça peut être problématique .