手作りの大型7セグメントフルカラー表示器を使った置き時計

夜中に目が覚めた時、もう一寝入りするか、そろそろ起きるか、知りたくなりますね。身動きせずにねぼけた目を開けるだけで時刻がわかる大きなデジタル時計が欲しいと思いました。日中は明るくカラフルで楽しい表示でも、暗くなったらまぶしくない明るさで落ち着いた色で表示してくれる時計があったらいいですね。

アナログの掛け時計は秒まで合っていなくとも気になりませんし、数分違っていてもそのまま放置している人が多いと思います。時刻表示がついている家電製品は身の回りにたくさんありますが、多少時刻がずれていても気にならないものです。でも、大きくて目立つデジタル時計の場合は分単位でキビキビ生活している人でなくとも、テレビの時報や朝の時刻表示とずれていると残念な気持ちになるでしょう。

さて、一般的には数字を表示する方法として7セグメントLEDが使われています。大きな7セグメントLEDも販売されていますが単色でしか光らず高価ですので、手作りで大きな7セグメントLEDを作ってみようというのが私の提案です。
普通のRGBフルカラーLED(例えばOSTA5131A-R/PG/B)を制御するには3本のPWM出力が必要です。1桁分に7個のRGBフルカラーLEDを使うと21本のPWM出力ですから電気回路が大変になります。そこでLEDに制御用マイコンが入っているフルカラーシリアルLEDテープを使用します。NeoPixel Digital RGB LED StripとかWS2812B led strip lightとか色々な名前で販売されています。1セグメントに2個*7セグメント*4桁=56個のLEDを使うと、価格は、例えばスイッチサイエンスで購入したとすると、3000円ぐらいです。AliExpressをうまく使えれば1/5ぐらいの値段で手に入ります。

置き時計のアバウトな仕様
・数字は縦10cmぐらいの大きさ
・時分だけ表示(時刻合わせは秒まで)する
・環境光により夜昼モード切り替えできる
・インターネットや電波(標準電波、GPS)がいらない
・USB給電

ハードウェア
・Arduino (Nano互換機)
(Amazon)HiLetgo Nano V3.0 (380円@170705)
・バッテリーバックアップ付きリアルタイムクロック (DS3231)
(Amazon)HiLetgo DS3231時計モジュール (210円@170705)
・照度センサーと抵抗(22kΩ)
(秋月)照度センサ NJL7502L (100円/2個)
・フルカラーシリアルLEDテープ
・タクトスイッチ2個

配線
Arduino Nano
D2————-Rボタン(他端はGND)
D3————-Lボタン(他端はGND)
D7————-SerialLED信号
5V————-VCC(SerialLED)
GND————-GND(SerialLED)
A0————-NJL7502L(短い足)と抵抗(22kΩ)を通してGND
5V————-NJL7502L(長い足)
A4————-SDA(DS3231モジュール)
A5————-SCL(DS3231モジュール)
5V————-VCC(DS3231モジュール)
GND————-GND(DS3231モジュール)

ソフトウェア
– – – – メイカーフェア東京2017で使用したスケッチ(SimpleClock31)
昼夜モードの判断は照度センサの値を10回測定した平均値で行って、閾値付近でモードの切り替えが頻繁に発生することを防止しています。昼はカラフルなrainbowCycleをベースにしました。rainbowCycleは明度が一定で色相が360度回転する関数でAdafruit_NeoPixelライブラリのサンプルスケッチのstrandtest内で使われています。夜は明度を落としてオレンジ色の光で表示します。

どちらのモードでも時刻の取得、時刻設定ボタンの状態チェック、56個のLEDの点灯設定、点灯、待機(delay)を繰り返します。時刻の取得はRTCライブラリの関数で現在の時刻を調べて、表示している時分と異なる場合は4桁の数値の更新と全てのLEDについて1(ON)か0(OFF)か配列に書き込みます。時刻設定ボタンの状態チェックで、両方のボタンが一定時間押されていれば時刻合わせモードに入ります。

時計合わせがプログラムの半分ぐらいを占めていますのでフローチャートを書いてみました。

(170811)

Makers Faire Tokyo 2017に出展します

8月5日、6日に東京ビックサイトで開催されるMakers Faire Tokyo 2017に出展できることになりました。

私のブースのメインの展示品は「手作りの大型7セグメントフルカラー表示器を使った置き時計」です。

デジタルクロック(RTC:DS3231版)の記事から若干の変更を行いました。1セグメントに1個だったLEDを、1セグメントに2個に増やして視認性を向上しました。LEDの配線が大変な手間でしたので、CNCルーターでプリント基板を作成してハンダ付けを楽にして、信頼性も少しだけ向上したと思います。プログラムも変更が必要でしたので別の記事としてアップしたいと思います。

(2017.06.26)

 

デジタルクロック(RTC:DS3231版)

リアルタイムクロックDS3231を使用したデジタル壁時計を作成します。

DS3231

 

 

Arduino Nano
OLYMPUS DIGITAL CAMERA

 

使う主な部品
Arduino Nano互換機DS3231シリアルRGB LEDで作成した時計表示板照度センサー押しボタンスイッチ2個、22kΩ抵抗1本(照度センサー用)

購入したRTC基板はコイン型リチウムイオン電池(LIR2032)の充電回路が組まれているのですが、購入時に入っているのは充電できないCR2032なので私は充電のパターンをカッターでカットしました。

機能の説明
GPSやNTPサーバーの正確な時計に定期的にアクセスすれば、手動で時刻合わせをする必要がありません。市販の時計のようにボタンで時刻を合わせるのはプログラムを考えるのが大変なので避けてきたのです。以前使ったリアルタイムクロック(RTC)DS1302はひどく精度が悪くて一晩で数分ずれていましたので、RTCは諦めてGPSに頼り切った方が楽だなと考えていました。GPSでも我が家のような木造で窓際ならば問題ありませんが、ビルの中でも使えるかというとさすがに無理な場面も出てくるでしょう。

そんなことを考えながらDS1302よりも高精度と言われているDS3231を試しに購入したところ、カタログ性能は文句のつけようもなく良くて、数日使ってもDS1302とは比べ物にならないほど正確に時を刻んでいます。

しょうがないのでボタン2個で時刻を合わせるプログラムを書くことにしました。ついでに機能も追加して時計としての魅力をUPさせました。部屋の明るさを照度センサーで検知して、暗い時には明かりを抑えたナイトモード、明るい時には華やかなフルカラーモードにしました。表示した数字の色が徐々に変化するようにプログラムしたのですが、AdafruitのシリアルLEDのデモプログラムのRainbowに数字表示のマスクをかけて比較的シンプルに実現させました。アナログの壁時計なら数分ずれていても許せるのですが、デジタルの場合は、朝のテレビ画面の隅で表示している時刻とつい比べてしまうので、秒の表示は無くても同じタイミングで切り替わって欲しいものだと感じます。数字の色の変化はゆっくりなので、時刻表示が切り替わる時にはR→G→Bでフラッシュしてちょっと注意を引くような小細工も入れました。

ボタン2個の同時押しで、時刻合わせモードに入ります。モードが変わったことが直感的に分かるように時刻合わせモードの時は緑です。時→分→秒の順でセットするのですが、ボタンを押さずにいると自動的に時刻合わせモードから抜けます。

時刻合わせモードに入ると”時”だけを緑色で表示します。右ボタンで1アップ、左ボタンで1ダウンします。”時”が合わせ終わったら、ボタン2個の同時押しで、”分”だけを表示します。アップダウンは同様ですが、PCなどの秒まで分かる正確な画面を見て1分先に合わせます。設定したら2個の同時押しで、時分を表示します。PCの秒表示が”00″になる時にどれかボタンを押すとPCの時刻と運動神経レベルで一致させることができます。

回路図
Eagleを勉強中なのでそのうち練習を兼ねて書こうと思います。
照度センサーの短い足を22kΩの抵抗でGNDに落としています。長い足は5Vです。短い足の電圧をA0ピンで測定します。LEDの信号はD7、スイッチはD2とD3、RTCのSDAがA4でSCLがA5です。

プログラム
RTCのライブラリはRTClibを使いました。半分以上は時刻合わせのために書かれています。rainbowCycle()とnightClock()が通常の時計機能でリストの下の端に書かれています。大部分の時間それらの関数の中で動作しているので、時刻合わせモードに入る関数wantAdjust()はそれらの関数の中に置かれていて、”2個の同時押し”を検知するとadjustClock()に入って時刻合わせが始まります。
表示に関してはint ledClock[28]とint ledMask[28]でLEDのON/OFFを行っているので比較的シンプルにできているのではないかと思います。

 

(2017.03.30)

 

「おしゃべり伝言パック」を組み立てる会(2017年2月18日)

— 難しいことは置いといて、電子工作を始めよう —
電子工作 冬のイベント(2月18日土曜日)@オガール2階
<<事前申し込みが必要です。>>
オガールのITサポートまで直接申し込みに来ていただくか、下記までメールをお願いします。
info@go-forward-japan.org
会費は1000円の予定です。出来上がった「おしゃべり伝言パック」は持ち帰って活用してください。

ベースはサウンドボトルです。マイクを取り外すのは難しいのでパックを開けて録音します。

サウンドボトルの記事と重複しますが、部品リストを書いておきます。
ISD1820 音声録音再生モジュール
Arduino Nano互換機
超音波距離センサー
USBポート付き充電用電池ボックス(100円ショップのCan Do(キャンドゥ))
USB(Mini-B)ケーブル
ブレッドボード
ワイヤー、ピン、ランチパック
中国直送は春節の影響なのか軒並み在庫なしの表示(170125現在)です。私が注文した分は発送済みなので来週届く予定です、多分。

ランチパックにしたのは中の構造が見えると楽しい気がするからです。加工が楽で値段が安くて言うことなしです。

組み立て終わって一通り楽しんだら、レーザーカッターでケースを自作する楽しみも残してあります。ケースはスピーカーボックスを兼ねますから私はバスレフ型を考えたいなと思っています。

Digital Wall Clock (1st trial)

寝室用に明るさを抑えた壁掛けデジタル時計を作りました。

ESP8266(ESPr Developer)でRTCから時刻を読んで、7セグメント表示器風にフルカラーLEDを28個配置して時刻を表示します。せっかくのフルカラーLEDなのでランダムに表示の色を変更します。1日1回NTPサーバーにアクセスして時刻を校正します。照度センサーで室内の明るさをモニターして暗くなったらLEDも暗くします。

ESP8266は時分の表示が終わると、電力削減のため50秒間Deepsleepします。NTPサーバーにアクセスする直前はWiFi ONで起動し、それ以外はWiFi OFFで起動します。

LEDの信号線は15ピン、照度センサーは20kΩと10kΩで分圧してTOUTピン、RTC(DS1302)は3ワイヤーという通信なので CLKを12ピン、DATを13ピン、RSTを14ピンに接続しました。Deepsleep後の起動用に16ピンをRESETに接続します。

筐体は5mm厚のMDFをレーザーカッターで切り抜きます。セグメントの中央にLEDを配置して表面に経木(紙のように薄い板)を貼りました。セグメント内での光の均一性にもう一工夫必要です。

 

 

2017.1.21

5V駆動のステッピングモーターを試す

28BYJ48 DC 5V 4-フェーズ5線式ステッピングモータとULN2003ドライバボード
これも去年の春に購入したまま眠っていたパーツです。中国直送で200円前後で購入できます。

便利なライブラリを見つけて動かしてみたという段階です。通常のstepperライブラリではなく、AccelStepperというライブラリを使うことでハーフステップで滑らかに駆動することができます。28BYJ-48モーターでの使い方は42Botsの記事に従いました。

回転数は1000pps(およそ15rpm)が上限で、それ以上はトルクが小さくなり指でシャフトをつまむと止まってしまいます。

 

 

サウンドボトル

去年購入して手をつけていなかった音声録音モジュールを使ってみたら意外に機能がしっかりしているので「お客さんが近づくと声をかける」サウンドボトルを作ってみました。ヨーグルトの空きボトルでスピーカーボックスを作ったのでしっかりした音量で再生します。音質は誰が録音したのかわかる程度に良い音です。

モジュールにはマイクがハンダ付けされていたので取り外してボトルに取り付けました。マイクを外した時に基板のパターンも剥がれて、それを修復するのに苦労しましたのであまりお勧めしません。

主な部品
ISD1820 音声録音再生モジュール 169円
Arduino Nano互換機 330円
超音波距離センサー  164円
USBポート付き充電用電池ボックス(100円ショップのCan Do(キャンドゥ))
タクトスイッチ、ブレッドボードなど

動作
タクトスイッチを押しながらマイクに向かって最長10秒録音する。物体が75cmよりも近づくと録音してある音声を再生する。

スケッチ

 

 

美しいミニマリズムの8pinoで光る置き物を作る

最近のArduino IDEではボード追加で8pino(Trinket 8MHz)をプログラミングできるようになりました。価格は888円なので中国直送互換機には及びませんが、ボードの小ささでは群を抜いています。

I2Cの加速度センサーで姿勢を検知して傾けるとフルカラーLEDの色や光の強さが変わるようにプログラミングしてみました。

用意した機材
8pino
GY521(加速度・ジャイロセンサー)
マイコン内臓フルカラーLED

機能
加速度センサーで置き物の前後左右方向の傾きに応じて目に配置された2個のLEDの色と明るさが変化します。不感帯を設けて垂直に静止している時には光らないようにしています。

メモリーが小さいのでプログラムもミニマル目指して推敲を重ねました。「最大5,310バイトのフラッシュメモリのうち、スケッチが5,176バイト(97%)を使っています。グローバル変数は69バイトのRAMを使用しています。」

 

Arduino GPSロガー (Pro Mini 3.3V版)

道路施設の維持管理のために適切な予防保全が必要と言われていますが、人口が減少がしていく中で山間の生活道路の質を維持するために、コストをかけずに客観的な情報を蓄積していけるシステムが望まれているのではないでしょうか?

Arduino GPSロガーは路面のデコボコの振動を加速度センサーにより定量化しGPSによる位置情報とともにSDカードに記録して路面診断用のデータを蓄積するツールです。

使用するパーツ
Arduino Pro Mini 328 3.3V 8MHz(スイッチサイエンス 1,243 )
あるいは互換機 EasyWordMall Pro Mini モジュール Atmega328 3.3V 8M Arduino用 (EasyWordMall 375円)

GPS受信機キット (秋月電子通商 2200円)1PPS出力付き

マイクロSDカードスロットDIP化キット(秋月電子通商 300円)

MPU-6050 使用 3軸ジャイロスコープ・3軸加速度センサー モジュール(GY-521)(Umemoto LLC 198円)

動作の概要
電源はIoT機器用モバイルバッテリー cheero Canvas 3200mAhがお勧めです。一般的なモバイルバッテリーでは消費電力が小さすぎて自動的に給電が停止してしまいます。USBケーブルの電源線から5VをPro MiniとGPSモジュールに給電し、Pro Miniから供給される3.3VでSDとGY-521に給電します。
GPSから日付、時刻、緯度、経度、捕捉衛星数を読み取ります。加速度・ジャイロセンサーから約50msec毎に200回データを読み取り、進行方向の加速度の平均値と標準偏差、上下方向の加速度の平均値と標準偏差、左右方向の回転角速度の平均値と最大値と最小値を求めます。
測定の周期はおよそ14秒でしたが、日付から自動生成されるファイル名のファイルmm_dd.txtにカンマ区切りで追記されます。

16.12.31追記
GPSでの時刻はUTC(世界協定時)で出力されるので日本では9時間加算する必要があります。日付の繰り上がりなどを考えると面倒なのでUTCで我慢していましたが、落ち着いて考えると日本時間の9時にファイルの日付が変わるのでそれはそれで面倒です。時差を反映させるTimeというライブラリを見つけましたので、実装しました。

データ表示
オープンソースソフトウェアのQGISを使用して表示します。国土地理院のタイル地図に測定点を表示します。例として振動が大きかったポイントは赤い大きな星印、振動が少なかった地点は小さな丸印で表示しています。
結線
(Arduino Pro Mini 3.3V)
[GPS–Pro Mini]
5V–5V
GND–GND
RXD–NC
TXD–D2

[SD–Pro Mini]
DAT2–NC
DAT3–D10
CMD–D11
VDD–3.3V
CLK–D13
VSS–GND
DAT0–D12
DAT1–NC
SWB–NC
SWA–NC

[GY-521–Pro Mini]
VCC–3.3V
GND–GND
SCL–A5(SCL)
SDA–A4(SDA)
XDA–NC
XCL–NC
ADD–NC
INT–NC

[LED–Pro Mini]
RED LED–D9
GREEN LED–D8

時差対応版

UTC版

 

QGIS上でGoogle Satelliteに表示した例です。三陸海岸を探索していた軌跡です。

ACC4LVでMPU-6050を使ってみる

** LabVIEW Advent Calendar 2016 ** 2016年12月3日の記事です。

MPU-6050は加速度3軸とジャイロ3軸を内蔵したI2C接続のセンサーで、GY521というモジュールで安価に入手することができます。私は安いので海外直送のGY521を使っていますが、中国から送料無料で商売になるのが不思議です。

仕様書にはジャイロはフルスケール(±250, ±500, ±1000, あるいは±2000°/sec (dps)) を16ビットADC、加速度はフルスケール(±2g, ±4g, ±8g, あるいは±16g)を16ビットADCで測定し、OUTPUT DATA RATEはジャイロが最大8kHz、加速度が最大1kHzと書かれています。

Arduinoはお気に入りのESP8266WiFiモジュールです。使い勝手が良いESPr Developer(ESP-WROOM-02開発ボード)を使います。Arduinoでの使い方は購入元のページにリンクがあります。LabVIEWでプログラムを書いてコンパイルして書き込む場合でも、初めにArduinoで基本的な動作を確認するのが良いでしょう。Arduinoが初めての場合はArduino UNOからスタートするのが苦労が少ないと思います。中国直送の互換ボードは安いし、(経験上)きちんと動きますが、USBシリアル変換チップがCH340なので、ネットでドライバーを探してくる必要があるかもしれません。

pb280115

ESPr DeveloperとGY521との接続は4本だけです。
3.3V <—> VCC
GND <—> GND
SCL <—> IO5
SDA <—> IO4

Arduinoでの動作確認のためのサンプルプログラムはArduino Plyagroundのものを使いました。LabVIEWへの移植も基本的にはこれに従いました。

LabVIEWでArduinoにプログラムを書くことができるツールが「Arduino™ Compatible Compiler for LabVIEW」です。名前が長いのでACC4LVと縮めて書いています。使える関数が限定されているサブセット版なので多少の工夫が必要です。例えばU16からI16への変換がありません。どうしましょ。

 

Arduinoのサンプルを素直に移植するとこんな感じです。
mpu-8050d

 

14要素のU8配列を7要素のI16に変換します。U8を2個を上位、下位で合わせてU16になるのですが、I16にする必要があります。U16–>I16の変換はACC4LVには無いので、加算で出力をI16にしています。
sub__rawtoi16d

I16を加速度、温度、ジャイロの単位に変換します。
sub__i16tovalued

シリアル出力用の文字列に変換します。
sub__valuetostringd

 

では、では、