Tag Archives: 草刈りロボット

芝刈りロボットへの道 ~試作版の車体製作~

熊本は梅雨も明け、今年も地獄の暑さが続いております。
庭では芝生も雑草もすくすく育っており、何とか楽して芝生を刈りたいという理由でモチベーションも高まり、芝刈りロボットの製作を進めています。
(でも完成する頃には涼しくなっていそうだなぁ。来シーズンには役に立つのか?)

という事で、今回は芝刈りの前段階としてArdupilotを試作ローバーに載せて制御するテストを進めます。

全体の回路はこんな感じ。

フライトコントローラーであるPixHawkを中心に、GPS受信機、モーター、ESC、DroneBridgeを載せているのはこれまでの投稿に書いた通りです。
そこにRC受信機、安全スイッチを載せ、電源は3セルリポおよび以前製作したMP1584のDCDCコンバーターを載せています。

バッテリーは3セルなので定格11.1V。これをモーター電源(定格12V)とし、更にDCDCコンバーターで5Vに落としてPixHawkに供給します。
バッテリー容量は今の所600mAhですが、芝刈りモーターを回す段階になったらもっと容量の大きなものに変更する予定です。

車体(試作版)を作る

塗装合板を適当なサイズに切ったものをベースにして各部品を載せていき・・・


前輪(駆動輪)は合板を丸く切った板に3Dプリントしたハブをねじ止めしてモーターに取り付けます。合板だけだとスリップしたので(当たり前ですよね)初期の頃3Dプリンターで使っていたタイミングベルト(5mmピッチ)をボンドG17で貼り付けました。

その後、コイツも滑るので止めました。

後輪はキャスターです。もうちょい径が大きい方が良さそうですが、まずはお手軽なヤツで。。。

後輪はキャスター1個(方向変えれるやつ)

電気的なパーツはテープでベタベタ貼って搭載。
モーターの影響か、PixHawkの磁気コンパスが異常値を出したので段ボール等で高さを稼いでいます。またGPSアンテナも低いとRTKがFIXし難かったので角材の上に載せました。

走行テスト。

何度か走らせたところ、駆動輪にタイミングベルトを貼り付けた事でスリップは減ってはいるのですが、それでも時々滑って進めなくなります。
そこでクローラー(キャタピラ)の使用を考えたのですが手ごろな価格で入手できるものが見当たらないんですよね。 何とか自作できないか(蝶番をつないだりとか)考えましたがいい方法が思い浮かびません。

という事で駆動輪の径を大きくし、幅も30mmに広げた車輪を3Dプリントして幅広のタイミングベルトを貼り付けて試します。

これはFusionで描いた図

これでかなり走破性は上がりましたね!!
なんか赤色のホイールがイイ感じでもあります。電装回りはまだテープだらけですが。

改良版駆動輪を取り付けたところ

MissionPlannerでウェイポイントを設定して自動で走らせる

庭にウェイポイントを設定して走らせたところ、初期設定のままだと結構大回りになってしまいました。
そこでMissionPlannerのシミュレーションモードで走らせたところ、これでも大回りをします。
シミュレーションの段階で思った動作をしなけりゃ実車でもまず無理ですよね。

シミュレーション上で自動走行した軌跡。だいぶ大回り。

という事でここからはシミュレーションモードで確かめながらArdupilotのパラメーターを色々と変更していきます。

パラメータ調整

結果ですが、Ardupilotのパラメーターの内、関係しそうな下記を変更しました。

WP_RADIUS
これはウェイポイントにどこまで近づけば到達したと判断するかというパラメーターなので、デフォルトの3mだと芝刈り目的では遠すぎます。
折角RTKで測位しているので、ここは0.1mに変更しました。

WP_PIVOT_ANGLE
進行方向と目標方向の差が指定した角度を超えていたら車体をその場旋回させる設定らしいです。車体の構造が左右の回転差で向きを変えるskid式なのですが、これがデフォルトの0だとその場旋回してくれないそうです(少しはやっているように見えるのが謎ですが)。
5度より大きな値をセットしないと無効という事なので6度に設定。

WP_SPEED
ウェイポイントに向かう時の速度設定。
0.5m/Sに設定しました。もう少し遅くても良いかもしません。
(実はこれは前の段階で設定していた)

CRUISE_SPEED、CRUISE_THROTTLE
目標の速度とその速度を出すのに必要なスロットルの初期値。
ローバーはCROUISE_SPEEDの巡行速度を目指してまずスロットルをCRUISE_THROTTLEの値に設定し、その後CROUISE_SPEEDに合う様に微調整するそうです。
0.5m/S、50%としました。
なおウェイポイントを巡回する時はWP_SPEEDの設定値が優先だそうです。その場合のスロットルはどうやって決めるのかという疑問があるので、まずはWP_SPEEDとCRUISE_SPEEDを同じ値にしておきました。

ATC_DECEL_MAX
減速の制限値。デフォルトの0にしておけば加速の制限値と同じになるそうですが、シミュレーターでは何故か行き過ぎる現象が出たので2m/SSに変更しました(実車では改めて試す必要がありそう)。

PSC_POS_P
経路外れ時の補正強度。(多分PはPIDのP)
シミュレーター上ではかなり大きめの値にしないと最短ラインから外れ気味だったのでデフォルト0.2に対し1.0に変更しました。これも実車では再調整が必要そうですね。

他にも調整すべき箇所がありそうですが、これでだいぶマシになりました。

上記パラメーターを変更してマシになった走行の様子。。。

芝刈り機構検討

実車でのパラメーターはまだ調整中ですが、並行して芝刈り機構の搭載を検討しています。
当初はリサイクルショップで電動芝刈り機を買ってくる事を考えていましたが中々手頃なものが見つかりません。

そして行き着いたのがこれ。アルミスの「草かるぞう」という名前の小型電動刈払機です。
(最初「アルテミス」かと思ったら「アルミス」でした)
これ近所のホームセンター「ニシムタ」のセールで3999円で売ってた物です。
Amazonとかで見るよりかなり格安で、この値段ならヘタに中古の電動芝刈り機を買ったりパーツを揃えて自作するよりも安くつきそうです。

という事で、新品の「草かるぞう」を買ってきました。バラす前に少し草を刈ってみたところ結構便利です。
このまま使いたくもなりましたが結局バラしてしまいました。

中身はDCモーターが入っていて、電気的にはバッテリーとの間にスイッチがあるだけです。

次回はこれを車体に取り付けていこうと思っています。

Drone-Bridge for ESP32を使ってみる。

前回RTK基準局を稼働させたので、いよいよ草刈りロボットを検討していきます。
まだまだ道は遠いですが。。。

第一段階としてArdupilotで動作するローバーを作って庭を走らせてみようと思います。これにはPC上で動くGCS(Missionplanner)とフライトコントローラー(PixHawk)との間を何らかの方法で無線接続する必要があります。

色々と方法はあると思いますが、比較的安価なESP32でできないかと調べたらDrone-Bridge for ESP32というのに行き当たりました。

ドキュメントによるとDrone-Bridge for ESP32はGCSとフライトコントローラー間をシリアルブリッジ、無線LAN、ESP-NOW等で接続できる様です。
また動作できるマイコンはESP32,ESP32-C3,ESP32-C5,ESP32-C6が使えるそうなので、手元にあるマイコンボードで直ぐに試す事が出来そうです。

インストールでハマる。

では手始めに手元にあったESP32 Devkit基板に書き込んでみましょう。
ESP32 Devkit基板はこんなのです。(いつだか3枚959円で買った微妙に怪しい基板)。


Drone-Bridge ESP32のドキュメントによるとブラウザーで動作するフラッシュツールを使うと手軽に書き込めるようです。→ https://drone-bridge.com/flasher/
PCとESP32基板間をUSBケーブルで接続してこのURLにアクセスすると下のフラシュツールが現れたので・・・

書込みを試したのですが「Not connected.」と言ってきます。

BOOT-RESETボタンを順番通り押したり、ブラウザーをChrome/Edge両方試したり、基板もPCも交換したけれど変化ありませんでした。

ならばバイナリーをダウンロードしてESPtoolで書き込みをと考えましたが、バイナリーのダウンロード先が見つからないのです。
フラッシュツールは内部でダウンロードしている筈なのでどこかにはあると思うのですが・・・

あきらめてビルドする。

という事でビルドする方が早かろうという考えに至りました。
で、やってみたのですが、こちらも下記の様に色々ありました。

  • ESP-IDFv6.0(この時点の最新)でビルド
    →Ninja、npm等が入っていないエラー、日本語パス名が悪さしているらしきエラーが発生。これらは順に解決していったのですが、最後にprotocomm_security1′ undeclaredというエラーが発生。。
    このエラーはChat-GPTさんによると古いESP-IDFのAPIを使っているためで、ESP-IDFをVer4番代に下げろと。。。
  • ESP-IDFv4.4.6でビルド
    →今度はVer5.3以上でやれというメッセージを含むエラー。
  • ESP-IDFv5.5でビルド
    →すんなり完了。

という事で上手くいったビルド手順を整理すると・・・

https://dl.espressif.com/dl/eim/からeim-gui-windows-x64.exeをダウンロードして実行。
インストーラーが開くのでメッセージに従って進んで行き、ターゲットチップ選択ページでESP32に加えて後で試したいESP32-C3を選択。

バージョンのところでV5.5.4を選択。


あとは大体基本通りにインストール。
インストールが完了するとデスクトップにESP-IDF 5.5 PowerShellのアイコンが出来ているのでダブルクリックするとターミナルが現れ、この中で作業すれば一通りの環境が設定済になっています。

ターミナル内で適当なディレクトリ(パスに日本語が無い方が無難)に移動して、まずGithubからソース一式を取ってきます(gitはインストール済みの前提)。

> git clone https://github.com/DroneBridge/ESP32

取ってきたディレクトリの下にあるDroneBridge/ESP32に移動して・・・

> cd DroneBridge/ESP32

ビルドを実行!!

> idf.py build

これでビルドが始まりますが、結構時間がかかりました(PCが古いからか・・・?)。
ビルドが完了したらPCとESP32 Devkit基板とをUSBでつないで下記コマンドで書き込みます(COM番号はそれぞれの環境での番号)。
この時、ESP32マイコンが持っているMACアドレスが表示されるので控えておくと後で役立つかもしれません。

idf.py -p COM4 flash


設定

書き込みが完了したらリブートするとWi-Fiアクセスポイントモードで立上がります。
つまりPCのWi-Fi設定を開くとDroneBridge for ESP32という名前のWi-Fiアクセスポイントができているので、ここに接続して設定を行うのです。
まず上記アクセスポイントを選択し、パスワード:dronebridgeでWi-Fi接続します(このときWindowsであればインターネットに未接続的なメッセージが出るけど気にせず先に進みます)。
そしてブラウザーでhttp://dronebridge.local又は192.168.2.1に接続すると下の設定画面が現れます。

私の場合、当面は自宅のWi-Fiに接続するので下記の設定に変更しました。

  • ESP32 Mode → Wi-Fi Clinent Mode
  • SSID → 自宅環境のSSIDに設定。
  • Password → 自宅環境のパスワードに設定。
  • UART TX GPIO → 18
  • UART RX GPIO → 19
  • UART RTS GPIO → 22
  • UART CTS GPIO → 23
  • UART baud → 115200

UART信号のGPIO番号は使っているチップ(ESP32,ESP32-C3…)によって制限があります。上記設定は動作していますが、他のGPIOピンを使う場合は公式サイトの説明を読む方が良いです。

再起動後、自宅Wi-Fiに接続するIPアドレスとか・・・

以上の設定が終わったら[SAVE SETTINGS & REBOOT]ボタンを押せばリブートします。動作モードをWi-Fi Client Modeに変更したので既に自宅のWi-Fiに接続している筈なのですが、上記の方法だとDHCPからIPアドレスを割り振ってもらうので何番になるかが分かりません。私の場合はDHCPサーバーのログを見てIPアドレスを調べましたが、書込時に表示されたMACアドレスに対するIPアドレスをDHCPサーバー側で固定する方が良いかもしれません。
もしDHCPサーバーを弄れない場合は地道にpingを投げる等して調べる必要があります。
なおDroneBridge設定画面の[Advanced Wi-Fi Settings]をクリックすると(DHCPを使わず)IPアドレス固定の設定がでてくるので、ここで設定してしまうという手もあります。

DroneBridgeのIPアドレスが分かったらブラウザーで指定して開くと先程の設定画面が(変更を反映した状態で)表示されます。

フライトコントローラーと接続する

DroneBridgeとフライトコントローラー(PixHawkのTELEM1コネクタ)との接続には下記の配線でケーブルを作りました。

PixHawkESP32(Devkit)
1pin(VCC)V5
2pin(TX)RX(GPIO19)
3pin(RX)TX(GPIO18)
4pin(CTS)RTS(GPIO22)
5pin(RTS)CTS(GPIO23)
6pin(GND)GND

動作確認の為ブレッドボードを使って接続してみます。

ところで私の使っているPixHawkはAliexpress等で比較的安く売られているPixHawk2.4.8と書かれた物ですが、コネクタの型がPixHawkの公式マニュアルにるJST-GHと違ってMolex-PicoBladeでした。
GH買って挿せなかったのでPicoBladeを買い直したのは私です。

MissionPlannerと接続する

ここまでくるとMissonPlannerからDroneBridgeを経由してフライトコントローラーに接続できます。
下図の様にポート選択欄をUDPCIに、通信レートを115200bpsに設定して[接続]ボタンを押します。

すると接続先のIPアドレスを聞いてくるので上で調べた(又は設定した)アドレスを入力し、次にポート番号を聞いてくるので14550(これは固定)を入力して[OK]を押すと接続できます。

ESP32-C3版

Devkit基板+ブレッドボードのままだと引っ掛けて壊しそうなのでちゃんとした形で作り直したいです。
DroneBridgeはESP32-C3もサポート対象になっているので、昨年ラジコンミニ四駆を作った時の基板を流用して実装してみます。

ミニ四駆用RC受信機

この基板は単三電池2本で動作させるため、サーボ電圧用に一旦5Vに昇圧していましたが、このDCDCコンバータは実装せず直接5Vを供給します。またモータードライバーやピンヘッダも不要となります。

これら不要な部品を除外して実装し、電線を引き出してコネクターを取付けました。

Devkit&ブレッドボード式よりもだいぶスッキリした。

配線は次の通りです。

PixHawkESP32-C3(RCミニ四駆受信機改)
1pin(VCC)5Vライン
2pin(TX)RX(GPIO0)
3pin(RX)TX(GPIO1)
4pin(CTS)RTS(GPIO21)
5pin(RTS)CTS(GPIO3)
6pin(GND)GND


ハードウェアが出来たのでファームをビルドして書き込みます。

まずESP32-C3用にビルドして・・・

> idf.py set-target esp32c3 build

書き込む為のPCとの接続ですが、ESP32-C3の場合はUSBを直接接続できます(USB-シリアル変換IC不要)。
このあたりの詳細は以前「ミニ四駆をラジコン化 ~その4~ 回路とプログラム」の投稿に書きました。

接続が出来たら下記コマンドで書込みます(COM番号はそれぞれの環境での番号)。

 idf.py -p COM5 flash

ESP32-C3版の設定

ESP-32 Devkit版と同じ様にして接続し、下記設定しました。

  • ESP32 Mode → Wi-Fi Clinent Mode
  • SSID → 自宅の環境に設定。
  • Password → 自宅の環境に設定。
  • UART TX GPIO → 1
  • UART RX GPIO → 0
  • UART RTS GPIO → 21
  • UART CTS GPIO → 3
  • UART baud → 115200

という事で・・・

ESP32-C3にしてコンパクトになりました。製作費も安い(というか全て手持ち部品)ですしね。。。