クソ倒立振子をつくってみた

# はじめに
いろいろやらなきゃいけないことがある中、現実逃避のために作り始めた倒立振子ロボットについて、簡単な作り方と自分の知らなかった知見をまとめる記事になります。

尚、あり合わせの部品と頭の悪い設計で作ったため、クソポイントが過分に含まれている点ご容赦ください。
# 構成
- Arduino UNO　中華互換機
- Arduino 拡張シールド基板 (電子工作スタータセットに入ってた↑中華基板とセットの物)
- ミニ四駆から剥ぎ取った適当なマブチモータ
- ミニ四駆から剥ぎ取ったタイヤ　2個
- 6軸加速度センサMPU6050
- モータドライバL293D
- ９V箱電池　2個

![DSC_1331.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3321614/961afb8f-0b04-0d74-e022-0528d51eac41.jpeg)

# 結論
いろんな参考記事を見ながら作っていきましたが、行きついた先はコレでした。
**クソ記事より完成を急ぎたい方は↓こちらを読んでください**

https://ichiken-engineering.com/inverted_pendulum1/

https://youtu.be/FXNtDEfyKpI?si=l4YYZHNPUx-2Xggv

いろいろな問題を考えれば考える程、中身が既に完成されている↑技術記事に寄っていってしまうのは何とも複雑な気持ちですが、仕方ないのかもしれません・・・
# 作り方
必要な部品を揃えて、ブレッドボード上で**動作確認**をし、はんだ付けで実装するだけです。作業自体は何も難しくありません。
### データシートを探して読もう
ところで、これを読んでいるあなたはデータシートをご存じでしょうか？
最初の使い方数ページの雰囲気だけでも読みましょう。

私の観測する範囲では、機械系学部のB3になっても、電子工作や実習の経験が浅く、データシートを探さない・エラーを読まない学生が多いです。（というかほとんどの学生がそう）

倒立振子をゼロから作るのであれば、当たり前ですが加速度センサやモータドライバなどのデータシートを探して読みましょう。そこに使い方が書いてあります。

https://www.ti.com/jp/lit/ds/symlink/l293d.pdf?ts=1709379056306

https://product.tdk.com/system/files/dam/doc/product/sensor/mortion-inertial/imu/data_sheet/mpu-6000-datasheet1.pdf

以上、拡張シールド基板上のピン配置等、テキトーに決めて、３Dプリンタで筐体をテキトーに作れば完成です。~~クソ~~
# いろいろな問題点
ここからが本題
## ハード編
#### 配線まわり
まず、配線は時間と労力とちょっとのお金をかければもっとスマートになったかもしれません。せめて基板上はコの字ジャンパワイヤとか使うべきでした。 ~~（それでも配線地獄になりそう）~~

https://akizukidenshi.com/catalog/g/g102315/

もしくは基板から作るか・・・

#### 通信接続と拡張シールドの干渉
6軸加速度センサMPU6050との通信はI2Cというものを使います。正直、通信規格のことはほとんど分かりませんが、データシートや使い方記事を調べてその通りに配線します。
I2CはSCLとSDAというピンを、それぞれ対応するArduino側の同じピンに接続する必要があります。
が、しかし、拡張シールド基板を載せているとArduino側のSCLとSDAが塞がれてしまいジャンパワイヤが刺せなくなってしまうため、ここだけ芯線の硬いコの字で横からねじ込みました。（これでよいのだろうか）
![DSC_1332.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3321614/9ad205cb-0a0d-dd8a-3600-501d69192465.jpeg)

#### 筐体
そもそも論、手を抜いて機体全体を3DCADでモデリングしておらず、また長らく3DCADを触っていなかったため、設計センス皆無の筐体が出来上がりました。反省。

筐体を３Dプリンタで作ろうとする時に便利なサイトとして、Thingiverseというものがあります。マイコンや９V電池のホルダーなど出来合いのモデルを印刷して上手く組み合わせられれば便利かもしれません。

https://www.thingiverse.com/

そして、倒立振子は繊細な制御が要求されるため、機体には**剛性**が必要です。
そのため、当初は各パーツをネジ止めして組み上げようと考えていましたが、
- 出来合い品に合致する正確な寸法
- ３Dプリント品の熱収縮誤差や印刷速度・品質

を考慮する必要があります。
私のクソ設計では最終的に、タイヤとの干渉部分が発生してしまいメンドくさくなった結果、速効多用途アロンアルファという解決策に行き着きました。
（工学的センスの欠片もない、浅はかな方法ではありますが、十分な剛性が得られます。）

## 電源編
#### 電源まわり

この倒立振子には電源として９V箱電池を2つ使っています。
電源を選定する上で考えなきゃいけないのは、「どのくらいの電圧が要求されるか」ということです。
今回の倒立振子の構成で要求される電圧（駆動電圧）は、
- Arduino 互換機：6~12V
- モータ：？V
- 加速度センサ：5V（だったはず）
- モータドライバ：内部ロジック5V ドライバー用4.5~36V

でした。
ということで、電気素人の私は9V箱電池1個をマイコンに供給するだけで動くと思っていましたが、それで動く程ロボットは簡単ではありませんでした。

問題点として、**モータは駆動時に、電流が流れるとマイコンに供給している電圧が一瞬下がってしまう、** という現象が起こるようです。これによりマイコンにリセットが掛かってしまい、うまく動かなくなってしまいます。

解決策として、マイコン電源とモータドライバ及びモータに供給する電源を分けました。（箱電池１個分重くなりますが、外部からの給電ではかっこ悪いので...）

#### ノイズについて
（私は、電子工作をする上で、電気的なノイズがどのような問題を引き起こすのか、をあまり意識・問題に直面したことがありませんでした。）

モータは電気的なノイズを発しており、それが加速度センサの計測値やマイコンの動作に悪影響を与えます。したがってどうにかしてこのノイズ成分を除去する必要があります。ノイズは電気信号の高周波成分になるので、コンデンサという電子部品を使うことで除去できます。ノイズとコンデンサについては以下イチケン動画が勉強になります。

https://youtu.be/u2s90OwH9SA?si=OBjZrWYfCGFcnYdV

https://youtu.be/jtFpbAtqVqU?si=4xXblz7YjO5FXrIO

ノイズを除去しないと、加速度センサの計測値にノイズの成分が入り正確に姿勢を測定できなかったり、マイコンの動作が不安定になり、マイコンにリセットが掛かってしまう（モータが暴走）現象が起きたりします。
ノイズ除去のためには[参考記事](https://ichiken-engineering.com/inverted_pendulum1/#:~:text=%E3%83%A2%E3%83%BC%E3%82%BF%E3%81%8B%E3%82%89%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B%E3%83%8E%E3%82%A4%E3%82%BA%E3%81%AB%E3%82%88%E3%82%8B%E5%BD%B1%E9%9F%BF%E3%82%92%E4%BD%8E%E6%B8%9B%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E3%83%A2%E3%83%BC%E3%82%BF%E3%81%AE%2B%2C%2D%E7%AB%AF%E5%AD%90%E3%81%A8%E3%83%A2%E3%83%BC%E3%82%BF%E3%81%AE%E3%83%9C%E3%83%87%E3%82%A3%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E3%82%921%CE%BCF%E7%A8%8B%E5%BA%A6%E3%81%AE%E3%82%BB%E3%83%A9%E3%83%9F%E3%83%83%E3%82%AF%E3%82%B3%E3%83%B3%E3%83%87%E3%83%B3%E3%82%B5%E3%81%A7%E7%B9%8B%E3%81%84%E3%81%A7%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)のようにセラミックコンデンサを繋ぎます。
## モータ編（本記事のオチ）
#### トルクについて
モータは電池を繋いでとりあえず回ればオッケー(ミニ四駆的な)、というわけではありませんでした。私はそう考えていたので失敗しました。
モータにはトルク（物理だとモーメントと呼ぶ）という概念があります。雑に説明すると、トルクとは回る力です。いろいろ端折りますが、トルクが不足するとモータは回りませんし、トルクを大きくするにはより大きな電流が必要になるっぽいです（←よくわかってないので表現を濁します）。したがってモータには、より大きな電流を流さなければなりません。そしてその役割を担うのがモータドライバになります。
ここで、今回使っていたモータドライバL293Dのデータシートを見ると、定常出力電流600mA ピーク時１Aとあります。つまりこれ以上の電流は出せません。

そして、モータを回すには、モータが必要とするトルク、および電流がどれくらいなのかも調べる必要があります。
一般に、モータには性能線図というものがあります。

https://www.jp-igarashi.com/media/motor/a7

今回倒立振子は、静止状態から床面に接地し、機体の重量分を加味したトルクが出せれば良いということが分かります。性能線図でいうところのストールトルクを出す必要はなさそうですが、それくらいのトルクが出せるための電流量がいくらなのかを検討したうえでモータドライバを探す必要があります。

さて、勘の良い方ならそろそろお気づきかと思いますが、私はこの過程（概念）を知らなかったので、結果的に倒立させることができませんでした。

今回使ったモータはマブチモータのFA-130っぽいヤツなので、ストール電流は[2.20A](https://product.mabuchi-motor.co.jp/detail.html?id=9#:~:text=26-,2.20,-%E3%82%AB%E3%82%BF%E3%83%AD%E3%82%B0%E3%81%AB%E6%8E%B2%E8%BC%89)となります。したがって現状でのモータドライバでは十分な電流を出せているとは言えない訳です。
# 最後に
倒立振子をゼロから作ってみた記事ということで、初学者なりに知らなかったポイント、（初学者なら多分知らなくて躓くだろうな～というポイント）を解説したつもりです。
最後に、浮かせて動作確認していた時の動画を供養しておきます。皆さんはちゃんと**床において**動作確認しましょうね。

![プレゼンテーション1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3321614/b3dd5136-9f86-08c8-ad5d-a509c2677a1f.gif)