「I2Cスキャナ」を組み立てる

Arduino などの周辺機器を簡単に接続する規格に I2C があります。
I2C については、「Arduino しようぜ!I2CのLCD編」で簡単に解説しましたが、電源を除けば2本の線だけで多数の部品を芋づる式につなげることが出来るので大変便利です。

しかし、並列に多数の機器をつなぐためには、アドレスの設定が必要です。
アドレスが同じものは同時には使えませんし、機器のアドレスが分からなければマイコン側で認識できません。

そのアドレスは、部品の販売元のデータシートを見れば分かりますが、毎回ネット環境で調べるのは面倒です。
また、「Arduino しようぜ!ソフトウエア実機編(OLEDをつなぐ)」で解説したように、I2C の OLED のようにアドレスが「0x78」と書いてあっても、計算して「0x3C」にしないと認識しない例などがあります。
(OLED のアドレス計算の内容は、以下のリンク先をご覧ください。)

購入した部品の I2C アドレスを調べるには、Arduino IDE のスケッチ例「Wire」にある「I2CScanner」や、お世話になっている「ラジオペンチ」さんが「I2Cアドレススキャナー (i2cdetectもどき)を作る」を公開されています。
後者は、Raspberry Pi などの「i2cdump」コマンドと同様の情報を表示できます。

どちらも素晴らしいのですが、Arduino にスケッチを書き込み、パソコンに接続してシリアル・モニタで確認するという手間がかかります。

ガジェット好きとしては、I2C の部品をつなぐだけでアドレスが分かる計測器的な「I2Cスキャナ」が欲しくなります。

色々とネットを探したところ、Nickelgrass さんが「elektor MAG」誌のユーザフォーラムで公開している「Micro I2C-Scanner with 0.96″ Oled and ATtiny44」を見つけました。
配線図とソースコードなども公開されていて少しの部品で出来るので、連休を利用して組み立てます。

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」誌とは

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

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

Micro I2C-Scanner

必要な部品

「Micro I2C-Scanner」を組み立てるのに必要な部品は、ごくわずかです。

  • ATtiny84 → 在庫の都合で ATtiny44 を使用
  • OLED SSD1306
  • 4.7kΩ × 5
  • 0.1uF
  • 10uF
  • 4p端子 × 2
  • 6p端子

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

ATtiny44 への書き込み

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

USBasp の接続

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

配線図を描くほどではないので、「fritzing」を利用させてもらいます。

ファームウエアの入手

I2C スキャナを作るのに必要なファイルは、「elektor MAG」ユーザフォーラムの「Micro I2C-Scanner with 0.96″ Oled and ATtiny44」ページにあります。
(ファイルのダウンロードには、無料のユーザ登録が必要です。)

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

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

プログラム書き込みソフト

書き込みに「Microchip Studio」を使うのが本当なのでしょうが、使用頻度が少ないので 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 ディスプレイをつないでみました。

電源を入れてみます。
「あれ?一番下に変な表示が・・・」

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

原因を調べる

公開されているユーザフォーラムをよく見てみます。
「Discussion」の項目へ2か月前に「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 はありません。

Nickelgrass さんが公開されているファイルには「Atmel Studio 7.0」用のファイル一式が含まれるのですが、現状ではプログラムの、どの部分が影響しているのか調べる技術がありません。
(多分、「oled.cpp」の display clock とかだとは思いますが・・・)

簡単に I2C のアドレスをつなぐだけで見ることが出来る「計測器」を作りたかったのですが、これ以上深入りすると大変そうです。(楽しそうとも言いますが・・・)

I2C アドレスの表示は出来るので、しばらくは、この状態で使ってみます。

コメント