ピックワールド(PIC World)

インフォメーション

この記事は 2016年04月07日 に以下のカテゴリに投稿されました Arduino Blog.

この記事のタグ

, , , , , , , , , , ,


Arduino UNO に昔秋月電子で買った 16×2 行の LCD を接続してついでに温度計できた! – ジャンク箱あさってたら、出てきた液晶と S-8120C(温度センサー)を使って

これ、ずいぶん昔に買ったものです。

何かひらめいて、買ってきたのだけれども、まだ未使用の状態で袋に入って大事にされているということは、そのアイデアはボツとなったのでしょうねぇ。

覚えているけど、忘れたことにしておこう。

まぁ出てきたので、コツコツと少しずつ、久しぶりではあるのだけど、Arduino いじってます。

ちょっと作りたいものが出てきたのでってことなのですが、長年温めていたものでもあります。

プログラムの構想やセンサーの事など、まだ解決すべきことは多いのですけれども、少しずつ進めていきましょう。

と、作業を進めているのですけれども、今どきの Raspberry Pi ももちろん良いのですけれども、ちょっとした AD 変換とかだと、もったいないというか、Arduino のほうが簡単に実現できると思うのですねぇ。

でも、なんと言っても、開発環境などを考えると Arduino の IDE ではかったるいなぁと思うのも事実、これ、デバッグの方法にあるんだなぁと気が付いて、もうずいぶん経つけど、このちっちゃな液晶が出てきて、これくっけてやりゃいんじゃないのと考えた。

だっていつも PC と接続してシリアルモニターしてみたいなデバッグ方法だから。

少しこれで改善できるかな?

秋月電子でその昔購入した(とおもわれる)SC1602BS*B という 16文字 x 2行の液晶モジュールです。

今のものは、バックライトがついていて、視認性が向上されているようなのだけど、見えればよいので無視。

Google 先生に聞くと、沢山出てきますけど、一応ね説明を。

SC1602BS*B のコネクタは、基盤裏面から見ると、

SC1602BS*B ピンアサイン(裏面)

SC1602BS*B ピンアサイン(裏面)

実際のコネクタはこんな感じになってる。

SC1602BS*B のコネクタ

SC1602BS*B のコネクタ

液晶ユニットと、雄雌のコネクタがちゃんと入れられているのには感心します。

この図の水色で塗りつぶしてある部分を Arduino UNO と接続すればよい。
ただし 3 番ピンは液晶の輝度調整用なので、抵抗器に接続する。

Ardino UNO と SC1602BS*B の接続図

Ardino UNO と SC1602BS*B の接続図

必要なのは 10KΩ(103)の可変抵抗器だけ。
ちなみに書き込みだけに使うのなら、上図の R/W – D11 のラインは不要です。

さてプランはできたけど、どうやって作るかなということを考える。

Arduino UNO 用のシールド用のユニバーサル基盤もあるのだけれど、もしかして何かに組み込むなんてことも考えると、シールドとするよりも別基盤にしておいた方が良いかもなということで、こちらを採用。

サクッと作って、こんな感じに。

SC1602BS*B - ユニット

SC1602BS*B – ユニット

SC1602BS*B - ユニット(配線面)

SC1602BS*B – ユニット(配線面)

まぁこんなもんっす。(久しぶりだからと言い訳してみる)
ブレッドボードに組んだ方が良かったか?(まぁいいやできたから)

次はコード(Arduino だとスケッチね)。

#include <LiquidCrystal.h>

LiquidCrystal lcd = LiquidCrystal(12,11,10,5,4,3,2);

void setup(){
lcd.print("Hello Minoru!");
}

void loop(){
}

まぁテストなので、”Hello World” とかにしようと思ったけど、まぁいいや。

ちゃんと動いてることが確認できた。

で、2行あるんだけど2行目に書くには?

setCursor(colum , low) ってメソッドを使えばよいので、lcd.setCursor(0,1) って(1行目は0)やれば2行目にかけるはずなんだけどな。

動かない。

おおなるほどね。

これは、最初に lcd.begin ってやって、その液晶のヨコの文字数と、タテの行数を指定しておかなければいけないのでした。

で、

#include <LiquidCrystal.h>

LiquidCrystal lcd = LiquidCrystal(12,11,10,5,4,3,2);

void setup(){
lcd.begin(16, 2);
lcd.print("Hello Arduino");
lcd.setCursor(0,1);
lcd.print("Hello Minoru!");
}

void loop(){
}

とすれば、1行目には”Hello Arduino”、2行目には、”Hello Minoru!” と無事に表示できました。

SC1602BS*B - ユニット(完成)

SC1602BS*B – ユニット(完成)

これだけじゃぁつまらないよねぇ。

ってことで、同時に発掘された、温度センサーで遊んでみる。

発掘された温度センサーは、すでに廃番となった模様の S-8100B という CMOS の温度センサーと、S-8120C という、おそらくはその後継となっている同じく CMOS の温度センサー。

S-8120C の方は変換基盤に既に乗っかっていて、5個もあるからこっちを使ってみましょうかねぇ。

S-8120C - 秋月電子

S-8120C – 秋月電子

わっ!机汚いってそれほどではないのだけど、S-8120C がちっちゃいのね。
大体 5 x 6 mm くらいの大きさ。

データシート眺めてっと

  • -30℃~+100℃まで測定が可能
  • 電源電圧は -3V~+12V
  • 出力電圧は 0.9V~2.1V ぐらい

を確認して、考える。

Arduino の AD 変換器は基準電圧が5Vまたは 3.3V(外部入力)ってことだから、本当は 3.3V の方が、これを使って温度を測定するのが目的なら精度は上がりますな。

でも、実は長い道のりと思われる目的があるので、温度は犠牲にしてでも 5V で使うことにする。

今はおまけなので、液晶で使った基盤に乗せてあげて、とりあえずは出力電圧を見てみる。

S-8120C - 出力電圧の確認

S-8120C – 出力電圧の確認

今部屋は 24 ℃くらいある(あったかいんだから)けど、大体 1.506V 程出ていますね。
データシートをまた眺めて、妥当な電圧が出ていることを確認。(いいじゃん)

ちなみに指先を当てたりすると、温度が上がって、出力電圧が下がってきます。

これ位なら Arduino の AD 変換ポートに入れても大丈夫でしょう。

早速コード(Arduino だとスケッチね)を書くのだが、AD 変換(アナログ入力)するためには、0番のアナログ入力を使う時には、analogRead(0) ってやればいい。

そうなのだけど、これを温度に変換するには・・

またデータシートとにらめっこなのだけど、前提の条件は、

  • 基準電圧は 5V で、分解能は 1024 (10 bit って事 0~1023迄)。
    したがって、4.8828 をアナログ入力で得た値に乗算すれば mV となる
  • S-8120C のデータシートを見て、‐30℃の時に 1,951mV であることを読み取る
    加えて1℃あたり-8.2mVの変化量であることを読み取る
    測定できる下限値が -30℃であることも確認
  • 従って 温度は
    温度 = アナログ入力から得た値 * 4.8828
    温度 = (1951 – 温度) / 8.2
    温度 -= 30

で温度が求められることになるハズ。

さてスケッチは・・


#include <LiquidCrystal.h>

float val = 0;

LiquidCrystal lcd = LiquidCrystal(12,11,10,5,4,3,2);

void setup(){
lcd.begin(16, 2);
lcd.print("Temperature");
}

void loop(){
val = analogRead(0);
val = val * 4.882;
val = (1951 - val) / 8.2;
val -= 30;
lcd.setCursor(0,1);
lcd.print(val);
delay(5000);
}

こうなって、コンパイルして USB で Arduino UNO にバイナリを転送して動作させると以下のように表示されましたよ。

Arduino UNO + S-8120C 温度計

Arduino UNO + S-8120C 温度計

夜中なので少し温度が下がってますねぇ。もう寝るからいいけど。

画像の左下にちっちゃいのが見えるのが、今回使用した S-8120C という温度センサーです。

このセンサーモジュール秋月電子の製品ですけど、小さくて使いやすくてよいですねぇ。

センサーを指で触ると、温度が少し上昇したり、ドライヤーをあてると、どんどん温度が上がっていきます。(あたりまえだけど)

5V を基準電圧に使っているので、3.3V としてあげればもう少し精度が上がるけれども、他との兼ね合いもあるので、こうしておこう。

後は、データを Web にあげるようなことも今の段階でスケッチを書いておくことができるけど、それはまた後程にしておきましょう。

もう少しに詰めて、やりたいことがまとまったら、計画の発表と、Ethernet シールドを使って Web にデータを上げてみることにしましょうかね。

やっぱり楽しいね。

LCD 付けたら、確かにデバッグは楽になったので、お勧めですね。

もっとたくさんの行数とかのものもあるけど、これ1つ作っておくとよいかも(よ)。

投稿者のプロフィール

minorus
minorus
電子機器が大好きです。
プログラムを書くのをお仕事としていたこともあるので、両方できる PIC や Arduino を使って、いろいろな(役にあんまり立たない)ものを作っています。
実は UNIX 関連のお仕事も長かったので、Raspberry Pi もお手の物なのですけれど、これから触る機会が多くなるのかなぁ。
ボチボチ行きますが、お付き合いください。
若いころの写真なので、現時点では、まだ髪の毛は黒くてありますが、お髭は真っ白になりました。
愛車の国鉄特急カラーのカスタムしたリトルカブで、時々、秋月電子通商の八潮店に出没します。

2 Comments

  1. SC1602BSとS-8120Cの組み合わせでググったところヒットしたので立ち寄らせて頂きました。
    SC1602BSとArduinoの組み合わせには注意が必要で、ArduinoのLCDライブラリ説明では1:VSS、2:VDDとなっているのですが、SC1602BSは1:VDD、2:VSSとプラマイ逆という最も危険なパターンになっています。
    また、S-8120Cですが、こちらで紹介されている温度換算プログラムだとかなり低い摂氏に変換されてしまいませんか?

    • minorus
      2016/06/19
      minorus

      Arduinoのつづりさん こんにちは。コメントをいただきまして、ありがとうございます。
      LCD ライブラリの件については、そうなのですね・・・
      秋月の取扱説明書をたぶん見て、気が付いていたとは思うのですが、記事には記載していないので、注意が必要だと思います。
      温度の測定は1~2度低いかもしれないのですが、どの温度計が正確なのかわからないので、こんなものかと思っています。
      極端に低い温度が表示されるということはありませんね。
      何かの時(この時ではないかもしれないという意味)だと思うのですが、Arduino で AD 変換を行う時に USB から給電していて、おそらくは電源容量の不足により、ご指摘のような状況となったことは以前に経験しました。AC アダプタから適切な電圧(この時は 12V) で給電したらこの現象は無くなりました。
      お詳しいようなので、説明不要かと思いますが、ご指摘の温度の表示の件を考えてみると、こんなことが思い浮かんだのでお知らせしておきます。
      今後ともどうぞよろしくお願いいたします。

コメントを残す

最近の投稿

最近のコメント

アーカイブ