[][mobile][Homepage][BBS][Blog][YouTube][asablo]

秋月I2C接続キャラクタLCDモジュールをシリアル入力タイプに改造2012/04/18 23:59:29



ACM1602N1というI2Cで接続できる16桁2行LCDが秋月電子通商より発売された。I2Cは少ないピン数で接続が出来るメリットがある。まずは動作させてみるか (・∀・)



以前arduinoで動作させたI2Cのサンプルを使って、アドレスを0x3e→0x50にすると動作した。
なんだ、あっさり動いてしまった。折角だから色々調査。

※完全にコンパチではなく、いくつかの修正が必要である。arduinoのスケッチ(ライブラリー)は、じゅんさんのページで提供されている


基板を観察すると、I2CコントローラとしてPIC16F689のSSOPタイプ(pdf)が搭載されている。また端子にはTX、MCLR、DAT、CLK、RXといった端子が存在していた。普通にICSPが出来る端子になっている。ということで、PICkit2を使い内容を吸い出そうと試みるも、当然の様にコードプロテクトが掛かっている。うーむ。買ったばかりだし、チップを交換するか。



まずは外しても分かるようにデバイスに印を付けておいて、マスキング処理をし、はんだ吸い取り線を巻き、ハンダを大量に流して外す。



ポロッと取れる。このPICは取っておこう。



秋月にプログラム容量が半分の16F687のSSOPがあったので、これに載せ替える。



どちらも20ピンなので、



そのまま載せ替えが可能。



正常に繋がったか確認。



認識しているのでOK。早速解析していこう。


I2C接続キャラクタLCDモジュール解析

このデバイスはPORTCのみ8ビット丸々使える。そしてこのLCDは8ビット専用との事なので、LCDのデーター線はPORTCと予想。TXとRX、MCLR、DAT、CLKは独立している。残る部分はRS、EN、WR信号。RA2、RA4、RA5と予想してみた。2時間ほどでプログラムを書き上げる

お決まりのデジタルポート設定処理忘れとか、方向レジスター処理、4ビットモード時と8ビットモードの初期化違いでちょっと手間取ったが、ポートは予想通りの配列だった。



回路図はこんな感じ。
ACM1602N1搭載のPIC16F689ピン配列
1:VDD
2:RA5:O:LCD_RW
3:RA4:O:LCD_E
4:RA3:I:(MCLR) モードスイッチに使用。基板内部で10KΩプルアップされている
5:RC5:O:LCD_D5
6:RC4:O:LCD_D4
7:RC3:O:LCD_D3
8:RC6:O:LCD_D6
9:RC7:O:LCD_D7
10:RB7:O:(TX)
20:VSS

19:RA0:O:(ICSPD)
18:RA1:O:(ICSPC)
17:RA2:O:LCD_RS
16:RC0:O:LCD_D0
15:RC1:O:LCD_D1
14:RC2:O:LCD_D2
13:RB4:O:(SDA) 右スイッチに使用
12:RB5:O:(RX)
11:RB6:O:(SCL) 左スイッチに使用


ここまで分かればOK。元々載っていたPICのプログラムも、この解析で新たに組み直せば良さそうな気がしてきた。時間が取れたらオリジナルのI2Cファームでも書いておくかな。そうしておけば、気楽に上書き出来るだろう。→出来ました!

あと、裏側に8ピンのICがあるが、恐らく負電圧をLCDに与える電源と思われる。(PDF


さて、今度は実用的にまとめてみよう。



完成! スイッチはLCDのグラウンドスルホールを利用して両面テープで固定。たった3本の電線で便利に使える。

I2Cになっても、LCDのセットアップや、書き込み手順は従来キャラクターLCDと同じ手順で表示させるのには変わりない。シリアル通信であれば、アスキーコードで送れば表示される。CG RAMを使わなければ、シリアル通信接続の方が色々有利である。

電源投入時はカーソル点滅。文字が0x20~0xffのコードであれば表示。
その他に、
ascii code 12 (ctrl +l) LCD消去
ascii code 0x0b (ctrl +k)カーソル以降の行を消して切替
ascii code 0x0d (Enter) 行の切替のみ
ascii code 0x11 (ctrl +q)カーソルを消す
ascii code 0x17 (ctrl +w) カーソル表示

と対応させているので、簡易表示機として利用が出来る。


※古い写真を使用しています。

裏面。コントラスト調整は面実装の20KΩ抵抗を使用してコンパクトに。




TXが空いているのだが、USARTモードにするとRXとTXはペアで使用されるので、デジタルポートとして使用できない。仕方ないので、内部でプルアップしていたMCLRをスイッチ入力に。PICkit2等でプログラム中はボタンを操作しないようにご注意を。



モードスイッチを押しながら左ボタンでバージョンなど表示。



ボーレート変更もワンタッチ。これが一台あると色々と便利。ボーレートは変更可能。

こんなにコンパクトに作らなくとも、コントラスト用の半固定抵抗器と設定用スイッチ3つを取り付ければ手軽にシリアル通信をモニター出来る。

ソースプログラムと実行ファイル公開中。PICkit2でHEXファイルを書き込めばOKであるが、一度書き込んだら、製品版のファームウェアに戻せないのでご注意を。


  →秋月I2C LCD互換ファームウェア(I2Cアドレスも変更可能)



コメント

_ ラジオペンチ ― 2012/04/19 21:58:41

今晩は。面白い物があるんですね。
ここ拝見してると自動的に新しい情報が入手できるので感謝してます。

仕様を見て判らなかったのは、一行に16文字以上入力された場合の挙動です。自動的に次行にスクロールされる、あるいは無視される?
普通のSD1602とかの仕様だと無視でしたっけ。

PICは全然素人なのですが、そのへん知りたくてソースを追ってみたのですが、
lcd_putch(byte);
の先がどうやっているのかで決まるのでしょうが、修行不足でこの先を見失いました。

それにしても、ファイルのタイムスタンプがすごかった。

_ air_variable ― 2012/04/20 16:44:16

ラジオペンチさん、いつもどうもです。

LCDの文字数はlcd.cのlcd_putch(unsigned char c)内で一括でおこなっています。
一文字表示させるごとにlcd_loccntというグローバル変数を足していて、これが行末になったら表示ラインを切り替えています。
変数はlcd.hで定義していて、LCDの種別はmain.hでやっています。
建て増しプログラムで可読性が悪くて失礼します。

一行目は0x10(16)になった時、0x40に切り替え、
2行目は0x40+0x10=0x50(80)になったら0に戻しています。
ですので、表示漏れがありません。

タイムスタンプは、いつの間にか夜中になっていたという感じでしたw

_ じゅん ― 2012/04/24 04:10:23

PICはがしてレガシーシリアルに変えちゃうってすごすぎです。びっくらw

わたしも昨日秋月から買ってきて、インターネットラジオにつないでみました。

すこしだけコマンドが違うようです。スレーブアドレスを変えるだけでは最初の一行が表示されるだけでした。

最初のファンクションセットのところは1行書くだけで済みました。その分PICがお仕事しているんでしょうね。あと、ストリベリーリナックスのはコマンドバイトかデータバイトかの区分けにさらにあとにデータが続くかどうかでコマンドが4種類にわかれていますが、秋月のは単純にデータかコマンドかの2種類で大丈夫でした。

製品に添付されている資料が非常にわかりづらく、解決するのに3時間も掛かってしまった (^^;;;

_ air_variable ― 2012/04/24 20:49:25

I2C LCDのPICの機能と同等なプログラムができたら、PICを剥がさなくても必要に応じて書き換えられるので、それを試している所です。

ストリナと実は若干違いがあるみたいで、全くのコンパチでは無い様でした。

I2C式のは他に共立のこれも安くて良いと思いました。
http://eleshop.jp/shop/g/gB3A41L/

_ pc9801vm ― 2012/05/18 22:43:50

はじめまして、いつも楽しく読ませてもらっています。
ソース頂いて早速色々と活用しています。

少し質問なのですが、
lcd_data_set()関数にLCD_STROBEが2発入っているのは
何か理由があるのでしょうか?

これを1つにしないとストロベリーリナックスのOLED液晶で
うまく動かなかったので・・・

単に興味本位ですが、よろしくお願いします。

_ air_variable ― 2012/05/19 10:36:46

pc9801vmさん
>lcd_data_set()関数にLCD_STROBEが2発入っているのは
あ、本当ですね。4ビットのソースを8ビットに改造した時、消し忘れしていました。ここは1つです。
ご指摘ありがとうございます。

_ air_variable ― 2012/05/20 14:28:08

ローコストLCDシリアル通信モニター(I2Cインターフェースタイプ改造版)を修正しました。lcd_data_set()上のLCD_STROBEの重複を修正しています。機能は変わりません。

http://www.ne.jp/asahi/air/variable/picmel/applications/lcd_serial/16F689/index.html

_ ken2 ― 2012/10/29 22:58:39

初めまして。
ACM1602検索していて、こちらにたどり着きました。
手持ち部品で、作成し動作する所までいきました。
素晴らしいです I2cでデバッグ用に使おうと思っていましたが
こちらの方が、自身のニーズに合ってます。
これでデバッグが楽になるかも?(自分の頭が付いて行かない)
有難うございました。

_ air_variable ― 2012/10/30 14:41:28

ken2さん、ご活用いただいて光栄です。
実は作りかけで、このハードウェアで、スイッチによるモード切替で、
シリアル通信の他、秋月I2C、ストロベリーリナックスI2Cと
3つのモードが切り替えられるファームを書いている最中です。
若干スイッチの配線が変更になる可能性があります。
また、いつ出来るかも進捗が進んでいないのですが、出来上がったら公開する予定です。

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
全角で「あ」をタイプしてください。Japanese language only.

コメント:

トラックバック





[][admin][mobile][Homepage][BBS][Blog][YouTube][asablo]