周波数カウンタを作る 14(I2C LCD に交換)

周波数カウンタを作る企画の 14回目です。
今回は、周波数を表示する液晶ディスプレイ(LCD)を I2C 変換アダプタのいらないタイプに交換します。

おじさん工房さんが開発された、高性能な超小型周波数カウンタ RFC-5 のソフトウエアには、色々なディスプレイが使えるように「board」の「lcd」内に設定ファイルが格納されているのですが、私の能力では他のタイプの LCD が使えるように改造することは無理でした。

ところが、おじさん工房さんの掲示板で「やどさん」が、他の LCD で動作させることに成功されました。
今回の記事は、おじさん工房さんの掲示板に書き込まれた、RFC-5 の LCDを交換する手順を要約して写真を付けて解説したものになります。

1 siliconvalley4066 さんの「STM32F103C8T6で192MHz周波数カウンタ」を見て、この企画がスタート。TTL レベルで 66 MHzまで計測
2 市販品のアンプ(20 dBm 程度)をつないで 53 Mhz まで
3 手持ちの部品でブレッドボード上に作ったアンプで 24 MHz まで
4 自作基板でプリスケーラの機能確認(1/256、1/512)
5 おじさん工房さんの RFC-5 を組み立てる。測定周波数は ~ 1.3 GHz(プリスケーラあり)
6 RFC-5 のアンプ(120 MHz まで計測可能)と他の MCU(20 Pin)で動作確認
7 カウンタの入力を切り替える実験(40 MHz 程度までは切り替え可能)
8 RFC-5 をプリント基板化する前のアンプ類の接続方法の検討
9 RFC-5 のプリント基板の製造とオーダー
10 RFC-5 のプリント基板の動作確認が終了(測定上限周波数 190 MHz)、基板の無料配布を開始
11 RFC-5 プリント基板の組み立て方
12 RFC-5 プリント基板アンプ回路の評価
13 プリスケーラ基板の詳細な組み立て方法

周波数カウンタを作る企画の区切りとして、RFC-5 周波数カウンタ基板の「無料配布」を始めました。
カウンタ基板の在庫と配布の詳細は10回目の記事をご覧ください。

LCD の種類

すでに2回に分けて、この周波数カウンタ用の LCD の改造について解説していますが、使用している LCD は I2C アダプタを使用した16文字×2行のキャラクタ表示タイプの物です。

I2C 変換アダプタ

最初に、オリジナルの RFC-5 で使用している LCD です。
RFC-5 で使用できる表示装置は、変換基板のインターフェース IC に「PCF8574」が使われたものです。
I2C アドレスは「0x4E」(Arduino IDE では「0x27」)です。

外観はこんな感じで、右側の4本が入力端子です。
上に並ぶ端子は直接、海外でよく利用されているパラレルタイプの LCD に接続できる配置になっています。

使用したい LCD

内部に余裕のあるケースに組み込む時には問題ありませんが、小型ガジェット愛好家としては完成品は少しでも小さく仕上げたいと考えています。
ところが、I2C 変換アダプタと LCD をつなぐと、どうしてもかさばってしまいます。
さらに、使用しているパラレル・タイプの LCD は大きめの物しか販売されていません。

そこで、I2C 端子に直接接続できる「ST7032」をドライバ IC に使用した LCD を表示器に使いたいところです。(ST7032 と使用した LCD の例:秋月電子 AQM1602Y)
I2C アドレスは「0x3E」です。

上で紹介した I2C アダプタと LCD を組み合わせたものと、この LCD の大きさ比較です。
実際にケースに組み込む時には折りたたんで収納するので、左右の幅はこれよりは小さくなりますが、高さがかさばってくることが予想できます。

ST7032 LCD を使用するには

ドライバ IC が「PCF8574」と「ST7032」で全然違いますが、最終的に制御しているのは16文字×2行で業界標準の「SC1602」と同等の回路に文字を表示することです。

そこで、両者の違う部分を RFC-5 ファームウエアの「lcd」部分で書き換えることが出来れば、RFC-5 に I2C LCD が直刺し出来ることになります。

ST7032 との違いは
・アドレスが 0x7C(Arduino IDE では「0x3E」)
・ドライバ IC の違いによるタイミングやデータの送り方

という事ですが、プログラムのどこを直せばよいのか・・・

おじさん工房さんが、RFC-5 のプログラムを分かりやすく、デバイス設定ファイルに分けて作られているのですが、実際に LCD に表示するとなると何を変えればよいのか理解できていません。
(さすがにアドレスを指定している部分は分かりましたが、それ以上は・・・)

プログラム変更

すると、おじさん工房さんの掲示板で「やどさん」が、ST7032 を RFC-5 につないで正常に正常動作させることが出来たと書き込みがありました。

ここまで来るには、数日間かけて何度もの試行錯誤があったようです。
その際に役立ったのがロジックアナライザだったそうです。

ロジックアナライザのハードウエアは、Amazon などで2千円以下で入手できる安価な「Logic Analyzer」(正式名称不明)を、ソフトウエアはオープンソースの「PulseView」を利用して、ST7032 のデータシートで要求している波形が出力されるように改造したそうです。(大変お疲れ様です。)

やどさんがロジックアナライザで、ST7032 を接続試験中の様子を引用させて頂きました。

実際の変更箇所です。
「i2c_250khz.c」の修正

const int i2c_addrs = 0x7C; // ST7032 3E: 01111100 ST7032追加
//const int i2c_addrs = 0x4E; // PCF8574 A2..0=111 コメントアウト

「lcdc16xn_i2c.c」の修正
(該当する3つの同じ項目は、コメントアウトするか削除してください。

#define I2C_LCD_RS 0x01 // P0
#define I2C_LCD_RW 0x02 // P1
#define I2C_LCD_E 0x04 // P2
#define I2C_LCD_BL 0x08 // P3

#define I2C_LCD_RS0 0x01 // C0,RS=00 for st7032 追加
#define I2C_LCD_RS1 0x40 // C0,RS=01 for st7032 追加

//───────────────────────────────────
// データ1バイトをLCDに送る for st7032
//───────────────────────────────────
static void lcdc_write8( int data ) {

char txstr[3];
txstr[0] = I2C_LCD_RS1; // C0,RS=01
txstr[1] = (data);
txstr[2] = 0;
i2c_tx_str( txstr );
}

//───────────────────────────────────
// コマンド1バイトをLCDに送る for st7032
//───────────────────────────────────
static void lcdc_cmdwrite8( int data ) {

char txstr[3];
txstr[0] = I2C_LCD_RS0; // C0,RS=00
txstr[1] = (data);
txstr[2] = 0;
i2c_tx_str( txstr );
}

//───────────────────────────────────
// LCD初期化 for st7032
//───────────────────────────────────
void lcdc_init( void ) {
i2c_init();

delay_msec( 20 ); // 電源投入後 15ms 以上待つ
// LCDC_RS_L(); // LCD RS = 0 コマンド

lcdc_cmdwrite8( 0x38 );
delay_msec( 20 );
lcdc_cmdwrite8( 0x38 ); // 8ビット、2行表示
delay_msec( 20 ); // 4.1ms 以上待つ
lcdc_cmdwrite8( 0x39 ); // IS=1
delay_msec( 20 );
lcdc_cmdwrite8( 0x14 ); // Internal OSC
delay_msec( 20 );
lcdc_cmdwrite8( 0x71 ); // 3.3V=0x71, 5V=0x7A(コントラスト)
delay_msec( 20 );
lcdc_cmdwrite8( 0x56 ); // 3.3V=0x56, 5V=0x54 Bon
delay_msec( 20 );
lcdc_cmdwrite8( 0x6C ); // Follower-Cont.
delay_msec( 20 );
lcdc_cmdwrite8( 0x38 ); // 8ビット、2行表示 IS=0
delay_usec( 100 );
lcdc_cmdwrite8( 0x01 ); // 表示クリア
delay_msec( 20 );
lcdc_cmdwrite8( 0x0C ); // 表示 ON
delay_usec( 100 );

// lcdc_write8( LCDC_NOCURSOR ); // カソールなし
lcdc_cls(); // ディスプレークリア
}

変更したファイルとバイナリ

コンパイルする環境を作るには色々と準備が必要なので、同じ手間を掛けなくても良いように、LCD を変更してコンパイルしたバイナリ・ファイルを置いておきます。

おじさん工房さんが製作された「高性能周波数カウンタ RFC-5」の製作データは以下のリンクをご覧ください。
(オリジナルの作者「おじさん工房」さんと改造した「やどさん」には許可を取っています。)

改造したバイナリ

コンパイルした改造版のバイナリファイルを以下に置いておきます。
(オリジナルの RFC-5 には2種類ありますが、このバイナリは信号発生器機能なしバージョンです。)

バイナリファイルは、ST-LINK/V2 を使ってそのまま MCU に書き込みが出来ます。
書き込み方の詳細は、以下のリンクをご覧ください。

改造したプログラム・ファイル

やどさんが RFC-5 に ST7032 を接続できるように改造した「i2c_250khz.c」と「lcdc16xn_i2c.c」を圧縮したファイルのダウンロードは以下をクリックして下さい。

改造したファイルでコンパイルするには開発環境の構築が必要です。
ただし、ファイルを上書きしてしまうと、後で変更箇所が分からなくなってしまうので、フォルダを分けた方が良いと思います。

環境の作り方やコンパイルの細かな手順は、以下のリンクをご覧ください。

I2C 波形の確認

そう言えばネットで色々と見ている時に、「今回紹介している I2C 変換アダプタを 3 V で使用すると I2C の信号線の振幅が I2C の規定値以上の電圧になるので、ボード上のプルアップ抵抗を除去しなければならない。」と言う情報を(英語で)見た覚えがありました。(どこで見たかは、色々と探したのですが見つかりません・・・)

少し心配なので、オシロスコープで見てみました。
I2C アダプタの SDA、SCL(5 V 用を 3.3 V で使用)
約 3.7 Vp-p

ST7032 の SDA、SCL(3.3 V に正式対応)
約 3.6 Vp-p

このぐらいの差なら、アマチュアが電子工作で使用するなら問題なさそうですね。
もし、この電圧差(約0.1 V)でどこかに不具合が発生するという情報をお持ちの方がいたら、教えてください。

実際の表示サイズ

手持ちのいくつかの ST7032 を使った I2C LCD を RFC-5 基板につないでみました。
秋月電子の AQM1602Y です。
組み込むには大きさ的にも、表示フォントも良い感じです。(バックライトはありません。)

次に、外観は若干小さい aitendo の ATD1602CP です。
専用のバックライトを取り付けることが出来るので、暗いところでも使用することが出来ます。
文字は黒くて良い感じなのですが、周波数カウンタで使うにはフォントが小さい感じがします。(この画面では1行目の周波数の表示が出ていませんが、実際に周波数が表示されると文字が小さく感じました。)

他にも何種類か(8文字タイプなど)の ST7032 をドライバ IC に使った I2C LCD も、差し替えるだけで表示させることが出来ました。

今後は、ハンディな周波数カウンタとして仕上げるために、小型の ST7032 を使った LCD で行こうと思います。

他の LCD の接続

おじさん工房さんの掲示板では、笛吹おじさんが「ACM1602NI-FLW-FBW-M01」という I2C LCD を利用した改造方法を公開されています。

この LCD は秋月電子で販売している16文字×2行のキャラクタ式 I2C インターフェースの表示器です。
ドライバ IC には「ST7066」が使われていて、インタフェース変換のために PIC が使われているので、インターフェースを他の LCD 互換品への改造も可能なようです。
(この LCD の現物を持っていないので、画像は秋月電子からの引用です。)

こちらは、笛吹おじさんがこの LCD を検証されている時のロジックアナライザの波形を引用しました。

この LCD を RFC-5 に使いたい方のために、笛吹おじさんから変更ファイルとコンパイルしたバイナリをお送りいただきました。
下のリンクからダウンロードしてください。

圧縮ファイル内の「main.hex」を MCU に書き込めば、そのまま「ACM1602NI-FLW-FBW-M01」が使用できます。
(こちらもオリジナルは、おじさん工房さんの RFC-5 です。オリジナルの RFC-5 には2種類ありますが、このバイナリは信号発生器機能なしバージョンです。)

今後の予定

1 ケースの作成
ペン型オシロスコープのケースが出来ましたが、あんな感じで 3D プリンタを使い携帯型の周波数カウンタに仕上げたいです。
最大の問題は電池の収納方法ですね。

2 プリアンプ
おじさん工房さんが設計された「20 dB 低雑音アンプ」は、500 MHz 位までは 20 dB の増幅率を誇る高性能のはずですが、私の拙い基板製作技術では 90 MHz 程度までしか機能していません。(1/5 以下!)
ここを改善できれば、uPB1507 を使用したプリスケーラで切れ間なく 3 GHz 以上まで計測出来るようになります。
これは何とかしたいなぁ。

3 ロジックアナライザ
今回のプログラムの修正は、やどさんが行われた内容をそのまま記載しました。
その改造には、ロジックアナライザで信号を解析することが必須だったようです。
今後の電子工作に必要そうなので、時間を見てロジックアナライザを入手したいです。

4 RFC-7
なんと、小型でさらに高性能な周波数カウンタが、2025年1月におじさん工房で公開されました。
型番は RFC-7 です。

このカウンタの主な性能は、
・主な操作方法は RFC-5 と同等のスイッチ2個
・TDC ( Time-to-Digital Converter ) を使った高分解能
・高性能な RFC-5 に比べて、さらに2 桁ほど分解能が上昇
・外部基準信号(10 MHz)入力回路、プリスケーラー入力切替、USB でのデータ収集機能などの追加
・新機能として「周波数の標準偏差計算」と「ジッター測定」の追加

RFC-5 と比較すると部品点数は増えますが、これだけの「超」高性能な周波数カウンタが自作出来て手のひらサイズに収まりそうです!
これは作らずにはいられません!!
(色々とやりたいこともあるので、少し先の目標になりそうですが・・・)

コメント