【2輪ローバー自作 part1】L6470を使ってステッピングモーターを動かす



#はじめに
普段IoTのセンサーに触れることが多いのですが、「ロボットみたいな動くハードウェアっていいよな」とふと思い、ローバーを作ってみることにしました。
学生時代にそういったものを作るプログラムに参加したことがありますが、当時はプログラミングや回路の知識はなかったので、ハードウェア周りに取り組んでいました。
多少の知識がついた今、全部通して自作してみて、学びを得たいと思います。

例えば、ハクトさんではこんなかっちょいいローバーを作っています。これは月面を走るとか。
これを理想形として似たようなものを作れればいいなあ！というのが今回やりたいこと。

<div align="center">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545001/a32834b3-2e23-bbed-c651-1e3fa37aed11.jpeg">
</div>

([「ハクト」インタビュー（後編）秋葉原に売っている部品で宇宙へ行く——設計の基本方針です](https://fabcross.jp/interview/131015_hakuto02_01.html)から引用)

# 制作の手順
次のステップに沿って作っていこうと思います

* ステッピングモーターを単体で動かす
* ステッピングモーターを2つ同期して動かし、前進、回転、後退を実現する
* 車輪、シャーシなどのハードウェアを製作する
* 組み合わせて走行させる

一度、「走る、止まる、曲がる」の機能を上記のステップで実現した後は、ラジコンにしたり、壁に沿って自動で走らせたり、カメラを搭載して人を追わせたりなど、夢は無限に広がるという算段です。

# ハードウェア
手始めに、ステッピングモーターとモータードライバを秋月電子にて購入しました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545001/8c5ef3d4-916f-9b29-9b8a-3cd18f6df025.jpeg" width=50%>

|製品|型番|
|---|---|
|バイポーラステッピングモーター|SM-42BYG011|
|モータードライバ|L6470使用　ステッピングモータードライブキット|

まずモーターに「ユニポーラ型」と「バイポーラ型」があるということを知らなかったので、その時点で戸惑いました(笑)
ここでその二つの違いに突っ込んでいくと、ローバーにたどり着く前に憤死しそうなので、一旦無視します。動かしてわかった気になって、後から原理を知る。この作戦で行きたいと思います。

完全に余談ですが、まず動かせということに関して個人的に印象に残っている話があります。
運動方程式を積分すると、運動量保存則、エネルギー保存則になりますね。
この二つの式は非常に便利ですが、「なぜ積分するかを考えて前に進まない人が良くいる。それよりもどしどし使って慣れて、理解するほうがいいんだ」というのが山本義隆先生の教えです。今回はそれとは違うと怒られるかもしれませんが(笑)

というわけで、モータードライバキットが販売されているバイポーラ型を選択しました。
ユニポーラの場合はFETを4つ組み合わせれば駆動回路ができる、と店員さんが教えてくれましたが、脱調などの現象を考慮するとモーターの勉強にはなれど、やはりローバーまでたどり着けないであろうと判断しました。しかし、素人にもめちゃめちゃ丁寧に教えてくれる姿勢はありがたいですね。

# 作業をしていく
実際のところ、このドライバとモーターの組み合わせに関しては、先人の知恵がネットにたくさん転がってますので、こちらをフォローしていこうと思います。
秋月電子とstrawberry linuxの両方にL6470を使ったモータードライバのモジュールがありますが、下記のサイトの方は秋月電子のものを使っているので、参考にしながら配線を行いました。

* [秋月版L6470使用ステッピングモータードライバの使い方](https://kogakubu.com/?p=2918)

自分の場合は、マイコンにArduino UNOではなくESP32を搭載した「MHETLive mini」を使用しました。マイコンピンとの対応関係だけ変わってくるため、そこだけ表にしておきます。

|ドライバ側端子|MHET live側ピン|
|---|---|
|1 #BUSY/SYNC||
|2 FLAG||
|3 GND|GND|
|4 EXT-VDD|3V3|
|5 SDO|IO19 SPI MISO|
|6 CK|IO18 SPI SCK|
|7 SDI|IO23 SPI MOSI|
|8 #CS|IO5 SPI SS|
|9 STCK||
|10 #STBY/#RST||


###【2020/3/28 追記事項】
**ESP32とモータードライバを接続した際には、ESP32のUSB電源を接続しないでください！！** 
記事を書いた直後に、ESPのレギュレータと思しきパーツから白煙が上がる事象が起こりました。
理由としては、ドライバ側からマイコンへの電源供給とUSBからの電源供給が同時に行われたからだと予想していますが、同じ回路を組んで実施する方がいれば、十分気を付けながら取り組んでいただくようお願いします。このことで一つドライバを壊してしまったのは良いのですが、やけどなどのケガをしてしまう恐れもありますのでご注意ください。

書き込むソフトウェアですが、北の国から電子工作(仮)さんのコードを皆さん使用しているようでしたが、ESP32では動かないライブラリが使用されているようでした。

そこで、コードに関しては以下のサイトさんを参考にさせていただきました。

* [第39回 ステッピングモーターで2輪走行ロボットを作成（後編）〜Arduinoでパーツやセンサーを使ってみよう] (https://deviceplus.jp/hobby/entry039/)

一旦、360度回転させて停止するというコードをそのまま使用させていただいております。
サイト中段のサンプルコードをArduino IDEにコピペして、MHETへ書き込みを行います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545001/d6a90074-1f0e-894d-1334-6b60a9ab93e5.jpeg" width=50%>

色々参考にさせてもらっていたので、実際やったのはちょっとしたはんだ付けと配線程度ですが、無事に動きました！モノが動くというのはやはり感動しますね。
おそらく、Arduinoで動作できるマイコンを使えば、(ピンの配線さえ間違わなければ)上記のステップでモーターが回転するはずです。

# 次回へ向けて
先人の知恵を借りながらではありますが、やりたいことだけ頭に浮かべて秋月電子に向かった状態から、とりあえずモノを動かす段階に漕ぎつけました。参考になるサイトを見ながらでも、ほんとにできるかな？という不安はつきものなので、とりあえず一安心しています(笑)
次は、実際の車体の制御に必要な関数を作っていき、2つのドライバ間で同期をとりたいと思います。
こちらは、コードがかけたら共有して、参考にさせていただいたサイトの執筆者の方のように、皆様に還元したいと思います。

# 参考ウェブサイト
* [秋月版L6470使用ステッピングモータードライバの使い方](https://kogakubu.com/?p=2918)
* [第39回 ステッピングモーターで2輪走行ロボットを作成（後編）〜Arduinoでパーツやセンサーを使ってみよう] (https://deviceplus.jp/hobby/entry039/)