Bonjour Sébastien
Quel est le type de ce contrôleur, as-tu un lien.
Cordialement
jpbbricole
Version imprimable
Non ceci ne faisait pas partie de mon adaptation mais j'ai tester ce que vous m'avez et j'ai compris le principe .Merci
Voici le contrôleur que j'utilise :https://www.ebay.fr/itm/Module-PWM-m...-/323450086831
Bonjour Sébastien
A part créer un pont en H, je ne vois pas d'autres façons d'inverser. Par contre avec un module L298, il y a tout ce qu'il faut et même pour 2 moteurs, quelques exemples.
A+
Cordialement
jpbbricole
Oui je connais le l298n mais j’ai peur de manquer de courant avec même en mettant les 2 sorties moteurs en parallèle. Mon idée était d’utiliser 2 mofset et inverser la polarisation au niveau du moteur pour chaque mofset et en choisir un quand je veux faire tourner mon moteur dans un sens et choisir l’autre inversement. Comme ça je suis sur de ne pas manquer de courant au démarrage mais je ne sais pas si cela reste possible.
Quelles sont les caractéristiques de ton moteur? As-tu une photo d l'éttiquette?
Le L298 c'est 2A ou 25W.
A moins d'avoir un GROS moteur, tu devrait avoir assez! Autrement, il y a ceci.
J'ai un L298, je vais essayer avec ce type de moteur.
A+
Cordialement
jpbbricole
Je vais acheter ceci https://letmeknow.fr/shop/fr/command...6612&results=4 vue le prix , et je brancherai en parallèle les 2 sorties moteurs et je verrai bien si ça me suffit .
La doc dit que Les sorties moteurs peuvent être mises en parallèle pour alimenter un moteur avec 2.4A - donc a essayer pourquoi pas. Il faut que le composant soit de bonne qualité pour garantir la parfaite synchronisation des signaux
Pour voir les drivers existants vous pouvez regarder sur le site de roboshop par exemple (quitte à trouver ailleurs ensuite) vous pouvez trier par puissance etc
Merci mais finalement changement de plan, j’ai acheté ceci: https://letmeknow.fr/shop/fr/command...=Lmd&results=1
Comme ça je suis sur de ne pas manquer de courant au démarrage.
J'ai cherché pendant de longues heures mais je n'arrive pas à savoir ou comprendre comment inverser le sens de rotation de mon moteur grace à ce driver.
vous pouvez préciser exactement le montage et son alimentation ?
tout a fait et comme aussi mentionné dans la discussion il faut un Condo sur l’alimentation et En dessous de 10V environ le le LM18200 ne marche pas - d’où la question sur son alimentation
Pièce jointe 539957
-le brake et le grnd sur le grnd
-dir sur le 8
-pwm sur le 11
-V+ et -sur batterie
-out+ et - sur moteur
Cela fonctionne ,néanmoins j'ai trouvé ceci sur le data-sheet .Pièce jointe 539971De plus je n'arrive pas a inverser le sens de rotation du moteur .Sauriez vous comment faire et ou je peux voir tout les fonctions qui sont associé au LMD182000T ou les librairies. Car je crois avoir retourné presque tout le web hier soir mais je n'est pas trouvé grand chose a part des gens qui les utilisait pour controller des trains.
Bonjout Sébastien
Pourrais-tu mettre ton schéma et ton programme en ligne?
A+
Cordialement
jpbbricole
Le modele lmd182000T n'existe pas sur Fritzing donc le ne sais pas comment je peux vous fournir un schema.Code:
1
2
3
4
5
6
7
8
9
10
11 void setup() { pinMode (11, OUTPUT); pinMode(8,OUTPUT); } void loop() { analogWrite(11,250); }
Même à mail levée et une petite photo.
Voila j'ai fait du mieux que je pouvais et je m'en excuse d'avance.
Pièce jointe 539983Pièce jointe 539985
Bonjour Sébastien
C'est laaaaaaaargement suffisant, Léonard de Vinci n'a pas fait beaucoup mieux ;)
Voici un petit bout de code
Le moteur tourne dans un sens presque à la vitesse maxi (250) pendant 5 secondes, puis dans l'autre sens un peu moins vite (100) pendant 5 secondes.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 #define moteurDirectionPin 8 #define moteurVitessePin 11 #define moteurDirectionCW HIGH // Sens des aiguilles d'une montre #define moteurDirectionCCW LOW // Sens contraire (faudra peut etre inverser) byte moteurVitesse = 250; void setup() { Serial.begin(115200); pinMode (moteurVitessePin, OUTPUT); pinMode(moteurDirectionPin,OUTPUT); } void loop() { moteurVitesse = 250; analogWrite(moteurVitessePin,moteurVitesse); digitalWrite(moteurDirectionPin, moteurDirectionCW); Serial.println("Direction CW vitesse " + String(moteurVitesse)); delay(5000); moteurVitesse = 100; analogWrite(moteurVitessePin,moteurVitesse); digitalWrite(moteurDirectionPin, moteurDirectionCCW); Serial.println("Direction CCW vitesse " + String(moteurVitesse)); delay(5000); }
A+
cordialement
jpbbricole
Merci beacoup ,ça fonctionne comme prévue néanmoins j'aimerai savoir ou avez vous trouvez les informations permettant de controller ainsi le moteur avec ce lmd182000t. Car j'aimerai voir toute les fonctions ,librairies, et bibliothèque que je peux utiliser avec celui-ci.
Bonjour Sébastien
Je n'ai pas trouvé de bibliothèque à part celle trouvé sur Locoduino DCCpp, mais trop spécifique. Mais, seul le schéma suffit à développer un truc.
C'est juste un programme "demo", on pourrait l'agrémenter de fonctions afin de le rendre plus pratique.
Il faut juste ajouter le fil du frein (Brake) sur la pin 9 de l'Arduino.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 #define moteurDirectionPin 8 #define moteurVitessePin 11 #define moteurDirectionCW HIGH // Sens des aiguilles d'une montre #define moteurDirectionCCW LOW // Sens contraire (faudra peut etre inverser) byte moteurVitesse = 250; #define moteurBrakePin 9 #define moteurBrakeOn HIGH void setup() { Serial.begin(115200); moteurVitesse = 0; pinMode (moteurVitessePin, OUTPUT); analogWrite(moteurVitessePin,moteurVitesse); pinMode(moteurDirectionPin,OUTPUT); digitalWrite(moteurDirectionPin, moteurDirectionCW); pinMode(moteurBrakePin,OUTPUT); digitalWrite(moteurBrakePin, !moteurBrakeOn); } void loop() { moteurVitesse = 250; moteurMarche(moteurVitesse, moteurDirectionCW); Serial.println("Direction CW vitesse " + String(moteurVitesse)); delay(5000); moteurFrein(250); moteurVitesse = 100; moteurMarche(moteurVitesse, moteurDirectionCCW); Serial.println("Direction CCW vitesse " + String(moteurVitesse)); delay(5000); moteurFrein(250); } void moteurMarche(byte motVit, byte motDir) { digitalWrite(moteurDirectionPin, motDir); analogWrite(moteurVitessePin,motVit); } void moteurFrein(int freinDuree) { digitalWrite(moteurBrakePin, moteurBrakeOn); delay(freinDuree); digitalWrite(moteurBrakePin, !moteurBrakeOn); }
A+
Cordialement
jpbbricole
[QUOTE=jpbbricole;11385661]Bonjour Sébastien
Très bien merci beaucoup , par contre je n'est pas compris ceci:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 moteurFrein(250); void moteurMarche(byte motVit, byte motDir) { digitalWrite(moteurDirectionPin, motDir); analogWrite(moteurVitessePin,motVit); } void moteurFrein(int freinDuree) { digitalWrite(moteurBrakePin, moteurBrakeOn); delay(freinDuree); digitalWrite(moteurBrakePin, !moteurBrakeOn); }
Bonjour Sébastien
Si c'est moteurFrein(250); que tu n'as pas compris, cette commande freine le moteur pendant 250 milliSecondes.
Comme je n'ai pas ce circuit et qu'une pin de celui-ci s'appelle BRAKE, j'en déduis qu'en y mettant un 1 (HIGH) on freine le moteur, c'est à dire que ses 2 pôles sont au même potentiel (court-circuit).
Cordialement
jpbbricole
Je ne comprend pas pourquoi mon moteur ne tourne que dans un sens et des que mon moteur commence à tourner le programme bug.
voici mon code:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95 #include "Wire.h" // Arduino Wire library #include "I2Cdev.h" //Installer ces 2 librairies #include "MPU6050.h" #include "math.h" #include <AFMotor.h> #define moteurDirectionPin 8 #define moteurVitessePin 11 #define moteurDirectionCW HIGH // Sens des aiguilles d'une montre #define moteurDirectionCCW LOW // AD0 low = 0x68 (default for InvenSense evaluation board) // AD0 high = 0x69 MPU6050 accelgyro; int inputPin =A0; int inputPin1 =A1; int16_t ax, ay, az; //mesures brutes int16_t gx, gy, gz; uint8_t Accel_range; uint8_t Gyro_range; float angle=0; // Sens contraire (faudra peut etre inverser) byte moteurVitesse = 250; void setup() { pinMode (moteurVitessePin, OUTPUT); pinMode(moteurDirectionPin,OUTPUT); Wire.begin(); //I2C bus Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB (LEONARDO) } // initialize device Serial.println("Initialisation I2C..."); accelgyro.initialize(); // verify connection Serial.println("Test de la conection du dispositif ..."); Serial.println(accelgyro.testConnection() ? "MPU6050 connection reussie" : "MPU6050 connection echec"); delay(1000); Serial.begin(9600); // set up Serial library at 9600 bps pinMode(inputPin,INPUT_PULLUP); pinMode(inputPin1,INPUT_PULLUP); } void loop() { accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); angle=0.0*(angle+float(gy)*0.01/131) + 1*atan2((double)ax,(double)az)*180/PI; Serial.println(angle); controlemotV2(angle); delay(10); } void controlemotV2(int alpha) { int Val1=digitalRead(inputPin); Serial.println(Val1); int Val2=digitalRead(inputPin1); Serial.println(Val2); if ( Val1==0){ moteurVitesse = 150; analogWrite(moteurVitessePin,moteurVitesse); digitalWrite(moteurDirectionPin, moteurDirectionCW); } else if ( Val2==0){ moteurVitesse = 150; analogWrite(moteurVitessePin,moteurVitesse); digitalWrite(moteurDirectionPin, moteurDirectionCCW); } else if (int (alpha < -10)){ moteurVitesse = 150; analogWrite(moteurVitessePin,moteurVitesse); digitalWrite(moteurDirectionPin, moteurDirectionCCW); //fait avancer le chariot vers la droite } else if (int (alpha > 10)){ moteurVitesse = 150; analogWrite(moteurVitessePin,moteurVitesse); digitalWrite(moteurDirectionPin, moteurDirectionCW); //fait avancer le chariot vers la gauche } else moteurVitesse = 0; analogWrite(moteurVitessePin,moteurVitesse); digitalWrite(moteurDirectionPin, moteurDirectionCCW); }
Au niveau du bug , il s'agissait d'un faux contacts , mais le moteur ne tourne que dans un sens .
Bonjour Sébastien
Dans void controlemotV2(int alpha), tout à la fin, dane le else, il manque les accolades.
La dernière accolade, tout en bas est la fin de la fonction void controlemotV2.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 else moteurVitesse = 0; analogWrite(moteurVitessePin,moteurVitesse); digitalWrite(moteurDirectionPin, moteurDirectionCCW); } // Au lieu de else{ moteurVitesse = 0; analogWrite(moteurVitessePin,moteurVitesse); digitalWrite(moteurDirectionPin, moteurDirectionCCW); } }
Comme je n'ai pas ton capteur, je l'ai remplacé par un potentionètre sur A2 (#define accelGyroPin A2) pour tester le tout et ça donne ceci:
A+Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105 //#include "Wire.h" // Arduino Wire library //#include "I2Cdev.h" //Installer ces 2 librairies //#include "MPU6050.h" //#include "math.h" //#include <AFMotor.h> #define accelGyroPin A2 #define moteurDirectionPin 8 #define moteurVitessePin 11 #define moteurDirectionCW HIGH // Sens des aiguilles d'une montre #define moteurDirectionCCW LOW // AD0 low = 0x68 (default for InvenSense evaluation board) // AD0 high = 0x69 //MPU6050 accelgyro; int inputPin =A0; int inputPin1 =A1; int16_t ax, ay, az; //mesures brutes int16_t gx, gy, gz; uint8_t Accel_range; uint8_t Gyro_range; float angle=0; // Sens contraire (faudra peut etre inverser) byte moteurVitesse = 250; void setup() { pinMode (moteurVitessePin, OUTPUT); pinMode(moteurDirectionPin,OUTPUT); //Wire.begin(); //I2C bus Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB (LEONARDO) } // initialize device Serial.println("Initialisation I2C..."); //accelgyro.initialize(); // verify connection Serial.println("Test de la conection du dispositif ..."); //Serial.println(accelgyro.testConnection() ? "MPU6050 connection reussie" : "MPU6050 connection echec"); delay(1000); Serial.begin(9600); // set up Serial library at 9600 bps pinMode(inputPin,INPUT_PULLUP); pinMode(inputPin1,INPUT_PULLUP); } void loop() { //accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); //angle=0.0*(angle+float(gy)*0.01/131) + 1*atan2((double)ax,(double)az)*180/PI; angle = (float)analogRead(accelGyroPin); angle = map(angle, 50, 1024, -15, 15); Serial.print("Angle " + String(angle) + "\t"); controlemotV2(angle); delay(500); } void controlemotV2(int alpha) { int Val1=digitalRead(inputPin); //Serial.println(Val1); int Val2=digitalRead(inputPin1); //Serial.println(Val2); if ( Val1==0){ moteurVitesse = 151; analogWrite(moteurVitessePin,moteurVitesse); digitalWrite(moteurDirectionPin, moteurDirectionCW); Serial.println("CW " + String(moteurVitesse)); } else if ( Val2==0){ moteurVitesse = 152; analogWrite(moteurVitessePin,moteurVitesse); digitalWrite(moteurDirectionPin, moteurDirectionCCW); Serial.println("CCW " + String(moteurVitesse)); } else if (int (alpha < -10)){ moteurVitesse = 150; analogWrite(moteurVitessePin,moteurVitesse); digitalWrite(moteurDirectionPin, moteurDirectionCCW); //fait avancer le chariot vers la droite Serial.println("CCW " + String(moteurVitesse)); } else if (int (alpha > 10)){ moteurVitesse = 150; analogWrite(moteurVitessePin,moteurVitesse); digitalWrite(moteurDirectionPin, moteurDirectionCW); //fait avancer le chariot vers la gauche Serial.println("CW " + String(moteurVitesse)); } else{ moteurVitesse = 0; analogWrite(moteurVitessePin,moteurVitesse); digitalWrite(moteurDirectionPin, moteurDirectionCCW); Serial.println("CCW " + String(moteurVitesse)); } }
Cordialement
jpbbricole
Merci infiniment, vraiment mille fois merci.Je vous laisse avec la video ,pardon pour le language mais l'émotion était trop forte😅😅😉.
https://youtu.be/kWwaWVdSzYY
Il ne reste plus que le correcteur PID , si vous pourriez me filé encore une fois un petit coup de pousse ,je vous en serait infiniment reconnaissant.😅😅
Bonsoir Sébastien
Ma--gni--fi---que :yaisse2:
Alors, là, pas de chance, je n'ai jamais pratiqué, il faut que j'étudie ça, mais, sur ce forum il en parlent pas trop loin d'ici.
A+
Bonne soirée
jpbbricole
J'ai déjà un peu fouiné , et je vais continuer , mais vous m'avez vraiment déjà énormément rendue service.Encore merci.
Je poste le code de correcteur que j'ai déjà essayer commencer à adapter ,mais a vrai dire je ne comprend pas tout le code ;celui ci provient d'un système de stabilisation de drone avec 2 moteurs.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98 #include <Wire.h> int16_t Acc_rawY,Gyr_rawY; float Acceleration[2]; float Gyro_angle[2]; float Total_angle[2]; float elapsedTime,time,timePrev; int i; float rad_to_deg = 180/3.141592654; float PID,pwmLeft,pwmRight,error,previous_error; float pid_d =0; float pid_i =0; float pid_p =0; double kp=3.55; double kd=0.005; double ki=2.05; double throttle =1300; float desired_angle =0; void setup() { Wire.begin(); Wire.beginTransmission(0x68); Wire.write(0); Wire.endTransmission(true); Serial.begin(250000); moteur.attach(...); time = millis(); moteur.writeMicroseconds(1000); delay(7000); } void loop() { timePrev = time; time = millis(); elapsedTime = (time - timePrev) / 1000; Wire.beginTransmission(0x68); Wire.write(0x3B); Wire.endTransmission(false); Wire.requestFrom(0x68,6,true); Acc_rawY = Wire.read()<<8| Wire.read(); Gyro_angle[1] = Gyr_rawY/131; Total_angle[1] = 0.98*(Total_angle[1] + Gyro_angle[1]*elapsedTime) + 0.02*Acceleration_angle[1]; error = Total_angle[1] - desired_angle; pid_p = kp*error; if (-3<error) and (error<3){ pid_i = pid_i +(ki*error); } pid_d = kd*((error - previous_erreur)/elapsedTime); PID = pid_d + pid_i + pid_p; if(PID<-1000){ PID=-1000; } if (PID>1000){ PID=1000 } pwmLeft = throttle +PID; pwmRight = throttle -PID; //Right if (pwmRight < 1000){ pwmRight =1000; } if(pwmRight>2000){ pwmRight =2000; } //Left if (pwmLeft < 1000){ pwmLeft =1000; } if(pwmLeft>2000){ pwmLeft =2000; } Ce que je pensais faire!!! int i = 200 if (abs (int alpha(t) - int alpha(t+1)) < 2 ){ i+=5 moteur.setSpeed(i) } else if (abs (int alpha(t) - alpha(t+1)) > 2 ){ i-=5 moteur.setSpeed(i) }
Super JP a encore frappé :)
Et bravo Seb pour la vidéo
Juste un petit point, pour contrebalancer le mouvement le chariot doit se déplacer dans le sens opposé du mouvement du capteur là sur la vidéo on dirait qu’il va dans le même sens
Oui oui j’ai juste à tourner mon capteur et le tour est joué ,mais très bonne remarque.😉
Bonsoir,
Déjà, bravo pour cette réalisation:bravo:
Pas de souci pour le coup de pouce, par contre on commence à s'y perdre avec cette discussion de plus de 100 messages sur 6 pages. Il serait peut-être temps de clore celle-ci et d'en ouvrir une autre sur le problème spécifique du correcteur PID. Tu y retrouveras certainement Jay M et jpbbricole qui furètent dans le coin:mrgreen:
Bonsoir,
Je souhaite ainsi donc clore ce début de projet en vous remerciant tous pour votre contribution et en particulier "jpbbricole ".😊😉 Si ce projet vous intéresse, je vous invite alors à continuer notre chemin main dans la main sur le lien suivant:https://www.developpez.net/forums/d2.../#post11388478
Et si non puisse ce début de projet vous être utile.☺️