「I2C スキャナ」の表示不良を直す

前回、「I2C スキャナ」を組み立てましたが、残念ながら OLED の表示がずれていて、残念な結果でゴールデン・ウイークが終わってしまいました。

今回は、OLED のずれを直して、「使える計測器」に改善します。
(前回の OLED のズレ。本来ならば最上段にはヘッダの数字が表示される。)


前回紹介した、Nickelgrass さんが「elektor MAG」誌のユーザフォーラムで公開している「Micro I2C-Scanner with 0.96″ Oled and ATtiny44」を組み立てる記事は、以下のリンク先をご覧ください。

ATtiny で OLED の使い方を調べる

今回、はじめて ATtiny44 に OLED をつないで表示させました。
また、この「I2C スキャナ」は、Arduino UNO では(ソフトウエア I2C 以外では)使えない2つ目の I2C インターフェースを使っています。

これらの全ての機能を短期間で理解して、使ったことのないプログラム環境の「Microchip Studio」を使いこなしてプログラムを改良する能力は残念ながら持ち合わせていません。

そこで、(逃げですが)「I2C スキャナ」を完成させることだけを考えました。
「I2C スキャナ」の製作者の Nickelgrass さんが Atmel Studio 7.0 でプログラムに必要な全てのファイルを公開されているので、その中で一番関係ありそう(と素人の私が勝手に考えた)「oled.cpp」の中身を見てみます。

まず、「void init_oled(void)」で初期化をしています。
一部抜粋ですが、コメントで「display clock 」と書かれた部分を見つけました。
最初は、ここのクロックがズレているのかと考えましたが違うようです。

void init_oled(void)
{
	oled_com(0xAE);//display off
	oled_com(0x2E);
	oled_com(0xD5);//display clock
	oled_com(0xF0);

次の「void oled_cls(void)」部分は画面のクリアなので関係ないですね。

「void oled_com(uint8_t data)」部分も関係なさそうです。

最後に「void oled_xy(uint8_t x, uint8_t y)」があります。
ここで、OLED の表示範囲を設定しているようです。

多分、2行目の「x」でⅹ軸を指定して、3行目で X の表示幅を 127 に設定しています。
今回ズレているのは X 軸ではなく Y 軸なので、4行目(oled_com(0x22);)以降が怪しいです。

void oled_xy(uint8_t x, uint8_t y)
{
	oled_com(0x21);
	oled_com(x);
	oled_com(127);
	oled_com(0x22);
	oled_com(0);
	oled_com(7);
	oled_com(0xB0|y);
}

5行目は「y」のような気がするのですが、「0」である理由は現在の所は分かりません。
6行目の「7」は、この OLED のY軸の表示ドット幅は 64 ですが、ページ数は7なので、その数を表しているのでしょう。(3行目のⅹ軸の 127 と同じだと思われます。)

「oled.cpp」を変更してみる

これからは、「oled.cpp」の設定を変えて OLED 表示の変化を見てみます。
それには「Microchip Studio」から「ATtiny44」を書き込み出来た方が便利です。

では「Microchip Studio」の設定を変更します。
「Tools」の「External Tools」を押します。

「External Tools」の設定をすると、前回は DOS 窓の CUI で使っていた「avrdude」が、「Microchip Studio」環境内でマウスをクリックするとプログラムの書き込みが行えるようになります。

「Title」欄に、お好きな名前(今回は「USBasp_ATtiny44」)を入力します。
「Command」欄に、「avrdude」のフォルダパスを入力し、隣の「…」部分を押します。
「Arguments」欄には、コマンドを入力します。

ここで入力するコマンドでは、「Microchip Studio」のプロジェクトが入っているフォルダ下の「Debug」フォルダ内に、ファームウエアの「i2cscanner.hex」が出来上がるはずなので、そのフォルダを指定するのですが、ビルドをしても私の設定が悪いのか「Release」フォルダ内に出来上がるので、そこを書き換えました。

こんな感じ「-p t44 -c usbasp -P usb -U flash:w:”$(ProjectDir)Release\$(TargetName).hex”:i」にしてみました。

では、6行目の「7」を「0」にしてみましょう。
「oled.cpp」を編集します。

oled_com(7);

oled_com(0);
に書き換えて保存します。

「Microchip Studio」のビルドを押します。

プログラムがコンパイルされて「Release」フォルダ内に「i2cscanner.hex」が出来上がりました。

前回と同じように「USBasp」を使って「ATtiny44」をパソコンにつなぎます。
(「I2C スキャナ」の配線もしておけば、すぐに OLED 表示の変化を確認できます。)

「Microchip Studio」の「Tools」で、先ほど設定した「USBasp」を選びます。
すぐに改造したファームが書き込まれます。

OLED 表示はどうでしょうか?
カメラのシャッターの影響で、写真で見ると正常に勘違いしますが、上に数ドット分ズレています。
この部分は関係なさそうです。

次に、5行目を編集します。

oled_com(0);

oled_com(7);
に変更して書き込みます。

OLED の表示はどうでしょうか?

「お!初めて1行目にヘッダ用の数字が表示されました。」

では、ここを重点的に変更します。

oled_com(7);
に変更した部分を
oled_com(6);
に減らします。

少し画面が出てきました。

oled_com(6);
に減らした値を
oled_com(3);
まで減らします。
もう少しですね。

oled_com(3);

oled_com(2);
にします。
惜しい!もう少し。

5行目の値を
oled_com(2);
から
oled_com(1);
にします。

「やった!正常表示になりました。」

正常に表示できた理由

「Microchip Studio」を使って OLED に表示できるように ATtiny 用のプログラムを作ったことがないので、なぜ正常に表示できるようになったのかは、今のところは分かりません。

しかし、OLED の表示範囲を設定している「oled.cpp」のY軸部分を書き換えたら正常表示になったので、変更した部分がY軸のページに関する部分であることを想像することはできます。

1 最初の処理で、Page0 部分へ書き換えない、一番上のヘッダの数字部分をプリントする。
2 数秒毎のループ処理で I2C アドレスをスキャンして、I2C のアドレスが見つかった部分の「□」を「■」にした後、7ページ分を上書きする。

この2番目の処理を「Page0」から始めると、準備している上書き用データが、ヘッダの数字部分を消してしまい、データが7ページ分しかないので、最下行にノイズ的な物が表示されるのではないでしょうか。
(図解すると、こんな感じでしょうか?)

でも、古い OLED では正常に表示出来て、新しい OLED ではズレてしまう理由が分かりません。
(多分、Arduino ではどちらも正常に表示できるので、問題になっていないのかな?)

スキャン機能の確認

スキャン端子に刺している OLED のアドレスは「0x78」と読めます。
「SSD1306」の基板裏に印刷されているアドレスと同じですね。
でも、スケッチで使うときの「0x3C」とは表示されないのですね。

他の I2C の部品も見てみます。
部品箱には、多数の I2C の部品があるので、次回、色々な部品のアドレスをまとめてみますが、今回は「Arduino しようぜ!I2CのLCD編」でも使用した、「AQM0802」を見てみます。

OLED から、活線状態で LCD に入れ替えても、ちゃんとアドレスが表示されました。
LCD のアドレスは、「0x7C」と読めます。

この LCD のスケッチ入力用のアドレスは「0x3E」ですが、
16進数の「0x7C」を2進数にして「0111 1100」
最下行のゼロを省略すると「011 1110」
これを16進数に戻すと「0x3E」で合っていますね。

これで、ゴールデンウイーク中に実現できなかった、「I2C スキャナ」の表示の不良を解消するというリベンジをすることが出来ました。

本来ならばプログラムの中で、OLED が古い型か新しい型かを判断し分岐して、Y軸の表示場所を変更する処理に改修するべきなのでしょうが、電子工作Dランク(他人が作ったものを模倣して楽しむ程度)の私としては、ここまでで精一杯でした。

単体で I2C アドレスが分かって、電源を入れたままでも刺した部品のアドレスを、定期的にスキャンしてくれる「計測器」が出来たので、満足度は90点です。

コメント