Безжичен контрол на сервомотора, използващ комуникационна връзка 2,4 GHz

Безжичен контрол на сервомотора, използващ комуникационна връзка 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 и два отделни захранвания.

The сервомоторите се нуждаят от по-висок ток, за да работят, така че той не трябва да се захранва от 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 струнни вериги в мрежа 220V Напред: BLDC контролер на двигателя без силен ток без сензор, използващ Back EMF