Trådløs servomotorstyring ved hjælp af 2,4 GHz kommunikationslink

Prøv Vores Instrument Til At Fjerne Problemer





I dette indlæg skal vi konstruere et trådløst servomotorkredsløb, der kan styre 6 servomotorer trådløst på 2,4 GHz kommunikationslink.



Introduktion

Projektet er opdelt i to dele: en sender med 6 potentiometre og et modtagerkredsløb med 6 servomotorer .

Fjernbetjeningen har 6 potentiometre til at styre 6 individuelle servomotorer uafhængigt af modtageren. Ved at dreje potentiometeret kan vinklen på servomotor kan styres .



Det foreslåede kredsløb kan bruges, hvor du har brug for kontrolleret bevægelse, for eksempel en robotarm eller forhjulsretningskontrol af RC-bil.

Hjertet i kredsløbet er NRF24L01-modulet, som er en transceiver, det fungerer på ISM-båndet (industrielt, videnskabeligt og medicinsk bånd), det er det samme frekvensbånd, som din WI-FI fungerer.

Illustration af NRF24L01-moduler:

Den har 125 kanaler, den har en maksimal datahastighed på 2 Mbps og den har en teoretisk maksimal rækkevidde på 100 meter. Du har brug for to sådanne moduler for at etablere et kommunikationslink.

Pin-konfiguration:

Det fungerer på SPI-kommunikationsprotokol. Du skal forbinde 7 af de 8 ben til Arduino for at få dette modul til at fungere.

Det fungerer på 3,3 V og 5V dræber modulet, så der skal udvises forsigtighed, mens der tændes. Heldigvis har vi ombord 3.3V spændingsregulator på Arduino, og den skal kun få strøm fra 3.3V-stik på Arduino.

Lad os nu gå videre til senderkredsløbet.

Senderkredsløb:

Kredsløbet består af 6 potentiometer med 10K ohm-værdi. Den midterste terminal på 6 potentiometre er forbundet til A0 til A5 analoge indgangsstifter.

Tabellering er vist ved siden af ​​skematisk for NRF24L01 til Arduino-forbindelse, du kan henvise til, hvis du har nogen forvirring i kredsløbsdiagrammet.

Dette kredsløb får muligvis strøm fra USB eller 9V batteri via DC-stik.

Download biblioteksfilen her: github.com/nRF24/

Program til sender:

//----------------------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 afslutter senderen.

Modtageren:

Modtagerkredsløbet består af 6 servomotorer, en Arduino og to separate strømforsyninger.

Det servomotorer har brug for højere strøm for at fungere, så den må ikke få strøm fra arduino . Derfor har vi brug for to separate strømkilder.

Anvend spænding til servo passende til mikroservomotorer. 4,8 V er nok. Hvis du vil drive større bulk servomotorer, skal du anvende spænding, der matcher klassificeringen af ​​servo.

Husk, at servomotoren bruger noget strøm, selv når der ikke er noget øjeblik, det skyldes, at armen på servomotoren altid kæmper mod enhver ændring fra den kommenterede position.

Program til modtager:

//----------------------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 konkluderer modtageren.

Sådan fungerer dette projekt:

• Tænd for begge kredsløb.
• Drej nu en af ​​potentiometerets drejeknapper.
• For eksempel 3. potentiometer, den tilsvarende servo ved modtageren roterer.
• Dette gælder for alle servomotorer og potentiometre.

Bemærk: Du kan forbinde senderen til computeren og åbne den serielle skærm for at se data såsom servomotorens vinkel, spændingsniveau ved den analoge pin, og hvilket potentiometer der aktuelt betjenes.

Hvis du har specifikke spørgsmål angående dette Arduino-baserede trådløse servomotorprojekt, bedes du udtrykke det i kommentarsektionen, du kan få et hurtigt svar.




Forrige: 200, 600 LED-strengkredsløb på strømforsyning 220V Næste: Sensorfri BLDC-motorstyring med høj strøm ved hjælp af EMF-ryg