MacでLego Mindstorms NXT環境構築 in 2018

# 目的
大学の講義でNXTを用いた授業があるが，授業で提供されている資料が古く，Macの人が環境構築できない現状である．
そのため，備忘録として自分が環境構築した方法を残しておく．

エラー対処については適時追加する．

# 環境
- MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)
- macOS 10.13 (High Sierra)

# 手順
## 1.Wineのインストール
Windowsのファイルを実行するために用いる．
brewを用いるため，導入していない人は自分で調べて導入してほしい．
以下のコマンドを実行してwineを導入する．

```
$ brew install wine
```

実行後，`/usr/local/bin/wineconsole`のファイルが存在することを確認する．

## 2.YAGARTOのインストール
コンパイラツールであるYAGARTOをダウンロードする．

その前に，NXTで用いる環境をまとめるディレクトリを作る．
筆者はホームディレクトリ直下に`NXT`というディレクトリを作成した．

[こちら](https://sourceforge.net/projects/yagarto/files/YAGARTO%20for%20Mac%20OS%20X/20111119/)のサイトから
`yagarto-bu-2.21_gcc-4.6.2-c-c++_nl-1.19.0_gdb-7.3.1_eabi_intelmac_20111119.dmg`
をダウンロードする．

ダウンロード後，dmgを実行し`yagarto-4.6.2`と出てくるので，先ほど作成したNXTに移して実行．
そうすると，`yagarto-4.6.2`というディレクトリが出てくる．
このディレクトリを`yagarto`に名前を変更する．

## 3.nxtOSEKのダウンロード
[こちら](https://sourceforge.net/projects/lejos-osek/files/nxtOSEK/)のサイトからダウンロードする．
筆者は`nxtOSEK_v218.zip`をダウンロードした．

ダウンロード終了後，2にて作成した`NXT`の直下に配置する．
この時点での`NXT`内は以下のようになっている．

```
NXT
├── nxtOSEK
├── yagarto
└── yagarto-4.6.2.app
```

しかし，現状では必要ファイルが不足している．

そのため，[こちら](http://www.toppers.jp/osek-download.html)から`osek_os-1.1.lzh`をダウンロードする．
その後，解凍をして出てきた`toppers_osek/sg/sg.exe`を`NXT/nxtOSEK/toppers_osek/sg`にコピーをする．

この時点での`NXT/nxtOSEK/toppers_osek/sg`内は以下のようになっている．

```
NXT/nxtOSEK/toppers_osek/sg
├── impl_oil
├── lego_nxt.sgt
└── sg.exe
```

## 4.NeXTToolのインストール
NXTにプログラムを送信するために用いる．
`NeXT Tools`ではなく`NeXTTool`である為間違えないように．

`Download for Mac OSX (universal binary)`とある場所からダウンロードする．
<img width="1438" alt="スクリーンショット 2018-10-11 13.45.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/252620/4a82cdee-99a4-0a63-ee32-d1ee8edbd77c.png">

ダウンロード後，2で作成した`NXT`の直下に配置する．
この時点での`NXT`内は以下のようになっている．

```
NXT
├── nexttool
├── nxtOSEK
├── yagarto
└── yagarto-4.6.2.app
```

## 5.NXT Fantom Driverのインストール
パソコンにNXTを認識させるために用いる．
[こちら](https://www.lego.com/en-us/mindstorms/downloads)のサイトからダウンロードする．

ページ下部の方にあるため，見落とさないように．
<img width="1127" alt="スクリーンショット 2018-10-11 13.35.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/252620/1bde1e2b-a86a-5517-1522-389c2c5cfbc9.png">

ダウンロード後，解凍して出てきた`MAC legodriver.pkg`を実行する．

## 6.makeのための準備
現在のままだとCygwinを用いるようになっているため，Macでも問題がないように変更する．

以下の4箇所を探して変更する．各々の設定に合わせて変更してほしい．

```diff:NXT/nxtOSEK/ecrobot/tool_gcc.mak
9行目
- GNUARM_ROOT = /cygdrive/C/cygwin/GNUARM
+ GNUARM_ROOT = /Users/vivid344/NXT/yagarto  # YAGARTOのパス

14行目
- NEXTTOOL_ROOT = /cygdrive/C/cygwin/nexttool
+ NEXTTOOL_ROOT = /Users/vivid344/NXT  # nexttoolがあるパス

21行目
- TARGET_PREFIX :=arm-elf
+ TARGET_PREFIX :=arm-none-eabi

38行目
- NEXTTOOL  = NeXTTool.exe
+ NEXTTOOL  = nexttool
```

また，Wineや，cygpathで現状だとエラーが起きるため変更を行う．

Cで開発を行う場合は以下の2箇所の修正を行う．

```diff:NXT/nxtOSEK/ecrobot/ecrobot.mak
312行目
- WINECONSOLE := /Applications/Wine.app/Contents/MacOS/startwine wineconsole
+ WINECONSOLE := /usr/local/bin/wineconsole

335〜336行目
- $(WINECONSOLE) $(TOPPERS_OSEK_ROOT_SG)/sg/sg $(shell cygpath -m -w ${TOPPERS_OSEK_OIL_SOURCE}) \
-         -os=ECC2 -I$(shell cygpath -m -w ${TOPPERS_OSEK_ROOT_SG})/sg/impl_oil -template=$(shell cygpath -m -w ${TOPPERS_OSEK_ROOT_SG})/sg/lego_nxt.sgt
+   $(WINECONSOLE) $(TOPPERS_OSEK_ROOT_SG)/sg/sg.exe $(TOPPERS_OSEK_OIL_SOURCE) -os=ECC2 -I${TOPPERS_OSEK_ROOT_SG}/sg/impl_oil -template=${TOPPERS_OSEK_ROOT_SG}/sg/lego_nxt.sgt
```

C++で開発を行う場合は以下の2箇所の修正を行う．

```diff:NXT/nxtOSEK/ecrobot/ecrobot++.mak
316行目
- WINECONSOLE := /Applications/Wine.app/Contents/MacOS/startwine wineconsole
+ WINECONSOLE := /usr/local/bin/wineconsole

339〜340行目
- $(WINECONSOLE) $(TOPPERS_OSEK_ROOT_SG)/sg/sg $(shell cygpath -m -w ${TOPPERS_OSEK_OIL_SOURCE}) \
-         -os=ECC2 -I$(shell cygpath -m -w ${TOPPERS_OSEK_ROOT_SG})/sg/impl_oil -template=$(shell cygpath -m -w ${TOPPERS_OSEK_ROOT_SG})/sg/lego_nxt.sgt
+   $(WINECONSOLE) $(TOPPERS_OSEK_ROOT_SG)/sg/sg.exe $(TOPPERS_OSEK_OIL_SOURCE) -os=ECC2 -I${TOPPERS_OSEK_ROOT_SG}/sg/impl_oil -template=${TOPPERS_OSEK_ROOT_SG}/sg/lego_nxt.sgt
```

続いて，各関数を呼び出すために必要なファイルをmakeする．
`NXT/nxtOSEK/ecrobot/c`にて以下のコマンドを実行する．

```
$ make all
$ make release
```

これを`NXT/nxtOSEK/ecrobot/c++`，`NXT/nxtOSEK/ecrobot/bios`，`NXT/nxtOSEK/ecrobot/nxtway_gs_balancer/`にても同様に行う．


## 7.実際にmakeする
Cで行う人は`NXT/nxtOSEK/samples_c/helloworld`
C++で行う人は`NXT/nxtOSEK/samples_c++/cpp/Helloworld`
にて以下のコマンドを実行する．

```
$ make all
```
実行後，`.rxe`ファイルが生成される確認する．
生成されない場合，6にて変更した箇所が間違っている可能性がある．

## 8.ロボットで実行する
NXTとPCをUSBで繋ぎ，NXTの電源を入れる．
その後以下のコマンドを実行する．

```
$ ./rxeflash.sh
```

その後，ロボット側で実行し，該当ファイルがあるかを確認．

以上で終了．

# まとめ
以上で筆者の環境では構築することが出来た．
今後新しく開発をするときには，`NXT/nxtOSEK/`の下で開発をする．
またMakefileの`NXTOSEK_ROOT`を各々の環境に書き換えてからmakeを行うように．

# 参考
[ETロボコン開発環境構築 for Mac](https://qiita.com/tac0x2a/items/b1d82050c660935765ef)