การควบคุมเซอร์โวมอเตอร์ไร้สายโดยใช้ลิงค์สื่อสาร 2.4 GHz

ลองใช้เครื่องมือของเราเพื่อกำจัดปัญหา





ในโพสต์นี้เราจะสร้างวงจรเซอร์โวมอเตอร์ไร้สายซึ่งสามารถควบคุมเซอร์โวมอเตอร์ 6 ตัวแบบไร้สายบนลิงค์สื่อสาร 2.4 GHz



บทนำ

โครงการนี้แบ่งออกเป็นสองส่วนคือเครื่องส่งสัญญาณที่มีโพเทนชิโอมิเตอร์ 6 ตัวและวงจรรับสัญญาณที่มี 6 เซอร์โวมอเตอร์ .

รีโมทมีโพเทนชิโอมิเตอร์ 6 ตัวเพื่อควบคุมเซอร์โวมอเตอร์ 6 ตัวแยกกันที่เครื่องรับ โดยการหมุนโพเทนชิออมิเตอร์ทำให้มุมของ สามารถควบคุมเซอร์โวมอเตอร์ได้ .



วงจรที่นำเสนอสามารถใช้ในกรณีที่คุณต้องการการเคลื่อนไหวที่ควบคุมได้เช่นแขนของหุ่นยนต์หรือการควบคุมทิศทางล้อหน้าของรถ RC

หัวใจของวงจรคือโมดูล NRF24L01 ซึ่งเป็นตัวรับส่งสัญญาณที่ทำงานบนแถบ ISM (แถบอุตสาหกรรมวิทยาศาสตร์และการแพทย์) ซึ่งเป็นย่านความถี่เดียวกับที่ WI-FI ของคุณใช้งานได้

ภาพประกอบของโมดูล NRF24L01:

มี 125 ช่องมีอัตราข้อมูลสูงสุด 2MBps และมีช่วงสูงสุดตามทฤษฎี 100 เมตร คุณจะต้องมีโมดูลดังกล่าวสองโมดูลเพื่อสร้างลิงค์การสื่อสาร

การกำหนดค่าพิน:

ทำงานบนโปรโตคอลการสื่อสาร SPI คุณต้องเชื่อมต่อ 7 จาก 8 พินกับ Arduino เพื่อให้โมดูลนี้ทำงานได้

ทำงานบน 3.3 V และ 5V ฆ่าโมดูลดังนั้นต้องใช้ความระมัดระวังในขณะเปิดเครื่อง โชคดีที่เรามีตัวควบคุมแรงดันไฟฟ้า 3.3V บน Arduino และต้องใช้พลังงานจากซ็อกเก็ต 3.3V ของ Arduino เท่านั้น

ตอนนี้เรามาดูวงจรเครื่องส่งสัญญาณกัน

วงจรเครื่องส่ง:

วงจรประกอบด้วย 6 โพเทนชิออมิเตอร์ที่มีค่า 10K โอห์ม ขั้วกลางของ 6 โพเทนชิโอมิเตอร์เชื่อมต่อกับพินอินพุตอะนาล็อก A0 ถึง A5

การจัดตารางจะได้รับข้างแผนผังสำหรับการเชื่อมต่อ NRF24L01 กับ Arduino ที่คุณอาจอ้างถึงหากคุณมีความสับสนในแผนภาพวงจร

วงจรนี้อาจใช้พลังงานจากแบตเตอรี่ USB หรือ 9V ผ่านแจ็ค DC

โปรดดาวน์โหลดไฟล์ไลบรารีที่นี่: github.com/nRF24/

โปรแกรมสำหรับเครื่องส่ง:

//----------------------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------------------------//

นั่นสรุปเครื่องส่ง

ผู้รับ:

วงจรรับประกอบด้วยเซอร์โวมอเตอร์ 6 ตัว Arduino หนึ่งตัวและแหล่งจ่ายไฟแยกกันสองตัว

เซอร์โวมอเตอร์ต้องการกระแสไฟฟ้าที่สูงกว่าในการทำงานดังนั้นจึงต้องไม่ใช้พลังงานจาก arduino . นั่นคือเหตุผลที่เราต้องการแหล่งพลังงานสองแหล่งแยกกัน

โปรดใช้แรงดันไฟฟ้ากับเซอร์โวอย่างเหมาะสมสำหรับไมโครเซอร์โวมอเตอร์ 4.8V ก็เพียงพอแล้วหากคุณต้องการจ่ายพลังงานให้กับเซอร์โวมอเตอร์ขนาดใหญ่ให้ใช้แรงดันไฟฟ้าที่ตรงกับระดับของเซอร์โว

โปรดจำไว้ว่าเซอร์โวมอเตอร์ใช้พลังงานบางส่วนแม้ว่าจะไม่มีช่วงเวลาใดก็ตามนั่นเป็นเพราะแขนของเซอร์โวมอเตอร์จะต่อสู้กับการเปลี่ยนแปลงใด ๆ จากตำแหน่งที่แสดงความคิดเห็น

โปรแกรมสำหรับผู้รับ:

//----------------------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------------------------//

สรุปว่ารับ.

วิธีดำเนินโครงการนี้:

•จ่ายไฟให้ทั้งสองวงจร
•ตอนนี้หมุนลูกบิดของโพเทนชิออมิเตอร์ตัวใดก็ได้
•ตัวอย่างเช่นโพเทนชิออมิเตอร์ที่ 3 เซอร์โวที่เครื่องรับจะหมุน
•ใช้กับเซอร์โวมอเตอร์และโพเทนชิโอมิเตอร์ทั้งหมด

หมายเหตุ: คุณสามารถเชื่อมต่อเครื่องส่งสัญญาณเข้ากับคอมพิวเตอร์และเปิดจอภาพแบบอนุกรมเพื่อดูข้อมูลเช่นมุมของเซอร์โวมอเตอร์ระดับแรงดันไฟฟ้าที่ขาอนาล็อกและโพเทนชิออมิเตอร์ที่กำลังทำงานอยู่

หากคุณมีคำถามเฉพาะเกี่ยวกับโครงการเซอร์โวมอเตอร์ไร้สายที่ใช้ Arduino โปรดแสดงความคิดเห็นในส่วนความคิดเห็นคุณอาจได้รับคำตอบอย่างรวดเร็ว




คู่ของ: 200, 600 LED String Circuit on Mains 220V ถัดไป: คอนโทรลเลอร์มอเตอร์ BLDC ไร้เซ็นเซอร์กระแสสูงโดยใช้ Back EMF