2020年9月6日日曜日

Arduino Pro Microの割り込みでドハマリした件

 現在作成中のラップタイマー。

簡単に言えば赤外線通信で車両を認識し、最終的にはタイムをしゃべる(Aquestalkを使用)という物。

で、AquestalkについてはI2C通信で、液晶はLCDが地味に値段が高いので0.9インチOLED(ガラケーの背中についてた液晶)をI2C通信。

Arduino本体については単純に小さくて安いArduinoProMicroを使用する…つもりでいろいろやってたんですが。

ArduinoUNOで赤外線通信とLCDでしゃべらない版はできていたのでProMicroで組み直そうとした際にドハマリしました。

まぁドハマリといっても日曜日半日悩んだというだけの話でAquesTalkの3011と3012の違いで悩んだ時に比べればたいしたことないですが…

全てはLEDに帰結する


何にはまったか。
というのも「割り込みピン」にはまった。

赤枠が今回のメインの話



AquesTalkとOLEDにI2C通信を使います。
ArduinoProMicroはI2C通信のSDA/SCLとしてD2/D3ピンに割り当てられているので、D2/D3はI2C通信専用として使えません。

ArduinoProMicroは割り込みにD0,D1,D2,D3,D7を使うことができ、このうちD2/D3ピンはI2C通信で使用するので必然的にD0/D1/D7のいずれかを使用することになります。

赤外線通信を行うための受光モジュールは2つ、計測ポイントを2カ所置くことを最終的目標とするので今回は2つならんでるD0/D1を使用しようかなと思い、受光モジュール1個でD0につないで受信テストを行う際に問題が発生しました。

「割り込みが発生しない」



結論としては
最終的にはここを勘違い
このTX0とRX1にやられた感じ



上記表のうち、一番上のINT.0~INT.5の解釈とシルク印刷について勘違いしたという感じです。
いやーもうすげぇ悩んだ。

2~4の割り込みが発生しないだとか
D0/D1を使用するにはSerial.end()してシリアル通信を切る必要があるだとか
検索結果に英語でいろーんな事が引っかかってくる中、一つ一つやってみながら、最終的には回路を組み替えて割り込みをボタンで発生させてそのときの様子をLEDを光らせる(Serial通信が駄目だとデバッグの手段がLEDしかない…)事でデバッグ。

結果、
  • シルク印刷の数字とArduinoのマッピングが逆
  • ArduinoUNOでは正常に動いていたビット演算がProMicroでは?きちんと動かない。動くはずなんだけどなぁ?
    ((PIND & _BV(RECIEVE1_PIN))>0)digitalRead(RECIEVE1_PIN)
この2点でとりあえず何が起こっているのか理解できて解決。
一つ目のシルク印刷が逆だけならともかく、UNOではちゃんと動いていた演算の返値が信用できないというのがさらに問題をややこしくした感。
「あれーおかしいなぁー(プログラムまちがえたかなぁ?)」
で隣のピンに差し替えたときに気がつけたはず。プログラム確認するより手元で差し替えた方が速いので何度もプスプスやったし。

疲れたので昼寝する。
ぐぅ…


2 件のコメント:

  1. シルク印刷は数字の'0','1'ではなくアルファベットの'O','I'に見えますが、如何でしょうか?。

    返信削除
  2. あー…
    もしかして"O"utputと"I"nput?
    TXRXだけで十分意味分かるから数字だと思ってた… orz

    返信削除