Bonjour seb201
Alors, pour plus de rapidité un servo 30 KG 90-180° avec un long bras qui déplace directement le contre-poids?
A+
Cordialement
jpbbricole
Version imprimable
Bonjour seb201
Alors, pour plus de rapidité un servo 30 KG 90-180° avec un long bras qui déplace directement le contre-poids?
A+
Cordialement
jpbbricole
ça n'ira pas la distance a parcourir est trop importante ,le moteur reste la meilleur solution. Voila ce que ça donne en directe:
https://www.youtube.com/watch?v=KuDD8c4hk7s
Le seul problème c'est que le L293d baisse le courant.
Bonsoir seb21
Peut-être que la puissance demandée par le moteur dépasse les capacités du chip L293 et qu'il faut passer au L298. Mesures le courant consommé par le moteur, quand il est alimenté directement par batterie.
Quelle est la tension de la batterie?
A+
Cordialement
jpbbricole
Le moteur n'a pas apprécié, j'en ai donc pris un autre moteur du coup; mais il monte à 2,6 sur le calibre 600mA. J'ai une question si je veux vraiment avoir du couple en restant sur un moteur le mieux serait un moteur pas à pas non ?? Et le meilleur contrôleur que je puisse avoir est un l298d en terme de courant maximum??
Et deuxième question un moteur pas à pas aura-t-il un meilleur couple qu'un moteur dc à même courant ou bien le moteur pas à pas consomme plus de courant et c'est pour cela qu'il a un meilleur couple ??
Est-ce que ceci correspondrait bien à ce que je veux : https://fr.aliexpress.com/item/32973...b-d0534847dbb6
Et quel moteur pas à pas pourrais-je utiliser pour avoir le meilleur couple possible tout en conservant une certaine vitesse et sans cramer le L298n ?
Si vous êtes prêt à changer de moteur et de contrôleur, il faut raisonner dans l'autre sens: Il faudrait comprendre le caractéristiques (glossaire ici) dont vous avez besoin pour votre application et en déduire quel moteur et donc quel contrôleur prendre - le(s) couple(s) est (sont) un des éléments importants mais vous devez aussi regarder quelle tension est dispo (12V), la puissance dispo (est-ce sur batterie, pouvez vous fournir 1A, 2A ?), etc
Vous pouvez voir les différents types de moteurs pas à pas ici par exemple avec un moyen de filtrer sur différents critères
Merci par toute ces infos. J'utilise une lipo de 11,1v de 5200mAh ,je sais que j'ai besoin d'un certain couple a cause des fortement poulie courroie et de mon chariot mais je ne sais pas comment savoir quels couple il me faut . Le meilleur contrôleur que je puisse avoir niveau Amperage maximum est celui que j'ai montrer ci dessus et il conviendra parfaitement étant donné la tention d'alimentation que j'utilise. Il ne me reste qu'a choisir le bon moteur mais je ne sais pas comment savoir le couple dont j'ai besoin tout en conservant une certaine vitesse de rotation.
Bonjour ser21
Si tu prends l'option moteur pas à pas(MPAP), il serait mieux d'opter pour un driver du genre TB6600 ou, plus petit A4988 et tu pourras le piloter avec la bibliothèque AccelStepper.
Ton accu serait suffisant, ce 2 drivers travaillent en courant, ce dernier se règle, pour le oremier par des switch et le second par in poterntiomètre.
Alors, là, pas lamoindre idée, j'ai plus tendance a y aller "au pif" avec le matériel que j'ai. Mais, si tu veux une réactivité comme sur ta dernière vidéo, il faudra un GROS MPAP!
Si tu donnes le poids, environ, à déplacer et la longueure du parcours, je peux toujours essayer.
Cordialement
jpbbricole
Le problème c'est qu'il ne me faut pas un moteur très lourd vue que je vais devoir faire contrepoids de l'autre coté ,mais je vais faire un teste demain avec l'autre moteur que j'ai. Au niveau du poids à déplacer il n'y a vraiment pas grand chose (un petit chariot fait maison) , le seul problème ce sont les frottements poulie courroie qui demande un peu de couple . Au niveau de la distance a parcourir de bout a bout je dirai qu'il y a +/- 50 cm.Et de plus je pense que l298n fera l'affaire et je peut utiliser la meme librairies que mon moteur Shield actuel il me semble, non?
Bonsoir seb21
Dans ce cas, au-lieu de disposer la courroie en carré, pourquoi pas en triangle avec le moteur d'entraînement au sommet du triangle, le poids du moteur serait, ainsi, au centre de gravité de l'ensemble, donc, son poids aura beaucoup moins d'importance.
Non, je ne crois pas, la bibliothèque AFMotor.h s'adresse au shield que tu utilises, avec l'interface L298, tu n'en aura plus besoin et tu utilisera la bibliothèque L298N.h qui est tout aussi simple à utiliser, il y a même le schéma de câblage dans l'exemple Simple.ino.
Si je trouve du temps, cette semaine, j'essaierai de faire ce montage.
A+
Cordialement
jpbbricole
euh ça fait quelques décennies que je n'ai pas regardé les trois lois de Newton et fait ce genre de calcul, mais je vais essayer de me souvenir, il y a peut-être des plus calés que moi sur ce thème qui viendront me contredire - c'est un peu sans filet là :)
Vous avez un charriot que vous souhaitez mettre en mouvement en lui appliquant une force. il faudrait connaître l'accélération souhaitée.
Pièce jointe 531897
Si une force est appliquée à un objet, celui ci accélère. le principe fondamental de la dynamique s'écrit F = m.a où m est la masse du solide et a l'accélération du solide.
Le couple nécessaire est la somme de deux couples résistants :
1-le couple de frottement, nécessaire pour vaincre les frottements à vitesse constante. Il faut pour cela connaître le coefficient de frottement équivalent des roues du charriot
2-Le couple d'accélération, nécessaire pour démarrer le chariot (vaincre la force fictive d'inertie). Il faut donc se fixer une valeur d'accélération arbitrairement : en combien de temps le chariot à l'arrêt atteindra t'il la vitesse de fonctionnement normal ?
En première approche, on peut ignorer la masse de la courroie et on peut considérer qu'une fois mise en mouvement la masse ne rencontre pas de frottements (elle se déplacera à vitesse constante et le moteur n'aura donc servi qu'à la mettre en mouvement). (la force du moteur ne servira ensuite qu'à contrer le frottement si vous êtes sur une surface plane).
--> On ne s'intéresse donc uniquement qu'au couple d'accélération, quitte a rajouter une petite marge d'erreur plus tard.
Pour connaître l'accélération souhaitée, on se souvient que la position à l'instant t d'un mobile soumis à une accélération constante est
pos(t) = 1/2.a.t2 + v0.t + pos0
si votre charriot était immobile au début, v0 vaut 0 et si vous étiez à une position origine, alors pos0 vaut aussi 0, donc la position dans le temps de votre masse par rapport à l'origine sera:
x(t) = 1/2.a.t2
Imaginez que vous vouliez que votre charriot parcourt D (en mètres) en un dixième de seconde (on dirait sur la vidéo), on aurait donc en remplaçant dans la formule
D = 1/2.a.(0,12) => D = 0,005a => a = D/0,005 m/s2
La force à appliquer sur votre charriot est de
F = accélération . Massecharriot = (D/0,05) . Massecharriot (en kg.m/s2 - c'est à dire en Newton)
Un couple est exprimé en N/m c'est le moment d'une force de 1 newton dont le bras de levier est de 1 mètre , soit 1 N m , ou encore 1 m2.kg/s2
Pour un moteur, le couple est définit par Couple = F . Rayon ou F est l'effort tangentiel et r la distance à l'axe de rotation (le rayon de la poulie)
Donc dans les conditions énoncées ci dessus Couple = (D/0,05) . Massecharriot . Rayon
sur votre film on dirait que vous avez des toutes petites poulies, disons que le rayon c'est 1cm (0.01m) et si la distance à parcourir de gauche à droite est de 50cm (0.5m), et disons que votre charriot avec sa masse pèse 500g (0,5kg)
donc dans la formule
Couple = (0,5/0,005) x 0,5 x 0.01 = 100 x 0.5 x 0.01 = 0.5 N.m
comme il y a toujours des frottements, on prendrait 10% à 15% en plus et donc vous cherchez un moteur de 0.5 à 0.6N.m.(mais bon 0.4 pourrait faire l'affaire aussi, y'aura un peu moins de peps). vous trouverez cela avec des moteurs de 300 à 400 grammes donc pas trop de poids à contrebalancer. (l'option de jpbricole est aussi tout à fait valide et une autre option serait de faire un montage ou le moteur est dans le chariot, donc son poids comptera dans la masse à déplacer)
-----------------------------
cela dit l'approche de Jpbricole qui est d'y aller au pif et prendre ce que l'on a sous la main et qui rentre dans le budget et de tester si ça convient, ça se tient aussi... Perso je commencerai par là avant d'acheter :)
Bonjour,
La démarche de Jay est, me semble t'il, bonne sur un terrain bien horizontal. Mais ce n'est pas le cas puisque le but du chariot est de rétablir cette horizontalité. Sans moteur le chariot bougerait, certes dans le sens inverse de ce que l'on cherche, mais il bougerait. Il faut donc réintroduire la pente dans les équations. S'il doit accepter des pentes jusqu'à 45°, le moteur devra, outre l'inertie et l'accélération à impulser, développer une force linéaire horizontale au moins égale au poids/1.414.
Souquez ferme.
Mon idée était que si le système fonctionne le Bateau ne bougera pas trop donc on devrait quasiment rester à plat
Mais si les conditions sont trop défavorables alors effectivement faudra compenser la composante horizontale du poids du charriot
La solution ne serait elle pas de prendre le cas le plus défavorable? En prenant la planche complètement à la verticale comme ça plus de problème pour les autres cas .
Oui le cas le plus défavorable serait d’avoir à compenser complètement le poids plus les frottements - mais ça pousse à sur dimensionner le moteur
Dans la pratique pas sûr que le bateau aille sur l’eau dans des conditions de houle drastique ni que bouger un poids dans ces conditions soit suffisant de toutes façon (vu la taille de la planche et du mobile on ne parle pas d’un bateau de taille significative)
il est vraie néanmoins en procédant de la sorte je suis d'avoir un moteur qui permettra d'asservir mon système peut importez les conditions et cela me permet d'avoir une petite marge .
Quel est la taille du bateau ? Quellle masse voulez vous faire bouger ? Y’a t’il un humain sur la bateau ? C’est potentiellement des dizaines de kg qu’il faudrait déplacer
Bonjour Seb201,
A la verticale, le bateau coule et il n'y a plus qu'à espérer que le fond soit bien horizontal. Auquel cas le problème est résolu définitivement :P
45 ° c'est déjà très important et comme Jay M l'a écrit en mode de fonctionnement la pente doit rester faible. Il n'y a qu'en butée (ie hors limite de fonctionnement donc avec une pente qui peut être importante) qu'il faut au moins éviter que le poids ne redescende.
Salutations
C'est vraie ,mais je préfère avoir une bonne marge de manoeuvre pour éviter tout problème meme si c'est peut être un peu exagéré.J'aurais de même besoin d'aide a propos du correcteur , je dois utiliser un correcteur pid (proportionnel intégrateur derivateur) néanmoins je ne sais pas du tout comment cela s'insère dans le code et comment dois je choisir les valeurs des différentes constantes . Merci d'avance.
Bonjour à tous et bonne semaine
Je me suis "lancé" dans l'exercice et ai fait un petit montage en faisant chauffer, un petit peu, mon imprimante 3D.
La partie mécanique:
Pièce jointe 533823
La partie electronique:
Pièce jointe 533820
C'est une excellente occasion pour étudier les PID.
Je vais utiliser un capteur GY-85.
A+
Cordialement
jpbbricole
Wow jpbricole - c’est très propre !! Bravo
On voit que l’imprimante a chauffé en effet :)
Le CY-85 avec 9 degrés de liberté c’est sans doute beaucoup pour ce problème mais qui peut le plus peut le moins (Vous aurez les données de l’accéléromètre 3 axes (ADXL345) pour la mesure de la pesanteur, des mouvements d'accélération et un gyroscope 3 axes (TG3205) pour la mesure de la vitesse de rotation angulaire qui pourront être utilisés, et en prime le capteur de champ magnétique 3 axes (HMC5883L) et un capteur de pression atmosphérique BMP085 sans utilité particulière pour ce projet mais si c’est ce que vous avez sous la main, ça convient).
[QUOTE=jpbbricole;11343792]
Je me suis "lancé" dans l'exercice et ai fait un petit montage en faisant chauffer, un petit peu, mon imprimante 3D.
Wouaww super boulot .Moi de mon coté je n'est pas eu le temps d'avancer sur la partie codage pour insérer le pid à mon code mais je vais m'y remmetre jeudi.
Bonjour , savez vous quel ouvrage je pourrais utiliser pour concevoir mon programme avec correcteur pid??
Je ne compte pas utiliser les équations dans le domaine de Laplace mais bien dans le domaine temporelle , et pour rappel un correcteur pid(=proportionnel, intégrateur,derivateur).
il y aura un humain sur le bateau ou c'est une (grande) maquette?
Bonjour seb201,
Pourtant, le domaine fréquentiel (ou l'espace de Laplace pour faire plus complexe :)) serait très utile pour comprendre les risques d'oscillation.
Si mes souvenirs sont exacts, il faut que deux états stables soient atteints non seulement bien sûr avec une vitesse nulle mais avec une accélération nulle (sinon il y a accentuation du déséquilibre au démarrage et dépassement de l'équilibre d'arrivée par décélération donc oscillations). Cette double maîtrise accélération et vitesse pour maîtriser un changement de positions correspond bien au domaine d'action d'un PID.
Bon courage.
Une planche de surf évolutive hybride va faire 48 à 50cm de large aussi... je ne pouvais pas dire au vu de la vidéo si la planche avait pour but d’être installée dans la coque, d’où ma question.
La masse totale (inertie) de l’embarcation va jouer pour déterminer la masse à déplacer et donc le moteur nécessaire
Bonjour Jay M,
Oui, et la position du centre de gravité de l'embarcation par rapport à la ligne de flottaison (masse mobile incluse en position 0), la position en hauteur relative de la masse mobile par rapport au centre de gravité (pour bien faire elle devrait être en dessous en tant que quille dynamique) et le facteur de forme (un catamaran et un cylindre de même masse ne se comportent pas du tout de la même manière).
Et j'en oublie certainement :calim2:.
Salutations
Ma maquette n'a pas pour but d'être fixé sur quoi que se soit . J'instalerai seulement une tige rigide en largeur de ma planche au milieu afin de simuler le roulis. Et j'ai une question puis je mettre un transistor en sortie de motor shield afin d'avoir un courant plus important et ainsi que mon moteur est plus de couple?? Oubien je pars directement sur ça ??https://www.sparkfun.com/products/9107
Pièce jointe 538645
Bonjour, j'ai effectué de nouvelles modifications a ma maquette afin de réduire les frottements des courroies et j'ai de même fait un code me permettant de connaître l'état de mes capteurs de fin de course :Pièce jointe 538648
Néanmoins quand je l'ajoute à mon code principal ,celui-ci cesse de fonctionné des lors que j'ajoute INPUT_PULLUP dans mon void setup et je ne comprend pas pourquoi.
Mon code global en ajoutant celui des capteurs de fin de course est celui-ci:
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 ##include "Wire.h" // Arduino Wire library #include "I2Cdev.h" //Installer ces 2 librairies #include "MPU6050.h" #include "math.h" #include <AFMotor.h> AF_DCMotor motor(2); // AD0 low = 0x68 (default for InvenSense evaluation board) // AD0 high = 0x69 MPU6050 accelgyro; int inputPin =2; int inputPin1 =7; int16_t ax, ay, az; //mesures brutes int16_t gx, gy, gz; uint8_t Accel_range; uint8_t Gyro_range; float angle=0; void setup() { 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 Serial.println("Motor test!"); // turn on motor motor.setSpeed(200); //definie la vitesse du moterur motor.run(RELEASE); pinMode(inputPin,INPUT_PULLUP); pinMode(inputPin1,INPUT_PULLUP); Serial.begin(9600); } 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 (int (alpha < -10)){ motor.run(FORWARD); //fait avancer le chariot vers la droite } else if (int (alpha > 10)){ motor.run(BACKWARD); //fait avancer le chariot vers la gauche } else motor.run(RELEASE); }
Bonjour Sebastien
D'après le mode d'emploi de la carte, page 16, seules les pin digitales 2 et 13 et les pin analogiques de A0 à A5 (15 à 19) sont libres.
Tu peux très bien utiliser les pin analogiques en logique.
Cordialement
jpbbricole
[QUOTE=jpbbricole;11376357]Bonjour Sebastien
Tu peux très bien utiliser les pin analogiques en logique.
Donc au lieu d'utiliser la 2 et la 7 plutôt utiliser la A5 et A4 par exemple??Et est ce que la restistance pull-up est active sur ces pins??
Bonjour Sebastien
Oui, il y a des PULL_UP sur ces entrées.Pour les entrées A4 et A5, si tu ne veut jamais utiliser le bus i2C, oui, sinon, utilises de A0-A4.
Cordialement
jpbbricole
Très bien merci , je vais faire le teste se soir je posterai le résultat de mes expériences se soir vers 22h.J'ai de même crée une nouvelle discussion concernant la partie motorisation si des curieux voudrait allez y jeter un coup d'oeuil , pour me donner un coup de pouce😉.
https://www.developpez.net/forums/d2...-sous-arduino/
[QUOTE=jpbbricole;11376461]Bonjour Sebastien
Oui, il y a des PULL_UP sur ces entrées.Pour les entrées A4 et A5, si tu ne veut jamais utiliser le bus i2C, oui, sinon, utilises de A0-A4.
Merci énormément le résultat est impéquable tout fonctionne comme prévue . Il ne me reste plus qu'a coder un correcteur pid afin d'adapter la vitesse du moteur en fonction de l'inclinaison , et a vrai dire je ne sais pas trop comment m'y prendre. Voici mon code actuel , sans aucun correcteur :
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 #include "Wire.h" // Arduino Wire library #include "I2Cdev.h" //Installer ces 2 librairies #include "MPU6050.h" #include "math.h" #include <AFMotor.h> AF_DCMotor motor(2); // 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; void setup() { 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 Serial.println("Motor test!"); // turn on motor motor.setSpeed(200); //definie la vitesse du moterur motor.run(RELEASE); pinMode(inputPin,INPUT_PULLUP); pinMode(inputPin1,INPUT_PULLUP); Serial.begin(9600); } 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){ motor.run(BACKWARD); } else if ( Val2==0){ motor.run(FORWARD); } else if (int (alpha < -10)){ motor.run(FORWARD); //fait avancer le chariot vers la droite } else if (int (alpha > 10)){ motor.run(BACKWARD); //fait avancer le chariot vers la gauche } else motor.run(RELEASE); }
Bonsoir, j'ai essayé d'avancer un peu depuis la dernière fois mais bon je ne sais pas trop si je suis sur le bon chemin . Et à vrai dire je suis un peu perdue et ne sais pas trop comment continué.
Voici mon code et mon idée:
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 float eps; float eps_D; float eps_P; float eps_I; float eps_Av; float eps_Ap; float kp = 300; // Coefficient proportionnel float ki = 5.5; // Coefficient intégrateur float kd = 100; // Coefficient dérivateur void asservissement() { if (eps==0){ code normal } else if eps = eps_oldn eps = epsAv - epsAp eps_P= kp*eps eps_D = kd*(eps - eps_old)/dt eps_I = eps_I + ki*(eps*dt) eps_Ap = eps_D + eps_I + eps_P } Ce que je veuc faire!!! int i = 200 if (abs (int alpha(t) - int alpha(t+1)) < 2 ){ //si la planche continue de de se pencher de plus en plus i+=1 moteur.setSpeed(i) //faire accélérer le moteur pour déplacer plus vite le chariot } else if (abs (int alpha(t) - alpha(t+1)) > 2 ){ //si la planche se redresse i-=1 moteur.setSpeed(i). //faire décélérer le moteur pour déplacer moins vite le chariot }
Pièce jointe 539290
Bonsoir,
J'ai du nouveau pour vous j'ai trouver un code de PID mais qui comporte deux moteur que j'ai déjà modifier un peu , pourriez vous m'aider pour l'adapter à mon systèmes possible.
Voici le code :
Deplus j'ai recue un contrôleur mofset pour contrôler mon moteur celui-ci conviens super bien ,néanmoins je ne peux pas inverser la polarité de celui-si .Je me demandais donc si je peux en acheter un autre que je brancherai au meme moteur et au meme pwm mais en inversant les poles au niveau du moteur pour pouvoir faire tourner mon moteur dans les 2 sens.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 #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<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; }
voici comment ça fonctionne :https://www.youtube.com/watch?v=gUIp3ERr0Kc
j'ai pas tout lu mais est-ce que cela fait partie de votre adaptation ?--> en C++ on ne peut pas tester si une valeur est entre 2 bornes en l'écrivant comme cela. il faut direCode:
1
2
3 if (-3<error<3){ pid_i = pid_i +(ki*error); }
Pour vous en convaincre essayez ce bout de codeCode:
1
2
3 if ((error > -3) && (error < 3)) { pid_i = pid_i +(ki*error); }
ce qu'il se passe c'est que le compilateur évalue cette expression comme cela if ((-3 < error) < 3) {...Code:
1
2
3
4
5
6
7
8
9 void setup() { Serial.begin(115200); int error = 21; if (-3 < error < 3) { Serial.println("bizarre..;"); } } void loop() {}
d'abord on teste -3 < error, comme error vaut 21 c'est vrai. vrai est représenté par la valeur 1 donc ensuite vous faites le second test (1 < 3) qui est vrai et donc c'est pour cela que bizarre est imprimé