Bežično upravljanje servo motorom pomoću komunikacijske veze 2,4 GHz

Isprobajte Naš Instrument Za Uklanjanje Problema





U ovom ćemo postu konstruirati bežični sklop servo motora koji može bežično upravljati 6 servo motora na komunikacijskoj vezi od 2,4 GHz.



Uvod

Projekt je podijeljen u dva dijela: odašiljač sa 6 potenciometara i krug prijemnika sa 6 servo motori .

Daljinski upravljač ima 6 potenciometara za samostalno upravljanje 6 pojedinačnih servo motora na prijemniku. Zakretanjem potenciometra kut kotača servo motorom se može upravljati .



Predloženi krug može se koristiti tamo gdje vam je potrebno kontrolirano kretanje, na primjer krak robota ili kontrola smjera prednjeg kotača RC automobila.

Srce sklopa je NRF24L01 modul koji je primopredajnik koji radi na ISM opsegu (industrijski, znanstveni i medicinski opseg), to je isti frekvencijski opseg kao i vaš WI-FI.

Ilustracija modula NRF24L01:

Ima 125 kanala, maksimalnu brzinu prijenosa podataka od 2MBps i teoretski maksimalni domet od 100 metara. Za uspostavljanje komunikacijske veze trebat će vam dva takva modula.

Konfiguracija pribadače:

Radi na SPI komunikacijskom protokolu. Morate povezati 7 od 8 pinova na Arduino da bi ovaj modul radio.

Radi na 3,3 V, a 5 V ubija modul pa morate biti oprezni tijekom napajanja. Srećom na ploči imamo Arduino regulator napona od 3,3 V, a on se mora napajati samo iz utičnice Arduino od 3,3 V.

Sada prijeđimo na krug odašiljača.

Krug odašiljača:

Krug se sastoji od 6 potenciometra vrijednosti 10K ohma. Srednji terminal 6 potenciometra spojen je na analogne ulazne pinove A0 do A5.

Tablica je dana pored sheme za vezu NRF24L01 s Arduinom na koju se možete pozvati ako imate bilo kakve zabune u shemi spojeva.

Ovaj se krug može napajati iz USB-a ili 9V baterije putem istosmjerne utičnice.

Datoteku knjižnice preuzmite ovdje: github.com/nRF24/

Program za odašiljač:

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

To zaključuje odašiljač.

Prijemnik:

Sklop prijemnika sastoji se od 6 servo motora, jednog Arduina i dva odvojena napajanja.

The servo motorima je potrebna veća struja za rad, tako da se ne smije napajati iz arduina . Zbog toga su nam potrebna dva odvojena izvora napajanja.

Molimo prikladno nanesite napon na servo za mikro servo motore Dovoljno je 4,8 V, ako želite napajati glomaznije servo motore, primijenite podudarnost napona na ocjenu servo motora.

Imajte na umu da servo motor troši određenu snagu čak i kada nema trenutka, to je zato što se krak servo motora uvijek bori protiv bilo kakve promjene iz svog komentiranog položaja.

Program za prijamnik:

//----------------------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 zaključuje prijamnik.

Kako upravljati ovim projektom:

• Napajajte oba kruga.
• Sada zakrenite bilo koji gumb potenciometra.
• Na primjer, 3. potenciometar, odgovarajući servo na prijemniku se okreće.
• To se odnosi na sve servo motore i potenciometre.

Napomena: Možete povezati odašiljač s računalom i otvoriti serijski monitor kako biste vidjeli podatke kao što su kut servo motora, razina napona na analognom pinu i koji potenciometar trenutno radi.

Ako imate bilo kakvih specifičnih pitanja u vezi s ovim projektom bežičnog servo motora temeljenog na Arduinu, izrazite u odjeljku za komentare da ćete možda dobiti brzi odgovor.




Prethodno: 200, 600 LED strujnih krugova na mreži 220V Dalje: BLDC kontroler motora bez jake struje koji koristi stražnji EMF