小さな作品
  内容的に陳腐な、しかし作ってみた作品を記録します。

6 うなり発振器 11.07.17
5 見やすい室温計 10.12.19
4 RTC内蔵デジタル時計 10.10.30
3 3色LED表示装置(カラーサイコロ) 10.08.13
2 UART接続4桁LED表示モジュール 08.05.15
1 キッチンタイマー 08.03.29





6 うなり発振器
 振動数が少し異なる音波を同時に発生するとき、干渉によって音が大きくなったり小さくなったりするうなり現象が見られます。通常のデモでは共鳴音叉を用いて一方に金属片のおもりをつけてわずかに振動数を変えたものを同時に鳴らします。単純な装置ですから理解しやすいのですが1セットで2万数千円〜4万円位します。簡単な発振器でできないものかと考えてこの装置になりました。
 発振器の周波数はスポットでよくかつ振動数の差も連続である必要はありません。耳になじみやすい振動数でうなりの周期は数秒はほしいところです。矩形波より正弦波の方がうなりはわかりやすいようです。

 いろいろと考えましたが、正弦波の発振は何度も失敗していて希望の周波数で発振が難しそうです。矩形波ならMCUで簡単に作れます。矩形波をローパスフィルターをとおすと正弦波に近くなるのではないかと実験したところRC2段でかなり正弦波に近い形になることを発見しました。
次は振動数が少し異なるポート出力が必要です。16ビットタイマーが2つあるとできそうですが8ビットタイマーだと分解能が256分の1しか取れないようです。256Hzとしても1Hz差より小さくできません。
高速ループを回して2つの16ビット変数をデクリメントして0になればポートを反転して矩形波を作ると考えました。振動数の差は16ビット値の初期値を変えることにします。
ループが速いほど分解能がよくなりますのでオーバースペックの24MHzクロックとして実験してみますとカウント2000程で1000Hz程度の音が出ることがわかりました。1カウントの差で0.5Hzすなわち2秒周期のうなりが得られそうです。
そこで耳になじみやすい振動数として「イの音」440Hzを目標にしました。その結果分解能は約0.2Hzとなって5秒周期のうなりが得られました。


出力端子は未実装です


(水晶の負荷抵抗は省略しています)

プログラムです。

せっかくですからいくつかのプログラムを切り換えられるようにしました。ポートDに3つのタクトスイッチを付けましたので複数のボタンを押すと3ビットのメニューが取れます。発振中のループの中に制御を入れたくないのでメニューボタンを押した状態でリセットするとそのメニューを実行するようにしました。
 メニュー0 swを押さない 440Hzのうなり無し
 〃   1 sw1を押す 440Hz うなりの周期5秒
 〃   2 sw2を押す 440Hz うなりの周期1秒
 〃   3 sw1とsw2を押す 440Hz うなりの周期0.5秒
 〃   4 sw4を押す 880Hz うなりなし
 〃   5 sw1とsw4を押す 880Hzと440Hz やや複雑な音色
 〃   6 sw2tosw4を押す 疑似時報音 ポ ポ ポ ピン
 〃   7 3つとも押す 高音→低音

あと、アンプとスピーカーを用意するとデモができます。

(2011.09.26)アンプを作りました。
秋月で購入した NJM2073D というオーディオアンプICを使いました。細かな性能はわかりませんがPCの音声アンプとしては十分使えるもののようです。大容量の電解コンデンサがいるので嵩は大きくなりますがデータシートどおりのステレオとして作ると8ピンIC一個で作ることができます。
今回は試しにすべてを表面に実装してみました。基板のパターンはサンハヤトのテープとボールペンで書いています。穴開けがありませんから工作は簡単でした。
例によってコネクタは自己流で賄っています。





見やすい室温計
 暖房の季節、省エネの時期です。我が家は居間を比較的広く取っていて、寝室がそれに続いています。居間と寝室は一つの暖房機で賄っていて冬場は24時間運転です。
時節柄暖房を控えるようにしていますが、石油のFFヒーターの温度管理はうまく無いようです。
そこで、見やすい温度計を用意して家族の注意を引こうと考えたわけです。

センサは遊びなれたLM35Dとして、表示は離れても見やすいLED(ACでないと動かせませんが)でかつ、デジットで購入してジャンク品の高さ32mmのものを使う事にしました。このLEDは赤色ですがVfが高く3.3V駆動ではほとんど光りません。電流も20mA/セグメントほど必要なようです。
表示は2桁としました。


ケースに入っていない試作状態です。

mcuは手持ちのATmega48を使っています。今様ならmega88か168といったところでしょうか。
陳腐な作品ですから、回路図は省略して結線状況だけを.cファイルのコメントとして書いてみました。
  結線
    LED桁制御  1位:PB0  10位:PB1  (LEDドライバ 2SA1015 ベース抵抗1k)
    LEDセグメント a:PD0  b:PD1  c:PD2  d:PD3  e:PD4  f:PD5  g:PD6  dp:PD7 電流制限抵抗120Ω
    スイッチ      PC1
    reset sw
    温度センサ LM35D PC0  ( 1:Vcc  2:OUT  3:GND 正面左から)
    電源パスコン  0.1uF
      
  fuse設定  内蔵RC 8MHz  -fL11100010 -fH11011100 -fx00000001   BOD=4.7V  EEPROM:save
このセンサLM35Dは個別の偏差がかなりあるようで、補正が必要だと考えました。プログラム決め打ちで補正すると簡単なのですがスタンドアロンでつくものですから補正手段がほしくなります。
めったに補正する必要がありませんからできるだけ簡単なハードウエアでできる方法を考えました。それは、
@ リセット後補正値をEEPROMから読み出して表示する
A 数秒間表示を続けて補正スイッチが押されなければ前回の補正値で温度表示(main)に移る。
B 補正スイッチが押されれば補正値をインクリメントする。値が9になれば次は0に戻る。
C 適当な補正値で数秒待つとmainルーチンにジャンプする。(補正値はEEPROMに記録される)
D 補正値は5を中心として0.5度刻みにプラス2度〜マイナス2.5度の間で調整できる。
  (今回の個体は補正値1=マイナス2度が適当だった)。

結果として『見やすい』は思っていたとおりになりました。部屋の離れた場所からも鮮明に温度を読みとれます。LEDの消費電力はありますが、温度がわかりやすくなりました。

プログラム

温度計の泣き所:温度センサを用いて温度計を作るのは簡単ですが、誤差をどうするかと考えるとその基準に苦しみます。
現に我が家には付属のものを含めて数台の温度計がありますが指示値は実にまちまちです。因みに温度計を買いに行くと同じ場所にあって(当然同じ温度のはず)指示値が同じものを探すのが困難な位です。
今回は1本だけある水銀棒状温度計に合わせました。日常使用している液晶デジタルのものは2度ほど低い値を示しています。その意味で補正ができるデジタル温度計は通常ありません。自分で合わせられる、のも特長かと思います。
電圧、周波数、時間などは比較的精度よく(3桁なら)確認できますので温度とこれらの値の相関がはっきりしている基準素子が手に入ればよいと思うのですが難しいのかもしれません。
温度は身近な物理量ですが、意外に正確には測定できないものだと感じております。





RTC内蔵デジタル時計

 まえおき: 15年の間、乗ってきた車が寿命がつきたのかクーラーが壊れて修理をためらうまでになってしまいました。全体的に老朽化していて他の部分も交換が必要になるとも言われました。現に右のドアミラーは動かない状態になっています。
一念発起して(大袈裟)コンパクトカーに乗り換えることになりました。家族の脚としてまだ車が必要です。新しい車はしかし、専用時計が付いていません。カーナビの画面に小さく時計が出るのですが老眼では何時だか読むことができないのです。
そこで見える時計を作ろうと考えました。昼間だけですと100円の9アナログ時計で十分なのですが、夜間には見えなくなります。視認性から言えば7セグメントLEDの時計が優れていると思います。手間はかかりますが作ってみることにしました。


基本的な構想:
1 表示は「時分」で十分ですが、たまに必要なこともあるので押しボタンスイッチで「分秒」に切り換えられる。
2 電源はシガーライターソケットがら取るが、キーOFFでは電源が切れる。そのために買い置きのRTCモジュールで時刻をバックアップする。
3 昼間は明るく、夜間は暗く点灯して見やすくする。頻度は大きくないので手動切替にする。→ソフトウエアPWMで可能だろう。
4 時刻あわせはめんどうなので「分未満四捨五入機能」をつける。時報に合わせてボタンを押せば誤差は秒未満に戻せる。
  →秒誤差のわかった腕時計も使えるし、カーナビの時計は電波に同期しているので1秒とは狂っていない。
5 めんどうでも時刻合わせ機能は必要である。
6 RTCバックアップ電池はノートPC電源を分解したリチウムイオン電池を使う(大きすぎるが我慢する)。

完成図:
何とか完成に漕ぎつけたのでその姿を。苦労はRTCの読み書きとケース作りでした。


回路図は各部分毎に書いてみました。ISP回路は省略しています。


プログラムは最終的にこのプログラムに落ち着きました。後日になるとハードウエアの構造がわからなくなりますので、コメントにできるだけの情報を残してみました。回路図が無くても何とか復元できるのではないでしょうか。

途中経過の諸々:
RTCモジュールについて  秋月扱いのシリアルRTCモジュールRTC−4543SA\250 を使いました。
SOP 14 pinの小さなICです。使い方がわかっていればそのまま直付けするのですが、はじめてですから、ブレッドボードでテストできるように工夫しました。14ピン中必要なのは9ピンですから生基板の小片に0.55mmφの真鍮線を取り付けて、SIP風に加工しました。ブレッドボードで使用後はソケットを使って実装しています。ブレッドボードでは立てていましたが、実装時には90度倒して差し込んでいます。
 このモジュールのアプリケーションマニュアルには詳細なタイミングチャートが書かれていますが、SPI規格でなく固有のソフトウエアで読み書きせねばなりません。当然の事ながら少しのまちがいでまったく読み出しや書き込みができないので未熟な私にはかなりの辛抱と暗中模索が必要でした。
 クロック周期は0.75us〜7800usとなっていますから余裕があってかつ速い周期としておよそ10us(5usH+5usL)を選びましたが、結果的によかったので他は試していません。
 読み出しの時は、クロックをLにして、WRをL(read)にセットしてタイムラグののちCEをHにすると読み取りルーチンに入れます。CEをHにしたままではWRが有効にならないようです。
 データ方向を決めて置いてデータを読み出すわけですが、秒、分、時、日、月、年 は1バイトのBCDで、かつLSBから順に読み書きします。なお、曜日は1バイトではなく4ビットですからこのところでルーチンをかえる必要がありました。
 読み書き方法がわかるまではループのまちがいを防ぐためにこのようなプログラムで研究することにしています。(プロには笑われそうですが)
 モジュールの1秒パルスをmega88のINT端子で受けて割り込みを起動し、時分秒のデータを読みだしています。今回は必要がないのでそれ以外のデータは読みとっていません。なお、読み出しはCEをLにすることで途中打ち切りができるのですが、データ書き込みは秒から年までの52ビットを書かないと設定できないようです。

バッテリーバックアップについて  廃品利用のLi-ion電池を使っています。12Vに接続したときは 0.5mA 程度で充電され、バックアップ時は 10uA 程度の消費があるようです。1日1時間使用したとして少し充電が過剰かなと思いますが、数日間充電を続けてもあまり端子電圧が上がらなかったのでこれで様子を見ることにします。
 仮に充電しなくても自己放電を無視すれば1年以上使えるとは思うのですが。

スイッチの機能について  スイッチは合計5個取り付けました。
 1番は「時分」と「分秒」の切替です。たまに信号の長さを測りたいときなど秒があれば便利だと考えてつけました。
 2番は 明暗切替 です。夜間の暗いときには減光する目的でつけています。現在は「明」がヂューティ比50%で「暗」は10%です。実用試験の後に修正するつもりです。
 3番は時刻調整です。短押しでは「分未満の四捨五入」機能を持ちます。少しの進み遅れをワンタッチで修正するためにつけました。常時使用すると累積誤差が出ません。
長押しは時刻調整です。長押し→「時」を明るく表示、4番スイッチで時アップ、5番で時ダウン→3番短押し→「分」up,down→短押し→計時に戻る という仕様です。

ケースその他について  日頃は裸の基板が動けば完成と考えるのですが、今回はそうはできません。試作の失敗を繰り返しながら、手持ちの化粧合板でケースを作りました。側板は厚みがほしいのでバルサ材を使っています。(ケースができるまでかなりの時間がかかりました)
車の振動を考えてハンダ付けもいつもより丁寧にしています。Li-ion電池は踊らないように両面テープで留めています。(ただ、振動にどこまで絶えられるかは疑問です。そのために分解修理がしやすい仕様にしています)

しばらくテストして、わかったことがあれば報告しましょう。
なお、今回使用したRTCモジュールは月差1秒1分程度と書かれていますが、計測ロボットなどで日時が必要なときにはコストがやすい事もあって重宝するのではないかと思います。



-------------------------------------------------------------------------------------------------





3色LED表示装置(カラーサイコロ)

 秋月の部品取り基板からはずした3色LEDを点灯してみました。
このLEDは R G B の3色ですから、赤、緑、黄、青、マゼンタ、シアン、白 の7色が表示されることになります。この内の白を除いて残りの6色に数値を割り当てるとサイコロになりますから、これらの色を高速で順次点灯して、手動スイッチで止めればサイコロとして使えます(色から数字を考えねばなりませんが)。

このために リセット、スタート、ストップの3つのタクトスイッチを付けることになりますが、それならストップスイッチでプログラムが切り換えられるのでとりあえず4種の点灯モードを作ってみました。





プログラム
簡単な回路でもあるので、tiny2313は生基板に直付けしています。尤もやがては分解再利用となる事が多いので、脚は隅の4本だけ基板にハンダ付けして残りは空中配線しています。4隅だけならハンダはずしも簡単にできます。
また、ISP端子を付けるのもめんどうなので、今回はISP用アダプタを作りました。ICに被せて使います。そのために生基板に接触しないように絶縁のための紙を挟んでいます。
LEDの電流制限抵抗は本来はRGBで変えるべきですが、同じであっても大まかな感じはつかめますのでずぼらしています。
なお、写真撮影の後に電池駆動(リチウムイオン電池)のために電源端子を付加しました。

プログラムは、リセットスイッチを押すとメニューボタンが有効になって、リセットを押した時は 赤メニュー、1回押すと 緑メニュー、2回押すと 黄メニュー、3回押すと 青メニューとなります。
赤メニューは、スタートボタンで 消灯、赤、緑、黄、青、マゼンタ、シアン、白 を1秒間隔で順次表示します。on-offで可能な色のすべてが表示されます。
緑メニューは、カラーサイコロです。スタートで白色瞬きに見えて、ストップで赤、緑、黄、青、マゼンタ、シアンの6色のうちどれかが表示されます。スタートで繰り返しができます。
黄メニューは、赤、緑、青、の高速順次点灯です。そのままでは白色の瞬きに見えます。バーサライタの様に振ると3色に分解して見えます。LEDを動かさずに速く首を振りながら見ると3色に分解して見えます。
なお、サイコロを同じように振ると6色に分解して見えます。
青メニューは、赤、緑、青をゆっくり順次点灯します。

うまく使うと光の分解合成の説明に使えるかもしれません。

3色LEDのおもちゃの製作でした。



-------------------------------------------------------------------------------
 





UART接続4桁LED表示モジュール
 LED表示は読みやすいディスプレイなのですが、4桁であっても12本のポートが必要なのとその割り振りに悩むことがあるので使いにくいときがあります。以前に、それを回避することも考えて I2C や SPI 通信によるLED表示を作りました。
今回のUART通信によるものは、ほとんどのmcuがUART機能をハードウエア的に持っていることと、データ流し込み方式だと信号線は1本で済ませられること、mcuが低価格で入手できること、LEDの消費電力からmcuが2つになっても影響がないこと、趣味の自作では考え方が単純な方がいいこと、などから作ってみた次第です。

回路図はここに置きます

mcuはこれからは新規採用しない 90S2313 としました。新しく買うならtiny2313の方が安くて振動子も要らないのですが、手持ちを消化するために使っています。完成度を考えるならSOICにすると収まりが良くなります。

通信は、数字以外の文字を受けると数字受付の初期化を行い、続けて4桁の数字プラス小数点の位置を表す数字(最高位が1)の5桁の数値を表す文字を受け付けます。
数字以外の文字に続く5個の数字文字を受けると表示文字列として処理します。このとき数字5個が続かないと表示ルーチンには送られません。
試行錯誤の結果プログラムはこのような形になりました。

今のところは使う予定は無いのですが、TeraTerm からの送信では期待どおりの動作をしています。形状は表示部と基板を二階建てにして厚みはありますがコンパクトにまとめています。

TOPページへもどる

キッチンタイマー
 時間を計るだけならいまでは安価なタイマーが出回っています。これらはすべて液晶ですから、また、小さな文字ですから経年変化の進んだ我が目には読み取りが困難です。台所に置きっぱなしならAC電源が使えますから、読みとりやすいLEDが使えます。
デジットで、部品取り基板についている文字高2.5cmのLEDを見つけましたので試作することにしました。まだ、未完成ですが外観はこのようなものです。
箱は制作と廃棄が簡単な発泡ポリスチレン板です。
時間設定は10分の桁と1分の桁がそれぞれインクリメントするタクトスイッチで行います。右から2つ目のボタンがスタートスイッチ、右端はリセットスイッチです。
1分未満(秒の単位)は設定の必要はない、と考えて付けていません。
右上の緑のLEDは残り時間を示しています。タイマーの時間が終了してから追加したいときがありますので、0分0秒になったあとは時間をカウントアップします。このときはLEDは隣の赤が点灯します。
タイマーの最大設定時間は2桁ですので99分としました。

上記と重複しますが、考えた仕様はおよそ次のとおりです。
・分の表示は大きなLEDにする。
・設定時間終了後はカウントアップタイマー機能を持つ。
・設定時間は2桁最大の99分とする。分未満は不要と考え、秒の設定機能は付けない。(操作を最小にしたい)
・設定時間に達するとブザーが鳴る。(当たり前、未実装。)
・リセットスイッチで3分に設定される。リセット後時間設定またはスタートボタンが押されなければスリープに入る。

ハードウエア構成は、

・基板は例によってカッターで絶縁溝を掘り、配線はUEWを使います。
・MCUは手持ちのmega48を使いました。2313ではポートが不足します。マルチの技術は持ち合わせません。
・クロックは精度を必要としないので内蔵RC発振とします。
・ポートの使用は、
  PORTB 0〜7 は a〜g のセグメントドライブ。コモンアノード型のため(カソードは)Lで点灯。
  PORTC 0〜3 は 秒、10秒、分、10分 のコモンアノードのPNPトランジスタを駆動(Lでon)。
  PORTD 0 は スタートスイッチ
     1 は 分の桁の時間設定。Lにするとカウントアップ(1.5kでプルアップ)。
     2 は 10分の桁の時間設定。Lにするとカウントアップ(1.5kでプルアップ)。
     3 は 緑LED。Hでon。残り時間インジケータ。
     4 は 赤LED。Hでon。超過時間インジケータ。
     5 は ブザー。設定時間になると30秒間作動。Hでon

現在は基本回路ができて、残り時間機能、超過時間機能が動いているところです。ブザーはまだ付けていません。プログラムは一部にバグがありそうで、修正が必要です。
MCUは手持ちのmega48ですが、再利用品のため31番ピンが折れています。パッケージを削って金属が見えたところで細い線をハンダ付けして取り出しています。今回は配線材に0.2mmUEWでなく0.26mmを使ってみました。断面積が1.7倍ほどになりますからふにゃふにゃしなくて扱いやすい点も新発見でした。0.26mmの方が扱いやすいかもしれません。デバイス下の絶縁用紙はクッキングペーパーで、フラックスの汚れがNGです。(拡大写真

表示面の赤色アクリル版の加工には少し苦労をしました。タクトスイッチは基板にハンダ付けして、内側から貼り付けてスイッチ部分が出るように大きな穴をあけています。この穴あけで、3mmの穴をあけて次に6.5mmの穴にしようとドリルを立てるとものの見事に割れてしまいました。アクリルに大きな穴をあけるのは難しいものですね。結局3mm穴からハンドリーマで大きな穴にしました。
外箱は発泡ポリスチレンですが現物あわせで適当に(ええかげんに)作りますので細かなところはめろめろです。(遠目にはわからないから良いとしよう)

今後完成に向けての作業が多くありますが、進展しましたら続きを報告します。















~~~~~~~~~~~~~~~~

TOPページへもどる