Heu.... J'imagine que quand tu vas me le dire, je vais me sentir bête. Mais... Je vois vraiment pas là...
-----
Heu.... J'imagine que quand tu vas me le dire, je vais me sentir bête. Mais... Je vois vraiment pas là...
Gate à gauche (pin1)
Drain au centre (pin2 et sur le boîtier)
Source à droite (pin3)
Ok, merci Gabuzo !
Oulallala. Je me suis précipité un peu vite.
L'axe du pin A0 marche à la perfection. Quoique la zone morte soit très réduite. La progressivité est parfaite.
Concernant l'axe du pin A1, ça se complique. La zone morte me semble anormalement grande, et la progressivité est très aléatoire.
Le tout semble assez instable aussi. La zone morte semble se déplacer aussi...
Bref, trop d'instabilité !
je compte sur vous !
VIncent A.
Il y a peut-être un problème avec un des potentiomètres du joystick.
Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
Un potentiomètre instable...
Bonjour,
échange le câblage des potentiomètres pour voir si le pb vient du potentiomètre ou du programme.
Deux pattes c'est une diode, trois pattes c'est un transistor, quatre pattes c'est une vache.
Tu veux dire qu'au début ça marchait pour les 2 axes et maintenant ça ne marche plus pour un axe?
Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
Salut, salut !
Apres plusieurs tests, il semble que ça vient du joystick. Un des potars semble endommagé. Je pense que cela vient du fait que j'avais effectués, plusieurs tests avant sur du 45v hors arduino.
Bref, j'ai récupéré une manette de Ybox361, donc, je démonte les joysticks. Et je test !
Cordialement,
Vincent A.
45 V! Ben si c'est pas de la maltraitance de joystick, ça... Tu mériterais que l'on te dénonce à la SPJ!
Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
Bon... J'ai pas mal galéré pour extraire un joystick d'une carte électronique.
Je l'ai récupéré, je l'ai cablé comme il se doit... Et le problème vient de l'arduino je pense. Je vais essayer avec l'autre joystick de la manette pour être bien sur, mais à priori, c'est ça. Tout marche super bien sur un axe, et pas sur l'autre.
Je vous tiens au courant,
Vincent A.
C'est difficile à comprendre, parce que les deux signaux x et y sont traités de la même manière par le programme.
Mais par contre, la combinaison des deux signaux n'est pas "indépendante du sens" si j'ose dire. Ni permutable entre x et y.
Il faut donc vérifier que le câblage du joystick soit bien fait comme suit:
Pour le potentiomètre gauche-droite, la tension sur le curseur doit être minimale avec le manche vers la gauche, maximale vers la droite.
Pour le potentiomètre avant-arrière, la tension doit être minimale vers l'arrière, maximale vers l'avant.
Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
Et sur A0, c'est x, c'est à-dire le potentiomètre droite-gauche
Et sur A1, c'est y, le potentiomètre avant-arrière.
Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
Salut Yvan.
Ok, je refais des tests bien rigoureusement pour m'assurer que le problème ne vienne pas du code !
Okay, tests effectué. Tout marche (enfin) comme il faut. Comme quoi faut persévérer !
J'ai changé le potar d'un joystick, et tout est okay !
Juste. L'Arduino réagit bizarrement lorsque le manche n'est pas EXACTEMENT sur les axes strictement verticaux, ou horizontales. Sinon un des relais s'active avant l'autre. Bref. Dans le boitier faut juste bien penser à ce que le manche du joystick puisse se déplacer QUE là où il faut.
Demain, normalement, j'ai les transistors.
Allez, bonne soirée !
Vincent A.
Tu n'as pas les transistors ? C'est quoi qui fonctionne alors, les leds ?
Ouai, j'ai mis des leds à la place des relais et des moteurs pour les tests.
Bonsoir,
Pas idéal ce morceau de code, tiré du post 144 :
en PJ la fonction de transfert donnant la valeur de x après ces quelques lignes en fonction de la valeur de x avant ces quelques lignes :Code://définition de la zone morte centrale if (x < blanc && x > - blanc) { x = 0; } if (y < blanc && y > - blanc) { y = 0; }
- sans ces quelques lignes (c'est à dire si blanc=0) : graphe "pas bien" ;
- avec les lignes en l'état (pour une valeur de blanc quelconque positive non nulle comprise entre xmin et xmax) : "bien" ;
- avec deux lignes de code supplémentaires, de mise à l'échelle : graphe "mieux".
Dans le premier cas, on l'a vu, il n'y a pas de zone morte, dans le second, il y a une discontinuité, un saut :
Le code supplémentaire pourrait ressembler à :
Le 64 venant de ces lignes :Code:if x > blanc then x=(x-blanc)*(64)/(64-blanc) ; else if x < -blanc then x=(x+blanc)*(64)/(64-blanc) ; else x=0; //dans la zone neutre end ;
Une autre solution (meilleure) étant de remplacer ça par :Code:// apply the calibration to the sensor reading x = map(x, xmin, xmax, -64, 64); y = map(y, ymin, ymax, -64, 64);
Code:... // apply the calibration to the sensor reading x = map(x, xmin, xmax, -64-blanc, 64+blanc); ... //définition de la zone morte centrale if x > blanc then x=(x-blanc) ; else if x < -blanc then x=(x+blanc) ; else x=0; //dans la zone neutre end ; } ...
Non, ce n'est a priori pas normal.L'Arduino réagit bizarrement lorsque le manche n'est pas EXACTEMENT sur les axes strictement verticaux, ou horizontales. Sinon un des relais s'active avant l'autre. Bref. Dans le boitier faut juste bien penser à ce que le manche du joystick puisse se déplacer QUE là où il faut.
"Avant" = combien de temps ?
Dernière modification par Antoane ; 14/11/2014 à 21h39.
Deux pattes c'est une diode, trois pattes c'est un transistor, quatre pattes c'est une vache.
Merci Antoane pour le code.
Je regarderai ça demain en détail
En fait. Si le joystick pour avant-arrière, n'est pas exactement sur l'axe, un relais s'active avant l'autre. Je m'explique. En temps normal, sur la moitié haute ou basse de la course du joystick, les relais sont activé. Donc, quand le joystick passe d'une moitiés à l'autre, les relais s'éteignent ou s'allument. Or, si le joystick est légèrement décalé sur l'autre axe, les relais ne réagissent pas en même temps. Un relais va par exemple s'activer à 30°, et l'autre à 31°. C'est un exemple.
Je pense que cela vient de "l'algorithme" pour l'axe gauche-droite.
Cordialement.
Vincent A.
Bien vu Antoane. Astucieux. De cette manière on décolle de la zone morte en douceur.Bonsoir,
Pas idéal ce morceau de code, tiré du post 144 :
en PJ la fonction de transfert donnant la valeur de x après ces quelques lignes en fonction de la valeur de x avant ces quelques lignes :Code://définition de la zone morte centrale if (x < blanc && x > - blanc) { x = 0; } if (y < blanc && y > - blanc) { y = 0; }
- sans ces quelques lignes (c'est à dire si blanc=0) : graphe "pas bien" ;
- avec les lignes en l'état (pour une valeur de blanc quelconque positive non nulle comprise entre xmin et xmax) : "bien" ;
- avec deux lignes de code supplémentaires, de mise à l'échelle : graphe "mieux".
Dans le premier cas, on l'a vu, il n'y a pas de zone morte, dans le second, il y a une discontinuité, un saut :
Pièce jointe 263536
Le code supplémentaire pourrait ressembler à :
Le 64 venant de ces lignes :Code:if x > blanc then x=(x-blanc)*(64)/(64-blanc) ; else if x < -blanc then x=(x+blanc)*(64)/(64-blanc) ; else x=0; //dans la zone neutre end ;
Une autre solution (meilleure) étant de remplacer ça par :Code:// apply the calibration to the sensor reading x = map(x, xmin, xmax, -64, 64); y = map(y, ymin, ymax, -64, 64);
Code:... // apply the calibration to the sensor reading x = map(x, xmin, xmax, -64-blanc, 64+blanc); ... //définition de la zone morte centrale if x > blanc then x=(x-blanc) ; else if x < -blanc then x=(x+blanc) ; else x=0; //dans la zone neutre end ; } ...
Vinviv, content d'apprendre que ça marche. Je me disais bien qu'il devait y avoir un bug avec les potentiomètres.
De mon côté, je viens enfin de recevoir mes Arduinos. Place aux travaux pratiques.
Amicalement,
Yvan
Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
Je dirais que c'est normal. cf post #54. Sur les tableaux, les relais commutent quand ça passe du + au - et vice-versa. On voit bien que le pattern n'est pas le même pour le relais droit et le gauche.Merci Antoane pour le code.
Je regarderai ça demain en détail
En fait. Si le joystick pour avant-arrière, n'est pas exactement sur l'axe, un relais s'active avant l'autre. Je m'explique. En temps normal, sur la moitié haute ou basse de la course du joystick, les relais sont activé. Donc, quand le joystick passe d'une moitiés à l'autre, les relais s'éteignent ou s'allument. Or, si le joystick est légèrement décalé sur l'autre axe, les relais ne réagissent pas en même temps. Un relais va par exemple s'activer à 30°, et l'autre à 31°. C'est un exemple.
Je pense que cela vient de "l'algorithme" pour l'axe gauche-droite.
Cordialement.
Vincent A.
Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
A propos du tuto signalé par arsène de gallium au post #5, il a été retiré du site qu'il mentionne. Par contre, on peut le retrouver sous une forme complète ici:
http://eskimon.fr/ebook-tutoriel-arduino
Il fait 453 pages maintenant qu'il est complet!
Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
Merci Yvan !
Du coup, on l'insère où ce morceau de code optimisé ?
Merci,
Vincent A.
Toujours pas fonctionnel ton montage ?
Pourtant Yvan a fait preuve de pugnacité.
Peut être faudrait-il que tu apprennes les bases de la programmation et pas pomper bêtement les codes glanés ici ou là.
L'important, sauf à embêter les autres, est de comprendre ce que tu fais.
Visiblement tu ne maitrises pas la programmation et tu ne veux pas t'impliquer dans cette compréhension.
Tu recopies tout simplement ce que l'on te donne, enfin Yvan, comme un oisillon qui ouvre le bec pour attendre la nourriture attendue.
Si la nourriture n'arrive pas, bas tu ouvres le bec.
Le lien que j'ai donné, corrigé par Yvan, explique les bases.
L'as tu au moins lu ?
Un code de programmation peut être entaché d'erreur pas parce que l'auteur est nul mais bien parce que il ne convient pas totalement à ce que l'on veut réaliser.
Programmer est un travail difficile et nécessite de maitriser les bases. La copie simple ne fonctionne pas dans la plupart des cas.
A bientôt en 2030.
Salut Arsene de gallium.
Si, si, comme dis plus haut le montage marche [presque] parfaitement. J'avoue ne pas avoir beaucoup réfléchi en posant la dernière question.
Après plusieurs tests, il me semblant que la partie concernant le calibrage du point central ne servait à rien. Je l'ai viré, et ça marche.
Donc le code donne à priori ça :
// These constants won't change:
const int sensorPinx = A0; // pin du pot x
const int sensorPiny = A1; // pin du pot y
const int ledPin = 13; // pin that the LED is attached to
const int relaisDPin = 2; // pin that controls the right relay
const int relaisGPin = 4; // pin that controls the left relay
const int moteurDPin = 3; // pin that controls the right motor
const int moteurGPin = 5; // pin that controls the left motor
const int blanc = 10; // zone morte de part et d'autre du neutre
// variables:
int x = 0; // the x value
int xmed = 0; // valeur de x au neutre
int xmin = 1023; // minimum x value
int xmax = 0; // maximum x value
int y = 0; // the y value
int ymed = 0; // valeur de y au neutre
int ymin = 1023; // minimum y value
int ymax = 0; // maximum y value
void setup() {
// turn on LED to signal the start of the calibration period:
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
// calibrate during the first five seconds
while (millis() < 5000) {
x = analogRead(sensorPinx);
y = analogRead(sensorPiny);
// record the maximum sensor value
if (x > xmax) {
xmax = x;
}
if (y > ymax) {
ymax = y;
}
// record the minimum sensor value
if (x < xmin) {
xmin = x;
}
if (y < ymin) {
ymin = y;
}
}
// signal the end of the calibration period
digitalWrite(13, LOW);
// on attend une seconde
delay(1000);
// initialize the relay pin as an output:
pinMode(relaisDPin, OUTPUT);
pinMode(relaisGPin, OUTPUT);
}
void loop() {
// read the sensor:
x = analogRead(sensorPinx);
y = analogRead(sensorPiny);
// apply the calibration to the sensor reading
x = map(x, xmin, xmax, -64, 64);
y = map(y, ymin, ymax, -64, 64);
// if x+y is >0, turn right motor relay on :
if (x+y > 0) {
digitalWrite(relaisDPin, HIGH);
}
else {
digitalWrite(relaisDPin,LOW);
}
delay(1); // delay in between reads for stability
// if y-x is >0, turn left motor relay on :
if (y-x > 0) {
digitalWrite(relaisGPin, HIGH);
}
else {
digitalWrite(relaisGPin,LOW);
}
delay(1); // delay in between reads for stability
//définition de la zone morte centrale
if (x < blanc && x > - blanc) {
x = 0;
}
if (y < blanc && y > - blanc) {
y = 0;
}
// calculer le signal PWM pour les moteurs
int moteurdroit = y - x;
int moteurgauche = y + x ;
// on sature à 128 le cas échéant
moteurdroit = constrain(moteurdroit, -128, 128);
moteurgauche = constrain(moteurgauche, -128, 128);
// on calcule la valeur absolue
moteurdroit = abs(moteurdroit);
moteurgauche = abs(moteurgauche);
// on transpose les valeurs, car les agrs de analogwrite doivent être entre 0 et 255
moteurdroit = map(moteurdroit,0,128,0,255);
moteurgauche = map(moteurgauche,0,128,0,255);
// send PWM to the motors
analogWrite(moteurDPin, moteurdroit);
analogWrite(moteurGPin, moteurgauche);
}
J'ai essayé d'insérer le code d'Antoane, au bon endroit, mais le logiciel me dit qu'il y a plusieurs problèmes.
Merci à vous !
Vincent A.
C'est normal : je fais de l’algorithmique. Coder en langage compatible arduino, c'est trop bas niveau pour moiJ'ai essayé d'insérer le code d'Antoane, au bon endroit, mais le logiciel me dit qu'il y a plusieurs problèmes.
Essaye d'utiliser les balises [code] et [/code], c'est plus facile à lire.
Tu écris
[code]
If rain then
parapluie;
else if snow then
happy;
else
display('erreur');
return;
end
[/code]
et ça donne :
et voilà.Code:If rain then parapluie; else if snow then happy; else display('erreur'); return; end
Dernière modification par Antoane ; 15/11/2014 à 17h23.
Deux pattes c'est une diode, trois pattes c'est un transistor, quatre pattes c'est une vache.
Ahahhahahah
Oui, je ne connaissais pas la balise. Merci !
Non mais plus sérieusement. Il me dis qu'il ne peut pas y avoir de *parenthèse* avant un *x*.
o0
Merci !
Salut à tous,
Je me suis éclaté comme une bête hier à faire les exercices du manuel de l'Arduino. ça avance bien, mais je suis encore loin du compte.
Les possibilités offertes par l'Arduino sont vertigineuses. Plus besoin de perdre du temps à réaliser un circuit imprimé: Un Arduino, un étage de puissance hyper-simple sur de la plaque prototype et hop! Gain de temps et d'argent. Flexibilité, etc.
Pas étonnant que ça ait eu un tel succès!
Voici le code avec la modif d'Antoane:
Code:// These constants won't change: const int sensorPinx = A0; // pin du pot x const int sensorPiny = A1; // pin du pot y const int ledPin = 13; // pin that the LED is attached to const int relaisDPin = 2; // pin that controls the right relay const int relaisGPin = 4; // pin that controls the left relay const int moteurDPin = 3; // pin that controls the right motor const int moteurGPin = 5; // pin that controls the left motor const int blanc = 10; // zone morte de part et d'autre du neutre // variables: int x = 0; // the x value int xmed = 0; // valeur de x au neutre int xmin = 1023; // minimum x value int xmax = 0; // maximum x value int y = 0; // the y value int ymed = 0; // valeur de y au neutre int ymin = 1023; // minimum y value int ymax = 0; // maximum y value void setup() { // turn on LED to signal the start of the calibration period: pinMode(13, OUTPUT); digitalWrite(13, HIGH); // calibrate during the first five seconds while (millis() < 5000) { x = analogRead(sensorPinx); y = analogRead(sensorPiny); // record the maximum sensor value if (x > xmax) { xmax = x; } if (y > ymax) { ymax = y; } // record the minimum sensor value if (x < xmin) { xmin = x; } if (y < ymin) { ymin = y; } } // signal the end of the calibration period digitalWrite(13, LOW); // initialize the relay pin as an output: pinMode(relaisDPin, OUTPUT); pinMode(relaisGPin, OUTPUT); } void loop() { // read the sensor: x = analogRead(sensorPinx); y = analogRead(sensorPiny); // apply the calibration to the sensor reading x = map(x, xmin, xmax, -64 - blanc, 64 + blanc); y = map(y, ymin, ymax, -64 - blanc, 64 + blanc); // if x+y is >0, turn right motor relay on : if (x+y > 0) { digitalWrite(relaisDPin, HIGH); } else { digitalWrite(relaisDPin,LOW); } delay(1); // delay in between reads for stability // if y-x is >0, turn left motor relay on : if (y-x > 0) { digitalWrite(relaisGPin, HIGH); } else { digitalWrite(relaisGPin,LOW); } delay(1); // delay in between reads for stability //définition de la zone morte centrale if (x > blanc) { x=(x-blanc); } else if (x < -blanc) { x=(x+blanc) ; } else { x=0; } //dans la zone neutre if (y > blanc) { y=(y-blanc); } else if (y < -blanc) { y=(y+blanc) ; } else { y=0; } //dans la zone neutre // calculer le signal PWM pour les moteurs int moteurdroit = y - x ; int moteurgauche = y + x ; // on sature à 128 le cas échéant moteurdroit = constrain(moteurdroit, -128, 128); moteurgauche = constrain(moteurgauche, -128, 128); // on calcule la valeur absolue moteurdroit = abs(moteurdroit); moteurgauche = abs(moteurgauche); // on transpose les valeurs, car les agrs de analogwrite doivent être entre 0 et 255 moteurdroit = map(moteurdroit,0,128,0,255); moteurgauche = map(moteurgauche,0,128,0,255); // send PWM to the motors analogWrite(moteurDPin, moteurdroit); analogWrite(moteurGPin, moteurgauche); }
Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)
Salut Yvan, et salut à tous.
Ce code marche. C'est super !
J'ai dit que j'avais les transistors hier mais la boutique ne les avait pas encore reçu . Donc, mardi ou mercredi.
C'es vraiment super, merci à vous tous !
Vincent A.
Bonjour !
J'ai enfin mes transistors. J'avais commandé des IRLZ44N, et le vendeur me donne des IRFZ44N en me disant que c'est les memes.
Puis-je utiliser ces derniers dans mon montage ?
Cordialement,
Vincent A.