Bezdrátové ovládání servomotoru pomocí komunikačního spojení 2,4 GHz

Vyzkoušejte Náš Nástroj Pro Odstranění Problémů





V tomto příspěvku budeme konstruovat bezdrátový obvod servomotoru, který může bezdrátově ovládat 6 servomotorů na komunikační lince 2,4 GHz.



Úvod

Projekt je rozdělen na dvě části: vysílač se 6 potenciometry a obvod přijímače se 6 servomotory .

Dálkový ovladač má 6 potenciometrů pro nezávislé ovládání 6 jednotlivých servomotorů na přijímači. Otáčením potenciometru se úhel lze ovládat servomotor .



Navrhovaný obvod lze použít tam, kde potřebujete řízený pohyb, například rameno robota nebo ovládání směru předního kola RC automobilu.

Srdcem obvodu je modul NRF24L01, což je transceiver, který pracuje v pásmu ISM (průmyslové, vědecké a lékařské pásmo), jedná se o stejné frekvenční pásmo, jaké funguje vaše WI-FI.

Ilustrace modulů NRF24L01:

Má 125 kanálů, maximální datový tok 2 MB / s a ​​teoretický maximální dosah 100 metrů. K navázání komunikačního spojení budete potřebovat dva takové moduly.

Konfigurace kolíků:

Funguje na komunikačním protokolu SPI. Aby tento modul fungoval, musíte k Arduinu připojit 7 z 8 pinů.

Funguje na 3,3 V a 5 V modul zabíjí, takže při napájení je třeba postupovat opatrně. Naštěstí máme na palubě 3,3 V regulátor napětí na Arduinu a ten musí být napájen pouze z 3,3 V zásuvky Arduina.

Nyní přejdeme k obvodu vysílače.

Obvod vysílače:

Obvod se skládá z 6 potenciometru o hodnotě 10K ohm. Střední svorka 6 potenciometrů je připojena k analogovým vstupním pinům A0 až A5.

Tabulka je uvedena vedle schématu připojení NRF24L01 k Arduinu, které můžete použít, pokud máte nejasnosti v schématu zapojení.

Tento obvod může být napájen z USB nebo 9V baterie přes DC jack.

Stáhněte si soubor knihovny zde: github.com/nRF24/

Program pro vysílač:

//----------------------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 vysílač ukončen.

Příjemce:

Obvod přijímače se skládá ze 6 servomotorů, jednoho Arduina a dvou samostatných napájecích zdrojů.

The servomotory potřebují k provozu vyšší proud, takže nesmí být napájeny z arduina . Proto potřebujeme dva samostatné zdroje energie.

Pro mikro servomotory použijte přiměřeně napětí na servomotory, stačí 4,8 V. Pokud chcete napájet objemnější servomotory, připojte napětí odpovídající jmenovité hodnotě serva.

Pamatujte, že servomotor spotřebovává určitou energii, i když není žádný okamžik, je to proto, že rameno servomotoru vždy bojuje proti jakékoli změně ze své komentované polohy.

Program pro přijí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------------------------//

Tím je přijímač uzavřen.

Jak provozovat tento projekt:

• Napájejte oba obvody.
• Nyní otáčejte kterýmkoli z knoflíků potenciometru.
• Například 3. potenciometr se otáčí odpovídající servo na přijímači.
• To platí pro všechny servomotory a potenciometry.

Poznámka: Můžete připojit vysílač k počítači a otevřít sériový monitor, abyste viděli data, jako je úhel servomotoru, úroveň napětí na analogovém kolíku a který potenciometr je aktuálně provozován.

Pokud máte nějaké konkrétní dotazy týkající se tohoto projektu bezdrátových servomotorů založených na Arduinu, vyjádřete prosím v sekci komentářů, že můžete obdržet rychlou odpověď.




Předchozí: 200, 600 LED řetězců na síti 220V Další: High Current Sensorless BLDC Motor Controller using Back EMF