Bezdrôtové ovládanie servomotora pomocou komunikačného spojenia 2,4 GHz

Vyskúšajte Náš Nástroj Na Odstránenie Problémov





V tomto príspevku zostrojíme obvod bezdrôtového servomotora, ktorý dokáže bezdrôtovo riadiť 6 servomotorov na komunikačnom spoji 2,4 GHz.



Úvod

Projekt je rozdelený na dve časti: vysielač so 6 potenciometrami a obvod prijímača so 6 servomotory .

Diaľkový ovládač má 6 potenciometrov na nezávislé riadenie 6 jednotlivých servomotorov na prijímači. Otáčaním potenciometra sa uhol servomotor je možné ovládať .



Navrhovaný obvod je možné použiť tam, kde potrebujete riadený pohyb, napríklad rameno robota alebo riadenie smeru predných kolies RC automobilu.

Srdcom obvodu je modul NRF24L01, ktorý je vysielačom a prijímačom pracujúcim v pásme ISM (priemyselné, vedecké a lekárske pásmo), ide o rovnaké frekvenčné pásmo, aké funguje aj vo vašom WI-FI.

Ilustrácia modulov NRF24L01:

Má 125 kanálov, maximálnu rýchlosť prenosu dát 2 MBps a teoretický maximálny dosah 100 metrov. Na vytvorenie komunikačného spojenia budete potrebovať dva také moduly.

Konfigurácia kolíka:

Funguje na komunikačnom protokole SPI. Aby tento modul fungoval, musíte pripojiť 7 z 8 pinov k Arduinu.

Funguje na 3,3 V a 5 V modul zabíja, takže pri napájaní je potrebné postupovať opatrne. Našťastie máme na Arduine regulátor napätia 3,3 V a musí byť napájaný iba z 3,3 V zásuvky Arduina.

Teraz prejdime k okruhu vysielača.

Obvod vysielača:

Obvod sa skladá zo 6 potenciometrov s hodnotou 10 K ohmu. Stredná svorka 6 potenciometrov je pripojená k analógovým vstupným pinom A0 až A5.

Tabuľka je uvedená vedľa schémy zapojenia NRF24L01 do Arduina, ktoré môžete použiť, ak máte v schéme zapojenia nejaké nejasnosti.

Tento obvod môže byť napájaný z USB alebo 9V batérie cez DC konektor.

Stiahnite si súbor z knižnice tu: github.com/nRF24/

Program pre vysielač:

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

Tým je vysielač uzavretý.

Prijímač:

Obvod prijímača pozostáva zo 6 servomotorov, jedného Arduina a dvoch samostatných napájacích zdrojov.

The servomotory potrebujú na svoju činnosť vyšší prúd, takže nesmú byť napájané z arduina . Preto potrebujeme dva samostatné zdroje energie.

Pre mikro servomotory primerane pripojte napätie na servomotory, stačí 4,8 V. Ak chcete napájať objemnejšie servomotory, pripojte napätie zodpovedajúce hodnotám servopohonu.

Pamätajte, že servomotor spotrebováva určitú energiu, aj keď nie je žiadny okamih, to je spôsobené tým, že rameno servomotora vždy bojuje proti akejkoľvek zmene zo svojej komentovanej polohy.

Program pre prijímač:

//----------------------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 prijímač uzatvára.

Ako prevádzkovať tento projekt:

• Napájajte obidva okruhy.
• Teraz otočte ktorýkoľvek z gombíkov potenciometra.
• Napríklad 3. potenciometer sa príslušné servo na prijímači otáča.
• To platí pre všetky servomotory a potenciometre.

Poznámka: Môžete pripojiť vysielač k počítaču a otvoriť sériový monitor, aby ste videli údaje, ako je uhol servomotora, úroveň napätia na analógovom kolíku a ktorý potenciometer je práve v prevádzke.

Ak máte akékoľvek konkrétne otázky týkajúce sa tohto projektu bezdrôtových servomotorov založených na Arduine, vyjadrite sa v sekcii komentárov, kde môžete dostať rýchlu odpoveď.




Predchádzajúce: 200, 600 LED reťazec v sieti 220V Ďalej: Vysokoprúdový bezsenzorový radič BLDC motora využívajúci Back EMF