倒立振子の教育用キット「ビュートバランサー2」のファームウェアをLinuxに移植する。
公式サイト
2014年の状況から、アップデートされていないが、
ビュートバランサー2そのものは購入でき、サンプルプログラムは普通に動く。
ソースコードの変更がまともに出来ない
ところが、ソースコードを変更しだすと、いろいろな問題に出くわす。
特に、この数年の間で、LPCxpressoからMPUXpressoという新しいIDEに切り替わっているのが大きく、いくつかソースコードの変更をしないといけなかったので紹介する。
また、Ubuntu特有の詰まりポイントも。
実際行なった作業
github
実を言うと、あまり引用されていない。
ファームウェアをいじることがほとんどない人の方が多いからかも。
MCUXpressoのインストール(Windows, Ubuntu共通)
最新版のMCUXpresso v11.6.1をインストール。
LPCxpressoでビュートバランサー2が出た頃と比べると、相当画面も変わっているので注意が必要。
一部の共用体がextern宣言されていない&多重インクルード発生?(Windows, Ubuntu共通)
いくつかソースがあるが
デフォルトのプロジェクトを使って説明する
githubのリポジトリをそのままクローンし、インポートしてビルドすると、
次のエラーが発生する。
(※長いので一部トリミング)
./src/main.o:/home/mcuxpresso/BeuatoBalancer2/Balancer2/MCUxpresso/Balancer2_firm_Default/lib/Balancer2.h:104:
multiple definition of `memmap'; ./src/control.o:/mcuxpresso/BeuatoBalancer2/Balancer2/MCUxpresso/Balancer2_firm_Default/lib/Balancer2.h:104: first defined here
collect2: error: ld returned 1 exit status
そして、エラーの箇所を見ると、
Balancer2.hにて、
memmapのところで、どうも多重インクルードによるエラーが発生しているようだ。
そこで、多重定義でないことを伝えるために、extern宣言を29行目に入れ、extern union ~という形にする。
このようにすることで、グローバルな定義として共用体が定義されるので、多重インクルードの問題を防ぐことが出来る。
(ただ多重インクルードが発生している要因はいまいち不明。
生成されるmakefileの関係などが影響していると考えられる)
ヘッダファイル(Ubuntuのみ)
Balancer2.hの6行目
これは修正されているが、元々のプログラムはWindowsでしか考慮されていないので
#include "lpc13xx.h"
となっていて、これでコンパイルが通らないので注意。
プログラムライトの注意(Ubuntuのみ)
ちょっとハマった。
ビュートバランサー2のボタンを押しながらUSBを差し、
ボタンを離すと、CRP(Code Read Protection)がOFFになり、
ROM領域にプログラムを書き込むことが出来るようになる。
Windowsの場合、「Removable Device」としてその領域が見えるので、
そこに存在するfirmware.binを削除し、
ビルドによって生成された***.binファイルをドラッグ&ドロップするだけで実行できる。
Ubuntu(に限らず他Linux、またはMac OS)の場合は、別の方法を利用する必要がある。
こちらを参考
ターミナルで次のように入力する
dd bs=1024 conv=nocreat,notrunc if=<ビルドで生成されたバイナリファイル>
of=/media/<ユーザ名>/CRP\ DISABLD/firmware.bin
ここで、ddコマンドはブロックコピーであり、CortexシリーズのCPUは1ブロック辺り0x1000バイト(4096バイト)をROMの1単位としている。
この設定はCortexマイコンのCRPのレジスタ設定によって変更できたはずだが、どうもビュートバランサー2の場合は、1ブロックごとでまとめて書き込みしなければ無効になる設定だと思われるので、Windowsと同じような動作で書き込みすることは出来ない。
ちなみに、このやり方は、確かRaspberry PiやArduinoで、SDカードを使って、ブートローダを書き込むときに、固定長でまとめて書き込むやり方と同じ。