「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



http://brown.ap.teacup.com/nekosan0/213.html
この間arduinoでLM35の実験したわけですが、
このICは0℃で0Vになっちゃうので、そのままでは
氷点下が計れません。(計算はとても簡単でよいのですが)

そしたら、秋月の新商品にこんなのが並んでました。
http://akizukidenshi.com/catalog/items2.php?q=%22I-02490%22&p=1
LM60。
計算はちょっと煩雑になるかもしれませんが、
氷点下も計れるし、S8100Bよりもインピーダンス
が低いだろうと思うので、ノイズにも強そうです。

しかも末端価格100円!

もう少し早く売り出しててくれれば良いのに…。



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする




arduinoにLCDを繋いでしまおうという話のつづき。


やはりマイコンと繋ぐなら、省ピンが出来る4ビット
I/Fモードで使いたいものです。

というわけでやってみました。
その結果、いくつかの注意点が見つかりました。

(1)R/W信号線について

R/W信号とはLCDにデータを書き込むのか
LCDからデータを読み出すのかを切り替える信号
です。
8ビットモードでも4ビットモードでも書き込み/
読み出しは出来る(はず)んですが、arduino用
ライブラリの4ビットモードではR/Wピンを
使用出来ないようになっていました。詳しくは↓
http://www.arduino.cc/playground/Code/LCD4BitLibrary
ここの「How to use it」をご参照ください。

簡単に訳します。
R/Wピンは必ずGNDに落として下さい。
とのこと。
ちなみに、省ピンモードを使うならR/Wも使わずに
省ピンに徹する使い方になるだろうから、R/Wは
無効にしました、みたいな事がどこかに書いてありました。

8ピンモードで動いていたスケッチを4ピンモードに
したら動かなくなった、という場合はこれを疑って
下さい。R/WをGNDに落とすと、普通に表示される
ようになります。

#include <LCD4Bit.h>

LCD4Bit lcd = LCD4Bit(1);
void setup(void){
lcd.init();
}

void loop(void){
lcd.printIn("arduino");
delay(1000);
lcd.clear();
delay(1000);
}
(不等号は全角に置き換えてあります)


(2)4ピンと8ピンのライブラリ間の互換性

その逆に、4ピンモードで動いていて8ピンモードでは
使えない機能というのもあります。
ライブラリのヘッダファイルの中に以下のような
ところがあります。
//no room for following functions:
void home();
void setCursor(int index);
void shiftDisplayLeft();
void shiftDisplayRight();
*/
コメント化されています。つまり、この4つの関数は
8ビットモードでは使えないということです。
カーソル位置指定も使えないのかぁ…。


(3)2行LCD対応について

8ビットモード+300円の1行表示LCDでは左の
8文字しか表示できなかったわけですが、壊れているせい
なのかそれとも制御に問題があるのか、原因の切り分けが
出来ないので↓こんなゲタを作って実験してみました。

(ブレッドボード用の部品として店頭に並んでても
 いいんじゃないかと思うんですが、自作するしか
 ないんですねぇ)

このゲタに、普通の16文字2行タイプのLCDを
繋いでみます。

こんなんなりました。↑

実は、ライブラリの初期化ルーチンにまた手を加えて、
2行モードに初期化しなおそうとか、カーソル位置を
制御して2行目に文字を出そうとかしてみたんですが、
今のところまだ上手く行ってません。
なので、2行目には何も表示されてません。

http://www.arduino.cc/playground/Code/LCD4BitLibrary
ここからのリンクをパラパラと眺めていると、20文字×4行
LCDの対応が進められていたりなど、ぼちぼち進展している
ようなのですが、まだ良く読んでません。

もしかしたら、既に解決法がどこかに書いてあるかも
しれませんが、少なくともライブラリをダウンロード
してくればサクッと使える状況にはまだなっていない
ようです。

(PICとCCS-Cではいとも簡単に初期化と表示が
 出来て、その後文字列+整数値とか、文字列+浮動小数
 とかを”printf”的にフォーマット付けて表示
 するのに頭を悩ませていた記憶があるんですけどね)

(4)4ピンモード時のDB0~DB3ピンの処理について

4ピンモードの時はデータはDB4~DB7だけ
使用するので、DB0~DB3はマイコンに繋ぐ
必要がありません。このピンをどうしたらいいか
という話です。

以前、後閑さんのPICの本を買ったときに、これら4本
のピンはGNDに落としてあったと記憶しているのですが、
そのせいでネット上に公開されている数々の回路図に
特に違和感を感じなかったのですが、http://www.oct.zaq.ne.jp/i-garage/trbl/lcd4bit.htm
↑こちらのページに、これらの4ピンの処理について
色々解説されています。
要は、内部でプルアップ(抵抗値:数十kΩ)されている
ため、GNDに繋ぐと電力を消費するということと、
万一R/Wが出力モードになってしまった時には、
HIGH信号とGNDがショートする恐れがある、という
ことでした。
で、結論は「4本ともオープンにして置くべし」とのこと。

なるほど。逆に、GND電位(LOW)ではなく、
プルアップ(HIGH)になって困ることは無いのかなぁ
と思い、初期化コマンドなどを見直してみたんですが、
特に問題ないはず。

というわけで、今回載せた写真では、一部4ピンだけ
接続した形になっています。


うーん、まさか液晶表示器でこんなに時間を取られるとは…
(TへT)

液晶表示器は、人間にとってとてもわかりやすいUI
なので、是非もっと簡単に使えるようになって欲しいなぁ。


(後日追記)
arduino0017バージョンでLCDライブラリが一新
されたんですが、そしたらだいぶイイカンジに
動くようになりました。詳しくは↓の日記で。
http://brown.ap.teacup.com/nekosan0/722.html



コメント ( 2 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする




LCDライブラリ、かなりの曲者です!

arduinoのライブラリを使ってみる実験の続き。
キャラクターLCDライブラリを繋いで文字を
表示してみました。
ちなみにライブラリを使わずにベタにコーディング
したモノも公開されています。↓これ。
http://www.arduino.cc/en/Tutorial/LCD8Bits
せっかくなので、便利なライブラリを使ってみます。


液晶表示器ですが、秋月でずいぶん前に買った
HD44780U互換チップ登載の1行16文字表示
LCD(時価300円)が死蔵されていたので、それを
使ってみることに。
これは他のLCDモジュールと違って、14本のピンが
一列に並んでいるので、ブレッドボードにはもってこい
かと。(写真は下のほうにあります。)

ライブラリは8ビット用と4ビット用の2種類が公開
されています。どちらもOfficial Librariesではなく
Contributed Librariesとして公開されています。

いつものようにライブラリのzipファイルをダウンロード
後解凍して、\arduino-0011\hardware\libraries\ の下に
フォルダごと放り込んでおきます。8ビット版、4ビット版
それぞれ、
#include <LiquidCrystal.h>
#include <LCD4Bit.h>>
でコンパイル時に取り込めます。(不等号は全角に変えてます)

配線は↓このページのとおりなので迷うことはないでしょう。
http://www.arduino.cc/en/Tutorial/LCDLibrary

さて、サンプルスケッチを元に適当なスケッチを作り実行。
↓こんな感じ。

#include <LiquidCrystal.h>

LiquidCrystal lcd = LiquidCrystal();
char string1[] = "1234567890";
void setup(void){
lcd.init();
}
void loop(void){
lcd.clear(); //clear the display
delay(1000); //delay 1000 ms to view change
lcd.printIn(string1);
delay(1000); //delay 1000 ms to view change
}


コンパイルエラー。エラーメッセージを眺めると、
内部で二重定義をしているところがある様子。
ネットを検索してみると、やはりハマッた人が
散見されます。
仕方が無いのでライブラリを眺めてみます。
(うーん、またしてもライブラリの中身を探ることに…)

ライブラリの間違え個所はわかりました。ただ、
どう直せば正解なのかは詳しくわかりません。
ひとまずライブラリの先頭から5行目くらいの所から
数行を以下のように変えて、事前に定義されている時は
取り込まない様にしてみました。↓

(修正前)
extern void pinMode(int, int);
extern void digitalWrite(int, int);
extern int digitalRead(int);
extern void portMode(uint8_t, uint8_t);
extern void portWrite(uint8_t, uint8_t);
extern uint8_t portRead(uint8_t);
(修正後)
#ifndef Wiring_h
extern void pinMode(int, int);
extern void digitalWrite(int, int);
extern int digitalRead(int);
extern void portMode(uint8_t, uint8_t);
extern void portWrite(uint8_t, uint8_t);
extern uint8_t portRead(uint8_t);
#endif

(…#ifndef~#endifで括っただけです。)

いずれにしても、Official Librariesではないので
今後ライブラリの中身自体がコロコロ変わること
でしょう。

これでひとまずコンパイルは通り、表示自体は
そこそこ出来るようになりました。


が、ここでまた問題発生。初期化ルーチンの内部処理です。

初期化時に、画面モードが1ライン用になっている
様ですが、今回試用したLCDは左8文字と右8文字の
アドレスが連続していません。多分2行表示モードだと
左8文字が1行目、右8文字が2行目に相当するアドレス
だと思います。
その結果、8文字以上表示すると途切れてしまいます。

画面モードを変更してみようという作戦に。

ライブラリ内では初期化コマンドを定数として
持っていて、それを順々に出力しているんですが、
これを初期化関数init()で設定することが出来ません。

仕方なく、またもやライブラリの定数定義をちょこちょこっ
と直してみます。が、思うように上手く動きません…。


どちらかというと4ビットモードで動かすことを
ひとまずのゴールに置いていたので、あまり8ビット
モードばかりでグダグダして居たくないし…。

ひとまず放置しておいて、4ビットモードを試して
みることにしました。

ところが、4ビットモードでも一ハマってしまいましたよ。
長くなったので、この続きはまた後ほど書きます。

それにしても、PIC用CCS-Cで液晶表示した時
と比べると、まさにドハマリという感じでした…(〒へ〒)
arduino + 2行LCDには鬼門があるようです…



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする