Belaidis servovariklio valdymas naudojant 2,4 GHz ryšio jungtį

Išbandykite Mūsų Instrumentą, Kaip Pašalinti Problemas





Šiame pranešime mes sukursime belaidžio servo variklio grandinę, kuri valdys 6 servovariklius belaidžiu būdu per 2,4 GHz ryšio jungtį.



Įvadas

Projektas yra padalintas į dvi dalis: siųstuvas su 6 potenciometrais ir imtuvo grandinė su 6 servo varikliai .

Nuotolinio valdymo pultelyje yra 6 potenciometrai, skirti valdyti 6 atskirus servovariklius imtuve. Sukant potenciometrą, kampas servo variklis gali būti valdomas .



Siūloma grandinė gali būti naudojama ten, kur jums reikia valdomo judesio, pavyzdžiui, roboto rankos arba RC automobilio priekinio rato krypties valdymo.

Grandinės širdis yra NRF24L01 modulis, kuris yra siųstuvas-imtuvas, kuris veikia ISM juostoje (pramonės, mokslo ir medicinos juostoje). Tai yra ta pati dažnių juosta, kurią veikia jūsų WI-FI.

NRF24L01 modulių iliustracija:

Jis turi 125 kanalus, maksimalus duomenų perdavimo greitis yra 2 MB / s, o teorinis maksimalus diapazonas yra 100 metrų. Norint sukurti ryšio ryšį, jums reikės dviejų tokių modulių.

Smeigtuko konfigūracija:

Jis veikia pagal SPI ryšio protokolą. Norėdami, kad šis modulis veiktų, turite prijungti 7 iš 8 kaiščių su „Arduino“.

Jis veikia esant 3,3 V, o 5 V - užmuša modulį, todėl reikia būti atsargiems maitinant. Laimei, mes turime laive 3.3V įtampos reguliatorių „Arduino“ ir jis turi būti maitinamas tik iš 3.3V „Arduino“ lizdo.

Dabar pereikime prie siųstuvo grandinės.

Siųstuvo grandinė:

Kontūrą sudaro 6 10K omo vertės potenciometras. 6 potenciometrų vidurinis gnybtas yra prijungtas prie analoginių įėjimų kaiščių nuo A0 iki A5.

Lentelė pateikiama šalia schemos NRF24L01 - Arduino ryšiui, į kurį galite kreiptis, jei turite kokių nors painiavos grandinės schemoje.

Ši grandinė gali būti maitinama iš USB arba 9 V baterijos per nuolatinės srovės lizdą.

Atsisiųskite bibliotekos failą čia: github.com/nRF24/

Siųstuvo programa:

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

Tai padaro siųstuvą.

Imtuvas:

Imtuvo grandinę sudaro 6 servovarikliai, vienas „Arduino“ ir du atskiri maitinimo šaltiniai.

The servo varikliams veikti reikia didesnės srovės, todėl jie neturi būti maitinami iš „arduino“ . Štai kodėl mums reikia dviejų atskirų maitinimo šaltinių.

Prašome tinkamai įjungti įtampą servo sistemai, kai mikro servo varikliams užtenka 4,8 V, jei norite įjungti didesnius servovariklius, įtampą derinkite prie servo.

Atminkite, kad servo variklis sunaudoja tam tikrą galią, net jei nėra momento, taip yra todėl, kad servo variklio svirtis visada kovoja su bet kokiais pokyčiais iš savo komentuojamos padėties.

Imtuvo programa:

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

Tuo imtuvas baigiasi.

Kaip vykdyti šį projektą:

• Maitinkite abi grandines.
• Dabar pasukite bet kurią potenciometro rankenėlę.
• Pavyzdžiui, 3-ame potenciometre atitinkamas imtuvo servo sukasi.
• Tai taikoma visiems servovarikliams ir potenciometrams.

Pastaba: Galite prijungti siųstuvą prie kompiuterio ir atidaryti nuoseklųjį monitorių, kad pamatytumėte duomenis, tokius kaip servovariklio kampas, įtampos lygis analoginiame kaište ir kuris potenciometras šiuo metu naudojamas.

Jei turite kokių nors konkrečių klausimų apie šį „Arduino“ pagrįstą belaidžio servo variklio projektą, komentarų skyriuje nurodykite, kad galite greitai atsakyti.




Pora: 200, 600 LED styginių grandinė ant 220V tinklo Kitas: Didelės srovės be jutiklio BLDC variklio valdiklis, naudodamas „Back EMF“