DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

自作クローラ用コントローラーの開発

 前回披露しましたこちらのクローラーロボット

dreamerdream.hateblo.jp

ここで使っていたコントローラーは

  • 片手で操作できる
  • 軽い

ということを念頭にオリジナルで設計したものです。

 

「ラジコンのコントローラー」といえば、このようなカッコイイものですが↓

<よくあるプロボ>

<サーキットカー等のプロボ>

 

「片手で操作できない!」という欠点があります。

 

今回このブログでご紹介するにあたって、どうしても片手で操作してもう一方の手では動画を撮りたいのです!!

 

 

ということで

片手で操作を簡潔できるものとしてジョイコンを使うというのが1つの方法です。

これなら片方の手でスピードも方向も一本の指でコントロールすることができます。スバラシイ!

 

ですが・・・、手元にジョイコンが無ぇ!

手元にあるのは、こういうツマミ式ボリュームと

スライド式ボリューム 

それに各種スイッチ

 

 

出来るだけ手元にある材料を駆使して片手で操作可能なコントローラーを作ることを目指します。

そもそも初めての無線コントローラー作成。出来るかどうかわからんので新たに部品を買うというのは正直プレッシャー・・・

 

 

サイズは、赤外線温度計を参考にしました。

片手で容易に握れます。

重量も電池をグリップに含められると軽いハズです。

 

操作性は、電動工具を参考にしました。

インパクトドライバーやドリルドライバーのトリガーはアクセルとして使えそうです。正/逆回転方向の切り換えも片手でスイッチ切り替えができます。 

 

 

そして作り出しました^^v 

 

上記全ての条件を満たして〜

右手、左手どちらでもハンドル操作が可能!

じゃんっ!

f:id:DreamerDream:20191221101146p:plain

何とも奇天烈な型になりましたが、上の穴は拡張機能を追加するための穴で特に意味は無いです。

 

グリップには単三電池2本が収まります。

親指で操作するハンドルをグリップ手前に付けることで左右どちらの手でも同じように操作出来ます。

 

そして、一番苦労したのがトリガーのカバー!

 

「そこ??」ってツッコミはお待ちください。

こうやってカバーを開けて固定すると電源が入る仕様なのです。カッコイイでしょ?

f:id:DreamerDream:20191221101857p:plain

トリガーカバーを開けるとインジケータランプが点灯してWiFiの接続状態を確認できます。

一番左が点滅状態によって接続状況確認できるランプ、右側二つがWiFiの強度確認ランプです。

電波強度確認は遠隔操作をするにあたって無くてはならない条件です。

f:id:DreamerDream:20191221101947p:plain

 

気になる中身はESP32モジュールで構成しています。

ESP32はArduinoの同じ言語で書けて、WiFiやアナログ入力など今回欲しい機能を全て搭載して単三2本で動いて、しかもArduinoより安いというバケモノマイコンです。

f:id:DreamerDream:20191221102134p:plain

配線がこんなにツメツメですが3Dプリンターで設計した通りなのでちゃんと収まります。

すごいぞ、3Dプリンター!

※ESP32には単三電池2本で稼動させる時に苦労させられましたが…

<過去記事>

dreamerdream.hateblo.jp

 

プログラム内容は

WiFiを確立させて、各アナログ入力値をそのまま送信するだけ」

というなんとも簡単なプログラムです。

あとはクローラー本体のラズパイに制御を委ねるのでマイコン事態に複雑な計算をさせることはありません。アナログ入力値をひたすら送信し続けてます。

ESP32のアナログ入力はなんと12ビット(Arduinoが10bitなのでなんと精度は4倍!)でしかも16チャンネルもあります(ArduinoだとArduinoMicroで精々12チャンネル)。

今回の用途にはピッタリすぎる(オーバースペックか・・)マイコンです。

 

そんなこんなで完成したのがコチラの動画です。

うーんバッチリ!


自作クローラ 紹介動画

 

ということで、なかなか使えるコントローラーになりましたので(自画自賛)このコントロールレイアウトいいですよーというご紹介でした。

3Dプリンタ製自作クローラーの完成疲労・・・

自作クローラ、ついに本体が完成しました!

f:id:DreamerDream:20191219145311p:plain

ステッピングモーター採用、木製履帯、ラズパイ3搭載でバッテリーを除く乾燥重量は約3.6Kg。

今回初めての自作ラジコンなので、なんやかんやで約2ヶ月近くもかかった大作です。長かった・・・

 

<最初の構想の記事>

dreamerdream.hateblo.jp

 

 

これを動作実験するのですが・・・

あいにく持ち合わせのバッテリーが乾電池しかありません・・・凹

しかもヘタッたやつです。チェックするとギリギリのOKライン・・・orz

f:id:DreamerDream:20191219145322p:plain

このヘタッた乾電池8本では12Vに到達しない状態です。ラズパイ3とステッピングモーターがこれで動くのか???

とものすごい不安…、

 

しかーし!買いに出るのも煩わしいのですよ!というか、すぐに実験したい!(おいっ)

のでそのまま試走することにします!

 

がんばれー!乾!電!池!!

 

まずは、オープニングです!大丈夫!ちゃんと動いてますよ!!

クローラだけでなく、コントローラーももちろんお手製です。


自作クローラ 紹介動画

 

<お手製コントローラーのご紹介>

dreamerdream.hateblo.jp

 

 

走行しながら緩旋回で方向転換します。


自作クローラー 走行テスト2 緩旋回

 

超信地旋回も出来ます。


自作クローラー 走行テスト3 超信地旋回

 

バッテリーのパワーが無さ過ぎてスピードはコレぐらいが限界・・・もうラズパイから「ムリムリムリ!」って悲鳴が聞こえます。

動かす度に冷却ファンが電流不足で止まります・・・凹


自作クローラー 走行テスト4 バッテリー不足

これ以上出すと脱調しちゃう・・

 

本当はもっとスピード出るんですよ!

外部電源でのテスト


自作クローラー 走行テスト5 外部電源

 

超信地旋回だって!って、こんなことしたらカーペットがヤバイ。


自作クローラー 走行テスト6 超信地旋回

 

今後、このクローラマシーンをベースに機能を追加搭載してオリジナルマシーンを完成させていきます。

 

ということで、次の課題はバッテリーです。

外部電源の動画に載っていますが、カメラも搭載予定ですのでより多くの電力が必要になります。 

カーバッテリーは重そうだし、実験のために高いバッテリーは買えないし、2000円ぐらいのバイクのバッテリーあたりが良いかしら?

 

 追記:上記のバッテリーで走行テストしました↓

dreamerdream.hateblo.jp

 

 

ちなみに、今回作ったような「キャタピラ走行して遠隔でカメラ映像が見れるラジコン」が欲しければ、今どき1万以下であるので自作に興味が無い方であれば買っちゃった方が手軽で高性能なものが手に入ります。

 

クローラーモジュールの作り方>

dreamerdream.hateblo.jp

 

 

自作クローラー 制御基板の廃熱システムを作る

以前、クローラモジュールの片側の走行テストをしてみて結果が上々でしたので、

<クローラモジュールの走行テスト>

dreamerdream.hateblo.jp

 

このクローラモジュールをもう一体作って組み合わせ、悪路を自由に走れる自作クローラーにするべく制御システムを組んでいます。

(しかも無謀にも無線で制御することを目指しています)

f:id:DreamerDream:20191211142515p:plain

 

今回は制御基板を水やホコリ等から保護するためのケースを3Dプリンターを使って作りました。

モータードライバーとラズパイからの熱をケースからうまく廃熱させるように少し工夫しました。

 

一般的に機械の廃熱、一般住宅の換気に利用されている方法が「第三種換気」と呼ばれる方法で、ファンで内部の熱を排気して、ケースの隙間から自然に空気を取り入れる方法です。

PCのファンもこのような方法が多いようです。

f:id:DreamerDream:20191218131032p:plain

この換気方法は安価に実現出来るのですが、常に内部が負圧(気圧が低い状態)で吸気を自然吸気に頼っているため、

f:id:DreamerDream:20191218131305p:plain

ホコリもありとあらゆる穴から侵入してきます。

 

今回作ったマシンは、あくまで悪路の走破も想定したクローラーマシンですから、このような換気方法で、もし異物が侵入した場合には基板に致命的なダメージを受けかねません。

 

そこで、今回採用したのが「第二種換気」という、ファンで吸気させて排気を自然にさせるという方式です。

f:id:DreamerDream:20191218131448p:plain

こちらもファンをそのまま取り付けただけではホコリ等が侵入しますが、

内部が常に正圧(気圧が高い状態)になるため、吸気口以外からのホコリや水の侵入を防ぐことが出来ます。 

f:id:DreamerDream:20191218131711p:plain

唯一のホコリの進入路である吸気口さえフィルターで塞いでしまえばホコリの侵入を防ぐことが出来ます。

それに加えて、吸気口をダクトを介して下向きに設けることにより、大きな異物は重力によりフィルターにまで到達させずに除去することが可能になります。

f:id:DreamerDream:20191218132711p:plain

そんな形状が素人工作で作成可能なのか?

それが、3Dプリンターを使うと可能になるのです!!

 

<作ったケース 右奥の円形に曲がっている下が吸気口>

f:id:DreamerDream:20191218131911p:plain

 

フィルターは上図のように吸気口にピッタリと貼付けても良いのですが、

せっかくダクトがあるのでこのように内部に折り曲げて設置することにしました。

f:id:DreamerDream:20191218133153p:plain

こうすることでフィルターの表面積が増え、吸気の空気抵抗が減らせることと、高さを付けることでより異物のフィルターへの到達度を減らせるというメリットが生まれます。

 

<フィルターの作成>

フィルターを折り曲げるための芯はこれもまた3Dプリンターで作り、フィルターは使い捨てマスクの不織布を利用しました。

f:id:DreamerDream:20191218133422p:plain

このように折り曲げてセットします(実際はもう少し張ります)

f:id:DreamerDream:20191218133532p:plain

吸気口から見ると結構奥行きがあり、空気の通りも良いです。

f:id:DreamerDream:20191218133606p:plain

 

 

完成間近の基板です。

f:id:DreamerDream:20191218130757p:plain

複雑な形状を寝ている間に出力してくれている3Dプリンターは本当に便利なのでお勧めです。

dreamerdream.hateblo.jp

 

 

今回は、ひとまず「遠隔操作で走ること」を第一目標としています。

次回は走行テストです。

dreamerdream.hateblo.jp

 

自作クローラー RaspberryPiのソフトウェアPWMを使ってステッピングモーターを使う

ラズベリーパイ2以降のモデルにはLEDの制御やサーボモーターの制御に適した「PWM制御」がハードウェア的に可能なピンが4つあります

チャンネル0:GPIO12、18

チャンネル1:GPIO13、19

それぞれのチャンネルの周波数は別でコントロールできるようですが、いかんせん情報が少なくライブラリ使ったりと面倒くさいのです。

<参考>

Raspberry PiのハードウェアPWMをpigpioで出力する - Qiita

 

ソフトウェアPWMであればGPIOポートも選びません。

赤外線リモコンならともかく、(赤外線リモコンは38kHzという高周波でピッタリ変調しないと認識しないからソフトウェアPWMは不向き)

<過去記事> 

dreamerdream.hateblo.jp

 

ステッピングモーターのPWM程度なら低周波だしソフトウェア制御で充分じゃない?」

ということでとりあえず個別に周波数を制御できるのか実験してみることにしました。

 

制御はドライバICのSTEPにPWMを放り込むだけです。

<ドライバIC>

 

今回の実験は、自作のクローラーの利帯を左右自由に動かすための回路動作テストも込めています。

f:id:DreamerDream:20191211142515p:plain

 

<過去記事>

dreamerdream.hateblo.jp

前回の試走ではArduinoを使ってボリューム値からPWMを作っていました。 

有線で左右制御出来るプログラムにしていましたが、「どうせならワイヤレスでコントロールしたいぞ!」という欲が出て来て制御をラズパイに変更することにしました。

 

<実験結果> 


ラズパイ2でのソフトウェアPWMを使ったステッピングモーター制御

充分に制御出来ているようです。

 

サーボモーターの場合は一定の周波数(Hz)を保ったまま、HIGH-LOWの比率(DUTY比)を制御するのですが、ステッピングモーターはDUTY比は50%のまま、周波数(Hz)を制御します。

 

<今回のテストプログラム>

import RPi.GPIO as GPIO #GPIO制御ライブラリ
import time
import atexit

R = 20 #GPIO20が右モーター
L = 21 #GPIO21が左モーター
DUTY = 50.0 #Duty比は50%
ENABLE = 16 #モータードライバーのEnableピン制御

top = 1000 #最高1000Hz
bottom = 50 #最低50Hz

 

def init():
  GPIO.setmode(GPIO.BCM)
  GPIO.setup(R, GPIO.OUT)
  GPIO.setup(L, GPIO.OUT)
  GPIO.setup(ENABLE, GPIO.OUT)

  atexit.register(end)

 

def end():
  GPIO.output(ENABLE, GPIO.HIGH)

  GPIO.cleanup()

 

def main():

  GPIO.output(ENABLE, GPIO.LOW)#ドライバーを立ち上げる

  p_r = GPIO.PWM(R,bottom) #初期周波数を設定
  p_l = GPIO.PWM(L,bottom)


  p_r.start(50)#Duty比を指定してPWMスタート
  p_l.start(50)


  for i in range( top -bottom ):
    p_r.ChangeFrequency(top - i)#周波数の変更
    p_l.ChangeFrequency(bottom + i)
    print(i)
    time.sleep(0.05)

  for i in range( top -bottom ):
    p_r.ChangeFrequency(bottom + i)
    p_l.ChangeFrequency(top - i)
    print(i)
    time.sleep(0.05)


  p_r.stop()#PWM制御終了
  p_l.stop()

  end()


if __name__=='__main__': # if script

  init()

  main()

 

ということで、このままソフトウェアPWMを使ってクローラーの開発を続けることにします。

 

次回↓ 

dreamerdream.hateblo.jp

ステッピングモータードライバー「A4988」チップのヒートシンクを上手に貼り付ける方法

ステッピングモーターを使う工作を以前ご紹介していました。

dreamerdream.hateblo.jp

 

近年の3Dプリンターブームもあって、5個で1000円以下の「A4988」という名前で出ているステッピングモータードライバー(実際には中華製の後発チップ)がコスパが良いのでよく使うのですが↓

 

このドライバーICを注文すると、アルミ製のヒートシンクが付属してきます。

このように熱伝導テープで貼付けて使うのですが↓

f:id:DreamerDream:20191210134331p:plain

ICより大きめのヒートシンクなので下の抵抗やら可変抵抗やらに接触しそうで怖いんです。

f:id:DreamerDream:20191210134355p:plain

万がイチ、熱や振動でヒートシンクがズレて大電流の足などに接触したらIC破壊だけじゃ済まないかもしれません!

 

そんな恐怖を少しでも緩和しようと、このような方法を編み出しましたので共有します。

 

用意するものは、「細く切ったテープ」です。

f:id:DreamerDream:20191210134412p:plain

これをヒートシンクの周りに巻き付けます(熱伝導テープの周囲も覆うように)。

f:id:DreamerDream:20191210134422p:plain

これだけ!

はい!これだけで、ヒートシンクの底面は完全に絶縁されます。

熱伝導テープもICチップに接触する面だけ残れば良いので何の問題もありません。

f:id:DreamerDream:20191210134432p:plain

これで、ICチップに載せてやればホラ!

f:id:DreamerDream:20191210134441p:plain

これでヒートシンクがピンに接触してもあんしーん!

f:id:DreamerDream:20191210134451p:plain



今回は、基板の色に丁度良いので赤色のカッティングシートを使いました(余っていたので)。

 

もし、ICからの熱が心配でしたら「カプトンテープ/ポリイミドテープ」という絶縁&耐熱テープというものがありますので参考にどうぞ。

 

という、小ネタでした。チャンチャン。

RaspberryPi2でアクセスポイントとして使えるWi-Fiドングル

以前にラズパイ3を無線アクセスポイント化しました。

dreamerdream.hateblo.jp

このアクセスポイント化の設定のまま、WiFi非搭載のラズパイ2へSDカードを移動させて、Wi-Fiドングルでアクセスポイント化させることは出来るのか?

という実験を行いました。

 

実験結果 

今回、そのまま移動させて使えたのは

こちらの「謎のドングル」

f:id:DreamerDream:20191209112327p:plain

802.11n」としか表記されていませんので、メーカー不詳です。

たぶん、何かのオマケに付いて来たものですが、忘れました。

f:id:DreamerDream:20191209112821p:plain

amazonでも爆安価格で売られている、たぶん技適の通ってない中華製?

 

 


それと、ラズパイでWiFiといえばこちらがよく使われているPLANEX社のドングル。

f:id:DreamerDream:20191209112914p:plain

このドングル、昔は安かったのですが、今は値段が上がっています。生産終了品?

 

 

そして、残念な結果だったのがこちらのBUFFALOのドングル。

これは子機としては普通に使えますが、 アクセスポイントとして使おうとするとラズパイ3のそのままの設定ではダメでした。

おそらく、ドライバの設定が違うのだと思いますが、今回はそこまでの実験はしません。

実用例もありますので、どうにかすれば使えるはずです。

<参考>

USB 無線LAN をつかってraspberry pi 2をアクセスポイント化 – PoohKidsParty

 

さらに、このBUFFALOのドングルを挿して使ってから、どのドングルでもラズパイ3でもアクセスポイントとして機能しないという謎の事態に見舞われました。

 

どうやらIPマスカレードの設定が書き変わった?のが原因のようで、

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

とコマンドを打つことで戻すことができました。(焦りました)

 

 

スリープモードの解除

ドングルをアクセスポイントとしてしばらく使っていると、急にWi-Fiに接続出来なくなりました。

どうやらドングルがスリープしているようなのでスリープ解除する必要があるようです。

<参考>

raspberry pi にしばらくすると SSHで接続できない - Takuya71 のぶろぐ

/etc/modprobe.d/にファイル8192cu.confを作ります。

sudo nano /etc/modprobe.d/8192cu.conf

中身に

options 8192cu rtw_power_mgnt=0

と書いて保存して再起動します。

 

再起動後、接続出来なくなりますので、

IPマスカレードの設定をやり直します。

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

そして再起動させると、スリープしないでラズパイ3の時と同じようにアクセスポイントとして使えるようになりました。

ちなみに、謎のドングルよりPLANEXのドングルの方が電波が強いようでした。

 

<アクセスポイントとして使えるものたち>

f:id:DreamerDream:20191209111952p:plain

 

<追記>

上記の方法でもたまに接続出来ない事があり、不安定です。

やはりラズパイ3用の設定だからでしょうか?

もう少し安定して接続出来る方法を模索することにします。 

備忘録:ESP32を乾電池2本で動かしたいのに動かない時は、まず電源線を見直しましょう!

Arduinoと同じようにプログラム出来て、しかもWi-FiBluetooth搭載、アナログ入力16ピン、乾電池2本で稼動するけど格安の化け物マイコン 「ESP32モジュール」 

 

これを乾電池2本でWi-Fi接続して使うという作例がWeb上には沢山あるので僕も同じように試してみたところ、「え?なんで動かんの?」という事態に見舞われたので備忘録として残します。

 

まず、ESP32モジュールを乾電池2本で動かす場合は、

必ず「Flash Fraquency」を40MHzで設定しないといけません!

<参考>

【ESP32/Arduino】乾電池2本で動かす場合の注意点 - ソースに絡まるエスカルゴ

この設定をせず80MHzで低電圧で動作させて壊したという事例もあるので、確実に40MHzに設定しましょう! 

 

 

テストで実際に試したのがこんな感じの回路というか電源だけ(写真用で、電源線は繋いでいませんが)

f:id:DreamerDream:20191203141024p:plain

USB-Serialでプログラムして動作を確認後、単体で動かずべくこのように乾電池2本に繋いでところ、Wi-Fiに繋がらずうんともすんとも言わない困った状態でした。

 

「USBに繋いだら動くのか?」と、USB充電器からシリアル変換器で3.3Vにして繋いでいろいろ試してら動く場合もあるし動かない場合もある、時間が経ったら動く場合もある。

という非常に不安定な状態で困りました。

 

乾電池2本で動かす算段で工作しているのに動かないと先に進めません。

 

いろいろ調べているうちに、このサイトを発見しました。

<参考>

ESP32 ( ESP-WROOM-32 , M5Stack )自分的 トラブルシューティング まとめ | mgo-tec電子工作

 

このサイトによりますと、ESP32は電源投入時とWi-Fi接続時に膨大な電流を消費するそうで、電源電圧が2.3Vを少しでも下回ると動かないということです。

しかも電源不良ではマイコン自体が故障する可能性があるそうです。

Wi-Fi待機時で160mA、Wi-Fiアクセス時300mA、リセットの瞬間600mA、また電源投入時の突入電流が2Aを超えることもあるそうで、なんとも化け物マイコンらしい電力の消費量!

 

<対策>

  • ちょい太めの電源線を確保して、線も短くカットしました。
  • 電解コンデンサとセラミックコンデンサを電池ボックスに入れました。
  • 電源投入後すぐWi-Fi接続する設計から起動してから1秒後にWi-Fi接続をするように改造しました。(しかも、Wi-Fi接続時は全てのLEDを消灯させる)

するとー、何事も無いように起動しました!えっ!

f:id:DreamerDream:20191203142628p:plain

感動の瞬間です!

「本当だ!乾電池2本で起動するんだー!!」

 

ということで、この回路はどこまで端折れるのか?

と試したところ、

今回の場合、線を太くして短くするだけで良かったようです。(Wi-Fiの接続を待ったのも良かったかもしれません。)

f:id:DreamerDream:20191203143302p:plain

この状態でWi-Fi確立して通信しています。

面白いですね!

 

もし、ESP32を乾電池で動かそうと四苦八苦している方があれば一度電源線を見直してみてはいかがでしょうか?

kampa.me