Arduino+nRF24L01无线遥控舵机和电机
-
📍哔哩哔哩视频地址:https://www.bilibili.com/video/BV1o7411F7rA/?spm_id_from=333.788.videocard.6
-
📌文章内容地址:https://www.rcpano.net/2020/02/17/simple-and-cheap-radio-control-making-for-rc-models-diy-rc/
-
🌿 接收端:
-
材料:
2 x Arduino Nano
1 x NRF24L01 + PA Wireless Module
1 x NRF24L01 Wireless Module
2 x Arduino joystick
2 x 100uF Capacitor (16V or above)
1 x 13 * 6 cm PCB Board
1 x 5 * 3.5 cm PCB Board -
📝发射端代码:
// 4 Channel Transmitter | 4 Kanal Verici
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
const uint64_t pipeOut = 0xE9E8F0F0E1LL; //IMPORTANT: The same as in the receiver 0xE9E8F0F0E1LL | Bu adres alıcı ile aynı olmalı
RF24 radio(7, 8); // select CE,CSN pin | CE ve CSN pinlerin seçimi
struct Signal {
byte throttle;
byte pitch;
byte roll;
byte yaw;
};
Signal data;
void ResetData()
{
data.throttle = 127; // Motor Stop (254/2=127)| Motor Kapalı (Signal lost position | sinyal kesildiğindeki pozisyon)
data.pitch = 127; // Center | Merkez (Signal lost position | sinyal kesildiğindeki pozisyon)
data.roll = 127; // Center | merkez (Signal lost position | sinyal kesildiğindeki pozisyon)
data.yaw = 127; // Center | merkez (Signal lost position | sinyal kesildiğindeki pozisyon)
}
void setup()
{
//Start everything up
radio.begin();
radio.openWritingPipe(pipeOut);
radio.stopListening(); //start the radio comunication for Transmitter | Verici olarak sinyal iletişimi başlatılıyor
ResetData();
}
// Joystick center and its borders | Joystick merkez ve sınırları
int mapJoystickValues(int val, int lower, int middle, int upper, bool reverse)
{
val = constrain(val, lower, upper);
if ( val < middle )
val = map(val, lower, middle, 0, 128);
else
val = map(val, middle, upper, 128, 255);
return ( reverse ? 255 - val : val );
}
void loop()
{
// Control Stick Calibration | Kumanda Kol Kalibrasyonları
// Setting may be required for the correct values of the control levers. | Kolların doğru değerleri için ayar gerekebilir.
data.throttle = mapJoystickValues( analogRead(A0), 524, 524, 1015, true );
data.roll = mapJoystickValues( analogRead(A1), 12, 524, 1020, true ); // "true" or "false" for servo direction | "true" veya "false" servo yönünü belirler
data.pitch = mapJoystickValues( analogRead(A2), 12, 524, 1020, true ); // "true" or "false" for servo direction | "true" veya "false" servo yönünü belirler
data.yaw = mapJoystickValues( analogRead(A3), 12, 524, 1020, true ); // "true" or "false" for servo direction | "true" veya "false" servo yönünü belirler
radio.write(&data, sizeof(Signal));
}
- 📗接收端代码:
// 4 Channel Receiver | 4 Kanal Alıcı
// PWM output on pins D2, D3, D4, D5 (Çıkış pinleri)
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>
int ch_width_1 = 0;
int ch_width_2 = 0;
int ch_width_3 = 0;
int ch_width_4 = 0;
Servo ch1;
Servo ch2;
Servo ch3;
Servo ch4;
struct Signal {
byte throttle;
byte pitch;
byte roll;
byte yaw;
};
Signal data;
const uint64_t pipeIn = 0xE9E8F0F0E1LL;
RF24 radio(7, 8);
void ResetData()
{
// Define the inicial value of each data input. | Veri girişlerinin başlangıç değerleri
// The middle position for Potenciometers. (254/2=127) | Potansiyometreler için orta konum
data.throttle = 127; // Motor Stop | Motor Kapalı
data.pitch = 127; // Center | Merkez
data.roll = 127; // Center | Merkez
data.yaw = 127; // Center | Merkez
}
void setup()
{
//Set the pins for each PWM signal | Her bir PWM sinyal için pinler belirleniyor.
ch1.attach(2);
ch2.attach(3);
ch3.attach(4);
ch4.attach(5);
//Configure the NRF24 module
ResetData();
radio.begin();
radio.openReadingPipe(1,pipeIn);
radio.startListening(); //start the radio comunication for receiver | Alıcı olarak sinyal iletişimi başlatılıyor
}
unsigned long lastRecvTime = 0;
void recvData()
{
while ( radio.available() ) {
radio.read(&data, sizeof(Signal));
lastRecvTime = millis(); // receive the data | data alınıyor
}
}
void loop()
{
recvData();
unsigned long now = millis();
if ( now - lastRecvTime > 1000 ) {
ResetData(); // Signal lost.. Reset data | Sinyal kayıpsa data resetleniyor
}
ch_width_1 = map(data.throttle, 0, 255, 1000, 2000); // pin D2 (PWM signal)
ch_width_2 = map(data.pitch, 0, 255, 1000, 2000); // pin D3 (PWM signal)
ch_width_3 = map(data.roll, 0, 255, 1000, 2000); // pin D4 (PWM signal)
ch_width_4 = map(data.yaw, 0, 255, 1000, 2000); // pin D5 (PWM signal)
// Write the PWM signal | PWM sinyaller çıkışlara gönderiliyor
ch1.writeMicroseconds(ch_width_1);
ch2.writeMicroseconds(ch_width_2);
ch3.writeMicroseconds(ch_width_3);
ch4.writeMicroseconds(ch_width_4);
}
🔨配置收发功率
- 🌿RF24_PA_MIN = -18dBm,
- 🌿RF24_PA_LOW = -12dBm,
- 🌿RF24_PA_HIGH = -6dBm,
- 🌿RF24_PA_MAX = 0dBm
radio.setPALevel(RF24_PA_MIN); //设定传输功率, 发射功率 RF24_PA_MIN=-18dBm
📓功率与dBm的简易换算关系参考
dBm代表功率的绝对值,dB代表两个物理量的比值,mW代表功率毫瓦,W代表功率瓦。
一、
dBm = 10 x log[ 功率 mW]
dBm与mW(W)的换算关系:
0dBm = 1.0 mW——1 1.3 mW——2 1.6 mW——3 2.0 mW——4 2.5 mW——5 3.2 mW
6dBm = 4.0 mW——7 5.0 mW——8 6.0 mW——9 8.0 mW——10 10 mW
11dBm = 13 mW——12 16 mW——13 20 mW——14 25 mW——15 32 mW
16dBm = 40 mW——17 50 mW——18 64 mW——19 80 mW——20 100 mW
21dBm = 128 mW——22 160 mW——23 200 mW——24 250 mW——25 320 mW
26dBm = 400mW——27 500mW——28 640mW——29 800mW——30 1.0mw
31dBm = 1.3W——32 1.6W——33 2.0W——34 2.5W——35 3.0W
36dBm = 4.0W——37 5.0W——38 6.0W——39 8.0W——40 10W
41dBm = 13W——42 16W——43 20W——44 25W——45 32W
46dBm = 40W——47 50W——48 64W——49 80W——50 100W