ラベル デジタル時計 の投稿を表示しています。 すべての投稿を表示
ラベル デジタル時計 の投稿を表示しています。 すべての投稿を表示

2016年1月27日水曜日

お風呂時計(第三回・小改良)

■少しだけ改造■

はい、続きです。


電池が弱くなると実際より明るく判断してしまう傾向があるようで、風呂場の照明を切っていても脱衣場を点灯すると時計のスイッチも入ってしまいます。

また、ちょっと向きを変えたりした時に手で影ができると計時が止まってしまい、入浴時間ゼロに戻ってしまいます。

ということで、時計が点灯中は、暗くなったかどうかの基準値をより小さくします。つまり、一度点灯したと判断したらかなり暗くしないと止まらないよ、という改造。今までは明暗の判断を1つの数値(45)で行っていたのですが、今回、明るくなったという判断には60、暗くなったという判断は50にしてみました。これで使用中にちょっと影になっても止まらなくなりました。

もう1つ、一度止まっても、30秒間以内に明るくすれば計時をリセットしないようにしました。これでちょっと影になっても、入浴時間がゼロに戻ることがなくなりました。

というわけで、フル充電した電池での開始時間は1/27 22:10です。

追記:終了は3/4 06:00でした。37日と8時間。「暗くなった」という判断値が大きすぎたようで、入浴後に脱衣所からふと風呂場を見ると点灯している、ということがしばしばありました。うーん、しかし、こうやってパラメータをいじって正解にたどり着いたとしても、それは「うちの風呂場で、今のLED電球使っていて」という限定条件ですからね。ここはやっぱり適応制御か何かしないといけない気が。それはそれとして、良いアルゴリズムを思いつくまで、とりあえず70 / 60で使おう←直さない予感 開始:3/4 21:00。

追記の追記:70 / 60だと横にてぬぐいを置いただけで消えてしまい、それはそれで面白いのですが、実用性にかけるので70 / 45にしました。再充電して3/5 08:25再開。

それにしても、こうやってバージョンごとにソースを張っているのはあまりにも頭が悪いので、github使います。

追記^3:あ、記録してなかった。もうちょっとLEDを暗くしたいのですががっちり配線してしまったユニバーサル基板に抵抗入れるのは面倒くさい。ので、デューティー比を変えてみたのですが1:500でもまだ十分明るいです。瞬間何mA流れてるんだろ。5月27日 5時再開。

追記@4:7月6日ぐらいから物凄く暗くなりましたが、7月9日の朝、まだ生きてます。でも、表示読めないしエネループ破損が怖いので止めます。7月9日 06:00。43日で思ったほど伸びなかったのですが、夏になって朝シャワーだけでなく夕方浴槽に浸かるようになったので1日あたりの点灯時間はほぼ倍になっているはず。さすがにデューティー比1:500は暗すぎたので、次は1:200ぐらいにしてみます。7月9日 17:00スタート。明るいw

追記@5:8月21日ぐらいから暗くなり、8月24日ほとんど表示は見えませんが、ここでおしまいにします。1:200だとチラツキが目立つので1:100にしました。デューティー比あんまり電池寿命と関係ないんじゃないか?という気がしてきました(笑)。ということで8月24日5時スタート。

追記@6:いきなり10月2日に消えました。明るいと電池の余力ないですね。でも、明るさと電池寿命はほとんど関係ないですね。精密な微小消費電流計測のできる機材が欲しい。ともあれ、1:100でほぼ支障ないので、そのまま継続。10月4日、電池セット。

2016年1月10日日曜日

Energiaでお風呂時計(第二回)


■追記(2016/01/27)■

ついに電池切れました。前回充電したのは12/22だったので、35日ほど動いたことになります。プログラムを改善したのはこの1/10のことだったので、かなり改造が効いている様子です。ついでに、明暗の制御を少し改良しました。

■続き■

前回の「Energiaでお風呂時計」、動くことは動くんですが・・・「無印の化粧品ボックス+ジップロック+ブレッドボード」という見た目があまりにも悲惨なので「100均の瓶+ユニバーサルボード」ですっきり仕上げてみました。

最初、透明な蓋の弁当箱を探したんですが、吉祥寺の100均では見つからず。とりあえず「防水」「透明」「適当なサイズ」というところで食品保存用と思われるプラスチック+金属蓋の容器にしました。

蓋が金属だと影が出来てしまって動作が安定しないのではないか?という懸念はありましたが、いまいち透明度の低いジップロックのロスが想像以上に大きかったようで、「明暗判別」の値を2倍近くにしないと消灯してくれない状態でした。

ユニバーサル基板は、部品沼から出てきた20年物のSUNHAYATO製、150円の値札が貼ってありました。さすがにフラックスが劣化しているのか、ハンダの乗りが悪い悪い。

ボードのレイアウトは下からLED、センサー、CPUです。LEDが割と重いので、安定させるために&蓋の影にならず見やすい位置、センサーは蓋の影にならない場所に上下逆さまに、残ったところがCPU。

明暗センサーはブレイクアウトボードにヘッダピンをがっつりとハンダ付けしてしまったのでIC用の背の低いソケットには使えず、かといってヘッダソケットを使うとLEDよりも出っ張ってしまうのでアウト。ということでユニバーサルボードに直接ハンダ付けしました。100円を越える部品を直接ハンダ付けするのは心臓がドキドキしますw

セグメントの配線には電流制限用の抵抗100Ω☓7個入れました。1kΩでも1.5mAぐらい流れるのでスタティックなら十分明るいのですが、ダイナミック点灯だとさすがに暗くてダメ。試行錯誤の結果と手持ち抵抗により100Ωになりました。

■で、起動しない■

で、組み上がったところでGND/VCCがショートしていないか確認してから電池つないでも起動してくれません。

電源電圧もI2Cのプルアップも正常。何せI2C以外はみんなDigital Outputという単純な回路なので、疑うところは「CPUがちゃんと動いていない」ということぐらい。ごく簡単なLチカプログラムを動かしてみても信号が出てきません。

となるとリセットが原因です。

ブレッドボード上では何も配線しなくても動いていたのですが・・・2553で前にもあったなー。というわけで、47kΩでプルアップしたところ、動作するようになりました。推奨回路ではコンデンサでGNDとつなぐようにも書いてあるのですが(電源を入れた時にしばらくGND近くを保って、リセットさせるため)、まぁ動いているから省略w

■起動したけど■



…なんだこの表示はorz

よくみると、

  • 中央が点灯すべきところで下が点灯している
  • 下が点灯すべきところでドット点灯している

ということで、3本の配線が間違ってました。せっかくワイヤの長さを揃えてきれいに配線したのに台無しですorz


なお、ユニバーサル基板と電池ボックス(単4☓3本)の固定には輪ゴムを利用しました。

■プログラム■

前のバージョンとほとんど変わっていません。変えたのは、前記の通り明暗を判定する値を大きくしたことと、明暗によってLEDの明るさを決める関数の演算式、それに秒表示の時のゼロサプラスをやめたこと、の3点です。

■ユニバーサル基板■

昔はブレッドボードがなかったので、抵抗の値を試行錯誤で決めるのも面倒でした。

今回、アホな配線ミスはありましたが、ブレッドボードで決まった通りに配線するだけなので、昔と比べれば大分ラクになりました。

でも、私は基本的にソフト屋なので、何の痛みも伴わないundoに慣れきっています。ユニバーサル基板で配線しながら考えていたのは「基板設計する方がラクだな」ということでした。配線ミスの修正を含めて、ユニバーサル基板の作成にかかったのは3時間ほどでした。このぐらいの基板設計なら2時間ぐらいで終わりますし、届いた基板へのハンダ付けも1時間かかりません。

昔は自分で1日かけてエッチングするか、数万円だして業者に頼むしかなかったんですが、今はカード決済で送料込み2400円ですからねぇ・・・。

基板を起こせば2枚目以降はあっという間に作れますし。まぁ、大抵の場合は需要ないのでそのまま未使用基板が増えていくだけなんですけどもw

2016年1月1日金曜日

Energiaでお風呂時計(第一回)

完成後、CPUもブレッドボード上へ移動

まぁ、またデジタル時計なんですけど。

使ったCPUはMSP430G2553ですが、開発環境はArduino互換なので、RTCを用意すれば簡単に移植することができます。ただ、nanoを使ったとしても消費電流を押さえるのはシンドいと思います。

■仕様■

  • 表示は4桁7セグメント赤色LED
  • お風呂なので電源は電池
  • 電池は1ヶ月ぐらいもたせたい
  • 時刻と入浴時間を交互に表示

■実装■

省電力で4桁の7セグを動かせる・・・ということで、CPUにはMSP430G2553を選びます。RTCは使わず、G2553に32768hzのXtalを追加して1秒ごとに割り込みを発生させて時計代わりにします。

さすがにLEDを常時点灯していては電池がもたないので、入浴時のみ表示するようにします。入浴中であることを検出するには、
  • 倒立スイッチ、風呂に入ったら時計を立てると点灯→一番簡単
  • PIRセンサーで人の動きを検出→簡単だけどお風呂のお湯で誤動作するかも?
  • 照度センサで明かりを付けたら動作開始
  • ドップラーレーダーで(ry
などいろいろ考えたのですが、ここはAPDS9930という照度・近接センサーを使います。ebayで「gesture sensor」って書いてあったのでAPDS9960みたいなことができるのかと思って買ったら単なる照度・近接センサーだった、というオチ。9960より劇的に安かったんですが、典型的な安物買いの銭失いでした。でも、寝かせて置くのももったいないので、使います。それに携帯電話用のデバイスなので、CDSなどで明るさを検知するよりも電力を消費しません(アナログの達人ならできるのかもしれないけど、動作時の消費電流250μA/待機時90μA,Sleep時2.2μAなんて回路を作るのは私にゃ無理)。

配線にはブレッドボードを使い、7セグLEDと電池ボックスは秋月です。

大きな声ではいえませんが、電流制限抵抗などは一切入れてません。Vf=1.8vの赤色LEDを使う場合には3.3v - 1.8v = 1.5v、5mAも流せば十分なので1.5 / 0.005 = 300Ωぐらいの抵抗をG2553とLEDのセグメント側の間に入れておくのが正しい使い方です。正しくない使い方をしているので「1」を表示している時と「8」を表示している時で明るさが異なってしまう(各桁を接続している端子に7セグメント分の電流が集中するので「8」のときは容量が足りなくなってしまう)のですが、まぁ自分用なので壊れなければOK。そのうちボード起こしたら抵抗入れるから、それまでがんばれG2553。

G2553への書き込みにはTIのLauchPadを使います。

ソフトはArduino互換のEnergia IDEを使って書きます。くれぐれもバージョン0101E0017と0101E0016は使わないようにお気をつけてください。

以下配線表。各セグメント7本と桁4本、電源、I2Cだけです。時計合わせはそのうち考えます。hourとminuteの間にコロンが点灯する表示器が欲しい(こないだaitendoで買ったら全品不良で点灯しなかった)。


MSP430G2553相手ピン備考
P1_47セグLED 11Seg A
P1_57Seg B
P2_04Seg C
P2_52Seg D
P2_21Seg E
P2_310Seg F
P2_45Seg G
P0_012Dig 1
P0_19Dig 2
P1_28Dig 3
P1_36Dig 4
P1_7APDS9930SDA
P1_6SCL
P2_6XTAL
P2_7XTAL


この他、電池の赤をブレッドボードの赤、黒をブレッドボードの青、G2553のVccとAPDS9930のVCCをブレッドボードの赤、G2553のGndとAPDS9930のGNDをブレッドボードの青、にそれぞれ接続します。


最初のバージョンは19日間動作しました(浴室使用時間は1日平均30分ぐらい)。LED駆動のデューティー比をかなり絞り込んだ現行バージョンは現在12日目ですが、さて。


■ハマり■

他のところに書いたネタもありますが:
  • 別のところ(Energia最新版でI2Cが動かない)に書いたけど最新のEnergiaを使ったらI2Cが動かなくなってしまった。2つ前のビルドをダウンロードしたら何事もなかったかのように動いた。うがあ。
  • 作業中にミスで電源逆接とG2553逆差しで2個トバしてしまった。
  • シリアルポートをGPIOでも使うとSerial.printなどを使った瞬間にリセットがかかる。まぁ当たり前なんですが……ライブラリの中のSerial.printで発症したために「ライブラリを呼ぶとフリーズする」という症状になり、ライブラリの問題か?と誤認してしまったために発見が遅れました。いやはや。
  • 明暗のスレッショルド設定にちょっと苦労しました。最終的にはセンサーからの値をLEDに表示させるプログラムを書いていろんんな向きで値を測定して閾値を決めました。やっぱ現場に行かんとダメやで。
  • 風呂場の明かりをつけているのに時計が消灯してしまうことがあって当初は上記閾値の問題かと思ったのですが、どうやらセンサーがLED電球の高速点滅の「滅」を拾ってしまうようで照明の明るさ/閾値設定とは関係なく発生します。なので、平均値を取るようにしました。ただ、センサーの値は1秒に1回サンプリングしており点灯時の明るさで500-700、消灯時の閾値が60という設定なので、LED電球を消灯してもすぐには時計が消えません。
  • ダイナミック点灯の合間にI2Cでセンサーを取りに行くと一瞬時計表示がチラついてしまいます。なので、時刻と入力時間を切り替えるときに読みに行くように変更しました。RTOS欲しい。
  • 照度に合わせてLEDの明るさを変えていますが、違いがわかりません。手で影を作ると少し暗くなるのでソレと判断できるのですが、あまり暗くすると消灯モードになっちゃいますし。

■ソース■

基本的には以前書いたデジタル時計の使い回しです。ArduinoでLEDのダイナミック点灯させるとだいたいこんな処理になっちゃいます。あと、APDS9930のライブラリはArduino用を使いました(APDS9930 Ambient Light and Proximity sensor)。

なんということもないダイナミック点灯プログラムなのですが、CPUのクロックを点灯中には8Mhz、消灯時には1Mhzに切り替えています。切り替えることでI2Cなどに影響がでないか心配だったのですが、問題ありません。1MhzだとG2553の消費電流は230μAで9930は220μA(スリープはさせていないが通信はごく低頻度なので消費電流はもっと低いはず)なので、まったくLEDを点灯させなければ2000時間程度は動くはずですが、点灯しない時計は意味がないので困ったものです。


2015年1月27日火曜日

MSP430/Energia+RTC+秋月巨大LED=デジタル時計

暗いとアラが目立たない

■またデジタル時計だ■

お前は他にやることがないのか、と言われるのは承知で作ります。

前回はダイナミック点灯させたところで力尽きたので、今回はちゃんと時計として動くようにします。TIの低消費電力MCU MSP430G2シリーズの2553、開発環境は同LauchPad + Energiaを使います。2553/LauchPadは日本だとちょっと手に入れにくいですが、RS onlineなどでLaunch Padとして$9.99で売ってます。せっかくなので、チップ単体のMSP430G2553も何個かまとめて買っておくと良いと思います(1個300円ぐらい)。LPC1114FN28と比べるとメモリなどごく限られるのですが、うそみたいに電池が長持ちしますし、かなりフットプリントが小さいので。

表示器は秋月の「超大型4桁7セグLED表示キット」です。低消費電力チップと組み合わせるのもどうかと思いますが。本来、秋月の時計キット用なのですが、巨大なLEDが今どきこの値段(1500円)で手に入るのは珍しいと思います。まぁaitendoで1280円で売ってたけどね…。注意しなければいけないのは、使っているLEDは16セグメントなのですが、秋月のキットでは7セグメントとして使ってます。aitendoのは16セグメント全部使っているけどね…でも16セグメント使いたくてもピンが足りないのよだからこれでいいのよ文句ないのよ(何その未練)

あとはRTCですが、今回は2553内蔵の発振回路 / カウンターを使います。キットには32768hzの水晶発振子が同梱されてます。小さくてLaunchPad基板へのハンダ付け大変ですけども。

温度計も2553内蔵の温度センサを使います。analogReadで華氏☓10の数値が直接返ってくるので便利です。まぁチップが多少なりともあたたまるので正確ではないけども(電源を入れた直後は他の室温計と一致していた)。

■先に落とし穴を書いておく■

内蔵温度センサも同じA/Dコンバータ使ってます。なので、Reference電圧を正しく設定しないと値がズレます。これで30分つぶしましたよ…。

■ハード編:巨大LED■

追記:
キットに付いてくるコロン用のLEDはクリアタイプで、方向によって明るさがかなり異なります(というか正面が眩しい)。「LED光拡散キャップ(5mm) 赤 (50個入)」を被せるか、広角タイプのLEDを用いると良くなると思います。

ほぼキットの説明書通り組み立てるだけなのですが、キットに付属しているコネクタはL型で表示器と平行に下側に伸びるように取り付けます。私は下面をフラットにしたかったので、手持ちの20ピンヘッダを取り付けました。あと、ハンダ付けの注意ですが…

  1. 金メッキ基板にはフラックスを(昔やった
  2. くれぐれもLEDの向きを間違えない(昔やった
  3. くれぐれも水平垂直平行を(昔やった
  4. ハンダ付けは必要十分に(昔(ry
基板と部品はまず最初に必ず仮組みをします。はんだ付けをしないで並べてみて、ぶつからないかちゃんとピンが全部ホールに入るかどうか、などを確認します。

1)のフラックスというのはピンや基板などをハンダで濡れ(?)やすくする処理剤です。小瓶で数百円、まぁ10年ぐらい使えます。キャップをあけると小さな刷毛がついてますので、それでハンダ付けする部分(ランドと言います)に少量塗ってやります。

2)はピンが多い部品を外すのはかなり困難です。確認確認また確認しましょう。

3)はピンを通す穴は案外大きいです。なので、雑に取り付けると微妙に部品が傾いてしまいます。傾く方向は左右だけでなく、基板と部品が平行になっているかも注意しなくてはいけません。なので、最初に1本をハンダ付けしたら、平行になっているかどうかをしっかり確認し、ずれていたらもう一度コテをあてて修正します。これで平行になっていることを確認したら、対角線上にあるピンをハンダ付けして再度確認します。これでOKならば、一応、隣のLEDも支障なくピンに入ることを確認してから、最初のLEDの残りのピンをハンダ付けします。

4)はリズムを身体で覚えるしかないっす。ただ、温度調整機能のついたハンダゴテを使っている分には最近の部品は滅多に壊れないです。それよりも、溶かしこむ時間が短すぎて接触不良になるケースの方が遥かに多いと思います。コテをあててピンを温める、コテというよりピンにハンダを当てて溶かす、ピンに自然にハンダが流れ込んだところでハンダとコテを同時に離す…ここまでまぁ3〜5秒くらい、10秒くらいかかってしまってもOKです。

今回の配線はソースに書いてありますが、こんな感じで。

信号名LEDボードのピン2553のピン番号同ピン名
Anode1桁目43P1_1
Anode2桁目22P1_0
Anode3桁目15P1_3
Anode4桁目56P1_4
Seg A177P1_5
Seg B188P2_0
Seg C129P2_1
Seg D1410P2_2
Seg E1311P2_3
Seg F1612P2_4
Seg G1513P2_5
dp<未使用>
コロン(+)204P1_2
コロン(-)18(GND)
水晶-19XIN
水晶-18XOUT

水晶は、Launch Padにこんなのが付属しています。


袋およびパッケージから取り出すとこんなに小さい。


2553のXIN-XOUTは右側のピンヘッダにもつながっているのですが、水晶発振子はピンから離れると動作が不安定になるので、なるべく近くに取り付ける必要があります。下の写真では中央の2553の右ちょっと上の方にある縦に2つ穴の空いたところがソレです。



貧乏症のワタシはこういう開発キットのようなものに手をいれるのはイヤなのですが、ハンダ付けします。ただ、こんなに小さいものなので、まずテープで止めて位置をルーペで見ながら位置を微調整してからハンダ付け。

これはハンダ付け前

ああしんど。

その他LaunchPadとLEDボード間は、メス−オスのジャンプワイヤで一本ずつ配線していきます。

■ソフト編■

MSP430/Energia用のRTCライブラリを使います。ライブラリ、ありがとうございます。なお、同ライブラリのライセンスはGPLです。
リンク先フランス語ですが、英語に切り替えられます。リンクからダウンロードすると、他にも面白そうなライブラリが並ぶのですが、今回はsRTCだけを使います。sRTCフォルダをEnergiaのディレクトリ下にあるLibraryに入れます。

使い方は簡単で、ヘッダをインクルードし、setup()で.begin()を呼び出し、秒単位の割り込みルーチンで秒をインクリメントします。あとは時分秒を取ってくるだけ。2秒間時計〜1秒間温度表示、を繰り返します。



あとはもういつものダイナミック点灯方式のよくあるデジタル時計ルーチンです。

以下ソースを公開しますが、ライセンスは一応GPLで。難しいことはしていませんが、ご質問いただければ喜んでお答えします。この後は、これに赤外線リモコン受光器か時刻合わせスイッチを取り付けてから、久々にプリント基板にしてみようと思います。


■使ってみて■

いやー、デカい。存在感ありすぎます。3.3vでのダイナミック駆動なのをいいことに電流制限抵抗もドライバも入れてないので少し表示が暗いのですが、ちょっと昭和の薫りがしていい感じw 昼間でも見えますし夜電灯を消すと睡眠の邪魔にならない程度の明るさで動いてくれています。何より、乱視+近視でも目を凝らさず見えるのが良いです。

ピンがあと2本空いているので照度センサと時刻合わせスイッチ(または赤外線受光器)は取り付けられるか…。プリント基板が遠のくなぁ。

■更新■

  • 2015-01-31
    コロンの出力をPWMに変更。ほどよい明るさになったけど点滅が見えてウザい

2014年11月30日日曜日

小ねた

ウォーキング用ライト、自分で使ってみた。

小さなじわじわネタってことで最初「小じわ」にしたんだけど、とある年齢層の女性から不評を買いそうなので改題。

■Arduinoデジタル時計改良■

「夜中は時計なんか気にしないで寝ろ」ってことで、23-4時まではLEDの輝度を1/10に下げて時計と温度の表示も時計2秒+温度1秒の繰り返しに変更。

高齢者たる私は夜中にふと目覚めた時に時計を見て「ああ2時か。もうひと寝入りしよう」と考えただけで目が覚めてしまうので、「時計を見る→暗い→寝直す」というフローにすれば改善するのではないかと。

■リチウムポリマーバッテリーの端子を固定■

某デバイスのリチウムポリマーバッテリー端子は1.27mmしか離れておらず、もし断線してショートしようものなら大炎上を免れない。ソレが怖くて今までまじめに使っていなかったんだけど…大掃除の準備をしていたらホットグルーガンが出てきたので、早速端子を固めてみた。まぁ絶対大丈夫ってことはないけれど、とりあえず取り回し→金属疲労→断線→短絡→炎上…という路線は防げるかな。

しかし、まだ、使い道を思いつかない。組み込まれているファームが条件設定などのできない単なるBLE中継ソフトで、例えば「離れたらLEDを点灯する」という当初目論んでいた処理に使えないため。ファームを消して「リチウムポリマーバッテリー付属切手サイズのnRFボード」として使おうにも端子が小さすぎて私には無理orz

さて、どうしたもんか。

■乱視用時計を再設計■

以前も書きましたが、私は「プロトタイプが機能を満たしてしまうと、そのまま使い続けてしまって製品化(笑)へ進まない」という悪癖がありまして。

乱視用時計もその1つなんですが…さすがに年が開けてしまうのはイカンと思うので、プリント基板の設計始めました。いやー、部品ライブラリが揃っているとEagleってホント快適に作業が進みますw まぁ「コマンドを選んでから操作する」というイカニモCADっていうUIへの違和感は未だ消えないのですが、とりあえず慣れた。

このまま1週間ほど寝かせておいて、来週あたりElecrowに発注しようと思います。

■読書灯ボードの変更■

ボードを設計した時、「LEDを2セットつなげられれば、電球色と昼白色LEDを組み合わせて色温度を調節できるな」と考えていたんですが、結局昼白色しか使ってません。本が読みやすいので。

ただ、よーく考えたら3本あればRGBが可能になり色の調整がものすごく幅広くなります。

ということでドライブをもう1系統増やそう…と思ったのですが:


…見事に隙間がありません。前回発注したボードはスカスカだったんですが、その後、RTCとバックアップ用の電池スペースを追加したもんで。左上のスペースはバッテリ、右下はDCジャック用です。RTCとDCジャックは秋月の変換基板対応。RTCはSMDチップが小さすぎてハンダ付けする自信ないっす。

となれば、あとはDCジャックを何とかしないといけないですね。先日、「電子工作部」で普通の丸穴で使えるDCジャックを教えていただいたので、ソレを手に入れて何とかしないと。

というわけで、今度はこれが先送りの言い訳に…あああああ。

少しはアンジェリカたんの豪腕っぷりを見習わないといかん。

楽園追放、面白かった。

いや、無理だけど。

2014年8月8日金曜日

MSP430 LauchPad + I2c液晶 + RTC + 3軸加速度センサ



どうもI2Cとは相性が悪いというか、今まで一発で動いたことがありません。今回も散々苦労しました。

・I2Cの信号が出ていない?▶オシロの設定間違い
・I2Cのクロック波形が鈍りすぎ▶プルアップを10kから1kへ
・念のためアドレスを左右にシフトしてみた▶ダメ
・念のため液晶変えてみた▶動いたorz

最近の部品は強いんですが、やっぱり壊れるときは壊れます。しばらく行方不明になっていて、アクリル板の下敷きになっているところを発見された液晶なので、静電破壊でしょうね…。

しかしこのμA単位で動作する低消費電力MCUでプルアップ1kΩ☓2ってのはキツい。LOWの時だけとはいえ6mAなどという大電流が流れるなんて…。ということで10kに戻してみたけど特に問題ありませんでした。それでも0.6mAはかなりの大電流ですが。

とりあえず液晶が動いたので、その後RTC(RTC-8564NB)と3軸加速度センサ(ADXL345)をつないでみました。

例によってRTCが動かず苦労しましたが、これはレジスタの数を間違えていて、一回りしてスタートビットを叩いているつもりが別のレジスタ叩いていた、という軽いボケ。

3軸加速度センサは以前Arduinoで書いたコードをそのまま貼ってすんなり動きました。

というわけで「振動を検知すると超高輝度赤色LEDが点灯するデジタル時計(またかよ)」の出来上がりです。

で、MSP430G2553IN20ですが…Energiaで書いている分には「小さな低消費電力Arduino」として使えるのでお手軽です。同じぐらいお手軽なmbed LPC1114FN28といい感じで使い分けできますね。14ピンのMSP430でEnergiaが動いてくれればLPC810M21FN8よりも使い勝手が良いのですが、見当たらないのが残念。

Energiaのフォーラムを見ていたら、32768hzの水晶を直結してRTCとして使うライブラリが公開されていたので、今度試してみようっと(「今でしょ!」禁止)。

2014年6月30日月曜日

Beaglebone Blackで7セグメントLEDデジタル時計

同梱

■約5日で到着

欲しいと思ったのが3月、5月上旬に発売されると聞いてMouser.comに発注したのが4/23、秋月やAdafruitへの入荷を見送って待ち続けてきましたが、Adafruitに再度入荷したので我慢できずに6/25に注文。6/29の11時ごろ配達されたのですが、買い物に出かけていて留守、やっと本日11時半ごろ入手しました。いえー。



■というわけで、7セグメントデジタル時計をまた作った

事前にブレッドボード上に回路を組んであり、Bonescriptでも一応書き終わっていたものの、初めての環境だとやっぱり色々ありますね…。ピン配列の資料を見て、「じゃ、P8の3番以降を使おう」と決めてあったのですが、実際に走らせると「そこのピンはMMCが使っているからダメよ」とエラーが。

間違った配線の図

じゃ、どうすりゃいいのよ、とそれらしい資料を探し出すのに小一時間かかりました。Getting Startedにあったんですけどねorz

やっと1桁表示できたw

それからソフトのバグをプチプチ潰しつつ、「せっかくの時計なんだからちゃんとntpで時間合わせしないと」と思ったのが運の尽きでちょっとハマったり。出来上がったのが、以下のムービーです。


ムービーのフリッカーを合わさって、ほとんど判読不能ですね…。実物はもうちょっと読めるのですが、ともかく実用にはなりません。Cloud9上で90桁/秒程度、コマンドライン上で170桁/秒程度です。170だと普通に読み取れますが、チラついてることが誰にでもはっきりわかるレベルです。

BCDデコーダが手元にないので7セグメントを1ピンずつループまわしてドライブしました。TC4511あたりを使えばもう少し早くなるかもしれませんが、それでも1Ghz ARM上のnode.jsだとこのへんが限界かもしれません。少なくとも、高速化のためにあれこれいじるよりCで書いた方がラクだと思います。

■設定など

SDカードを買い忘れてしまったので、まだなーんにもやってませんw

とりあえず、日付を毎回合わせるのは面倒くさいので、ぐぐって見つかったこちらのページ(Thank you!!)を参考にターミナルで
    ntpdate -b -s -u ntp.jst.mfeed.ad.jp
と実行。何の問題もなく設定された。なお、あんまり当然すぎて書いてないのだと思いますが、この設定はUSBとMac(PC)つないだだけではダメみたいです。DHCPのあるネットにEthernetをつないでからrebootし、USBのコンソールから入ってifconfigでen0のipアドレスを調べ、一度USB経由で接続したシェルからログアウトして、再度en0のIPアドレスにroot@<アドレス>では入ります。

2014年6月8日日曜日

Arduino時計+温度計(RTC+7セグメントLED編)

■久しぶりのユニバーサルボード■

未だに中耳炎+喉頭炎+副鼻腔炎が治りません。発症して8日目、抗生物質を変えて2日目なのですが。

それはともかくとして、少し前にブレッドボード上で作った4桁赤色7セグメントデジタル時計を作りましたが、あれをプロトタイプとしてユニバーサルボード上に黄色で作りました。そのままでは芸がない(←それじゃプロトタイプの意味がないだろ)ので、LEDを黄色にして、安価かつDIPなRTCを使ってみました。DIP好きっす。

■部品集め■

ユニバーサルボードは秋月のArduino用ユニバーサル・プロトシールド基板200円を使います。最初からヘッダピンやリセットスイッチなどの乗ったプロトシールドも市販されていて、それはそれで便利なのですが、今回のように多めの部品を載せる用途には向いていません。うちにも1枚あるのですが、DIPパターンの部分がうまくLEDディスプレイと合わなくて良い位置に表示器を置けないので諦めました。また、最初からヘッダピンが着いているのはラクに見えるのですが、両端を塞いでいるのでハンダ付けの際にとても邪魔になります。何より高いしね。秋月で揃えたのは以下の部品(ほとんど部品沼にあった…新しく買ったのは黄色LEDだけ)


  • Arduino用ユニバーサル プロトシールド基板(P-07555)
  • ピンヘッダ 1×40 (40P)(C-00167)
  • ダイナミック接続4桁高輝度黄色7セグメントLED表示器(I-04422)
    アノードコモン アノード共通接続
  • I2C接続RTC(リアルタイムクロック)DS1307+(I-06949)
  • クリスタル(水晶発振子) 32.768kHz(P-04005)
  • ボタン電池基板取付用ホルダー CR2032用(小型タイプ)(P-00706)
  • 高精度IC温度センサ LM35DZ(I-00116)
  • 丸ピンICソケット (シングル40P)(P-01591)
  • タクトスイッチ(黄色)(P-03650)

()は同社通販コードです。同じ名前で似たようなものがたくさんありますので、お店で「これください」と言う時には通販コードで伝えるのが一番手っ取り早いです。この他に10kΩの半固定抵抗(時刻合わせに使う)、1/8w 220Ω抵抗7本、1μFの積層セラミックコンデンサ、配線用AWG30のテフロン線が必要です。

■まずレイアウト■



他の部品と当たらないか、表示は見やすいか、スイッチは押しやすいか、配線の取り回しはラクか…などを考えながらレイアウトを決めます。上記の写真は完成品と違いますが、それはハンダ付けする際に間違えたからですorz

昔は決めたレイアウトを記録するのが大変でしたが、今はスマフォで写真取っておけばいいだけなので簡単。折角簡単になったので裏も取っておきます。



■背の低い部品からハンダ付け■

これが基本なのですが、今回絶対に守らなければいけないのは、電池ホルダよりも先にヘッダピンをハンダ付けする、ということです。ホルダの陰に隠れてしまうので、忘れると大変なことになります。幸い、電池ホルダはRTCとGNDだけにつながるので、最後の方でも構いません。前述の通りヘッダピンは邪魔なので、最後から2番めにヘッダピン、最後に電池ホルダでいいでしょう。あと、RTCとLEDはソケットに取り付けます。今どきの半導体は直接ハンダ付けしても簡単には壊れないのですが、まぁ一応。

ICソケットやヘッダピンを取り付けるときには、まず端を1点だけハンダ付けして、ちゃんと水平・垂直になっているかを確かめてから残りをハンダ付けします。もちろん曲がっていてもあまり性能には影響ないのですが、カッコ悪いので。今回配線にはテフロン線を使いました。硬くて被覆を剝くのも取り回しするのも少し面倒なのですが、コテ先が接触しても被覆が溶けたり焦げたりしないので仕上がりがきれいです。

…なお、製作途中の写真撮っていませんでした。楽しくて、つい夢中になってしまって。ということで、配線面の写真と横から見た図。

青はセグメントで緑はカラム、黄色はLM35

左上のハンダ付けがちょっと荒れているのはLM35Dの信号がノイズまみれで温度表示がピコピコ変わるのでいろいろ試行錯誤した結果です。ソフトで移動平均とってもダメで最終的に1μFのコンデンサを打ち込むという乱暴技で解決しました。

たれ背負う
横から見るとLEDのピンが長いですね…貧乏性なので部品のピンを最後まで切れない。たかだか250円、牛丼よりも安い部品なのに。手前右側でそそり立っているのは水晶です。32.768hzの水晶なんて昔は何百円もしたのに30円だもんなぁ(以下昔話20行削除

■ソフトの修正■

赤色LED+ブレッドボードではRTCにRTC-8564NBというモジュールを使っていました(これも秋月)。今回は別のチップなので、I2Cまわりの処理を変更します。I2Cの基本的な処理とはあまり変わりありません。

もう一つ、赤色LEDはカソードコモンでしたが今度はアノードコモンを使いました(買ってくるときに間違えた)。ので、LOWとHIGHを入れ替えてやります。

で、点灯したら…とてつもなく眩しい時計になってしまいました。

これは温度表示。暑いな。
黄色LEDは赤色LEDよりも発光効率が高いのです(それゆえ、高効率かつ安価な照明用白色LEDは黄色+青色だけで出来ていたりして色がヘンなのですが)。同じ抵抗・同じ電流だととても眩しくなります。今から7本の抵抗を変更するのも面倒だなので、単純に各カラムをon/offしている時間の比率を変えて調整しました。抵抗220Ωで各セグメントをドライブし、昼間はon:0ff=1:10、夜はon:off=1:100にして、いい感じの明るさになりました。電流はセグメントあたり (Vcc-Vf) / 220 = 13mA、ダイナミック駆動なので夜の場合実際に発光している時間は1/700ってことになりますが、それでも結構明るいから恐ろしいです。

実用品を作るのは楽しい。

■追記■

当初1日1分以上誤差があって「やっぱ1本30円の水晶は無調整だとあかんかw」って諦めていたのですが、その後日差1秒ぐらいまで安定してきました。このところ気温が低いせいもあるかもしれませんが、やっぱ水晶発信器ってエージングが必要なんですね。

2014年1月3日金曜日

Arduino時計+温度計

年末年始は電子工作で遊ぶ予定だったのに大掃除の際にハンダゴテを破損。次にいじれるのはいつになることやら…と思っていたら、思わぬところから発掘しました。

何年行方不明だっただろう…。
というわけで、SainSmartのキットからLCDと小型ブレッドボードとLM35(温度センサ)をつかって、デジタル時計/温度計を作ってみました。何を今更と言われようとも、私のデジタル工作の原点は秋月ならぬ信越商会のMN5311デジタル時計キットなので(アナログは今はなき三鷹トリオ商会で買った2石レフレックストランジスタラジオ)、ともかく時計を作らなければいけないのです。

Arduinoはハンダゴテ使わずに試作できてしまうのですが、SainSmartのキット付属の
LCDにはヘッダピンが付いていなかったので、ハンダ付けします。老眼が大いに障害になりましたが、何とか完了。ハンダの溶け込むリズムを思い出すのに時間がかかったぜ。

そして、小型ブレッドボードをパッチベイのように使って配線。まぁパッチベイといってもGNDやらVccなど複数の線が集まるところをブレッドボードのrowを使って配線するってだけですけども。

まずは、キットのテストコードをそのまま入力して実行。最初まったく表示が出なくて焦りましたが、コントラスト調整をしたら文字が出ました。また、LCDバックライトの抵抗を220Ωにしたら物凄く明るくて全体的に薄暗い写真になってしまいました。この後、1kΩまであげてみたのですが、それでもかなり明るいです。


続いて時計スケッチ。あちこちサンプルが上がっているのですが、いまさらArduinoで時計作る人も少ないのか、Timeライブラリの仕様が古かったりして使えません。ので、ググりつつコーディングしてアップロード。

温度計の補正に悩みましたが、それもなんとかクリア。とりあえず、
 温度 = analogPort値 ☓ 基準電圧 ☓ 100 / 1024
で上手いこと動きます。素子の出力電圧が1度=10mVなので基準電圧☓100、1024はフルスケール値です。なお、浮動小数点なら最後の3つの定数を電卓で計算して1つにしてしまえばいいのですが、浮動小数点演算の負荷を嫌って整数を使う場合は演算の順番を考えないとオーバー/アンダーフローを起こします。こういう場合、例えば500と1024を因数分解して演算の途中でも値がintの生の最大値32767を超えないようにします。今回は確実に動くこと優先で浮動小数使いました。また、文字列への変換もsprintfを使っています。書式指定のあるprintf/sprintfはプログラムサイズが大きくなるのですが、まぁここは確実に動くこと優先で…なお、Auduinoのライブラリではprintfの浮動小数への書式指定 %f は使えませんのでご注意を(少しハマりました)。

追記:
ArduinoのADCは基準電圧の切り替えが可能です。unoの場合は電源電圧、外部、内部(1.1V)に設定可能です。設定するには analogReference(type); のtypeにDEFAULT、INTERNAL、EXTERNALのいずれかを使います。EXTERNALの場合にはAREFピンに基準電圧を与える必要があります。詳細については以下のページが参考になりました。ありがとうございます。
  Arduino 日本語リファレンス - analogReference(type)

というわけで、何とか動きました。デジタル時計作ったのは何年ぶりかなー。

次はmbedのLPC1114FN28と適当なRTCを使って、ローコストかつデカイLEDデジタル時計でも作ろうっと。

#include <Time.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
time_t tokei;

int iYear  = 2014;
int iMonth = 1;
int iDay   = 3;
int iHour   = 18;
int iMinute = 20;
int iSecond =  0;

int lm35 = 0;

void setup() {
  lcd.begin(16, 2);
  setTime(iHour, iMinute, iSecond, iDay, iMonth, iYear);
  tokei = now();

  analogReference(INTERNAL);  
}

void loop() {
  
  while( tokei == now() ) {
    delay(100);
  }
  
  tokei = now();
  digitalTokei();
  digitalOndokei();
}


void digitalOndokei() {
  float val;
  int dat;
  char buffer[5];
  
  val = (float)analogRead(lm35) * 110.0 / 1024.0;
  dat = val * 10;
  sprintf(buffer, "%02d.%1dc", dat / 10, dat % 10);
  lcd.setCursor(11, 0);
  lcd.print(buffer);
}

void digitalTokei(){
  char buffer[20];
  
  sprintf(buffer, "%4d/%02d/%02d", year(), month(), day());
  lcd.setCursor(0,0);
  lcd.print(buffer);

  sprintf(buffer, "%02d:%02d:%02d", hour(), minute(), second());
  lcd.setCursor(4,1);
  lcd.print(buffer);
}


さて、一応時計なのでしばらく動かして精度を見てみようと思いますが、USBにつないだままにしておくのも少し不安があるので、とりあえず使わなくなったスマフォ充電用エネループをつないで放置したところ、約18時間で終了。消費電力150mAってところでしょうか。なお、スマフォ充電用のエネループを使うと写真ではわかりませんが何やら液晶が脈打ってるようになります。他の電源やUSBではこういう症状が出なかったので、電池の3.7V出力を5Vに変換するためのDC/DCがあんまり安定していないのかもしれませんね。



■追記■

その後、別バージョンの時計も作りました。この他にも教材用やアルバイトで3つ作ったw

Arduino時計+温度計(7セグメントLED編)
Arduinoユニバーサルボードにハンダ付けして作りました。私の部屋で元気に稼働中です。

Beaglebone Blackで7セグメントLEDデジタル時計
待ちに待ったBeagleboneがようやく入手してうれしさのあまりついデジタル時計を作ってしまいましたが、BoneScript(Node.js)でセグメントごとに制御しているため表示がちらつきます。digitalOutじゃなくBus命令があればもうちょっと速くなるんですが。とりあえず多セグメント用のLEDドライバを入手したので、そのうち改良します。

Energia + MSP430G2でのハマりポイント
製作途中の巨大7セグメントLEDデジタルクロック。TIの省電力MCU MSP430G2シリーズをArduino互換のEnergiaという開発プラットフォームで動かしています。マカーにはありがたい。