Besoin de petits conseils en programme arduino

Bonsoir tout le monde, je suis nouveau sur le forum et aussi dans le domaine de la programmation :)

Etant donné que je suis tout nouveau dans le domaine d'arduino, je voulais avoir quelques petits conseils sur lesquels je pourrai m'appuyer pour mon projet/expérience, et donc, après avoir lu les règles du forum, j'ouvre ce topic en espérant qu'il suit les demandes et en espérant aussi trouver mon bonheur dans ce forum :D

Voila alors j'ai passé un bon bout de temps déjà sur la partie mécanique d'un robot à 4 roues (j'appelle par partie mécanique -> carcasse, toi, pars-choc, cratère ... comme sur une petite auto) et maintenant je me suis lancé dans la programmation de mon projet.

Ma carte moteur est une carte sabertooth 2x25 que j'ai réussi à avoir dans le commerce, pas très chère ..

J'ai 4 moteurs à contrôler, pour l'instant, j'arrive à varier la tension des sortie analogiques, (grâce au petit programme de analogWrite), de mes moteurs en sorte à ce qu'ils soient: _à l'arrêt -> valeur = 118 (correspond à à peu près 2.2V) _en marche avant = 150 _en marche arrière = 86

Maintenant, je voudrais interpréter les 5 informations envoyées par un joystick (le joystick, mon camarade s'en est occupé) soit: _première information = 0 (L'appareil est à l'arrêt) qui correspondrai chez moi à 0 = 118 _deuxième information = 1 (L'appareil est en marche avant) qui correspondrai chez moi à S1 et S2 = 150 (je précise que j'ai deux groupe de moteur en parallèle, S1 correspond aux deux moteurs de droite et S2 correspond au deux moteurs de gauche) _troisième information = 2 (L'appareil est en marche arrière) qui correspondrai chez moi à S1 et S2 = 86 _quatrième information = 3 (L'appareil tourne à droite) qui correspondrai chez moi à S1 = 150 _cinquième information = 4 (L'appareil tourne à gauche) qui correspondrai chez moi à S2 = 86

Voilà, je pense vous avoir donné les informations nécessaires pour comprendre le principal.

Je voudrai donc savoir si quelqu'un pourrait m'aider en me donnant quelques conseils pour le programme Arduino, car je suis vraiment tout nouveau dans le domaine (l'année passée j'étais dans une autre section que la section Electronique) Ou si vous auriez des tutoriels, des vidéos, ou des exemples de programme, ça serait vraiment génial, car je ne connais pas vraiment le nom du programme ou le nom du travail que je dois effectuer, c'est pour ça que mes recherches n'ont pas abouties, et que je me fie à vous.

Voili voilou, merci d'avance, bonne soirée à vous :)

Comme je vois 0 réponses, je me lance: Ton prog va se présenter de la façon suivante: Déclaration de toutes les variables utilisées (pour faire simple: int nom_de_variable =0;) Une variable = une ligne. Ensuite tu aura un (ou une ?) void setup() { (l'accolade dit: ceci est un bloc, qui se terminera par une: "}" Dans ce bloc, tu initialisera les broches (pins) concernées (en input; pour ce qui entre: joystick..;ext; et output pour ce qui sort: les moteurs) Note que sur les input, il faut mettre input pullup (pour avoir les résistances internes de "protection") Il faut que tu regarde dans les exemples (qui sont dans le dossier d'installation; dans program files pour Windows) pour avoir les syntaxes (façon d'écrire l'instruction). Si tu a installé "processing", il faut mettre dans le void setup la vitesse de transfert au sérial (fenêtre dans laquelle tu peux envoyer les données par des: "serialPrint(...)" (voir les exemples) Fermeture du bloc void setup avec : } Et ensuite: Void loop(){ -pareil: ouverture de bloc avec: { C'est la boucle dans laquelle le prog va tourner en lisant ce qui entre, et en envoyant de la data aux pin output, en fonction de ce qui entre et des ordres (instructions) de traitement que tu aura mis dans ton code: Patr exemple: Si digitalpin(3) = High et digitalpin(4)= LOW alors analog Write(A0) ....(sans doute le contraire? vu que le shield moteur? doit être commandé? en numérique.?). (voirs exemples pour syntaxe) En résumé et conclusion: Voir la doc et les exemples dans le dossier d'install.; et commencer d'écrire quelque chose pour que les experts te pourrissent Nan...j'déconne...Ils sont sympas les experts; mais il faut bosser un peu. N'oublie pas de mettre ton code entre les balises qui te viendrons en cliquant sur le: # de la barre d'outils (au dessus des smileys). A toi la balle..... Edit: Il te faudra savoir si ton joystick est en "tout ou rien" (contact sec) ou "proportionnel" (potar). Bref; t'a pas le cul sorti des ronces, mais c'est pas non plus la mer à boire.

Carolyne:
Une variable = une ligne.

Petite précision : pas forcement, on peut en déclarer autant qu’on veut sur la même ligne. Exemple :

int Variable1, Variable2, Variable3;

Carolyne:
Note que sur les input, il faut mettre input pullup (pour avoir les résistances internes de “protection”)

Totalement faux : l’activation des pull-up interne active les pull-up c’est tout. La déclaration en INPUT active la résistance d’entrée, alors que la déclaration en OUTPUT la by-pass, permettant “d’envoyer du jus”. A noter que la déclaration en INPUT n’est pas forcément nécessaire puisque c’est la configuration par défaut donc tant qu’on a pas passé un pin en OUTPUT il est forcément en INPUT qui est l’état “protégé”.

Sinon Reus91 : je comprend pas votre logique, vous avez un joystick qui normalement envoi un signal analogique, pourquoi ne pas simplement transcrire c’est valeur sur le controle PWM de vos moteurs ? Ainsi vous gagnez le contrôle de la vitesse.

Si je pars du principe que votre joystick est au 5V, ça donnerai quelque chose comme :

void loop() {

Mesure=analogRead(Joystick); // 0<Mesure<1024

if(Mesure<500) { // 1024 / 2 = 512 ==> 500 pour laisser une marge pour zéro

Mesure=map(Mesure,0,500,86,118); // mise à l'échelle 0=>86 500=> 118 simple règle de 3
analogWrite(Moteur1,Mesure);
analogWrite(Moteur2,Mesure);

} else if(Mesure>524) { // 512 + 12 ==> marge pour zéro encore

Mesure=map(Mesure,524,1024,118,150); // mise à l'échelle
analogWrite(Moteur1,Mesure);
analogWrite(Moteur2,Mesure);

} else {

analogWrite(Moteur1,118);
analogWrite(Moteur2,118);

}

}

Totalement faux : l'activation des pull-up interne active les pull-up c'est tout. La déclaration en INPUT active la résistance d'entrée,

Voila qui contraste avec la clarté des explications que j'ai trouvées sur ton blog. Si la déclaration INPUT active la résistance d'entrée, que sont les pull-up ? Des résistances additionnelles ? Leur rôle n'est-il pas de protéger (limiter l'intensité) ?

Pas du tout : une résistance de pull up est une résistance de "tirage vers le haut" si on traduit littéralement. Elle permet de donner un état stable au pin afin de ne pas le laisser flottant. En aucun cas elle n'a un rôle de protection. La résistance de protection d'entrée, c'est OUTPUT ou INPUT qui la gère.

Application typique des R de pull up : les boutons http://arduino.cc/en/tutorial/button ==> ici la pullup est externe, mais le même montage fonctionnerait sans et avec l'entrée en INPUT_PULLUP

Et à l'inverse il existe la résistance de pull down qui elle tire vers le bas. On en retrouve notamment dans le contrôle de mosfet :

Ici elle permet d'éviter que le mosfet reste activé car si elle n'y est pas et qu'on envoi du 5V puis qu'on "débranche", le fil restera chargé comme un micro condensateur, et un mosfet ne consommant pas de courant et étant commandé en tension, il restera passant. Or la plupart du temps on souhaite que le mosfet ne soit pas enclenché quand on le veux pas. Donc ici temps que la sortie de l'arduino est à zéro, ou même si on ne branche rien, le mosfet reste bloquant.

Mais on pourrait volontairement faire l'inverse, mettre une pull-up pour qu'il soit toujours activé sauf quand on le veut pas. Ca va être le cas par exemple dans des système de sécurité où en cas de défaut on veut qu'un module reste actif (une életrovanne, une ventilation ...).

Bonjour, je vous remercie énormément des vos réponses, je vai prendre en compte ce que vous m'avez dis, essayer et commencer d'écrire le SKETCH/programme en intégrant les fonction que vous m'avez donné, et je vous donne le résultat d'ici peu.. Merci encore.

PS: Mon joystick se raproche de TOUT OU RIEN mais n'est logiquement ni l'un ni l'autre , car je reçois des valeurs analogiques que je vais transformer en numérique exemple: Marchve avec ''If reception = 0 val = 118''

...

Et ben c’est pas les schémas les plus simples les plus faciles à comprendre.
Si on remplace le simple inter par un inverseur 0V<->5V, on n’a plus besoin de la pull-up ? ou si ?

tu veux dire quelque chose comme ça :

Sans titre.bmp (165 KB)

Exactement.

Carolyne:
Et ben c’est pas les schémas les plus simples les plus faciles à comprendre.
Si on remplace le simple inter par un inverseur 0V<->5V, on n’a plus besoin de la pull-up ? ou si ?

Un peu de clarté, c’est difficile à cette heure il fait déjà nuit.

Une résistance de pull-up ou pull-down sert à fixer un potentiel.
Si on la retire, le montage doit continuer à fonctionner mais avec un état indéterminé.
Si ce n’est pas le cas elle ne s’appelle pas pull-xx et c’est une résistance qui fait partie du schéma, point.
Exemple dans le cas d’un collecteur ouvert la résistance ne s’appelle pas pull-up car si on l’a retire, le montage ne fonctionne plus. Elle fait partie intégrante du schéma et s’appelle résistance de charge.

Micro arduino : le fabricant à prévu en interne de pouvoir utiliser des résistances de pull-up mais il n’y a strictement aucune résistance de pull-down dans les micros ATMega → c’est écrit dans la doc.

Quant à ton inverseur il y a trois façons de s’en servir.

  1. en interrupteur classique sauf que maintenant tu as à ta disposition un contact ouvert au repos ou un contact fermé au repos.
    Pour un 1L mécanique (0L =relâché; 1L =appuyé ) tu aura :
  • avec un contact ouvert au repos un 0L électrique
  • avec un contact fermé au repos un 1L électrique
    → je voulais pas mais je ne peux pas m’en empêcher c’est de la logique négative ou de la logique positive :grin:).
  1. comme tu le pense avec le point commun sur l’entrée arduino et chacune des extrémités respectivement à 0V et Vcc. Mais attention au traitement des rebonds.
    Là encore selon la façon dont tu choisira les extrémités tu aura de la logique positive ou négative Ok → je sors.
  2. utilisé conjointement avec une bascule RS (Reset/Set) ils forment l’anti rebond ABSOLU.
    J’ai la flemme de faire un schéma, un coup de gogole et tu devrais trouver les explications.

B@tto, bonjour, dans le void loop que vous m'avez donné il y a quelques jours, vous avez mis des valeur entre 0 et 1024? Est-ce normal? Mes valeurs valeurs comme je l'avais prévus iraient de 0 à 255 (avec 0= 0V et 255= 4.9V)

Merci d'avance :)

Ah non, c’est bon, avec un peu de réflexion je viens de comprendre autant pour moi :slight_smile: , je suis actuellement en train d’écrire le programme, pour l’instant ça donne ça …

int S1 = 13; //Correspond à la sortie PWM numéro 13 reliée au groupe de moteur S1
int S2 = 12; //Correspond à la sortie PWM numéro 12 reliée au groupe de moteur S2
int x = A0; //Correspond à l'axe X du Joystick
int y = A1; //Correspond à l'axe Y du Joystick


void setup(){
}

void loop() {

Mesure=analogRead(Joystick); // 0<Mesure<1024

if(Mesure<500) { // 1024 / 2 = 512 ==> 500 pour laisser une marge pour zéro

Mesure=map(Mesure,0,500,86,118); // mise à l'échelle 0=>86 500=> 118 simple règle de 3
analogWrite(Moteur1,Mesure);
analogWrite(Moteur2,Mesure);

} else if(Mesure>524) { // 512 + 12 ==> marge pour zéro encore

Mesure=map(Mesure,524,1024,118,150); // mise à l'échelle
analogWrite(Moteur1,Mesure);
analogWrite(Moteur2,Mesure);

} else {

analogWrite(Moteur1,118);
analogWrite(Moteur2,118);

}

}

Sauf que maintenant il faut insérer tes variables dans mon code ;) pour l'instant c'est toujours moteur1, moteur 2 ...

D’accord, ça donne quelque chose comme

int S1 = 13; //Correspond à la sortie PWM numéro 13 reliée au groupe de moteur S1
int S2 = 12; //Correspond à la sortie PWM numéro 12 reliée au groupe de moteur S2
int x = A0; //Correspond à l'axe X du Joystick
int y = A1; //Correspond à l'axe Y du Joystick


void setup(){
}

void loop() {

Mesure=analogRead(Joystick); // 0<Mesure<1024

if(Mesure<500) { // 1024 / 2 = 512 ==> 500 pour laisser une marge pour zéro

Mesure=map(Mesure,0,500,86,122); // mise à l'échelle 0=>86 500=> 118 simple règle de 3
analogWrite(S1,Mesure);
analogWrite(S2,Mesure);

} else if(Mesure>524) { // 512 + 12 ==> marge pour zéro encore

Mesure=map(Mesure,524,1024,122,150); // mise à l'échelle
analogWrite(S1,Mesure);
analogWrite(S2,Mesure);

} else {

analogWrite(S1,122);
analogWrite(S2,122);

}

}

et joystick et Mesure ?

je suis pas expert en programmation mais je ferai ça :

int S1 = 13; //Correspond à la sortie PWM numéro 13 reliée au groupe de moteur S1
int S2 = 12; //Correspond à la sortie PWM numéro 12 reliée au groupe de moteur S2
int x ; //Correspond à l'axe X du Joystick
int y ; //Correspond à l'axe Y du Joystick


void setup(){
}

void loop() {

// lectures des entrées
x=analogRead(A0); // 0<Mesure<1023 de l'entrée A0
y=analogRead(A1); // 0<Mesure<1023 de l'entrée A1

// traitement des données du joystick en x :
if(x<500) { // 1024 / 2 = 512 ==> 500 pour laisser une marge pour zéro
  x=map(x,0,500,86,122); // mise à l'échelle 0=>86 500=> 118 simple règle de 3
} 
else if(x>524) { // 512 + 12 ==> marge pour zéro encore
  x=map(x,524,1024,122,150); // mise à l'échelle
} 
else { 
  x=122;
}

// traitement des données du joystick en y :
if(y<500) { // 1024 / 2 = 512 ==> 500 pour laisser une marge pour zéro
  y=map(y,0,500,86,122); // mise à l'échelle 0=>86 500=> 118 simple règle de 3
} 
else if(y>524) { // 512 + 12 ==> marge pour zéro encore
  y=map(y,524,1024,122,150); // mise à l'échelle
} 
else { 
  y=122;
}

// activation des sorties moteurs :
analogWrite(S1,x);
analogWrite(S2,y);
}

pour plus de clarté dans la boucle loop
1 - lecture des entrées
2 - traitements des données
3 - écriture des sorties

Voila, par exemple, c'est la que je bloque .. :/

sur quoi exactement

sur la lecture, les calculs ou les sorties ?

dans ton code tu utilise deux sorties, une pour moteur1 et l'autre pour moteur2 et tu leurs affectent la même valeur "mesure" pourquoi donc utiliser deux sorties si les deux moteurs ont la même commande autant piloter les deux moteurs avec la même sortie ça simplifie le code

Ah merci beaucoup fifi je n'avais pas vu qu'il y avait la deuxième page (dans le topic)

Pour pouvoir tester le programme je dois impérativement attendre que mes collègues aient fini le leur (un pour le xbee et un pour le joystick) mais en attendant je peux essayer de le compléter au maximum :)

Mais, maintenant je bloque au niveau de VOID SETUP ..

VOID SETUP .. sert à déclarer certaine fonction tel que la communication série, la gestion des servomoteurs, le paramétrage des broches en entrée ou en sortie etc...