2.4GHz通信リンクを使用したワイヤレスサーボモーター制御

問題を排除するために楽器を試してください





この投稿では、2.4GHz通信リンク上で6つのサーボモーターをワイヤレスで制御できるワイヤレスサーボモーター回路を構築します。



前書き

プロジェクトは2つの部分に分かれています:6つのポテンショメータを備えた送信機と6つの受信機回路 サーボモーター 。

リモートには6つのポテンショメータがあり、レシーバーで6つの個別のサーボモーターを個別に制御します。電位差計を回転させることにより、 サーボモーターを制御できます



提案された回路は、ロボットのアームやRCカーの前輪方向制御など、制御された動きが必要な場合に使用できます。

回路の心臓部はNRF24L01モジュールです。これは、ISM帯域(産業、科学、医療帯域)で動作するトランシーバーであり、WI-FIが動作するのと同じ周波数帯域です。

NRF24L01モジュールの図:

125チャネル、最大データレートは2MBps、理論上の最大範囲は100メートルです。通信リンクを確立するには、このようなモジュールが2つ必要です。

ピン構成:

SPI通信プロトコルで動作します。このモジュールを機能させるには、8ピンのうち7ピンをArduinoに接続する必要があります。

3.3 Vで動作し、5Vでモジュールが停止するため、電源を入れる際には注意が必要です。幸い、Arduinoには3.3V電圧レギュレータが搭載されており、Arduinoの3.3Vソケットからのみ電力を供給する必要があります。

それでは、送信機回路に移りましょう。

送信機回路:

この回路は、10Kオーム値の6つのポテンショメータで構成されています。 6つのポテンショメータの中央の端子はA0からA5のアナログ入力ピンに接続されています。

回路図に混乱がある場合は、参照できるNRF24L01からArduinoへの接続の回路図の横に表が示されています。

この回路は、DCジャックを介してUSBまたは9Vバッテリーから電力を供給できます。

ここからライブラリファイルをダウンロードしてください:github.com/nRF24/

送信機のプログラム:

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

これで送信機は終わりです。

受信機:

受信回路は、6つのサーボモーター、1つのArduinoと2つの別々の電源で構成されています。

ザ・ サーボモーターは動作するためにより高い電流を必要とするため、arduinoから電力を供給してはなりません 。そのため、2つの別々の電源が必要です。

マイクロサーボモーターの場合は、サーボに適切な電圧を印加してください。4.8Vで十分です。より大きなサーボモーターに電力を供給したい場合は、サーボの定格に合わせた電圧を印加してください。

サーボモーターのアームは、コメントされた位置からの変化に常に対抗するため、瞬間がない場合でもサーボモーターはある程度の電力を消費することに注意してください。

受信者のためのプログラム:

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

これで受信者は終わりです。

このプロジェクトの運営方法:

•両方の回路に電力を供給します。
•次に、ポテンショメータのノブのいずれかを回します。
•たとえば、3番目のポテンショメータでは、レシーバーの対応するサーボが回転します。
•これは、すべてのサーボモーターとポテンショメーターに適用されます。

注:変換器をコンピューターに接続し、シリアルモニターを開いて、サーボモーターの角度、アナログピンの電圧レベル、現在操作されているポテンショメーターなどのデータを確認できます。

このArduinoベースのワイヤレスサーボモータープロジェクトに関して具体的な質問がある場合は、コメントセクションで迅速な回答が得られる可能性があることを表明してください。




前:メイン220Vの200、600LEDストリング回路 次へ:逆起電力を使用した高電流センサーレスBLDCモーターコントローラー