LoginSignup
0
0

More than 1 year has passed since last update.

【倒立振子】ビュートバランサー2のファームウェアをUbuntuに移植する

Last updated at Posted at 2022-11-09

倒立振子の教育用キット「ビュートバランサー2」のファームウェアをLinuxに移植する。

image.png

公式サイト

2014年の状況から、アップデートされていないが、
ビュートバランサー2そのものは購入でき、サンプルプログラムは普通に動く。

ソースコードの変更がまともに出来ない

ところが、ソースコードを変更しだすと、いろいろな問題に出くわす。
特に、この数年の間で、LPCxpressoからMPUXpressoという新しいIDEに切り替わっているのが大きく、いくつかソースコードの変更をしないといけなかったので紹介する。

また、Ubuntu特有の詰まりポイントも。

実際行なった作業

github

実を言うと、あまり引用されていない。
ファームウェアをいじることがほとんどない人の方が多いからかも。

MCUXpressoのインストール(Windows, Ubuntu共通)

最新版のMCUXpresso v11.6.1をインストール。

Screenshot from 2022-11-09 19-32-19.png

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にて、

Screenshot from 2022-11-09 19-35-38.png

memmapのところで、どうも多重インクルードによるエラーが発生しているようだ。
そこで、多重定義でないことを伝えるために、extern宣言を29行目に入れ、extern union ~という形にする。

Screenshot from 2022-11-09 19-36-23.png

このようにすることで、グローバルな定義として共用体が定義されるので、多重インクルードの問題を防ぐことが出来る。

(ただ多重インクルードが発生している要因はいまいち不明。
 生成されるmakefileの関係などが影響していると考えられる)

ヘッダファイル(Ubuntuのみ)

Screenshot from 2022-11-09 19-49-30.png

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カードを使って、ブートローダを書き込むときに、固定長でまとめて書き込むやり方と同じ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0