「I2C スキャナ」完成!と基板のお裾分け

色々な事がありましたが、やっと「I2C スキャナ」が完成しました。
前回の記事を読んでいただいた方はご存じだと思いますが、私の技術力では一歩も進めなかった「I2C スキャナ」の改造方法の協力を募ったところ、快く応えて頂いた下さった方々がいました。

私の無理なお願いに最初に答えてくださった「ラジオペンチ」さん、プログラムの修正をしてくださった「siliconvalley4066」さん、大変お世話になりました。
この場を借りてお礼いたします。ありがとうございます。

今回の記事は、これ1つを読めば今までの「I2C スキャナ」の経緯が全て分かって、どなたでも組み立てられるようにした総集編です。
(完成した I2C スキャナの姿です。)

なお、製作した「I2C スキャナ」のプリント基板が余っていますので、ご希望の方には無料でお送りします。(送料84円はご負担ください。)
回路図を見て頂ければ部品点数も少なくユニバーサル基板で簡単に出来るので、プリント基板を使って同じ物を作りたいという方は少ないと思いますが、記事の最後に「I2C スキャナ基板の無料配布」の要領を記載しています。

ー2024年8月19日追記ー
プリント基板の在庫が変わったら、ここに記載します。
・基板残り:15枚

(今回の記事は、プリント基板製造の PCBgogo さんに提供を頂いています。
よろしければ、以下のリンクのクリックにご協力ください。)

I2C とは

NXP セミコンダクターズ(旧社名:フィリップス・セミコンダクターズ)が、1980年代に開発した電子機器制御用の簡易な内部バスシステムです。(1980年と言えば「すでに人類は・・・」で始まるオープニングを思い出します。)

主な特徴は、
・必要なバスラインは、シ リアル・データライン(SDA)とシリアル・ク
ロックライン(SCL)の2本(加えて電源用に2本)
・バスに接続された各デバイスを固有のアドレスで指定し、常にシンプル
なマスタ/ スレーブ関係で通信を行う。
・真のマルチマスタバスを実現
・転送は 8 ビット単位シリアル双方向データ転送で、
Standard-mode (スタンダードモード:Sm) 最大100kbit/s
Fast-mode ( ファーストモード:Fm)最大400 kbit/s
Fast-mode Plus ( ファーストモードプラス:Fm+) 最大1Mbit/s
High-speed (ハイスピードモード;Hs-mode)最大3.4Mbit/s
・オンチップ・フィルタリングによってバスデータラインのスパイクを除去
・同一バスに接続可能なIC の数は、バスの最大容量で制限される。

この記事を書く際に、再度このデータシートをよく読んだら以下の記載がありました。

7.5 バスラインの配線パターン
一般的、バスラインはクロストークと干渉が最小になるよう配線されなければなりませ
ん。バスラインはHIGH レベル時にプルアップ・デバイスによる比較的高いインピーダン
ス状態になることからクロストークや干渉の影響を受けやすくなります。
プリント基板またはリボンケーブル上のバスラインの長さが10cm を超え、VDD ラインお
よびVSS ラインが含まれている場合、配線パターンは次の図の配置が推奨されています。

配線を外に出す際の配線パターンの図を作りました。
(電源ラインが外側じゃないんですね。)

・・・今まで何も考えずに適当に I2C ラインを外に引っ張っていましたが、こんな決まりがありました。
次回から気を付けよう!(すでに作ったプリント基板は・・・)

NXP Semiconductors 社「I2C バス仕様およびユーザーマニュアル」(UM10204)より引用

I2C のプルアップ抵抗

I2C の2本のバスラインには、プルアップ抵抗を付けなくてはいけません。
その値は、今まではネットの情報などから「10 kΩ」だと思っていましたが、ちゃんと根拠を調べましょう。
(一般的な I2C バスのプルアップ抵抗の例)

I2C バス プルアップ抵抗の計算法

この項目は、NXP Semiconductors 社「Designing with I2C-Bus Devices」(Emmanuel T. Nana)より引用しました。

I2C バス(SDA と SCL)はオープンドレイン/コレクタなので、ラインを論理の「1」に維持するために 2 kΩから 10 kΩのプルアップ抵抗が必要です。

プルアップ抵抗は、最小値と最大値が計算で求められます。
この資料ではプルアップ抵抗は、求めた最小値と最大値の間の値の抵抗を使用すると書いてあります。
それでは見てみましょう。

最小値
R = (Vddmax – Volmax)/ 0.003A
電源電圧が 5 ± 0.5 V の場合は
R = (5.5V – 0.4V)/ 0.003A = 1.7 kΩ

最大値
最大値は計算が面倒です。
引用元の資料をそのまま転載すると、
V(t1) = 0.3Vdd = Vdd (1–1/et1/RC); then t1 = 0.3566749RC
V(t2) = 0.7Vdd = Vdd (1–1/et2/RC); then t2 = 1.2039729RC
t = t2–t1 = 0.8472979*RC
For standard-mode I²C-bus: t = rise time = 1000ns (1 us)
so RC = 1180.2 ns
Example: at a bus load of 400 pF:

最終的なスタンダードモードの最大値の計算結果は、Rmax = 2.95 kΩ となります。
これがファーストモードだと
I²C-bus rise time = 300 ns @ 400 pF:
で Rmax = 885 Ω ですね。

あれ?全然 10 kΩ になりません。
この計算では電源電圧 5 V の時のプルアップ抵抗は、最小値 1.7 kΩ と最大値 2.95 kΩ の間の抵抗を使いなさいという事ですか・・・

I2C スキャナ

今回製作した「I2C スキャナ」は、「elektor MAG」誌のユーザフォーラムで Nickelgrass さんが公開している「Micro I2C-Scanner with 0.96″ Oled and ATtiny44」です。

「elektor MAG」誌とは

elektor MAG」誌の elektor (エレクトール)とは、古代ギリシャ語で太陽を表す言葉です。
同誌は、1961 年にオランダで発行され、世界的に幅広く読まれている電子技術の月刊誌です。
英語、ドイツ語、オランダ語、フランス語、ギリシャ語、スペイン語、スウェーデン語、ポルトガル語、イタリア語版が販売されており、50 か国以上で販売されています。
(アメリカでは普通の書店の棚にバイク雑誌などと一緒に並んでいて、気楽に購入できる値段で売っていました。)

電子技術を扱った雑誌という点では、日本の「トランジスタ技術」誌や「CQ」誌、「I/O」誌と似ていますが、もっと実際に電子工作をする人向けの紙面作りになっていて、読者が気に入った作品(プロジェクト)をすぐに作れるようにキットやモジュール、PCB (プリント基板) も販売しています。
また、プロジェクトのソース コードとPCB アートワークを Web サイトで無料で提供しています。

Micro I2C-Scanner

Nickelgrass さんが「elektor MAG」誌のユーザフォーラムで公開している「Micro I2C-Scanner」は、0.96 インチの小型 OLED にスキャンした I2C アドレスを一覧表示するデバイスです。

Raspberry Pi などで使われる Linux の「i2cdetect」コマンドと似たような情報を表示できます。
今まで見たことのある「I2C スキャナ」は、接続した部品単体のアドレスを1つだけ表示する物でしたが、これは違います。
一覧画面で知りたい I2C 部品のアドレスを表示してくれるので大変便利です。
(i2cdetect 画面の例)

(写真は Nickelgrass さんが製作した「I2C スキャナ」の外観)

Copyright (c) 2017 M.Hirsch
I2C-Scanner

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International generic license.
Please view the license details under https://creativecommons.org/licenses/by-nc-sa/4.0/

なお、組み立てに必要な全てのファイルは「elektor MAG」誌のユーザフォーラムで公開されていますが、英語でユーザ登録などが必要なので転載しておきます。(ファイル内のライセンスでは「表示 – 非営利 – 継承」で、原作者のクレジットを記載すれば転載可能ですが、問題がある場合は削除します。)

Micro I2C-Scanner の配線図

Nickelgrass さんの公開されているファイル(i2cscanner.zip)内の配線図を引用します。

ほとんどが MCU で処理されるので、配線図と言っても ATtiny84 とプルアップ抵抗などが並んでいるだけです。
(先ほどの I2C の資料にプルアップ抵抗の値が出ていましたが、気にせずに配線図どおりに作ります。)

必要な部品

上の配線図で見たとおり「Micro I2C-Scanner」を組み立てるのに必要な部品は、ごくわずかです。

  • ATtiny84 → 在庫の都合で ATtiny44 を使用
  • OLED SSD1306
  • 4.7 kΩ × 5
  • 0.1 uF
  • 10 uF
  • 14ピン IC ソケット
  • 4p端子 × 2(I2C 用)
  • 3p X 2 端子(プログラム用)

今回は、部品箱の在庫の関係で MCU には ATtiny44 を使います。(2つの違いは内部メモリ量だけです。)

Micro I2C-Scanner の試作

最終的にはプリント基板化して、作ったケースに収めて、試験器材に仕立てます。
まずは動作確認のために、回路図をブレッドボード上で試作します。

ブレッドボードでの配線の出来上がりは、こんな感じになります。

もちろん、まだ ATtiny にはプログラムを書き込んでいないので、電源をつないでも動作はしません。

ATtiny への書き込み

ATtiny へプログラムを書き込むのは本当に久々です。
ここしばらくは Arduino を使っていたので、パソコンと USB ケーブルでつなぐだけの楽ちん環境に慣れていました。

「どうやってつなぐんだっけ?」
資料を確認します。

思い起こすと ATtiny へプログラムを書き込むには USBasp 互換機を使っていました。
この USBasp とは USB-シリアル変換機位のサイズの基板で、ケーブルや変換コネクタ込みでも500円程度で購入できます。

USBasp の接続

ATtiny へプログラムを書き込むには色々な方法がありますが、一番お手軽で安価な USBasp 互換機を使います。
部品箱の USBasp には、接続ケーブル以外に6ピンへの変換端子が付いているので、これを使います。

先ほどのブレッドボードの配線はそのままに、プログラム書き込み用の配線を追加します。

ファームウエアの入手

I2C スキャナを作るのに必要なファイルは、「elektor MAG」ユーザフォーラムの「Micro I2C-Scanner with 0.96″ Oled and ATtiny44」ページにあります。
上の項目でファイルは転載していますが、リンク切れ等の場合は以下の場所にあるファイルをダウンロードしてください。
(ファイルのダウンロードには、無料のユーザ登録が必要です。)

Nickelgrass さんが公開しているファイル「Project files」をダウンロードします。
(内部で「7z」形式で再圧縮されています。解凍ソフトのご準備を)

解凍すると「i2cscanner」の「Release」フォルダ内に「i2cscanner.hex」があります。
これを「ATtiny」へ書き込みます。

プログラムの書き込み

AVR のソフトウエアの開発と MCU への書き込みには「Microchip Studio」を使うのが本来の姿ですが、hex ファイルを書き込んで試用するだけなので、今回は CUI の「avrdude」を使います。

ファイルはこちらにありますが、ずらーっと沢山の種類が並んでいて選ぶのが大変です。
私が見た時の Windows 用の最新版は「avrdude-6.4-mingw32.zip」でした。
ダウンロードして解凍したら、名前を付けた適当なフォルダへ入れておきます。

「avrdude」で I2C スキャナのファームウエアを書き込みます。
使用方法はほとんど忘れていたので、「jh4vaj」さんの「Atmel Studio + USBasp + avrdude でAVRに書き込む」を参考にさせて頂きました。

パソコンと「USBasp」経由でブレッドボード上の「ATtiny」をつなぎます。
必要に応じて「USBasp」用のドライバを入れておきます。

ドライバのインストールには、「Zading」を使います。
Zadig の HP からソフトをダウンロードします。(最新版は「ver.2.8」でした。)
Zadig を立ち上げて「Driver」欄の右側で「libusb-win32 (v 1.2.6.0)」を選んで「Install Driver」を押します。

「avrdude」のパスを通すのが面倒だったので、ファームウエアの「i2cscanner.hex」を「avrdude」のフォルダにコピーしました。

DOS 窓を立ち上げて、「avrdude」のフォルダへ行きます。

まずは、「USBasp」が正常に認識されているか確認します。
「avrdude」と打って Enter を押すと正常につながっていれば、オプションのメッセージが出ます。

次に、同じフォルダに入っているファームウエアを書き込みます。
コマンドは「-p t44 -v -v -c usbasp -P usb -U flash:w:i2cscanner.hex:i」としてみました。
正常に配線されていれば、数分で書き込みが終わるはず・・・

写真を撮り忘れましたがエラーで終了しました。
メッセージを確認すると「USBasp」の異常のようです。

「USBasp」の基板を確認すると、USB コネクタ直近のジャンパ(JP3)がオープンです。
調べてみると、このジャンパは ATtiny に書き込むときにはショートするようです。ここのジャンパを短絡して、再度書き込みます。

再度コマンドを送ると・・・

書き込み、読み出しと検証が終了しました。
正常に終了した様です。

動作確認

I2C スキャナ用の接続が終わっていれば、ファームウエアの書き込みが正常終了すると OLED に I2C スキャナの表示が出ます。

スキャン対象の端子部分にも OLED ディスプレイをつないでみました。

動作画面です。
「あれ?一番下に変な表示が・・・」

OLED のアドレスは、「■」で、ちゃんと表示されているようです。
しかし、最下段にノイズのような帯が出ています。
よく見ると、上に数ドットズレているようです。

画面表示不良の原因を調べる

「elektor MAG」誌のユーザフォーラムをよく見てみます。
「Discussion」の項目に「tannenba」さんが、同じような症状を書き込んでいました。

I built this and funny thing: the old displays work fine, the new batch has a bar at the bottom and no column headers. New clone displays assembled different? Good thing that I still have a couple of the older ones. I didn’t go for tiny, used a board the size of small bread board. Has it won 5v supply and socket for a usbtiny programmer. It does work good. Thank you for doing this.https://www.elektormagazine.com/labs/micro-i2c-scanner-with-096-oled-and-attiny44-1#

直訳(一部を省略)すると、
「私も作ったけど変な事が起こったよ。旧型の OLED は正常だけど新しい OLED を使うと下部にバーがあって、列ヘッダーが表示されないよ。」

困りました。我が家には旧型の OLED SSD1306 はありません。
なんとか現状の部品を使って、プログラムの修正で対応したいところですね。

ATtiny で OLED を使うには?

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

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

oled.cpp の確認

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

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

次の「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 表示の変化を見てみます。
明らかに1度の変更で 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行目にヘッダ用の数字が表示されました。」

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

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

ケースの製作

このままでは使いづらいので、専用基板を組み立ててケースに収納します。

「OLEDオシロスコープ」用に発注した基板の余白に、「I2Cスキャナ」用の基板も作ったので、SMD 部品を使った基板をサクッと自宅リフローしました。

おかげで、小型化できたので「OLEDオシロスコープ」初号機で使用した透明ケースの余った下半分を使って、ケースが作成できました。(完成した「I2Cスキャナ」)

オーダーした基板の全体図です。サイズは 10 cn X 10 cm です。
今回の基板も PCBgogo さんで注文しました。

最下段の左側が「I2C スキャナ」用の基板部分です。

これを切り出します。
上側がケースに組み込んだ前回の基板です。
前回の基板と比較すると、当然ながら配線の間違いを修正した以外に、部品の配置を工夫して基板サイズが小さくなりました。

自宅リフローと手半田

他記事の「OLEDオシロスコープ」基板の組み立ての時にカッティングマシンで作った、OHP シートのステンシルを使って、低温クリームはんだを「転写」します。(「転写」前に基板をアルコールで拭くことを、おススメします。)

SMD 1206 サイズの抵抗とコンデンサを基板に乗せます。

今回はお年頃の眼にやさしい新兵器を導入しました。
「ディスプレイ付きデジタル顕微鏡」です。
7インチの大型画面で拡大して SMD 部品が見られるので、簡単に基板に乗せることが出来ました。

SMD 部品を基板に乗せたら、ヒートプレートで数分温めれば基板の出来上がりです。
SMD 部品を乗せる時の唯一の注意点は、ほとんどが同じ値の抵抗ですが左側上から2個目の部品だけがコンデンサです。

あとは、背が低い部品から順に IC ソケット、端子4つ、電解コンデンサを手半田で半田付けします。
各端子の接続図は下のようになります。

テスト用の I2C 端子を OLED と同じ配列にしていますが、I2C の規格書に忠実に従うなら 10 cm を超える I2C の配線は SDA-+5V-GND-SCL の順にしなければなりません。

リフローにも慣れたので、ここまでの組み立て時間は1時間弱ですね。

ケースの製作

ケース製作の詳細は、以下のリンク「「I2Cスキャナ」のケースを作る」をご覧ください。

ケースの下半分は 3D ソフトのFusion 360 で設計して、上半分はセリアの「Travel Case SS」(No.1431)を使用しました。

3D プリンタのデータを作る時には、KiCad の データを読み込んで作りました。

インポートしたデータはこんな感じです。

この基板の 3D データと、蓋に使用する透明ケースのサイズを使ってケースを設計しました。
(下の図形は試作バージョンです。)

前回作ったケースのデータを使って、基板サイズを変更しただけですが、2回ほど失敗しました。
今回は測定端子と基板との位置合わせに苦労しました。

セリアの透明ケースは、窓部分をマスキングテープで処置して黒スプレーで塗装しました。

動作確認

塗装が終了した透明ケースのふたを、3D プリンタで作成したケースにパチッとはめ込みます。(プリント基板の固定はネジ止めではなくハメ込みですがしっかり固定されています。)
電源はモバイルバッテリーから供給して、スキャン端子には OLED をつないでいます。
(この記事を書く際に、外に配線を出す際は決まった順番にすることを知りました。次回に基板を作る時には考慮します。)

塗装する前には、内部が見えていたのでスキャン結果が見づらい感じでした。
しかし、黒で他の部分をカバーすることで、良い感じにアドレスの情報だけが目に入ってきます。

検出用端子には OLED をつないでいるので、上列の「7」と横軸の「8」の交点が反転して 16進数の「78」を表示しています。
この例では1つの部品ですが、複数の I2C の部品をつないでも、ちゃんと表示されます。
(部品によっては2つのアドレスを使いますが、そのような部品にも対応しています。)

オリジナルの I2C スキャナからの改良

これで一応はケースに入った「I2C スキャナ」が完成しました。
しかし、2つの直したいところがあります。

I2C アドレスの変換

Nickelgrass さんの設計された「I2C スキャナ」は、大変スマートな表示方法を採用しています。
ドット数の少ないディスプレイ(128 × 64 ドット)を使いながら、一覧でアドレスを表示出来ています。

ソフトウエア的には 14 ピンの小さな ATtiny(ATtiny84 又は ATtiny44)の少ないメモリで、2つの独立した I2C チャンネルを使用できているところが凄いです。
私も Arduino で OLED を使った「I2C スキャナ」を作れないかガンバってみたことがありますが、2つのチャンネルがうまく使えなくて断念しました。(Arduino UNO R4 上位互換機の「RMC-RA4M1」ならできますが、もったいないです。)

この「I2C スキャナ」は大変素晴らしいのですが、唯一の困ったところが Arduino で使おうとするとスケッチで指定するアドレスではなく、左シフトされた値が表示されるところです。(本来の部品のアドレスを表示しているのですが。)

OLED のアドレスなら「0x3C」と表示して欲しいところですが、「0x78」部分が「■」で表示されます。
Arduino IDE へ入力する時には計算すれば済むことですが、人間がやらなくても良いところは、機械にやってもらいたいところです。

これを改造しようとして、元のプログラムを色々と触ってみたのですが、現在の私の実力では修正することが出来ませんでした。
そこで、SNS とブログで修正方法のご協力を募集しました。

ラジオペンチさんからのご協力

まず最初に、この改造についてラジオペンチさんがブログに記事を書いて下さいました。
こちらのページです。

画面フォントの修正

まず、このプログラムの oled.cpp 内変数の frame[] 用の画面エディタを作って「正しくキレイな」画面に修正して頂きました。

こちらがオリジナルの1行目の文字です。一部の文字の上下が反転した様な字体で見づらい所があります。

こちらがラジオペンチさんが修正した後の文字です。「3、8、B、E」のフォントが正しい見た目になっています。
0.96 インチの小さな画面でも分かりやすくなりました。

I2C アドレスの変換

次にアドレス変換の方法です。
ラジオペンチさんからブログのコメント欄で
main.cpp の72行目
a = (((nx – 17) / 7) << 3) + y;
を修正するようにアドバイスを受けました。

その後、OLEDオシロスコープでもお世話になった「siliconvalley4066」さんから、Linux の「i2cdetect」コマンド互換への修正方法を教わりました。

具体的には main.cpp の72行目を
 a = ((nx – 17) / 7) + (y << 4);
として、
 adr[a – 1]
となっている5か所を
 adr[a – 16]
とします。

オリジナルの「I2C スキャナ」のアドレス表示は、上の行が2桁目で左の列が1桁目を表していました。
この修正をすると、「i2cdetect」と同じく左列が2桁目、上の行が1桁目になります。

こちらの修正を有効にするには、画面の左列の表示「02468ACE」を「01234567」に修正する必要がありましたが、ラジオペンチさんが画面エディタで oled.cpp の該当箇所を、すぐに直してくれました。

下の写真は、少し見づらかったので上蓋を外しましたが、修正後の「I2C スキャナ」で RTC(HW-84)を見たところです。
この RTC は内部に2つのアドレスを持つ部品が入っています。
EEPROM が 0x57、DS3231(RTC用 IC)が 0x68 ですが、正常に検出が出来ています。

OLED 表示ずれの正規対応

旧型の OLED ではないと画面が上に 8 ドットズレる対応を「oled.cpp」の一部を書き換えるという応急処置で済ませていましたが、しっかりと修正を行います。

この改修方法は「siliconvalley4066」さんが、このプログラムを Arduino で動くように改修して下さった際の副産物として教えて頂きました。
(「siliconvalley4066」さんの Arduino NanoでI2Cスキャナはこちらのリンクをご覧ください。)

具体的には
main.cpp の oled_xy() 部分をコメントアウトして、
oled.cpp の init_oled() と oled_cls() の oled_com(0xB0) と記載された行をコメントアウトします。

これは、oled_xy() 部分が、書き込むページを限定するコマンドですが、このプログラムは一度に全体の書き込みしかしないので表示不具合の原因になっているようです。

その他のバグの修正

私は全く気付いていなかったのですが、協力して頂いたお二人はこのプログラムの隠れたバグに気づいていました。
隣り合った I2C アドレスの部品を接続すると、塗りつぶしの表示が不良になるバグです。

これは、
87行目から始まる
fill = 0b10000000;
など2組並んでいる「fill = 」の4か所を
fill |=
のビットORで代入に直すと解消されます。

ちなみに・・・

ちなみに、正常に表示しないとは思いましたが 0.96 インチの OLED SSD1306 と同じ端子配列に改造した 1.3 インチの OLED をつないでみます。

やっぱりダメですね。
Arduino なら OLED のライブラリを差し替えれば OK ですが、今回のプログラムでは部品を交換する時は自分で OLED の処置をしなければなりません。
どちらにしても、このケースでは大きすぎる 1.3 インチの OLED は入らないので問題ありません。(強がりではありません。)

修正したファームウエア

ご自宅のパソコンで、その後に使う予定もない「Microchip Studio」をインストールして、プログラム修正してビルドして ATtiny に書き込むのは大変ですね。
そこで、「Microchip Studio」で改良版のファームウエアをビルドした hex ファイルを置いておきます。

これをダウンロードして「avrdude」を使えば ATtiny にファームウエアを書き込みが出来ます。
このファイルのオリジナルは Nickelgrass さんが設計された「Micro I2C-Scanner with 0.96″ Oled and ATtiny44」です。
このファイルはオリジナルのライセンスに従って、ファイル単体での再配布を禁止します。また、営利目的での使用を禁止します。
なお、ビルドしたファイル単体での公開に、ライセンス的な問題があるようでしたら削除します。

基板のお裾分け

Nickelgrass さんが設計して「ラジオペンチ」さんと「siliconvalley4066」さんに改良のお手伝いをして頂いた「I2C スキャナ」が完成しました。

検出端子に I2C 部品をつなぐだけで I2C のアドレスを教えてくれる便利なガジェットですが、簡単な回路なのでユニバーサル基板で作ってみようと思った方も多いかもしれません。
(「siliconvalley4066」さんが Arduino でも動くようにされたので、そちらの方が動かすのは簡単ですが。)しかし、私と同じく「I2C スキャナ」基板で作ってみたい方も(沢山いる日本人の中には)いらっしゃるかもしれません。

一応、今回のオーダーでは20枚の基板を注文しました。
その内、1枚はこの記事を書くために製作してみました。1枚は試験用、もう1枚を予備に取っておくとして「17枚」の基板が余っています。

こんな記事を見ている人は少ないでしょうし、さらに、同じような製作をしたい人は少ないと思いますが、もし、そんな奇特な方がいらっしゃったら、コメント欄に記入して頂ければ基板をお送りします。(「郵送代」のみご負担ください。)

実際に組み立てるためには、以下の準備が必要です。
・「必要な部品」の項目に書かれている部品
・「USBasp」などの AVR 書き込み機
・「Microchip Studio」や「avrdude」などのプログラム

「お裾分け」の制限事項

「お裾分け」には、以下の制限をさせて頂きます。

・「ラジオペンチ」さん、「siliconvalley4066」さんに質問しないでください。
・素人が設計した基板です。本職の方が見ると拙い部分が沢山あると思いますが、現時点ではこれが完成品です。(すでに規格書の I2C を外出しにする際の配線の順番からは外れていますが正常動作しています。)
・自宅のベランダで手作業で裁断しています。お送りする前にヤスリ掛けはしますが、受け取った後にケガに注意してください。
・お1人様 1枚まで。
・サポート、返品は応じられません。
・普通郵便で簡易包装で送るので保証はありません。普通郵便なので日本国内限定です。
・なくなり次第(応募などないと思いますが。)終了します。
・普通郵便の切手代の110円をご負担ください。110円切手を送付していただき、到着次第、その住所へ基板をお送りします。

上記の条件でも構わないという方は、コメント欄に入力ください。(連絡が付くメールアドレスを忘れずに記載してください。)
記入して頂いたコメントは公開せずに、直接メールで必要事項を連絡させて頂きます。

ー参考資料ー
定形郵便物(長さ:23.5 cm、幅:12 cm、厚さ:1 cm以内)
重量:25g以内、料金:110円
(重量:50g以内、料金:110円)

基板1枚:5 g、封筒・切手・簡易梱包材など 15 g 、合計で 20 g

評価

昔なら考えられませんが、ネットの力で強力な助っ人を得て「I2C スキャナ」を思ったとおりの形で完成することが出来ました。
もちろん、本当なら自分が思った形の物を作るのは自己責任で、自分の力でやり遂げるべきでしょうが、今回は大変幸運だったと思います。

ご協力いただいた「ラジオペンチ」さん「siliconvalley4066」さん、ありがとうございます。

もちろん、今回の満足度は100点です!
(ちなみに、今回製作した「I2C スキャナ」のサイズ感が分かりづらいので、以前組み立てたフリスクサイズの「回路内導通チェッカ」(「ChaN」さん設計)と並べてみました。良いサイズ感だと思います。)

フリスクサイズで導通だけではなく回路内の抵抗値も音で教えてくれる、大変便利な「ChaN」さん作の「回路内導通チェッカ」の製作記はこちらです。

コメント