工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

ArduinoベースのRC飛行機をゼロから製作し、以前の動画で自作したカスタムArduino送信機で制御する方法を紹介します。

動画または以下の記事をご覧ください。

概要

飛行機は完全にスチロール(発泡スチロール)製。形状切り出しには自作Arduino CNCフォームカッティングマシンを使用(前回の動画で製作方法を紹介)。CNCマシンも自作なので、この飛行機も100% DIYと言えます。

制御システムも100% DIY。ArduinoとNRF24L01モジュールで無線通信を行います。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

送信機の右ジョイスティックでエルロン(補助翼)とエレベーター(昇降舵)を、左ジョイスティックでラダー(方向舵)とスロットルを制御。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

右ポテンショメーターで操作応答性(サーボ可動量)を調整、左ポテンショメーターでラダーのサブトリム(サーボアームのニュートラル位置)調整が可能。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

そして何より、このArduino RC飛行機のメイン機能は「飛行」です。そう、飛べます。

RC飛行機の設計 – 3Dモデル

3Dモデリングソフト(今回はFusion 360)で飛行機を設計。市販RC飛行機を参考に、模型飛行機設計の基本ガイドライン/経験則に従いました。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

出発点は翼幅。80cmに設定。胴体長は一般的に翼幅の75%。翼型(翼断面)にはCLARK Yエアフォイルを採用。RC飛行機で人気の選択です。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

airfoiltools.comからエアフォイル形状をSVGファイルでダウンロードし、Fusion 360にインポート。翼弦長(流れ方向の翼長)が翼幅の約1/5になるようサイズ調整。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

水平尾翼と垂直尾翼も同じ基本ガイドラインでサイズ決定。基本的なRC模型飛行機設計パラメータ:

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

胴体は10mm厚の側板2枚と、電子機器収納用の中空50mmコアで構成。

3Dモデルは上記リンクからダウンロード可能。バージョン1(画像のもの)とバージョン2(ノーズを小さくしモーターを前方に配置して気流改善)の2バージョンあり。

自作CNCフォームカッター用Gコード生成

自作CNCフォームカッターの作業エリアは45cmまでですが、胴体長は60cm。そのため胴体を2分割で製作。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

胴体を前方点から34cmでカットし、新規スケッチで形状を投影、付近にポイントを追加。Fusion 360のManufacturingタブでGコード生成。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

新規セットアップでスケッチをモデル選択、先ほど追加したポイントを原点に設定、X/Y軸を適切に調整。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

2D輪郭加工を選択、工具を新規作成(直径3mm – ホットワイヤーがスチロールを切断する際の概算幅)。切削送り速度はホットワイヤーとスチロール硬度に依存。150mm/minに設定。

Geometryタブで切断対象の輪郭/形状を選択。高さはすべて1mm(私のフォームカッターにはZ軸動作なし)。Linkingタブでエントリー位置を原点付近のエッジに設定。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

ツールパス生成完了。シミュレーションで確認。閉ループ単一パスになっていればOK。Post ProcessでGRBLファームウェア選択、出力フォルダー/ファイル名指定、PostボタンでGコード生成。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

ファイル保存後、WordPad等でGコード確認。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

Gコードファイルができたら、Universal G-code Senderに読み込み、CNCマシンに送信して形状切り出し。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

このプロセスがベスト/プロフェッショナルとは言えませんが、自作CNCフォームカッターで動作するGコードを得るには十分機能します。自作CNCマシン詳細は専用チュートリアル動画を参照(動画説明欄にリンク)。

Gコードファイルダウンロード:

側板には1cm厚スチロール、コアには5cm厚スチロールを使用。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

主翼には10cm厚スチロールを使用、最大カット幅30cmに合わせて約30cm幅でカット。1つのGコードファイルに2枚分の翼型を配置し、複数枚カット。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

80cm翼幅を得るため、27cmピース3枚を接着。真っ直ぐ接着するため、ピース端部を手動でカットして垂直にしました。

RC飛行機の組み立て

CNCで切り出したすべてのスチロールピース。前部3枚、後部3枚、主翼3枚。組み立て開始。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

前部から開始。グルーガンで接着。ホットグルーでスチロールが少し溶けますが、接着可能です。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

スチロール接着には5分硬化型エポキシも有効。反対側接着前にモーターホルダーを製作。幅30mmアルミプロファイル(軽量)を使用。約18cmにカット、モーター取り付け穴をマーキング、3mmドリルで穴あけ、90度曲げ。M3ボルトでモーター固定。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

このアセンブリで前部スチロールに貫通穴を開け、ユーティリティナイフでφ30mm(モーター径と同サイズ)に拡大。

モーターホルダー反対側に4箇所穴あけ(ホルダー固定用とランディングギア取り付け用)。これらの位置を胴体にマーキング、4mmドリルで手動穴あけ。同じ穴位置のアルミ板(約7cm)をもう1枚作り、モーターホルダー固定に使用。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

M4ボルトでスチロールを傷めず確実にモーターホルダー固定。後で行うので一旦外し、反対側接着続行。同様に後部ピースも接着。

前部と後部の接合(「結婚」)。接合強度確保のため、間にバーベキュー串を挟み込み。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

より太い棒の使用を推奨。墜落時にここが折れやすいため。接合部に十分なホットグルーを塗布し、圧着。胴体完成。かなりカッコいい出来栄えです。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

ユーティリティナイフで水平尾翼と垂直尾翼用に10mm厚スチロールを2枚カット。エッジをベベルカットして見た目と空力特性向上。尾翼は胴体後部に直接接着だが、先に制御面(エレベーターとラダー)を製作。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

長さの約1/3を制御面としてカット。ヒンジ接続のため接触面をベベルカット。ユーティリティナイフで慎重に(鋭利な刃推奨)。

尾翼をさらに空力的に。サンドペーパーで前縁を丸く、後縁も少しサンディング。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

スチロールは脆いため、尾翼と制御面全体を梱包テープでラッピング。強度向上と表面滑らか化(スチロールよりテープの方が滑らか)で空力特性も向上。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

ラダー下部を45度カットしてエレベーター可動スペース確保。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

ヒンジも梱包テープで製作。2パーツをテープで連結するだけで強力なヒンジに。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

水平尾翼も同様。ヒンジ強化のため反対側にもテープ追加。側面もテープでラッピング。2枚の尾翼完成。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

ホットグルーで水平尾翼を胴体に接着。垂直尾翼固定には、バーベキュー串3本を水平尾翼と胴体を貫通させてグルー固定、接触面にもグルーを塗って押し付け固定。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

尾翼完成。主翼製作へ。

主翼は3ピース構成(CNC作業エリア制限のため)。バーベキュー串で補強しながら接着。直線木材ストリップをガイドにしてピースをスライドさせ、精密に一直線に接着。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

完成した主翼は長く薄いため脆い。木製棒で補強。棒をカット、主翼にポケットをユーティリティナイフで慎重に切り出し、ホットグルーで固定。エアフォイル形状を崩さないよう注意。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

木製棒でかなり強化されたが、着地衝撃でバラバラになる恐れあり。尾翼と同様、全体を梱包テープでラッピング。後縁から前縁へ向かってテープ貼り(前方からの気流でテープ剥離防止)。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

簡単に見えて、安定した手と忍耐が必要で少し面倒。主翼は完璧に仕上がりました。強度、空力、見た目すべて良好。

主翼制御面(エルロン)製作。幅22cm、翼弦長の約1/4長。自由可動のため約0.5cmカットオフ。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

切断で露出したエッジすべてにテープ貼り。エルロン下部を45度ベベルカット、前述と同じ要領でヒンジ接続。胴体取り付けと着脱容易化のため、主翼中央にさらにリセス(窪み)を追加。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

エルロン用サーボモーター取り付け。9gマイクロサーボ使用。配置位置マーキング、ユーティリティナイフで慎重に開口。サーボ取り付けブラケットを外して形状簡略化。グルーで開口部に固定。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

サーボから主翼中央へ配線用小溝をユーティリティナイフで切削。すべてテープで覆い隠蔽。反対側も同様。

コントロールホーン製作。モーターホルダーに使ったアルミプロファイルを流用。サーボホーン高さに概ね合わせ、ヒンジポイントをまたぐ形で手描き、金属用ノコギリで切り出し。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

コントロールロッド用にφ2mm鋼線を使用するため、ホーンに2.5mmドリルで穴あけ。エルロンに小溝を切りホーンをグルー固定。コントロールロッド長を測定、ペンチでφ2mm鋼線から製作。測定・挿入時はサーボがニュートラル位置にあること。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

ニュートラル位置出し:手動で可動範囲中央に配置、またはサーボテスター/Arduinoで実施。反対側も同様。主翼完成。

ラダーとエレベーター用サーボ取り付け。同じ9gマイクロサーボ、手順は主翼と同様。位置マーキング、ユーティリティナイフで開口、2個並列配置(出力軸は反対向き)。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

胴体に配線用小溝切削、サーボをテープで覆いホーン用開口作成。前述と同じ要領でコントロールホーン製作・グルー固定。適切なコントロールロッド製作・取り付け。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

φ8mm木製ロッド2本で主翼を胴体に固定。6mmドリルで手動穴あけ。ロッド両側約1cm突出。ホットグルーで胴体にも固定。実際の動作:

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

ゴムバンドで主翼を胴体に固定。着脱容易、墜落時はゴムバンドが衝撃吸収、十分な強度確保。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

ランディングギア製作。アルミプロファイルとスチロール製車輪(CNCで製作済み)。アルミプロファイルに溝を入れて曲げやすく。完成形:

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

車輪取り付け:M5ボルトと内径6mmアルミパイプ使用。パイプをM5ボルト・ナットでブラケット固定、両側にM5ワッシャーで車輪がパイプ周りで自由回転可能に。後部車輪も同様。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

すべてのコンポーネント準備完了。電子工作を見てみましょう。

Arduino RC飛行機 電子工作 – 回路図

前述の通り、このRC飛行機は送信機も受信機もArduino Pro Miniベースの完全自作。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

送信機と受信機の製作・動作原理詳細は別チュートリアルで解説済み。ここではこのArduino RC飛行機の回路図と動作原理、全接続を説明。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

必要なコンポーネント:

  • NRF24L01 + PA + LNA …………..…..…….
  • Arduino Pro Mini………………..……….…..
  • サーボモーター ……………………………………
  • ブラシレスモーター ………………………..……
  • ESC 30A ……………………………….…………
  • Li-Poバッテリー ……………………..……………

無線通信はNRF24L01モジュールベース。複雑に見えますが、このDIY Arduino送信機は実はシンプル。ジョイスティック、ポテンショメーター、ボタンなど複数のコントローラーを備え、それらのデータを常時送信。受信機はNRF24L01で無線受信し、サーボとブラシレスモーターへ適切なコマンドを出力。

Arduinoでのサーボとブラシレスモーター制御もシンプルなので、このArduino RC飛行機コンセプト全体はそれほど難しくありません。使用ブラシレスモーターは1000KV、30A ESC必要。ESCがモーター駆動とBEC(バッテリー除去回路)機能でArduinoとサーボに5V供給。ESCとブラシレスモーターへの電源は3S Li-Poバッテリーから。

追加機能:バッテリー残量表示用シンプルLED。簡易分圧器でLi-Poバッテリーの12Vを約5Vに降圧、Arduinoアナログ入力で読み取り、11V以下でLED点灯。受信機にはまだ空きチャンネルがあるため、ストロボライト、フラップ、投下機構など追加機能実装可能。

組み立て仕上げ

回路図通りに全接続。CH1: ラダー、CH2: エレベーター、CH3/4: エルロン、CH6: LED。LEDと電源スイッチを左右に配置・接着。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

ランディングギアはモーターホルダーの2本ボルトで飛行機に取り付け(前述の通り、上部開口からモーターホルダー挿入・ボルト固定、ランディングギア同時取り付け)。ホルダー挿入時にゴムバンドも追加し、バッテリー保持用に。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

バッテリーをESCに接続、すべてを収納。延長ケーブルで主翼エルロンを受信機に接続、ゴムバンドで主翼を胴体に固定。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

プロペラをモーターに取り付け。残るは重心(CG)チェック。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

CGは飛行性能を左右する最重要ファクター。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

最初はテールヘビーだったため、バッテリーを前方に移動、ウェイト(ボルト・ナット)追加でバランス調整。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

これでArduinoベースRC飛行機完成。屋外でテスト飛行へ。

Arduino RC飛行機 テスト飛行

初飛行(メイデンフライト)は惨憺たる結果。特に墜落後の姿を見ると…

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

結論:まだテールヘビー、モーター出力不足の感触。別モーター/プロペラがなかったため、ノーズを小さく改造、モーターを前方に移動して気流改善、前縁エッジを丸め。構造補強として木製棒とアルミプロファイルを胴体内部にグルー固定。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

電子機器コンパートメント底部に2穴:前方開口からの気流逃がし用、NRF24L01アンテナ外出し用(通信距離確保)。

2回目試行。気流/出力は改善された感触だが、また胴体破損。このスチロールはこの用途には弱すぎる。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

新しい胴体製作、今度はダクトテープで補強。

3回目試行。有望だったが、離陸場所の地形が悪すぎる。右に逸れて路肩にヒット、また破損。

修理して今度はダクトテープと梱包テープで胴体ほぼ全面ラッピング。これを最初からやるべきだった。適切な強度が得られ、その後数回の墜落でも胴体は壊れなくなった。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

複数回墜落で手持ちプロペラ4枚すべて破損。この試行では接着プロペラ使用。当然離陸で粉砕。

すでに破損した2枚のプロペラを接着してもう1枚作成。これでついにまともな離陸に成功!

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

しかし運は長続きせず、空中でプロペラまた破損。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

それでも、これが私のRC飛行機初体験として、完全Arduinoベース制御システムのコンセプト実証に成功したことはプロジェクト成功と見なせます。

飛行からわかること:送信機からの操作が荒すぎる。ジョイスティックがこの用途に適していない(可動範囲小、レスポンス悪)。

ゼロから作るArduino搭載RC飛行機 – 完全ガイド

対策として、右ポテンショメーターで操作応答性制御機能をプログラムに追加。左ポテンショメーターでラダートリミング機能も追加。

Arduino RC飛行機 コード

最後にこのArduinoベースRC飛行機のコードを見てプロジェクトを締めくくります。コードは前回チュートリアル(NRF24L01トランシーバーモジュールでサーボとブラシレスモーター制御)と同じです。

このArduino RC飛行機プロジェクトの完全コード:

/* Arduino RC Airplane == Receiver Code = 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 9 RF24 radio(3, 2); // nRF24L01 (CE, CSN) const byte address[6] = "00001"; unsigned long lastReceiveTime = 0; unsigned long currentTime = 0; Servo throttle; // create servo object to control the ESC Servo rudderServo; Servo elevatorServo; Servo aileron1Servo; Servo aileron2Servo; int throttleValue, rudderValue, elevatorValue, aileron1Value, aileron2Value, travelAdjust; // 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_MAX); radio.startListening(); // Set the module as receiver resetData(); throttle.attach(10); rudderServo.attach(4); // CH1 elevatorServo.attach(5); // CH2 aileron1Servo.attach(6); // CH3 aileron2Servo.attach(7); // CH4 pinMode(led, OUTPUT); // CH6 } 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 throttle - brushless motor with ESC throttleValue = constrain(data.j1PotY, 80, 255); // Joysticks stays in middle. So we only need values the upper values from 130 to 255 throttleValue = map(throttleValue, 80, 255, 1000, 2000); throttle.writeMicroseconds(throttleValue); // Adjusting the servos responsiveness travelAdjust = map(data.pot2, 0, 255, 0, 25); // Elevator control elevatorValue = map(data.j2PotY, 0, 255, (85 - travelAdjust), (35 + travelAdjust)); elevatorServo.write(elevatorValue); // Ailerons control aileron1Value = map(data.j2PotX, 0, 255, (10 + travelAdjust), (80 - travelAdjust)); aileron1Servo.write(aileron1Value); aileron2Servo.write(aileron1Value); // Rudder trimming function if (data.j1PotX > 127) { rudderValue = data.pot1 + (data.j1PotX - 127); } if (data.j1PotX < 127) { rudderValue = data.pot1 - (127 - data.j1PotX); } // Rudder control rudderValue = map(rudderValue, 0, 255, (10 + travelAdjust), (90 - travelAdjust)); rudderServo.write(rudderValue); // Monitor the battery voltage int sensorValue = analogRead(A3); float voltage = sensorValue * (5.00 / 1023.00) * 3; // Convert the reading values from 5v to suitable 12V i // 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 = 80; // Motors stops // the central point of the joystick is not starting point for the throttle, its at value of 80 instead of 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; }

解説: メイン機能を簡単に説明。詳細は前回チュートリアル参照。送信機からのデータ受信後、ジョイスティック1 Y軸値でスロットル制御。送信機からの80〜255値を、ブラシレスモーター制御用1000〜2000に変換。

エレベーター制御にはジョイスティック2 Y軸値を使用、85〜35の値に変換(サーボ角度度数法で直接指定)。ここにtravelAdjust変数(右ポテンショメーター位置依存)があり、ジョイスティックを最大まで倒してもサーボ可動量を制限して応答性を調整。

エルロンとラダーも同じ原理。さらに左ポテンショメーターデータでラダーのニュートラルポイント調整。

最後にanalogRead()と演算でバッテリー電圧監視LED制御。

以上です。特にRC飛行機製作・飛行経験者の皆様、コメント欄で感想をお聞かせください。初心者でこの世界に興味を持たれた方は、FliteTest YouTubeチャンネルをチェックすることを強くお勧めします。RCワールド学習に最高のリソースです。動画説明欄にリンクを貼ります。

このプロジェクトを楽しんで学んでいただけたら幸いです。質問はコメント欄で、Arduinoプロジェクト集もご覧ください。


製造プロセス

  1. 自作LUMAZOID:Arduino音楽ビジュアライザーDIYガイド
  2. 自宅で作るDIY宿題自動筆記マシン:AxiDraw風ペンプロッターの自作ガイド
  3. Arduino Nano RP2040で作るDIY Photoshopコントロールコンソール
  4. Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト
  5. Arduino、Google Cardboard、Bluetoothで作るDIY VRスケートボード
  6. Arduino Nanoで自作オシロスコープ(10Hz〜50kHz)128×64 LCD搭載
  7. DIY ArduinoラジオニクスEMR治療デバイスの構築
  8. Arduino NanoとSG90サーボで作るDIY 2軸モーションレーシングシミュレータ
  9. プログラマブル3軸ロボットアームキット:Arduino+Bluetoothでローカル/リモート制御
  10. Arduinoで作るポータブルRFIDドアロック - ステップバイステップガイド
  11. DIY 3軸CNCフライス盤:精密加工機を自作する