Intel Edisonを使ったロボット

#Intel Edisonを使ったロボット

UART経由でシリアル通信を行ったIntel Edisonで動くロボットに挑戦！！

【仕様】
 ・WEB画面(Node.js or python)でロボットを操作
 ・音声認識、画像認識で動作


今回、音声認識や画像認識を行う予定なのでEdison上のYocto linuxをRebuildを実施。
（EdisonでUSBビデオやUSB音声を扱うのにOSイメージのRebuildが必要）

☆作成中のロボット☆
![IMG_0381.JPG](https://qiita-image-store.s3.amazonaws.com/0/52867/c2b97b8a-92d3-ba06-874e-2f929de25e10.jpeg)
☆操作画面☆
![スクリーンショット 2014-12-07 14.09.11.png](https://qiita-image-store.s3.amazonaws.com/0/52867/8116d31a-97f2-15c8-8aff-6e6f15f4b29d.png)


#Yocto linux Rebuild手順(ubuntu作業)

 準備したもの
  ・ubuntu-14.04.1-server（VM ：CPU: 2, MEM: 4G, Disk: 50G)

##1.コンパイルに必要なパッケージをインストール

```bash
$ sudo apt-get install build-essential git diffstat gawk chrpath texinfo libtool gcc-multilib
```

##2.インストールに必要な設定

```bash
$ git config --global user.email "******@gmail.com"
$ git config --global user.name "tsunaki"

# 一時ディレクトリの作成（どこでもOK)
$ sudo mkdir -p /temp/bitbake_download_dir
$ sudo mkdir -p /temp/bitbake_sstate_dir
$ sudo chmod 777 -R /temp
```

##3.LinuxイメージをDownLoadする
<a href="https://communities.intel.com/docs/DOC-23242">ここ</a>からをwgetなどでDownLoad(<a href="hhttp://downloadmirror.intel.com/24389/eng/edison-src-rel1-maint-rel1-ww42-14.tgz">Edison Linux source files</a>)

``` bash
$ wget http://downloadmirror.intel.com/24389/eng/edison-src-rel1-maint-rel1-ww42-14.tgz

$ tar xvf edison-src-rel1-maint-rel1-ww42-14.tgz

$ cd edison-src
```

##4.build初期設定

```bash
$ ./device-software/setup.sh --dl_dir=/temp/bitbake_download_dir --sstate_dir=/temp/bitbake_sstate_dir --bb_number_thread=8 --parallel_make=8

# buildに必要な環境変数を設定
$ source poky/oe-init-build-env
```


##5.カーネルのbuild
スペックにもよりますが、かなり時間が掛かります

```
# build
$ bitbake virtual/kernel

```
##6.カーネル設定

```bash
$ bitbake linux-yocto -c menuconfig
```

メニュー画面で以下を設定して＜save＞する
　■ Video設定
　　Device Drivers
　　　Multimedia support
　　　　Media USB Adapters
　　　　　USB Video Class [M]   ←ここを設定
　　　　　　UVC input events device support

　■ Sound設定
　　Device Drivers
　　　Sound card support
　　　　Advanced Linux Sound Architecture
　　　　　USB sound devices  [M]   ←ここを設定

※終了は＜Exit＞で階層があがるので、最初のページまで実行すればOK。

![スクリーンショット 2014-12-07 12.17.56.png](https://qiita-image-store.s3.amazonaws.com/0/52867/ca61b146-b7ef-e5f1-4794-1a3246e90d54.png)

##7.カーネルのRebuild
終わったら，設定した.configをコピーする。

```bash
$ cp tmp/work/edison-poky-linux/linux-yocto/3.10.17+gitAUTOINC+6ad20f049a_c03195ed6e-r0/linux-edison-standard-build/.config ../device-software/meta-edison/recipes-kernel/linux/files/defconfig

# rebuild
$ bitbake virtual/kernel
```

##8.全体のbuild

```bash
$ bitbake edison-image
```
※ build中にwarningが出ても問題なし。

##9.Edisonへ焼き込み

以下のコマンドで，Edisonに焼き込むファイルをtoFlashフォルダにまとめる。

```bash
$ ../device-software/utils/flash/postBuild.sh
```

ここから実際にEdisonに焼き込みを行う。
※先ずはEdisonとubuntuは接続しないでおく

```bash
$ cd toFlash
$ sudo ./flashall.sh
[sudo] password for slavey:
Using U-Boot target: edison-default
Now waiting for dfu device 8087:0a99
Please plug and reboot the board
# ↑これが出たらEdisonのUSB OTGを接続する。

```

焼き込みが完了したら、とりあえずEdisonの電源を切ってubuntuと切り離す。

##10.ここからEdisonでの作業

Mac側でEdisonへシリアルログイン

```bash
$ screen  /dev/tty.usbserial-A703ZARJ 115200 -L 
```
 User : root
 Pass : なし


先ず、USB接続が認識されていることを確認

USB OTGを外部機器で利用する際は電源供給をUSB以外から行う必要がある。
<a href="https://communities.intel.com/servlet/JiveServlet/downloadBody/23252-102-8-27632/edison-breakout_HG_331190-004.pdf">Intel Edison Breakout Board Hardware Guide</a>を見ると、J21から7v〜15vを取得できるとのこと。

今回は、Galileo用の12vをブレッドボードから結合。
![IMG_0387.jpg](https://qiita-image-store.s3.amazonaws.com/0/52867/ea6210e5-2264-d23d-8bc2-64c44e40a2bf.jpeg)

```bash
# ドライバを認識しているかの確認
root@edison:~# lsmod
Module                  Size  Used by
uvcvideo               71516  0 
videobuf2_vmalloc      13003  1 uvcvideo
videobuf2_memops       13001  1 videobuf2_vmalloc
videobuf2_core         37707  1 uvcvideo
usb_f_acm              14335  1 
u_serial               18582  6 usb_f_acm
g_multi                70703  0 
libcomposite           39245  2 usb_f_acm,g_multi
bcm_bt_lpm             13676  0 
bcm4334x              574851  0 

root@edison:~# lsusb
Bus 001 Device 002: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 056e:7016 Elecom Co., Ltd 
Bus 001 Device 004: ID 0d8c:013c C-Media Electronics, Inc. CM108 Audio Controller
```


認識されているのを確認したら、Edisonの初期セットアップ

``` bash
# PASSWORD, WIFIの設定
$ configure_edison --setup

# Package Managerの設定
$ vi /etc/opkg/base-feeds.conf
src/gz all http://repo.opkg.net/edison/repo/all
src/gz edison http://repo.opkg.net/edison/repo/edison
src/gz core2-32 http://repo.opkg.net/edison/repo/core2-32

$ vi /etc/opkg/intel-iotdk.conf
src intel-iotdk http://iotdk.intel.com/repos/1.1/intelgalactic
src intel-all http://iotdk.intel.com/repos/1.1/iotdk/all
src intel-i586 http://iotdk.intel.com/repos/1.1/iotdk/i586
src intel-x86 http://iotdk.intel.com/repos/1.1/iotdk/x86

# Package Update
$ opkg update
$ opkg upgrade

```
##11.オーディオ入出力ツールをインストール
opkgでALSAをインストール

```bash
$ opkg install alsa-utils
```


##12.音声を出力
テスト用のサウンド（test.wav）準備して音声出力

```bash
$ aplay -D plughw:1,0 test.wav 
```


イヤホンから音が出ている確認ができました。

##13.Edisonロボット接続

今回は以下の20軸サーボモータコントローラを使用
![WR-MSXX.jpg](https://qiita-image-store.s3.amazonaws.com/0/52867/e415b191-89a8-8a32-e307-3dae5d71b1a0.jpeg)



サーボコントローラを操作はシリアル通信で行うため、EdisonのUART設定を行う。
UARTはGalileo開発ボードのPIN0/PIN1(/dev/ttyMFD1)を利用。

UARTを使うにはGPIOのmodeを変更しなければ行けないらしい？！
※Intelのmraaでmraa_uart_init(0);でもOKみたいです。
　<a href="http://iotdk.intel.com/docs/master/mraa/uart_8h.html">mraa: uart.h File Reference</a>

以下コマンドを実行してmode変換

```Bash
$ echo 214 > /sys/class/gpio/export 2>&1
$ echo high > /sys/class/gpio/gpio214/direction
$ echo low > /sys/class/gpio/gpio214/direction
 
$ echo 131 > /sys/class/gpio/export 2>&1
$ echo mode1 > /sys/kernel/debug/gpio_debug/gpio131/current_pinmux
$ echo 249 > /sys/class/gpio/export 2>&1
$ echo high > /sys/class/gpio/gpio249/direction
$ echo 1 > /sys/class/gpio/gpio249/value
$ echo 217 > /sys/class/gpio/export 2>&1
$ echo high > /sys/class/gpio/gpio217/direction
$ echo 1 > /sys/class/gpio/gpio217/value
$ echo out > /sys/class/gpio/gpio131/direction
$ echo 0 > /sys/class/gpio/gpio131/value
 
 
$ echo 130 > /sys/class/gpio/export 2>&1
$ echo mode1 > /sys/kernel/debug/gpio_debug/gpio130/current_pinmux
$ echo 248 > /sys/class/gpio/export 2>&1
$ echo low > /sys/class/gpio/gpio248/direction
$ echo 0 > /sys/class/gpio/gpio248/value
$ echo 216 > /sys/class/gpio/export 2>&1
$ echo in > /sys/class/gpio/gpio216/direction
$ echo in > /sys/class/gpio/gpio130/direction

$ echo high > /sys/class/gpio/gpio214/direction
```

このあとNode.jsのserialportで接続の確認ができ、Wifi経由でロボット操作が可能になりました。

ここまでで、なんだかんだ２日も掛かりました。

このあと音声認識と画像認識の組込みを行う予定です。
ただ、Edisonの外部機器とサーボ9軸への電源供給が課題。。。