前回までの投稿で迷路探索ができるようになりました。今回は迷路の壁情報をFlashメモリに書き込む方法についてまとめます。マイコンのRAMに保存されている情報は電源を切ると消えてしまいますが、Flashメモリに保存しておけば電源を入れなおした後でも読み込むことができます。STM32のFlashメモリの基本的な使い方は、idさんのブログを参考にさせていただきました。(CubeMX+HAL編)STM32F7のFlashメモリについて私のマウスはSTM32F7を使用しているので、公式のマニュアルを参照します。68ページ目にFlashのSector表が記載されていました。5~7は128Kbyteのサイズになっていることがわかります。0にはシステムによって割り込みベクタテーブルが配置されるそうです。2以降に実行プログラムが書き込まれるようにリンカスクリプトを編集します。リンカスクリプトSTM32CubeMXとSW4STM32を使った環境では、プロジェクトディレクトリの直下にある.ldファイルがリンカスクリプトです。MEMORYコマンドリンカスクリプトではMEMORYコマンドでメモリ領域を定義しています。デフォルトではRAM領域とFLASH領域のみ定義されていますが、まずこの部分を変更します。RAM領域はそのまま、新たにFLASH_SECTOR0とFLASH_SECTOR1を追加します。2の0x8008000に変更し、領域のサイズを512Kから480Kに変更します。SECTIONコマンド次に以下のSECTIONSコマンドを変更します。.isr_vectorは割り込みベクタテーブルを表していて、STM32CubeMXで生成されたコード内で定義されています。0に配置されるようFLASHをFLASH_SECTOR0に変更します。.backup_flashが今回マップデータを保存するセクションです。これをFLASH_SECTOR1に配置します。_backup_flash_startという変数にこのセクションの開始アドレスを代入します。この変数は実際にFlashへ書き込む際に使用します。マップデータの書き込み・読み込み大まかな流れは次の通りになります。ソースコードはidさんのものとだいたい同じになるのでここでは割愛します。書き込みの流れあらかじめRAM上にマップデータ受け渡し用の領域を確保しておくマップデータをRAM上の一時領域に展開HAL_FLASH_Unlock関数でFlashの制御を許可HAL_FLASHEx_Erase関数でFlash上の指定Sectorのデータを消去HAL_FLASH_Program関数でRAMに展開されたマップデータをFlashにコピーHAL_FLASH_Lock関数でFlashの制御をロック読み込みの流れmemcpy関数でFlash上のデータをRAM上の領域にコピーするコピーしたメモリから、マップデータの構造体に落とし込むおわりこれで探索後のマップデータを保存できるようになりました。電源を入れなおしても重ね探索や最短走行にトライできるので、かなり便利になりました。shiotaniこんにちは、しおたにです。前回、最短走行で等速円運動スラロームを試し、信地旋回と比べ大幅にタイム短縮できました!一見滑らかに曲がれているしこれで終了...とはいきません。等速円スラローム中の角速度変化をグラフにすると下図のような感じになります。モータにへの速度指令はこんな感じです。実際にはこの通りに速度変化はできません。摩擦や慣性が働いているからです。身近な例でいえば自動車は止まった状態から急に100km/hで動くことは出来ません。目標の速度めがけて徐々に加速するしかないのです。角加速度変化をみるとこの通りスラローム前後で一瞬無限大の入力(インパルスな入力)になっていることがわかります。現状ではモータに無理を強いて曲がっていることになります。Pi:Coはステッピングモータを搭載していますので、急激に速度を変えると脱調します。加速度が大きいためタイヤがスリップしやすく、走行経路の誤差が大きくなります。これを解決するのが台形加速です(下図)。ご覧の通り角速度を台形状に変化させて加減速します。時間をかけて加減速するため角加速度の変化も抑えられます。モータへの速度指令はこんな感じです。これで曲がれば今までより無理なく滑らず曲がれるはず...今後はこの台形加速を使ったスラロームを試していきます。いえばスラローム、スラロームとよく言っていますがこれは蛇行走行など指す言葉で、正しくは緩旋回(かんせんかい)と言うそうですね。マイクロマウス界隈ではスラロームのほうが伝わるみたいですので私はこのままいきます。shotaこんにちは、shotaです。社員研修として、オリジナルマウスを製作しています。[前回の記事]では、ようやくマウスが完成しました。筐体ができただけで、プログラムは書いてません。参加し、全国大会出場権を獲得したことを書きます。※マウス製作記事と大会報告記事には2,3ヶ月ぐらい時差があります。ishikawaししかわです。向けて、マイクロマウスの「斜め走行」を実装中です。ベースの部分が実装できたので、走っている様子の動画とともに紹介します。斜め走行とは、図のように右旋回と左旋回が交互に連続する区間を斜めに直進する走り方です。最短経路走行をより速く走るためには必須の課題です。うまく走れた動画を見てください!※走る前にメロディを鳴らしているのはデバッグ目的です(走行パターンに応じて違う音を出しています)。開始直後の右旋回→左旋回を斜め45度で走行できました。斜め走行をするために、Pi:Coのサンプルプログラムを元に次の3つの実装を加えました。走行パターンを最初にまとめて生成するPi:Coのサンプルプログラムでは、ゴールまでの経路を逐次計算しながら「直進して左右どちらかに曲がるまでをループ処理」しています。言い方を変えると、「曲がるまで次の経路がわからない状態」で走っています。...」が交互に連続していることを先に知る必要があります。そこで、ゴールまでにどのように走ればよいかの走行パターン情報を、最初にまとめて生成します。簡単な例として、次のような一本道の迷路を考えます。Sがスタート、Gがゴールです。この迷路の最短経路を「半区画直進」と「左右90度緩旋回」の走行パターンで表現すると次のとおりになります。走行パターンを変換する次に、生成した走行パターンを変換して、斜めを含む効率良い走行パターンに変換します。「直進、右90度、左90度、直進」のパターンに一致した箇所を「右45度、左45度」に置き換えます。このとき変換対象の前後に直進を含めているのがポイントです。「右90度」の区画に入ってから斜めに曲がり始めても、マウスが斜め走行のセンターラインに乗らないため、半区画前から余裕を持って旋回を始めます。右45度と左45度の間に直進を挟めば、斜め走行のパターンが完成します。余談ですが、90度旋回も次のように「大回り90度旋回」に変換できます。半区画前から曲がり始めることで旋回半径を大きくでき、その分スピードを落とさず曲がれます。新しい走行パターン(45度旋回)で走行する「45度旋回」や「大回り90度旋回」の走行パターンに対応する走行処理を実装します。以前作ったスラロームシミュレータ(koraさんの記事を参照)を使って、目的の場所、角度へ向かって走るための角加速度などを算出します。今回紹介した走行パターン以外にも、自在に斜め走行をするためには「斜め135度旋回」「斜め90度旋回」を追加する必要があります。大会までにがんばります。「斜め走行」を参照ください。ここまでで最小限の斜め走行ができるようになりました。これから大会までに、他の走行パターンの実装と調整を進めていきます。目下の課題として、斜めに曲がるタイミングがかなりシビアです。Pi:Coは元々機体が大きめなこともあって、少しでも曲がる位置がずれると柱にぶつかってしまいます。限られた時間で何を優先するかは悩ましいところです。来週はブログ投稿無しで、大会向けの調整に集中します。unoyoshi今回は等速円運動スラロームが出来る様になったので調整に入ったお話しをします。今まで通りの走行スピードで試走するとどうも良い具合に走らなくて、変なぎこちなさが残るので基本スピードと旋回スピードを上げてみると少し噛み合ってきました。微調整しても誤差で良くなったのか判らないという状態に陥りました。気分転換に最短走行に等速円運動をそのまま入れてみました。すると、曲がらず真っすぐ突っ込む現象が再発しました。通常の探索では曲がるのに、なぜ最短に入れると曲がらないのかという謎をしばらく探っていましたが、解った結果としては等速円運動前の短い直進での目標速度(変数)が一定以上じゃないと曲がらないというものでした。曲がるようになったは良いのですが、直線の距離によりスピードが違ってくるのでほぼほぼまともに曲がれず、ある程度ちゃんと走るには色々弄る必要がありそうです。この段階で気分転換を終了し、探索モードでの等速円運動を再開しました。それなりに調整しても中々安定したとは言えないバラつきを見せていたのですが何故かこの様な櫛だけ綺麗な位置で纏まる謎現象が起きています。これはどちらかと言うと良い事なので問題ないのですが1つよろしくない現象が起きて原因を探っています。迷路がジグザグの場合、途中で反対方向に曲がり壁にぶつかってしまいました。再現性は高くないようですが、どこが悪いのか各所見直しが必要そうです。shiotaniこんにちは、しおたにです。これまで、その5でタイヤのゴムズレ対策をし、その6でパラメータ調整を行ったので、以前より安定して曲がれる機体になったと思います。今回は等速円運動スラロームを試してみます。等速円運動スラロームとは速度を変えずに円弧を描きながらカーブを曲がるスラローム走行です。説明すると、外側のタイヤの速度を速く、内側のタイヤの速度を遅く指定することで曲がります。こちらに詳細にまとめられています。参考にさせていただきました。どれくらい速く/遅くすればよいかというと、外側のタイヤと内側のタイヤの旋回中心を一致させるようにすればOKです。今回はロボット中心の旋回半径を60mm、中心速度が400mm/sになるように曲がることにします。6.67[rad/s]となります。次に各タイヤの速度を求めます。トレッド幅は67.7mmなので、外側のタイヤの旋回半径は60+67.7/2[mm]、内側は60-67.7/2[mm]となります。174[mm/s]となります。94[mm]になります。shotaこんにちは、shotaです。社員研修として、オリジナルマウスを製作しています。[前回の記事]では、GitHubを使用した大会振り返り方法について書きました。[前々回の記事]では、アートワークが完了しました。今回はアートワークの最終記事です。部品実装の話と、大反省会です。