Trådløs servomotorkontroll ved hjelp av 2,4 GHz kommunikasjonslink

Prøv Instrumentet Vårt For Å Eliminere Problemer





I dette innlegget skal vi konstruere en trådløs servomotorkrets som kan styre 6 servomotorer trådløst på 2,4 GHz kommunikasjonslink.



Introduksjon

Prosjektet er delt i to deler: en sender med 6 potensiometere og en mottakerkrets med 6 servomotorer .

Fjernkontrollen har 6 potensiometre for å kontrollere 6 individuelle servomotorer uavhengig av mottakeren. Ved å rotere potensiometeret, blir vinkelen på servomotor kan styres .



Den foreslåtte kretsen kan brukes der du trenger kontrollert bevegelse, for eksempel en robotarm eller forhjulsretningskontroll av RC-bil.

Hjertet i kretsen er NRF24L01-modulen, som er en sender / mottaker den fungerer på ISM-bånd (industrielt, vitenskapelig og medisinsk bånd). Det er det samme frekvensbåndet som din WI-FI fungerer.

Illustrasjon av NRF24L01-moduler:

Den har 125 kanaler, den har maksimal datahastighet på 2 Mbps og den har teoretisk maksimal rekkevidde på 100 meter. Du trenger to slike moduler for å opprette en kommunikasjonslink.

Pin-konfigurasjon:

Det fungerer på SPI-kommunikasjonsprotokoll. Du må koble 7 av de 8 pinnene til Arduino for å få denne modulen til å fungere.

Det fungerer på 3,3 V og 5V dreper modulen, så det må utvises forsiktighet mens du slår på strømmen. Heldigvis har vi ombord 3.3V spenningsregulator på Arduino, og den må bare drives fra 3.3V-kontakten på Arduino.

La oss nå gå videre til senderkretsen.

Senderkrets:

Kretsen består av 6 potensiometer med 10K ohm-verdi. Den midterste terminalen på 6 potensiometre er koblet til A0 til A5 analoge inngangspinner.

Tabell er gitt ved siden av skjemaet for NRF24L01 til Arduino-tilkobling du kan henvise til, hvis du har forvirring i kretsskjemaet.

Denne kretsen kan drives av USB eller 9V batteri via DC-kontakt.

Last ned biblioteksfilen her: github.com/nRF24/

Program for 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 avslutter senderen.

Mottakeren:

Mottakerkretsen består av 6 servomotorer, en Arduino og to separate strømforsyninger.

De servomotorer trenger høyere strøm for å fungere, så den må ikke drives fra arduino . Derfor trenger vi to separate strømkilder.

Bruk spenning til servo passende for mikroservomotorer. 4,8 V er nok. Hvis du vil drive større servomotorer, må du bruke spenning som samsvarer med karakteren til servo.

Husk at servomotoren bruker litt strøm selv når det ikke er noe øyeblikk, det er fordi armen på servomotoren alltid kjemper mot enhver endring fra den kommenterte posisjonen.

Program for mottaker:

//----------------------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 avslutter mottakeren.

Hvordan operere dette prosjektet:

• Strøm begge kretsene.
• Drei nå en av knottene til potensiometeret.
• For eksempel 3. potensiometer, den tilsvarende servoen på mottakeren roterer.
• Dette gjelder alle servomotorer og potensiometere.

Merk: Du kan koble senderen til datamaskinen og åpne en seriell skjerm for å se data som servomotorens vinkel, spenningsnivå ved den analoge stiften og hvilket potensiometer som brukes for øyeblikket.

Hvis du har noen spesifikke spørsmål angående dette Arduino-baserte trådløse servomotorprosjektet, vennligst uttrykk i kommentarseksjonen, du kan få et raskt svar.




Forrige: 200, 600 LED-strengkretser på strømnettet 220V Neste: Sensorfri BLDC-motorstyring med høy strøm ved bruk av Back EMF