ロボコニストの技術日記

知見や技術を備忘録として書こうかな

何か色々と反省した話 ~直進台形加速編~

おはこんばんちはひふみです。

 

台形加速。当然こんなものはスラローム最短を終わらせているなら完成しているものですよね。はい。

ワタクシの「hihumint!」君はですね。台形加速出来てませんでした。

hihumint!君は、台形加速を時間ベースで行っておりました。

それが原因ではないと思うのですが、何が原因かわからなくなってきた上に距離ベースは30分で書けるという噂を信じて、眠たい中昨晩、式を適当に導いて今日実装しました。

 

めっちゃきれいに動きましたね!!!!!!!!

 

どうもありがとうございました。

さようなら台形加速にかけた夏休み。

さようなら台形加速のバグに気付けず最短アルゴリズムを見直した東北大会の24時~30時。お前たちを許しはせんからな。

 

という訳で、最短ビンビンに決めれ。。。。。ると思ったのですが、やはり脱調しやすい?のかしらん。まぁ色々試してみたいと思います。壁制御強すぎるのかもなぁ。

 

あ、折角台形加速作り直すのに何も進歩してないのは嫌なので、加速度減速度を引数として持てるようにしました。減速度4.0m/ssで動かしても特に問題なさそう。でもスリップが辛そう?やってる人少ないっぽいので色々試して結果を記したいと思います。

 

こんな所ですかね。今後はとりあえず、探索、最短共に成長させていきたいと思います。小回りスラロームに大きなずれがあるっぽいので、単位系の見直しとかもしときます。

それでは以上!毎度ながらの長文でしたがここまでお読み頂きありがとうございました。

東北大会直後

おはこんばんちはひふみです。

今回は、「hihumint!」くんの東北大会第29回大会の結果と今後について書きたいと思います。

 

まずは、今大会の成績と自己分析から。

 

第1走:探索走行(小回りスラ、27秒075)、復路探索(小ス)成功

第2走:最短走行(小ス、1.2m/s,2.0m/ss)スタート後直線のバグにより失敗

第3走:探索走行(小ス、27秒100)、復路探索(小ス)成功

第4走:最短走行(小ス、1.0m/s,2.0m/ss、14秒520)成功

第5走:最短走行(小ス、1.2m/s,2.0m/ss、14秒194)成功

 

こんな感じの成績でした。

迷路自体は簡単で、バグさえなければ恐らくもっと上のパラメータでも走れたのでしょう。

第1走と第3走の探索走行に0.025秒の誤差があるのが少し気になりますが、初期位置で機体速度等がずれていたのかなと思います。

ちなみに、最短ミス後に探索をやり直しているのは、最短で死んだ時、フェイルセーフを入れていなかったため、つい癖でリセットボタンを押してしまったからです。

今は、サマーギフトくんに教わったフェイルセーフを導入して探索、最短時失敗の際すぐ停止、迷路情報の復元、等々を行えるようにしました。

そして、第2走で死んだ原因ですが、これは恐らく大会前日に台形加速のバグを消すために消したプログラムが原因だと考えています。部室の迷路部屋では動いていた動作ですので、月曜日にしっかりと原因について考え、修正したいと思います。

ちなみにこのバグというのは、停止時から短直線を走ろうとするときに生じるものです。そして、今色々考えた結果、時間ベースの台形加速は場合分けが難しく、距離に差異が生じやすいため、距離ベースに変更したほうがいいのかな、と感じました。実際、スラロームで物理量ベースの書き方は学んでいるので、変更は容易いはずですし、もしかしたらそちらに直すかもしれません。

 

第4走は普通にきれいに最短してくれました。ここまで分かることは探索、最短アルゴリズムともに16×16でのバグが(恐らく)ないということですね。嬉しいです。

そして、第5走は、第2走と同じパラメータなのですが、hihumint!くんをスタート区画のギリギリまで下げて走りすぎてしまうバグを物理的に修正しました。スタート後の直線を抜けてしまえば大きなバグはないのでいけると確信してました。

 

とまぁ、そんなこんなで僕の出走は終わってしまいました。悔いが無いかと言われれば嘘になってしまいますが、東日本大会からの反省や目標はすべて達しましたし、個人的には満足しています。

 

楽しかったですしね。徹夜調整。w

 

長くなってしまいますが、次に九州大会に向けての目標を軽く書いて終わりにしたいと思います。

 

1つ目:台形加速関数のバグ探し、または大幅作り変え

こいつが中々厄介。。。頑張ろう。月曜日~金曜日にかけて。

2つ目:大回り90ターンと180ターンの実装を月曜日に行う。調整は適当に頑張ります。

3つ目:フェイルセーフの動作チェック。ここらへんは1つ目をやってる最中に出来るかと思う。

4つ目:九州大会はエキスパートクラスとしての出場となるので、安定した探索が出来るように小技を追加していきたいと思います。

5つ目:色んな調整をする!

6つ目:励磁のタイミングを馬鹿にされないようにする!!!

 

以上!それでは、また大会直前直後何れかにブログ書きます。東北大会はまだ終わってません(お家に帰るまでが遠足)が、東北大会お疲れ様でした。

東北大会直前

おはこんばんちわ。ひふみです。

東日本からなんだかよく分からないけどがむしゃらに頑張ってきました。

東北大会での目標はスラローム最短です。
最速パラメーターとか決めときたいですね。

東北大会の試走会でやることをまとめときたいのでブログ書きました。

まず1つに、最短のバグを直すこと。
これは、僕の最短は未知区間にも行ってしまうので、それの修理です。プログラム自体は書いてるので、出来れば出発前に直(確認)したいとも。

2つに、スラロームの調整です。
スラローム自体はできたので、色々と調整したいです。これは完全に試走会場で行うことになりそう。

3つめ、スラロームを探索に組み込むことです。これは正直すぐ出来る。次がバグを産んじゃいそうで怖い。

4つめ、スラロームを最短に組み込まないといけない。最短のパスにスラローム入れて速度とかでバグが出なければいいけど。

5つめ、直進2.0m/s近辺からのスラロームでバグが生じます、折角速度出せるのにこれでは意味がない。出来れば東北までに直したい。

最後、いろんな調整。やっぱり袋小路から出るときとかにずれる。ずれる。ずれる。良くない。探索すらできない可能性も。


終わり。電磁気のテスト始まるので頑張ってきます。

東日本大会を終えて

おはこんばんちはひふみです

 

随分とブログを書くのが久しぶりな気がします。

理由はただ一つ、書いてる暇があるなら開発したい。サボりたい。課題したい。みたいな妥当な理由です。

 

今回は(一応)初大会なので、色々と新しい発見や進捗、後悔、反省等々とありました。開発してるだけでは味わえないことばかりですね。

 

まず、ご存知?の通り、 hihumint! のメイン基板が水曜日にお亡くなり。

修理しろよって言われましたが、UEWでつぎはぎしてきたみんと君をこのまま生かしていいものかと悩み結局digikeyで発注かけました。土曜に届きました。日曜には動きました。

 

その動いたみんとをまずは午前中のクラシック直前、windowsの更新プログラムも入り無事死亡かと思いきや何とか復帰、ゴール座標を7,7に変更し、出走。

 

この時、事情を知る人の誰もが走るなんて思ってなかったんでしょうね。僕もです。

スタート区画を出たことも割りと奇跡なのに、完走までしてくれるとは。部室の4×4ですら危うかったのにな。まぁ、普段から調整ガバガバで怒られてた上に、当日完成の機体なので調整なんて出来てる訳もなく復路探索で死ぬ、重ね探索なんてもってのほかでした。まぁここまでは良かったのかな。

 

一番後悔というか、辛いなって個人的に感じたのはクォーター競技でした。

機体作るために徹夜したのとクラシック終わってしかも完走までしたので軽く燃え尽きてたんでしょうね、折角調整できる時間がたんまりあったのに調整もせずのんびりしてました。そのせいで重ね探索に入るためのプログラムのバグにも気付かないわ、当日製作でハードバグがないわけがないのに過信して何も確認せず動かしていたこと、これらの要点が重なってがばみんと君となってました。クォーターで重ねできなかったのは個人的に本当にショックでした。出来たから何になるわけでもないですが、出来ることを出来ずに帰るっていうのが嫌いなのでショックが大きかったのかなと今では思います。

 

あとは周りのフレッシュな人たちが常に1週間先に居て、タイムも凄かったので、純粋に悔しかったです。この悔しいって気持ちは次の東北大会にぶつけたいと思います。

 

あ、書くタイミングを失ってしまったけど、サーキットはマジで楽しかった。ただ微妙に速度出せないの気になるので原因究明っすね。

 

東日本大会のまとめとしては、進捗はたくさん出たものの、色々と詰めの甘さや自分の努力不足が痛感出来た、そんな大会だったと思います。

あと、先輩たち、特にFNDの走りは個人的にピカイチにカッコよかったなって思いました。ホモかな。

 

今日もまた長々と書いてしまいましたがこんな所で終わっておきます。

眠いし。悔しさ極まって部室行ってひたすらみんとと戯れたおかげで疲れが倍増したし。

それでは、次の記事でお会いしましょう。おやすみんと!

e2studioのC標準ライブラリの仕様について

お久しぶりおはこんちゃすひふみです!

 

今日は、かる~く標準ライブラリの読み込みについて簡単にお話したいと思います。

完全に備忘録なので、そこらへんよろしくぅ!

 

1.問題提起

math.hをインクルードしてもsqrtが使えない。

エラー内容は以下。

E0562310:Undefined external symbol "_sqrt" referenced in ".\src\motor.obj"

 

 

2.考えられ得る問題に対する原因

コンパイル時に定番の-lmが行われていない。

 

3.最終的な解決策

e2studioの設定でmath.hを使用可能とした。

その設定方法が今回の花。以下。

 

プロジェクト -> プロパティ -> C/C++ ビルド -> 設定 -> Standard Library -> 内容

 

を辿り、使いたい標準関数にチェックを入れる(math.hだけでなく他の関数も勿論そこで設定可)。これによりsqrtが使えるようになった。

 

以上!

 

しかしだ、

 

RX631の初期設定について(2) ~クロック設定の闇編~

こんばんちはひふみです。こんちゃ!

 

今日は、クロック設定についての話を簡単にしたいと思います。

なんで、CMTの後なの?って思われるかもしれませんが、僕自身まさかクロック設定がこんなにも大変なものだとは認識していなかった。。。

最後の最後は、え・・・、ここ・・・?っていう、簡単な見落としでした。

クロックの設定が出来たので恐らくMTUも出来ているのですが、如何せん回路がおかしいのかステッパーが回りません。CMTで回そうとしても回らないので、このブログを書き終わり次第色々確認してみます。

 

さてさて、それでは本題です。今日はタイトルの通りクロック設定の闇についてです。実際、ブロック図通りに書けば動くのですが、そのためにプロテクト解除とか、使わない機能についても設定しないといけなかったりとか、予約ビットですら設定しないといけなかったりとかで、本当にめんどくさかったです。

悲しみ。そろそろ具体的な話をしていきましょうか。

まず、始めにしなければならないことは、レジスタライトプロテクション機能の解除です。僕みたいなアマチュアには罠でしかありませんでした。本来は、プログラムが暴走して、重要なレジスタを書き換えられないようにするためのプロテクト(保護)です。プロテクトレジスタ(以下PRCR)は、上位8bitがPRCキーコードビットと呼び、PRCRレジスタの書き換え可否を制御しています。PRCRレジスタを書き換える場合は、上位8bitを"A5h"とし、下位8bitに設定値を書き込む様です。例としては、

SYSTEM.PRCR.WORD=0xA501 ;

とかでしょうか。これが何を意味するかはデータシートで見てみてください。

さて、これがまずレジスタを叩く為の準備です。以上は今後も使うことになるので、よく調べておきましょう。レジスタ書き換え許可が終わり次第、書き込み禁止に設定しておきましょう。何かプロっぽくてかっこいい!

次の設定で、各クロック発振器を停止しておきましょう。動いている最中に設定は厳禁です。

そして、ようやっとブロック図通りの設定をしていく訳ですが、PLL停止ビットでPLLの動きを止めておきましょう。そして分周の設定、逓倍の設定の二つが終わり次第PLL停止ビットでPLLを許可してあげましょう。

次に、メインクロックを動作させてあげる(MOSCCR)わけなのですが、メインクロックが安定するまで少々お時間頂きたいので、for文か何かで"168h"ほど無駄時間を生成しておきましょう。何故かはかふぇルネで調べましょう(僕は知らない)。

はい。それでは、そろそろ動き出してくれます。200MHzは生成できています。これを各システムに分けていく訳ですが、当然1分周ではいけません。そのため、分周をシステムクロックコントロールレジスタ(SCKCR)で設定します。この時注意しなければならないことがありまして、データシートP.255 表9.1を見てみると、システムクロック以外は大抵50MHz(Max)となっています。従って、4分周以上の分周をしないといけないことになります。そこで、各システムのクロックを分周設定していきます。そしてクロックソースの設定(SCKCR3)をして終了。といきたいのですが、少し遡って罠があります(僕には罠だったけど強い人は罠じゃないだろうな、ハハハ)。おもむろにSCKCRのレジスタの説明を眺めてみます。普段であれば、予約ビットの欄には、"読むと“0”が読めます。書く場合、“0”としてください"みたいな文章が書かれています。ですがどうでしょう、SCKCRの下位8bitは"“0001b”を設定してください"と書かれているではありませんか!これは困りました!困りましたよ!一つ一つ設定するだけでは動かないのです!この"“0001b”を設定してください"を見逃していた僕は、クロックをまともに動かすことが出来ていなかったのです!なんということでしょう!この7月に入ってからあれやこれや悩んでいたことはすべて無駄なことだったのです!!"0001b”を設定してください"を見逃していたために!!!!

・・・取り乱しました。

要は、レジスタ丸ごと設定してくれと仰るのです(iodefine.hで自分で名称付けても良いのかもしれませんが)。今回は面倒なのでレジスタ丸ごと設定してやりましょう。例えば、

SYSTEM.SCKCR.LONG=0x~~~~11 ;

とかでしょうか。最後の11は0b00010001です。あとは適当な設定をしてあげれば動くと思います。LONGになっているのは、このレジスタが32bit長なので、深く気にすることはないですね。

とまぁこんな感じでクロック設定が終わりました。

およそ7月からプログラムを書いていますが、中々進捗出せないですね。悔しいです。今後も頑張っていきます。

 

それでは、日も跨いでしまったので以上としましょう。今回もお読み頂きありがとうございました。

 

おやすみんと!

RX631の初期設定について(1) ~入出力&CMT編~

こんばんちは、ひふみです。

 

今回はRX631についての備忘録を書きたいと思います。

すーぐ忘れるんですよね、勉強したこと。事実、入出力とか少し忘れてます(大したことじゃないけど)。

雑談は置いておきまして、本題ですね。

今回の記事は、データシート読んでレジスタいじれるぜ!って人には向いてないかもしれません。データシート読んでもよく分からない。。。レジスタ・・・?うーん?って人に向いてるかもしれません。

 

それでは、始めていきます。

 

ひとつめは入出力についてです。入出力が出来たらLEDぺかーとかスイッチぽちーとかが出来ます。幸せですよね。かっこいいですよね。

それでも、入出力を自在に操るにはある程度データシートが読めないといけません。

入出力入出力と言っているように、大半のポート(ピン)は、入力と出力のどちらも行うことが出来るのです。それの何が問題かといいますと、そのポートを入力で使うのか出力で使うのか指定してあげないといけなくなるのです。そこで、データシートを眺めてみると、IOレジスタなるページがあります(IOについては特に説明しません、流石にこんなブログに来る人はわかってますよね)。そこのIOレジスタアドレス一覧をひたすらに眺めていくと、ありました。ポート方向レジスタです。レジスタシンボルはPDRと言うそうです。だからなんだ💢、と言いたくなりますよね、分かります。そこでおもむろに開発プロジェクトを開きましょう。そして、iodefine.hでなぜだかは知りませんがtrl+Fを押して、PDRと入力してEnterを押してみましょう。そこからは自明ですよね。

このレジスタを"0"か"1"にしてあげると入出力どちらかになるそうです。データシート参照のこと。

さて、入出力の設定が終わりました。次は、実際にIOを叩いてみましょう。IOレジスタアドレス一覧をそう長くない時間眺めてみると、ポート出力データレジスタと、ポート入力データレジスタといった文字列を発見することが出来るでしょう。ここからは、ポート方向レジスタと同じです。頑張って。

はい、IOについては以上です。1時間もかからない内に終わるでしょう。僕はだべりながら20分くらいで終わりました(書き込みに72時間かかったことは秘密です)。

IOが出来ると、ステッピングマウスを作っている場合は励磁が出来るようになります。楽しい。

 

さてさて、次はCMT(コンペアマッチタイマ)についてです。なぜコンペアマッチというかと言うと、タイマカウンタと任意に設定された定数の一致(match)を比較(compare)しているからです。RX631のCMTは2 チャネルの16 ビットタイマによって構成されるCMTを2 つ(ユニット0、ユニット1)、すなわち、4 チャネル内蔵しているらしいです。そして、4種類の分周クロックとコンペアマッチ割り込みを各チャネル独立に選択出来ます。

簡単なCMTの紹介は以上にして、次はCMTの動作の説明をしていきます。

まず、クロック選択ビットで分周クロックの選択をします。

次に、コンペアマッチタイマスタートレジスタを1にします。

そうすると、コンペアマッチタイマカウンタがカウントアップしていきます。そのカウンタがコンペアマッチタイマコンスタントレジスタにて設定された値とマッチした場合にカウンタの値が0hになり、コンペアマッチ割り込みが"1"になります(これには、コンペアマッチ割り込み許可を設定しておく必要があります)。そして、またカウンタがカウントを開始します。以下この繰り返しとなります。

これだけで見ると大変簡単なように見えますよね。僕も簡単やん!何これ簡単やん!って言ってました。過去形です。

 

・・・その理由は後ほど説明するとして、次はカウントのタイミングについて軽く触れます。ここは読み飛ばしても問題ありません。僕の趣味です。

分周クロック(PCLKの分周になりますが、RX631においてPCLKとはPCLKBのことを指します。)とコンペアマッチタイマカウンタのカウントタイミングです。これは、カウントクロックが発生し、これは立ち下がり("1"から"0"に切り替わる瞬間のこと)にカウンタが1増える、いわゆるネガティブエッジトリガと呼ばれるフリップフロップですね。このように、カウントクロックが発生してそれが立ち下がる毎に、カウンタの値が1ずつ増えていきます。以上がカウントのタイミングについての説明でした。フリップフロップ好きなんですよね。(勉強不足であります故、間違いがある可能性が高いので、強い人が読んでたら是非訂正してほしいです。)

同様に、コンペアマッチ割り込みが入るタイミングも、コンペアマッチ信号の立ち下がりによって発生します。

 

最後にCMT(他の機能もだいたいそうですが)を使う時の注意点だけ書いておきます。

RX631には、モジュールストップ機能というやつが存在しています。こいつが素人には中々厄介。。。こいつによって、CMTの動作禁止/許可を設定しないといけません。初期値ではCMTの動作は停止されていることになっています。それを解除することによって、レジスタアクセスが可能となります。こんな感じでデータシートを読みつつやれば動くと思います。

僕はまだ動いてません。ハハハ。

※追記:PCLKBの設定をしていませんでした。クソ楽しい。

※(7/5追記):7/1、先輩に最適化を取り除いてもらったところ、きちんと動作しました。 while(条件文) ; の何をどう最適化しているのでしょうね。最適化停止前にwhileでプログラムが停止していることは確認していました。なので、while自体が取り除かれている訳ではありません。よくわかりませんね。考えることはやめましょう。最適化の勉強もしないといけないですね。というか、プログラムの勉強からですかね。制御やらプログラムやら、処理的に綺麗なプログラムやらやることは盛りだくさんだ・・・。

 

あ、番外編として、メインクロックの設定についてもお話しようか。

メインクロックの設定は、クロック発生回路のブロック図辿れば誰でも設定出来ると思います。大して書くことはないですが、個人的にここのレジスタ叩くのが大好きです。論理回路好きだから、あ!逓倍した!あ!分周した!ってなっておもしろいんだよね。このクロック発生回路は、マイコンにおいて命の源とも呼べる機能なので、僕に直接聞いてくれると、熱く語り出すかもしれません。熱く語らないかもしれません。

 

それでは、また進捗が出次第ブログを書きたいと思います。ここまで読んでくださってありがとうございました。おやすみなしあ~