Trådlös servomotorstyrning med 2,4 GHz kommunikationslänk

Prova Vårt Instrument För Att Eliminera Problem





I det här inlägget ska vi konstruera en trådlös servomotorkrets som kan styra 6 servomotorer trådlöst på 2,4 GHz-kommunikationslänk.



Introduktion

Projektet är uppdelat i två delar: en sändare med 6 potentiometrar och en mottagarkrets med 6 servomotorer .

Fjärrkontrollen har 6 potentiometrar för att styra 6 individuella servomotorer oberoende på mottagaren. Genom att rotera potentiometern kan vinkeln på servomotor kan styras .



Den föreslagna kretsen kan användas där du behöver kontrollerad rörelse, till exempel arm av en robot eller framhjulsriktningskontroll av RC-bil.

Hjärtat i kretsen är NRF24L01-modulen, som är en sändtagare som fungerar på ISM-band (industriellt, vetenskapligt och medicinskt band). Det är samma frekvensband som din WI-FI fungerar.

Illustration av NRF24L01-moduler:

Den har 125 kanaler, den har en maximal datahastighet på 2 Mbps och den har en teoretisk maximal räckvidd på 100 meter. Du behöver två sådana moduler för att skapa en kommunikationslänk.

Stiftkonfiguration:

Det fungerar på SPI-kommunikationsprotokoll. Du måste ansluta 7 av de 8 stiften till Arduino för att denna modul ska fungera.

Det fungerar på 3,3 V och 5V dödar modulen så försiktighet måste iakttas vid strömförsörjning. Lyckligtvis har vi ombord 3.3V spänningsregulator på Arduino och den får endast strömförsörjas från 3.3V-uttaget på Arduino.

Nu går vi vidare till sändarkretsen.

Sändarkrets:

Kretsen består av 6 potentiometer med 10K ohm-värde. Den mellersta terminalen på 6 potentiometrar är ansluten till A0 till A5 analoga ingångsstift.

Tabell visas bredvid schemat för NRF24L01 till Arduino-anslutning som du kan hänvisa till, om du har någon förvirring i kretsschemat.

Denna krets kan drivas från USB- eller 9V-batteri via DC-uttag.

Ladda ner biblioteksfilen här: github.com/nRF24/

Program för sändare:

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

Det avslutar sändaren.

Mottagaren:

Mottagarkretsen består av 6 servomotorer, en Arduino och två separata strömförsörjningar.

De servomotorer behöver högre ström för att fungera så det får inte drivas från arduino . Därför behöver vi två separata strömkällor.

Använd spänning på servo på lämpligt sätt för mikroservomotorer. 4,8V räcker. Om du vill driva större servomotorer, använd spänningsmatchning till servo.

Kom ihåg att servomotorn förbrukar lite kraft även när det inte finns något ögonblick, det beror på att servomotorns arm alltid kämpar mot förändringar från sin kommenterade position.

Program för mottagare:

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

Det avslutar mottagaren.

Hur man driver detta projekt:

• Slå på båda kretsarna.
• Vrid nu någon av potentiometerns vred.
• Till exempel 3: e potentiometer, motsvarande servo vid mottagaren roterar.
• Detta gäller för alla servomotorer och potentiometrar.

Obs! Du kan ansluta sändaren till datorn och öppna den seriella bildskärmen för att se data såsom servomotorns vinkel, spänningsnivå vid analog stift och vilken potentiometer som för närvarande används.

Om du har några specifika frågor angående detta Arduino-baserade trådlösa servomotorprojekt, vänligen uttryck i kommentarsektionen du kan få ett snabbt svar.




Tidigare: 200, 600 LED-strängkretsar på elnät 220V Nästa: Högströmssensorfri BLDC-motorstyrenhet med hjälp av EMF-bak