タイトルの通り、LCD[16×2](AQM1602XA-RN-GBW)をRaspberryPiから使うのにむっちゃ苦労したので、使えるまでの努力をメモしておきます。
自分でもあまり理解しきれていない部分があるので、間違っている事を書いているかもしれません。あまり過信しすぎないでください…w
※途中でRaspberryPiをハンダを使って改造?したりします。それも含めて自己責任でお願いします。
構成
- Raspberry Pi 1 Model B (Raspberry Pi | Wikipedia)
- RCA端子(黄色の端子)があって、USBは計2つ接続できるモデルです。
- Mem : 512MB
- まぁ、記事を執筆している現在(2015/10/4)だと、ちょっと古いモデルになります。
- LCD [AQM1602XA-RN-GBW] -ピッチ変換基板付き-
- i2c通信でデータを送れるタイプ これだと、ピンの数を4本で制御する事ができます。
- 16×2のモデルでi2cができるモデルが良かったので、とりあえずこれを選びました。
(2016/7/3: 追記)
つくばのおやじ さんのコメントより、RaspberryPi 2, 3 でも同じような現象になるそうです。
この際に取り外す抵抗の番号がR1,R2からR23,R24に変更されていますが、回路図では同じ場所の抵抗になるそうです。
環境構築
LCDとピッチ変換基板のハンダ
とりあえず、あるとこ全部(裏面のハンダジャンパーパッドも)ハンダ付けしました。(実は2回ミスってハンダを付けたり外したりしました。)
モジュールの読み込み
こちらの記事に書いてある通りにやります。具体的には
/etc/modules の一番したに下記2行を追加
i2c-bcm2708 i2c-dev
サイトには、blacklistから削除するとうい記述がありましたが、自分の場合はそのようなファイルはありませんでした。
再起動後にi2c-toolsをインストール
sudo apt-get install i2c-tools
その後、Raspberry PiとLCDを接続します。
RaspberryPiのピン配置を確認し、lcdと接続します。
ピン配置はこちらの記事を参考にしました。バージョンによって配置が違うらしいので気をつけてください。(サンプルコンポーネントの実行 | OpenRTM-aist)
このLCDは3.1V〜5.5Vまで対応しているそうなので、RasPiの5V端子に接続しました。
ここで、元サイトにはI2Cバス番号とデバイスアドレスの取得でsudo i2cdetect 0を実行と書いてありますが…失敗しました。。。もちろん、i2cdetect0 でも同じ。
$ sudo i2cdetect 1 Error: Could not open file `/dev/i2c-1' or `/dev/i2c/1': No such file or directory
俺たちの長い戦いはこれから…
まずこれの原因ですが、どうやらデバイスを認識していないようです。デバイスを認識するために、いろいろやりましたが…結局効果があったのはこの記事([raspberry] “Error: Could not open file `/dev/i2c-1’ or …” | Gerolian)です。
root権限で/boot/config.txtを開いて以下の記述を追記します。
device_tree=bcm2708-rpi-b.dtb device_tree_param=i2c1=on device_tree_param=spi=on
その後、再起動。。。
今度こそ、実行をしてみると…
$ sudo i2cdetect -y 1 . 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3e -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
おぉ、良さげな結果になりました。ちなみに、ここに表示されている3eというのがlcdを示しているみたいです。(この状態では特にlcdには何も表示されていません)
それでは、次に何かを書き込んでみようと思います。
$ sudo i2cset -y 1 0x3e 0x00 0x38 0x39 0x14 0x73 0x56 0x6c i Write Error
…ダメだ。。。なんどやってもうまくいかない…。
プルアップ抵抗との戦い
参考にした記事
(Raspberry Pi のI2Cに秋月のAQM1602XA液晶をつけてみる | きざみのり55の独り言)
調べたところによると、RaspberryPiのSCLとSDA端子は内部で1.8kΩの抵抗を用いてプルアップしてあるそうです。
そして、こちらの記事(i2cのプルアップ抵抗値はどれくらいがよいのか | r271-635)によると、lcdのプルアップ抵抗は10kΩぐらいがいいんじゃないかという結論。(自分は全然理解してない…。)
裏面のハンダジャンパーパッドを接続した状態だと、そこで10kΩの抵抗と内部の1.8kΩの抵抗が並列に接続されたことになり、結果として1.525kΩの抵抗となります。この接続だと、いくら抵抗を増やしても抵抗値が小さくなるだけ…。
そこで、参考記事にもあるように、RaspberryPi上の抵抗を外します。
まずは、RaspberryPiの公式サイトより、自分のRaspberry Pi 1 Model Bの回路図を調べます。
どうやら、MODEF A AND BのRevesion 2.0みたいなので、それを見ました。
すると、2ページ目の中央あたりに、それっぽい記述を見つけました。
このSDA1とSCL1にtながっているR1とR2がプルアップ抵抗のようです。基板上にもR1,R2と書かれたそれっぽい抵抗がありました。
実際に基板上の抵抗を測ってみみたら、1.8kΩだったので正解っぽいです。
なかなか大変な作業でした。無事にほかの部品にダメージを与えずに取外せました。。。
そして、先ほどと同じように接続してデータを書き込んでみると…。
$ sudo i2cset -y 1 0x3e 0x00 0x38 0x39 0x14 0x73 0x56 0x6c i
おぉ!無事に何かでてきました!
すべてのマスが黒色で塗りつぶされているのはコントラストの設定がよくないからです。
このコントラストの設定は最後から2つめの0x56を0x52とかにするといい感じに初期化できます。
※2016/09/05追記
なんだか、上記のsudo i2cset -y 1 0x3e …. のコマンドでは何も表示されなくなっていました。接続は無事にできていました。謎。。。
今回の記事はここまで。ここまでできれば、その他サイトのi2cを用いたlcdの制御を参考にごにょごにょいろいろできると思います。
まとめ
RasPiでi2cをでLCDと思って安易にこれ→“LCD[16×2](AQM1602XA-RN-GBW)”を買ったのはマズかった…。でも、いい経験ができたと思ってます。
今後、RasPiでLCDを使う方は事前にちょっと調べることをお勧めします。以上。お疲れさまでした〜
Raspberry pi 2, 3 Bでも同じでした。
小生も、秋月のI2C通信LCDをテストしたところ、同じ現象が生じたのですが、何故だか、LCDを二枚並列にすると動作していました(多分、電流が増えて、プルアップ効果が下がったものと思われます)。
秋月電子のHPでは、I2C接続小型LCDモジュール(8x2行)ピッチ変換キット[AE-AQM0802] の所には、次のような説明が付いているのを見つけました。
「◎I2Cバスのプルアップ抵抗は10kΩを推奨いたします。 Raspberry Piで使用する際は、I2Cバス(SDA)のプルアップ抵抗(R24,1.8kΩ)を取り外し、外部で10kΩにプルアップすることが必要です。R24はGPIO-3番ピンの近くに実装されています。」
私も、今、初めて気づきました。
RaspPiの2,3は、抵抗の番号がR23, 24ですが、回路図上の場所は同じです。
ありがとうございました。
お力になれたようでなによりです。
Raspberry Pi 2,3でも同じような状況になるとのことをブログ本文の方にも追記させていただきます。
ご報告ありがとうございます。
Pingback: [ラズパイ] 電圧・電流をラズパイで計測する(INA226・INA260)[接続編] – ANDROIPHONE