ラベル 7セグメントLED の投稿を表示しています。 すべての投稿を表示
ラベル 7セグメントLED の投稿を表示しています。 すべての投稿を表示

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に変更。ほどよい明るさになったけど点滅が見えてウザい

2015年1月6日火曜日

Energia + MSP430G2でのハマりポイント

そうさ、またデジタル時計さ。MSP430G2553+RTC+秋月巨大LED
小数点のポートはデバッグ用に使用中

■UART関連■

同じG2でも、UARTのTxとRxが逆になっているものがあるので気をつけましょう。2553でもRevision 1.4以前とRevision 1.5は異なります。これはLauchPad基板のジャンパで切り替えるようになっています。

Guide to the MSP430 LaunchPad (MSP-EXP430G2)

シリアルモニタでLaunchPadからSerial.write / printで出力されてくる値を見るにはTxを使うのですが、ジャンパが違っていると書き込みできません。Energiaからの書き込みは正常にできるので、てっきり正しくつながっているものと思い込んでいたら、違いましたorz

■sprintfがクラッシュ■

複雑な書式指定をするとメモリ領域がメチャメチャになってクラッシュします。小さなプログラムだと通っちゃうことが多いのですが、10KBを越えるようなプログラムで、例えば、
sprintf(buf, "%02d%02d%03d%d", h, m, t1, t2);
とやると、以下のような症状が出たりします。

  • bufに値が入らない
  • 数秒ごとに繰り返しsetupが呼び出される
  • シリアルポートが文字列の途中でぶっちぎれる
  • 一度電源引っこ抜かないとEnergiaから書き込めなくなる


解決策としては、バッファとして使うメモリにvolatile指定を行い、sprintfの書式、特に数値変換については極力単純にして、あとは(上の行と同等のことをするには):
volatile char buf[16],temp1[16], temp2[16];
sprintf((char *)temp1, "%d", 10000 + h*100 + m);
sprintf((char *)temp2, "%d", 10000 + t1*10+t2);
sprintf((char *)buf, "%s%s", (char *)temp1+1, (char *)temp2+1);
で1つにまとめます。temp1,temp2を+1しているのは最初の'1'をスキップさせる古いc言語のテクニックです(懐かしい…)。

■MSP430G2553について■

これ温度センサー内蔵なんですね。analogRead(TEMPSENSOR)使うと華氏*10で返ってくるので、楽です。ワンチップで温度計作れます。我が家の他の温度計とも誤差1度以内なので、まぁ合っているんだろうなぁ、みたいなw

で、巨大LEDですが…3.3v駆動+PWMで制御しているのをいいことに、電流制限抵抗なしでつないでます。良い子は真似してはいけません。

さて、あとはRTCとの接続か…。

一応Xtalを外付けしてオープンソースのライブラリをつかえばリアルタイムクロックとしても動くのですが、年月日まで管理してくれないのでその辺を自前で実装するのが面倒くさい。かといって、RTCについても以前RTC-8564NBをArduinoにつないだときのソースを探すのが面倒くさい。

昨日今日とsprintfで全能力を使い果たしてしまったので、まぁそのうち元気が出たら作ります。

私を何より元気にするのは現金なんすけどねw

■追記■
これをデジタル時計として動くようにしました。ソース公開してます。予定では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秒ぐらいまで安定してきました。このところ気温が低いせいもあるかもしれませんが、やっぱ水晶発信器ってエージングが必要なんですね。