Clion+CubeMXでSTM32マイコンの開発環境紹介(CMake)

当記事は後で書き直します。画像の用意が面倒。

開発環境の紹介

  • Clion 2019.3
  • CubeMX(デフォルトでClionに内包)
  • CMake

なぜこの構成

  • ビルド環境をOS依存にさせたくない。(プラットフォーム対応しているIDEなどを使う)
  • マイコンのドライバソフトに力を入れない。(CubeMXによる、HAL or LL出力)
  • Gitを経由して複数のOS、環境にて再度開発環境を再構築したい。

最新のClionではCubeMX、OpenOCDが標準に組み込まれており、Windows, Mac, その他Linux環境での構築が可能である。

exlipseベースの他のIDEでは、C++の環境を標準で作成してくれない上、 いちいちオプションを見たりと、C++プロジェクトにするのに手間がかかる。そこでCMakeを率先して使いたい。

他に組み込みたいこと

内部にMatlabなどのシミュレーション環境も内包させ、Matlab/Simulink coderを使用し、シミュレーション、コード生成といった流れを作りたい。

C++GUIアプリを作ろうとすると、環境依存が大きいので、やめることにした。(Win環境しかできないとか、まるで求めてない。)

今年のアップデート点

このブログはMice Advent Calendar 201914日目の記事です。

強調に意味などありません。14日目の記事です。良いですね?

さて。タイトルの通り、今年試したネタ(ボツネタ含む)を紹介していこう

ExiaAlter(黒)

APEC大会向けに定格無視していた部分をすべて直したつもりの機体。

使用したICが悪かったせいか、不安定の極み。シーズン後半ではExiaAlter(白)を使う羽目に。

ExiaAlter(白) 修正版

昨年の有償機体

  • エンコーダからの出力(5V)を直にマイコン(3.3V定格ピン)に流していたが、分圧していれるように修正。
  • 足回りはアクリルからMJFに変更し、強度を向上
  • 吸引ファンはダクトを渦巻きポンプを意識し作ることで、圧損を軽減、低騒音と効率上昇を実現

Exia-Jr.

新作ハーフの予定だったもの。ExiaAlterのフォルムをそのまま小さくした機体。強そうな印象がないためお蔵入り。

  • ギアの噛み合いが何故か悪かった
  • 重い
  • RX71Mを思ったより余裕で載せられたので、つまらなくなった。

これまでも、お蔵入りの機体>リリースされた機体 なので、仕方がない。

一回限りの根気で作れるものなんてたかが知れてます。1度良いものを作れるわけないのは仕事でも同様。(これを知らず、すぐに心折れる人を何人も見てきた)

調整システム

全データアップデート機能を実装。これでパラメータが合計1300個だったことを知る。 使ってないデータはいくらかあるのだが。これは酷い。

バッテリー

いつものHyperionを3個直列。半年程度で膨れ始めるからいい加減やめたい

ソースコード

テストプログラムを修正しただけ、実はここ3年ほどほとんどアルゴリズムの開発を行ってない。 パラメータチューニングだけで済ませている。来年は大型アップデートするので、作り直しかな

次回作の構想

この記事はMicro Mouse Advent Calendar 2019の7日目の記事です。

なお、2019/12/06 23:47から書き始めています。RTAです。

まずは

2019年全日本大会お疲れ様でした。

昨年優勝したものの、あっさり3位に陥落しました。 これで、勝ち逃げと言われず、ハーフに行けるというものです。

次回作の構想

ハードウェア周り

今回のマイクロマウスにて、W特別賞の彼が利用しているマイコン「ESP32」をメインにした構成にしようと構想中

電波法の改正があったので、無線回りも工夫したいですね。

ソフトウェア周り

従来のヘンテコC言語による実装をほぼすべて廃棄したい。

せっかくある高級MATLABを使ったモデルベース開発を主軸にしていこうかなと

起動生成について

今までの軟化子を使ったターンを廃止。 基準軌道をベースに追従軌道と数msec後先まで計算するモデル予測制御を採用したい。

最後に3つほど

上記どれもが完成するまで大会に出ませんとかそういうのは多分しません。 所詮構想です。完成して動いたら勝ちです。出れないのが最悪の敗北です。

それと、大会結果はあの場にいれば知ってるので、もっと未来の話とか、裏話とか聞きたいな!!!

明日はアライさんの「社会人マウサーを続けるコツ?みたいなもの」です。 注文した品は来ないが、今シーズン台風を呼び寄せ続けた方がきっとためになる話をしてくれます!!

APEC2019に行ってきた話

3行まとめ

  • APEC大敗
  • ネット環境はt-mobileのSIMで充分。
  • ぼっちディズニー

何位だったの?と聞かれますが、4位以下はノーカンです。

旅行日程

移動について

  • 旅行代理店ではなく、全部JALでカスタム。(Webサイト重い)
  • NRT-LAXで往復ともにJAL(エコノミー)を利用。
    • 隣の席の人とAPEC会場で再会。
    • 10時間程度(復路は11時間程度)
    • 全て通路側を選択。(トイレ難民回避)
  • 空港からの移動はシャトルバスを予約
  • 復路はUberを利用しようと思ったが、他のAPEC出場者がシャトルバスを手配してくれていて、便乗。

荷物について

  • 工具は全部預入れ
  • 機体は手荷物(バッテリーは預入NGです。)
    • アルミフレーム多めの機体でOKだったので、板マウスならOKなのでしょう。

現地のネットワークについて

  • ホテル、APEC会場ともにWIFI完備。
  • Amazonで海外SIMを用意しておいた。
    • Amazon CAPTCHA
    • 事前にアクティベーションが必要
    • 速度は十分すぎる。
    • 電話もできる。
    • iPhoneの場合、ピンを挿してSIMの入れ替えをしますが、そのピンも同梱。(ピンは尖ってないため、機内持ち込みできました)
  • イモトのWifiも持って行ったが出番がなかった(保険でレンタル)

食事について

  • 24h開いてるスーパーとコンビニなどがあったため、特に困らない。
  • 近くのスタバやピザ屋など便利。
    • スタバのドリンクメニューは日本と共通です。
    • 「抹茶フラペチーノ」通じます。

ディズニー

  • 到着直後にぼっちディズニーを敢行。(特にSAN値に変動はない)
  • アドベンチャーとランドと日本で言うランドとシーのように別々の施設がある。
  • 入るまでに時間を掛けたくなければ、通りのチケット店で購入を推奨。
    • ホテルで割引チケットがあったり、割引クーポンをくれたりするので要確認。
  • 園内はアメリカ補正を入れてしまうと、思ったよりも狭い印象。
    • 待機列とかのスペースは日本に比べ圧倒的に広い

お土産

  • イミグレーション後のエリアで買い物をと思ってたが、日本のほうがモノは良かった。(ように見える。見せている。)
    • 日本のほうが商品の見せ方が良い。(陳列方法や照明の工夫など)
    • 男性向けのお土産は少なめ。
  • お酒を買おうにも税関引っかかるサイズが多い。720ml*3まで免税だが、720ml以上のヤツが多くて、これ1本でNGなの??とかわかりずらかった。

英語について

  • 訛りがないおかげか聞きやすい
  • 適当英語で意思疎通できた

最後に

  • アメリカ2回目だけど、水回り(特にトイレ、風呂)に関しては日本はスゴイ!!

ノウハウの一部を書いていく(主に部品や工具類)

きっかけ

なんかこういう情報まとまってるところないよなーと

一覧

保有するノウハウと思しきものの一覧、今回はソフトは書かない

  • ハードウェア
    • 足回りの部品
    • 燃費効率
    • 部品集め
    • 吸引機構周り
    • 工具
    • 接着剤
  • ソフト
    • 調整システム(既出)

足回り部品

  • ピニオンギアはkkpmo(真鍮orPOM)
    • 厚さ2mm
  • ギアはミスミ加工の平歯車を採用。
    • ミスミは個人の購入はできないため、伝手をつかうか、代行サービスを行っている会社で取り寄せる。
    • 材質はPOMのみ、厚さは3mm

取り寄せについて

  • 今年早速試したが、10日ほどで届いた。(途中、私のメールレスポンスが遅くなったため、もっと早くなる?)
  • 手数料が1割ほど上乗せされる

燃費効率

LiPo2Cell、3Cellから、5V、3.3Vを三端子レギュレータで得ようとすると、ドロップ電圧(≒熱損失)が大きくなり、使われないエネルギーを垂れ流す羽目になる。
吸引探索をするようになって、燃費はパフォーマンスに直結しかねないため、以下の構成にした。

LiPo(3cell)12.6V
┗DCDC(5.2V)
 ┣LDO(4.85V)・・・エンコーダ、センサーLED用
 ┣LDO(3.3V)・・・マイコン周り、センサー
 ┗LDO(3.3V)・・・ジャイロ向け

4.85Vという一見見慣れない電圧だが、DCDCのほうの最大出力値とLDOの最小ドロップ電圧の関係でこのような半端な値になった。 エンコーダの定格の範囲のギリギリを攻めた形だ。

DCDCで効率よく使いたい電圧帯域に近づけ、そこからLDOで正確な値を得るのは常套手段らしい。

部品集め

  • 電子部品はdigikeyRSコンポーネンツ
  • 3Dプリンタ部品はDMM3Dプリンタサービスでアクリルとextream(red)
  • ベアリングは電導機.com
  • フォトトランジスタはRTのST-1KL3A
  • 秋月電子(高分子コンデンサ
  • 日米通商(チップ抵抗、チップコンデンサ)・・・精度が必要としない部分むけ
  • タイヤ・・・スーパーラジコン(チャンプなんでなくなったんだ・・・・。めっちゃ通ってたのに・・・)
  • バッテリー
    • Hyoerion系・・・AirCraftで購入
    • nano-techなど以前はhobbykingで購入していたもの・・・amazonで購入
  • 吸引スカート
    • 隙間防止テープ(販売終了)URL
    • シリコンシートURL
  • ナット・・・シリコンナット3M、2M
  • ビス・・・ 3M*15mm
  • 低頭ネジ・・・ウィルコ
  • シャフト・・・モノタロウ平行ピンB種h7

吸引機構周り

  • モーターDCX10S(3V)
  • ファン・・・DMM3Dプリンタ(アクリルExtream Red)
    • 形状は3Dプリンタを活かし、斜めにする。評価は音で行った。(OpenFORMなどで評価すべきなのだろうが、専門外なので誰か頼む)
  • モーターマウント・・・日本プレート精工
    • 約2weekで届いた。
    • 三面図のDXFファイルで対応可能
    • 材質も指定。5052で十分(7000番は硬すぎる)
    • アルマイト加工もOK
    • 加工精度は要相談。(こういう使い方をするから、精度がほしいなど伝えた)

工具

  • ニッパー・・・HOZAN N-31
  • ワイヤーストリッパー・・・HOZAN P-963
  • ラジオペンチ・・・goot YP-10
  • ピンセット
    • ESD対策ピンセット【L606115】
  • はんだごて・・・goot PX338
  • ヒートガン・・・WEP 858D(金沢草の根大会景品)
  • はんだ・・・日本アルミット 高性能ヤニ入りハンダ(LiPoのはんだ付けはこれでないとうまくいかない)
  • はんだ吸い取り線・・・goot 吸取線 幅3.0mm CP-30B
  • フラックスクリーナー・・・sunhayatoのスプレータイプ
  • 作業台
    • はんだごて作業用・・・iMagitek 断熱ワーキングマット
    • カッター・・・オルファ 2つ折りカッターマット A3 223BSBR ブラウン
  • 充電器・・・iSDT Q6 Plus Smart Charger(300W/14A)

接着剤

  • メタルロック・・・セメダイン AY-123
  • テフロンテープ・・・中興化成工業 ASF-110FR
  • カプトンテープ・・・ 日東電工アメリカ P221X1/2
  • エポキシ・・・セメダイン A-121

その他

  • コロコロ
    • 軽く取りたい場合・・・ニトムズ オフィスコロコロ多用途フロア用テープ *ちゃんと取りたい場合・・・ニトムズ コロコロ フロアクリン

RXマイコンでCからC++のコードを実行したい

タイトルの通りです。前提は以下の通り、

  • 開発環境:e2studio 6.3
  • CCRX: v3.0.0
  • マイコン:RX71M

経緯

e2studioでC++プロジェクト生成した際に、intprg.cがintprg.cppになってくれないため、intprg.c上に記述した関数の実行先をC++のメソッドにしたいと思った

解決方法

以下の流れで参照の流れができていればよい。

//intprg.c
void Excep_CMT0_CMI0(void) {
     interrupt_func_cmt0();
}
//InteruptInterface.hpp
#ifdef __cplusplus
extern "C" {
#endif
void interrupt_func_cmt0(void);
#ifdef __cplusplus
}
#endif
//InterupptInterface.cpp

#include "InteruptInterface.hpp"

using namespace hogehoge;  // you can use namespace
void interrupt_func_cmt0(void) {
    // any proccessing below()
     LEDDriver::LED1_TURN_ON(); 
}

問題点

この状態では、publicstaticな関数しか指定できない。

JavaScriptのイベントのように、コールバック関数で、特定のオブジェクトのメソッドを唱えるには、 割り込み関数interrupt_func_cmt0内でうまくやる必要がある。

例えば、リアクティブプログラミングを参考に登録した関数を呼び出せれば、汎用性もあり、効率が良くなるだろう。

斜めの姿勢制御をするには

この記事はMice Advent Calendar2018の8日目の記事です。

昨日はb4rrAcud4のPython&Matplotlibで簡単シミュレータを作るでした。

GUIにおいて、今となってはUI/UXを考えて作るのは当たり前であり、それは、は自分を手助けしてくれるためのものです。
しかし、UI/UXの設計を怠ると、当たり前な便利な機能やUIを遠回りして実装してしまう、なんてこともあります。良いUIがあれば率先してパクりましょう。OSSフレームワークはそれを助けてくれるはずです。

0. 斜めの姿勢制御について(About control on diagonal running.)

マイクロマウス、クラシックマウス共に、最短時の鬼門1つが、斜め直進時の姿勢制御だといっても過言では ないだろう。

今回はその制御の一つの解を示せたらと思う。

1.なぜ斜めの姿勢制御は難しいのか(Why Diagonal Running is so difficult?)

通常の直進時は、事前にセンシングして見つけた一定のリファレンス値を理想値として、PID制御を行う。

斜めの姿勢制御では前向きのセンサーを数度傾けることで、ズレた際に見える柱を検知し、避けるように制御することが多い。(あるいは、通過後の柱のピーク値から偏差を推定し、移動するなど。)

今は思う、それ直進時と全く制御するモノが違うじゃん。

ただのPID制御だけでいい感じに行ってくれと思いませんか?

2. 簡単に制御するためのあるべき論は?(A certain argument for easy control.)

あるべき論としては、勿論、以下の通り。

常に理想とする場所があって、そこに収束するように制御ができるようにする。

言い換えると、直進時と同様、

事前にセンシングして見つけた一定のリファレンス値を理想値として、PID制御を行う。

3. マイクロマウスのルールについて(Rule of MicroMouse)

以下抜粋

2-4  各単位区画の四隅にある0.6cm×0.6cmの小正方形部分を格子点と呼ぶ。終点領域内を除いたすべての格子点には少なくとも1つの壁が接している(図1参照)。また、迷路全体の外周の壁は全て存在する(図1、図2参照)。 

上記のルール上、以下のことが言える。

斜め走行中の車体の近接する柱には壁がある。

つまり、これを以下のように考える。

斜め直進中、壁が見えるようにセンサーを置け。

4. センサーの配置を斜め用に考える(Think of the arrangement of sensors for diagonal use)

以下の画像の通り、真横90度センサーと45度センサーを使う

f:id:nao1288stusj:20181206232656p:plain

このとき、斜め進行中、以下のように壁が見える。

f:id:nao1288stusj:20181206232630p:plain

このとき、45度センサーが柱・壁の切れ目をとらえることが重要である。

壁が進行方向に対し、手前を向いているとき、45度センサーによって、確実に見える。 f:id:nao1288stusj:20181206232650p:plain

壁が進行方向に対し、手前を向いていないとき、90度センサーによって確実に見える。 f:id:nao1288stusj:20181207224844p:plain

5. 理想のリファレンス値をとる(Take the ideal reference value)

45度センサーの壁・柱の切れ目の閾値を定め、斜め直進をする。 その際、ログ情報として以下を扱う。

  • 45度センサーの値
  • 90度センサーの値
  • 45度センサーの切れ目からの直進した距離(周期は180×1/2 or 90×21/2
    • 左右それぞれ、壁切れからの距離を加算

45度センサーの値と直進した距離を同時プロットしたのが以下。 f:id:nao1288stusj:20181206234156p:plain

90度センサーの値と直進した距離を同時プロットしたのが以下。

f:id:nao1288stusj:20181206235210p:plain

45度センサーが検知した、切れ目以降の距離0から180×21/2 (or 90×21/2)までの値をテーブルとして持つ。 これを90度センサーも同様に行うと、距離に対し、理想のセンサー値は以下のグラフの関係がある。f:id:nao1288stusj:20181206234452p:plain

横軸=距離としてテーブルにすればよい。

あとは切れ目以降、この距離に応じたリファレンス値を参照して、その偏差をPID制御を行えばよい。

注意点として、柱などの付近、黄色の30~50、160~190、灰色の0~20、220~250は切れ目に近く、不安定だと判断したため、現在、この区間にいる際は制御に使ってない。

ね?簡単でしょ?

真横90度センサーがあることで、Y.Iがで示していた補正とはまた異なる、探索中の壁切れの「スラロームの後区画中に壁切れ」が実現します。

センサー5個アリだと思いませんか?勿論、最後の一つは正面に配置します。 前壁制御に使うことで、より正確にスラロームの前区画の調整します。

最後に(at last...)

明日、12/9はmm_55Tさんの「寄席に初めて行った感想」です。
概念の上の存在だったあの人が、浅草に顕現したときのお話です。