Edisonを開封してからnode.jsでIOポート制御するまで

妻と子供が実家に帰っていることをいいことに、半日Edisonをいじってみた。
node.jsでIOポート制御する所まで行けたのでまとめておく。
前提として、
- MacBook Air (11-inch, Mid 2011)
- OSX Yosemite（10.10）
- Edison
- Breakout board
です。
Intel公式ドキュメントを見ると、初めての人はArduino Breakout boardを使うといいぜ！と書いてあるのでArduinoボード買ったほうが難易度下がると思います。
多分node.jsなんか使わなくてもArduino IDEからLチカできます。

#開封から組み立て、ログイン
![IMG_3765.JPG](https://qiita-image-store.s3.amazonaws.com/0/8748/fc7c1efe-3497-808c-39d9-23a79ff22981.jpeg)
Edisonとbreakout boardをコネクタで接続して2箇所ネジ止めする。
USBケーブルを2本つなぐ。
写真の上がUSBシリアル、下が電源。
接続したらいきなりlinuxが立ち上がっているはずなのでシリアルコンソールからログインできる。

```zsh
$ sudo cu -s 115200 -l /dev/cu.usbserialxxxxxxxxxxxxxx
```
xxxxxxxの部分は環境によって異なると思うので適宜。
ユーザー名rootでパスワード無しでログインできる。
![スクリーンショット 2014-11-09 16.43.17.png](https://qiita-image-store.s3.amazonaws.com/0/8748/2766efbd-e70d-38b4-7de2-f0cecb7564ff.png)

# ファームウェアアップデート
ログインして色々いじっていると、何故か文字入力一文字目を取りこぼす。
バグらしく、ファームウェアアップデートで治るらしいのでやってみる。
（正確にはファームウェアではないような気がするが、ここではファームウェアとする。）
ちなみにバグの出るバージョンは以下。

```zsh
$ cat /etc/version
edison-weekly_build_56_2014-08-20_15-54-05
```

[ここ](https://communities.intel.com/docs/DOC-23193)を参考にmacから更新してみる。

電源側のUSBケーブルをmacに接続すると、ストレージデバイスとして認識する。
ターミナルでEdisonディレクトリに移動。

```zsh
$ cd /Volumes/Edison
```

Edison以下のファイルを全て削除する。

```zsh
$ sudo rm -rf *
$ sudo rm –rf \.*
```

次にFinderのEdisonを右クリック > 情報を見る > フォーマットがFAT16の場合、FAT32にするのでディスクユーティリティを開く。
![スクリーンショット 2014-11-09 17.15.16.png](https://qiita-image-store.s3.amazonaws.com/0/8748/77e4f76b-946a-0f81-647c-7462a71cd2b8.png)


「Linux File-CD Gadget Media」を選択、パーティションタブを選択。
パーティションのレイアウトを1にして名前をEDISONに変更。
写真のような設定で適用する。
![スクリーンショット 2014-11-09 17.18.05.png](https://qiita-image-store.s3.amazonaws.com/0/8748/2990032f-8f35-18c8-f137-702eb608db3f.png)
もし「ディスクのマウントを解除できませんでした。」というエラーが出る場合、ターミナルで/Volume/Edisonから別の場所に移動してから適用ボタンを押すと上手くいく。
これでFAT32でフォーマットされる。

[ここ](https://communities.intel.com/docs/DOC-23242)から最新のEdison Yocto complete imageをダウンロードする。
zipファイルを解凍して、中身をすべてEDISONにコピーする。
![スクリーンショット 2014-11-09 17.26.33.png](https://qiita-image-store.s3.amazonaws.com/0/8748/026534ab-7fb7-c6f0-45d6-26c50da6f4e8.png)

コピーが完了したらシリアルコンソールで接続する。
ログイン後、

```zsh
$ reboot ota
```

で更新が始まる。
注意：これをするとconfiguration settings含めてすべて削除される。

しばらく待つとコマンドプロンプトが帰ってくる。
これで更新完了。

```zsh
$ cat /etc/version
edison-rel1-maint-weekly_build_16_2014-10-14_14-56-19
```

# ConfigureでWi-Fi設定
configure_edisonコマンドを使うと、Wi-Fiの設定、ログインパスワードの設定ができる。

```zsh
$ configure_edison --setup

Configure Edison: Device Name

Give this Edison a unique name.
This will be used for the access point SSID and mDNS address.
Make it at least five characters long (leave empty to skip): #名前をつける

Enter a new password (leave empty to abort)
This will be used to connect to the access point and login to the device.
Password: #パスワードを設定する

Configure Edison: WiFi Connection

Scanning: 1 seconds leftt

0 :	Rescan for networks
1 :	Manually input a hidden SSID
2 :	xxxxx
3 :	xxxxx
....

Enter 0 to rescan for networks.
Enter 1 to input a hidden network SSID.
Enter a number between 2 to 16 to choose one of the listed network SSIDs: #Wi-Fi接続設定

Is xxxxxxxxxx correct? [Y or N]: Y
Password must be between 8 and 63 characters.
What is the network password?: ******************
Initiating connection to xxxxxxxxx. Please wait...
Attempting to enable network access, please check 'wpa_cli status' after a minute to confirm.
Done. Please connect your laptop or PC to the same network as this device and go to http://10.0.1.10 or http://xxxxxxxxxxx.local in your browser.

```

最後に表示されるURLにブラウザからアクセスするとDevice Informationページが表示される。
これでEdisonのWi-Fiが有効になった。
SSHもできるよ。

```zsh
$ ssh root@10.0.1.10 #先ほど表示されたIPアドレス
root@10.0.1.10's password:
root@kinu-edison01:~#
```
ただし、キー入力の反応がめちゃめちゃ遅い。
シリアル接続のほうがストレスがない。

#パッケージのアップデート
[ここ](https://software.intel.com/en-us/node/532592)を参考にした。
主にlibmraaの更新をしたい。
これが古いと次にやるXDKビルドの時にコケる。
Edisonにログインして、

```zsh
$ echo "src intel-iotdk http://iotdk.intel.com/repos/1.1/intelgalactic" > /etc/opkg/intel-iotdk.conf
$ opkg update
$ opkg upgrade
```
これでおｋだった。

#XDK IoT Editionを使ってnode.jsでポート制御
XDKを[ここ](https://software.intel.com/en-us/html5/xdk-iot)からダウンロードする。
解凍してインストール。
XDKを起動するとSign upを求められるのでする。

![スクリーンショット 2014-11-09 18.02.51.png](https://qiita-image-store.s3.amazonaws.com/0/8748/17df3f29-6f6e-4f89-bfc5-54aa08a0abb7.png)

左側のメニューからStart with a Sample or Templateを選択、Onboard LED Blinkを選択。
適当に名前をつけてCreate。

画面左下のIoT DeviceからEdisonに接続する。
多分それらしきものが表示されていないので、Edisonにログインして

```zsh
$ xdk-whitelist --add 10.0.1.16 #macのIPアドレス
$ systemctl enable xdk-daemon
$ systemctl restart xdk-daemon
```

する。
XDKに戻ると、自分のEdisonが表示されているはずなのでそれを選択する。
![スクリーンショット 2014-11-09 19.09.06.png](https://qiita-image-store.s3.amazonaws.com/0/8748/bd0a6758-62aa-b806-84f7-c5bc507b11e6.png)

サンプルコードを実行してみる。
...
何も起こらない。
それもそのはずで、breakoutboardには制御できるLED等がついていない。
どうしようかなと思ったが、今日ははんだづけするテンションではなかったのでオシロスコープで波形を見ることにした。
[mraaで指定するポート番号はgithubのドキュメントに書いてある。](https://github.com/intel-iot-devkit/mraa/blob/master/docs/edison.md)
例えばこのサンプルでは

```js
var myOnboardLed = new mraa.Gpio(13);
```

としているので、13に対応するJ17-14が物理的に制御される。
breakout boardのピンアサインは[Edison Breakout Board Hardware Guide](https://communities.intel.com/docs/DOC-23252)に書いてある。
![IMG_3766.JPG](https://qiita-image-store.s3.amazonaws.com/0/8748/37b956fa-f2c7-d3b5-f716-c77c15ac8368.jpeg)
![IMG_3767.JPG](https://qiita-image-store.s3.amazonaws.com/0/8748/cf48635c-492e-601b-cb65-a23f65df1cc6.jpeg)
上の波形は

```js
setTimeout(periodicActivity,10); 
```

を指定した時の波形です。
横軸1マスが10msなので、大体合ってます。
あとはここに回路を接続すればハードウェアの制御をすることができます。
ポートの電圧が1.8vなので少し扱いづらいですね。
USBシリアルポートを使ってArduinoにつないでしまうとか、Arduino breakout boardを使ったほうがお手軽かもしれません。