6月のまとめ

進捗

  • SOEMのchipKIT Max32対応
  • SOEMのNucleo-F446RE対応
  • ミニ四駆ラジコンのRumiCar化 / GPduinoによるRumiCar製作
  • マイRumiCar試走会@大阪 開催

イベント等

動画


所感

今月は、SOEMの移植に一区切りをつけ、RumiCarという新しいテーマに取り組みはじめた。今月の成果物は少なめだが、RumiCarは今後の展開が楽しくなりそうな予感。

RumiCar用簡易コースの壁の作り方

先日のRumiCar試走会の大阪会場で設営した簡易コースの壁の作り方を紹介します。

  • 材料のやすさ
  • 作りやすさ
  • 設営しやすさ
  • 持ち運びやすさ

がモットーです。

f:id:licheng:20200624203905j:plain:w480

(1) 材料

工作用紙

100円ショップなどで売ってる30cm×40cmの方眼入りのボール紙です。ダイソーだと5枚入りで100円です。
f:id:licheng:20200624200226j:plain:w480

塩ビアングル (20mm×20mm)

ホームセンターなどで売ってる塩化ビニル(PVC)のアングル材です。20mm×20mmのものがちょうどよいでしょう。長さ1メートルで1本160円ほどです。
f:id:licheng:20200619163145j:plain:w480

両面テープ

15mm幅で薄手のものが良いでしょう。
f:id:licheng:20200623201909j:plain

マスキングテープ

設営に使います。養生テープだと工作用紙から剥がしにくいのでマスキングテープのほうが良いです。
f:id:licheng:20200623201959j:plain

(2) 作り方

工作用紙を切る

短手方向 (30cmの方向) に幅5cmの短冊状に切っていきます。工作用紙は5cmごとに太い線が入っているのでこれに合わせると切りやすいでしょう。大量に切る必要がありますが、気を抜いてケガをしないように注意しましょう。
f:id:licheng:20200623202352j:plain:w480

アングルを切る

アングルも幅5cmに切っていきます。そんなにきれいに切る必要はないので、電工ニッパーで切ります。(まちがっても精密ニッパーを使わないように。) 一度には切れないので、いったん歯形を入れておいて隅からチョビチョビ切っていきます。歯形を入れるのにけっこう握力が要ります。作り方に改善の余地ありかも?
f:id:licheng:20200623204205j:plain:w320
f:id:licheng:20200623204226j:plain:w320
f:id:licheng:20200623204246j:plain:w320
f:id:licheng:20200623204302j:plain:w320

f:id:licheng:20200624075359j:plain:w320

アングルを工作用紙に貼る

両面テープでアングルを工作用紙に貼ります。工作用紙の方眼に合わせるとよいでしょう。
f:id:licheng:20200623202635j:plain:w480

(3) 設営

マスキングテープで床に固定したり、となりの壁とつないだりします。曲線にも対応できます。簡単に剥がせて簡単に組み替えることができます。
f:id:licheng:20200624203905j:plain:w480

(4) 持ち運び

重ねて輪ゴムでしばればこの通り。持ち運ぶにも大荷物になりません。
f:id:licheng:20200624075712j:plain:w480

マイRumiCar試走会@大阪 レポート

RumiCar試走会東西同時開催

6月20日に関東で開催されたマイRumiCar試走会に合わせ、大阪の本町デジもく会でもRumiCar試走会を開催しました。オンラインで東西両会場の様子をお互いに中継し、とても楽しい試走会となりました。

関東会場に比べ小さなコースながら、大阪会場には製作途中のものも含めユニークなマシンがたくさん集結しました。(なんかぜんぜんRumiCar関係ないのも混ざってますがw)

f:id:licheng:20200620164619j:plain:w560

大阪会場では最終的に3台のマシンでのレースとなりました。狭いコースなのでコーナーで詰まって切り返しが多発するのはご愛嬌。

関東会場の様子はこちら↓

大阪会場のユニークなマシンの数々

@InatamaSさんのミニ四駆。ステアリングはありませんが、ガチのモータ制御にプロのコダワリを感じます。ミニ四駆らしく乾電池2本で動くのも素晴らしい。マイコンはM5Stick-Cで、モータドライバ基板は独自設計です (→こちらの資料)。

f:id:licheng:20200620142154j:plain:w560

@nakkyiさんが開発中のラズパイカーとobnizカー。ベース車両はダイソーの600円ラジコンですが、ステアリングをサーボに改造されてます (→こちらの記事)。今後の展開が楽しみです。

f:id:licheng:20200620143243j:plain:w560
f:id:licheng:20200620143340j:plain:w560

@igiyさんが今回の試走会のために急遽作ってくれたマシン。電装系は標準的なRumiCarですが、さすがに車がデカすぎやろw

f:id:licheng:20200620141339j:plain:w560

私が昔作ったミニ四駆ラジコンのRumiCar化と、今回作った1/32 GT-RベースのRumiCar。ともに回路は標準的なRumiCarのものではなく、昔作ったミニ四駆ラジコンの基板を流用してます。

f:id:licheng:20200621154631j:plain:w560

RumiCarではありませんが、同様に距離センサで壁をよけて進むキャタビラロボット。これも@nakkyiさんのです。マイコンIchigoJamですね。センサの位置が高すぎて残念ながらRumiCarのコースでは走れませんでした。

f:id:licheng:20200620151023j:plain:w560

RumiCar関係ないですが、筋電車椅子でおなじみの@naranaviさんの車椅子ラジコン。小型ギヤードモータによる対向二輪駆動でスマホからコントロールできます。ベース車両はギルティクラウン篠宮綾瀬の車椅子だそうですw

f:id:licheng:20200620150719j:plain:w560

今後の展開

今回は関西では初めての試みでコースも小さく、周回できたマシンも3台のみでしたが、これは面白くなりそうという手ごたえを感じました。本町デジもく会では今後もRumiCarに取り組んでいきたいと思ってますし、次回はもっと広いコースでやりたいなと思います。

PSoC Creatorの .gitignore

*.cywrk.*
*.cydsn/codegentemp/
*.cydsn/CortexM0p/
*.cydsn/CortexM3/
*.cydsn/CortexM4/
*.cydsn/Export/
*.cydsn/Generated_Source/
*.cydsn/*.cyprj.*
*.cydsn/*.cycdx
*.cydsn/*.cyfit
*.cydsn/*.rpt
*.cydsn/*.svd
*.cydsn/*_datasheet.pdf
*.cydsn/*_timing.html
*.cydsn/*.log

BLEの最大データサイズ?

今さらですが、BLEの最大データサイズって (BLE4.2以降のデータ長拡張は別として) 何バイトでしょう? 27バイト? 23バイト? 22バイト? 20バイト?

資料によってまちまちで混乱しませんか? 中には「20バイト程度」とかボカして書かれてたり。これ、図解すると下図のようになります。

f:id:licheng:20200609094836p:plain

27バイトというのはLLのペイロードの最大サイズ、23バイトというのはL2CAPのペイロードの最大サイズ、22バイトや20バイトというのはATTのペイロードの最大サイズです。

BLEもEthernetとかと同様に何段にもプロトコルが積み重なってるので、上にいくほどヘッダが削ぎ落されてペイロードが小さくなっていきます。Ethernetだと元が1500バイト以上あるのでそこまで気になりませんが、BLEは元が小さいのですごく目減りする感じがします。

結論としてキャラクタリスティックの最大データサイズはReadでは22バイト、Write, Notify, Indicateでは20バイトとなります。が、Read専用の場合だけ22バイトというのもおなしな話なので一律最大20バイトと考えたほうが無難に思います。

しらんけど。

5月のまとめ

進捗

  • SOEMのNucleo-F767ZI対応
  • SOEMのM5Stack対応
  • ミニ四駆ラジコンのRumiCar化

動画公開


所感

先月に続き停滞気味で体調も崩しがちだったが、ながらく苦戦したSOEMのNucleo対応にようやく成功し、少し勢いが戻ってきた感じ。新たにRumiCarというお題にも取り組みはじめた。来月はさらに勢いを取り戻したい。

Mbed OS 5を静的ライブラリとしてビルドする

【2020/05/21 追記】
本記事の手順で作成したMbed OS 5の静的ライブラリを使用すると正常に動作しないケースがありました。発生条件や原因は調査中です。

やりたいこと

Mbed OS 5をあらかじめ静的ライブラリとしてビルドしておく。

背景

Mbed OS 5のソースコードは膨大な量で、非力なPCではフルビルドに数十分もかかります。またインクリメンタルビルドですら更新チェックにかかる時間が煩わしいです。ユーザープログラムの開発者がOSのソースコードを変更することはふつう無いので、これは時間の無駄です。

そこで、Mbed OS 5を別プロジェクトであらかじめ静的ライブラリとしてビルドしておき、ユーザープログラムのプロジェクトではビルド済みの静的ライブラリを利用することでビルド時間を短縮したいと思いました。

開発環境

ここでは例として、Nucleoボード(STM32マイコン)をターゲットとし、ローカルビルド環境としてSW4STM32 (Eclipseベース)を使用します。他のEclipseIDEでもだいたい似たようなものだろうと思います。

Mbed CLI ならもっと洗練された方法があるのでしょうか? 今回はそちらは未調査です。

Mbed OS 5用プロジェクトの作成

  • Mbedのオンラインコンパイラでプロジェクトを作成します。ここでは「プラットフォーム」を「NUCLEO-F767ZI」、「テンプレート」を「mbed OS Blinky LED HelloWorld」、「プログラム名」を「mbed-os」とします。
  • 「プログラムのエクスポート」でこのプロジェクトをzipでダウンロードします。ここでは「Export Target」を「NUCLEO-F767ZI」、「Export Toolchain」を「SW4STM32」とします。

f:id:licheng:20200516161254p:plain

  • SW4STM32を起動し、[File] > [Import] > [Existing Projects into Workspace] でzipファイルを選択してプロジェクトをインポートします。
  • main.cppは不要なので削除します。 (エクスプローラで削除した場合はSW4STM32でF5キーを押してリフレッシュします。)
  • [Project] > [Properties] > [C/C++ Build] > [Build Artifact] で [Artifact Type] を Static Library に変更し、[Artifact name] を ${ProjName} に、[Artifact Extension] を a に、[Output prefix] を lib にします。

f:id:licheng:20200516230806p:plain:w640

  • [Project] > [Properties] > [C/C++ Build] > [Build Steps] で [Post-build steps] を空欄にします。

f:id:licheng:20200516174206p:plain:w640

Mbed OS 5の静的ライブラリをビルド

  • [Project] > [Build Project] でプロジェクトをビルドします。
  • MBED_COMPILER_BARRIER の行で「'asm' undeclared」というエラーが発生する場合はこちらを参照。
  • ビルドが成功するとプロジェクトフォルダの下の Debug または Release フォルダに libmbed-os.a というファイルができます。
  • これがMbed OS 5の静的ライブラリファイルですので取っておきます。

ユーザープログラムのプロジェクトを作成

  • Mbedのオンラインコンパイラでプロジェクトを作成し、zipファイルにエクスポートしてSW4STM32にインポートします。手順は上記「Mbed OS 5用プロジェクトの作成」の場合と同様です。
  • プロジェクトフォルダの下の mbed-os フォルダの下に、さきほどビルドした libmbed-os.a をコピーします。
  • プロジェクトフォルダの下の mbed-os フォルダの下にある、拡張子が c または cpp のファイルを全て削除します。Windosの場合は下記のようなバッチをプロジェクトフォルダの下で実行すると削除できます。
@echo off
for /R mbed-os %%i in (*.c) do del %%i
for /R mbed-os %%i in (*.cpp) do del %%i
  • Linuxの場合はプロジェクトフォルダの下で下記コマンドを実行すれば削除できます。たぶんMacでも同様。
find mbed-os -type f -name "*.c" -delete
find mbed-os -type f -name "*.cpp" -delete
  • SW4STM32でF5キーを押してリフレッシュします。
  • [Project] > [Properties] > [C/C++ General] > [Paths and Symbols] > [Library Paths] に mbed-os を追加します。 (これは libmbed-os.a を置いたフォルダの指定です。)

f:id:licheng:20200516221148p:plain:w640

  • [Project] > [Properties] > [C/C++ General] > [Paths and Symbols] > [Libraries] に mbed-os を追加します。(これはライブラリ名の指定です。頭に「lib」を付けないことと、拡張子「.a」を付けないことに注意してください。)

f:id:licheng:20200516221205p:plain:w640

ユーザープログラムをビルド

  • [Project] > [Build Project] でプロジェクトをビルドします。
  • かなり短い時間でビルドが完了するようになります。
  • 「undefined reference to `__wrap__free_r'」等のエラーが発生する場合はこちらを参照。
  • さらにビルド時間を短縮するためにMakefile生成を抑制するにはこちらを参照。
  • デバッグ実行時に「OpenOCD Binary not found」と言われたらこちらを参照。

以上で非力なPCでもMbed OS 5の開発できそうな気がしてきました。