Remote Control Receiver
Like the transmitter, the receiver essentially consists of an arduino nano and a NRF24L01 WiFi module. Since the arduino can only handle a voltage of 5 v, but the battery supplies 9 v, the voltage between the battery and the arduino must be reduced from 9 v to 5 V. To do this, we use a LM2596S or any similar DC / DC converter.
Required parts: 1 x Arduino Nano 1 x NRF24 module 1 x 9V battery 1 x LM2596S or similar DC7DC converter
Wiring
NRF24L01 Arduino MOSI D11 MISO D12 SCK D13 CE D9 CSN D8 VCC +3.3 V GND GND
Receiver Software
The software for the receiver allows the boat to move forward and backward and to move the rudder in two steps to the left and right. Driving backwards does not work properly, but theoretically it would be possible.
/* * Airboat RC Controller * Code for transmitter * (c) Stefan Hager 2023 */ #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Servo.h> #define DEBUG 1 // CE is on pin 9 // CSN is on pin 8 RF24 receiver(9, 8); // servo for airboat rudder Servo rudder; // pins for L298N (motor controller) int PWM = 5; int in1 = 4; int in2 = 3; const byte address[7] = "AIRBOAT"; // this data package is expected from transmitter struct Data_Struct { int thrust = 0; int rudder = 90; }; Data_Struct data; void setup() { Serial.begin(9600); Serial.println("Setup starts...."); // initialize receiver receiver.begin(); if(receiver.isChipConnected()) { Serial.println("Start reading pipe..."); receiver.openReadingPipe(0, address); receiver.setPALevel(0); receiver.setDataRate(RF24_250KBPS); receiver.setChannel(0x60); receiver.startListening(); } else { Serial.println("Chip is not properly connected!"); receiver.stopListening(); } // Servo on pin D5 rudder.attach(6); // move to middle position Serial.println("Positioning rudder servo to 90 degrees..."); rudder.write(90); // initialize L298N pins pinMode(PWM, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); } void loop() { // any data...? if(receiver.available()) { receiver.read(&data, sizeof(data)); } // motor if(data.thrust > 60) { // forward digitalWrite(in1, HIGH); digitalWrite(in2, LOW); analogWrite(PWM, data.thrust); Serial.println("F: "); Serial.println(data.thrust); } else if(data.thrust < -60) { // reverse digitalWrite(in1, LOW); digitalWrite(in2, HIGH); analogWrite(PWM, data.thrust); } else { // neutral - switch motor off analogWrite(PWM, 0); } // rudder if(data.rudder < 80 or data.rudder > 120) { // do only move, if you have a value that really differs from neutral (=90) rudder.write(data.rudder); } else { rudder.write(90); } #ifdef DEBUG Serial.print("T: "); Serial.print(data.thrust); Serial.print(" R:"); Serial.println(data.rudder); #endif delay(20); }