Ubuntu18.04でAIミニ四駆キットをアップデートする

あかまるさんが技術書典で配布していたAIミニ四駆キットのファームウェアアップデートをUbuntu18.04で行う。
マイコンとしてはSAMD51J20Aなのでこのマイコンをターゲットに書き込みをしたい人も参考になると思う。

# 用意するもの
## Atmel-ICE
BASICキットで良い。秋月で10,800円。
マルツだと基板むき出しのPCBAキットも売ってる。こちらは7,915円。
付属しているケーブルの長さの都合上、ミニ四駆の上にICEを置く必要があるのでケース付きのBASICキットをおすすめする。
結局CMSIS-DAPとして使ってるので、もっと安いやつでもいいと思う。

## WindowsPC
Ubuntuで作業するといいつつ、Windowsが出てくるのは申し訳ないが、Atmel StudioからcmsisとDEPを引き抜いてくるのに使用する。
このファイルがあれば用済みなので許してほしい。

## 電池
基板を起動させないと焼けない。

# ビルド環境の準備
## ARMクロスコンパイラのインストール
Ubuntuのデフォルトのリポジトリにあるgcc-arm-none-eabiを使用するとビルドエラーが起きる。
以下のようにコンパイラをインストールする。

```
sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa
sudo apt-get update
sudo apt-get install gcc-arm-embedded
```

# ソースの準備
## AIミニ四駆キットのソースの入手
1. 以下からcloneする。  
https://github.com/aks3g/ai_mini_4wd_kit

## MicroPythonのソースの入手
1. 以下のreleasesからai_mini_4wd_kitが対応してるバージョンを落とす。  
現在だと1.9.4に対応している。  
https://github.com/micropython/micropython
2. 落としたソースをai_mini_4wd_kitのmicro_python直下にコピーする。  
MicroPythonのソース無いとai_mini_4wd_kitのportsのディレクトリがマージされるディレクトリの位置ならOK。

## cmsisとDEPの入手
1. WindowsでAtmelStudioをインストールする。
2. インストール後、SAMD51J20Aをターゲットにしたプロジェクトを適当に作る。
3. ```C:\Program Files (x86)\Atmel\Studio\7.0\packs```をLinuxに持ってくる。
4. 任意の場所にpacksを展開する。(以降/YOUR/GET/ATMEL_STUDIO/packsに置いたとする。)
5. packs/arm/CMSISからpacks/arm/cmsis/5.0.1/CMSISにシンボリックリンクを張る。

# ビルド
## 環境変数の設定
以下はfishのものです。自分の環境に合わせてください。

```fish
set -x CROSS_COMPILE /usr/bin/arm-none-eabi-
set -x PACKS_PATH /YOUR/GET/ATMEL_STUDIO/packs/
```

## make

```
cd ai_mini_4wd_kit/src/micro_python/ports/ai_mini4wd
make
```
成功すると```ai_mini_4wd_kit/src/micro_python/ports/ai_mini4wd/build```ディレクトリが作られ、この中にfirmware.elfが生成される。

# 書き込み
## OpenOCDのインストール
UbuntuデフォルトのリポジトリにあるOpenOCDはSAMD5X系に対応していない。
自分でビルドする必要がある。
### ソースの入手
以下からcloneする
https://sourceforge.net/p/openocd/code/ci/master/tree/
私がビルドしたコードのsha1は```af952850b549124202903a24116d413fa145a769```であるが、SAMD5Xに対応したのは```deaf3d264123391d8fe5c4cccbf8fb8852e1be23```からなので、このコミット以降ならどれでも構わないと思う。
分からなければmasterで良い。

### 依存ライブラリのインストール
OpenOCDは以下のパッケージに依存する。

* make
* libtool
* pkg-config
* autoconf
* automake
* texinfo

今回Atmel-ICEを使用するため、追加で以下のパッケージもインストールする。

* libusb-dev
* libhidapi-dev

### ビルド
```
./bootstrap
./configure --enable-cmsis-dap
make
sudo make install
```
configureのenable-cmsis-dapはなくても上記のライブラリが入っていれば有効になるが、念の為つけておく。

## OpenOCDの設定ファイルの作成
OpenOCDはカレントディレクトリに```openocd.cfg```というファイルが存在すればこれを読み込む。
実行したいディレクトリで次のようなopenocd.cfgファイルを作る

```
interface cmsis-dap

set CHIPNAME samd51j20a
source [find target/atsame5x.cfg]
```

Atmel-ICEをPCに接続していない状態でOpenOCDを実行する

```
openocd
```
ファイルに問題がある場合、エラーメッセージが出力される。
ファイルに問題がないことを確認したらCtrl+Cで終了する。

## PCと基板の接続
1. Atmel-ICEの付属のケーブルをSAMと書いてある方に差す。
2. ミニ四駆に電池と基板をセットする。走り出すと困るのでSDカードは抜いておく。
3. Atmel-ICE付属ケーブルをミニ四駆の進行方向右上にあるピンに差す。  
  ケーブルのコネクタはケーブルの途中についているものを使用する。  
  ケーブルの赤い線がミニ四駆の外側になるように差す。
4. Atmel-ICEをPCとUSBで接続する。  
  この時Atmel-ICEの真ん中のランプが光る。
5. ミニ四駆の電源を入れる。  
  この時Atmel-ICEの左側のランプが光る。

## OpenOCDの起動
OpenOCDを起動する。
udev/rulesを書けばsudoは要らないと思うが、設定が面倒なのでsudoする。

```
sudo openocd
```

別のターミナルを開く。
パスを書くのが面倒なのでカレントディレクトリにfirmware.elfを持ってくる。
telnetでlocalhost:4444につなぐ。

```
telnet localhost 4444
```
OpenOCDと接続ができたらfirmware.elfを焼き込む。
以下を実行する。

```
init
reset halt
flash write_image erase firmware.elf
reset run
exit
```

以上で書き込みまで終了する。
お疲れ様でした。

# ハマったポイント
## gcc-arm-none-eabiパッケージで入るGCCでビルドエラー
以下のエラーが出る

```
CC build/_frozen_mpy.c
LINK build/firmware.elf
/usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/bin/ld: error: /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/crt0.o: Conflicting CPU architectures 13/1
collect2: error: ld returned 1 exit status
Makefile:63: recipe for target 'build/firmware.elf' failed
```
gcc-arm-none-eabiをapt remove & apt autoremoveしてから手順に戻ること。
autoremoveまでしないとgcc-arm-embeddedのインストールに失敗する。

# あとがき
あかまるさんの基板は完成度が高く、いろいろな部分に試行錯誤やアイディアでなんとかしてきた感じのところがあって非常に良い。
ぶっちゃけた話、技術書典で軽くお話を伺っただけも非常に面白かったので、本当にミニ四駆やるかわからないけど話面白かったし金を出したいな的な感じで基板をお分けいただいた。
実際に基板をいじるとまた楽しかったのだが、フレキ基板部分が消耗品感あるので、この基板がめちゃくちゃ人気出て定常的に基板手に入るようにならないかな？くらいの変なことを思いこの記事を書いた。
まぁ、なかなかそうはならないと思いますが、またイベントで基板売ってください。(今度はフレキだけほしいです。)
自分でも基板作れるようがんばります…。