Wireless Servo Motor Control Gamit ang link ng komunikasyon na 2.4 GHz

Subukan Ang Aming Instrumento Para Sa Pagtanggal Ng Mga Problema





Sa post na ito magtatayo kami ng isang wireless servo motor circuit na maaaring makontrol ang 6 servo motor nang wireless sa 2.4 GHz na link sa komunikasyon.



Panimula

Ang proyekto ay nahahati sa dalawang bahagi: isang transmiter na may 6 potentiometers at isang circuit ng receiver na may 6 mga motor na servo .

Ang remote ay mayroong 6 potentiometers upang makontrol ang 6 na indibidwal na servo motor nang nakapag-iisa sa receiver. Sa pamamagitan ng pag-ikot ng potensyomiter, ang anggulo ng maaaring kontrolin ang servo motor .



Ang iminungkahing circuit ay maaaring magamit kung saan kailangan mo ng kontrol na paggalaw, halimbawa braso ng isang robot o kontrol sa direksyon ng gulong sa harap ng RC car.

Ang puso ng circuit ay module na NRF24L01 na kung saan ay isang transceiver na gumagana ito sa ISM band (Industrial, Scientific at Medical band) ito ang parehong frequency band kung saan gumagana ang iyong WI-FI.

Paglalarawan ng NRF24L01 Modules:

Mayroon itong 125 na mga channel, mayroon itong maximum na rate ng data na 2MBps at mayroon itong teoretikal na maximum na saklaw na 100 metro. Kakailanganin mo ang dalawang gayong modyul upang makapagtatag ng isang link sa komunikasyon.

I-configure ang pin:

Gumagana ito sa protocol ng komunikasyon ng SPI. Kailangan mong ikonekta ang 7 ng 8 mga pin sa Arduino upang gumana ang modyul na ito.

Gumagana ito sa 3.3 V at 5V pinapatay ang module kaya't dapat mag-ingat habang pinapatakbo. Sa kasamaang palad mayroon kaming nakasakay sa 3.3V voltage regulator sa Arduino at dapat itong pinalakas lamang mula sa 3.3V socket ng Arduino.

Ngayon lumipat tayo sa Transmitter circuit.

Transmitter Circuit:

Ang circuit ay binubuo ng 6 potentiometer na 10K ohm na halaga. Ang gitnang terminal ng 6 potentiometers ay konektado sa A0 hanggang A5 analog input pin.

Ang tabula ay ibinibigay sa tabi ng eskematiko para sa koneksyon ng NRF24L01 sa Arduino na maaari mong i-refer, kung mayroon kang anumang pagkalito sa circuit diagram.

Ang circuit na ito ay maaaring pinalakas mula sa USB o 9V na baterya sa pamamagitan ng DC jack.

Mangyaring i-download ang file ng library dito: github.com/nRF24/

Programa para sa Transmitter:

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

Tinapos nito ang transmiter.

Ang tagatanggap:

Ang receiver circuit ay binubuo ng 6 servo motors, isang Arduino at dalawang magkakahiwalay na power supply.

Ang ang mga motor na servo ay nangangailangan ng mas mataas na kasalukuyang upang mapatakbo kaya't hindi ito dapat pinalakas mula sa arduino . Iyon ang dahilan kung bakit kailangan namin ng dalawang magkakahiwalay na mapagkukunan ng kuryente.

Mangyaring maglagay ng boltahe sa servo nang naaangkop para sa mga micro servo motor na 4.8V ay sapat na, kung nais mong bigyan ng lakas ang mas motor na servo motor, maglapat ng boltahe na tumutugma sa rating ng servo.

Mangyaring tandaan na ang servo motor ay gumagamit ng ilang lakas kahit na walang sandali, iyon ay dahil palaging nakikipaglaban ang braso ng servo motor laban sa anumang pagbabago mula sa naka-komentong posisyon.

Programa para sa Tagatanggap:

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

Tinapos na ang tatanggap.

Paano patakbuhin ang proyektong ito:

• Lakasin ang parehong circuit.
• Paikutin ngayon ang alinman sa isang knob ng potentiometer.
• Halimbawa ng ika-3 potensyomiter, umiikot ang kaukulang servo sa receiver.
• Nalalapat ito para sa lahat ng servo motors at potentiometers.

Tandaan: Maaari mong ikonekta ang transmiter sa computer at buksan ang serial monitor upang makita ang data tulad ng anggulo ng servo motor, antas ng boltahe sa analog pin at kung aling potensyomiter ang kasalukuyang pinapatakbo.

Kung mayroon kang anumang tukoy na katanungan tungkol sa proyekto ng wireless servo motor na nakabatay sa Arduino, mangyaring ipahayag sa seksyon ng komento maaari kang makatanggap ng mabilis na tugon.




Nakaraan: 200, 600 LED String Circuit on Mains 220V Susunod: Mataas na Kasalukuyang Sensorless BLDC Motor Controller na gumagamit ng Back EMF