はじめに

まえがき

こんにちは

マイコンなどで遊んでみた内容を、作業記録として残すブログです。 f:id:yamamoto-works:20181110011400j:plain

というより、すっかり忘却力が身についたので、備忘録として残しておかないと 何も思い出せなくなりつつある、というのが真相です。

内容は無保証です。 その時考えたことを書いているので、 ある記事で書いたことを、 それより新しい記事で補足することも、 否定することもあると思います。

もし何かお役に立つ内容があれば幸いです。


主な取り組み

多機能マイコンボード STM32 B-L475E-IOT01Aで遊ぶ

B-L475E-IOT01Aで遊ぶ - 目次 - (無)やまもと製作所の作業記録

カウンタ

パルス幅はひとまず置いておいて、カウンタを試してみます。 プログラムはこんなの。難しいところはなさそう?

難しさと言えば、多機能ボードなのでいろいろな端子が すでに使われていて、残りの端子でなんとかする必要が あります。 今回はタイマ2のETRをカウンタ入力端子として使いました。

f:id:yamamoto-works:20190602233221p:plain

パルス幅入力(2)

更新がいつものペースに戻った感じもしますが、 少しずつ活動は続けています。

パルス幅入力は、とりあえず動くようになったのですが、 気に入らないところがあって、そこを直すと動かなく なってしまうのです。

何か勘違いがあるのだと思いますが、現時点ではわかりません。 少し時間を空けてやってみると気づいたりするので、 今のところこのレベル、というのを記録に残しておきます。

f:id:yamamoto-works:20190602232118p:plain

パルス幅入力(1)

超音波距離センサを使ってみたいと思い、パルス幅入力を 試しました。使ったセンサはこれ:

akizukidenshi.com

超音波を出して反射して戻ってくるまでの間センサからHighを 出力します。このセンサ出力がHighになっている時間を 測定すると、音速を使って距離を計算できます。

最近はやりのToFセンサは光を使うので反射して帰ってくるまでの 時間が短すぎてマイコンで測るのは難しいのですが、超音波なら 問題ないはずです。

先人の知恵を検索したところ、次のようなサイトが関係しそうな 気がします。いや、他にも参考になるサイトがあったのですが URLがわからなくなってしまいました。

letanphuc.net

カウンタを直接クリアできる、という点が特に目を引きました。

github.com

このセンサを動かしてみるとわかるのですが、距離の計測を失敗する ときがあって、その場合はキャプチャできなくてタイマが オーバフローします。そういう時の処理のか参考になるかも。

www.programering.com

CubeMXではありませんが、これもupdateイベントの参考になりそう です。

というような情報を参考にプログラムを作ってみると、 動作が正しいような正しくないような、微妙な感じに なってしまいました。 引き続き取り組みます。

USB CDCがエラーになる要因

USB CDCがなぜかエラーになる場合があって、 その要因の一つがわかったので忘れないように 書いておきます。

本来ならUSBの設定を行ったときに、その割り込みハンドラである OTG_FS_IRQHandlerが生成されるはずですが、なぜか生成 されない場合があるようです。 これが生成されないと、まあ何か異常なことが起こりますよね。

CubeIDEのバグかなあと思うのですが、直るまではUSB CDCで エラーになったら割り込みハンドラの有無を確認して、 なければ強制的にソースコードの生成をやり直すとよいようです。

I2C

I2Cで接続されたセンサを使ってみます。

最近は、まず参考になりそうな先人を探すところからスタートです。 今回はこの方の簡潔な説明を見て、考えながら試行錯誤しました。 単にセンサにアクセスするだけなら、これで十分な気がします。

meerstern.seesaa.net

最初、このMemAddSizeに何を指定するのかを誤解していて、 センサから5バイト読むから5とか指定すると動作しませんでした。 上記サイトにも書いてありますが、8ビット単位で読むなら I2C_MEMADD_SIZE_8BITを指定するのですね。

今回のセンサのwho am iレジスタを読んでみるコードはこんなの。 実質HAL_I2C_Mem_Readの1行だけですが、これが動けば一安心です。

f:id:yamamoto-works:20190512204745p:plain

あとは同じパターンでソースコードをごりごり書けばできあがりです。