Arduino駆動RCホバークラフト自作ガイド:全3Dプリント設計とプログラミング
このチュートリアルでは、ArduinoベースのRCホバークラフトの作り方を学びます。ホバークラフト部品(プロペラ含む)の設計・3Dプリントから、電子部品の接続、Arduinoプログラミングまで全工程を紹介します。 以下の動画を見るか、書面チュートリアルをお読みください。 ホバークラフトの制御には、以前の動画で作ったDIY ArduinoベースRC送信機を使用。右ジョイスティックで後部ラダー(推進モーター後方の舵)を制御するサーボを操作、ポテンショメーターの1つでリフトプロペラ(ブラシレスDCモーター駆動)を制御、左ジョイスティックで推進を制御します。ではこのRCホバークラフトの製作を見ていきましょう。 3Dモデリングソフトでホバークラフトを設計しました。 Thangsで3Dモデルを探索・ダウンロードできます。 アセンブリ3Dモデルのダウンロード(Thangs) STLファイル(3Dプリント用): ホバークラフトの基本原理は、エアクッションで機体を浮上させることです。中央のプロペラが機体下部に空気を送り込み、柔らかい素材で作られたスカートを膨らませます。 スカート内の空気圧が十分に高まると機体が浮上。常時供給される空気がスカートと地面の間の隙間から漏れ出し、追加の揚力を生むとともに、ホバークラフトと地面の摩擦を低減させます。 浮上後、第2のプロペラで推力を発生させ前進します。 推進プロペラの後部にはシンプルなラダー(舵)があり、これで操向します。 設計完了後、3Dプリントを開始。 ホバークラフトの船体(ハル)が最大のプリントパーツで、私のCreality CR-10 3Dプリンター(造形エリア30×30cm)に収まるよう設計しました。 この3Dプリンターのリンクはこちら。 プリント完了後、後処理を行います。メインボディ(コックピット)が最長で約18時間。曲面設計で一体成型のため、大量のサポート材が使用されました。 しかしサポート材は簡単に除去でき、仕上がりは完璧。ハルは逆さまにプリントし、サポート材はわずか。中央のブロワーハウジングから一部材料を削り取り、スカートホルダーがうまく嵌まるように調整しました(3Dモデルはすでに修正済み)。 一部の丸み部分が荒かったため、サンドペーパーで磨きました。 プロペラは後処理不要で、プリント直後の状態でよく機能しました。 3Dプリントパーツを塗装します。プライマーは使わず、アクリルスプレー塗料を直接吹き付けました。 最初のコートはチョコレートブラウン。装飾用の小さなパーツにはライトブラウンを使用。 よりカッコよく見せるため、最初のコートが乾いたらさらに2色を追加。紙にランダムなパターンを描き、それを型紙にしてストライプとスポットをライトブラウンとブラックで描きました。 パーツの仕上がりに満足したら、乾燥後に組み立てを開始。 まず推進ブロワーハウジングにラダー制御用サーボを取り付け(M2ボルト・ナット2本)。 次にブラシレスモーター。使用したのはD2830(直径28mm、長さ30mm)で、ハウジングはこのモーター専用設計です。 モーター挿入時、まず配線を開口部を通します。少しきついですが通せます。裏側からM3ボルトでモーターをハウジングに固定。 推進ハウジングとメインボディを合体。このパーツには開口部があり、サーボとBLDCモーターの配線が通ります。 M3ボルト4本でしっかり固定。 続いてハルに第2のブラシレスモーターを取り付け。同じ要領で配線を通し、裏側からM3ボルト4本で固定。 電子部品はハルとメインボディの間に配置します。その前に回路図で接続方法を確認しましょう。 このホバークラフトの頭脳はArduinoボード。Arduinoでサーボと2つのブラシレスモーター(ESC経由)を簡単に制御できます。BLDCモーター用電源は3S Li-Poバッテリー(約11V)、Arduino用電源はESCのBEC機能から供給される5Vを使用。 無線通信にはNRF24L01トランシーバーモジュールを使用。増幅アンテナ付きなら開放地で最大700mの安定通信が可能。制御用RC送信機は以前のチュートリアルで自作したものを使用(詳細はそちらを参照)。NRF24L01モジュールとブラシレスモーターArduino制御の詳細チュートリアルもあります。基本原理は、送信機がジョイスティック/ポテンショメーターのデータを送信し、レシーバーがブラシレスモーターの回転数とサーボ位置を制御するというものです。 回路図にはもう1つ小さな詳細があります:バッテリーモニター。2つの抵抗で簡易分圧回路を作り、バッテリーに直接接続、出力をArduinoのアナログ入力に接続。分圧で11Vを約4Vに下げ、5V許容のArduinoピンで読み取れるようにしています。これでバッテリー電圧を監視し、11V未満でインジケーターLEDを点灯させられます。 このArduinoチュートリアルに必要なコンポーネント: 説明通りに部品を接続。2つのESCを1つのバッテリーに接続するため、XT60タイプの並列バッテリーコネクター分岐ケーブルを使用。 電源スイッチを追加するため、もう1つのXT60コネクターの片側配線を切り、そこにトグルスイッチをはんだ付け。一方をY分岐ケーブル、他方をバッテリーに接続。 ESCをメインボディに入れ、ハルとの間に挟み込み、M3ボルト4本で2パーツを締結。ボディ上部の開口部からバッテリーをコックピットエリアに挿入。 部品をArduinoに接続するため、ArduinoにGNDと5V用のピンヘッダーを2本追加。 すべてをArduinoに接続後、NRF24L01アンテナ、インジケーターLED、電源スイッチをコックピットのトップカバーの穴に通します。 すべてをコックピットに押し込みます。Arduino UNOを使用したため少しきつかった(Arduino Nanoの方が良かったかも)。 しかし何とか収まり、小さな装飾パーツをカバーに取り付け、クリップでコックピットボディに固定。 ステアリングシステムを取り付け。サーボホーンに小さなリンクをM2ボルト・ナットで接続。第1ラダーを挿入し、2mm金属ワイヤーで本体を貫通させて固定(このワイヤーを中心にラダーが回転)。第2ラダーも同様。 第2ラダーには追加スロットがあり、先ほど取り付けたリンクと接続。M2ボルト・ナットで固定。最後に2つのラダーをもう1つのリンクで連結し、ステアリングシステム完成。 ホバークラフト側面に小さな装飾パーツを取り付け。ドリルで穴を開け、ネジ1本でハルに固定。両側に取り付け、全体の外観にマッチしています。 スカートの製作。スカートホルダーにはハル取り付け用の穴が周囲にあります。 ナット用スロットもあり、M3ボルトでスカートホルダーをハルに簡単に固定できます。全ナットを固定後、スカート材としてゴミ袋(ビニール袋)を使用。 まずホルダー中央に瞬間接着剤を塗り、ビニール袋を貼り付け。ホルダー外周から約6cmオフセットした位置を数点マークし、それらを結んで切断ラインを決めます。 カッターナイフでビニール袋を適切なサイズにカット。裏返し、以前接着した中央部分に追加のホルダーを貼り付け。 袋の外周をホルダー上部に接着。再び瞬間接着剤で慎重に固定。 スカート完成時の様子。 ボルトが通る位置でビニール袋に穴を開けます。スカートホルダーはハルよりわずか1mm小さいため、ビニール袋と合わせてハルにぴったり嵌まります。M3ボルトを全周にわたって締めてスカートを固定。 スカートにもう1つ必要な作業:中央部分のビニール袋を切り抜きます。 これで空気の半分が直接スカートを膨らませ、残りがこの開口部から抜けて中央に追加のエアバブルを作ります。 最後にプロペラをブラシレスモーターに取り付け。付属のコレットを使い、モーターシャフトにプロペラを固定。シンプルで効果的な方法です。 もう1つのモーターのコレットを紛失したため、モーターシャフト(3.15mm)に直接嵌まるバージョンのプロペラをプリント。接着剤なしで完璧に嵌まり固定できました。 これでラジコンホバークラフトがついに完成です。 あとはArduinoコードとプログラムの仕組みを見てみましょう。 このDIY ArduinoベースRCホバークラフトプロジェクトのコードはこちら: 解説: まずRF24ライブラリ(無線通信)とServoライブラリ(サーボおよびブラシレスモーター制御)をインクルード。無線オブジェクト、サーボオブジェクト、プログラム用変数、自作RC送信機からの着信データ格納用構造体を定義。通信の詳細は専用チュートリアルを参照してください。 setup()では無線通信の初期化と、サーボ/ESC接続ピンの定義を行います。 loop()では送信機からの着信データを読み取り、サーボとブラシレスモーターの制御に使用。ジョイスティックデータ(0〜255)を0〜50に変換し、サーボ位置制御に使用。 ブラシレスモーターも同様にESCで制御。着信データ(0〜255)を1000〜2000に変換し、writeMicroseconds()でESCに制御信号として送信。 バッテリー電圧監視は、分圧回路からのアナログ入力を読み取り、簡単な計算で実電圧に変換。11V未満でインジケーターLEDを点灯。 詳細は他の推奨チュートリアルを参照し、仕組みを完全に理解してください。 このチュートリアルがお役に立てば幸いです。質問はコメント欄でどうぞ。Arduinoプロジェクトコレクションもご覧ください。概要

ホバークラフトの3Dモデル


ホバークラフトの作動原理


3Dプリント






ホバークラフトの塗装


Arduino RCホバークラフトの組み立て






回路図




















Arduino RCホバークラフト コード
/* 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
}
// 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;
}
製造プロセス
- 自作LUMAZOID:Arduino音楽ビジュアライザーDIYガイド
- Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト
- Pixie: Arduino Pro Miniで作るNeoPixel腕時計 - アナログとデジタル融合のDIY光る時計
- Arduino、Google Cardboard、Bluetoothで作るDIY VRスケートボード
- Arduino Nanoと128x64 OLEDで実行するセルラーオートマトン「ライフゲーム」
- DIY ArduinoラジオニクスEMR治療デバイスの構築
- ArduinoとGoogleスプレッドシート連携 リアルタイムRFID勤怠管理システム
- Arduino NanoとSG90サーボで作るDIY 2軸モーションレーシングシミュレータ
- Arduino UNOで作る信頼性の高いスマートエネルギーモニター – ステップバイステップガイド
- Arduinoで作るセキュリティシステム:超音波センサーとサーボで広範囲監視・アラート
- Arduinoで作るポータブルRFIDドアロック - ステップバイステップガイド