やっとタコメーターの表示ができました。
1306OLEDを使ってアナログ的(針の動きを表現)なタコメーターをつくろうと挑んだんですが、どうも外部割込みとI2C(1306OLED)の相性が悪いようで、それを知らずに七転八倒をくり返していました。外部割込み処理と表示処理を別系統にする事で解決できました。
映像を説明すると、まずaruduinoのレオナルドで擬似エンジンを設けます。本来エンジンのシャフトが1回転するたびに出す信号をレオナルドの13番pinで擬似表現します。13番pinはaruduino上のledが光ってくれて都合が良いのでそうしました。
次に上記のパルス信号をUNOの2番pinで受けます。attachInterrupt()を使うことで信号を受ける度に指定した関数を実行できます。
attachInterrupt()とI2Cとの相性悪い問題では結構はまりました。
相性問題の解決は下記のページを参考にしました。 いや〜助かります。
関数の外で volatile bool myFlag = false;//読み取り旗 を宣言して関数内の頭でtrueに設定しています。
あと関数外でvolatile付きで宣言しているのはメーターの針の角度情報を収める変数(仮称volatile int myKakudo = 0) 。この外にある変数をメーター表示用のプログラムで参照しています。私はloop()内のプログラムから参照しました。
arduino2番pinで受けて実行された関数ではmillis()をつかってarduinoの起動時からの時間をミリ秒単位で参照してゴニョゴニョしています。マイクロ秒を使わないのはオーバーフローまでの時間が短いのを嫌った為です。
コンパクト自動車でのザックリとした回転数を目安にしたいだけのなんちゃってタコメータです。高い回転まで目盛りを刻んでも寂しいだけでしょうから5000RPMまでの目盛りとしました。いや、本当は私のプログラムでは処理が追いつかないのか高回転域で針が乱れます(笑)。針は回転数に応じて目盛り以上に移動する仕様です。
これでやっとスタートラインに付けました。あとは車に持ち出す基盤づくりとか、デザインや必要なものを考えるとします。
コメント
コメントを投稿