Brezžično krmiljenje servo motorja z uporabo komunikacijske povezave 2,4 GHz

Brezžično krmiljenje servo motorja z uporabo komunikacijske povezave 2,4 GHz

V tem prispevku bomo zgradili brezžično servo motorno vezje, ki lahko brezžično krmili 6 servo motorjev na komunikacijski povezavi 2,4 GHz.



Uvod

Projekt je razdeljen na dva dela: oddajnik s 6 potenciometri in sprejemno vezje s 6 servo motorji .





Daljinski upravljalnik ima 6 potenciometrov za samostojno upravljanje 6 posameznih servo motorjev na sprejemniku. Z vrtenjem potenciometra se kot kota servo motor je mogoče krmiliti .

Predlagano vezje lahko uporabite tam, kjer potrebujete nadzorovano gibanje, na primer roko robota ali krmiljenje smeri prednjega kolesa avtomobila RC.



Srce vezja je modul NRF24L01, ki je oddajnik, ki deluje na pasu ISM (industrijski, znanstveni in medicinski pas); to je isti frekvenčni pas, kot deluje vaš WI-FI.

Prikaz modulov NRF24L01:

Ima 125 kanalov, ima največjo hitrost prenosa podatkov 2 MB / s in ima teoretični največji domet 100 metrov. Za vzpostavitev komunikacijske povezave boste potrebovali dva taka modula.

Konfiguracija zatiča:

Deluje na komunikacijskem protokolu SPI. Za delovanje tega modula morate na Arduino priključiti 7 od 8 nožic.

Deluje na 3,3 V in 5 V ubije modul, zato je treba med napajanjem biti previdni. Na srečo imamo na krovu 3,3 V napetostni regulator na Arduinu, napajati pa ga je treba samo iz 3,3 V vtičnice Arduino.

Zdaj pa pojdimo na vezje oddajnika.

Krog oddajnika:

Vezje je sestavljeno iz 6 potenciometrov z vrednostjo 10K ohm. Srednji terminal 6 potenciometrov je povezan z analognimi vhodnimi zatiči A0 do A5.

Tabela je podana poleg sheme povezave NRF24L01 z Arduino, na katero se lahko sklicujete, če imate kakršno koli zmedo v vezju.

To vezje se lahko napaja iz USB ali 9V baterije prek enosmernega priključka.

Prenesite datoteko knjižnice tukaj: github.com/nRF24/

Program za oddajnik:

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

S tem je oddajnik zaključen.

Sprejemnik:

Sprejemno vezje je sestavljeno iz 6 servo motorjev, enega Arduina in dveh ločenih napajalnikov.

The servo motorji potrebujejo večji tok za delovanje, zato se ne sme napajati iz arduina . Zato potrebujemo dva ločena vira energije.

Prosimo, da za mikro servo motorje ustrezno napolnite servo napetost, dovolj je 4,8 V. Če želite napajati večje servo motorje, uporabite napetost, ki ustreza nazivni vrednosti servo motorja.

Ne pozabite, da servo motor porabi nekaj moči, tudi kadar ni trenutka, saj se roka servo motorja vedno bori proti kakršni koli spremembi iz njegovega komentiranega položaja.

Program za sprejemnik:

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

To zaključuje sprejemnik.

Kako voditi ta projekt:

• Napajajte vezje.
• Zdaj zavrtite kateri koli gumb potenciometra.
• Na primer 3. potenciometer, ustrezni servo na sprejemniku se zavrti.
• To velja za vse servo motorje in potenciometre.

Opomba: Oddajnik lahko priključite na računalnik in odprete serijski monitor, da si ogledate podatke, kot so kot servo motorja, nivo napetosti na analognem zatiču in kateri potenciometer trenutno deluje.

Če imate kakršno koli posebno vprašanje v zvezi s tem projektom brezžičnega servo motorja, ki temelji na Arduinu, v oddelku za komentar navedite, da boste morda hitro odgovorili.




Prejšnja: 200, 600 LED nizov v omrežju 220V Naprej: Krmilnik motorja BLDC brez močnega senzorja z uporabo povratnega EMF