Arduino駆動の火星探査車パーサヴィアランス レプリカ自作ガイド
火星探査車パーサヴィアランスのレプリカ製作方法を紹介します。現在火星を探査中の実機にインスパイアされ、このローバーを誰でも作れるよう設計しました。学生、メーカー、メカトロニクスやロボティクス愛好家など、この動画/記事の手順に従えば誰でも自分の火星探査車を作れます。 動画または以下の記事をご覧ください。 このローバーの主な特徴を見てみましょう。ロッカーボギー懸架を採用し、凹凸のある地形でもスムーズに走行可能。車輪径の2倍までの障害物(岩など)を乗り越えながら、常に6輪すべてを地面に接地させられます。各車輪に独立したDCモーターを搭載し、前進/後進を駆動します。 4隅の車輪には個別のステアリングサーボモーターを装備。効率的な操舵とカーブ走行時のタイヤスリップ防止のため、アッカーマンステアリングジオメトリを実装。これにより旋回半径に応じて各車輪の速度と角度を計算します。 旋回時、内側のステアリング車輪は外側より大きな角度をとり、同時に内側車輪の速度を外側より遅くします。 制御には安価な市販RC送信機を使用。ローバー側のRC受信機がコマンドを受信し、Arduinoボードへ送信。この火星探査車の頭脳はArduino MEGAボードで、すべてを簡単に接続するためにカスタムPCBを設計し、Arduino MEGAの上にシールドのように装着できるようにしました。 カメラユニットにはFPVカメラを搭載。ステッピングモーターとサーボモーターで制御し、スマートフォンでリアルタイム映像を受信します。 なお、多くのパーツは実機の外観再現のための非機能パーツです。ロボットアームは未実装ですが、将来の動画で追加予定です。 それでは設計から電子部品配線、Arduinoプログラミングまで、製作プロセスを順を追って解説します。 この火星探査車は3DEXPERIENCE SOLIDWORKSで設計しました。これが今回の動画スポンサーです。 3DEXPERIENCE SOLIDWORKSは、3DEXPERIENCEプラットフォームを通じてクラウド機能を提供するSOLIDWORKSバージョンです。すべてクラウド上で動作するため、チームメンバーが世界中どこからでも、いつでもデータやモデルにアクセス可能。プラットフォームには便利な生産性・データ管理アプリも多数含まれます。 例えばProject Planningアプリでタスク管理、期限設定、進捗管理。3D MarkupアプリでノートPC、タブレット、スマホからモデルの閲覧・探索・メモ記入が可能。 ブラウザ上で動作するクラウドベース3Dモデラー「SOLIDWORKS xDesign」も別途提供され、SOLIDWORKSと併用も単独使用も可能。いつでもどこでも、あらゆるデバイスでモデリングできます。 何より嬉しいニュースは、今年後半からメーカー向け3DEXPERIENCE SOLIDWORKSが年間$99で利用可能になること。教育コンテンツを支援してくれたSOLIDWORKSに感謝します。 SOLIDWORKSと3DEXPERIENCEプラットフォームがあなたに合うか知りたい方は、以下のリンクをご覧ください。 3DEXPERIENCEを無料体験(特別リンク):www.solidworks.com/HTMTryNow 3DEXPERIENCE SOLIDWORKS詳細:www.solidworks.com/HTMLearnMore 3DEXPERIENCE SOLIDWORKS for Makers:www.solidworks.com/htm モデルに戻って設計プロセスを説明します。目標は実物のパーサヴィアランスに可能な限り近い外観にすること。NASA公式サイトに3Dモデルがあるので、それをダウンロードしてBlenderで開きました。 正面、上面、側面の3ビュー画像を撮影し、SOLIDWORKSにインポート。車輪径を130mmに設定したかったので、画像をこの寸法に合わせてスケーリング。 ここから幅、長さ、高さ、車輪間距離、ロッカーボギー懸架の寸法など、すべての主要寸法を取得。 これらの寸法と使用予定のDCモーター、サーボに基づき、3Dプリント容易で組み立てやすく、かつ実機に近い外観となるようパーツを設計。 ロッカーボギー懸架にはφ20mm丸アルミプロファイル、ベースフレームには20mm Tスロットアルミプロファイルを使用。 3DモデルはThangsで検索、ダウンロード、ブラウザ探索可能です: 3Dプリント用STLファイル: パーツの3Dプリントには、古いCreality CR-10と新しいCR-10 V3を使用。柔軟素材で車輪をプリントする場合、CR-10 V3のようなダイレクトエクストルーダー搭載機が必須です。 両機とも比較的安価ながら高品質なプリントが可能。興味があれば以下リンクからチェック: 関連記事:初心者・メーカー向けベスト予算オシロスコープ【2021年更新版】 プリント時はスライサーソフトの「水平展開(Horizontal Expansion)」機能を使用することが重要。私は-0.1mmを設定しました。これはプリント時のフィラメント膨張を補正する機能です。 これを使わないと、例えばφ20mmの穴が実寸約19.8mmになり、組み立て不能になります。 すべての3Dプリントパーツがこちら: 正直、プリント量はかなり多いですが、このユニークな外観を得るには唯一の方法。機能パーツのみプリントすれば時間を半分に短縮可能です。 このDIY火星探査車の組み立てに必要なコンポーネントリストです。電子部品リストは後述の回路図セクションにあります。 M4、M5、M6ボルトも各種長さが必要。完成したボルト・ナットリストは後述。金物店での調達も可能です。 アルミプロファイルの準備から開始。金属用手ノコでカットします。 ベース用Tスロットプロファイル10本、ロッカーボギー懸架用丸プロファイル8本を以下の寸法で用意。 Tスロットプロファイルフレームの組み立てには、専用コーナーブラケットとボルト・ナットを使用。トップとボトムフレーム完成後、サイドにロッカージョイント3Dプリントパーツ、前後に3Dプリントブラケットを取り付け、M3ボルトとTスロットナットで固定。 ロッカージョイントにはM5ボルトとナットを使用。フロントプロファイルからロッカージョイントまでの距離は134mm。 ロッカーボギー懸架のメインベアリングを圧入。ロッカージョイントシャフトをベースにM8ボルトで取り付けます。 シャフトにM8ナット用スロットがあり、ここでベースに固定。シャフト穴は7.5mmでボルトとタイトフィット。ボルト自体がローバー重量の一部を負担するため、3Dプリントシャフトを補強する構造です。これは全体で最も応力がかかる部分であり、プリント方向が強度を左右します。 最初、サポート不要な向きでプリントしたら失敗しました。 この場合主応力が層方向(弱い方向)にかかりますが、横向きにプリントすれば応力が壁面輪郭方向(強い方向)にかかるため、はるかに強固で破損しません。 ロッカーボギー懸架をホイールジョイントとモーターマウントとともにサブアセンブリとして組み立て、後でロッカーシャフトに取り付けます。 φ20mm丸プロファイルが通る穴はタイトフィット寸法なので、場合によってはヤスリやサンドペーパーで調整が必要です。 丸プロファイルに精密な位置で穴あけするため、まずプロファイルに直線をマーキング。 3Dプリントパーツを通してマーキングラインを穴に通し、両側の穴位置をマーキング。 反対側も同様に。2.5mmドリルで穴あけ後、M3ボルトでタップを切ります。 アルミはボルトより柔らかいため、ボルト自体でねじ切り可能。この方法で穴あけすれば、最終的にはすべてのパーツが正しい相対位置に配置されます。 ボギージョイントにも2個のベアリングとM8ボルトを使用。 ロッカーボギー懸架配置が完成したら、ステアリングホイールジョイントを組み立てます。ステアリングホイールジョイントパーツは2パーツをボルトで連結した構造です。 サーボマウント部とDCモーターマウント部の接続(実際のジョイント)には、2個のベアリングとM6ボルトを使用。 ボルト頭部側にサーボホーンを取り付け、3Dプリント製カプラーとM3ボルトで連結。 カプラーに六角スロットがあり、ここでサーボ動作をボルトに伝達。底側でもう一方のパーツをネジ込み固定。 M6ナットで固定。これでステアリングホイールジョイント完成ですが、後で底側にもM6ナットを追加し、2つのナットを相互に締め付ける必要があることに気づきました。 サーボからの動力はナットを介してDCモーターマウント部に伝達されるため、もう1つのナットでロックしないとジョイント全体が緩んでしまうからです。 もう片側のコーナージョイントも同じ手順。平らな面に置いたとき、3つのモーターマウントがすべてフラット(平行)なら正しく組み立てられています。 反対側も同様。見た目は同じでも、実際はミラーパーツ(左右対称)です。 これらサブアセンブリをベースフレーム/シャーシのロッカージョイントシャフトに取り付けます。その前に、シャフトにねじ込みインサートを入れます。 ハンダごてで簡単に圧入でき、確実なネジ穴が得られます。M4ボルト4本で懸架サブアセンブリを固定。 両側取り付け後、シャーシが自由に回転/倒れることに気づきます。ロッカーボギー懸架を機能させるには、ディファレンシャルが欠けています。 ディファレンシャルで両ロッカー同士とシャーシを連結。片側が上下すると反対側が逆方向に動き、ほぼ等しい接地圧を確保。シャーシのピッチ角は両ロッカーの平均になります。 ディファレンシャル組み立てに必要なパーツ: ディファレンシャルバーは長いため、3ピースに分割してボルト連結(小型3Dプリンターでもプリント可能)。バー中央で2個のベアリングとM8ボルトでピボット接続。 ディファレンシャルとロッカーの接続にはロッドエンドボールジョイント(M8)とM8ネジロッド(50mm)を使用。ネジロッドは片側M8ナット入り3Dプリントパーツ、もう片側ロッドエンドに接続。 3Dプリント ディファレンシャルリンクとロッドエンドの距離を約20mmに調整し、シャーシが水平になるようにします。ディファレンシャルリンクとロッカーレバーの接続には2個のベアリングとM5ボルトを使用。 反対側も同様に。これでロッカーボギー懸架完成。片側が上がれば反対側が下がり、常に全車輪が接地。シャーシは脚の動きの半分、つまり両ロッカーの平均ピッチ角だけ動きます。 関連記事:Arduinoロボットアームとメカナムホイールプラットフォーム自動運転 DCモーターを取り付けます。直径37mm、12V動作、ギアボックス出力50RPMのものを使用。 後で気づきましたが、50RPMはこのローバーには少し速すぎます。20または10RPM版を推奨します。 車輪をモーターに取り付けるためのシャフトカプラーを製作。 M3インサートナット(カプラー固定用)とM4ナット(車輪固定用)を圧入。ナット圧入時は接着剤も併用するか、インサートナットを使用して確実に固定してください。 車輪は2パーツ構成。タイヤ部分は柔軟フィラメントでプリント(必須ではない)、リムは通常PLA。 リムのスロットがタイヤにはまり込み、モーター動力を伝達。スロットに接着剤を少量追加してより確実に。M4ボルト4本で車輪をシャフトカプラー/DCモーターに固定。 ステアリングサーボモーターを取り付け。25kg·cmトルクのハイトルクデジタルサーボ、動作電圧4.8〜6.8Vを使用。M3ボルト4本で固定(サーボマウント3DプリントパーツのM3インサートナットにねじ込み)。 カメラユニットを組み立てます。カメラパン(水平旋回)用にNEMA 17ステッピングモーターを使用しましたが、他のモータータイプでも変更可能です。 モーター動力はM5ネジロッドで上部セクションへ伝達。モーター側は3Dプリント製シャフトカプラーで接続、反対側はベアリングと2個のナットで可動エレメントに固定。カメラチルト(垂直角度)用にはステアリング車輪と同じサーボを使用。 カメラユニットの多くのパーツは非機能で、実機外観再現用です。組み立てには各種M3ボルトとインサートナットを使用。 実際のFPVカメラも搭載。カメラユニットハウジングに取り付けるカスタムホルダーを製作。カメラは上部からアクセス可能で、スナップフィットカバーで閉じます。完成したカメラユニットの外観: このカメラサブアセンブリをシャーシ前右コーナーに取り付け。 ここで、残りの3Dプリントパーツ(実機外観再現用の非機能パーツ)を組み立てるか、先に電子部品を配線して動作確認するかの選択です。私は先にすべての3Dプリントパーツを組み立て、その後電子工作に進みました。 以下のパーツは実機外観再現用なので詳細な組み立て手順は割愛します。3Dモデルから接続方法を確認してください。 細部までこだわって設計し、見た目の良さに努めました。 これらのパーツも大型でプリントに時間がかかります。 取り付けの様子: ローバー中央の最後の2枚トップパネルはスナップフィット式。 これらはフードの役割を果たし、電子部品がこのエリアにあるため簡単に取り外し可能。 電子部品ホルダーは2つの3Dプリントパーツをボルト連結した構造で、シャーシのボトムフレームに取り付けます。 各モーターに必要な配線長を測定。モーターには直接ハンダ付け(適切なコネクターがなかったため)、熱収縮チューブで絶縁。 結束バンドで配線を整理・固定。 サーボモーターにはサーボ延長ケーブルを使用し、電子部品コンパートメントまで延長。電子部品マウントパーツにスロットがあり、そこから配線を中央へ通します。 全体的に配線は見えない部分を通すようにして、かなり綺麗にまとまりました。 関連記事:SCARAロボット | 自作Arduinoベースロボットの作り方 回路図で全接続を確認しましょう。 必要なコンポーネント: 6個のDCモーター駆動にはDRV8871 DCモータードライバー6個を使用。PWM制御対応、ピーク電流3.6Aまで対応。DCモーターは12V動作、定格電流1A、ストール電流3A。電源は3S LiPoバッテリー(約12V)。 サーボは4.8〜6.8V必要なので、DC-DCコンバーターで12Vから6Vに降圧。コンバーターは約8A対応品が必要(使用サーボはハイトルクでストール電流約2A)。カメラユニットステッピングモーター駆動にはA4988またはDRV8825ステッピングドライバーを使用。2個の抵抗で簡易電圧分割器を作り、バッテリー電圧を監視。 RC受信機はバックコンバーターからの6Vで駆動。FPVカメラとビデオトランスミッターはバッテリーから直接12Vで駆動。 電子部品を整理するため、このDIY火星探査車用カスタムPCBを設計。 このPCBはArduino MEGAシールドとして機能し、Arduino MEGAの上に直接装着可能。モータードライバーのほか、3.3Vレギュレーター、NRF24L01専用接続(将来的にこのモジュールで制御する場合用)、DHT22センサー接続、コンパス、I2C、シリアル通信、12V/5V/3.3V/GND接続も搭載。ローバー機能拡張を見据えた将来対応設計です。 PCB発注はPCBWay。Gerberファイルをアップロード、PCBプロパティ選択、リーズナブルな価格で発注可能。 デフォルトプロパティから変更したのはPCB色のみ(Arduinoボードに合わせて青色)。Gerberファイルは以下からダウンロード可能、またはPCBWayプロジェクト共有コミュニティから直接発注も可能。 DIY火星探査車PCB用Gerberファイルダウンロード: 数日でPCB到着。品質は素晴らしく、設計通り完璧。 PCB実装はラベル通りで簡単。底面のArduino MEGA接続用ピンヘッダーからハンダ付け開始、その後上面側。すべての接続にピンヘッダーを使用(後で変更しやすいため)。3.3Vレギュレーターと未使用Arduinoピンは今回ハンダ付けせず。 PCB実装完了後、Arduinoボルト2本で電子部品マウントパーツに固定し、PCBを装着。 各モーターをドライバーに接続し、PCBの所定位置に装着。サーボは対応するサーボピンへ、ステッピングドライバー用にはジャンパー1本で1/8ステップ分解能を選択。 無線通信にはFLYSKY RC送信機/受信機を使用。安価で良好な動作。 受信機をArduinoに接続するにはサーボ延長ケーブルを使用(VCC、GND、Signalの3線)。受信機とArduinoはI-BUSとシリアルポートで通信。受信機から送信機へデータを送る場合(バッテリー電圧監視など)、受信機のセンサーI-BUSを別のArduinoシリアルポートに接続。 バックコンバーターはボルト2本で固定。LiPoバッテリーはゴムバンド2本で固定(充電時に簡単取り外し可能)。 電源スイッチはローバー後右パネルに配置。この配線には20ゲージワイヤーを使用(ローバー全稼働時は数アンペア流れる可能性あり)。接続間違いだと発火の危険があるため、ダブルチェック必須。 最後にFPVカメラを12V電源に接続、ビデオ信号線をビデオトランスミッターに接続(これも12V駆動)。これで電子工作完了。 カバーパネルを戻せばDIY火星探査車のハードウェア完成。実はまだ「魂」を入れる、つまりArduinoプログラミングが残っています。 このDIY火星探査車プロジェクトのArduinoコードはこちらからダウンロード: コード概要 IBusBMライブラリでRC送信機からのデータを読み取ります。 これらの値を右旋回半径、左旋回半径、ローバー速度(0〜100%)に変換。 旋回半径「r」を使ってステアリング車輪角度と車輪速度を計算。 前述の通り、アッカーマンステアリングジオメトリで計算。これらの値でサーボを制御しますが、ServoEasingライブラリを使用して滑らかな動作を実現。 DCモーター制御には コード自体は複雑ではありません。ローバー自体に複雑な機能がないためです。今後、GPSナビゲーション、各種センサー、ロボットアーム、土壌採取機構などを追加予定です。 このプロジェクトを楽しんでいただけたら幸いです。質問はコメント欄で、Arduinoプロジェクト集もご覧ください。概要






DIY火星探査車 3Dモデル







火星探査車レプリカパーツの3Dプリント



DIY火星探査車 パーツリスト
ローバーの組み立て



ロッカーボギー懸架の組み立て
























火星探査車用モーターの組み立て





カメラユニットの組み立て





ローバー残り部分の組み立て





電子工作



DIY火星探査車 回路図

カスタムPCB










DIY火星探査車 プログラミング – Arduinoコード
// Reading the data comming from the RC Transmitter IBus.loop(); ch0 = IBus.readChannel(0); ch1 = IBus.readChannel(1); ch2 = IBus.readChannel(2); ch3 = IBus.readChannel(3); ch6 = IBus.readChannel(6);// Convertign the incoming data // Steering right if (ch0 > 1515) { r = map(ch0, 1515, 2000, 1400, 600); // turining radius from 1400mm to 600mm } // Steering left else if (ch0 < 1485) { r = map(ch0, 1485, 1000, 1400, 600); // turining radius from 600mm to 1400mm } // Rover speed in % from 0 to 100 s = map(ch2, 1000, 2000, 0, 100); // rover speed from 0% to 100%void calculateMotorsSpeed() { // if no steering, all wheels speed is the same - straight move if (ch0 > 1485 && ch0 < 1515) { speed1 = speed2 = speed3 = s; } // when steering, wheels speed depend on the turning radius value else { // Outer wheels, furthest wheels from turning point, have max speed // Due to the rover geometry, all three outer wheels should rotate almost with the same speed. They differe only 1% so we asume they are the same. speed1 = s; // Inner front and back wheels are closer to the turing point and have lower speeds compared to the outer speeds speed2 = s * sqrt(pow(d3, 2) + pow((r - d1), 2)) / (r + d4); // Inner middle wheel is closest to the turning point, has the lowest speed speed3 = s * (r - d4) / (r + d4); } // speed value from 0 to 100% to PWM value from 0 to 255 speed1PWM = map(round(speed1), 0, 100, 0, 255); speed2PWM = map(round(speed2), 0, 100, 0, 255); speed3PWM = map(round(speed3), 0, 100, 0, 255); } void calculateServoAngle() { // Calculate the angle for each servo for the input turning radius "r" thetaInnerFront = round((atan((d3 / (r + d1)))) * 180 / PI); thetaInnerBack = round((atan((d2 / (r + d1)))) * 180 / PI); thetaOuterFront = round((atan((d3 / (r - d1)))) * 180 / PI); thetaOuterBack = round((atan((d2 / (r - d1)))) * 180 / PI); }// Servo motors servoW1.startEaseTo(97 - thetaOuterFront); servoW3.startEaseTo(97 + thetaOuterBack); servoW4.startEaseTo(94 - thetaInnerFront); servoW6.startEaseTo(96 + thetaInnerBack);analogWrite()でPWM信号をドライバーに送信。// Motor Wheel 1 - Left Front analogWrite(motorW1_IN1, speed2PWM); // PWM value digitalWrite(motorW1_IN2, LOW); // Forward
製造プロセス
- Windows IoT Core搭載RoverをRaspberry Pi 2で構築 - 初心者から上級者まで
- Arduinoオーディオ周波数検出器 – 高感度サウンドモジュールで最大音量ピークの周波数を測定
- Arduino三目並べ:MAX7219 LEDマトリクスと段ボールケースで自作
- ArduinoとNokia 5110ディスプレイで自作電圧計:ステップバイステップガイド
- SparkFun 7セグメントディスプレイで作る信頼性の高いArduinoカウントダウンタイマー
- Arduinoで自作RCポルシェカー:ステップバイステップガイド
- Arduino UNOで作る信頼性の高いスマートエネルギーモニター – ステップバイステップガイド
- Arduinoで作るポータブルRFIDドアロック - ステップバイステップガイド
- Arduino NanoとTCS3200センサーによる物体の色検出
- DIY Arduino身長測定デバイス:正確で簡単に作れる
- Arduino Nanoパルス誘導式金属探知機:DIYキット&ガイド