Беспроводное управление серводвигателем с использованием канала связи 2,4 ГГц

Попробуйте наш инструмент устранения неполадок





В этом посте мы собираемся создать схему беспроводного серводвигателя, которая может управлять 6 сервомоторами по беспроводной связи по каналу связи 2,4 ГГц.



Вступление

Проект разделен на две части: передатчик с 6 потенциометрами и схема приемника с 6 потенциометрами. серводвигатели .

Пульт дистанционного управления имеет 6 потенциометров для независимого управления 6 отдельными серводвигателями на приемнике. Вращая потенциометр, угол наклона серводвигатель можно управлять .



Предложенная схема может быть использована там, где требуется управляемое движение, например, рука робота или управление направлением переднего колеса радиоуправляемой машины.

Сердцем схемы является модуль NRF24L01, который представляет собой приемопередатчик, который работает в диапазоне ISM (промышленный, научный и медицинский), это тот же диапазон частот, в котором работает ваш WI-FI.

Иллюстрация модулей NRF24L01:

Он имеет 125 каналов, максимальную скорость передачи данных 2 Мбит / с и теоретическую максимальную дальность действия 100 метров. Для установления канала связи вам понадобятся два таких модуля.

Конфигурация контактов:

Работает по протоколу связи SPI. Вам необходимо подключить 7 из 8 контактов к Arduino, чтобы этот модуль заработал.

Он работает от 3,3 В, а 5 В убивают модуль, поэтому при подаче питания необходимо соблюдать осторожность. К счастью, на плате Arduino есть стабилизатор напряжения 3.3V, и он должен питаться только от 3.3V розетки Arduino.

Теперь перейдем к схеме передатчика.

Цепь передатчика:

Схема состоит из 6 потенциометров номиналом 10 кОм. Средняя клемма 6 потенциометров подключена к аналоговым входным контактам A0 - A5.

Таблица приведена рядом со схемой подключения NRF24L01 к Arduino, на которую вы можете обратиться, если у вас возникнут какие-либо затруднения в принципиальной схеме.

Эта схема может питаться от USB или батареи 9 В через разъем постоянного тока.

Загрузите файл библиотеки здесь: 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,8 В достаточно, если вы хотите запитать более громоздкие серводвигатели, подайте напряжение, соответствующее номиналу сервопривода.

Пожалуйста, помните, что серводвигатель потребляет некоторую мощность, даже когда нет момента, потому что плечо серводвигателя всегда борется с любым изменением из своего прокомментированного положения.

Программа для получателя:

//----------------------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 от сети 220 В Далее: Сильноточный бессенсорный контроллер двигателя BLDC с использованием обратной ЭДС