Ein einfaches RC Aero Boot bauen

Manchmal sehe ich im Internet Fragen von Anfängern, die einen Quadrocopter von Grund auf neu bauen und Firmware dafür schreiben möchten. Ich selbst bin so und um das Erstellen von RC-Modellen zu üben, habe ich beschlossen, mit etwas Einfacherem zu beginnen.



In dem Artikel im Detail für die Kleinsten beschrieb er den Algorithmus des Bootes, das Bedienfeld und die Auswahl der Komponenten.

?


  1. ;
  2. ;
  3. ;
  4. , -.

Das Fliegen von Fahrzeugen ist großartig, aber schwierig. In der Luft können Sie die Schrauben nicht einfach ausschalten, wenn etwas schief geht. Ja, und ein spezifischer Schub ist sehr anständig, selbst für Flugzeuge, ganz zu schweigen von Multikoptern.

Plattform für diese Art



( hier gibt es eine ausführliche Beschreibung).

In den meisten Fällen können sie sich nur auf einer künstlichen glatten Oberfläche bewegen, und ihre Kontrolle ist sehr unterschiedlich.

Aber auf dem Wasser können wir überall segeln, was uns in Zukunft die Möglichkeit geben kann, einen Autopiloten mit GPS zu bauen. Das klassische Design mit einem Propeller wird für mich durch die Wellenausgangseinheit aus dem Gehäuse kompliziert - ich kann mir nicht vorstellen, wie ich es abdichten soll.

Weitere Vorteile eines Luftantriebssystems:
  1. Es kann auf verschiedene Plattformen gestellt werden: ein Boot, einen Schlitten, ein Stück Schaum ...
  2. Es fängt sich nicht am Boden oder an Algen.

Das Gerät muss sich drehen können. Es gibt 3 Möglichkeiten:
  1. Eine Schraube + Lenkrad für Kurven ;
  2. Eine Schraube + das Drehsystem ;
  3. Zwei feste Schrauben. Das Drehen durch Ändern ihres Verlangens ist der einfachste Weg. Er hat es benutzt.


Fernbedienung


Funktionsprinzip


1 Joystick + mehrere Schalter. Die Aufgabe der Fernbedienung besteht darin, Daten über die Position des Joystick-Griffs zu senden und mehrmals pro Sekunde zu wechseln.

Was tun?


Zunächst benötigen Sie einen Funksender. Die billigste Option ist NRF24L01 + und kostet 0,85 USD .

Zweitens benötigen Sie einen Joystick. Noch 1 Dollar .

Mehrere Schalter - 0,12 $ .

Nun, all dies ist für 0,13 US-Dollar auf einem Stück Leiterplatte fixiert .

Bereits $ 2.1 gezählt, aber noch MK und Essen brauchen. Hier ist nicht alles so klar.

Mit Blick auf die Zukunft werde ich sagen, dass ATmega8 oder STM8S103F3P6 völlig ausreichend sind, aber da ich dieses Projekt lange Zeit gestartet habe und wenig Erfahrung gesammelt habe, habe ich es in das Arduino Pro Mini-Bedienfeld und in das Arduino Nano-Boot (ATmega32P überall) geschlagen.

In der Fernbedienung noch benötigt:
  1. Stromrichter 0,9 - 5 V -> 5 V für die Stromversorgung von Arduino für 0,35 USD (USB-Anschluss kann zusammen mit einem Teil der Platine aus Gründen der Kompaktheit abgebrochen werden);
  2. Der 3,3-V-Stabilisator AMS1117-3.3 für die Stromversorgung des Funkmoduls kostet 0,03 USD pro Einheit .
  3. Batteriefach für Ein-Finger-Batterie für 0,15 USD ;

Insgesamt plus 0,53 USD. Abgesehen von der Steuerung, einem Paar Kondensatoren und Drähten betragen die Kosten für die Komponenten der Konsole 2,63 USD.

RC-Modellfüllung


Komponenten


Alles kommt von den Motoren. Welche Motoren Sie kaufen, muss die Elektronik mit einer solchen Leistung installiert werden, und die Basis (Schiff, Schlitten) wird für die entsprechende Tragfähigkeit benötigt. Und ideologisch wird alles andere nur benötigt, um die Schrauben mit der richtigen Geschwindigkeit zu drehen.

Ich kaufte diese Motoren mit Propellern


für 2,88 Dollar pro Paar .

Ich nahm den L293D als Motorfahrer - weitere 0,35 Dollar .
Und hier ein Haufen Probleme
L293D . , .

Essen. Wir benötigen bis zu drei Versorgungsspannungen:
  1. 5 V für die gesamte Elektronik außer dem Funkmodul;
  2. 3,3 V für das Funkmodul;
  3. für Motoren so viel wie sie brauchen (meine 4,2 V).

1 und 2 erhalten wir das gleiche wie im Bedienfeld, und für Motoren setzen wir MT3608 für 0,86 $ .

Nun zum lustigen Teil: dem Gyroskop. Das MPU-6050-Modul kostet 1,53 US-Dollar . Es bestand der Wunsch, auch den Beschleunigungsmesser zu verwenden, damit sich das Schiff an Ort und Stelle entfaltet, wenn sich der Joystick zur Seite bewegt. Aber am Ende gab er diese Idee auf: eine leichte Neigung, und das System beginnt zu glauben, dass es vorwärts oder rückwärts beschleunigt. Es stellte sich heraus, dass es einfacher war, das Schiff in Position zu bringen, indem die Vorwärts- / Rückwärtsbewegung mit dem Joystick ausgeglichen wurde.

Fügen Sie dazu 0,4 USD für das Batteriefach für 2 AA-Zellen hinzu und erhalten Sie 6,4 USD Komponenten ohne Controller und Kabel.

Das Programm


Und wieder gehen wir von den Motoren. Jeder der beiden vom L293D angetriebenen Motoren kann graben oder nicht :
  1. Vorwärts drehen;
  2. Dreh dich zurück;
  3. Nicht verdrehen.

Schreiben Sie, um das Lesen des Codes zu erleichtern
6 Funktionen
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;
}


Jetzt wollen wir die Drehzahl der Schrauben steuern. Natürlich werden wir dies mit PWM tun. Ich weiß nicht, ob eine solche PWM in Hardware möglich ist ... Ich habe sie programmgesteuert unterbrochen. Deklarieren Sie ein Paar globaler Variablen
int8_t motLeft = 0, motRight = 0; // -127..+127

Lassen Sie die Werte dieser Variablen <0 bedeuten, dass Sie rückwärts drehen müssen, die Werte> 0 - vorwärts, und wenn sie 0 sind, müssen Sie nicht drehen.
Wir werden Timer-Interrupt-Handler schreiben
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();
}


Um nun die Drehzahl des Propellers zu ändern, müssen wir zwei Aktionen ausführen:
  1. Schreiben Sie einen positiven, negativen oder Nullwert in motLeft / motRight (das Modul ist nicht wichtig);
  2. Notieren Sie die "Drehzahl" in OCR2A / OCR2B.

Schreiben wir dazu noch ein paar Funktionen
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 ( ).

Jetzt müssen noch die MK-Pins und der Timer konfiguriert werden
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();
}


Und Sie können die Motoren einfach steuern, indem Sie die Funktionen setMotLeft (int8_t v) und setMotRight (int8_t v) aufrufen.

Aber wir wollen das Boot falsch steuern! Wir wollen Befehle wie "vorwärts / rückwärts" und "rechts / links" geben! Und lassen Sie sie herausfinden, welche Propeller sie dafür drehen muss. Außerdem möchte ich, dass das Boot selbst den Wendeeffekt von Wind, Strömungen und ... krummen Propellern ausgleicht!

Gehen wir jetzt von der anderen Seite. Von der Fernbedienung. Im einfachsten Fall ist der Algorithmus seiner Operation wie folgt:
  1. Denken Sie beim Einschalten an die Ausgangsposition des Joysticks.
  2. Lesen Sie im Zyklus die Position des Joysticks ab, subtrahieren Sie die Nullposition davon und senden Sie Daten an das Boot.

Unser Funkmodul unterstützt Pakete mit bis zu 32 Byte. Um uns nicht an die Verschiebungen zu erinnern, werden wir die Aufzeichnung verwenden
struct ControlStatus{
  int16_t x,y;
}  controlStatus;

Wie folgt
    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()){;};


Auf der Empfängerseite werden wir genau den gleichen Datensatz deklarieren und
wir werden es füllen
  while (Mirf.dataReady()) { 
    uint8_t data[MAX_BUFF];
    Mirf.getData(data);
    memcpy(&controlStatus, data, sizeof(controlStatus));
    setMotRot(-controlStatus.x);
    setMotForward(controlStatus.y); 
  }


In den Funktionen setMotRot und setMotForward
Schreiben Sie die Werte in die globalen Variablen motRot und 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;
}


Und lassen Sie uns zu den interessantesten übergehen. Um zu konvertieren "Biegen Sie mit einer Geschwindigkeit von 5 Grad pro Sekunde nach links ab und bewegen Sie sich ein wenig vorwärts!" zu "linker Motor 10% zurück, rechter 20% vorwärts!".

Es wurde viel darüber geschrieben, was PID-Regler sind. Ich habe nur zwei Komponenten für die Rotation verwendet:
  1. Proportional;
  2. Integral.

Und zum Hin- und Herbewegen benutzte der Regler es nicht.

Nehmen wir ein Beispiel:
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);
}

Der Code wurde vereinfacht, um sich auf wichtige Teile zu konzentrieren. Das Archiv wird die Vollversion haben.

Was machen wir hier?
  1. Wir berechnen die Differenz zwischen der tatsächlichen Rotationsgeschwindigkeit des Bootes (rot) und der gewünschten (motRot * rotMaxSpeed);
  2. Wir berechnen die gewünschten Drehzahlen der Schrauben motRight und motLeft.
  3. Wenn die gewünschten Drehzahlen das maximal mögliche überschreiten, reduzieren wir sie unter Beibehaltung des Verhältnisses zwischen ihnen.
  4. Wir nennen setMotRight / setMotLeft, das uns bereits bekannt ist.

Das ist alles!

Dies ist der gesamte Bootssteuerungsalgorithmus!

Ist es schwierig Ich denke nicht. Im Verlauf des Testens und Tunings traten jedoch eine ganze Reihe von Problemen auf, die zu zahlreichen Abstürzen führen würden, wenn es sich um ein Flugzeug handeln würde.

Die beschriebene Funktion enthält 4 Koeffizienten:
  1. forwardMult - Empfindlichkeit für die Bewegung des Joysticks vorwärts / rückwärts;
  2. rotMaxSpeed ​​- die gewünschte Drehzahl, wenn der Joystick ganz nach rechts / links gekippt wird;
  3. rotMult - Koeffizient der proportionalen Komponente (wie stark beeinflusst die Abweichung der aktuellen Drehzahl von der gewünschten die Drehung);
  4. iDeltaRotMult - Koeffizient der Integralkomponente (wie stark sich die Abweichung des aktuellen Drehwinkels vom gewünschten auf die Drehung auswirkt).

Diese Koeffizienten werden experimentell eingestellt und die Reaktion des Bootes auf den Joystick und die äußeren Entfaltungseinflüsse hängt von ihnen ab.

Statusanzeige


Beim Debuggen / Optimieren wird die Serie „Warum reagiert das Boot auf den Joystick nicht so, wie ich es möchte?“ Verwirrt sein. Einige Punkte können durch Anzeigen von Debugging-Informationen auf einem PC debuggt werden. Es wäre jedoch bequemer zu verstehen, was direkt vor Ort geschieht. Zuerst habe ich zwei Optionen in Betracht gezogen:
  1. Laptop;
  2. LCD Nokia 5110


Die Nachteile beider sind verständlich: Der Laptop ist groß und unbequem mitzunehmen, und auf dem Nokia 5110-Display können Sie nicht gleichzeitig eine große Anzahl von Bootsstatusparametern anzeigen.

Ich habe eine Kreuzung zwischen ihnen gemacht: Nextion Enhanced NX4827K043 - Generisches 4,3-Zoll-HMI-Touch-Display . Dank des Touchscreens können Sie die Bootsparameter unterwegs schnell und bequem anpassen. Dies ist eine Art Computer, bestehend aus:
  1. Mikrocontroller GD32F103R8T6;
  2. SDRAM Winbond W9864G6KH-6 (8 MB);
  3. Winbond W25Q256FVFG Flash-Speicher (32 MB, 100.000 Umschreibzyklen, was sehr gut ist);
  4. FPGA Altera MAX II EPM570T144C5N.

Alles in der Baugruppe sieht folgendermaßen aus (anklickbar): Dieser Computer / dieses Display ist eine Black Box und auf die Interaktion mit einer Person ausgerichtet. Sogar das vorhandene GPIO wird zum Anschließen von Tasten und Anzeigen geschärft. Ihr Expansion Board bestätigt dies. Die Verwendung der eingebauten Steuerung als Fernbedienung für das Boot (zum Lesen des Joysticks, zum Datenaustausch mit dem Funkmodul NRF24L01 +) schlägt daher fehl. Um mit dem Mikrocontroller zu interagieren, gibt es UART und ... das ist alles. Wie und was mit diesem Display gemacht werden kann, ist geschrieben. Es gibt eine Reihe von Videos auf Youtube. Siehe zum Beispiel dies





- dort ist alles deutlich zu sehen. Da dieses Display jedoch teurer ist als alle anderen Komponenten des Bootes und der Konsole zusammen, werde ich meine Eindrücke von der Arbeit damit detaillierter beschreiben. Vielleicht hilft dies jemandem zu verstehen, ob diese Option für ihn geeignet ist oder ob der Nokia 5110 Laptop / Display vorzuziehen ist. Vorteile von Nextion Enhanced NX4827K043:
  1. Sehr einfach zu bedienen. Es gibt einfache Dokumentationen, Beispiele, Videos auf Youtube, ... In ein paar Stunden können Sie es von Grund auf neu herausfinden. Fast alles, was Sie über ihn wissen müssen, befindet sich auf zwei Seiten: Wiki-Seite und Befehlssatz
  2. Sehr schnelle Entwicklung. Ein visueller Editor wie Visual Studio (nur einfacher). Ich warf Komponenten und alles funktioniert.
  3. Hochwertige Komponenten. Der gleiche Flash-Speicher für 100.000 Umschreibungszyklen.
  4. Ein Debugger, der eine Anzeige mit einem PC simulieren und über einen COM-Port mit Ihrem MK kommunizieren kann. Ermöglicht es Ihnen, das Gerät vollständig zu entwickeln, zu debuggen und ein Display zu kaufen, nur wenn alles funktioniert.
    Obwohl es ein Problem mit ihm gibt
    . . , , .
  5. Widerstandssensor Sie können relativ kleine Steuerelemente erstellen und diese mit Ihrem Fingernagel oder einem beliebigen Stift stechen.

Nachteile:
  1. Preis 50 US-Dollar sind immer noch viel für ein 4,3-Zoll-Display.
  2. Es gibt nur wenige vorhandene Komponenten, nur wenige Komponenteneinstellungen. Wie Sie eigene Komponenten erstellen, ist nicht klar. Dies wird teilweise durch die Funktionen zum Zeichnen von Grundelementen (Linien, Rechtecke, Kreise, ...) ausgeglichen.
  3. Die Standard-Messgerätekomponente flackert beim Upgrade.
  4. Nein (zumindest habe ich keine Transparenz gefunden).
  5. Leistungsbedarf: 4,75-7 V und durchschnittlicher Strom 250 mA. Wenn die Spannung abfällt, beginnt die Anzeige zu blinken.
  6. Nur UART. Könnte mit ihm über SPI und I²C kommunizieren.
  7. GPIO-Ausgang nur für eine Schleife (kein Kamm 2,54 mm), kein ADC.


Im Allgemeinen vermittelt das Display den Eindruck eines sehr hochwertigen Produkts, mit dem leicht und angenehm zu arbeiten ist.

Das Display kann zwei Aufgaben gleichzeitig ausführen:
  1. Statusanzeige. Ich interessiere mich hauptsächlich für:
    • "Drehzahlen" der Schrauben;
    • Der Wert der Variablen iDeltaRot gibt an, um wie viel sich der gewünschte Drehwinkel vom gewünschten unterscheidet.
    • Bootsdrehzahl;
    • Drehwinkel des Bootes;
    • Häufigkeit des Empfangs von Paketen von der Fernbedienung;
    • Die Häufigkeit der Aufrufe der motTick-Funktion.

  2. Einstellen von Parametern, nämlich der oben beschriebenen, forwardMult, rotMaxSpeed, rotMult, iDeltaRotMult.


2 Seiten erstellt (zur Qualitätsbewertung anklickbar):
  1. Indikationen:


  2. Parametereinstellungen: Erste 4 Spalten von links nach rechts: forwardMult, rotMult, iDeltaRotMult, rotMaxSpeed.






Video Testboot auf dem Boden:



Die Reaktion des Bootes auf einen externen Entfaltungseffekt bei verschiedenen iDeltaRotMult (Integralkoeffizienten):



Demonstration des Einflusses von Parametern auf Wasser:



Video im offenen Wasser konnte nicht aufgenommen werden. Sie können davon ausgehen, dass sein Handling gut ist und die Höchstgeschwindigkeit nicht sehr hoch ist.

Eigenschaften


  • Stab 9 g;
  • Gewicht 115 g, davon wiegen Batterien 52 g;
  • Die maximale Beschleunigung beträgt 0,77 m / s ^ 2. Für Menschen mit 5 km / h würde das Boot in 1,8 s beschleunigen, wenn es keinen Wasserwiderstand gäbe.
  • Die Kosten für Komponenten betragen ca. 15 USD, wenn Sie den Arduino Nano sowohl in der Fernbedienung als auch im Boot verwenden (ohne Display und Batterien).


Fazit


Für diejenigen, die etwas Funkgesteuertes sammeln möchten, empfehle ich, mit einem Schiff mit zwei festen Propellern zu beginnen. Meiner Meinung nach ist dies das Einfachste, was in diesem Bereich getan werden kann.

Archiv mit Projekten

Und zum Schluss, damit es etwas gibt, nach dem man streben kann, hier ein Video eines erstaunlichen Geräts:

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


All Articles