EV3とArduinoを接続する #1 ハードウェア的に接続

[NXT/EV3 Arduino I2C Ultimate Guide](https://engmuhannadalkhudari.wordpress.com/2016/02/11/nxtev3-arduino-i2c-ultimate-guide/)というサイトを参考に進めていきます。
このサイトを読むことができれば基本的に私のこの記事は必要ないです。

# 物理的に接続
まずはEV3とArduinoを物理的に接続していきます。
[参考サイト](https://engmuhannadalkhudari.wordpress.com/2016/02/11/nxtev3-arduino-i2c-ultimate-guide/
)で示されている2つの方法は
> 1. The easy option that costs a little:
You can buy the Dexter Industries Breadboard Adapter for the LEGO MINDSTORMS NXT. (image from the Dexter Industries Guide)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449798/124f0e98-afe8-935d-3108-2252263db2e1.png)

> 訳：簡単だけど、ちょっとお金のかかる方法:
"Dexter Industries Breadboard Adapter for the LEGO MINDSTORMS NXT"を購入する。(the Dexter Industries Guideからの写真)
※購入ページのリンクが切れていました。
---
> 2. The harder option that is almost free:
You just need to buy two 82KΩ resistors. You also need to, get your heart ready to be broken, cut one LEGO Mindstorms cable that you usually use to connect the NXT/EV3 brick with a motor or a sensor. The good thing is that you get two half cables so you can use the other half with another brick. I guess you can always buy more cables from LEGO or other third party sellers. It is better to solder the wires from the LEGO cable to header pins.
(images from the Justin Eng Guide)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449798/4cb78c98-0986-33d1-6329-817fcbb1e91a.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449798/2a187048-e47f-a4ec-177b-07bcb629d3ae.png)

> 訳：難しいけど、ほぼタダの方法。
82KΩの抵抗が2つ必要です。また、心を痛める準備をせねばなりません。NXTやEV3とセンサーやモーターを接続するのに普段使っているケーブルを切断します。良い点として、半分のケーブルが2本あるので、残った半分を別のNXTやEV3で使用できることです。LEGOまたは他のサードパーティが販売するケーブルを購入できると思います。LEGOケーブルからヘッダーピンへのワイヤをはんだ付けすることをお勧めします。(the Justin Eng Guideからの写真)

私は金銭的な都合から後者を選択しました。

回路図は次の通り。
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449798/e972c545-02df-4b0d-7afe-6a47f3383e43.png)

ケーブルを剥ぐとこんな感じです。
![E9814DF7-58B5-4E1E-AFB2-BA98B69B3678.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449798/8d4354d2-0d0c-ffce-8d15-cbfcd6f79179.jpeg)

出来上がったものがこちら
![CDF5AF18-C979-4E7F-A15B-1F5C29B83152.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449798/9b5a15e7-d75a-3cf8-c1cc-a9e08fd99d49.jpeg)

## EV3がクラッシュした
はじめ、私は[別のサイト](https://noriwtn.com/ev3-arduino-i2c/)を参考に進めていたのですが、そのサイトの回路図通りに組むと、EV3がクラッシュしました。回路図が間違っているのでは?と個人的には思いますが、実際どうなのかはわかりません。[NXT/EV3 Arduino I2C Ultimate Guide](https://engmuhannadalkhudari.wordpress.com/2016/02/11/nxtev3-arduino-i2c-ultimate-guide/)の回路図で組むとクラッシュすることはありませんでした。
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449798/ded1bc20-5718-4ae4-252a-8c2a0ad174da.png)

問題の回路図
"緑が3・赤が4"ではなく"緑が4・赤が3"のはず。

# ポートビュー
EV3とArduinoの接続がうまくいくとEV3側のポートビューでは"IIC-BYTE"(I2Cセンサーてこと)としてArduinoが認識されます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449798/1a271243-7170-645b-4198-5b6db58830cd.png)

# コード
この参考記事のArduinoのサンプルコードはほとんどのデジタル/アナログセンサーで使えるよう、汎用性の高い作りになっています。なので仕組みを理解しちゃえば自分仕様に改造できそうです。
実際に、参考記事の最後ではライトセンサー・超音波センサー・温度センサーを使った場合の例が公開されています。

# 送受信できるデータが限られている問題
こいつが一番の課題かもしれません。
曰く
> I only want to point out one more thing. When using the EV3 brick with these blocks, you can’t read/write a full byte. You can only send/receive values between 0 and 127. Don’t ask me why!!

> 訳：もう一つ指摘したいことがある。これらのブロックをEV3で使う時、1バイトを完全に読み書きに使うことはできない。0から127の間の値を送受信することしかできない。なんでかは聞かないでくれ!!

とのこと。
1バイト(8ビット)で0と1を並べてできる順列は2の8乗。つまり256通り。何らかの理由で1ビット(正負の符号?)使えなかったとすれば2の7乗で128通り。と考えれば0から127までの整数しか扱えないと書かれている辻褄が合う気がします。※あくまでも推測

ではそれを解決するためにどうすれば良いのか。
単純に送受信に使用するバイト数を増やせばいいと思います。
それこそ``Wire.write(data, length)``をつかうとか。

ただし私は面倒くさいので、センサーの値の処理を全てArduino内で終わらせてその結果だけをEV3に送信する方針を取っていくと思います。その方がEV3側のコード的にもスッキリしますし。

# 費用
現時点でかかったお金は
Arduino Nano Every: 1848円
82kΩ抵抗×2: 約10円
ジャンプワイヤ: 約500円+部の備品
ブレッドボード: 約500円
計3000円程度。
[EV3 Seneor Multiplexer](http://www.mindsensors.com/ev3-and-nxt/23-ev3-sensor-multiplexer-for-ev3-or-nxt)は送料もろもろ込みで5000円以上かかります。各LEGO製のセンサーが5000円以上、そのセンサーも3つまでしか接続できない(EV3で1ポート使っているので実質2ポートしか増設できていない)ことを考えればかなりお得だと思います。

# 次回以降
次回以降は実際にプログラミングしてデータの送受信をしていきたいと思います。

# References
https://engmuhannadalkhudari.wordpress.com/2016/02/11/nxtev3-arduino-i2c-ultimate-guide/

https://www.dexterindustries.com/howto/connecting-ev3-arduino/

https://noriwtn.com/ev3-arduino-i2c/