Sterowanie serwomotorem bezprzewodowym za pomocą łącza komunikacyjnego 2,4 GHz

Wypróbuj Nasz Instrument Do Eliminowania Problemów





W tym poście zamierzamy zbudować bezprzewodowy obwód serwomotoru, który może sterować bezprzewodowo 6 serwomotorami na łączu komunikacyjnym 2,4 GHz.



Wprowadzenie

Projekt podzielony jest na dwie części: nadajnik z 6 potencjometrami i obwód odbiornika z 6 silniki serwo .

Pilot posiada 6 potencjometrów do sterowania 6 indywidualnymi serwomotorami niezależnie od odbiornika. Obracając potencjometr, kąt można sterować serwomotorem .



Proponowany obwód można wykorzystać tam, gdzie potrzebny jest sterowany ruch, np. Ramię robota czy sterowanie kierunkiem przednich kół samochodu RC.

Sercem obwodu jest moduł NRF24L01, który jest transceiverem, który pracuje w paśmie ISM (pasmo przemysłowe, naukowe i medyczne) to jest to samo pasmo częstotliwości, na którym działa Twoje WI-FI.

Ilustracja modułów NRF24L01:

Ma 125 kanałów, maksymalny przepływ danych 2MBps i teoretyczny maksymalny zasięg 100 metrów. Do ustanowienia łącza komunikacyjnego potrzebne będą dwa takie moduły.

Konfiguracja pinów:

Działa na protokole komunikacyjnym SPI. Aby ten moduł działał, musisz podłączyć 7 z 8 pinów do Arduino.

Działa na 3,3 V, a 5 V zabija moduł, dlatego należy zachować ostrożność podczas zasilania. Na szczęście mamy na pokładzie regulator napięcia 3,3V na Arduino i musi on być zasilany jedynie z gniazda 3,3V Arduino.

Przejdźmy teraz do obwodu nadajnika.

Obwód nadajnika:

Obwód składa się z 6 potencjometrów o wartości 10 kiloomów. Środkowy zacisk 6 potencjometrów jest podłączony do pinów wejścia analogowego A0 do A5.

Tabela znajduje się obok schematu połączenia NRF24L01 z Arduino, do którego możesz się odnieść, jeśli masz jakiekolwiek pomyłki w schemacie obwodu.

Układ ten może być zasilany z USB lub baterii 9V poprzez gniazdo DC.

Pobierz plik biblioteki tutaj: github.com/nRF24/

Program dla nadajnika:

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

Na tym kończy się nadajnik.

Odbiornik:

Obwód odbiornika składa się z 6 serwomotorów, jednego Arduino i dwóch oddzielnych zasilaczy.

Plik serwomotory wymagają wyższego prądu do działania, więc nie mogą być zasilane z arduino . Dlatego potrzebujemy dwóch oddzielnych źródeł zasilania.

Proszę przyłożyć napięcie do serwomechanizmu odpowiednio dla mikro serwomotorów 4,8V wystarczy, jeśli chcesz zasilać większe serwomotory, zastosuj napięcie dopasowane do wartości znamionowej serwomechanizmu.

Proszę pamiętać, że serwomotor pobiera trochę mocy nawet wtedy, gdy nie ma chwili, to dlatego, że ramię serwomotoru zawsze walczy z każdą zmianą swojego komentowanego położenia.

Program dla odbiornika:

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

Na tym kończy się odbiornik.

Jak obsługiwać ten projekt:

• Zasil oba obwody.
• Teraz obróć dowolne z pokręteł potencjometru.
• Na przykład trzeci potencjometr, odpowiednie serwo na odbiorniku obraca się.
• Dotyczy to wszystkich serwomotorów i potencjometrów.

Uwaga: Możesz podłączyć nadajnik do komputera i otworzyć monitor szeregowy, aby zobaczyć takie dane, jak kąt serwomotoru, poziom napięcia na pinie analogowym i który potencjometr jest aktualnie używany.

Jeśli masz jakieś konkretne pytanie dotyczące tego projektu bezprzewodowego serwomotoru opartego na Arduino, prosimy o wyrażenie w sekcji komentarzy, że możesz otrzymać szybką odpowiedź.




Poprzedni: Obwód ciągów LED 200, 600 na sieci 220V Dalej: Wysokoprądowy, bezczujnikowy sterownik silnika BLDC wykorzystujący Back EMF