Faire un simple bateau aérodynamique RC

Parfois, sur Internet, je vois des questions de débutants qui veulent construire un quadricoptère à partir de zéro et écrire un firmware pour cela. Je le suis moi-même et pour m'exercer à créer des modèles RC, j'ai décidé de commencer avec quelque chose de plus simple.



Dans l'article en détail pour le plus petit, il a décrit l'algorithme du bateau, le panneau de commande et le choix des composants.

Pourquoi bateau aérien?


  1. Simple;
  2. Bon marché;
  3. ;
  4. , -.

Voler des véhicules est génial, mais difficile. Vous ne pouvez pas simplement désactiver les vis en l'air en cas de problème. Oui, et une poussée spécifique est nécessaire très décente, même pour les avions, sans parler des multicoptères.

Plateformes comme celle-ci



( il y a une description plus détaillée ici).

ils ne peuvent se déplacer que dans la plupart des cas sur une surface lisse artificielle et leur contrôle est très différent.

Mais sur l'eau, nous pouvons naviguer n'importe où, ce qui nous donnera à l'avenir la possibilité de faire un pilote automatique à l'aide du GPS. La conception classique avec une hélice est compliquée pour moi par l'unité de sortie d'arbre du boîtier - je ne peux pas imaginer comment l'étancher.

Plus d'avantages d'un système de propulsion pneumatique:
  1. Il peut être posé sur différentes plateformes: un bateau, un traîneau, un morceau de polystyrène ...
  2. Il n'attrape pas le fond ni les algues.

Il est nécessaire que l'appareil puisse tourner. Il y a 3 options:
  1. Une vis + volant pour les virages ;
  2. Une vis + son système de tournage ;
  3. Deux vis fixes. Tourner en changeant leurs envies est le moyen le plus simple. Il l'a utilisé.


Télécommande


Principe de fonctionnement


1 joystick + plusieurs interrupteurs. La télécommande a pour tâche d'envoyer des données sur la position de la poignée du joystick et des commutateurs plusieurs fois par seconde.

Que faire


Tout d'abord, vous avez besoin d'un émetteur radio. L'option la moins chère est NRF24L01 +, coûte 0,85 $ .

Deuxièmement, vous avez besoin d'un joystick. Un autre 1 $ .

Plusieurs commutateurs - 0,12 $ .

Eh bien, tout cela est fixé sur un morceau de PCB pour 0,13 $ .

Déjà compté 2,1 $, mais j'ai encore besoin de MK et de nourriture. Tout n'est pas si clair ici.

Pour l'avenir, je dirai que ATmega8 ou STM8S103F3P6 est assez suffisant, mais depuis que j'ai commencé ce projet depuis longtemps et qu'il y avait peu d'expérience, je l'ai claqué dans le panneau de contrôle Arduino Pro Mini et dans le bateau Arduino Nano (ATmega32P partout).

Dans la télécommande encore nécessaire:
  1. Convertisseur de puissance 0,9 - 5 V -> 5 V pour alimenter Arduino pour 0,35 $ (le connecteur USB, avec un morceau de la carte, peut être rompu pour plus de compacité);
  2. Stabilisateur 3,3 V AMS1117-3,3 pour alimenter le module radio, ils coûtent 0,03 $ par unité ;
  3. Compartiment à piles pour une pile à un doigt pour 0,15 $ ;

Total plus 0,53 $. Mis à part le contrôleur, une paire de condensateurs et de fils, le coût des composants de la console est de 2,63 $.

Remplissage du modèle RC


Composants


Tout vient des moteurs. Quels moteurs vous achetez, l'électronique devra être installée avec une telle puissance, et la base (navire, traîneau) sera nécessaire pour la capacité de charge correspondante. Et idéologiquement, tout le reste n'est nécessaire que pour faire tourner les vis à la bonne vitesse.

J'ai acheté ces moteurs avec des hélices


pour 2,88 $ la paire .

Il a pris le L293D comme conducteur de moteur - 0,35 $ de plus .
Et ici un tas de problèmes
L293D . , .

La nourriture. Nous aurons besoin de jusqu'à trois tensions d'alimentation:
  1. 5 V pour tous les appareils électroniques sauf le module radio;
  2. 3,3 V pour le module radio;
  3. pour les moteurs autant qu'ils en ont besoin (le mien 4,2 V).

1 et 2, nous obtenons les mêmes que dans le panneau de commande, et pour les moteurs, nous mettons MT3608 pour 0,86 $ .

Maintenant, pour la partie amusante: le gyroscope. Le module MPU-6050 coûte 1,53 $ . Il y avait un désir d'utiliser également l'accéléromètre, de sorte que lorsque le joystick se déplace sur le côté, le navire se déplie en place. Mais au final, il a abandonné cette idée: une légère pente de tangage, et le système commence à penser qu'il accélère vers l'avant ou vers l'arrière. Il s'est avéré plus facile de mettre le navire en place simplement en compensant le mouvement avant / arrière avec le joystick.

Ajoutez à cela 0,4 $ pour le compartiment de la batterie pour 2 piles AA et obtenez 6,4 $ de composants sans contrôleur ni fils.

Le programme


Et encore une fois, allons des moteurs. Chacun des deux moteurs entraînés par le L293D peut ou non creuser :
  1. Tournez en avant;
  2. Retournez;
  3. Ne tordez pas.

Pour faciliter la lecture du code, écrivez
6 fonctions
inline void motLeftStop(){
  PORTD &= ~(1 << MOT_LEFT_PLUS);
  PORTD &= ~(1 << MOT_LEFT_MINUS);
}

inline void motLeftForward(){    
  PORTD |= 1 << MOT_LEFT_PLUS;
  PORTD &= ~(1 << MOT_LEFT_MINUS);
}

inline void motLeftBackward(){
  PORTD &= ~(1 << MOT_LEFT_PLUS);
  PORTD |= 1 << MOT_LEFT_MINUS;
}

inline void motRightStop(){
  PORTD &= ~(1 << MOT_RIGHT_PLUS);
  PORTD &= ~(1 << MOT_RIGHT_MINUS);
}

inline void motRightForward(){
  PORTD |= 1 << MOT_RIGHT_PLUS;
  PORTD &= ~(1 << MOT_RIGHT_MINUS);
}

inline void motRightBackward(){
  PORTD &= ~(1 << MOT_RIGHT_PLUS);
  PORTD |= 1 << MOT_RIGHT_MINUS;
}


Maintenant, nous voulons contrôler la vitesse de rotation des vis. Bien sûr, nous le ferons en utilisant PWM. Je ne sais pas si un tel PWM peut être fait dans le matériel ... Je l'ai fait interrompre par programme. Déclarez une paire de variables globales
int8_t motLeft = 0, motRight = 0; // -127..+127

Laissez les valeurs de ces variables <0 signifier que vous devez tourner en arrière, les valeurs> 0 - en avant, et si elles sont 0, alors vous n'avez pas besoin de tordre.
Nous allons écrire des gestionnaires d'interruption de minuterie
ISR(TIMER2_OVF_vect)
{
  if(motLeft > 0)
    motLeftForward();
  else if(motLeft < 0)
    motLeftBackward();
  if(motRight > 0)
    motRightForward();
  else if(motRight < 0)
    motRightBackward();
}

ISR(TIMER2_COMPA_vect)
{
  motLeftStop();
}

ISR(TIMER2_COMPB_vect)
{
  motRightStop();
}


Maintenant, pour changer la vitesse de rotation de l'hélice, nous devons faire 2 actions:
  1. Écrivez une valeur positive, négative ou nulle dans motLeft / motRight (le module n'est pas important);
  2. Enregistrez la "vitesse de rotation" dans OCR2A / OCR2B.

Écrivons quelques fonctions supplémentaires pour cela
void setMotLeft(int8_t v){ // -127..+127
  if(abs(v) < 5) v = 0;
  motLeft = v;  
  OCR2A = abs(v) * 2;
}

void setMotRight(int8_t v){ // -127..+127
  if(abs(v) < 5) v = 0;
  motRight = v;
  OCR2B = abs(v) * 2;
}


if(abs(v) < 5) v = 0;

OCR2x 5 ( ).

Reste maintenant à configurer les broches MK et la minuterie
void motInit(){
  DDRD |= (1 << MOT_LEFT_PLUS) | (1 << MOT_LEFT_MINUS) | (1 << MOT_RIGHT_PLUS) | (1 << MOT_RIGHT_MINUS);
  //TCCR2B |= (1 << CS22)|(1 << CS21)|(1 << CS20); // set up timer with prescaler = 1024.   16 
  //TCCR2B |= (1 << CS22)|(0 << CS21)|(0 << CS20); // set up timer with prescaler = 64.   1 
  TCCR2B |= (0 << CS22)|(1 << CS21)|(0 << CS20); // set up timer with prescaler = 8.  128 
  //TCCR2B |= (0 << CS22)|(0 << CS21)|(1 << CS20); // set up timer with prescaler = 1.  16 
  TIMSK2 |= (1 << TOIE2)|(1 << OCIE2A)|(1 << OCIE2B); // enable overflow interrupt
  TCCR2A &= ~(3); // set WGM20 = 0, WGM21 = 0
  TCCR2B &= ~(1 << 3); // set WGM22 = 0
  setMotLeft(0);
  setMotRight(0);
  sei();
}


Et vous pouvez contrôler les moteurs simplement en appelant les fonctions setMotLeft (int8_t v) et setMotRight (int8_t v).

Mais nous voulons mal contrôler le bateau! Nous voulons donner des commandes comme "avant / arrière" et "droite / gauche"! Et laissez-la comprendre quelles hélices elle doit tourner pour cela. De plus, je veux que le bateau lui-même compense l'effet de rotation du vent, des courants et ... des hélices tordues!

Allons maintenant de l’autre côté. De la télécommande. Dans le cas le plus simple, l'algorithme de son fonctionnement est le suivant:
  1. Lors de la mise sous tension, rappelez-vous la position initiale du joystick;
  2. Au cours du cycle, lisez la position du joystick, soustrayez-en la position zéro et envoyez des données au bateau.

Notre module radio prend en charge des paquets jusqu'à 32 octets. Afin de ne pas mémoriser les décalages, nous utiliserons l'enregistrement
struct ControlStatus{
  int16_t x,y;
}  controlStatus;

Comme suit
    uint8_t packet[MAX_BUFF]; 
    memset(packet, 0, MAX_BUFF);    
    controlStatus.x = (int16_t)analogRead(1) - x0;
    controlStatus.y = (int16_t)analogRead(0) - y0;
    memcpy(packet, &controlStatus, sizeof(controlStatus));
    Mirf.send(packet);
    while(Mirf.isSending()){;};


Côté récepteur, nous déclarerons exactement le même record et
nous le remplirons
  while (Mirf.dataReady()) { 
    uint8_t data[MAX_BUFF];
    Mirf.getData(data);
    memcpy(&controlStatus, data, sizeof(controlStatus));
    setMotRot(-controlStatus.x);
    setMotForward(controlStatus.y); 
  }


Dans les fonctions setMotRot et setMotForward
écrire les valeurs dans les variables globales motRot et motForward
void setMotRot(int16_t v){
  if(abs(v)<10) v = 0;
  motRot = (int32_t)v;
}
void setMotForward(int16_t v){
  if(abs(v)<10) v = 0;
  motForward = (int32_t)v;
}


Et passons au plus intéressant. Pour savoir comment convertir "tourner à gauche à une vitesse de 5 degrés par seconde et avancer un peu!" "moteur gauche 10% en arrière, 20% droit en avant!". Beaucoup a été écrit

sur ce que sont les contrôleurs PID . J'ai utilisé seulement deux composants pour la rotation:
  1. Proportionnelle;
  2. Intégrale.

Et pour aller et venir, le régulateur ne l'a pas utilisé.

Prenons un exemple:
int32_t iDeltaRot = 0;
void motTick(){
  int32_t rot = getRotAvg(); //     
  int32_t deltaRot = rot - motRot * rotMaxSpeed / 512;
  iDeltaRot += deltaRot;
  int32_t motRight = (int32_t)motForward * forwardMult - deltaRot * rotMult - iDeltaRot * iDeltaRotMult, 
          motLeft  = (int32_t)motForward * forwardMult + deltaRot * rotMult + iDeltaRot * iDeltaRotMult;  

  int32_t motMax = max(abs(motRight), abs(motLeft));
  if(motMax > 127){
    motRight = (int32_t)motRight * 127 / motMax;
    motLeft  = (int32_t)motLeft  * 127 / motMax;
  }
  
  setMotRight(motRight);
  setMotLeft(motLeft);
}

Le code a été simplifié afin de se concentrer sur les parties importantes; l'archive aura la version complète.

Que faisons-nous ici?
  1. Nous calculons la différence entre la vitesse réelle de rotation du bateau (pourriture) et celle souhaitée (motRot * rotMaxSpeed);
  2. Nous calculons les vitesses de rotation souhaitées des vis motRight et motLeft;
  3. Si les vitesses de rotation souhaitées dépassent le maximum possible, on les réduit tout en conservant le rapport entre elles;
  4. Nous appelons setMotRight / setMotLeft que nous connaissons déjà.

C’est tout!

Ceci est l'algorithme de contrôle de bateau entier!

Est-ce difficile? Je pense que non. Mais, néanmoins, au cours des tests et des réglages, tout un tas de problèmes ont surgi qui entraîneraient de nombreux accidents s'il s'agissait d'un avion.

Il y a 4 coefficients dans la fonction décrite:
  1. forwardMult - sensibilité au mouvement du joystick vers l'avant / vers l'arrière;
  2. rotMaxSpeed ​​- la vitesse de rotation souhaitée lors de l'inclinaison complète du joystick vers la droite / gauche;
  3. rotMult - coefficient de la composante proportionnelle (dans quelle mesure l'écart de la vitesse de rotation actuelle par rapport à la vitesse souhaitée affecte la rotation);
  4. iDeltaRotMult - coefficient de la composante intégrale (dans quelle mesure l'écart de l'angle de rotation actuel par rapport à l'angle souhaité affecte la rotation).

Ces coefficients sont réglés expérimentalement, et la réaction du bateau au joystick et aux influences de déploiement externes en dépendra.

Indication d'état


Lors du débogage / réglage, il y aura de la confusion dans la série "pourquoi le bateau réagit-il au joystick pas comme je le veux?". Certains points peuvent être débogués en affichant des informations de débogage sur un PC, mais il serait plus pratique de comprendre ce qui se passe sur place. Au début, j'ai envisagé 2 options:
  1. Ordinateur portable;
  2. LCD Nokia 5110


Les inconvénients des deux sont compréhensibles: l'ordinateur portable est grand et inconfortable à transporter avec vous, et l'écran du Nokia 5110 ne vous permettra pas d'afficher simultanément un grand nombre de paramètres d'état du bateau.

J'ai pris un croisement entre eux: Nextion Enhanced NX4827K043 - Écran tactile HMI générique de 4,3 pouces . Grâce à l'écran tactile, vous pouvez ajuster rapidement et facilement les paramètres du bateau lors de vos déplacements. Il s'agit d'une sorte d'ordinateur composé de:
  1. Microcontrôleur GD32F103R8T6;
  2. SDRAM Winbond W9864G6KH-6 (8 Mo);
  3. Mémoire flash Winbond W25Q256FVFG (32 Mo, 100 000 cycles de réécriture, ce qui est très bon);
  4. FPGA Altera MAX II EPM570T144C5N.

Tout dans l'assemblage ressemble à ceci (cliquable): Cet ordinateur / écran est une boîte noire et est conçu pour interagir avec une personne. Même le GPIO existant est affiné pour connecter les boutons et les indicateurs. Leur carte d'extension le confirme. Ainsi, l'utilisation du contrôleur intégré comme télécommande pour le bateau (pour lire le joystick, pour échanger des données avec le module radio NRF24L01 +) échouera. Pour interagir avec le microcontrôleur, il y a UART et ... c'est tout. À propos de comment et de ce que vous pouvez faire avec cet affichage, vous pouvez le faire, il est écrit un tas de + il y a des vidéos sur Youtube. Voir, par exemple, ce





- tout y est clairement montré. Mais comme cet affichage est plus cher que tous les autres composants du bateau et de la console combinés, je décrirai plus en détail mes impressions de travailler avec lui. Cela aidera peut-être quelqu'un à comprendre si cette option lui convient ou si l'ordinateur portable / écran Nokia 5110 sera préférable. Avantages du Nextion Enhanced NX4827K043:
  1. Très simple d'utilisation. Il y a une documentation simple, des exemples, des vidéos sur Youtube, ... En quelques heures, vous pouvez le comprendre à partir de zéro. Presque tout ce que vous devez savoir sur lui se trouve sur deux pages: page wiki et jeu d'instructions
  2. Développement très rapide. Un éditeur visuel comme Visual Studio (seulement plus facile). J'ai jeté des composants et tout fonctionne.
  3. Composants de haute qualité. La même mémoire flash pour 100 000 cycles de réécriture.
  4. Un débogueur qui peut simuler un affichage à l'aide d'un PC et communiquer avec votre MK via un port COM. Vous permet de développer complètement l'appareil, de déboguer et d'acheter un écran, uniquement si tout fonctionne.
    Bien qu'il y ait un problème avec lui
    . . , , .
  5. Capteur résistif Vous pouvez créer des commandes assez petites et les pousser avec votre ongle ou n'importe quel stylet.

Inconvénients:
  1. Prix 50 $, c'est encore beaucoup pour un écran de 4,3 pouces.
  2. Il y a peu de composants existants, peu de paramètres de composants, comment créer le vôtre n'est pas clair. Ceci est partiellement compensé par les fonctions de dessin des primitives (lignes, rectangles, cercles, ...).
  3. Le composant Gauge standard scintille lors de la mise à niveau.
  4. Non (du moins je n'ai pas trouvé) de transparence.
  5. Exigences d'alimentation: 4.75-7 V et courant moyen 250 mA. Lorsque la tension baisse, l'affichage commence à clignoter.
  6. UART uniquement. Pourrait communiquer avec lui sur SPI et I²C.
  7. Sortie GPIO uniquement pour une boucle (pas de peigne 2,54 mm), pas d'ADC.


En général, l'affichage donne l'impression d'un produit de très haute qualité, facile et agréable à travailler.

L'écran peut effectuer deux tâches à la fois:
  1. Indication d'état. Je suis principalement intéressé par:
    • "Vitesses de rotation" des vis;
    • La valeur de la variable iDeltaRot est la différence entre l'angle de braquage souhaité et l'angle souhaité;
    • Vitesse de rotation du bateau;
    • Angle de rotation du bateau;
    • Fréquence de réception des paquets de la télécommande;
    • La fréquence des appels à la fonction motTick.

  2. Définition des paramètres, à savoir ceux décrits ci-dessus forwardMult, rotMaxSpeed, rotMult, iDeltaRotMult.


Création de 2 pages (cliquables pour l'évaluation de la qualité):
  1. Indications:


  2. Réglages des paramètres: 4 premières colonnes de gauche à droite: forwardMult, rotMult, iDeltaRotMult, rotMaxSpeed.






Bateau d'essai vidéo au sol:



La réaction du bateau à un effet de dépliage externe à divers iDeltaRotMult (coefficients intégraux):



Démonstration de l'influence des paramètres sur l'eau:



La vidéo en eau libre n'a pas pu être capturée. Vous pouvez croire que sa tenue de route est bonne et que la vitesse maximale n'est pas très élevée.

CARACTÉRISTIQUES


  • Baguette 9 g;
  • Poids 115 g, dont les batteries pèsent 52 g;
  • L'accélération maximale est de 0,77 m / s ^ 2. Pour l'homme à 5 km / h, s'il n'y avait pas de résistance à l'eau, le bateau accélérerait en 1,8 s;
  • Le coût des composants est d'environ 15 $ si vous utilisez l'Arduino Nano à la fois dans la télécommande et dans le bateau (sans écran ni piles).


Conclusion


Pour ceux qui souhaitent récupérer quelque chose de radiocommandé, je recommande de commencer par un navire avec deux hélices fixes. À mon avis, c'est la chose la plus simple qui puisse être faite dans ce domaine.

Archiver avec des projets

Et enfin, pour qu'il y ait quelque chose à rechercher, voici une vidéo d'un appareil incroyable:

Source: https://habr.com/ru/post/fr390429/


All Articles