Điều khiển động cơ Servo không dây sử dụng liên kết giao tiếp 2,4 GHz

Hãy Thử Công Cụ CủA Chúng Tôi Để LoạI Bỏ Các VấN Đề





Trong bài đăng này, chúng ta sẽ xây dựng một mạch động cơ servo không dây có thể điều khiển không dây 6 động cơ servo trên liên kết giao tiếp 2,4 GHz.



Giới thiệu

Dự án được chia thành hai phần: một máy phát có 6 chiết áp và một mạch thu có 6 động cơ servo .

Điều khiển từ xa có 6 chiết áp để điều khiển 6 động cơ servo riêng lẻ một cách độc lập tại đầu thu. Bằng cách xoay chiết áp, góc của động cơ servo có thể được điều khiển .



Mạch đề xuất có thể được sử dụng ở những nơi bạn cần chuyển động có kiểm soát, ví dụ như cánh tay của rô bốt hoặc điều khiển hướng bánh trước của ô tô RC.

Trái tim của mạch là mô-đun NRF24L01 là một bộ thu phát nó hoạt động trên băng tần ISM (băng tần Công nghiệp, Khoa học và Y tế), nó là cùng một băng tần mà WI-FI của bạn hoạt động.

Hình minh họa Mô-đun NRF24L01:

Nó có 125 kênh, tốc độ dữ liệu tối đa là 2MBps và có phạm vi tối đa theo lý thuyết là 100 mét. Bạn sẽ cần hai mô-đun như vậy để thiết lập một liên kết giao tiếp.

Cấu hình ghim:

Nó hoạt động trên giao thức truyền thông SPI. Bạn cần kết nối 7 trong số 8 chân với Arduino để mô-đun này hoạt động.

Nó hoạt động trên 3.3 V và 5V giết chết mô-đun, vì vậy cần phải cẩn thận khi cấp nguồn. May mắn thay, chúng tôi có trên bo mạch bộ điều chỉnh điện áp 3.3V trên Arduino và nó phải được cấp nguồn chỉ từ ổ cắm 3.3V của Arduino.

Bây giờ chúng ta hãy chuyển sang mạch Máy phát.

Mạch phát:

Mạch gồm 6 chiết áp có giá trị 10K ohm. Đầu nối giữa của 6 chiết áp được kết nối với các chân đầu vào analog A0 đến A5.

Lập bảng được đưa ra bên cạnh sơ đồ cho kết nối NRF24L01 với Arduino mà bạn có thể tham khảo, nếu bạn có bất kỳ sự nhầm lẫn nào trong sơ đồ mạch.

Mạch này có thể được cấp nguồn từ USB hoặc pin 9V qua giắc cắm DC.

Vui lòng tải xuống tệp thư viện tại đây: github.com/nRF24/

Chương trình cho Máy phát:

//----------------------Program Developed by R.Girish------------------------//
#include
#include
#include
RF24 radio(9,10)
const byte address[6] = '00001'
#define pot1 A0
#define pot2 A1
#define pot3 A2
#define pot4 A3
#define pot5 A4
#define pot6 A5
const int threshold = 20
int potValue1 = 0
int potValue2 = 0
int potValue3 = 0
int potValue4 = 0
int potValue5 = 0
int potValue6 = 0
int angleValue1 = 0
int angleValue2 = 0
int angleValue3 = 0
int angleValue4 = 0
int angleValue5 = 0
int angleValue6 = 0
int check1 = 0
int check2 = 0
int check3 = 0
int check4 = 0
int check5 = 0
int check6 = 0
const char var1[32] = 'Servo1'
const char var2[32] = 'Servo2'
const char var3[32] = 'Servo3'
const char var4[32] = 'Servo4'
const char var5[32] = 'Servo5'
const char var6[32] = 'Servo6'
void setup()
{
Serial.begin(9600)
radio.begin()
radio.openWritingPipe(address)
radio.setChannel(100)
radio.setDataRate(RF24_250KBPS)
radio.setPALevel(RF24_PA_MAX)
radio.stopListening()
}
void loop()
{
potValue1 = analogRead(pot1)
if(potValue1 > check1 + threshold || potValue1 {
radio.write(&var1, sizeof(var1))
angleValue1 = map(potValue1, 0, 1023, 0, 180)
radio.write(&angleValue1, sizeof(angleValue1))
check1 = potValue1
Serial.println('INPUT:1')
Serial.print('Angle:')
Serial.println(angleValue1)
Serial.print('Voltage Level:')
Serial.println(potValue1)
Serial.println('----------------------------------')
}
potValue2 = analogRead(pot2)
if(potValue2 > check2 + threshold || potValue2 {
radio.write(&var2, sizeof(var2))
angleValue2 = map(potValue2, 0, 1023, 0, 180)
radio.write(&angleValue2, sizeof(angleValue2))
check2 = potValue2
Serial.println('INPUT:2')
Serial.print('Angle:')
Serial.println(angleValue2)
Serial.print('Voltage Level:')
Serial.println(potValue2)
Serial.println('----------------------------------')
}
potValue3 = analogRead(pot3)
if(potValue3 > check3 + threshold || potValue3 {
radio.write(&var3, sizeof(var3))
angleValue3 = map(potValue3, 0, 1023, 0, 180)
radio.write(&angleValue3, sizeof(angleValue3))
check3 = potValue3
Serial.println('INPUT:3')
Serial.print('Angle:')
Serial.println(angleValue3)
Serial.print('Voltage Level:')
Serial.println(potValue3)
Serial.println('----------------------------------')
}
potValue4 = analogRead(pot4)
if(potValue4 > check4 + threshold || potValue4 {
radio.write(&var4, sizeof(var4))
angleValue4 = map(potValue4, 0, 1023, 0, 180)
radio.write(&angleValue4, sizeof(angleValue4))
check4 = potValue4
Serial.println('INPUT:4')
Serial.print('Angle:')
Serial.println(angleValue4)
Serial.print('Voltage Level:')
Serial.println(potValue4)
Serial.println('----------------------------------')
}
potValue5 = analogRead(pot5)
if(potValue5 > check5 + threshold || potValue5 {
radio.write(&var5, sizeof(var5))
angleValue5 = map(potValue5, 0, 1023, 0, 180)
radio.write(&angleValue5, sizeof(angleValue5))
check5 = potValue5
Serial.println('INPUT:5')
Serial.print('Angle:')
Serial.println(angleValue5)
Serial.print('Voltage Level:')
Serial.println(potValue5)
Serial.println('----------------------------------')
}
potValue6 = analogRead(pot6)
if(potValue6 > check6 + threshold || potValue6 {
radio.write(&var6, sizeof(var6))
angleValue6 = map(potValue6, 0, 1023, 0, 180)
radio.write(&angleValue6, sizeof(angleValue6))
check6 = potValue6
Serial.println('INPUT:6')
Serial.print('Angle:')
Serial.println(angleValue6)
Serial.print('Voltage Level:')
Serial.println(potValue6)
Serial.println('----------------------------------')
}
}
//----------------------Program Developed by R.Girish------------------------//

Điều đó kết luận máy phát.

Người nhận:

Mạch thu bao gồm 6 động cơ servo, một Arduino và hai bộ nguồn riêng biệt.

Các động cơ servo cần dòng điện cao hơn để hoạt động vì vậy nó không được cấp nguồn từ arduino . Đó là lý do tại sao chúng ta cần hai nguồn điện riêng biệt.

Vui lòng áp dụng điện áp cho servo thích hợp đối với động cơ servo vi mô 4.8V là đủ, nếu bạn muốn cấp nguồn cho động cơ servo lớn hơn, hãy áp dụng điện áp phù hợp với định mức của servo.

Hãy nhớ rằng động cơ servo tiêu thụ một số công suất ngay cả khi không có thời điểm, đó là vì cánh tay của động cơ servo luôn chống lại bất kỳ thay đổi nào so với vị trí đã nhận xét của nó.

Chương trình cho người nhận:

//----------------------Program Developed by R.Girish------------------------//
#include
#include
#include
#include
RF24 radio(9,10)
const byte address[6] = '00001'
Servo servo1
Servo servo2
Servo servo3
Servo servo4
Servo servo5
Servo servo6
int angle1 = 0
int angle2 = 0
int angle3 = 0
int angle4 = 0
int angle5 = 0
int angle6 = 0
char input[32] = ''
const char var1[32] = 'Servo1'
const char var2[32] = 'Servo2'
const char var3[32] = 'Servo3'
const char var4[32] = 'Servo4'
const char var5[32] = 'Servo5'
const char var6[32] = 'Servo6'
void setup()
{
Serial.begin(9600)
servo1.attach(2)
servo2.attach(3)
servo3.attach(4)
servo4.attach(5)
servo5.attach(6)
servo6.attach(7)
radio.begin()
radio.openReadingPipe(0, address)
radio.setChannel(100)
radio.setDataRate(RF24_250KBPS)
radio.setPALevel(RF24_PA_MAX)
radio.startListening()
}
void loop()
{
delay(5)
while(!radio.available())
radio.read(&input, sizeof(input))
if((strcmp(input,var1) == 0))
{
while(!radio.available())
radio.read(&angle1, sizeof(angle1))
servo1.write(angle1)
Serial.println(input)
Serial.print('Angle:')
Serial.println(angle1)
Serial.println('--------------------------------')
}
else if((strcmp(input,var2) == 0))
{
while(!radio.available())
radio.read(&angle2, sizeof(angle2))
servo2.write(angle2)
Serial.println(input)
Serial.print('Angle:')
Serial.println(angle2)
Serial.println('--------------------------------')
}
else if((strcmp(input,var3) == 0))
{
while(!radio.available())
radio.read(&angle3, sizeof(angle3))
servo3.write(angle3)
Serial.println(input)
Serial.print('Angle:')
Serial.println(angle3)
Serial.println('--------------------------------')
}
else if((strcmp(input,var4) == 0))
{
while(!radio.available())
radio.read(&angle4, sizeof(angle4))
servo4.write(angle4)
Serial.println(input)
Serial.print('Angle:')
Serial.println(angle4)
Serial.println('--------------------------------')
}
else if((strcmp(input,var5) == 0))
{
while(!radio.available())
radio.read(&angle5, sizeof(angle5))
servo5.write(angle5)
Serial.println(input)
Serial.print('Angle:')
Serial.println(angle5)
Serial.println('--------------------------------')
}
else if((strcmp(input,var6) == 0))
{
while(!radio.available())
radio.read(&angle6, sizeof(angle6))
servo6.write(angle6)
Serial.println(input)
Serial.print('Angle:')
Serial.println(angle6)
Serial.println('--------------------------------')
}
}
//----------------------Program Developed by R.Girish------------------------//

Điều đó kết luận người nhận.

Cách vận hành dự án này:

• Cấp nguồn cho cả mạch.
• Bây giờ xoay bất kỳ một trong các núm của chiết áp.
• Ví dụ chiết áp thứ 3, servo tương ứng ở đầu thu sẽ quay.
• Điều này áp dụng cho tất cả các động cơ servo và chiết áp.

Lưu ý: Bạn có thể kết nối máy phát với máy tính và mở màn hình nối tiếp để xem dữ liệu như góc của động cơ servo, mức điện áp tại chân analog và chiết áp nào đang được vận hành.

Nếu bạn có bất kỳ câu hỏi cụ thể nào liên quan đến dự án động cơ servo không dây dựa trên Arduino này, vui lòng bày tỏ trong phần bình luận, bạn có thể nhận được phản hồi nhanh chóng.




Trước: Mạch dây 200, 600 LED trên nguồn 220V Tiếp theo: Bộ điều khiển động cơ BLDC không cảm biến dòng cao sử dụng EMF trở lại