Vezeték nélküli szervomotor-vezérlés 2,4 GHz-es kommunikációs kapcsolat használatával

Próbálja Ki A Műszerünket A Problémák Kiküszöbölésére





Ebben a bejegyzésben egy vezeték nélküli szervomotor áramkört fogunk építeni, amely 6 szervomotort vezethet vezeték nélkül 2,4 GHz-es kommunikációs kapcsolaton keresztül.



Bevezetés

A projekt két részre oszlik: egy adó 6 potenciométerrel és egy vevő áramkör 6-mal szervomotorok .

A távvezérlőnek 6 potenciométere van, amelyek hat külön szervomotort vezérelnek a vevőegységtől függetlenül. A potenciométer forgatásával a szervomotor vezérelhető .



A javasolt áramkört ott lehet használni, ahol vezérelt mozgásra van szükség, például egy robotkarra vagy az RC autó első kerék irányának irányítására.

Az áramkör szíve az NRF24L01 modul, amely egy adó-vevő, amely az ISM sávon (ipari, tudományos és orvosi sávon) működik. Ez ugyanaz a frekvenciasáv, mint a WI-FI.

Az NRF24L01 modulok illusztrációja:

125 csatornával rendelkezik, maximális adatátviteli sebessége 2 MB / s, elméleti maximális hatótávolsága pedig 100 méter. Két ilyen modulra lesz szüksége a kommunikációs kapcsolat létrehozásához.

PIN konfiguráció:

Az SPI kommunikációs protokollon működik. A modul működéséhez a 8 tűből 7-et kell csatlakoztatnia az Arduinóhoz.

3,3 V-on működik, az 5 V pedig megöli a modult, ezért az áramellátás közben ügyelni kell. Szerencsére van egy fedélzeti 3,3 V-os feszültségszabályozó az Arduino-n, és csak az Arduino 3,3 V-os aljzatából kell táplálni.

Most térjünk át az adó áramkörre.

Adó áramkör:

Az áramkör 6 10K ohmos értékű potenciométerből áll. 6 potenciométer középső kapcsa az A0 - A5 analóg bemeneti csatlakozókhoz csatlakozik.

Táblázatot adunk az NRF24L01-Arduino kapcsolat vázlata mellett, amelyre hivatkozhat, ha bármilyen zavara van a kapcsolási rajzban.

Ezt az áramkört lehet táplálni USB vagy 9V akkumulátorról DC aljzaton keresztül.

Kérjük, töltse le a könyvtár fájlt innen: github.com/nRF24/

Program az adó számára:

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

Ezzel befejeződött az adó.

A fogadó:

A vevő áramkör 6 szervomotorból áll, egy Arduino és két külön tápegységből.

A a szervomotorok működéséhez nagyobb áramra van szükség, ezért nem szabad őket arduinóról táplálni . Ezért van szükségünk két külön áramforrásra.

Kérjük, a mikrokiszolgáló motorok megfelelő feszültségét alkalmazza a szervóra. A 4.8V elegendő, ha nagyobb teljesítményű szervomotorokat szeretne működtetni, akkor a szervo névleges feszültségnek megfelelő feszültséget alkalmazzon.

Ne feledje, hogy a szervomotor akkor is fogyaszt némi energiát, ha nincs pillanat, ennek oka, hogy a szervomotor karja mindig a bármilyen változás ellen harcol a megjegyzett helyzetéből.

Program a vevő számára:

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

Ezzel véget ér a vevő.

A projekt működtetése:

• Tápellátás mindkét áramkörön.
• Most forgassa el a potenciométer gombját.
• Például a 3. potenciométernél a megfelelő szervo a vevőnél forog.
• Ez minden szervomotorra és potenciométerre vonatkozik.

Megjegyzés: Csatlakoztathatja az adót a számítógéphez, és megnyithatja a soros monitort, hogy megtekinthesse az adatokat, például a szervomotor szögét, az analóg csap feszültségszintjét és azt, hogy melyik potenciométer működik.

Ha bármilyen kérdése van ezzel az Arduino alapú vezeték nélküli szervomotorral kapcsolatban, kérjük, fejtse ki a megjegyzés részben, hogy gyors választ kaphat.




Előző: 200, 600 LED-es húr áramkör a 220 V-os hálózaton Következő: Nagy áramú érzékelő nélküli BLDC motorvezérlő a hátsó EMF használatával