French
Le AsIs/ToBe graphique:
Les tensions revelées sur les sorties (couleurs) du Joystick "Penny+Giles" connecté au boitier "Dupont" :
Couleur | Position | Tension point mort | Tension Devant | Tension Derrière | Tension Droite | Tension Gauche |
Violet | 2 | 1,4 | 1,4 | 1,4 | 1,4 | 1,4 |
Bleu | 3 | 3,64 | 3,64 | 3,64 | 3,64 | 3,64 |
Vert | 4 | 3,64 | 3,64 | 3,64 | 3,64 | 3,64 |
Orange | 6 | 2,53 | 3,63 | 1,9 | 1,75 | 3,27 |
Marron | 8 | 2,55 | 3,16 | 1,88 | 3,4 | 1,57 |
La fiche technique du Joystick "Penny+Giles" avec les codes couleurs annotés (pour faire le lien avec le tableau ci-dessus):
Le module PWM -> Voltage:
Et les programmes Arduino.
(todo)
Les modules HC-05 ont été achetés ici : https://www.amazon.fr/gp/product/B071HBF22P
Bonsoir,
du coup, j'ai fais les premiers tests avec le HC-05 (envois de texte entre mon téléphone portable et l'arduino), ce qui marche bien.
Du coup, j'aurais quelques questions pour la suite :
- est-ce que tu veux une communication arduino à arduino (via 2 modules HC-05) ou est-ce que tu veux juste le coté récepteur?
- pour le format des communications, tu as une préférence? (texte, binaire, quelles vérifications, ...)? Ou est-ce que je fais comme je pense. Dans ce cas, si je pars sur arduino à arduino, ce serait probablement en binaire, avec 1 octet de début de message fixe, puis le message (format à définir selon ce qu'on voudra transmettre), puis une checksum pour s'assurer d'ignorer les messages corrompus. Éventuellement avec une confirmation de réception si tu le souhaites. Si veux juste le coté récepteur, alors du text sera probablement plus pratique.
- qu'est-ce que tu veux envoyer comme informations? La tension souhaitée sur chaque fil? Les pourcentages avant et coté du joystick? La vitesse de chaque roue? La vitesse d'avance du robot et la vitesse de rotation?
Enfin, tu veux que j'assemble un circuit final soudé et que je te l'envois, ou tu veux que je t'envois les instructions de comment le faire toi?
Bonne soirée
Félix
Salut Félix,
pour répondre à tes questions:
1- Aujourd'hui je fais déjà une communication Nano (émetteur) -> Uno (récepteur). J'ai mesuré une certaine latence en faisant des serial print dans des programmes Arduino sur les 2 cartes, j'obtiens très souvent 1 à 2 secondes de latence ce qui n'est pas génant pour l'ouverture d'une porte de garage mais pourrait être inconfortable dans le cadre du pilotage d'un robot "à distance" (quelques metres). Ce sujet n'est pas prioritaire car non bloquant.
2- Actuellement j'envoie la position X,Y du joystick (donnée entre 0 et 255) sous la forme d'une string type json. (je vais poster à la suite de cette réponse une des versions des programmes Arduino, ce qui m'embete c'est de ne pas avoir retrouvé les dernières versions, du coup ce n'est pas exploitable en l'état mais je vais prendre le temps de refaire des programmes qu'on pourra partager poru continuer d'avancer).
3- le point le plus important car je suis bloqué dessus, c'est de transformer ces données reçues (INT X,Y) en intensité (V) suivant le tableau du 1er post. Donc délivrer une tension entre 1,4 V et 3.64V qui correspond à la valeur entre 0 et 255 reçue pour chaque axe.
Enfin, je n'ai pas besoin que tu m'envoies quelquechose pour le moment, mon objectif c'est de me débloquer la situation, soit par manque de connaissance soit par vision trop étriquée, donc j'ai surtout besoin de conseil pour éviter de perdre trop de temps sur des points de blocage.
Je poste une des versions des programmes, à ne pas prendre en l'état car si ce n'est pas la dernière version ca ne doit pas bien marcher, mais je vais prendre du temsp ce WE pour les refaire fonctionnel.
@+
Adrien
le programme émetteur:
et le programme récepteur:
Bonjour,
1) J'ai pas testé la latence pour le moment, vu que je n'avais que testé le mode récepteur (et pour une bonne mesure de latance, il faut soit deux systèmes parfaitement synchronisés, soit faire faire un aller retour au message (donc programmer un arduino en maitre et l'autre en esclave).
A noter que plusieurs éléments peuvent jouer :
- la librairie RH_ASK.h, si c'est bien celle d'ici (http://www.airspayce.com/mikem/arduino/RadioHead/classRH__ASK.html) n'est pas explicitement compatible avec le HC-05
- la librairie, par défaut, utilise une vitesse de transmission de seulement 2000 bits/seconde
- utiliser du JSON fait que tu envois beaucoup de caractères (19 à première vue), sans compter les bits supplémentaires envoyés par la librairie (72 bits je crois + 50% de ce que tu envois). ça ferait donc un total de 300 bits par message (ça n'explique pas encore 2 secondes, mais ça nous fait une latence d'au moins 300/2000=0.15 secondes
Je vais essayer de creuser un peu la question.
D'ailleurs tu as obtenu cette latence de quelle manière (si tu passes par le moniteur série, il faut ajouter la latence de la communication arduin-PC, le temps de préparer les message, la latence le temps que ce soit au tour du thread du serial monitor, plus le temps d'affichage)
2) ok, comme tu veux. Préviens moi si au final tu préfères que j'avance sans attendre ton programme.
3) ça c'est assez facile. A noter que ce qui t'intéresse c'est une tension (en volts : V) et pas une intensité (en ampères: A).
Pour créer une tension 0<=U<=5V à partir de l'arduino, c'est pas dificile :
- sur un pin PWM, tu mets un PWM=255*U/5 : tu aura donc un créneau avec un temps une proportion U/5V à l'état haut (5V), et le reste à l'état bas (0V). La tension moyenne est donc Umoy=(U/5V)*5V+(1-U/5V)*0V=U.
- on a donc un créneau qui a la bonne tension moyenne (mais qui ondule en plus) : il suffit donc de supprimer les ondulations avec un filtre passe bas : un simple filtre RC suffit.
Pour le choix de R et C, ainsi que de la fréquence de PWM, ça dépends de ce que tu veux :
- quelle erreur maximale sur la tension
- quelle temps de réponse à un changement brutal de consigne
La fréquence de coupure du filtre (en Hz) est fc=1/(2*pi*R*C). Si les ondulations. Si la fréquence du PWM (fPWM) est plus grande que fc, alors les ondulations restantes auront une amplitude de l'ordre de 3.2V*fc/fPWM. Donc si tu veux moins de 10mV d'ondulation, il te faut fPWM > 300*fc.
Le temps caractéristique (n secondes) est tau=2*pi*R*C : ça correspond à la durée qu'il faut pour faire 1/e=63% du changement. Plus précisément, au bout d'un temps t, il te reste exp(-t/tau) du changement à faire. Si t=4*tau, tu à fait 98% du changement. Si t=5taux, tu as fait 99.3%
Ma suggestion :
- Utiliser les pins PWM n°9 et 10 (ils permettront si besoin d’obtenir une résolution de 16 bits au lieu de 8 bits). Nb : on va modifier la fréquence du Timer1 pour changer celle du PWM, du coup la librarie Servo ne marchera plus (si c’est un problème, on peut utiliser le Timer2 à la place, mais il n’a que 8 bits de résolution).
- utiliser la fréquence maximale pour ces pins, soit 31.25 kHz
- on veut qu’un changement de tension soit fait à 99 % en 0.1 s (donc fait à 63 % en 0.02s). Par conséquent, on a t=5*tau=0.05s, donc 2*pi*R*C=tau=0.01s. On a donc R*C=0.01/(2*pi)=6.4 ms
- on a donc une fréquence de coupure fc=1/(2*pi*R*C)=1/tau=100 Hz. Par conséquent, les oscillations seront de l’ordre deltaU=3.2V*fc/fPWM=3.2*100/31250=1mV
- pour le choix de R et C, tu fais selon ce que tu as, tant que le produit R*C fait environ 6.4*10^-3.
Par exemple, si tu as un condentateur C=10µF=10^-5 F, alors il te faut une résistance R=6.4*10^-3/10^-5 = 640 ohms environ (par exemple R=560 ou 680 ohms, pour prendre des valeurs standard).
Salut Félix,
aie ca y est je commence à peiner ^^
Bon oui je parle de tension (V) j'ai honte d'avoir écrit intensité !
par contre je vais être clair, je ne comprends rien à ta suggestion (et tu comprends maintenant pourquoi j'ai besoin de toi !).
As-tu la possibilité de mettre 2 arduino en mode master/slave ?
De me proposer 2 programmes Arduino (si possible le plus simple possible) pour transmettre 3 valeurs du master au slave (X, Y, et switch joystick) ?
De me faire un schéma de montage + liste des composants pour faire afficher sur un multimètre 2 bornes de tension (correspondant aux 2 fils Orange + Marron pour Droite / Gauche) en plus de la borne de masse ? (suis-je clair ?)
Encore merci, @+ Adrien
Hello,
bon en regardant de plus près les moniteur séries je pense que je me suis bien planté sur les programmes, je te colle donc ceux que je pense avoir uploadé:
Master:
Slave:
par contre je vois rien qui inclut l'envoi d'info vers le DAC coté slave, bizarre !
Je ne comprends toujours pas comment j'ai pu perdre ces scripts mais je vais devoir me faire une raison, faut recommencer ^^
Je te confirme j'ai rechargé ces 2 scripts dans les 2 arduino (Nano = master, Uno = slave), ça fonctionne.
Dans mon dernier update j'avais mis en forme les data au format json, ce qui n'est pas le cas là mais rien d'important.
Je pense que j'avais aussi fait un lien entre les données reçues (par la Uno slave) et le module DAC, mais de ce que je comprends c'est que ce module DAC n'a pas de raison d'être si on utilise le PWM pour sortir une tension en gomant les "creux", c'est bien ça ?
Pour faire suite, voici les screenshots des consoles séries, avec highlight sur les données au moment où je bouge le joystick vers l'avant de la télécommande.
J'ai activé l'horodatage après avoir up les 2 systèmes par NTP (pour info, Ubuntu 18 pour la Nano et Windows 7 pour la Uno).
Screenshot du master (Arduino Nano):
et screenshot du slave (Arduino Uno):
l'écran est juste plus grand et je n'ai pas redimmensionné lors de la capture.
On voit bien que les 6 commandes (il en apparait 12 sur le screenshot du master car j'affiche 2 lignes à chaque envoi = "master sent" + "slave received"), sont bien transmises.
voici la transcription en txt (j'ai viré les lignes "slave received" qui n'apportent rien):
Master:
14:55:39.407 -> Master sent msg: dat: x:1022,y:502,s:1
14:55:40.137 -> Master sent msg: dat: x:1022,y:502,s:1
14:55:40.867 -> Master sent msg: dat: x:1023,y:502,s:1
14:55:41.630 -> Master sent msg: dat: x:1023,y:502,s:1
14:55:42.360 -> Master sent msg: dat: x:1020,y:502,s:1
14:55:43.089 -> Master sent msg: dat: x:1023,y:502,s:1
14:55:43.819 -> Master sent msg: dat: x:498,y:502,s:0
Slave:
14:55:39.584 -> Master sent : x:1022,y:502,s:1
14:55:40.333 -> Master sent : x:1022,y:502,s:1
14:55:41.035 -> Master sent : x:1023,y:502,s:1
14:55:41.784 -> Master sent : x:1023,y:502,s:1
14:55:42.533 -> Master sent : x:1020,y:502,s:1
14:55:43.281 -> Master sent : x:1023,y:502,s:1
14:55:43.983 -> Master sent : x:498,y:502,s:0
Jusque là je dirais que tout va bien.
En regardant les scripts d'un peu plus près c'est vraiment de la merde, j'ai remis le nez dedans je me demande comment j'ai pu pondre ça.
Donc je les ai un peu nettoyé (je vais encore les revoir):
Master:
Slave:
Salut,
un test avec des logs:
Master:
09:44:24.702 -> Master sent: #70=x:498,y:502,s:0
09:44:25.430 -> Master sent: #71=x:498,y:502,s:0
09:44:26.193 -> Master sent: #72=x:498,y:502,s:0
09:44:26.922 -> Master sent: #73=x:1014,y:502,s:0
09:44:27.651 -> Master sent: #74=x:498,y:502,s:0
09:44:28.413 -> Master sent: #75=x:0,y:502,s:0
09:44:28.944 -> Master sent: #76=x:0,y:502,s:0
09:44:29.540 -> Master sent: #77=x:0,y:502,s:0
09:44:30.270 -> Master sent: #78=x:498,y:403,s:1
09:44:31.032 -> Master sent: #79=x:498,y:411,s:0
09:44:31.762 -> Master sent: #80=x:498,y:1022,s:0
09:44:32.490 -> Master sent: #81=x:498,y:502,s:1
09:44:33.220 -> Master sent: #82=x:498,y:332,s:0
09:44:33.949 -> Master sent: #83=x:498,y:502,s:0
09:44:34.678 -> Master sent: #84=x:498,y:502,s:0
09:44:35.407 -> Master sent: #85=x:498,y:502,s:1
09:44:36.136 -> Master sent: #86=x:498,y:502,s:1
09:44:36.866 -> Master sent: #87=x:498,y:502,s:0
09:44:37.596 -> Master sent: #88=x:498,y:502,s:0
09:44:38.325 -> Master sent: #89=x:498,y:502,s:1
09:44:39.021 -> Master sent: #90=x:1023,y:503,s:1
Slave:
09:44:26.547 -> Slave received : #70=x:498,y:502,s:0
09:44:26.922 -> Slave received : ⸮
09:44:27.296 -> Slave received : #71=x:498,y:502,s:0⸮
09:44:27.998 -> Slave received : #72=x:498,y:502,s:0
09:44:28.185 -> Slave received : ⸮
09:44:28.747 -> Slave received : #73=x:1014,y:502,s:0
09:44:29.496 -> Slave received : #74=x:498,y:502,s:0⸮
09:44:29.823 -> Slave received : ⸮⸮
09:44:30.291 -> Slave received : ⸮
09:44:30.712 -> Slave received : ⸮⸮⸮
09:44:30.993 -> Slave received : ⸮⸮
09:44:31.368 -> Slave received : #77=x:0,y:502,s:0
09:44:31.555 -> Slave received : ⸮
09:44:31.602 -> Slave received : ⸮⸮
09:44:32.116 -> Slave received : #78=x:498,y:403,s:1⸮⸮
09:44:32.865 -> Slave received : #79=x:498,y:411,s:0
09:44:33.333 -> Slave received : ⸮
09:44:33.427 -> Slave received : #
09:44:33.614 -> Slave received : 80=x:498,y:1022,s:0
09:44:34.316 -> Slave received : #81=x:498,y:502,s:1
09:44:35.065 -> Slave received : #82=x:498,y:332,s:0
09:44:35.814 -> Slave received : #83=x:498,y:502,s:0
09:44:36.516 -> Slave received : #84=x:498,y:502,s:0
09:44:37.264 -> Slave received : #85=x:498,y:502,s:1
09:44:37.966 -> Slave received : #86=x:498,y:502,s:1
09:44:38.715 -> Slave received : #87=x:498,y:502,s:0
09:44:39.417 -> Slave received : #88=x:498,y:502,s:0
09:44:40.166 -> Slave received : #89=x:498,y:502,s:1
09:44:40.868 -> Slave received : #90=x:1023,y:503,s:1
On peut voir quelques erreurs, je ne connais pas l'origine, mais cela signifie qu'il faut que sur le récepteur (slave Uno) je programme une reconnaissance de la chaine et ne prendre en compte que les chaines bien reçues.
Bonjour,
désolé d'avoir tardé un peu à te répondre.
Du coup, pour le DAC, on n'en a plus besoin, on le fera nous même avec un PWM, un condensateur et une résistance.
Sinon, j'ai fait quelques tests sur la transmission, et mis au point un algo assez fiable.
Tout d'abord, pouquoi y a-t-il des erreurs de transmissions :
- une cause est une erreur de lecture d'un bit, du à du bruit électromagnétique. A priori c'est assez rare, et ça change un seul bit
- le buffer de réception est plein (car on n'a pas fini de traiter les données avant que de nouvelles arrivent) : dans ce cas, il y a des octets qui disparraissent, et du coup on risque de mal interpréter les données (par exemple penser qu'on est au début du message alors qu'en fait le début manque et qu'on est au milieu. C'est de loin l'erreur la plus fréquente. Elle survient principalement quand on envoit les données "trop vite" et que le récepteur n'arrives plus a suivre
Du coup, j'ai écris les programmes de tests suivant :
master :
slave:
A noter que j'ai laissé les modules HC-05 sur leur vitesse par défaut (9600)
Avec le "delay(1)" dans le loop, le slave n'arrives pas a suivre. Du coup un nombre important de frames arrivent corrompues (42%). Néanmoins, la vérification des frames permet de détecter les frames invalides dans 99.8% des cas (ie seul 0.2% des frames invalides sont interprétée comme valides).
Si on remplace le "delay(1)" par "delay(10)", le slave arrive de nouveau à suivre. Du coup, sur 10^5 frames, je n'ai observé aucune frame corrompue (mais s'il y en avait une, il y aurait 99.8% de chance quelle soit rejetée).
A noter que je me suis permis de remplacer la transmission par texte par une transmission par octots directement.
Un message est donc de la forme :
42; nombre_1_sur_2_octets ; nombre_2_sur_2_octets ; nombre_3_sur_2_octets ; checksum_sur_1_octet
soit 8 octets d'envoyés pour transmettre 3 nombres (des int16_t).
Pour te finaliser le programme (ie l'adapter précisément à ton joystic), j'aurais quelques questions :
1) c'est quoi exactement que tu veux transmettre du master (télécomande) au slave? La valeur du potentiomètre? La tension à envoyer sur chaque fil en sortie? La vitesse en % en rotation et en avance? La vitesse en % de chaque roue? ...
NB : si tout ce qui t'intéresse c'est de commander avec la télécommande, alors c'est peu importe (dans ce cas je prendrais la tension en mV). Si en revanche tu veux déjà préparer la suite, quand la télécomande sera remplacée par un ordinateur, alors tu as peut-être une préférence.
2) ton joystick, tu le montes "droit" (ie axes avant-arrière et gauche-droite) ou à 45° comme celui du fauteil roulant
3) Est-ce que le bouton du joystick sert à quelque chose ou je l'ignore?
4) Tu veux transmettre à quelle fréquence?
5) Est-ce que tu as besoin de savoir si un envoi a échoué?
Bon weekend
Félix
Salut,
alors je viens de voir 5 mois passer sans m'en rendre compte, ma réponse est plus que tardive.
j'ai remis les mains dans le camboui, j'applique ta réponse et je reviens dans quelques jours.
@+
Salut Felix,
pour le master, j'obtiens cette erreur à la compilation:
donc 3 nombres d'une valeur max chacun de 65536 ?
A quoi sert le "42" au début ?
oui peu importe la technique du moment qu'elle permet de "piloter" le slave, donc d'envoyer un indicateur de direction et de vitesse (si on considère que l'angle du joystick represente la direction et la distance depuis le centre, la vitesse).
je l'ai mis droit en raison de la morphologie de la carte electronique du joytsick qui s'intègre mieux en position "droite".
pour le moment il n'est pas utile mais il pourrait être un élément de sécurité, par exemple initier de nouvelles commandes après un délai "de veille", ainsi ca pourrait éviter un accident si le joytsick était déplacé par inadvertance. Au bout de 5s par exemple, tu doit appuyer sur le bouton pour que son déplacement soit pris en compte. Aucune commande pendant 5s force l'utilisation du bouton du joystick pour prise en compte de nouvelle commande.
Qu'importe du moment que ca marche :)
pour le moment non.
Je préfère m'assurer que les réceptions sont justes et fiables.