Nouvelles fonctionnalités de la version 2.0:
- Anti-frétillement sur les sorties servos (taux d'amortissement réglable): ce phénomène de "jittering" était dû à l'imprécision de la fonction Pulsin() de l'arduino. Il est corrigé.
- "Fail-Safe": En cas de perte de réception, les sorties servo se positionnent selon une valeur prédéterminée. D'autres instructions peuvent être exécutées à ce moment, il suffit de les inclure dans la procédure safeProc()
Attention: la nouvelle version n'est pour l'instant disponible qu'en français (vous avez dit "préférence nationale ?" meuh non...)
De plus, pour bénéficier de la fonction "Fail-Safe", il faut impérativement mettre à jour le PIC du module GridStick avec la dernière version (2.0) disponible ci-dessous.
Je ne peux pas proposer de "run" pour le circuit imprimé pour l'instant, mais si des personnes sont intéressées par un PIC programmé, n'hésitez pas à me contacter par mail.
Sur une suggestion de Xoff (r2Buiders.fr), une petite modif a été faite afin d'éviter de réserver l'un des deux joysticks à l'usage exclusif des strokes.
Avec la nouvelle version, les signaux issus du récepteur sont recopiés sur des sorties digitales de l'Arduino. Ainsi le fonctionnement du manche de commande est le suivant:
- En mode normal, le système est "transparent": si une des voies (mettons la voie horizontale) est affectée à la rotation du dôme par exemple, le déplacement du manche à droite ou à gauche commandera la rotation à vitesse proportionnelle, comme si la connexion était directe.
- Lorsqu'on bascule l'interrupteur de saisie de strokes, la commande reste dans l'état: si le dome était en rotation lente à droite par exemple, il gardera ce comportement tant que la saisie du stroke est en cours.
- Dès que l'inter est remis dans sa position d'origine, deux événements se succèdent:
1) La routine correspondant au stroke reconnu est exécutée, s'il y a lieu.
2) Le joystick retrouve sa fonction normale.
Je prépare un nouveau circuit imprimé pour le module Gridstick afin de faciliter l'utilisation de la nouvelle version (connecteurs de sortie type servo sur la carte). Je mettrai celle-ci en ligne en même temps que la mise à jour du programme (encore en phase de test)
RC_STROKES MODE D'EMPLOI mise à jour le 18.05.2012
Ce programme pour Arduino Uno est destiné à être utilisé conjointement avec le module Gridstick décrit par ailleurs, qui vient se connecter sur l' Arduino et sert d'interface entre celui-ci et un récepteur de radiocommande standard.
Ce module utilise trois voies ( trois sorties du récepteur) et permet de disposer d'un nombre virtuellement illimité de commandes à partir de ces trois voies.
Le principe retenu est celui des "strokes" ("gestes"), concept développé initialement par Scott Gray sur le site Astromech.net et dont voici la description: un des deux manches ("sticks") de l'émetteur est réservé à la saisie des "strokes". Ce manche utilise 2 voies de l'émetteur, une pour le déplacement horizontal et une pour le sens vertical. Une 3e voie Tout ou Rien (TOR) est utilisée comme interrupteur de validation: En manoeuvrant cet interrupteur (ou en appuyant sur ce bouton) on indique le début de la saisie, en le relâchant on valide la saisie.
On peut diviser le carré représentant les différentes positions possibles du manche en 9 "zones" à chacune desquelles on attribue un nombre entre 1 et 9. Un stroke est constitué d'un trajet du manche à travers ces différentes zones, qui sera traduit en une suite de chiffres représentant les zones parcourues pendant ce trajet. Il suffit de mémoriser et d''attribuer une fonction à chacun de ces trajets pour disposer d'une liste de commandes aussi longue qu'on le désire. De plus, la forme du trajet obtenu peut constituer un moyen mnémotechnique pour retenir facilement telle ou telle fonction. Par exemple, dessiner un "S" pour commander la carte son, "L" pour les lumières, etc...
EXEMPLE: STROKE = "74123"
NB: Avec ce sketch, si la saisie démarre alors que le joystick est en position centrale, le point de départ (5) ne fera pas partie du stroke: vous pouvez donc basculer l'inter avant ou après avoir joint le point de départ (mais pour les points situés dans les angles, je trouve plus facile de basculer l'inter après, car le système de ressorts de rappel de la plupart des manches d'émetteur rend le trajet en diagonale assez aléatoire)
Avec le programme proposé, la détermination de la position du joystick est confiée au module Gridstick, à base de PIC 16F628A, qui se charge de la traduction des temps de voies (les sorties du récepteur sont en fait des trains d'impulsions de durée variable entre 1 et 2 millisecondes, répétés toutes les 20 millisecondes) en un nombre correspondant à la position sur la grille 3x3. L'intérêt de faire appel à un circuit spécialisé plutôt qu'à l' Arduino pour faire la conversion, c'est que celui-ci est déchargé de la partie critique du "timing", il lui suffit de venir lire les entrées logiques sur lesquelles la valeur de la position sur la grille est directement disponible à n'importe quel moment.
L' ensemble est de ce fait plus réactif, le système est très fiable et les strokes facilement reproductibles.
Le programme permet l'acquisition, la reconnaissance et la suppression de strokes. La longueur maximale de ceux-ci (modifiable dans le programme) est de 20 caractères (20 déplacements consécutifs dans la grille), leur nombre maximal est fixé à 30. On peut en définir plus si nécessaire en changeant le paramètre MAXSTROKES, mais il ne faut pas oublier qu'il faudra les mémoriser !
De plus, la sauvegarde se fait dans la mémoire non volatile de l'Arduino (EEPROM) et on est donc limité à 1K (ce qui correspond à environ 50 strokes de 20 caractères).( Il est toujours possible d'étendre la mémoire au moyen d'une EEPROM externe le cas échéant).
Le logiciel prévoit également une fonction "autorepeat" commode: celle-ci permet en manoeuvrant l'inter de validation (aller-retour) sans déplacer le manche de répéter la dernière commande. Cette fonction peut être désactivée ou réactivée à tout moment.
Pour la mise au point et la création des strokes, il faut ouvrir le "Serial Monitor" dans le menu Tools de l'éditeur de scripts Arduino.
Un exemple de copie d'écran du moniteur ci-dessous montre quelques messages obtenus.
|
ARDUINO STROKE CONTROLLER V1.0 (c) THX-1138 2012 CHARGEMENT DES STROKES EN EEPROM... OK 7412365 8745 874123 741232147 STROKE DETECTE: 1 *********** LISTE DES STROKES ********* 0: 987456321 1: 741232147 2: 4569874123 3: 14789 4: 6565 5: 2525 6: 74123 8: 858585858585 9: 45454545 10: 454545 ****************************************** 6565 STROKE DETECTE: 4 *** AUTOREPEAT ACTIVE *** 74123 STROKE DETECTE: 6 REEXECUTION STROKE 6 987456321 STROKE DETECTE: 0 ********* CREER NOUVEAU STROKE ********* - CE STROKE EXISTE DEJA: NUMERO 6 VOULEZ-VOUS L'EFFACER ? STICK EN BAS: OUI, A GAUCHE: NON -------------- ANNULE ------------------- 858585858585 STROKE DETECTE: 8 6565 STROKE DETECTE: 4 *** AUTOREPEAT DESACTIVE *** |
Les commandes de base sont au nombre de 5, elles sont accessibles elles aussi au moyen de strokes prédéfinis:
Après chaque entrée de stroke reconnu, la LED présente sur la carte de l'Arduino (en sortie 13) clignote 3 fois pour indiquer que le stroke est valide.
Une fois l'Arduino déconnecté de l'ordinateur, cette LED permet de constater la bonne réception d'un stroke (en l'absence d'autres dispositifs - il est très facile d'adapter un afficheur LCD 2x16 série par exemple en lieu et place du moniteur série...)
Il est possible de revenir aux "réglages d'usine" c'est-à-dire à la configuration initiale des 5 strokes de base uniquement, en maintenant le manche dans une position latérale quelconque (pas au centre) et de redémarrer l"Arduino (en appuyant sur le bouton reset de la carte Arduino).
1-STROKE "S": CREATION D'UN NOUVEAU STROKE
Saisie:
- amener le joystick en haut à droite (position 9)
- basculer l'inter de validation de début de saisie
- déplacer le manche suivant un "S": coin en haut à gauche, puis à gauche rangée du milieu, puis à droite rangée du milieu, puis en bas à droite, puis en bas à gauche. (ça a l'air compliqué comme ça, mais c'est très facile et rapide à éxécuter)
- rebasculer l'inter de validation (fin de saisie)
STROKE="987456321"
Fonction: Le programme attend que vous saisissiez un nouveau stroke; Dès que la saisie est terminée (inter de validation revenu à sa position de repos), celui-ci affiche le stroke (la suite de chiffres) et son numéro d'enregistrement. C'est ce numéro qui permettra de déclencher les actions programmées (voir ci-dessous).
Si ce stroke existe déjà, le logiciel vous le signale et demande si vous souhaitez le supprimer (la réponse se fait avec le joystick)
2-STROKE double "L": LISTE DES STROKES
Saisie:
- amener le stick en haut à gauche
- basculer l'inter de validation
- déplacer le stick en bas à gauche, puisn en bas à droite.
- refaire le chemin inverse: en bas à gauche, puis en haut à gauche.
- replacer l'inter de validation au repos.
STROKE="741232147"
Fonction: Le moniteur série affiche la liste des strokes en mémoire avec leur numéro.
Une fois tous vos strokes créés, imprimer cette liste pour pouvoir s'y référer et programmer les actions correspondantes.
3-STROKE "e": éCRITURE en EEPROM
Saisie:
- amener le stick à gauche ligne du milieu
- actionner l'inter de saisie
- déplacer le stick à droite ligne du milieu
- stick en haut à droite
- en haut à gauche
- en bas à gauche
- en bas à droite
- rebasculer l'inter
STROKE="4569874123"
Fonction: Ecrit l'ensemble des strokes en EEPROM.
4-STROKE "r" rELECTURE EEPROM
Saisie: -amener le stick en bas à gauche
-activer l'inter
-stick en haut à gauche
-stick en haut à droite
-relâcher l'inter
STROKE="14789"
Fonction: Recharge les strokes de l' EEPROM
5-STROKE "AUTOREPEAT ON/OFF"
Saisie: - basculer l'inter de saisie
- déplacer deux fois le stick à droite ligne du milieu (avec retour au centre)
- rebasculer l'inter
STROKE="6565"
Fonction: Active / désactive la fonction autorepeat:
Cette fonction permet de réactiver le dernier stroke valide sans avoir à le saisir à nouveau (par exemple: déclenchement d'un son aléatoire): Il suffit pour cela de
faire un aller-retour avec l'inter de saisie sans toucher au joystick.
PROGRAMMATION DES ACTIONS A EFFECTUER:
C'est bien beau tout ça, me direz-vous, mais comment c'est-y que je commande mon périscope, et que je fais clignoter mes lumières avec ton truc ? Eh bien vous répondrai-je, rien de plus facile ! Il suffit d'aller en fin de programme, vous verrez une suite d'instructions "CASE" suivies d'un nombre, ce nombre représente le numéro du stroke, il vous suffit d'insérer les instructions correspondant à ce que vous voulez faire entre le "CASE" et le "BREAK": par exemple, vous pouvez envoyer des commandes I2C pour piloter une carte son, ou un Logic Display, ou une carte de commande moteurs, ou des ordres pour piloter des servomoteurs, ou une carte à relais, ou même un autre Arduino...
Vous pouvez aussi créer de véritables sous-programmes qui réagiront à la position du joystick en utilisant la fonction "stickpos()" qui retourne la position du manche dans la grille 3x3, les possibilités ne sont limitées que par la taille de la mémoire programme et celle de l'EEPROM. A vous de jouer !
Ce programme ne doit pas être considéré comme un aboutissement, c'est plutôt un "squelette" appellé à évoluer et à s'etoffer, mais tel qu'il est, je pense qu'il peut déjà rendre pas mal de services, c'est ce qui m'a poussé à vous le proposer. Vos remarques et suggestions seront les bienvenues ...
Télécharger le sketch Arduino:
RC_Strokes_fr version en français
RC_Strokes_en english version
Olivier LANVIN (THX-1138 sur www.r2builders.fr) 2012
Gridstick est un petit module à base de PIC 16F628A qui permet de convertir la position d'un manche de radiocommande classique ("stick" 2 voies) en un nombre de 1 à 9 suivant une grille 3x3. Le module utilise également le signal d'une 3e voie pour obtenir une sortie "tout ou rien", par exemple en basculant un interrupteur sur le pupitre de l'émetteur.
Le montage se connecte sur les sorties d'un récepteur de télécommande standard à créneau positif (neutre à 1.5 ms)
Déplacements du manche de commande
La sortie est disponible sous forme binaire sur 5 bits, les 4 premiers bits représentant la position dans la grille, et le 5e bit la position de l'inter de la 3e voie.
Le module est conçu pour s'enficher sur une platine Arduino Uno, les sorties correspondant aux entrées digitales 2 à 6 de l'Arduino.
L'alimentation 5V est fournie par la carte Arduino sur laquelle il s'enfiche. Le récepteur n'a pas besoin dans ce cas d'alimentation propre, celle-ci étant aussi fournie par l'Arduino. Attention cependant si des servomoteurs sont connectés en même temps sur le récepteur: il faudra mieux dans ce cas prévoir une alimentation séparée pour ceux-ci (avec masse commune)
Il devient alors très facile de programmer l'Arduino pour réaliser un contrôleur du style "JEDI Control" permettant d'utiliser des "strokes" c'est-à-dire une suite de mouvements du manche correspondant à une combinaison unique, validée par le basculement de l'interrupteur, et déclenchant telle ou telle action.
Les possibilités sont virtuellement infinies !
L'avantage de procéder ainsi, plutôt qu'en utilisant la fonction PulseIn de l'Arduino, c'est qu'on décharge celui-ci des tâches de "bas niveau" (pour lesquelles le langage assembleur est mieux adapté), le programmeur peut dès lors se concentrer sur la partie enregistrement et analyse des "strokes".
Un exemple de gestion de "strokes" pour Arduino Uno est fourni par le programme Gridstroke décrit ci-après.
Un petit module d'affichage optionnel peut se connecter sur la platine pour visualiser l'état des sorties (ce n'est pas vraiment nécessaire, mais j'ai un faible pour les petites LEDs qui clignotent).
Les LEDs vertes sont les bits de position, et la LED rouge le bit de validation. Attention, la LED rouge est connectée en sens opposé aux LED vertes (cathode vers l'extérieur du circuit)
Deuxième option: utiliser un afficheur numérique 1 digit à décodeur 4 bits intégré qui donne directement la position sur la grille, le bit de validation commandant l'allumage de l'afficheur (type HP 5082-7300 ou équivalent).
- voir la vidéo ICI-
La précision de l'oscillateur interne (5%) étant suffisante pour cette application, je me suis passé de quartz. Si toutefois vous préfériez en utiliser un, il faudrait modifier le paramètre correspondant dans le fichier source et le recompiler.
circuits imprimés
implantation des composants
(les deux modules d'affichage sont optionnels)
résistance: 4,7 K - condensateur: 0,1 uF
Les connecteurs en ligne latéraux, mâles, sont à souder côté cuivre et sont destinés à venir se connecter sur la platine Arduino.
Le connecteur en ligne restant est un modèle femelle, il est placé pour permettre la connexion éventuelle d'un des deux modules d'affichage proposés.
Les connecteurs RX1 à RX3 reçoivent les câbles de connexion vers le récepteur de radiocommande.
Le fichier hexa à charger dans le PIC est ICI
Le fichier source en assembleur est ICI
Après décapage et premier passage au papier de verre, c'est presque aussi beau qu'un dôme alu !
Et en position sur le corps pour juger des proportions, ça a l'air correct (la bande alu à la base sert juste à donner une meilleure idée de la hauteur finale avec les deux bagues absentes pour l'instant)