DIYArduinoベースのRCホバークラフト
このチュートリアルでは、ArduinoベースのRCホバークラフトを構築する方法を学びます。プロペラを含むホバークラフト部品の設計と3D印刷から、電子部品の接続とArduinoのプログラミングまで、それを構築するプロセス全体を紹介します。
次のビデオを見るか、以下のチュートリアルを読むことができます。
ホバークラフトを制御するために、以前のビデオの1つで作成したDIYArduinoベースのRC送信機を使用しました。スラストモーターの裏側にラダーを配置するためのサーボモーターを制御するために右のジョイスティックを設定し、ブラシレスDCモーターに実際に取り付けられているリフトプロペラを制御するためにポテンショメーターの1つを設定し、制御するために左のジョイスティックを設定しました推進力。それでは、このRCホバークラフトを構築するために必要なものを見てみましょう。
まず、3Dモデリングソフトウェアを使用してホバークラフトを設計しました。
この3Dモデルを見つけてダウンロードしたり、Thangsのブラウザで調べたりすることができます。
Thangsでアセンブリ3Dモデルをダウンロードします。
3D印刷用のSTLファイル:
ホバークラフトの基本的な動作原理は、ホバークラフトが空気のクッションによって持ち上げられることです。中央のプロペラが船の下に空気を吹き込み、柔らかい素材で作られたスカートを膨らませます。
スカート内の気圧が十分に高くなると、船は持ち上げられます。絶えず供給される空気は、スカートと地面の間のクラフトの中央から逃げます。これにより、追加の揚力が発生し、ホバークラフトと地面の間の摩擦も減少します。
持ち上げられると、2番目のプロペラを使用して推力が発生し、ホバークラフトが前方に移動します。
スラストプロペラの裏側には、ホバークラフトを操縦するために使用される単純な舵のセットがあります。
それでも、デザインが完成したら、パーツの3Dプリントから始めました。
ホバークラフトの船体は印刷する最大の部分であり、私は30x30cmのプリントベッドを備えたCrealityCR-103Dプリンターに合うように特別に設計しました。
チェックアウトしたい場合に備えて、この3Dプリンターへのリンクは次のとおりです。
印刷が完了したら、クリーンアップを行います。ホバークラフトまたはコックピットの本体は、印刷に約18時間かかった最長の印刷物でした。曲線的なデザインで、シングルプリントになりたかったので、このプリントにはたくさんのサポート素材が使われていました。
しかし、それを取り除くのは本当に簡単で、最終的なピースは完璧でした。ホバークラフトの船体は逆さまに印刷されており、除去する必要のあるサポート材料はごくわずかでした。実際、スカートホルダーが適切に収まるように、このプリントを調整し、中央のブロワーハウジングからいくつかの素材を切り取る必要がありました。
すでに3Dモデルを更新しているので、この問題は発生しません。
パーツの丸い部分のいくつかは少し粗いので、私はそれらを滑らかにするために単純な送り紙を使用しました。
プロペラはクリーンアップする必要がなく、3Dプリンターから直接出てきても非常にうまく機能しました。
次のステップは、3Dプリントされたパーツのペイントです。以前はプライマーを使用していませんでしたが、スプレーペイントの形でアクリル絵の具を直接塗りました。
最初のコートにはチョコレートブロウカラーを使用しました。小さなパーツの中には、実際には装飾パーツにすぎないものもありますが、私は明るい茶色を使用しました。
ホバークラフトを少し涼しく見せるために、最初のコートが乾いたら、パーツにさらに2色を追加し続けました。そのために、私は単純な紙にランダムなパターンをいくつか作成し、それらを使用してさまざまな色のストライプやスポットを作成しました。そのために明るい茶色と黒の色を使用しました。
パーツの仕上がりがとても気に入ったので、乾いたら組み立てを続けました。
ラダーを制御するサーボモーターをスラストブロワーハウジングに取り付けることから始めました。 2本のM2ボルトとナットを使用してサーボを固定しました。
次はブラシレスモーターです。私が持っている特定のモデルは、直径28mm、長さ30mmのD2830です。もちろん、ハウジングはこのモーターに合うように特別に設計されています。
ここでモーターを挿入するとき、最初にワイヤーを開口部に通さなければなりませんでした。少しきついですが、それでもそれらを通過させるのは管理可能です。次に、裏側で、M3ボルトを使用してモーターをハウジングに固定しました。
次に、スラストハウジングをホバークラフトの本体とマージすることができます。この部分には開口部があり、サーボとBLDCモーターのワイヤーが通過できるようになっています。
4本のM3ボルトを使用して、しっかりと固定しました。
それが終わったら、ホバークラフトの船体に2番目のブラシレスモーターを取り付け続けました。ここでも同じ方法を使用しました。まず、ワイヤーを開口部に通し、裏側で4本のM3ボルトを使用してモーターを固定しました。
次は電子機器です。電子部品は、船体とホバークラフトの本体の間に配置されます。ただし、その前に、回路図を見て、すべてを接続する必要があることを確認しましょう。
したがって、このホバークラフトの頭脳はArduinoボードです。 Arduinoを使用すると、2つの電子速度コントローラーまたはESCを使用して、サーボと2つのブラシレスモーターを簡単に制御できます。 BLDCモーターに電力を供給するために、約11Vを提供する3S Li-Poバッテリーを使用し、Arduinoに電力を供給するために、ESCがバッテリーエリミネーター回路機能を通じて提供する安定化された5Vを使用できます。
無線通信には、NRF24L01トランシーバモジュールを使用します。これを増幅アンテナと併用すると、オープンスペースで最大700メートルの安定した範囲を確保できます。ホバークラフトを制御するために使用するRC送信機は、以前のチュートリアルの1つでカスタムビルドしたものなので、詳細が必要な場合はチェックしてください。 NRF24l01モジュールに関する詳細なチュートリアル、およびArduinoを使用したブラシレスモーターの使用方法もあります。それでも、基本的な動作原理は、送信機がジョイスティックまたはポテンショメータのデータを受信機に送信し、受信機がブラシレスモーターの速度とサーボの位置を制御することです。
この回路図にはもう1つ小さな詳細があり、それがバッテリーモニターです。 2つの抵抗で構成された単純な分圧器を追加しました。これはバッテリーに直接接続されており、その出力はArduinoのアナログ入力に送られます。分圧器は11ボルトを約4ボルトに下げ、5VArduinoピンで許容できるようになります。これにより、バッテリーの電圧を監視し、たとえばバッテリーの電圧が11ボルトを下回るとLEDが点灯するように設定できます。
このArduinoチュートリアルに必要なコンポーネントは、以下のリンクから入手できます。
そこで、説明したようにコンポーネントの接続を開始しました。 2つのESCを1つのバッテリーに接続するために、パラレルバッテリーコネクタスプリッターを使用しました。XT60と入力します。
プロジェクトに電源スイッチを追加するために、別のXT60コネクタを使用し、その上で1本のワイヤを切断し、そこにトグルスイッチをはんだ付けしました。したがって、一方の側はYスプリッターケーブルに接続し、もう一方の側はバッテリーに接続します。
次に、ESCを本体に配置し、ESCとホバークラフトの船体の間に閉じ込めました。次に、4本のM3ボルトを使用して、2つの部品を一緒に固定しました。次に、ボディの上部開口部から、バッテリーをコックピット領域に挿入しました。
次に、コンポーネントをArduinoに接続する必要があります。そのために、Arduinoに2つのピンヘッダーを追加しました。これは、GNDピンと5Vピンとして機能します。
そこで、すべてをArduinoに接続したら、NRF24L01アンテナ、インジケーターLED、電源スイッチをコックピットの上部カバーに通しました。
次に、すべてをコックピットに押し込む必要がありました。 Arduino UNOを使用したので、ここでは少しきついです。おそらく、代わりにArduinoNanoを使用する必要がありました。
しかし、なんとかすべてを収めることができ、カバーに小さな装飾パーツを取り付けて、コックピットのボディにクリップで留めました。
ステアリングシステムの取り付けを続けました。まず、M2ボルトとナットを使ってサーボホーンに小さなリンクを接続しました。次に、最初のラダーを所定の位置に挿入し、ボディを通過する2mmの金属ワイヤーを使用してスラストハウジングに固定し、ラダーがその周りを回転できるようにしました。同じように2番目の舵を取り付けました。
このラダーには追加のスロットがあるので、以前にサーボに挿入したリンクに接続できます。繰り返しになりますが、M2ボルトとナットを使用して固定しました。そして最後に、別のリンクを使用して2つの舵を相互に接続し、それでステアリングシステムが完成しました。
次に、この小さな装飾パーツをホバークラフトの側面に取り付けます。ドリルを使って穴を開け、1本のネジで部品を船体に固定しました。これらのパーツを両側に配置しましたが、ホバークラフトの全体的な外観に非常によく合っていると思います。
さて、次に私はこのホバークラフトのスカートを作り続けました。ここで、スカートホルダーの周りに穴があり、それを船体に取り付けるためのものであることがわかります。
ナットを入れるスロットもあり、M3ボルトでスカートホルダーを船体に簡単に固定できます。すべてのナットを固定したら、簡単なゴミ箱のビニール袋を使用したスカートを作り続けました。
そこでまず、ホルダーの中央部分にAC接着剤を塗布し、ビニール袋に接着しました。次に、ホルダーの周囲を約6cmオフセットします。いくつかのポイントでマークを付けてから、それらを接続しました。
万能ナイフを使って、ビニール袋を適切なサイズにカットしました。次に、スカートを裏返し、以前にAC接着剤を使用して接着したバッグにホルダーを追加しました。
次に、バッグの外側をホルダーの上部に接着する必要があります。繰り返しになりますが、その目的でAC接着剤を使用し、ビニール袋を慎重に固定しました。
それが終わったら、スカートは次のようになります。
次に、ボルトが通るはずのビニール袋に穴を開けました。スカートホルダーはホバークラフトの船体よりわずか1mm小さいので、ビニール袋と組み合わせると船体にぴったりフィットします。スカートを船体に固定するために、M3ボルトを全周に固定するだけでした。
スカートにもう1つやるべきことがあります。それは、ビニール袋の中央部分を切り抜くことです。
したがって、この半分の空気でスカートが直接膨らみ、次にこの開口部からブリードアウトして、中央に追加の気泡を作成します。
最後に、あとはプロペラをブラシレスモーターに取り付ける必要があります。そのために、ブラシレスモーターに付属のコレットを使用しています。これは、プロペラをモーターシャフトに固定するための非常にシンプルで効果的な方法です。
しかし、他のモーターのコレットをなくしてしまったので、モーターシャフトに直接フィットする別のバージョンのプロペラを印刷する必要がありました。これは3.15mmです。プリントは実際にかなり良く出て、接着剤を使わなくてもモーターに完全にフィットして固定されました。
これで、無線制御のホバークラフトがついに完成しました。
ただし、このビデオに残っているのは、Arduinoコードとプログラムの仕組みを確認することです。
このDIYArduinoベースのRCホバークラフトプロジェクトのコードは次のとおりです。
説明: したがって、最初に、無線通信用のRF24ライブラリと、サーボモーターとブラシレスモーターの両方を制御するためのサーボライブラリを含める必要があります。次に、ラジオとサーボオブジェクトを定義する必要があります。いくつかの変数は、以下のプログラムに必要です。また、DIYRC送信機からの受信データを保存するために使用される変数の構造も定義します。このコミュニケーションの仕組みの詳細については、特定のチュートリアルで確認することをお勧めします。
セットアップセクションでは、無線通信を初期化し、サーボとESCが接続されるピンを定義する必要があります。
ループセクションでは、送信機からの入力データを読み取り、その値を使用してサーボとブラシレスモーターを制御します。したがって、0から255まで変化するジョイスティックの着信データは0から50までの値に変換され、これらの値を使用してサーボの位置を制御します。
同じ方法で、ESCを使用してブラシレスモーターを制御します。 0から255までの入力データは、1000から2000までの値に変換され、wirteMicroseconds()関数を使用して、このデータを制御信号としてESCに送信します。
バッテリ電圧を監視するために、分圧器からのアナログ入力を読み取り、簡単な計算で入力値をバッテリ電圧の実際の値に変換します。バッテリー電圧が11Vを下回ると、インジケーターLEDが点灯します。
以上です。詳細が必要な場合は、他の推奨チュートリアルを確認して、すべてがどのように機能するかを完全に理解できるようにしてください。
このチュートリアルを楽しんで、何か新しいことを学んだことを願っています。以下のコメントセクションで質問をして、Arduinoプロジェクトコレクションを確認してください。
Hovercraft3Dモデル
Hovercraftの動作原理
3Dプリント
ArduinoRCホバークラフトの組み立て
ArduinoRCホバークラフトコード
/*
Arduino based RC Hovercraft
== Receiver Code - ESC and Servo Control =
by Dejan, www.HowToMechatronics.com
Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>
#define led 10
RF24 radio(8, 9); // nRF24L01 (CE, CSN)
const byte address[6] = "00001";
unsigned long lastReceiveTime = 0;
unsigned long currentTime = 0;
Servo esc1; // create servo object to control the ESC
Servo esc2;
Servo servo1;
int esc1Value, esc2Value, servo1Value;
// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
byte j1PotX;
byte j1PotY;
byte j1Button;
byte j2PotX;
byte j2PotY;
byte j2Button;
byte pot1;
byte pot2;
byte tSwitch1;
byte tSwitch2;
byte button1;
byte button2;
byte button3;
byte button4;
};
Data_Package data; //Create a variable with the above structure
void setup() {
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, address);
radio.setAutoAck(false);
radio.setDataRate(RF24_250KBPS);
radio.setPALevel(RF24_PA_LOW);
radio.startListening(); // Set the module as receiver
resetData();
esc1.attach(7);
esc2.attach(6);
servo1.attach(5);
pinMode(led, OUTPUT);
}
void loop() {
// Check whether we keep receving data, or we have a connection between the two modules
currentTime = millis();
if ( currentTime - lastReceiveTime > 1000 ) { // If current time is more then 1 second since we have recived the last data, that means we have lost connection
resetData(); // If connection is lost, reset the data. It prevents unwanted behavior, for example if a drone jas a throttle up, if we lose connection it can keep flying away if we dont reset the function
}
// Check whether there is data to be received
if (radio.available()) {
radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure
lastReceiveTime = millis(); // At this moment we have received the data
}
// Controlling servos
servo1Value = map(data.j2PotX, 0, 255, 0, 50);
servo1.write(servo1Value);
// Controlling brushless motor with ESC
// Lift propeller
esc1Value = map(data.pot1, 0, 255, 1000, 2000); // Map the receiving value form 0 to 255 to 0 1000 to 2000, values used for controlling ESCs
esc1.writeMicroseconds(esc1Value); // Send the PWM control singal to the ESC
// Thrust propeller
esc2Value = constrain(data.j1PotY, 130, 255); // Joysticks stays in middle. So we only need values the upper values from 130 to 255
esc2Value = map(esc2Value, 130, 255, 1000, 2000);
esc2.writeMicroseconds(esc2Value);
// Monitor the battery voltage
int sensorValue = analogRead(A0);
float voltage = sensorValue * (5.00 / 1023.00) * 3; // Convert the reading values from 5v to suitable 12V i
Serial.println(voltage);
// If voltage is below 11V turn on the LED
if (voltage < 11) {
digitalWrite(led, HIGH);
}
else {
digitalWrite(led, LOW);
}
}
void resetData() {
// Reset the values when there is no radio connection - Set initial default values
data.j1PotX = 127;
data.j1PotY = 127;
data.j2PotX = 127;
data.j2PotY = 127;
data.j1Button = 1;
data.j2Button = 1;
data.pot1 = 1;
data.pot2 = 1;
data.tSwitch1 = 1;
data.tSwitch2 = 1;
data.button1 = 1;
data.button2 = 1;
data.button3 = 1;
data.button4 = 1;
}
Code language: Arduino (arduino)
製造プロセス