L'hiver sous les latitudes nord est le moment où le pilote FPV a le temps de faire une pause dans les courses et les pannes constantes, de prendre un fer à souder et de fabriquer quelque chose d'utile pour son passe-temps.Puisqu'il fait froid de voler à l'extérieur, nous formerons des compétences de pilotage sur des simulateurs. Pour ce faire, vous devez connecter votre équipement radio à l'ordinateur via un adaptateur spécial, qui convertit le signal PPM de la télécommande en signaux de joystick USB que l'ordinateur comprend. De tels adaptateurs, bien sûr, ne sont pas rares et coûtent un sou dans les magasins chinois. Cependant, la livraison de la commande doit attendre longtemps et fonctionnera-t-elle comme prévu? Par exemple, j'ai celui-ci:Pour une raison que je n'ai pas encore comprise, il refuse catégoriquement de se calibrer correctement dans le simulateur FPV Freerider , bien que cela fonctionne très bien dans Phoenix RC et Aerofly RC 7. FPV Freerider transmet assez bien la physique de l'acro-vol sur un hélicoptère de course, et en plus a un mode démo gratuit.Résolu - nous fabriquons l'adaptateur nous-mêmes!Un peu d'équipement:
La plupart des équipements RC plus ou moins sérieux ont un connecteur où ils émettent des signaux de contrôle au format PPM (Pulse Position Modulation). Un signal PPM est une séquence d'impulsions courtes, dont l'intervalle détermine la valeur de commande de chacun des canaux de l'équipement radio.L'essence de PPM transmet parfaitement l'image:Pour décoder PPM, vous devez mesurer avec précision les intervalles de temps entre les impulsions consécutives (peu importe les fronts: avant ou arrière, car la durée des impulsions elles-mêmes est toujours la même).Réalisation:
S'inspirant d'un article d' AlexeyStn sur la création d'un adaptateur PPM vers USB basé sur STM32F3Discovery, mais n'ayant que Arduino Pro Micro (Leonardo) avec prise en charge matérielle USB, commençons un chemin simple vers notre adaptateur.Vous pouvez trouver plusieurs projets similaires sur le github, et certains ne nécessitent même pas d'USB matériel dans le contrôleur. Cependant, la plupart d'entre eux doivent être sérieusement finis avec un fichier pour que quelque chose fonctionne. Le projet approprié était rc-leonardo-joy, qui a commencé à fonctionner presque immédiatement après avoir rempli le croquis, mais il a immédiatement montré quelques défauts: toutes les lectures du joystick n'étaient pas très stables - le marqueur du curseur dans le panneau de commande dansait tout le temps autour du point de consigne. Je ne peux pas dire que cela a considérablement affecté la tenue de route dans le simulateur, mais nous voulons nous entraîner sur un bon équipement!Eh bien, nous montons dans le code et voyons: le calcul de la largeur d'impulsion PPM se fait en traitant une interruption externe et en mesurant les intervalles entre les appels à la fonction micros () :void rxInt(void) {
uint16_t now,diff;
static uint16_t last = 0;
static uint8_t chan = 0;
now = micros();
sei();
diff = now - last;
last = now;
if(diff>3000) chan = 0;
else {
if(900<diff && diff<2200 && chan<RC_CHANS ) {
rcValue[chan] = adjust(diff,chan);
}
chan++;
}
}
Lisez à propos de la fonction micros () dans la documentation Arduino:Renvoie le nombre de microsecondes depuis que la carte Arduino a commencé à exécuter le programme actuel. Ce nombre va déborder (revenir à zéro), après environ 70 minutes. Sur les cartes Arduino 16 MHz (par exemple Duemilanove et Nano), cette fonction a une résolution de quatre microsecondes (c'est-à-dire que la valeur renvoyée est toujours un multiple de quatre). Sur les cartes Arduino 8 MHz (par exemple le LilyPad), cette fonction a une résolution de huit microsecondes.
Autrement dit, non seulement la fonction n'est pas très précise et renvoie toujours des valeurs qui sont des multiples de 4 μs, mais elle déborde également après 70 minutes, ce qui nous donne une valeur courbe de l'intervalle mesuré. Pas bon. Il serait préférable d'utiliser une minuterie et ses interruptions pour capturer les signaux externes.Nous regardons plus loin: la plupart des données sur la position du joystick sont artificiellement limitées à un octet (0-255):
byte stickValue(int rcVal) {
return map( constrain(rcVal - 1000, 0, 1000), 0, 1000, 0, 255);
}
Hmm, je voudrais être plus précis. Mais pour cela, vous devrez réécrire le descripteur HID et corriger tous les types de données associés.Aussitôt dit, aussitôt fait!Nous bifurquons le référentiel, réécrivons le code pour utiliser un timer pour compter les intervalles PPM:void initTimer(void) {
TCCR1A = 0;
TCCR1B = (0<<ICNC1) | (1<<ICES1) | (1<<CS11);
TCCR1C = 0;
TIFR1 = (1<<ICF1);
TIMSK1 = (1<<ICIE1);
}
...
ISR(TIMER1_CAPT_vect) {
union twoBytes {
uint16_t word;
uint8_t byte[2];
} timeValue;
uint16_t now, diff;
static uint16_t last = 0;
static uint8_t chan = 0;
timeValue.byte[0] = ICR1L;
timeValue.byte[1] = ICR1H;
now = timeValue.word;
diff = now - last;
last = now;
if(diff > (NEWFRAME_PULSE_WIDTH * TIMER_COUNT_DIVIDER)) {
chan = 0;
}
else {
if(diff > (MIN_PULSE_WIDTH * TIMER_COUNT_DIVIDER - THRESHOLD)
&& diff < (MAX_PULSE_WIDTH * TIMER_COUNT_DIVIDER + THRESHOLD)
&& chan < RC_CHANNELS_COUNT)
{
rcValue[chan] = adjust(diff, chan);
}
chan++;
}
}
Augmentez les intervalles de déviation du stick à 0-1000 dans le descripteur HID:
0x05, 0x01,
0x09, 0x04,
0xa1, 0x01,
0x85, JOYSTICK_REPORT_ID,
...
0xA1, 0x00,
0x09, 0x30,
0x09, 0x31,
0x09, 0x33,
0x09, 0x34,
0x15, 0x00,
0x26, 0xE8, 0x03,
0x75, 0x10,
0x95, 0x04,
0x81, 0x02,
0xc0,
0xc0
En cours de route, changez uint8_t en uint16_t partout où les valeurs d'écart de manche sont transmises.Nous supprimons le code supplémentaire, ajoutons une douzaine de #define et nous obtenons un bon croquis, affiné pour fonctionner comme un adaptateur PPM-USB.Le résultat est disponible sur github: github.com/voroshkov/Leonardo-USB-RC-AdapterParamètres d'esquisse:
Il est logique de supprimer la définition de futaba si vous avez un autre matériel:#define FUTABA
et, si nécessaire, ajustez les valeurs des microsecondes dans les paramètres si votre équipement produit d'autres temporisations:#define STICK_HALFWAY 500
#define STICK_CENTER 1500
#define THRESHOLD 100
Compilation:
Pour compiler et télécharger l'esquisse, vous devez remplacer les bibliothèques USB dans l'environnement Arduino lui-même, après avoir effectué des sauvegardes.Pour ce faire, allez dans les entrailles d'Arduino le long du chemin ... \ Arduino \ hardware \ arduino \ cores \ arduino \ , sauvegardez usbapi.h et hid.cpp , puis écrasez -les avec les mêmes fichiers du dossier ArduinoLibs du référentiel. Ensuite, ouvrez le croquis, connectez l'Arduino Leonardo et remplissez-le.Connexion:
Tout est très simple: d'une part, nous insérons l'USB, d'autre part, nous soudons deux fils (sur la broche numérique 4 et la masse) et les collons dans le PPM et la masse de l'émetteur, respectivement. Cela se révèle en quelque sorte comme ceci:Dans Windows 7, l'appareil est reconnu comme un composite (clavier, souris, joystick) avec le nom Arduino Leonardo.Une mention spéciale mérite le connecteur dans l'équipement. Quelque part, c'est une prise audio ordinaire, et quelque part (comme dans mon Futaba 7C) est quelque chose de plus délicat:Pour l'assemblage de divers connecteurs "mâles", j'utilise depuis longtemps avec succès de la colle chaude. Pour ce faire, on met du papier ou du polyéthylène sur la «mère», on perce ce substrat avec des épingles pour qu'il colle dans le connecteur de l'autre côté, puis on verse progressivement de la colle entre les épingles, en le façonnant simultanément avec les doigts mouillés. Les fils, bien sûr, doivent être soudés à l'avance afin de ne pas faire fondre l'adhésif durci lors du soudage. Il s'avère pas toujours esthétique, mais très fonctionnel:(Ici, dans le connecteur, 4 broches sont nécessaires pour un positionnement sans ambiguïté, il n'y a que deux travailleurs.)C'est tout. Nous téléchargeons le simulateur, connectons l'équipement et entraînons les compétences de pilotage tout en buvant du thé chaud devant la cheminée les sombres soirées d'hiver.PS
Et s'il n'y a pas d'Arduino Leonardo, mais qu'il y a une telle carte de développement minimum sur le STM32F103C8T6?
Ne vous inquiétez pas, tout du long. Pour vous, ainsi que pour mon propre développement, j'ai porté le projet déjà mentionné d' Alexey Stankevich.Les sources et les fichiers binaires compilés pour le téléchargement sur ce contrôleur peuvent être trouvés ici: github.com/voroshkov/STM32-RC-USB-Adapter .Je répondrai avec plaisir à toutes les questions dans les commentaires.Bon vol!