フリスクケースでレーザーポインター

だいぶ前に秋月でレーザー発行モジュールを買った。
秋月のサイトを確認したら今はもう売ってないらしい。
買うだけ買ってほったらかしだったので、ありきたりだけどフリスクケースに組み込んでレーザーポインターを作ってみた。


スペーサーや基板の固定、スライドしてケースの開け閉めができないように塩ビ板を接着。
基板の方には滑り止め用のスポンジシールを張り付けてケース内でがたつかないようにしている。
レーザーモジュールはL字のピンヘッダの高さを調整して基板に押さえつけるように固定。
レーザーモジュールにはもともとリード線が半田付けされていたが、根本で折れそうで銅線1本だけでつながっている状態だったので、取り外してスズメッキ線で配線。


ケースに入れた状態。
ストラップをつけられるようにしてある。


実際にレーザーを発光させてみたところ。
昨年12月入ってからいくつか工作しているのだけど、合間の息抜きみたいなもので、本当にありきたりな工作だったな。

カテゴリー: 電子工作 | コメントする

佐川は使うべきではない

最近。佐川急便のニュースがにぎわっている。
交通違反の代理出頭だったり、荷物を蹴ったり叩きつけたり。

そういえば昔、自転車のかごに入れたり、外に設置してある洗濯機に入れてあったとか話題になったこともあったな。

自分は通販で佐川とほかの業者を選べるときは佐川は絶対選ばない。

まず、午前中に配達状況を確認すると配達中になっている。
仕事が終わり家に帰ってみると、荷物が届いていない。
今住んでいるところには宅配ボックスが設置されているので、不在であっても荷物を受け取ることができる。
のもかかわらず届いていない。
遅いなと思っていると、夜9時前になってようやく届く。

もしかすると宅配ボックスの使い方を理解していないので、昼間に不在だったので夜に届けようとしているのかもしれない。

代引きなどでどうしても手取りで受け取る必要がある場合、時間指定や再配達で休日の午前中を指定すると、届くのが11時50分を過ぎてから。
確かに午前中には違いないが、それにしても遅い。

さすがに何度も何度も同じようなことが起こって荷物が届くのがいつも遅いので、問い合わせを入れたことがあったが、それ以降、佐川急便は絶対に選ばないようにしている。

大事な荷物を扱っているという気遣いや法律を守るという気持ちが希薄なのだろう。

通販で佐川しか使えない、先方が佐川で送ったと通知が来たときはもはや期待せずあきらめるしかない。

カテゴリー: ひとりごと | タグ: | コメントする

ヨドバシカメラの洗濯機売り場

ヨドバシカメラの家電売場を見てみる。

この前見たときは、auとdocomo光のスタッフジャンパーの人が洗濯機の案内をしてた。
今日見たときは、auとY!mobileのスタッフジャンパーの人が洗濯機の案内をしてた。

各キャリアの代理店の人間が別の売り場に駆り出されたのか、それとも洗濯機と携帯電話とでも抱き合わせ販売でもしてるのか?

カテゴリー: ひとりごと | コメントする

新旧LCDとError: Write failedについて検証してみた

秋月電子で売られているI2C接続小型キャラクタLCDモジュール 8×2行を利用した製品で、スイッチサイエンスからI2C controlled 8×2LCD Breakout for Raspberry Piが販売されていたのだが、それが販売見合わせとなっている。
そこを見ると、どうやら液晶モジュールの内部仕様変更があったらしい。

前回も触れた内容だが、前回は新型LCDしか使っていなかったので改めて新旧LCDで比較してみた。

左が旧型LCD直結した時で、右が新型LCD直結した時の写真。
旧型LCDの方は/RESETを基板上でプルアップしていないので、ブレッドボード上で10KΩでプルアップしている。
i2crep16i2crep17

旧型LCDは問題なく認識して文字を表示させることができる。

root@rasapp:~# 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: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x38 0x39 0x14 0x70 0x56 0x6c i
root@rasapp:~# i2cset -y 1 0x3e 0 0x38 0x0c 0x01 i
root@rasapp:~# i2cset -y 1 0x3e 0 0x01 i
root@rasapp:~# i2cset -y 1 0x3e 0x40 0x77 0x61 0x69 0x74 0x20 i
root@rasapp:~#

 

新型LCDの方は認識されていない。

root@rasapp:~# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@rasapp:~#

 

さて、新旧の比較を行ったところで、1回目のi2csetコマンドでError: Write failedとなる件について、TI製PCA9515AとNXP製PCA9515A、旧型LCDと新型LCDの組み合わせを確かめてみた。
TI製PCA9515A → 旧型LCD
TI製PCA9515A → 新型LCD
NXP製PCA9515A → 旧型LCD
NXP製PCA9515A → 新型LCD
i2crep08

root@rasapp:~# 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: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x38 0x39 0x14 0x70 0x56 0x6c i
root@rasapp:~# i2cset -y 1 0x3e 0 0x38 0x0c 0x01 i
root@rasapp:~# i2cset -y 1 0x3e 0 0x01 i
root@rasapp:~# i2cset -y 1 0x3e 0x40 0x77 0x61 0x69 0x74 0x20 i
root@rasapp:~#

どの組み合わせでも確かめてもError: Write failedが発生することはなかった。
見た目は全く同じなのでログは一つだけ貼る。

次に、BME280を組み合わせてみる。
本当ならApplePiと同じものを使いたかったけど、すぐに手に入る秋月のBME280使用 温湿度・気圧センサモジュールキットを使うことにした。
TI製PCA9515A → 旧型LCD + BME280
TI製PCA9515A → 新型LCD + BME280
NXP製PCA9515A → 旧型LCD + BME280
NXP製PCA9515A → 新型LCD + BME280
i2crep18i2crep19

root@rasapp:~# 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: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x38 0x39 0x14 0x70 0x56 0x6c i
root@rasapp:~# i2cset -y 1 0x3e 0 0x38 0x0c 0x01 i
root@rasapp:~# i2cset -y 1 0x3e 0 0x01 i
root@rasapp:~# i2cset -y 1 0x3e 0x40 0x77 0x61 0x69 0x74 0x20 i
root@rasapp:~#
root@rasapp:~# cd script/ApplePi/
root@rasapp:~/script/ApplePi# ./getBME
24.26C
101060Pa
46.31%
root@rasapp:~/script/ApplePi#

やっぱりError: Write failedが発生することがなかった。

BME280をつないだ時点で再現しなかった時点で意味はないと思うが、最後にRTCをつないだ状態でも確認してみる。
TI製PCA9515A → 旧型LCD + BME280 + DS1307
TI製PCA9515A → 新型LCD + BME280 + DS1307
NXP製PCA9515A → 新型LCD + BME280 + DS1307
NXP製PCA9515A  →旧型LCD + BME280 + DS1307
i2crep11i2crep20

root@rasapp:~# 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: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x38 0x39 0x14 0x70 0x56 0x6c i
root@rasapp:~# i2cset -y 1 0x3e 0 0x38 0x0c 0x01 i
root@rasapp:~# i2cset -y 1 0x3e 0 0x01 i
root@rasapp:~# i2cset -y 1 0x3e 0x40 0x77 0x61 0x69 0x74 0x20 i
root@rasapp:~#
root@rasapp:~# cd script/ApplePi/
root@rasapp:~/script/ApplePi# ./getBME
24.20C
101050Pa
46.76%
root@rasapp:~/script/ApplePi#
root@rasapp:~/script/ApplePi# timedatectl status
      Local time: 金 2016-10-28 20:22:30 JST
  Universal time: 金 2016-10-28 11:22:30 UTC
        RTC time: 火 1965-07-20 06:36:28
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
root@rasapp:~/script/ApplePi#

結局Error: Write failedの再現せず。

結局キットについてきたLCDとPCA9515Aの個体の問題で、この個体の組み合わせの時だけ発生するだろうか。
ただ、1回目のi2csetコマンドを打ってからプロンプトが返ってくるときに時間がかかっていることがたまにあったので、それがこの組み合わせの時だけ許容できない範囲になってエラーとなったということだろうか。

カテゴリー: RaspberryPi, 電子工作 | コメントする

ApplePiのTI製PCA9515AをNXP製PCA9515Aに変えてみた。ついでにセンサで温度を測ってみる。

秋月電子で売られていたI2C接続小型キャラクタLCDモジュール 8×2行について、RaspberryPiに直接つないでも表示されない旨がQ&Aにいつの間にか記載されていた。
以前の製品だと直接つないでも表示できたのだが、最近の物はそれができなくなった。
物によって表示できたりできなかったりしているのは知っていたので、改めてLCDモジュールを買って確かめてみた。
/RESET端子はいちいちプルアップ抵抗を準備するのも面倒なので、チップ抵抗を直接取り付けてみた。
i2crep01

そしてI2Cバスリピーター PCA9515ADの有無で動作を確認してみる。
i2crep02

root@rasapp:~# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@rasapp:~#

PCA9515ADがない場合、確かに認識しない。

次にPCA9515ADを介してつないでみる。
i2crep03

root@rasapp:~# 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: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@rasapp:~#
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x38 0x39 0x14 0x70 0x56 0x6c i
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x38 0x0c 0x01 i
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x01 i
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0x40 0x77 0x61 0x69 0x74 0x20 i
root@rasapp:~#

今度はLCDを認識して文字を表示できる。

ところで、以前ApplePiを作った時に最初のinitLCD.shコマンドはほぼ失敗して2回目以降から成功すると書いたことがある。
ApplePiを取り付けた状態でi2csetコマンドを電源投入直後に打って確認してみる。

root@rasapp:~# 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: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --
pi@rasapp:~ $
pi@rasapp:~ $
pi@rasapp:~ $ i2cset -y 1 0x3e 0 0x38 0x39 0x14 0x70 0x56 0x6c i
Error: Write failed
pi@rasapp:~ $
pi@rasapp:~ $ i2cset -y 1 0x3e 0 0x38 0x39 0x14 0x70 0x56 0x6c i
pi@rasapp:~ $
pi@rasapp:~ $ i2cset -y 1 0x3e 0 0x38 0x0c 0x01 i
pi@rasapp:~ $
pi@rasapp:~ $ i2cset -y 1 0x3e 0 0x01 i
pi@rasapp:~ $
pi@rasapp:~ $ i2cset -y 1 0x3e 0x40 0x77 0x61 0x69 0x74 0x20 i
pi@rasapp:~ $

1回目のi2csetコマンドでError: Write failedとなるが、2回目以降はコマンドは成功する。
しかし、今回秋月で買ったPCA9515AD(NXP製)を使ってLCD単体をつないだ時にエラーが発生したことがまったくない。
今のままでも動いているけど、毎回エラーが発生しているのも気持ちが悪いので、PCA9515を換装してみることにする。

しかし、PCA9515は温度/湿度/気圧センサの下に隠れている。
i2crep04

何とかセンサを取り外してTI製PCA9515AをNXP製PCA9515Aに交換する。
i2crep05i2crep06
左の写真がTI製PCA9515Aで、右がNXP製PCA9515A。
100円ショップで買ったレンズをつけてスマホで写真撮ったけど、中心はきれいに取れても全体は歪んでしまうのな。
何とかしたいな。

取り外したTI製PCA9515Aは検証用にピッチ変換基板に取り付ける。
もう一つは、以前秋月で買って確認用に準備したもの。
i2crep07
しかしこの写真じゃどっちがどっちかわからないな。

TI製とNXP製の違いについてまずはLCDだけつないで確認してみる。
i2crep08

TI製PCA9515Aの場合

root@rasapp:~# 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: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@rasapp:~#
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x38 0x39 0x14 0x70 0x56 0x6c i
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x38 0x0c 0x01 i
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x01 i
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0x40 0x77 0x61 0x69 0x74 0x20 i
root@rasapp:~#

 

NXP製PCA9515Aの場合

root@rasapp:~# 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: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@rasapp:~#
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x38 0x39 0x14 0x70 0x56 0x6c i
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x38 0x0c 0x01 i
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x01 i
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0x40 0x77 0x61 0x69 0x74 0x20 i
root@rasapp:~#

電源を抜いてある程度時間をおいてから試験してみたけどやっぱりTI製でエラーが発生しない。

次にRTCをつないなどつないで確認してみる。
i2crep09i2crep10
TI製PCA9515Aの場合

root@rasapp:~# 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: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x38 0x39 0x14 0x70 0x56 0x6c i
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x38 0x0c 0x01 i
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x01 i
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0x40 0x77 0x61 0x69 0x74 0x20 i
root@rasapp:~#
root@rasapp:~#
root@rasapp:~# timedatectl status
      Local time: 日 2016-10-23 16:01:39 JST
  Universal time: 日 2016-10-23 07:01:39 UTC
        RTC time: 火 1965-07-20 06:36:28
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
root@rasapp:~#

 

NXP製PCA9515Aの場合

root@rasapp:~# 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: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x38 0x39 0x14 0x70 0x56 0x6c i
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x38 0x0c 0x01 i
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x01 i
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0x40 0x77 0x61 0x69 0x74 0x20 i
root@rasapp:~#
root@rasapp:~#
root@rasapp:~# timedatectl status
      Local time: 日 2016-10-23 15:35:22 JST
  Universal time: 日 2016-10-23 06:35:22 UTC
        RTC time: 火 1965-07-20 06:36:28
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
root@rasapp:~#

やっぱりエラーは発生しない。
組み合わせの問題なのか、センサも必要なのかよくわからない。
結局何だったのだろうか。

それともかくRTCの試作基板は少し手直しした。
プルアップ抵抗のON/OFF用のディップスイッチを使っているが、1個分余っていたのでバックアップバッテリーのON/OFFにした。
リセットのためにいちいち電池を取り外したり取り付けたりが面倒だったため。
保管中もずっと動きっぱなしってのも気になったし。
また、公式LCD用に作ったスイッチ基板のLEDも3つにした。
i2crep11i2crep12

とりあえず元の状態に戻して、しばらく時間をおいてから確認してみる。
i2crep13

root@rasapp:~# 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: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x38 0x39 0x14 0x70 0x56 0x6c i
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x38 0x0c 0x01 i
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0 0x01 i
root@rasapp:~#
root@rasapp:~# i2cset -y 1 0x3e 0x40 0x77 0x61 0x69 0x74 0x20 i
root@rasapp:~#
root@rasapp:~#
root@rasapp:~# timedatectl status
      Local time: 日 2016-10-23 16:46:01 JST
  Universal time: 日 2016-10-23 07:46:01 UTC
        RTC time: 火 1965-07-20 06:36:28
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
root@rasapp:~#

とりあえず時間をおいて起動してからLCDに対してi2csetコマンドを打ってみたけどエラーは発生しなくなった。とりあえず、これはこれでOKかな。
RTCは相変わらずだが。

さて、センサを取り外す際結構時間がかかってしまい長時間熱を加えてしまったので、センサが正しく動いているか確認してみる。

pi@rasapp:~/ApplePi $ ./getBME
28.54C
100732Pa
40.76%
pi@rasapp:~/ApplePi $

温度高いなってちょっと待て。
部屋の温度は24℃ぐらいなのだが。
i2crep14
RaspberryPiを触ってみるとほんのり暖かい。
扇風機を使って放熱してみる。
i2crep15

pi@rasapp:~/ApplePi $ ./getBME
25.24C
100744Pa
47.11%
pi@rasapp:~/ApplePi $

部屋の温度に限りなく近くなった。
次に扇風機を止めて30分以上放置してみた。

pi@rasapp:~/ApplePi $ ./getBME
32.50C
100795Pa
32.30%
pi@rasapp:~/ApplePi $

温度上がりまくりだな。
トラ技の記事にも載っていたけど、センサを使うには延長するしかない。
センサ側にプルアップ用の抵抗が入っていて、それで全体をプルアップしている状態なのでややこしいことになっているのだろうな。

ちなみに、電源を切った状態で数時間放置後に再度電源を入れて温度を測る。

pi@rasapp:~/script/ApplePi# ./getBME
26.36C
100893Pa
47.50%
pi@rasapp:~/script/ApplePi#

RaspberryPiがまだ温まり切ってないので室温に近い温度を示している。

カテゴリー: RaspberryPi, 電子工作 | コメントする

公式LCDに拡張してみた

ApplePiを2種類作ったところで、公式LCDに取り付けたRaspberryPiも機能拡張してみたくなった。

そういえばRTCにはDS1307を使ったけど、スイッチサイエンスのミニRTCモジュール(販売終了)などで使われているDS3231を使えればICの大きさはあるけどクロック内蔵のためにほぼ外部部品無しで使えるから便利なんですけどね。
ds3231-1 ds3231-2
端子の半分がNCで(GNDにつながっているけど)実際に使うのは、電源,GND,SCL,SDA,バッテリー,32KHz,INT/SQWの8ピンだけ。
そのうち実際に使うには電源とI2Cに必要な4ピンだけ接続すればいいんで楽なんでしょうけど、ググってみたりAmazon見たりすると、何かしら基板に組み込み済みのモジュールはいくつも見つかるのだけど、いつも行く店のカタログでは単品で扱っているようなところは見つけられなかった。実店舗を探してみるしかないかな。

それはおいておいて、公式LCD用にもハイレゾリューションオーディオDACモジュール MM-5102を載せてみたくなった。
また、RTCを載せてみようと思い、またそのためにPCA9515Aを載せることにした。
LEDは本体の背面にあってもいちいちひっくり返すのかと思ったし、普通に画面に表示させればいいだろうとキャラクタLCDは省略。
でもスイッチはあれば何かの役に立つだろうと思い載せることにした。

基板はaitendoのユニバーサル基板(Pi)[UPi-5665]を使ったけど基板の厚さが1.2mmでちょっと丈夫さに不安が。
サンハヤトのRaspberry Pi(ラズベリーパイ)用ユニバーサル基板 UB-RPI02にすればよかったのだろうけど値段がなぁ・・・

また、RaspberryPiとつなぐコネクタは、LCDとのフラットケーブルの関係で背の高いピンソケットを使うことにした。

後の配線様子。
pilcd02pilcd03

スタッキングコネクタのピンはそのまま使いたいと思っていたのだが、単純に後ろに伸ばすと机と干渉してコネクタの取り付けが不便になりそうだったので、信号取り出し用のパターンにピンヘッダを取り付けることにする。
pilcd05pilcd04pilcd06

タクトスイッチつけることにしたものの、背面だけでは不便だろうと延長して使えるようにもした。
普段はジャンパーピンで基板側のタクトスイッチを使うようにしているが、ジャンパーピンを外してコネクタで別途スイッチ用の基板に延長できるようにした。
スイッチだけではつまらないので、LEDも2つつけてみた。
この辺はApplePiの仕様にこだわる必要もないのでLEDをもっとつけてもよかったんだろうけど手持ちのLEDの種類がバラバラなので、形状が同じものがそろっているこの赤と緑にした。
一応黄色もあったけど、それもつければよかったかな。
pilcd08pilcd09pilcd10pilcd07

実際につないで動作の確認の様子。
SW1~6を同時に確認できるスクリプトを即席で作って確認しているところ。
pilcd11pilcd12pilcd13

RTCはつけたものの、前述の問題のためまだ未設定。

ちなみに仕様の違いは以下の通り。

機能 オリジナル
ApplePi
カスタム
ApplePi
公式LCD
拡張基板
キャラクタLCD 8桁×2行 16桁×2行
アイコン表示
無し
スイッチ 6個 6個 6個
LED 2個 2個+LCDバックライト 無し
外付け基板で対応
IR受信/送信 有り 無し
IR送信はLCDバックライトに流用
無し
温度/湿度/気圧 有り 無し 無し
MM1502(DAC) 有り 有り 有り
RTC 空きスペースに後付け 空きスペースに後付け 有り
カテゴリー: RaspberryPi, 電子工作 | コメントする

オリジナルApplePiとRTC

カスタマイズApplePiについて無事動くことを確認できたので、今度はオリジナルの方にRTCをつけることにした。
と、その前にカスタマイズしたほうのRTCにパスコンを取り付けるため改修する。
rtc12rtc13rtc14
いったん配線を取り外し、パスコン用にレジストを削ってはがしてコンデンサを取り付け。
改めてI2Cの配線を行い改修終了。

ちなみに、DS1307のデータシートを見ると、クリスタルの下の部分にGNDパターンをもって来たほうがいいらしく、ちょうどいい空きスペースでもある。
ds1307-4

ではオリジナルの方にもRTCを取り付けることにする。

未加工の基板の裏側
rtc15
DS1307の取り付け場所は前回と同じところにする。
LCDのバックライト用のパターンがちょうどCR1220用のホルダーのサイズにぴったりなのだが、こちらはLCDを取り付けているため、LCDの足の部分が出っ張ってしまっている。
そのため、0.3mm厚の塩ビ板を両面テープで貼り付け。
rtc17rtc18
そして、DS1307のGND端子とコンデンサ用にレジストを削ってはがしておく。

バックライト用のR3については意味がないことを知りつつも取り付けてしまっていたので、取り外した。
rtc16
ちなみに秋月でも8×2行バックライト付きLCDを扱っていたみたいだ。
バックライト付きを使っていたら電池をつける場所に難儀していたことだろう。

DS1307を基板に取り付けてからクリスタルとバックアップ用の配線をしようとすると、下のGNDパターンに熱を奪われて半田付けしづらくなるので、あらかじめ取り付けておく。
rtc19

クリスタル取り付け済みのDS1307のGND端子とコンデンサを取り付け。
rtc20

次にRC1220用のホルダの加工。
まずは位置固定用の出っ張りも削り取っておく。
塩ビ板を取り付けた関係でそのままでは半田付けできないので、半田付け部分を折り曲げる。
また、背面に金具が見えている部分がちょうどLCDのパターン付近にあるため念のためポリイミドテープで養生しておく。
rtc21rtc22rtc23

RC1220用のホルダを取り付けて、残りの配線を行ったところ。
rtc24

最後に、カスタム版ともども配線を固定するためポリイミドテープとグルーガンで固定したのだが、どうも見栄えがよくないなぁ・・・。
rtc25rtc26rtc27

次に、RTCが使えるようにするために設定を行ったのだが、どうしてもうまくいかない。
カスタム版で設定した時はネットで調べながら試行錯誤して使えるようになったのだが、その手順を踏まえて設定してもうまくいかない。まだ何か足りないのだろうか。

一通り設定を行いRTCに時刻を書き込むのだが、再起動するとRTCから時刻を読み取ることができず、ずっと1965-07-20 06:36:28のまま動かない。
そして、hwclock -wコマンドを実行するとRTCが正常に動きだすが、再起動するとやはり時刻を読み取れない。
またLAN/WLANが繋がっていても繋がっていなくても症状は変わらない。
どうしたものか・・・。

root@rasapp:~#
root@rasapp:~# ntpq -pn
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+129.250.35.250  249.224.99.213   2 u   13   64    1    8.558   -0.143   0.141
*60.56.214.78    .GPS.            1 u   12   64    1   21.781   -1.361   3.089
 129.250.35.251  249.224.99.213   2 u   55   64    0    0.000    0.000   0.001
+157.7.154.23    131.113.192.40   2 u   43   64    1    8.304   -1.860   0.403
root@rasapp:~#
root@rasapp:~#
root@rasapp:~# date
2016年 10月 17日 月曜日 20:33:54 JST
root@rasapp:~#
root@rasapp:~#
root@rasapp:~# hwclock
hwclock: The Hardware Clock registers contain values that are either invalid (e.g. 50th day of month) or beyond the range we can handle (e.g. Year 2095).
root@rasapp:~#
root@rasapp:~#
root@rasapp:~# timedatectl status
      Local time: 月 2016-10-17 20:34:12 JST
  Universal time: 月 2016-10-17 11:34:12 UTC
        RTC time: 火 1965-07-20 06:36:28
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
root@rasapp:~#
root@rasapp:~#
root@rasapp:~# timedatectl status
      Local time: 月 2016-10-17 20:45:30 JST
  Universal time: 月 2016-10-17 11:45:30 UTC
        RTC time: 火 1965-07-20 06:36:28
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
root@rasapp:~#
root@rasapp:~#
root@rasapp:~# hwclock
hwclock: The Hardware Clock registers contain values that are either invalid (e.g. 50th day of month) or beyond the range we can handle (e.g. Year 2095).
root@rasapp:~#
root@rasapp:~#
root@rasapp:~# hwclock -w
root@rasapp:~#
root@rasapp:~# hwclock
2016年10月17日 20時46分07秒  -0.511829 seconds
root@rasapp:~#
root@rasapp:~# timedatectl status
      Local time: 月 2016-10-17 20:46:16 JST
  Universal time: 月 2016-10-17 11:46:16 UTC
        RTC time: 月 2016-10-17 11:46:16
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
root@rasapp:~#
root@rasapp:~#
root@rasapp:~#

 

カテゴリー: RaspberryPi, 電子工作 | コメントする

カスタマイズApple PiとRTC

以前トラ技の付録のApple Piを作ったのだが、LCDの表示が8桁×2行と少ない。
また、自分では赤外線リモコン機能や温度・湿度・気圧センサはあまり使うことがなさそうだったので、カスタマイズしてみようと思った。

改めて8月号を買って、早速カスタマイズしてみる。
まず、LCDは16桁×2行にしたかったので、I2C低電圧キャラクタ液晶モジュール(16x2行)[バックライト付]を使うことにした。

applepi-lcd
上記のように接続すれば、ハイレゾリューションオーディオDACモジュール MM-5102
に干渉することなく取り付け可能なことがわかった。

appsp01appsp03appsp02
LCDを取り付けるため、3端子レギュレータとトランジスタを表面実装タイプに変更。
3端子レギュレータを低損失CMOS三端子レギュレータ 3.3V150mAに変更。
それに合わせて、C3,C4を1μFに変更し、C1,C2は未使用とする。
赤外線LED用の回路をLCDのバックライト用に流用している。
バックライトも3.3Vから取ればこの辺のトランジスタも不要になるのだが、バックライトのVFが2.7~3.15Vと3.3Vに近いことから、5Vから電源を取っている赤外線LEDの回路を流用することにした。トランジスタは2SC2712-GRに変更し、R4を10KΩ、R7を470Ωに変更した。

appsp07
LCDの/RSTを基板上で10KΩのチップ抵抗でプルアップ。

appsp04appsp05
若干無理やりな感じで、バックライト用の配線を行う。
もう少し細い線を使ってもよかったかも。

appsp06appsp08
LCDを取り付けたら、AppliPi側でNC端子を利用してVDDとGNDを接続。
合わせてSCL,SDAを10KΩのチップ抵抗でプルアップする。

appsp10appsp09
起動時にホスト名とIPアドレスを表示させるスクリプトを実行させるようにした。
以前書いた/etc/network/*.dにスクリプトを置く方法がうまくいかなくなったので、/etc/rc.localにIPアドレスを表示させるスクリプトを実行させている。
ただ、/etc/rc.localで表示させようとしてもタイミング的にIPアドレスを取得できないので、別途IPアドレスを表示させるスクリプトを準備して、バックグラウンドでスクリプトを実行するようにした。
バックライトのON/OFFは既にあるonLED1.*とoffLED1.*をコピーして使用するポートをGPIO13に変更したonLED3.*とoffLED3.*を作成。
他にもinit.shにLED3用の設定を加えたり、LCD関連のスクリプトなどを16桁対応に書き換えたりいろいろ修正している。

/etc/rc.localに以下の内容を追加
ちなみに/root以下にもApplePiを展開してある。

# ApplePi GPIO init
cd /root/ApplePi
./init.sh
./onLED3.sh

# print host infomation
cd /root/script
./ipdisp.sh &

 

/rootにscriptディレクトリを作って、そこにipdisp.shを作成。
16回IPアドレスの取得を試みて、取得できなかった場合はno ip addressと表示するようにしてある。i2c-disp.shは以前作ったスクリプト。

#!/bin/sh

/root/script/i2c-disp.sh -ic `uname -n`
/root/script/i2c-disp.sh -p 0x40

for i in `seq 16`
do
  ipaddr=`hostname -I`
  case "$ipaddr" in
    "")
        /root/script/i2c-disp.sh "."
        ;;
    *)
        break
        ;;
  esac
  sleep 1
done

case "$ipaddr" in
  "")
      /root/script/i2c-disp.sh -p 0x40 "                "
      /root/script/i2c-disp.sh -p 0x40 "no ip address"
      ;;
  *)
      /root/script/i2c-disp.sh -p 0x40 "                "
      /root/script/i2c-disp.sh -p 0x40  ${ipaddr}
      break
      ;;
esac

ただ、LCDを16桁対応しただけではつまらないので、今度はRTCを乗せてみることにした。

まずは以前買ったミニRTCモジュール(販売終了)で動作を確かめる。
RTCをつないでハードウエアクロックとして使う方法はまた別途説明することにする。
rtc01rtc02rtc04
ただ、これだとApplePiの基板には乗せられないので、他にいいものがないか探してみる。

DS1307というRTCがあり、ピンの数も少なくバックアップ用の電源と32.768KHのクリスタルさえあればすぐ使えるという優れもの。
ds1307-1
ds1307-2
クリスタルは秋月で買ったのだが、標準の物より小さいサイズで今回のように小さめにまとめるのにちょうどよかった。
rtc07

まず、試作基板を使って動作の確認。
ディップスイッチでプルアップ抵抗の有無を選択できるようにして、ブレッドボードに刺さるように作ったので、ほかの工作の試作にも流用ができる。
rtc03rtc05

ところでこのDS1307の動作電圧が5Vなのだが、信号は2.2V以上あればHとして認識してくれるので、電源は5Vから取って、I2CはそのままつなぐだけでOK
ds1307-3

rtc06
RTCを取り付ける前の状態。
LCDの基板でI2Cの端子が隠れてしまうため、空きスペースのパターンを削ってI2C用の端子を取り出している。
I2Cの配線はこれまでの動作の確認のため、仮に配線してある。

RTC用のバックアップ電池はCR1220を使用して、それ用のホルダを本来のLCD用のバックライトをつなげるパターンを利用して取り付けた。
問題ないと思うけど、本来のLCD接続用のパターンをポリイミドテープで養生している。

rtc08rtc09
RTCとボタン電池用ホルダーを取り付けたところ。
よく見ると、パスコンをつけ忘れているので後日直すことにしよう。
ICのGNDの部分のレジストをはがし半田付けしているのだが、ICをGNDのピンでしか固定されていない状態なので、ハックルーをつかってクリスタルとIC付近の配線を固定した。
rtc10rtc11
ただ、このハックルーなのだが、これを使うとこて先に溶けたハックルーが焦げ付いてなかなか拭き取れず、以降の半田付けに支障が出てきそうだ。
まぁ、ともかくこれでネットワークにつながっていない状態でも、正しく時間を取得することができるようになった。

次はオリジナルのApplePiにもRTCを取り付けてみることにする。

カテゴリー: RaspberryPi, 電子工作 | コメントする

導通チェッカ

導通チェックだけを行うのに、いちいちテスターを取り出すのも煩わしい。
他にも測定するものがあったり、複数ヶ所の導通チェックを行うならテスターでもよかったのだけど、2~3ヶ所程度だと、導通チェッカのほうが手軽な気がしてきた。

キットもいくつかあるし、ネットを探せばいくらでも出てくる。
でも作るのであれば、小型の物がほしいなと思った。
そこで見つけたのが、ChaNさんのELMで見つけた回路内導通テスター(旧)( http://elm-chan.org/works/ict/report.html)だった。

もう一つ新型のチェッカがありマイコンを使った作例だったけど、プログラムの書き込みがちょっと面倒かなと思って、旧型のほうを作ることにした。
その際、表面実装の部品を使うことで小型化することにした。

ケースについてはタカチのCS型コイン電池収納型プラスチックケース(ホワイト)【CS90-W】を使うことにした。
http://www.marutsu.co.jp/pc/i/136840/
http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-0JE8
ict04

表面側に来る側には以下の部品を実装。
ムラタ表面実装圧電サウンダ(トランスデューサ/圧電スピーカ/)
http://akizukidenshi.com/catalog/g/gP-05723/
縦型スライドスイッチ
http://eleshop.jp/shop/g/gC5U121/
ict01
別の作品でも使ったけど、このケースにこのスイッチはぴったりなサイズ。

反対側の様子。
ict02

IC周辺の様子。
かなり無理をしている感じになってしまった。
ChaNさんみたいにきれいに配線できるようになりたいものだ。
ict03

でも、おかげで手軽に導通チェックができるようになったので満足している。

カテゴリー: 電子工作 | 2件のコメント

Raspberry PiでPCA9515を使ってLCDを表示してみる

先日作ったトラ技付録のApple Piの記事の中に、RasberryPiでLCDが表示できない件についてコラムが載っていた。
RaspberryPi側のプルアップ抵抗が小さく、デバイス側のLレベルが既定の電圧まで下がり切れないのが原因とのこと。
このことについては某巨大掲示板ではだいぶ前に判明していて、SDAとGNDの間に抵抗を挟むとか対策があったけど、それをやるならi2cレベルコンバータ(これとかこれ)が使えないかなとか考えていたけど、面倒だったのでほったらかし状態になっていた。

で、先のトラ技付録ではPCA9515Aを使って対応していた。
コラム中にある写真にはテキサス・インスツルメンツ社と説明書きされているが、実際に載っている写真はどう見てもNXP社のPCA9515Aの写真である。
PCA9515A
販売されている部品セットではテキサス・インスツルメンツ社の物が入っていたけど。

そのトラ技が出版されてしばらくしてから、PCA9515Aを秋月電子で取り扱いを始めたので早速入手して遊んでみることにした。

i2crep01
今回作った2作品。
左のはブレッドボード用にPCA9515Aを2つ積んだもの。
右はi2c LCDの確認用に作ったもの。

i2crep02
5ピンコネクタのメス-メスケーブルでRaspberryPiの1,3,5,7,9ピンとつなげばすぐ使えるようにしてある。
RasspberryPi側とつながる方は2段のコネクタにしてあり、GPIO4をEnable用に使う場合は下段に、Enableを使わない場合は上段につなぐようにしてある。
もちろん、余った側から別のi2cデバイスにつなぐこともできる。
右のデバイス側のコネクタは3.3VとGNDを2本分出していて、LCD側に/Reset端子とかあったり、バックライト用だったり使えるようにしてある。
また、デバイス側のプルアップ抵抗の実装の有無に合わせてスライドスイッチでプルアップ抵抗を使うか使わないか選択できるようにしてある。

i2crep03
ブレッドボード用は最初PCA9515Aを1個だけ使用と考えていたけど、基板のサイズがどうしても中途半端になってしまうので、2個積んで28ピンサイズにすることにした。
RaspberryPi側につながる方は、オス-メスの6ピンコネクタで1,3,5,7,9,11ピンとストレートでつなぐことができるようにしてある。
この場合GPIO4が1側のEnableを、GPIO17が2側のEnableを制御できるようになる。
こちらもスイッチでSDA/SCLのプルアップの有無を選択できるようにしてある。
ブレッドボードでの使用を想定しているので、/Reset端子用に10KΩでプルアップされたピンも準備して、ブレッドボード上に別にプルアップ用の抵抗を準備しなくてもいいように作ってある。(というかピンが余ったからそうした)

i2crep

まずはLCDを直接つないでみた場合

pi@testhard01:~/script$ 
pi@testhard01:~/script$ sudo i2cdetect 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x03-0x77.
Continue? [Y/n] 
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3e -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         
pi@testhard01:~/script$ 
pi@testhard01:~/script$ 
pi@testhard01:~/script$ ./i2c-disp-aki.sh -ic Akizuki
pi@testhard01:~/script$ 

i2crep04
秋月の8桁×2行のLCDはちゃんと認識して表示される。

pi@testhard01:~/script$
pi@testhard01:~/script$ sudo i2cdetect 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x03-0x77.
Continue? [Y/n]
0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3e --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
pi@testhard01:~/script$
pi@testhard01:~/script$
pi@testhard01:~/script$ ./i2c-disp-sbl.sh -ic Strawberry
pi@testhard01:~/script$ ./i2c-disp-sbl.sh -p 0x40 Linux
pi@testhard01:~/script$

i2crep06
ストロベリー・リナックスのLCDも認識して表示もできる。

pi@testhard01:~/script$
pi@testhard01:~/script$ sudo i2cdetect 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x03-0x77.
Continue? [Y/n]
0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
pi@testhard01:~/script$
pi@testhard01:~/script$

i2crep05
秋月の16桁×2行のLCDは認識できない。
ゆえに表示もできない。

次にPCA9515を使って表示してみる。
i2crep07i2crep09
秋月の8桁×2行のものとストロベリー・リナックスの物は変わらず表示される。

では、問題の秋月の16桁×2行のLCDで使用してみる。

pi@testhard01:~/script$
pi@testhard01:~/script$ sudo i2cdetect 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x03-0x77.
Continue? [Y/n]
0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3e --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
pi@testhard01:~/script$
pi@testhard01:~/script$
pi@testhard01:~/script$ ./i2c-disp-aki.sh -ic Akizuki
pi@testhard01:~/script$ ./i2c-disp-aki.sh -p 0x40 "AE-AQM1602A"
pi@testhard01:~/script$

i2crep08
今度はちゃんと認識して文字を表示されるようになった。

続いて、ブレッドボード用に作った物の確認をしてみる。
i2crep10i2crep11
それぞれ単体での動作確認をして正しく動くことを確認。

それでは、今度はLCDを2台つないでそれぞれ別々に表示させてみる。
まずGPIO4と17を出力に設定して、両方をLレベルに設定。

pi@testhard01:~/script$
pi@testhard01:~/script$ echo 4 > /sys/class/gpio/export
pi@testhard01:~/script$ echo 17 > /sys/class/gpio/export
pi@testhard01:~/script$ sudo sh -c 'echo low > /sys/class/gpio/gpio4/direction'
pi@testhard01:~/script$ sudo sh -c 'echo low > /sys/class/gpio/gpio17/direction'
pi@testhard01:~/script$
pi@testhard01:~/script$
pi@testhard01:~/script$ sudo i2cdetect 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x03-0x77.
Continue? [Y/n]
0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
pi@testhard01:~/script$
pi@testhard01:~/script$

もちろん両方のEN端子がLレベルなので、LCDは認識されない。

続いて、それぞれのEN端子をHレベルにして各LCDに文字を表示させてみる。

pi@testhard01:~/script$
pi@testhard01:~/script$ sudo sh -c 'echo low > /sys/class/gpio/gpio17/direction'
pi@testhard01:~/script$ sudo sh -c 'echo high > /sys/class/gpio/gpio4/direction'
pi@testhard01:~/script$
pi@testhard01:~/script$ sudo i2cdetect 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x03-0x77.
Continue? [Y/n]
0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3e --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
pi@testhard01:~/script$
pi@testhard01:~/script$ ./i2c-disp-sbl.sh -ic Strawberry
pi@testhard01:~/script$ ./i2c-disp-sbl.sh -p 0x40 "Linux lcd1"
pi@testhard01:~/script$
pi@testhard01:~/script$
pi@testhard01:~/script$ sudo sh -c 'echo low > /sys/class/gpio/gpio4/direction'
pi@testhard01:~/script$ sudo sh -c 'echo high > /sys/class/gpio/gpio17/direction'
pi@testhard01:~/script$
pi@testhard01:~/script$ sudo i2cdetect 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x03-0x77.
Continue? [Y/n]
0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3e --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
pi@testhard01:~/script$
pi@testhard01:~/script$ ./i2c-disp-sbl.sh -ic Strawberry
pi@testhard01:~/script$ ./i2c-disp-sbl.sh -p 0x40 "Linux lcd2"
pi@testhard01:~/script$

i2crep12
これで複数のLCDをコントロールすることができるようになった。

ちなみに、以前作ったスクリプトをさらに改修。
初期化の際、1度目のi2csetコマンドが失敗してもリトライするように修正。
さらに秋月のLCDとストロベリー・リナックスのLCDではコントラスト調整等のパラメータが微妙に違うので、それぞれ2つに分けた。
秋月やストロベリー・リナックスではこれ以外のLCDも扱っているし、それ以外のところでもLCDを扱っており、場合によってはさらにパラメータが違ってくるので、オプション指定でコントラスト等の調整ができるような改修も必要かもしれない。

i2c-disp-aki.sh

#!/bin/bash
function usage {
    echo "Usage: $0 [-ic] [-p pos] message" > /dev/stderr;
    echo "       -i : LCD init, -c : Clear Screen" > /dev/stderr
    echo "       -p : position (0:top left, 40:bottom left)" > /dev/stderr
    exit 1
}

function abort
{
   echo "$@" 1>&2
   exit 1
}

[ $# = 0 ] && usage

while getopts "icp:" flag; do
    case $flag in
        \?) usage ;;
        i)  i2cset -y 1 0x3e 0 0x38 0x39 0x14 0x70 0x56 0x6c i
            if [ $? -ne 0 ]; then
                echo "i2c error:initialize step1. retry initialize" 1>&2
                sleep 1
                i2cset -y 1 0x3e 0 0x38 0x39 0x14 0x70 0x56 0x6c i || abort "i2c error:initialize step1"
            fi
            sleep 0.25
            i2cset -y 1 0x3e 0 0x38 0x0c 0x01 i || abort "i2c error:initialize step2"
            sleep 0.05
            ;;
        c)  i2cset -y 1 0x3e 0 0x01 || abort "i2c error:clear screen" ;;
        p)  i2cset -y 1 0x3e 0 $((OPTARG+128)) || abort "i2c error:set position" ;;
    esac
done
shift $((OPTIND-1))
[ $# = 0 ] && exit

LANG=C
MSG=`echo -n "$1" | perl -pe '$_=join" ",map{ord }split//'`
#echo $MSG
i2cset -y 1 0x3e 0x40 $MSG i || abort "i2c error:display string"

 

i2c-disp-sbl.sh

#!/bin/bash
function usage {
    echo "Usage: $0 [-ic] [-p pos] message" > /dev/stderr;
    echo "       -i : LCD init, -c : Clear Screen" > /dev/stderr
    echo "       -p : position (0:top left, 40:bottom left)" > /dev/stderr
    exit 1
}

function abort
{
   echo "$@" 1>&2
   exit 1
}

[ $# = 0 ] && usage

while getopts "icp:" flag; do
    case $flag in
        \?) usage ;;
        i)  i2cset -y 1 0x3e 0 0x38 0x39 0x14 0x78 0x5e 0x6c i
            if [ $? -ne 0 ]; then
                echo "i2c error:initialize step1. retry initialize" 1>&2
                sleep 1
                i2cset -y 1 0x3e 0 0x38 0x39 0x14 0x78 0x5e 0x6c i || abort "i2c error:initialize step1"
            fi
            sleep 0.25
            i2cset -y 1 0x3e 0 0x0c 0x01 0x06 i || abort "i2c error:initialize step2"
            sleep 0.05
            ;;
        c)  i2cset -y 1 0x3e 0 0x01 || abort "i2c error:clear screen" ;;
        p)  i2cset -y 1 0x3e 0 $((OPTARG+128)) || abort "i2c error:set position" ;;
    esac
done
shift $((OPTIND-1))
[ $# = 0 ] && exit

LANG=C
MSG=`echo -n "$1" | perl -pe '$_=join" ",map{ord }split//'`
#echo $MSG
i2cset -y 1 0x3e 0x40 $MSG i || abort "i2c error:display string"
カテゴリー: RaspberryPi, 電子工作 | コメントする