Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

DIY Arduino RC-Empfänger für RC-Modelle und Arduino-Projekte

In diesem Tutorial lernen wir, wie man einen Arduino-basierten RC-Empfänger herstellt. Seit ich meinen DIY-Arduino-RC-Sender in einem meiner vorherigen Videos gebaut habe, habe ich viele Anfragen von euch bekommen, einen dedizierten Empfänger dafür zu bauen, also hier ist er.

Sie können sich das folgende Video ansehen oder das schriftliche Tutorial unten lesen.

Jetzt können diese beiden Geräte problemlos miteinander kommunizieren und wir können sie verwenden, um viele Dinge drahtlos zu steuern. Ich werde erklären, wie alles funktioniert, durch einige Beispiele. Im ersten Beispiel verwenden wir diesen Arduino RC-Empfänger, um ein einfaches Auto zu steuern, das aus zwei Gleichstrommotoren besteht. Im zweiten Beispiel zeige ich Ihnen, wie Sie bürstenlose Motoren und Servos steuern, die in vielen kommerziellen RC-Flugzeugen, Booten, Autos usw. übliche Komponenten sind. Wenn wir wissen, wie man sie steuert, können wir viele RC-Modelle mit unserem eigenen, maßgeschneiderten Arduino-Sender leicht modifizieren und steuern.

Als drittes Beispiel zeige ich Ihnen, wie ich dieses Arduino-basierte RC-System modifiziert und verwendet habe, um ein kommerzielles RC-Auto zu steuern.

Schaltplan des Arduino RC-Empfängers

Werfen wir zunächst einen Blick auf den Schaltplan dieses Systems. Die Funkkommunikation basiert auf den Transceiver-Modulen NRF24L01.

Der Sender sendet ständig Daten von seinen Controllern, den Joysticks, den Knöpfen, den Potentiometern und den Kippschaltern, und wir empfangen diese Daten mit dem Empfänger. Weitere Einzelheiten zur Funktionsweise dieses Arduino-Senders finden Sie in meinem anderen ausführlichen Tutorial.

Wir können hier auch anmerken, dass dieser RC-Empfänger nicht unbedingt nur mit diesem speziellen Sender funktioniert, den ich gebaut habe. Es kann mit jedem anderen ähnlichen Setup arbeiten, das aus einem Arduino-Board und einem NRF24L01-Modul besteht.

Trotzdem ist das Gehirn dieses RC-Empfängers ein Arduino Pro Mini-Board. Zur Stromversorgung können wir entweder den VCC-Pin verwenden, an den wir 5 V anschließen können, oder den RAW-Pin, an den wir 6 bis 12 V anschließen können. Beachten Sie, dass es zwei Versionen des Arduino Pro Mini gibt, wie die, die ich hier verwende, die mit 5 V und die andere mit 3,3 V arbeitet. Andererseits arbeitet das NRF24L01-Modul mit 3,3 V, daher benötigen wir einen Spannungsregler. Dieses Mal verwende ich den Spannungsregler AMS1117, der 3,3 V von Eingängen ausgibt, die von 5 V bis 12 V reichen können.

Sie können die für diesen Arduino RC-Empfänger benötigten Komponenten über die folgenden Links beziehen:

  • NRF24L01 Transceiver-Modul …….………
  • NRF24L01 + PA + LNA …………………..…….
  • AMS1117 3,3V Spannungsregler ………..
  • Stiftleisten Stecker + Buchse ……………….. Amazon /Banggood / AliExpress
  • Arduino Pro Mini………………..……..………..
  • Arduino Pro Mini wie das, das ich verwendet habe ……

Für die Kommunikation mit dem Arduino verwendet das NRF24L01-Modul das SPI-Protokoll plus zwei zusätzliche digitale Pins. Das bedeutet, dass uns 9 digitale Pins übrig bleiben, die als Ausgangskanäle verwendet werden können, von denen zwei die RX- und die TX-Pins sind. Es ist erwähnenswert, dass diese Pins von allem getrennt werden müssen, während wir eine Skizze auf das Arduino-Board hochladen, daher habe ich es ermöglicht, dass sie über separate Stiftleisten verbunden oder getrennt werden können. Eigentlich können wir die analogen Eingänge auch als digitale Ausgänge verwenden, also haben wir, obwohl dieses Arduino-Board ziemlich klein ist, viele Ausgänge oder Kanäle zur Verfügung.

PCB-Design

Um diese Schaltung dennoch kompakt zu halten, habe ich mit der kostenlosen Online-Schaltungsdesign-Software EasyEDA eine benutzerdefinierte Leiterplatte erstellt. Hier habe ich die 8 Kanäle direkt neben einer 5V- und einer Masseschiene angeordnet, sodass wir Servos und ECSs direkt daran anschließen können. Die Kanalnummer 9 befindet sich an einer separaten Position in der Nähe des VCC-Pins des Arduino, sodass wir beispielsweise einen ESC zur Stromversorgung des Arduino mit seiner Battery Eliminator Circuit-Funktion verwenden können, die 5 V liefert. Natürlich könnten wir für diesen Zweck auch andere Kanäle verwenden, da der VCC-Pin auch mit dieser 5-V-Schiene verbunden ist.

Was die Kanäle Nummer 7 und 8 betrifft, können wir hier sehen, wie sie mit diesen Stiftleisten unterbrochen sind. Wenn wir sie verwenden wollen, müssen wir nur die beiden Pins miteinander verbinden. Der Programmierkopf befindet sich in der oberen rechten Ecke und der 100-uF-Kondensator dient sowohl für den Spannungsregler als auch für das NRF24L01-Modul. In der linken unteren Ecke der Platine habe ich die analogen Pins platziert.

Hier können wir noch eine Sache anmerken, und das ist, dass einige Arduino Pro Mini-Boards möglicherweise eine andere Pin-Anordnung haben, deshalb habe ich eine weitere Version der Platine beigefügt, damit Sie diejenige auswählen können, die zu Ihrem Arduino Pro Mini-Board passt.

Hier ist ein Link zu den Projektdateien dieser Leiterplatte. Als ich also mit dem Design fertig war, generierte ich die Gerber-Datei, die für die Herstellung der Leiterplatte benötigt wurde.

Gerber-Dateien:

Dann bestellte ich die Platine bei JLCPCB, die auch der Sponsor dieses Videos sind.

Hier können wir die Gerber-Datei einfach per Drag-and-Drop ziehen und nach dem Hochladen können wir unser PCB im Gerber-Viewer überprüfen. Wenn alles in Ordnung ist, können wir fortfahren und die gewünschten Eigenschaften für unsere Leiterplatte auswählen. Und das war's, jetzt können wir unsere Leiterplatte einfach zu einem günstigen Preis bestellen. Beachten Sie, dass Sie bei Ihrer ersten Bestellung bei JLCPCB bis zu 5 PCBs für nur 2 $ erhalten können.

PCB-Montage

Nach einigen Tagen sind die Leiterplatten eingetroffen. Die Qualität der Leiterplatten ist super und alles ist genau so wie im Design.

Jetzt können wir weitermachen und die Platine montieren. Zuerst müssen wir die Stiftleisten des Arduino-Boards löten. Ein bequemer Weg, dies zu tun, besteht darin, ein Steckbrett zu verwenden, um die Stiftleisten darin zu stecken, damit die Platine beim Löten fest an Ort und Stelle bleibt. Wie ich bereits sagte, können die Stifte je nach Platine etwas variieren, also denken Sie daran, wenn Sie sie löten.

Außerdem gibt es einige Erdungsstifte, die wir frei lassen müssen, da einige Spuren auf der Platine darunter laufen. Nachdem ich die Arduino-Platine gelötet hatte, schneide ich die überschüssige Länge von den Stiften ab.

Als nächstes platzierte ich alle anderen Stiftleisten an Ort und Stelle. Wir benötigen sowohl männliche als auch weibliche Stiftleisten, oder es liegt an Ihnen, welche Stiftleisten Sie verwenden. Es ist jedoch eine gute Idee, männliche Stiftleisten für die digitalen Kanäle zu verwenden, da die Servomotoren und die ESC-Anschlüsse weiblich sind, sodass wir sie einfach anschließen können.

Der Spannungsregler ist eine oberflächenmontierte Komponente, daher habe ich etwas Blue-Tack-Kleber verwendet, um ihn beim Löten an Ort und Stelle zu halten. Schließlich, sobald wir die beiden Kondensatoren an Ort und Stelle gelötet haben, können wir das NRF24L01-Modul an den entsprechenden Stiftleisten befestigen.

Je nach Anwendung oder benötigter Reichweite können wir entweder das normale Modul mit der Bordantenne verwenden oder das, an das wir eine größere Antenne anschließen und eine drahtlose Kommunikation von bis zu 700 Metern im freien Raum erreichen können . Das war's also, unser Arduino RC-Empfänger ist jetzt fertig und wir können ihn für alles verwenden, was wir wollen.

Zum Programmieren des Empfängers oder zum Anschließen des Arduino Pro Mini an den Computer können wir eine USB-zu-Seriell-UART-Schnittstelle verwenden, die an den Programmierkopf angeschlossen werden kann.

Im Arduino IDE-Tools-Menü müssen wir das Arduino Pro- oder Pro Mini-Board auswählen, die richtige Version des Prozessors auswählen, den Port auswählen und die Programmiermethode „USBasp“ auswählen.

Und so können wir jetzt Codes auf den Arduino hochladen.

Beispiel 1 – Arduino RC Car

Ok, jetzt können wir weitermachen und uns das erste Beispiel ansehen.

Es ist ein einfaches Auto, das aus zwei 12-V-Gleichstrommotoren besteht, und in einigen meiner vorherigen Videos habe ich Ihnen bereits gezeigt, wie es funktioniert und wie man es baut.

Siehe auch:L298N-Motortreiber – Arduino-Schnittstelle, Funktionsweise, Codes, Schaltpläne

Dieses Mal verwenden wir unseren neuen Arduino RC-Empfänger zur Steuerung. Für den Antrieb der Gleichstrommotoren verwenden wir den L298N-Motortreiber und für die Stromversorgung verwenden wir 3 Li-Ionen-Batterien, die etwa 12 V liefern.

Die für dieses Beispiel benötigten Komponenten erhalten Sie über die folgenden Links:

  • L298N-Fahrer ……………………………….. 
  • 12-V-Gleichstrommotor mit hohem Drehmoment ………….. 
  • Gleichstrommotor mit Kunststoffreifenrad …….
  • Steckbrett und Schaltdrähte ………… 

Die Verbindungen sind also wirklich einfach, die 12 V, die von den Batterien kommen, gehen an den 12 V-Pin unseres Empfängers, und die sechs Steuerpins des Treibers gehen an die 6 Kanäle. Wir müssen hier beachten, dass wir, um die Geschwindigkeit der Motoren steuern zu können, ein PWM-Signal an die Pins Enable A und Enable B des Treibers liefern müssen. In unserem Empfänger können die Kanäle Nummer 2, 3, 6 und 9 PWM-Signale ausgeben, also habe ich in diesem Fall die Enable-Pins des Treibers mit den Kanälen Nummer 2 und 6 verbunden.

Sehen wir uns jetzt den Arduino-Code an.

/* Arduino RC Receiver - Car Example by Dejan, www.HowToMechatronics.com Library: TMRh20/RF24, https://github.com/tmrh20/RF24/ */ #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #define enA 9 // Arduino pin D9 - CH6 on PCB board - PWM output #define in1 8 // D8 - CH5 #define in2 7 // D7 - CH4 #define in3 6 // D6 - CH3 #define in4 4 // D4 - CH1 #define enB 5 // D5 - CH2 - PWM output RF24 radio(3, 2); // nRF24L01 (CE, CSN) const byte address[6] = "00001"; unsigned long lastReceiveTime = 0; unsigned long currentTime = 0; // Max size of this struct is 32 bytes struct Data_Package { byte j1PotX; byte j1PotY; byte j1Button; byte j2PotX; byte j2PotY; byte j2Button; byte pot1; byte pot2; byte tSwitch1; byte tSwitch2; byte button1; byte button2; byte button3; byte button4; }; Data_Package data; //Create a variable with the above structure int steering, throttle; int motorSpeedA = 0; int motorSpeedB = 0; void setup() { pinMode(enA, OUTPUT); pinMode(enB, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); //Serial.begin(9600); radio.begin(); radio.openReadingPipe(0, address); radio.setAutoAck(false); radio.setDataRate(RF24_250KBPS); radio.setPALevel(RF24_PA_LOW); radio.startListening(); // Set the module as receiver resetData(); } void loop() { // Check whether we keep receving data, or we have a connection between the two modules currentTime = millis(); if ( currentTime - lastReceiveTime > 1000 ) { // If current time is more then 1 second since we have recived the last data, that means we have lost connection resetData(); // If connection is lost, reset the data. It prevents unwanted behavior, for example if a drone jas a throttle up, if we lose connection it can keep flying away if we dont reset the function } // Check whether there is data to be received if (radio.available()) { radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure lastReceiveTime = millis(); // At this moment we have received the data } // Parse the data from the Joystic 1 to the throttle and steering variables throttle = data.j1PotY; steering = data.j1PotX; // Throttle used for forward and backward control // Joystick values: 0 to 255; down = 0; middle = 127; up = 255 if (throttle < 110) { // Set Motor A backward digitalWrite(in1, HIGH); digitalWrite(in2, LOW); // Set Motor B backward digitalWrite(in3, HIGH); digitalWrite(in4, LOW); // Convert the declining throttle readings for going backward from 110 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed motorSpeedA = map(throttle, 110, 0, 0, 255); motorSpeedB = map(throttle, 110, 0, 0, 255); } else if (throttle > 140) { // Set Motor A forward digitalWrite(in1, LOW); digitalWrite(in2, HIGH); // Set Motor B forward digitalWrite(in3, LOW); digitalWrite(in4, HIGH); // Convert the increasing throttle readings for going forward from 140 to 255 into 0 to 255 value for the PWM signal for increasing the motor speed motorSpeedA = map(throttle, 140, 255, 0, 255); motorSpeedB = map(throttle, 140, 255, 0, 255); } // If joystick stays in middle the motors are not moving else { motorSpeedA = 0; motorSpeedB = 0; } // Steering used for left and right control if (steering < 110) { // Convert the declining steering readings from 140 to 255 into increasing 0 to 255 value int xMapped = map(steering, 110, 0, 0, 255); // Move to left - decrease left motor speed, increase right motor speed motorSpeedA = motorSpeedA - xMapped; motorSpeedB = motorSpeedB + xMapped; // Confine the range from 0 to 255 if (motorSpeedA < 0) { motorSpeedA = 0; } if (motorSpeedB > 255) { motorSpeedB = 255; } } if (steering > 140) { // Convert the increasing steering readings from 110 to 0 into 0 to 255 value int xMapped = map(steering, 140, 255, 0, 255); // Move right - decrease right motor speed, increase left motor speed motorSpeedA = motorSpeedA + xMapped; motorSpeedB = motorSpeedB - xMapped; // Confine the range from 0 to 255 if (motorSpeedA > 255) { motorSpeedA = 255; } if (motorSpeedB < 0) { motorSpeedB = 0; } } // Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70) if (motorSpeedA < 70) { motorSpeedA = 0; } if (motorSpeedB < 70) { motorSpeedB = 0; } analogWrite(enA, motorSpeedA); // Send PWM signal to motor A analogWrite(enB, motorSpeedB); // Send PWM signal to motor B } void resetData() { // Reset the values when there is no radio connection - Set initial default values data.j1PotX = 127; data.j1PotY = 127; data.j2PotX = 127; data.j2PotY = 127; data.j1Button = 1; data.j2Button = 1; data.pot1 = 1; data.pot2 = 1; data.tSwitch1 = 1; data.tSwitch2 = 1; data.button1 = 1; data.button2 = 1; data.button3 = 1; data.button4 = 1; } Codesprache:Arduino (arduino)

Beschreibung: Also müssen wir zuerst die SPI- und die RF24-Bibliothek einbinden, einige Pins, das Funkobjekt und die Datenstruktur definieren, in der wir die eingehenden Daten vom Sender speichern werden. Im Setup-Bereich müssen wir die Pin-Ausgänge definieren und die Funkkommunikation beginnen. Für weitere Details, wie das funktioniert und was jede dieser Zeilen tut, können Sie mein ausführliches NRF24L01-Tutorial lesen.

Im Schleifenabschnitt prüfen wir ständig, ob wir Daten empfangen, und wenn ja, lesen wir diese eingehenden Daten. Wenn wir einen kurzen Blick auf den Code des Senders werfen, können wir sehen, welche Art von Daten er an den Empfänger sendet. Es liest die Daten von all seinen Controllern, den Joysticks, den Potentiometern und den Tasten und sendet diese Daten als einzelnes Paket an den Empfänger.

Sobald wir diese Daten gelesen haben, können wir damit machen, was wir wollen. In diesem Fall verwenden wir den Wert der Y-Achse von Joystick 1 zur Steuerung des Gashebels und den Wert der X-Achse zur Steuerung der Lenkung. Ich habe diese Daten in separate Gas- und Lenkvariablen gesteckt. Die Werte, die wir von den Joysticks erhalten, reichen von 0 bis 255. Wenn wir also den Joystick nach unten bewegen, stellen wir die Steuerstifte des Fahrers entsprechend ein, damit sich das Auto rückwärts bewegt, und verwenden den Drosselwert zur Steuerung der Bewegungsgeschwindigkeit. Das gleiche Prinzip gilt für Vorwärts-, Links- und Rechtsfahren. Auch hier habe ich bereits ein detailliertes Tutorial zur Funktionsweise dieses Autos, damit Sie es zum besseren Verständnis überprüfen können. Am Ende des Codes können wir die benutzerdefinierte Funktion resetData() notieren, die alle Werte auf ihre anfänglichen Standardwerte zurücksetzt, sodass das Auto im Falle eines Verlusts der Funkkommunikation erkennen kann, dass es sich bewegt.

Beispiel 2 – Steuerung von Arduino RC-Empfänger-Servos und bürstenlosen Motoren

In Ordnung, jetzt können wir mit dem zweiten Beispiel fortfahren und Servos und bürstenlose Motoren mit diesem Arduino RC-Empfänger steuern.

Zur Steuerung bürstenloser Motoren benötigen wir einen ESC oder Electronic Speed ​​Controller. Der Arduino kommuniziert mit nur einem einzigen Pin mit dem ESC. Zur Steuerung des ESC sendet der Arduino ein bestimmtes PWM-Signal an den ESC und damit steuert der ESC die Motordrehzahl. Der ESC mit demselben Anschluss liefert 5 V über seine Batterie-Eliminator-Schaltungsfunktion, sodass wir unseren Empfänger auch damit versorgen können.

Siehe auch:Anleitung zur bürstenlosen Motorsteuerung von Arduino | ESC | BLDC

Was die Servomotoren betrifft, so haben sie die gleiche Art von Anschlüssen wie der ESC und wir können sie einfach an jeden der verfügbaren Kanäle anschließen.

Die für dieses Beispiel benötigten Komponenten erhalten Sie über die folgenden Links:

  • Bürstenloser Motor ………………………..
  • ESC 30A ………………………………………
  • Li-Po-Akku ……………………..……
  • MG996R Servomotor ………………

Die Eingangssignale zur Steuerung von Servos und bürstenlosen Motoren mit ESCs sind nahezu gleich. Sie verwenden ein spezifisches 50-Hz-PWM-Signal, das mit der Arduino Servo-Bibliothek einfach generiert werden kann.

Hinweis:  Wenn Sie MG996R-Servos mit diesem Setup verwenden, können sie ein Problem in der Schaltung verursachen und den Arduino Pro Mini verbrennen. Das könnte einen höheren Strom ziehen und Spannungsspitzen an der 5-V-Schiene verursachen. Der Arduino Pro Mini sollte bis zu 5,5 V am 5-V-Pin verarbeiten, aber wenn diese Spitzen auftreten, könnte das den Arduino verbrennen. Ich hatte dieses Problem beim Testen der Schaltung, und jemand im Kommentarbereich hat dasselbe gemeldet. Eine Lösung dafür könnte sein, größere Entkopplungskondensatoren an den Servos zu platzieren, aber ich bin mir nicht ganz sicher und habe es nicht getestet. Bitte beachten Sie dieses Problem.

Andererseits habe ich in dem Beispiel zwei andere MG996R-Servos verwendet, die den Arduino nicht verbrannt haben, denke ich, weil sie nicht so hohe Spitzen verursachten. Außerdem habe ich dieses Beispiel mit 4 kleineren S90-Servos verwendet und es gab keine Probleme.

Siehe auch:Funktionsweise des Servomotors & So steuern Sie Servos mit Arduino

/*
  DIY RC Receiver - Servos and Brushless motors control
  by Dejan, www.HowToMechatronics.com
  Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>

RF24 radio(3, 2);   // nRF24L01 (CE, CSN)
const byte address[6] = "00001";
unsigned long lastReceiveTime = 0;
unsigned long currentTime = 0;
Servo esc;  // create servo object to control the ESC
Servo servo1;
Servo servo2;
int escValue, servo1Value, servo2Value;
// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
  byte j1PotX;
  byte j1PotY;
  byte j1Button;
  byte j2PotX;
  byte j2PotY;
  byte j2Button;
  byte pot1;
  byte pot2;
  byte tSwitch1;
  byte tSwitch2;
  byte button1;
  byte button2;
  byte button3;
  byte button4;
};
Data_Package data; //Create a variable with the above structure
void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_LOW);
  radio.startListening(); //  Set the module as receiver
  resetData();
  esc.attach(10);   // Arduino digital pin D10 - CH9 on PCB board
  servo1.attach(4); // D4 - CH1
  servo2.attach(5); // D5 - CH2
}
void loop() {

  // Check whether we keep receving data, or we have a connection between the two modules
  currentTime = millis();
  if ( currentTime - lastReceiveTime > 1000 ) { // If current time is more then 1 second since we have recived the last data, that means we have lost connection
    resetData(); // If connection is lost, reset the data. It prevents unwanted behavior, for example if a drone jas a throttle up, if we lose connection it can keep flying away if we dont reset the function
  }

  // Check whether there is data to be received
  if (radio.available()) {
    radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure
    lastReceiveTime = millis(); // At this moment we have received the data
  }

  // Controlling servos
  servo1Value = map(data.j2PotX, 0, 255, 0, 180); // Map the receiving value form 0 to 255 to 0 to 180(degrees), values used for controlling servos
  servo2Value = map(data.j2PotY, 0, 255, 0, 180);
  servo1.write(servo1Value);
  servo2.write(servo2Value);

  // Controlling brushless motor with ESC
  escValue = map(data.j1PotY, 127, 255, 1000, 2000); // Map the receiving value form 127 to 255 to  1000 to 2000, values used for controlling ESCs
  esc.writeMicroseconds(escValue); // Send the PWM control singal to the ESC
  
}
void resetData() {
  // Reset the values when there is no radio connection - Set initial default values
  data.j1PotX = 127;
  data.j1PotY = 127;
  data.j2PotX = 127;
  data.j2PotY = 127;
  data.j1Button = 1;
  data.j2Button = 1;
  data.pot1 = 1;
  data.pot2 = 1;
  data.tSwitch1 = 1;
  data.tSwitch2 = 1;
  data.button1 = 1;
  data.button2 = 1;
  data.button3 = 1;
  data.button4 = 1;
} Codesprache:Arduino (arduino) 

Nachdem wir die Daten vom Sender erhalten haben, wandeln wir also die Werte von 0 bis 255 in Werte von 0 bis 180 um, um die Servos mit der Funktion write() zu steuern. Auf ähnliche Weise wandeln wir die Daten zur Steuerung des ESC in Werte von 1000 bis 2000 um. In diesem Beispiel steuern wir diesen ESC vom Mittelpunkt des Joysticks Nummer 1 in die obere Position, also wandeln wir die Werte aus der Mitte um , 127 bis 255 in Werte von 1000 bis 2000. Mit der Funktion WriteMicroseconds() der Servobibliothek senden wir das PWM-Signal an den ESC und können so die Geschwindigkeit des bürstenlosen Motors von minimal bis maximal steuern.

Siehe auch: Arduino RC-Flugzeug | 100 % DIY

Auf diese Weise können wir also RC-Flugzeuge, Autos, Boote usw. steuern, da sie normalerweise diese Art von Motoren, Servos und bürstenlosen Motoren verwenden.

Beispiel 3 – RC-Car-Modellsteuerung

Das ferngesteuerte Auto wurde mit einem eigenen Controller geliefert, der die Vorderräder steuern kann, um sich nach links und rechts zu bewegen, sowie das Auto vorwärts und rückwärts zu bewegen.

Da es sich jedoch um ein billiges RC-Auto handelt, sind die Bedienelemente digital oder entweder ein- oder ausgeschaltet, um die maximale Position links und rechts und die maximale Geschwindigkeit zu erreichen. Unabhängig davon habe ich das Auto zerlegt, um zu sehen, was drin ist und wie ich den Arduino RC-Empfänger zur Steuerung implementieren kann.

Als ich die elektronischen Komponenten aufdeckte, bemerkte ich, dass die beiden Motoren eigentlich einfache Gleichstrommotoren sind, die mit 5 V betrieben werden. Sogar der vordere Motor, der die begrenzten Bewegungen für die Lenkung steuert, ist ein einfacher Gleichstrommotor mit kontinuierlicher Rotation.

Anscheinend wissen wir also bereits, wie man Gleichstrommotoren steuert, also wird es ganz einfach sein, diese Platine durch unseren DIY-Arduino-Empfänger zu ersetzen. Zusätzlich zu unserem Empfänger benötigen wir nur einen Motortreiber, der zwei Motoren gleichzeitig antreiben kann. Es gibt viele Optionen für diesen Zweck, sogar die, die wir im ersten Beispiel verwendet haben, den L298N-Treiber.

Dieser ist jedoch zu groß für diese Anwendung, also habe ich mich für den Motortreiber MX1508 entschieden. Dies ist ein einfacher Dual-DC-Motortreiber mit H-Brücken- und PWM-Steuerung. Es hat 4 Steuereingangspins, 4 Pins für die Motoren und 2 Pins für die Stromversorgung.

Ich habe die Motoranschlüsse von der RC-Car-Platine abgelötet und an den Treiber gelötet. Auf der Rückseite habe ich die Powerpins angelötet und jetzt muss ich diesen Treiber noch mit dem Empfänger verbinden. Die Energie für dieses RC-Auto kommt von einem 4,8-V-Ni-Cd-Akku, der sich an der Unterseite des Autos befindet.

Also habe ich diese Pins mit Sprungdrähten mit dem VCC-Pin des Arduino verbunden und auch die 4 Steuereingangspins des Treibers mit 4 digitalen Kanälen verbunden. Wie gesagt, dieser Treiber unterstützt die PWM-Steuerung, also habe ich für den Motor B oder den hinteren Motor die PWM-Kanäle Nummer 2 und 3 verwendet.

Die für dieses Beispiel benötigten Komponenten erhalten Sie über die folgenden Links:

  • MGRC RC-Auto …………………………………
  • DC-Motortreiber MX1508 ………………
  • Steckbrett und Schaltdrähte ………… 

Der Code für dieses RC-Auto ist dem ersten Beispiel sehr ähnlich.

/*
   Arduino RC Receiver - RC Model control
   by Dejan , www.HowToMechatronics.com
   Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define in3 5  // D5 - CH2 - PWM output
#define in4 6  // D6 - CH3 - PWM output
#define in1 7  // D7 - CH4
#define in2 8  // D8 - CH5


RF24 radio(3, 2);   // nRF24L01 (CE, CSN)
const byte address[6] = "00001";
unsigned long lastReceiveTime = 0;
unsigned long currentTime = 0;

// Max size of this struct is 32 bytes
struct Data_Package {
  byte j1PotX;
  byte j1PotY;
  byte j1Button;
  byte j2PotX;
  byte j2PotY;
  byte j2Button;
  byte pot1;
  byte pot2;
  byte tSwitch1;
  byte tSwitch2;
  byte button1;
  byte button2;
  byte button3;
  byte button4;
};

Data_Package data; //Create a variable with the above structure

int  steering, throttle;
int motorSpeedA = 0;
int motorSpeedB = 0;

void setup() {
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_LOW);
  radio.startListening(); //  Set the module as receiver
  resetData();
}
void loop() {
  // Check whether we keep receving data, or we have a connection between the two modules
  currentTime = millis();
  if ( currentTime - lastReceiveTime > 1000 ) { // If current time is more then 1 second since we have recived the last data, that means we have lost connection
    resetData(); // If connection is lost, reset the data. It prevents unwanted behavior, for example if a drone jas a throttle up, if we lose connection it can keep flying away if we dont reset the function
  }
  // Check whether there is data to be received
  if (radio.available()) {
    radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure
    lastReceiveTime = millis(); // At this moment we have received the data
  }
  // Parse the data from the Joystic 1 to the steering and throttle variables
  steering = data.j2PotX;
  throttle = data.j1PotY;


// Throttle used for forward and backward control
  if (throttle < 110) {
    // Convert the declining throttle readings for going backward from 110 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedB = map(throttle, 110, 0, 0, 255);
    // Set Motor B backward
    analogWrite(in3, motorSpeedB);
    digitalWrite(in4, LOW);
  }
  else if (throttle > 140) {
    // Convert the increasing throttle readings for going forward from 140 to 255 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedB = map(throttle, 140, 255, 0, 255);
    // Set Motor B forward
    digitalWrite(in3, LOW);
    analogWrite(in4, motorSpeedB);
  }
  // If joystick stays in middle the motors are not moving
  else {
    digitalWrite(in3, HIGH);
    digitalWrite(in4, HIGH);
  }
  
// steering used for left and right control
  if (steering < 110) {
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
  }
  if (steering > 140) {
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
  }
  // If joystick stays in middle the motors are not moving
  else {
    digitalWrite(in1, HIGH);
    digitalWrite(in2, HIGH);
  }
}
void resetData() {
  // Reset the values when there is no radio connection - Set initial default values
  data.j1PotX = 127;
  data.j1PotY = 127;
  data.j2PotX = 127;
  data.j2PotY = 127;
  data.j1Button = 1;
  data.j2Button = 1;
  data.pot1 = 1;
  data.pot2 = 1;
  data.tSwitch1 = 1;
  data.tSwitch2 = 1;
  data.button1 = 1;
  data.button2 = 1;
  data.button3 = 1;
  data.button4 = 1;
} Codesprache:Arduino (arduino) 

Wir verwenden die Daten, die von den Joysticks kommen, um das Gas und die Lenkung des RC-Autos zu steuern. Für die Rückwärtsbewegung verwenden wir die Funktion analogWrite(), um ein PWM-Signal am Input3-Pin an den Treiber zu senden, während wir den Input4-Pin LOW halten. Um vorwärts zu kommen, machen wir das umgekehrt. Bleibt der Joystick in der Mitte, geben wir dem Fahrer den Befehl, zu bremsen oder die Motoren zu stoppen. Das gleiche Prinzip wird für den Lenkmotor verwendet, obwohl wir hier die Funktion analogWrite() nicht verwenden müssen, da wir die Geschwindigkeit dieses Motors nicht steuern müssen.

Nachdem ich diese Skizze auf den Arduino hochgeladen hatte, musste ich das RC-Auto wieder zusammenbauen. Ich legte den kleinen Treiber in das Innengehäuse und befestigte die restlichen Teile mit den Schrauben. Ich habe den Empfänger wieder mit dem Fahrer verbunden und ihn unter das äußere Gehäuse des Autos gelegt, das genug Platz hatte, um in den Empfänger zu passen.

Also haben wir dieses RC-Auto nicht nur so modifiziert, dass es mit unserem DIY-RC-Sender gesteuert werden kann, sondern es auch verbessert, indem wir eine PWM-Steuerung hinzugefügt haben, sodass wir jetzt auch die Geschwindigkeit des Autos steuern können. Falls das RC-Modell, das Sie modifizieren möchten, Servos und bürstenlose Motoren anstelle von Gleichstrommotoren hat, können Sie der im zweiten Beispiel erläuterten Methode folgen.

Ich hoffe, Ihnen hat dieses Tutorial gefallen und Sie haben etwas Neues gelernt. Fühlen Sie sich frei, Fragen im Kommentarbereich unten zu stellen, und vergessen Sie nicht, meine Sammlung von Arduino-Projekten zu überprüfen.


Herstellungsprozess

  1. DIY:Temperaturüberwachung und -regulierung für HomeBrew
  2. Temperaturmessung für Labor- und Wissenschaftsprojekte
  3. Die Wahl zwischen einem CNC-Router und einem CNC-Laserschneider für Ihre Heimwerkerprojekte.
  4. LCD-Animation und -Spiele
  5. DIY-Voltmeter mit Arduino und Smartphone
  6. DIY Voltmeter mit Arduino und einem Nokia 5110 Display
  7. Python3- und Arduino-Kommunikation
  8. Die Bedeutung von CAD-Modellen für Metallfertigungsprojekte
  9. Verbesserte Drehmaschinen zum Polieren und Entgraten
  10. Mkr1000-Pinbelegung:Eine bevorzugte Wahl für IoT-Projekte