自動車業界MBDエンジニアのためのsimulink入門本を実践
自動車業界MBDエンジニアのためのsimulink入門本を実践
今回お試ししたのはこんな感じの本です。
メインの内容はsimlulinkの知識習得+演習による基本的な使い方を体に叩き込むタイプのやつです。前書きにも80%は演習と書いてます。
また、matlab/simulinkのスキルをレベル分けしていて目標のイメージを持ちやすいです。
個人的に好きなところは、そもそも設計ってこうやるんやで、設計には魂を込めろなど前書きとあとがきで熱く語ってくれるところです。(本の前書きとあとがき著者の人となりが見えて面白い)
1月くらいで9割はできたと思う。(本当の最後の演習はまだやってない)
試しにつくってみたもの
最後の演習課題の8章の内容を書いてみます。8章はクルーズコントロール機能をモデリングする演習です。(個人的にここが一番面白かった)
この章ではクルーズコントロール仕様の要求が記載されていて、それを元にタイミングチャートや表を書いて仕様理解をするところから始まります。(ここまではその章で使うブロックの説明⇒演習の順番だった)
仕様理解
クルーズコントロール用に4つのスイッチがあり、各スイッチ押されたときの振る舞いなどが記載されています。他にはクルーズコントロールのon/off条件、目標速度の更新などが記載されています。
例えば、アクセルペダルの開度が何%のときにクルーズコントロールのスイッチが押されたらクルーズコントロールの機能がONになるというような動きをタイムチャートを書きながら理解していきます。
モデル構造の検討
仕様を理解したらモデルの構造を考えます。
(下の図はLucidchartで作成した。線つなぎやすい、ラフスケッチにいいかも)
simulinkモデルの実装
モデルの構造を考えたら実装していきます。
左のブロックでクルーズコントロールのon/offを判断して、右のブロックで目標速度を設定します。
クルーズコントロールのon/off判定サブシステムの中に先ほどのOFF判定のサブシステムなどが含まれています。
動かしてみる
試しに速度計やオドメータっぽいものクルーズコントロールのランプなどを用意して動かしてみました。
画面下側のランプが緑色の時はクルーズコントロールがONされ、設定された目標速度に到達するようにアクセルペダルの開度をコントロールして車両を動かします。 ランプが非点灯のときはドライバーがアクセルペダルを踏んで操作しているような入力を与えています。
車両モデルは7章までで作ったものです。エンジン回転数やトルクの計算、変速制御など簡略化されてはいますが、機能は結構織り込まれてます。
シミュレーション結果グラフで見つつ各機能の振る舞いが間違っていないかなどをチェックもしました。
コメント:ブロックの使い分け
switchブロック、if-elseブロック、switch caseブロックなど条件分岐用のブロックがいくつかあるが、内部処理的やC言語で出力するとう違いが出るのだろうかという点が気になった。
調べてみると、JMMAのガイドラインに書いてあった。http://jmaab.mathworks.jp/deliverables/Style_Guideline_ver5.1_20180831.pdf
switchブロックとif-esleブロックはC言語でいうところのif文処理、switch case はswtic
h文の処理となる。
switchブロックは単純な分岐で、定数などの切り替えで使うのがメインとなる。
それ以外は、バランス考えて作りましょうというところだと思う。
switch caseだと分岐が増えてきたときにわかりやすいとか、if-elseだと条件が書かれていてわかりやすいとかがあると思う。
この後やることは、モデルの構造の考え方、よく使われる表現など慣れていくところかなと思います。(もでらーじゃないけど)
コメント:そのほか気になったこと
自分が作ったモデルと、サンプルモデルを比較すると出来栄えがかなり違っていました。
たとえば、モデルの構造(前処理⇒中間処理⇒出力処理)などがしっかりとしていたり、0割防止、コメント、線の引き方など多岐にわたります。
参考になることは多いので、しばらく眺めたり動かしたりしてみようかなと思います。
クラシックマウス競技内容を整理する
クラシックマウス競技内容を整理する
プログラム設計のために一度競技のルールや競技開始してから実施することなどを整理しておきます。
ルールはNTF様の公式サイト(2019年競技版)を参照しました。
※一度も競技に参加したことないので実際とは少し違うものになっているかもしれません。
用語
この記事で使う用後を定義します(※私の独自定義です)
スタート:スタート(Sと略す)地点のセンサを通過
ゴール:ゴール(Gと略す)地点にマウスの車体(床面から5cm以内)が全てが収まるとき
タイム:S地点のセンサを経過してから、G地点のセンサを経過するまでの時間(Gの定義とは異なることに注意)
走行回数:SしてGに到着後、S地点に戻るまでを一回の走行とする。なお、S地点に戻ってから次の走行までに2s以上停止すること。
競技開始:厳密な条件は調査中
クラシックマウス競技のユースケース図
ざっくりとですが、概要はこんな感じになると思います。
迷路に機体を設置してマウスを始動した後は、基本的に機体に触れてはいけなようです。ホイールについた埃をとるなどの軽微な接触はOKなようなので、各走行毎にS地点で停止して指示を待つようにプログラムするとよさそう。
迷路について
サイズ
・1区画は18cm×18cm
・壁の厚さは1.2cm
・全体は16×16区画で構成される
・壁同士をつなぐ柱(格子点)は1本1.2cm
その他
・S地点は4隅のどこか
・必ず時計回りで走行を開始する
・G地点は中央の4区画
https://www.ntf.or.jp/mouse/rule/kitei_classic-JA.htmlの図2を参照しております。
こんな感じです。次回以降でシステムの要求分析モデリングをしてみます。
「CPUの創りかた」を読んでエミュレータを作成してみた(simulink)
以前「CPUの創り方」を読んで実際にハードウェアを作ってみました。
今回はsimulinkの練習をかねてエミュレータで回路を再現してみました。
simulinkの使い方をまとめたようなものではないですが、ただの活動の記録として残します。
作成するエミュレータの概要
エミュレータといっても実現の仕方にいくつか段階があるようです。
下記のURLでは大まかに3種類程度に分類してます。
・トランジスタの電圧変動をリアルタイムに忠実に再現する
・クロック毎の論理ゲートのON/OFFを再現
今回は上から2つ目のゲートのon/offレベルでのエミュレータを作っています。(simulinkのブロックに論理ゲートがたくさんあったので試しに。)
完成したたもの
下の図がつくったものです。
左上に実行中の命令、中央上部にプログラムカウンタ値、右上に出力ポート(LED風、青色がON)を表示しています。
各ブロック(subsystem)はROM,デコーダ、レジスタ、マルチプレクサ、ALUを表していてブロック間の通信をバスオブジェクトなどでつないでます。バスオブジェクトの中身はROMから読み出した命令や即値、ALU演算結果などです。
各ブロックの中身は基本的には論理ゲートで構成されています。例えば以下はROM用のセレクタ回路です。
上図のようにbit単位で実装しているため 線が増えて出力が見づらくなってしまいます。そのためsubsystemから外に出す際には下記のようにバスにまとめてしまいます。
下図はレジスタの中身です。少しさぼってライブラリのD-FFブロックを使っています。
作るのが少し難しかったのはタイミングの設計部分です。
実機であれば電圧の立ち上がり時間の遅延を考慮して?実現されている部分は遅延ブロックを使って再現しています。このへんはちょっと胡散臭いですが、この規模の回路であればなんとか動かせるかな。。(あまり知見がなく、うまい実現方法がわかりませんでした)
終わりに
simulinkはほとんど使ったことなかったですが、会社終わりに作業して大体3週間くらいで実装できました。初めてモデリングする場合は身近なもの??とかよく知ってるものをベースにすると出力結果の妥当性が検証しやすいのでいいかな~思いました。
また、今回はあまり気にしませんでしたがembedded coderでコードを出力する場合などは、subsystemの設定やバスの設定が出力結果に大きな影響を与えるようです。(atomicサブシステムやバーチャルバスの設定によって.cファイルや構造体が生成されたりされなかったり)
ちょっと使ってみたいけど一般向けに販売されてないのが残念。
マウサーだと一年くらいライセンスが提供してもらえるらしいけど、社会人でも可能なんだろうか。
STM32 プッシュスイッチの状態を取得(とりあえず動かす用)
スイッチ回路について
マイクロマウスにいくつかのモードを持たせたいので、モードを切り替える用にプッシュスイッチを用意しています。
スイッチ回路は以下図のようにスイッチが押されているときにhigh、押されていないときはlowになるように作っています。
ModeSWピンをgpio入力ピンとし、プルダウン設定にすることで動くだろうというシンプルな作りです。
回路をシンプルにした分、ソフト側でチャタリング対策などをおこないます。
今回はとりあえず動かすためのソフトなので今後必要に応じて書き換えていく予定です。 (電源オン後モーターがすぐに動き出さないようにするために、スイッチ入力待機する)
手順
手順①
cubemxでswを接続しているピンの設定をします。
以下図のconfigurationの通りgpio modeをinput mode、pull-downとしておきます。
これでgenerate codeします。
手順②
ソースコードを書きます。
やることは、スイッチが押されている間、ある変数のカウントを1ずつインクリメントし、閾値を超えたらonと判断します。
スイッチが押されていない間はカウントを1ずつデクリメントします。
まずは適当なサイズの変数を宣言して初期化しておきます。
uint16_t sw_count = 0;
ここからSWの状態を判定します。
見ての通りですが、sw_countが250を超えたらループ抜けてモーターなどの制御を開始します。
while(sw_count < 250 ){
if(HAL_GPIO_ReadPin(ModeSW_GPIO_Port,ModeSW_Pin) == 1){
if(sw_count < 65535){
sw_count++;
}
else{
//何もしない、オーバーフロー対策
}
}
else{
if(sw_count > 0){
sw_count--;
}
else{
//何もしない、オーバーフロー対策
}
}
HAL_Delay(1);//1ms程度のループにするため
}
・補足
今回はSW押されている間highになるため、readpin関数が1(high)のときカウントするようになってます。
1ms程度のループと書きましたが、実際はその他にも命令を実行しているので1ループが1msよりも長いです。時間はあまり正確にやる必要ないので適当です。
今後
今回の内容を少し発展させて、短押しならモード遷移、長押しなら決定みたいなことをやりたいです。
そのほか、割り込みで入力を監視したりもできるみたいですが、自分の機体で使うタイミング来るかは微妙。
あとはソースコードをうまく張り付ける方法があれば知りたいです。
個人的はんだ付けノウハウ
個人的はんだ付けノウハウ
プリント基板に表面実装部品をはんだ付けするときに苦戦したところをまとめておきます。
あくまで素人レベルの人間がとりあえず動けばいいやでやった方法ですので信頼性などは全くありません。
QFPパッケージ
まずは0.5mmピッチで64本の足が出ているqfp64パッケージについてです。
ネットで参考動画を探すと、「流し半田」という方法ではんだ付けしている動画がたくさんあります。この方法は簡単そうに見えたのですがやってみると意外と難しく半田がブリッジしてしまいました。この小ささのパッケージだと半田ブリッジを取り除くのも苦労しますし、強度もあまりないためピンが曲がってしまうこともあります。
何かいいやり方がないかと探していると、とある動画のコメントがよさそうだったので真似してみることにしてみました。
そのやり方というのは、パターン側に予備半田を載せてからQFPを付ける様にする方法です。
利点としては、
・予備半田としてパターン側に半田を盛っておけば適切な半田量の調整が可能になる
(流し半田では半田の微妙な供給量の調整が難しい)
・パターン上の半田を直接見れるため半田の過供給や欠供給が一目瞭然ですので、修正も簡単
ということです。
具体的な手順としては、
・フラックスをランドに塗る
・ランドに予備半田をのせる
・ ICを上から少し押さえ付け気味に置いてランドを1本づつ温める
・ICのピンは半田付けするIC側のピンの根本をピンセットか何かで押しながら、そのピンの基板パターンランド側を温めます。
やってみると、半田付けされる瞬間にピンがスッとランドに降りていくのが見えます。
参考に一列だけ予備半田したものを乗せておきます。
半田の供給量が多くランド間でブリッジした場合は吸い取り線で吸い取ってください。
注意点としては、半田の量が少なすぎるとICの足とランドがくっつきにくいです。
そういうときは少し強めに押し付けてこて先をあてるか、半田を足すといいかと思います。ただし、はんだを足しすぎるとやはりブリッジします。
テスターやピンセットの先端を足に押し当てて足が動かなければとりあえずは大丈夫だと思います。(耐久性に関しては微妙かもしれませんが。。)
実際にやってみると下図のような感じになりました。(左下にはんだブリッジがありますが、使わないピンなので放置しました。)
これでもマイコンへの書き込みはできたので軽く動かす程度であれば問題ないと思います。
補足として、成功率を上げるには道具が大事だと思います。
細めの小手先と細めの半田を使いましょう。
参考です
はんだごて(白光 ダイヤル式温度制御はんだこて FX600)
https://www.amazon.co.jp/gp/product/B006MQD7M4/ref=ppx_yo_dt_b_asin_image_o03_s02?ie=UTF8&psc=1
小手先(白光 こて先 1C型 T18-C1)
https://www.amazon.co.jp/gp/product/B004ORB87Y/ref=ppx_yo_dt_b_asin_title_o08_s00?ie=UTF8&psc=1
φ0.3mmくらいの半田(goot(グット) 無洗浄はんだ Φ0.3㎜ スズ60%/鉛40% 100gリール巻き ヤニ入りSE-06003RMA)
https://www.amazon.co.jp/gp/product/B005EJ7KI2/ref=ppx_yo_dt_b_asin_title_o05_s00?ie=UTF8&psc=1
qfnパッケージ
足が出ていないタイプのパッケージです。
ICM-20602というジャイロセンサです。(これもややブリッジしていますが、使わないピンなのでとりあえず放置しています。。)
手半田は難しいかと思い、ホットプレートを使ったリフローをおこないました。
ホットプレートリフローについてはネットを探すと色々出てくるので詳細は割愛します。
今回は山善のホットプレートを使いました。
Amazon | [山善] グリル鍋 1200W 容量2L(直径23 深さ5cm) ブラウン GN-1200(T) [メーカー保証1年] | 山善(YAMAZEN) | ホーム&キッチン 通販
また、LDM-81Dという温度も計測できるテスターも使いました。
https://www.marutsu.co.jp/pc/i/59232/
半田ペーストは以下のものを使いました
https://www.amazon.co.jp/gp/product/B00MILNHYA/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1
下図のように、基板の適当なところに熱電対(テスターに付属)をポリイミドテープで張り付けて温度を計測します。
実際にリフローするときは基板を2枚並べてやりました。
片方は温度計測用の基板でもう片方がはんだ付けする基板です。
(焦ってたので写真はとれてません)
半田ペーストを塗布して部品を配置後に基板をホットプレートに並べます。
クリームはんだは思ったより固まりにくいので落ち着いて作業すればいいと勝手に思ってます。
準備ができたらホットプレートを160℃に設定して2分半から3分プレヒートし、200~210℃に設定して30秒程度経過後、ホットプレートをoffにして冷めるのを待ちます。
リフローの温度プロファイルに関しては諸説ありますが、基板の厚みや大きさ、半田の種類次第かと思います。(今回は基板1mm、大きさは約80mm * 100mmでした)
鉛が入っている半田より鉛がない半田の方が温度上げた方がいいとかなんとか。。
なお、テスターで計測した温度はホットプレートで160℃セット時で180℃程度、200℃セット時で230~240℃程度になっていました。
出来上がりに関しては最初の図の通りです。使うピンもブリッジしているところはありましたが、半田吸い取り線をつかうとなんかなります。
ちなみにやりすぎると下図のように基板がよれよれになります。(ホットプレートで210か220℃くらいに設定したときです)
この基板はさすがに使えません。パターンもはがれてしまいました。
ともかくやってみることが大事だと思います。私は5枚くらいダメにしましたが、いろいろと工夫していくと自分なりのやりかたがわかってくると思います。
やり切れていないところ
qfp64パッケージのマイコンも併せてホットプレートでリフローしようとしたのですが、位置合わせが難しく3.3V系とGNDがショートしてしまいました。うまくできる方法を探したいのですが、部品費も高いのでこれからも手半田することになると思います。
そのほか
ちゃちくてもいいので、顕微鏡があると多少はんだ付けしやすいと思います。
私はアマゾンで適当にUSB接続顕微鏡を買いました。PCのモニタなどに映して見ることできるタイプです。下のURLのものはwin10のカメラアプリで動き、写真やビデオが撮影できます。6000円くらいです。
https://www.amazon.co.jp/gp/product/B01NBMKAIO/ref=ppx_yo_dt_b_asin_title_o05_s00?ie=UTF8&psc=1
マイクロマウス今までのまとめ
ハードがある程度できてきたので今までの整理も兼ねて記事を書いておきます。
時系列
・2019年くらいからいろいろと情報を調べだした。
・2019年末まではSTM32マイコンを使っていろいろ試してみた。
・2020年からハードウェア製作に取り掛かろうとしたが、回路図を読むことすら苦戦し「cpuの創り方」や「12ステップで作る組み込みOS」を読んで下準備する。
・2020年の6月から本格的にハードウェアを製作開始
・2020年7月までは実際に使う部品をブレッドボード上で組んで性能や回路の検討
・2020年8月に回路図や配線を実施
・2020年の9月に基板発注して到着
・2020年の10月にはんだ付け完了
かなり時間かかってます。
基板は以下のようになりました。
(回路図で配線間違えてるの気づいたので、uewで手直しした)
表面
裏面
部品全部乗せ状態
製作指針
とりあえず安定して走らせたいので、質量やコストはあまり気にせず製作することにしました。
モーターとモータドライバ、基板形状などは「苦しんで作るマイクロマウス 前編」 という書籍の内容ををほぼコピーすることにしました。機械系のCAD苦手なのであんまり難しいことやりたくないです。
それ以外の回路はSTM32マイコンを乗せたかったこともあり、下記サイト様のものを参考に設計しました。
ただ、壁センサのロジックは初心者には難しそうだったので回路を少し変更し、壁センサのロジック自体は苦しんで作るマイクロマウスの手法を採用する予定です。
回路図
ある程度機能ごとに分割して作成しています。
マイコン、不揮発性メモリ、モータ、発光回路、受光回路、電源回路というような分類です。
一部だけ載せてみます。回路図出マイコン端子につけたラベル名はcubemxのピン名にもそのまま採用します。プログラムするときに多少はわかりやすくなると考えてます。
基板と配線図
kicadで作成しています。
モータマウントやホイール
dmm makeから届いたものです
カッコつけてならべてみましたが穴径が小さすぎて失敗してるところがありました。
修正後はちゃんと穴開いてました。
完成イメージ
色は変違いますが、kicadとfusion360使って3Dを作ってみました。
ベンチ環境
いきなりプリント基板製作にとりかかるのも怖かったので先にブレッドボードとユニバーサル基板で簡易的なベンチを組んでみました。
stm32f405rgt6をバイパスコンデンサ等の周辺部品と一緒にユニバーサル基板に半田づけしています。
電源はブレッドボード側で9VのDC電源から5Vと3.3Vのレギュレータで電圧を作っているので一通りのことは試せます。
モータドライバでモータを制御やロータリエンコーダから角度の取得、フォトダイオードを点滅と受光などいろいろ試してみました。ただ、思ったより電圧降下がありマイコンには2.8~3V程度しかかかってないので動作結果はあくまで参考程度です。
今後
追々以下の内容もメモがてらまとめていきます
・オシロスコープ関連
・ホットプレートリフロー関連
・アナログ回路関連
・グランド配線
・フォトダイオード関連
・リポバッテリー関連
「12ステップで作る組込みOS自作入門」を読んでOS実装してみた感想
本の簡単な紹介
やったのは半年以上前ですが一応一通り実装したので簡単にメモしときます。
この本ではH8マイコンボード上で動作する組込みOS(筆者独自製作)を12ステップで実装していきます。6ステップ目まではブートローダを作り、後半の6ステップでOSの実装をします。
(たしか)1ステップごとにソースコードを書く→動作確認という流れになるので飽きずに続けやすいと思います。内容は少し難しく用語も聞いたことがないものが多いですが、丁寧に説明されているのと、1ステップという区切りになっていて少しずつ理解できるのでなんとかなります。
ただ、後半部分は正直難しくて作り終わった今でも把握しきれていないところはあります。そのため後半部分の実装は1月くらいかけてゆっくりやりました。
6ステップ目までの内容は組み込み系の仕事に就いたばかりの人には結構役に立つ情報が多いのではないかなと思いました。elfファイルやリンカスクリプト、ブートローダなどのことがわかるようになります。
下の写真は実際に使ったH8マイコンです
日程感
全ステップの実装にかかった期間が2か月くらいで、前半は大体1ステップを1日~2日でやってました。
仕事終わでしんどい日は何もせずに寝ることも多々でしたので、早い人は1月もかからないと思います。学生の方だと一週間くらいで終わらせてる人もいました。
環境
本書はLinux系でもwindow系のOSでも開発できるようです。
理由は忘れてしまったのですが、自分はWindows10にVMWareをインストールしてubuntuで開発してました。(仮想マシンの知識がほぼないので、詳しい説明はできませんが。。)
一応困ったことがあったのでメモしときます。
------------------------------------------------------------------------------------------------
WindowsOSとVMWareには相性がありそう。
WindowsOSとVMWare,linuxOSの組み合わせによっては、linuxOSインストール中に停止してそれ以降進まなくなってしまう。
実際に起きた例
・Windows10
・VMware ver 14系
・ubuntu 18.04 LTS
⇒ubuntsのインスール中に固まった
対策
・VMWareを最新Verに変更(14⇒15)
これで再度ubuntu18.04をインストールすると成功した。
vmwareにubuntuをインストールする際は以下を参考にした。
VMware PlayerにUbuntu 18.04 LTSをインストールする方法 | Muroi Log
----------------------------------------------------------------------------------------------
本当は14系でも動いたかもしれないけど、詳しいことはわかりません。
その辺はまた別途知識を調達します。
8ステップ以降のこと
8ステップくらいから内容が徐々に濃くなってきて、私の頭では理解が難しくなってきました。なので、簡単な図を書いてなんとか理解を進めてみました。
正直モデル化のルールとかは詳しくないのでオリジナルでやっている部分しかないです。なので私しか理解できない図になっていると思いますが、勉強の仕方として図を書くというのは結構大事かなぁという気はします。
上の図は関数同士の呼び出し関係などをまとめてます。
こちらは、シーケンス図風のものを作って処理の流れを理解しようとしてみたやつです。あくまでシーケンス図"風"です。理解できればなんでもよいと思ってやりました。
終わりに
最初にも書きましたが組み込みやってる人なら一回やってみると苦しいけど楽しいかなと思います。OS実装そのものに興味がなくてもいろいろわかって面白いです。
自分は内容を忘れてきてしまったので冬休みとかにもう一度読み直したいですが、マイクロマウスもやりたいのでどうしようかなというところですが。
かかった金額は本とマイコンで1万くらいなのでお財布的にもそんなに厳しくないしおすすめです。