2,4 GHz iletişim bağlantısını kullanan Kablosuz Servo Motor Kontrolü

Sorunları Ortadan Kaldırmak Için Enstrümanımızı Deneyin





Bu yazıda, 2,4 GHz iletişim bağlantısı üzerinde 6 servo motoru kablosuz olarak kontrol edebilen kablosuz bir servo motor devresi inşa edeceğiz.



Giriş

Proje iki bölüme ayrılmıştır: 6 potansiyometreli bir verici ve 6'lı bir alıcı devresi Servo motorlar .

Uzaktan kumanda, alıcıda bağımsız olarak 6 ayrı servo motoru kontrol etmek için 6 potansiyometreye sahiptir. Potansiyometreyi döndürerek, açı servo motor kontrol edilebilir .



Önerilen devre, örneğin bir robotun kolu veya RC arabanın ön tekerlek yön kontrolü gibi kontrollü harekete ihtiyaç duyduğunuzda kullanılabilir.

Devrenin kalbi, ISM bandında (Endüstriyel, Bilimsel ve Medikal bant) çalışan bir alıcı-verici olan NRF24L01 modülüdür ve WI-FI'nızın çalıştığı frekans bandıyla aynıdır.

NRF24L01 Modüllerinin Resmi:

125 kanala sahiptir, maksimum 2MBps veri hızına sahiptir ve teorik olarak maksimum 100 metre menzile sahiptir. Bir iletişim bağlantısı kurmak için bu tür iki modüle ihtiyacınız olacak.

PIN konfigürasyonu:

SPI iletişim protokolü üzerinde çalışır. Bu modülün çalışması için 8 pinin 7'sini Arduino'ya bağlamanız gerekir.

3.3 V ve 5V üzerinde çalışır, modülü öldürür, bu nedenle güç verilirken dikkatli olunmalıdır. Neyse ki Arduino'da yerleşik 3.3V voltaj regülatörümüz var ve sadece Arduino'nun 3.3V soketinden beslenmelidir.

Şimdi Verici devresine geçelim.

Verici Devresi:

Devre 10K ohm değerinde 6 adet potansiyometreden oluşmaktadır. 6 potansiyometrenin orta terminali A0 - A5 analog giriş pinlerine bağlanır.

Devre şemasında herhangi bir karışıklık varsa, başvurabileceğiniz Arduino bağlantısına NRF24L01 için şemanın yanında tablo verilmiştir.

Bu devre, DC jakı aracılığıyla USB veya 9V pilden çalıştırılabilir.

Lütfen kitaplık dosyasını buradan indirin: github.com/nRF24/

Verici Programı:

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

Bu, vericiyi sonlandırır.

Alıcı:

Alıcı devresi 6 servo motor, bir Arduino ve iki ayrı güç kaynağından oluşur.

servo motorların çalışması için daha yüksek akıma ihtiyacı vardır, bu nedenle arduino'dan güç almamalıdır . Bu nedenle iki ayrı güç kaynağına ihtiyacımız var.

Lütfen mikro servo motorlar için servo voltajını uygun şekilde uygulayın 4.8V yeterlidir, daha hacimli servo motorlara güç sağlamak istiyorsanız, servo değerine uygun voltaj uygulayın.

Servo motorun, hiçbir an olmadığında bile bir miktar güç tükettiğini lütfen unutmayın, çünkü servo motorun kolu, yorumlanan konumundan her zaman herhangi bir değişikliğe karşı mücadele eder.

Alıcı Programı:

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

Bu, alıcıyı sonlandırır.

Bu proje nasıl çalıştırılır:

• Her iki devreye güç verin.
• Şimdi potansiyometre düğmelerinden herhangi birini döndürün.
• Örneğin 3. potansiyometre, alıcıdaki karşılık gelen servo döner.
• Bu, tüm servo motorlar ve potansiyometreler için geçerlidir.

Not: Servo motorun açısı, analog pindeki voltaj seviyesi ve o anda hangi potansiyometrenin çalıştırıldığı gibi verileri görmek için vericiyi bilgisayara bağlayabilir ve seri monitörü açabilirsiniz.

Bu Arduino tabanlı kablosuz servo motor projesiyle ilgili herhangi bir sorunuz varsa, lütfen yorum bölümünde hızlı bir yanıt alabileceğinizi belirtin.




Önceki: Şebeke 220V üzerinde 200, 600 LED Dize Devresi Sonraki: Geri EMF kullanarak Yüksek Akım Sensörsüz BLDC Motor Kontrol Cihazı