こっちでもこっそりやってますので、よろしければどーぞ
つづく
こっちでもこっそりやってますので、よろしければどーぞ
つづく
こっちでもこっそりやってますので、よろしければどーぞ
HV4622とか、使えそうなシフトレジスタの型番まで調べちゃうくらい考えましたが、Arduino側のプログラムが少しめんどくさそうだったのと、表面実装部品をうまいこと扱える自信がなかったので、一旦これは次回作以降に持ち越しにすることにしました。
つづく
こっちでもこっそりやってますので、よろしければどーぞ
ベランダ産の生物兵器。
オーリオピカンテ作ろうっと。
どうにか配線を終わらせた時にはすでにぐったり。
で、コイツを、Arduinoに接続してニキシー管をドライブしてみると
こんな感じになります。
お。
いいかんじです。
===============
つづく
「諸君 私はLチカが好きだ
諸君 私はLチカが大好きだ
狙い通りの点滅を繰り返すLEDが大好きだ
電源を切るまで点滅を続けるLチカが好きだ
たった1つのLEDが寂しく光る姿も大好きだ
たくさんのLEDが連携して輝く姿には感動すら覚える
諸君 さらなるLチカを望むか? 嵐の様なLチカを望むか?」
「Lチカ! Lチカ! Lチカ!」
「よろしい ならばLチカだ
Lチカを! さらなるLチカを!」
===============
という訳で、Lチカ(LEDをArduinoでチカチカさせるんだぜ、の略)です。
RTCで時間をシリアルモニタに出力することができることはわかりました。
同じようにして、GPSからの信号を受信してシリアルに出すことにも成功しました。
こんな感じで、GPSからのデータを受信してます。
ってか、GPSってこんなに大量のデータを送ってきてたんだねぇ、知らなかったよ。
衛星番号なんかをよーく見ると、日本の打ち上げたGPS衛星、みちびきのデータも入っていることがわかります。
さて、詳細なところはまた別な機会に書くとして・・・
時刻のデータはでに入りました。
その出力を、数字6桁に変換して各GPIOのピンに出力します。
今回は、ニキシー管1桁あたりGPIO4本を使ってBCD出力というやつをやります。
数字の表記に使用するのは0〜9までの数字です。
なので、これを2進数で表すと
0000--------0
0001--------1
0010--------2
0011--------3
0100--------4
0101--------5
0110--------6
0111--------7
1000--------8
1001--------9
となります。
これは、1桁あたり4ビット、GPIOのピンが4本必要になることを示しています。
これを配列に入れて、該当の数字がヒットしたら呼び出す様にプログラムを書いてっと。
他にも必要なものを取り付けたいので、いったん今考えている最低限必要な機能を実現するために、ピンの割り当てを設計します。
こんな感じのピン割り当てになりました。
まず、LCDのパラレル接続用に、
2,3,4,5,6,7
の6ピンを確保。
GPS用のシリアル通信用に、
16,17
の2ピン
RTCのI2C通信用に、
20,21
の2ピン
将来的にコロン表示が欲しくなって、かつコロンを1個ずつ制御できる様に、コロン用のピンとして
46,47,48,49
の4ピンをコロン用として確保します。
さらに、
ニキシー管のON/OFF用に、50
GPSとRTCの切り替え用に、51
GPSとRTCの手動同期とデバック用に、52
の各ピンを割り当てます
最後に、ニキシー管としては、
数字1桁目 22,23,24,25
数字2桁目 26,27,28,29
数字3桁目 30,31,32,33
数字4桁目 34,35,36,37
数字5桁目 38.39.40.41
数字6桁目 42,43,44,45
の24ピンを割り当てました。
これをそれぞれSN74141NドライバICの入力に入れて、ニキシー管のカソード制御を行います
いわゆるスタティック点灯、という方式です
つまり6桁のニキシー管の表示に、24本のGPIOを使い、6個の74141ドライバICを使用するという、なんとも対艦巨砲的な設計になります。
ダイナミック点灯制御?シフトレジスタでピン節約?ドライバICの節約?回路規模の小型化?
何を言ってるんですか
そもそもニキシー管を使って時計を作るっていう行為自体がロマンなのですよ。
ならば、全部ロマンで行こうじゃありませんか。
まぁ、こんな理由で、GPIOの数が多いArduinoMegaを選択した訳です。
これをLチカとして動かすと、こんな感じになります。
わかりにくいですが、左からLED4個1組で時計の数字を2進数表記しています。
時刻情報はGPSから取得して、変数に入れたあと各桁にバラして、それをBCD出力して、LEDに接続してみました。
LEDがいっぱい。
Lチカわーい♪
この4本で1桁分になっているArduinoからの出力を、ドライバICに投入してやれば、とりあえずニキシー管は点灯できるはずです。
つづく
こっちでもこっそりやってますので、よろしければどーぞ
5月某日。
引っ越した部屋は、築50年のマンションで、設備が古いです。まぁとにかく古いです。
なので、実は色々手を加えています。
もちろん、賃貸なので、現状復帰ができる様にしておくことが前提なのでけど。
いつかそのうち、その辺りのことも書けたらとは思っています。
ざっと挙げると
・トイレのウォシュレット化
・インターフォンをカメラ付きに変更
・キッチン手元灯を蛍光灯からLEDリボンを使った照明に変更
・玄関の電灯を人感センサーで自動点灯する様に変更
・キッチン天井照明の変更
・キッチンカウンターの自作
・キッチン換気扇の配線変更
・キッチン換気扇と照明の操作パネル自作
・脱衣所に壁面棚の自作と設置
なんてことをやっています。
ニキシー管時計がなかなか完成しない亀の歩みなのは、そんなことをやりながら空き時間で作っているからでもあります。
(the!言い訳)
==========
ArduinoにRTCを接続して、時計として動かすために、
「RTClib.h」と「Wire.h」のライブラリを追加しました。
基本的には、初期化して、RTCに時間をセットして、シリアルモニタで読み出せば、時刻が表示されるはずです。
便利なことに、ライブラリにはサンプルプログラムがついていますので、それを使って時刻を表示させるところまではすんなり行きました。
RTClib.hに付属のDS3231用サンプルプログラム
「ds3231.ino」
====================
#include "RTClib.h"
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
void setup () {
#ifndef ESP8266
while (!Serial); // for Leonardo/Micro/Zero
#endif
Serial.begin(9600);
delay(3000); // wait for console opening
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, lets set the time!");
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
}
void loop () {
DateTime now = rtc.now();
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.print(" since midnight 1/1/1970 = ");
Serial.print(now.unixtime());
Serial.print("s = ");
Serial.print(now.unixtime() / 86400L);
Serial.println("d");
// calculate a date which is 7 days and 30 seconds into the future
DateTime future (now + TimeSpan(7,12,30,6));
Serial.print(" now + 7d + 30s: ");
Serial.print(future.year(), DEC);
Serial.print('/');
Serial.print(future.month(), DEC);
Serial.print('/');
Serial.print(future.day(), DEC);
Serial.print(' ');
Serial.print(future.hour(), DEC);
Serial.print(':');
Serial.print(future.minute(), DEC);
Serial.print(':');
Serial.print(future.second(), DEC);
Serial.println();
Serial.print("Temperature: ");
Serial.print(rtc.getTemperature());
Serial.println(" C");
Serial.println();
delay(3000);
}
====================
こいつを動かすと、シリアルモニタ上に時間とか温度とかが表示されます。
すげー
ところが!
なんということでしょう、RTCで表示している時間が、1時間に60秒以上ズレてしまいます。
DS3231のRTCモジュールには、温度計センサーも搭載されていて、室温を表示できるのですが、室温が摂氏220度だって言ってますよ、こいつ。
試しにモジュールに実装されているICを触ってみると
「あッつっっ!!」
ってくらい、熱くなってます。
なんだ?なにがあった?
接続を間違えたのか、プログラムを間違えたのか?いやサンプルコードそのまんまだぞおい。
色々と調べてみましたが、接続もプログラムも問題はありません。
この問題はしばらくの間、頭を悩ませることになります。
解決したのは、念のためと別なDS3231RTCモジュールを接続してから。
安いからと3個セットを2個で合計6個ものRTCを買っていたことが功を奏しました。
そう。
ただの初期不良でした。
違うRTCを接続すると、あっさり正常に動き出しました。
こうなると全部確認したくなるものです。
その結果。
手元にある6個のRTCのうち、2個について、時間や温度のズレが激しく、使い物にならないことがわかったのです。
中国製のクオリティを舐めていました。
不良品率が高いシロモノだった、それも6個中2個、つまり不良品率33.3%!
首位打者も驚きの打率です。
とりあえずこの日は、これで力尽きました。
つづく
こっちでもこっそりやってますので、よろしければどーぞ