2.4GHz 통신 링크를 사용한 무선 서보 모터 제어

문제를 제거하기 위해 도구를 사용해보십시오





이 글에서는 2.4GHz 통신 링크에서 6 개의 서보 모터를 무선으로 제어 할 수있는 무선 서보 모터 회로를 구성 할 것입니다.



소개

이 프로젝트는 6 개의 전위차계가있는 송신기와 6 개의 수신기 회로로 나뉩니다. 서보 모터 .

리모컨에는 수신기에서 독립적으로 6 개의 개별 서보 모터를 제어하는 ​​6 개의 전위차계가 있습니다. 전위차계를 회전하여 서보 모터 제어 가능 .



제안 된 회로는 로봇의 팔이나 RC 자동차의 앞바퀴 방향 제어와 같이 제어 된 동작이 필요한 곳에 사용할 수 있습니다.

회로의 핵심은 ISM 대역 (산업, 과학 및 의료 대역)에서 작동하는 트랜시버 인 NRF24L01 모듈이며 WI-FI가 작동하는 동일한 주파수 대역입니다.

NRF24L01 모듈 그림 :

125 개의 채널을 가지고 있으며 최대 데이터 속도는 2MBps이며 이론상 최대 범위는 100 미터입니다. 통신 링크를 설정하려면 이러한 모듈 두 개가 필요합니다.

핀 구성 :

SPI 통신 프로토콜에서 작동합니다. 이 모듈이 작동하려면 8 개의 핀 중 7 개를 Arduino에 연결해야합니다.

3.3V 및 5V에서 작동하면 모듈이 종료되므로 전원을 공급하는 동안주의해야합니다. 다행히 Arduino에 3.3V 전압 조정기가 내장되어 있으며 Arduino의 3.3V 소켓에서만 전원을 공급 받아야합니다.

이제 송신기 회로로 이동하겠습니다.

송신기 회로 :

회로는 10K ohm 값의 6 개의 전위차계로 구성됩니다. 6 개의 전위차계의 중간 단자는 A0 ~ A5 아날로그 입력 핀에 연결됩니다.

도표는 NRF24L01에서 Arduino 연결에 대한 회로도 옆에 제공되며 회로도에 혼동이있는 경우 참조 할 수 있습니다.

이 회로는 DC 잭을 통해 USB 또는 9V 배터리에서 전원을 공급받을 수 있습니다.

여기에서 라이브러리 파일을 다운로드하십시오 : 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 개의 서보 모터, 1 개의 Arduino 및 2 개의 별도 전원 공급 장치로 구성됩니다.

그만큼 서보 모터가 작동하려면 더 높은 전류가 필요하므로 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 기반 무선 서보 모터 프로젝트에 대한 구체적인 질문이 있으시면 빠른 답변을 받으실 수 있습니다.




이전 : 주전원 220V의 200, 600 LED 스트링 회로 다음 : 역기전력을 사용하는 고전류 센서리스 BLDC 모터 컨트롤러