マイコンによる入出力実験２

# はじめに
ここでは、 **Arduino**マイコンを使って、ロボットアームのプログラミングの基礎を学びます。

※本ページは実験のテキストです。

[マイコンによる入出力実験１](https://qiita.com/hsgucci/items/085680123f758c8c3eb4) へのリンクはこちらです．

# 概要

[マイコンによる入出力実験１](https://qiita.com/hsgucci/items/085680123f758c8c3eb4) では，Arduinoのデジタル入出力，アナログ入出力，ラジコンサーボの使い方を学びました．
今回は，その応用としてラジコンサーボを４個使うロボットアームをArduinoで動かします．

実験１で利用したServo.hを使ってラジコンサーボを動かすことも可能なのですが，
今回はスキルアップのためにサーボを動かすための専用シールドを使います．

シールドはI2C通信で利用するように作られているので，Arduinoを使ったI2C通信の学習も行います．

# 実験装置

実験１とは別の装置を使います．

- [Arduino UNO R3](https://www.switch-science.com/products/789)
- [PCA9685 PWM & Servo シールド](https://www.switch-science.com/products/1411)
- [EEZYbotARM Mk1](http://www.eezyrobots.it/eba_mk1.html)
- USBケーブル
- 5V ACアダプタ

以下の写真に示します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/b9731f09-eacf-5bf2-13c0-62759299780f.png)

Arduino UNO には，複数のラジコンサーボを動かすためのシールド基板が既に刺さっています．
また，シールド基板とロボットアームとの配線も済んでいます．

ラジコンサーボは瞬間的に大きな電流を消費することがあるため，USBケーブルからArduino UNOに供給されている5[V]では不足してしまう可能性があります．
そのため，5V大電流のACアダプタを別途電源として使用します．

# 解説

## EEZYbot ARM Mk1
以前，この実験では，Arduino.org公式の [Tinkerkit Braccio](https://www.switch-science.com/products/2699)を使っていました．
しかし，壊れやすい，直しにくい，修理部品が入手できない，など問題が多かったため変更しました．
EEZYbot ARM Mk1は，フリーの3Dプリントデータの公開サイト「Thingiverse」でデータが公開されているロボットです．
https://www.thingiverse.com/thing:1015238
このサイトから部品データをダウンロードして，3Dプリンターで印刷すれば，作ることができます．
修理部品もすぐ作れます　．
その他の部品も比較的安価に入手できます．
- アームのサーボ [MG90S](https://akizukidenshi.com/catalog/g/gM-13227/)
- ハンドのサーボ [SG90](https://akizukidenshi.com/catalog/g/gM-08761/)
- M4のネジ・ワッシャー・ナット
- M3のネジ・ワッシャー・ナット
- 中空 真鍮棒
- サーボ延長ケーブル
このハンドアームは，ラジコンサーボで動きます．
それぞれのサーボの番号とハンドアームの関節との関係は，下の図のようになっています．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/10735d1d-2f3e-0325-90ab-6a754d8ec0ac.png)
 **<font color=cyan>サーボ０：土台のヨー旋回</font>**
 **<font color=lightgreen>サーボ１：第１リンク</font>**
 **<font color=magenta>サーボ２：第２リンク</font>**
 **<font color=#F0F000>サーボ３：ハンドの開閉</font>**
それぞれのサーボとコネクタには，上記と同じ色の●シールが貼ってあります．
サーボの番号が１から始まっていないのは，シールド基板の端子が0から始まっているからです．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/f93a4133-53bb-ffa6-456e-2a30b0583685.png)

## PCA9685 PWM & Servoシールド

入出力実験１の **[10.ラジコンサーボを動かそう](https://qiita.com/hsgucci/items/1ae0dbeb0438db8a23fa)** では，`Servo.h`を使ってラジコンサーボを動かしました．

ただし，`Servo.h`では最大で12個までしか動かすことはできません．
(Arduino UNOでは12個もピンがありませんが)
　解説： **[Servo.h](http://www.musashinodenpa.com/arduino/ref/index.php?f=1&pos=681)**

例えば下記の写真のよう二足歩行ロボットでは，21個のラジコンサーボを使っているため，12個では足りなくなります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/961fa398-dd3f-4fe7-31e8-b5ae52f8816f.png)

12個以上の多くのサーボを動かしたい場合は，Arduinoの機能を拡張する **シールド** で対応します．
[PCA9685 PWM & Servo シールド](https://www.switch-science.com/products/1411) は，シールド１枚で16個のサーボを動かすことができます．
また，このシールドは複数枚重ねて使うこともできるので，16 x 2，16 x 3,,,というように16の倍数で使える個数が増えていきます．

今回のロボットアームには4個(あとで5個に増えますが)しか使わないので，正直Servo.hでも十分事足ります．
しかし， **シールドの使い方を学ぶ**ために，敢えてこちらにしました．

## PCA9685

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256470/195396d7-0d59-7002-4182-8e8791660f85.png)
本シールドに使われている「**PCA9685**」というICは，
メーカーの [データシート](https://cdn-shop.adafruit.com/datasheets/PCA9685.pdf) を見てみると，
「**16-channel, 12-bit PWM Fm+ I2C-bus LED controller**」
と書いてあります．
実はこのIC，ラジコンサーボを動かすためのものではなくて，LEDの明るさを変化させるための製品なのです．
入出力実験１の  **[9.アナログ出力の解説](https://qiita.com/hsgucci/items/3e7ed7485f852aaf7298)** でPWMを使ってLEDの明るさを変化させたのと同様に，16個同時にLEDの明るさを制御するICなのです．

[ラジコンサーボの信号](https://qiita.com/hsgucci/items/1ae0dbeb0438db8a23fa#%E3%83%A9%E3%82%B8%E3%82%B3%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%9C%E3%81%AE%E4%BF%A1%E5%8F%B7) で解説したように，
「PWMのパルス幅は0～100%の全域で使うのに対して，PPMは20ミリ秒のうち4～11%の部分しか使いません．」です．
したがって，LEDの明るさコントロールのパルス幅をArduinoプログラムで調整すれば，ラジコンサーボ信号として使うことができます．

現在PCA9685は，ラジコンサーボ信号を作る目的で多用されているため，本来はLEDの調光用の製品であることを知らない人もいるくらいです(笑)

## I2C

上記のPCA9685は，**I2C-bus LED controller**と書いてあるように，基板内シリアル通信の規格「 **<font color=red> I<sup>2</sup>C </font>** 」を使ってArduinoと通信を行います．

**I<sup>2</sup>C** は，2の部分がべき乗を意味するので，正しくは「アイ スクウェア シー」と読みます．
しかし，プログラムのテキストでは上付き文字は書けないので **I2C** になってしまうため，皆「アイ ツー シー」と呼んでいます．

　参考：[Ｉ２Ｃの基礎知識](http://www.picfun.com/midi2c01.html)

「LANにつながったパソコン」が「IPアドレス」を使って区別されるのと同様に，
「I2Cバスにつながったスレーブ」は「I2Cアドレス」を使って区別されるのです．

I2Cを使うICには，今回のようなPWM出力だけでなく，様々な機能をもった製品があります．
[モータ駆動IC](https://akizukidenshi.com/catalog/g/gK-06273/)，[ジャイロセンサ](https://www.switch-science.com/products/1208?_pos=7&_sid=a640bda86&_ss=r)，[方位磁針センサ](https://tokyodevices.com/items/156)，[気圧センサ](https://www.marutsu.co.jp/pc/i/574311/)．．．etc.
マイコン本体が色々な機能を持っていなくても，**I2Cを使って機能を増設する** ことができます．
Arduinoでは，I2Cに対応したシールド基板で，機能を増設することが推奨されています．

# 実験手順

以下の手順に従って、実験を行ってください。

0. [I2Cの動作テスト](https://qiita.com/hsgucci/items/296d0826101b695db5bb)
0. [PCA9685用のライブラリ](https://qiita.com/hsgucci/items/e3009d94fc5217f26381)
0. [EEZYbotARMを動かしてみる](https://qiita.com/hsgucci/items/7982e24b6eceeea7ea1f)
0. [EEZYbotARMをキー入力で動かす](https://qiita.com/hsgucci/items/0d5a92f75733ce75ac59)
0. [EEZYbotARMにrampユニットとサーボを追加して動かす](https://qiita.com/hsgucci/items/9ce09bc8003501b7860b)
0. [EEZYbotARMを教示/再生で動かす](https://qiita.com/hsgucci/items/bffd971719da127b103b)

# おわりに

以上で マイコンによる入出力実験２ の作業は終了です．

この後は，担当の先生の指示に従って，課題に取り組んでください．