« 2021年1月 | トップページ | 2021年3月 »

2021年2月

2021/02/20

ミニマムなキッチンタイマー

無印良品の丸いキッチンタイマーを20数年愛用してきたのですがスイッチの接触が悪くなり、数字が入らなかったり連打されたりでストレスを感じるようになってきました。 キッチンタイマーなんてどこでも売ってるものなので買ってこようとしたところで、うちの使い方だといちいち時間設定する必要はなくて、決め打ち4つに追加+1分もあれば十分でその方が使いやすいなと思い付き、作ってみた次第です。
Kitchentimer1
ここで12分は麦茶、7分はスパゲティ、5分はどん兵衛など、3分はラーメンなど、です。スタート/ストップは無く、押すと直ちにスタートし、止めたいときは強制終了(内部的にはリセット)を押します。時間がきたらメロディが鳴ったあと勝手にスリープするので、カップ麺ができてから台所に止めに行くようなことはありません。

カウントダウンを小型の液晶で目一杯表示するために、はじめてグラフィックLCDを使ってみました。自作RPN電卓のキー設計に続いて次のサイトが参考になりました:
ArduinoでグラフィックLCDを動かす(AQM1248A編) - しなぷすのハード製作記
なお、MGLCDライブラリは使っていません。また、AQM1248AはSPI接続で、グラフィックLCDだとフォントをマイコンで持たないといけないことから今回はATtiny85は使えず、ATmega328Pを使うことにしました。電池はAQM1248Aが2.4〜3.6Vで動くのでCR2032x1個にし、ATmega328Pは8MHzの内蔵RC発振にしました。念のためデータシート(リンク先PDF 33MB)のp.615を見ると2.4Vまで落ちても7.9MHz以上あり、1分で1秒もずれませんから、キッチンタイマーには十分な精度です。

スイッチの読み取りは、押した瞬間に設定時間からスタートさせるために、キー割り込みして直ちに値を読みに行くようにします。ATmega328Pならピンチェンジ割り込み(PCINT)がいくつも使えるのでキーごとに端子を当ててもいいのですが、今回は電卓の電源スイッチでも参考にした方法を使ってみることにしました:
ATtiny85/45 ピンチェンジ割込み、アナログ式キー識別、アイドルスリープ | 東京お気楽カメラ
但しATtiny85とATmega328Pでは違うところが色々あり、次のサイトも参考にしました:
Arduinoで外部(ピン変化)割り込み – imo Lab.
特に、A0ピン=PCINT8の含まれるグループPCIE1の割り込み時に呼ばれるISR(interrupt service routine)がPCINT8_vectでもPCIE1_vectでもなくてPCINT1_vectであることをここで知りました(東京お気楽カメラさんの記事のおかげで、割り込み時に意図せずリスタートしてしまうのはISRの間違いだと分かっていて助かりました)。

表示するフォントは、PCに入っているフォントから見栄えの良いImpactを選んで表計算ソフト上で手動デジタイズしてみたところ、RAWデータでは0〜9とコロン(:)だけで1.7kbyteになってしまい、フレームバッファ48*128/8 = 768byteを加えると2kbyteを超えるのでATmega328Pでは扱えません。EEPROMに1kbyteだけ逃がすというのも中途半端なので、とりあえずランレングス圧縮を掛けた上で重複列をリピート化したところ956byteになり、EEPROMに格納できました。これでRAMの余裕ができたので終了時のメッセージも出すようにしました。ついでに、HP 100/200LXのSNDファイルを鳴らした要領で適当な曲のtone()関数列を得て終了メロディも入れ込んでみました。

さらに、電源電圧が落ちてきたときのためにコントラスト調整を入れたり、いざ組んでみたら音が小さかったので昔の防犯ブザーからトランスを抜き出して使うなど、あれこれしていたら結構複雑な回路になってしまいました:
Kitchentimer_sch
特にトランスのところは、CR2032で駆動するのにトランスを直接負荷にして(大電流で)使うわけにもいかず、少し実験しました。トランスには微分波形が掛かればいいだろうと考えて目の前にあった10μFでC結合したところ、音が大きくなった(なりすぎた)一方でATmega328Pの出力はなまった上に発振気味になっており、圧電サウンダに掛かっている電圧は(自作のオシロスコープは±9Vo-pまでしか測れないのですが明らかに)±12.5Vo-pの定格はオーバーしていそうで、すぐに止めました。
Kitchentimer2
そこでRC結合にしたところ、大体220Ω+10μFぐらいで音量も波形も適当な感じになりました。
Kitchentimer3
…負電圧まで見られるオシロを作っておいてよかったです。こんど、抵抗分圧セットを組んでおこう。

最終的に組み上げたところはこちら:
Kitchentimer4筐体はダイソーで2個入り110円だった絆創膏ケースで、内寸の短辺が33mmなので主基板は秋月電子さんのFRISK用がちょうどよかったです(圧電サウンダなどを載せている副基板はユニバーサル基板から切り出して使用)。磁石はセリアの「超強力マグネット4P」(φ13mm, 180mT)のうち3つを使いました。
これで、タイマー動作時の消費電流は約4mA、スリープ時は約0.1μAでした。
ソースはGitHubにリポジトリを作ってアップしてあります。

動画も載せておきます(毎度ピンボケですみません):

自分の使い勝手に合わせた日用品が作れて満足です。何かの参考になれば幸いです。

パドラッパ from MacBook Air (2017)

| | | コメント (0)

2021/02/09

Arduinoオシロの作り込み

昨年の11月に九州工業大学さんが公開されているArduino簡易オシロスコープを試して気に入ったので、自作Arduinoクローン用のシールドを作製し、電子工作のお供にしています。

このオシロでは、信号を保護抵抗だけを通してADC入力へ入れているため、入力電圧範囲が0~+5Vに制限されます。シールドで約1/10に抵抗分圧できるようにしましたが、負の電圧が観測できないことには変わりなく、例えばロジックのアンダーシュートが確認できませんでした。
また、ADC入力は直接サンプルホールド回路に繋がるためインピーダンスが不明で、実際、ロジックで出ていたエラーがプローブで当たると出なくなるなど相手の動作が変化することがあり、測定器としての信頼に欠けていました。ちなみにATmega328Pのデータシート(リンク先PDF) p.212 23.6.1によると、ADCは信号源の出力インピーダンス約10kΩ以下で最適化しているそうなので、仕方ない話というか使い方の問題です。
さらに、上等なデジタルオシロを使い慣れたものとしては、プリトリガ機能が無いのは少し辛いところです。

今回、ATtiny85を使ったRPN電卓を作るときに一緒に買った部品を使って、オシロを作り込むことにしました。
設計のポイントは、上記の課題の解消がメインですが、付随する課題も色々とあります:
  1. 入力電圧範囲の拡張
    主にマイコンやセンサの波形観測を考えているので、±9Vもあれば充分です。そこで倍電圧負電圧のチャージポンプICを使ってUSBから±10V近い電源を作り、低雑音のオペアンプを駆動します。
    増幅回路は、入力信号と負の電源電圧との差動アンプを、利得1/4で作るとします。簡単に言うと、負電圧が-10Vのとき、入力の-10Vが出力の0Vに、0Vが2.5Vに、10Vが5Vになる仕掛けです。
    ここで減衰増幅器ではノイズと位相余裕(発振)が気になるところですが、幸いに特に問題ありませんでした。
  2. 出力オフセット電圧の校正機能
    USBの電圧から基準電圧なしで作る負電源が増幅の基準になるので、オフセット校正が必須です。
    今回はUIを提供するProcessingのプログラム側に実装しました。
  3. 入力インピーダンスのコントロール
    オペアンプを使うことにしたので、信号入力端子(プローブ端)とGND間に1MΩを入れるだけで大丈夫です。
  4. 基準発振には水晶を使う
    Arduino UNOや私のクローンでは基準発振に周波数許容偏差±0.5%のセラロックを使っていますが、せっかくなので±30ppmの水晶振動子を使います。
  5. 信号表示の手直し
    オリジナルのkit_scopeでは枠をはみ出た信号は切り捨てて表示されず、上下の枠外に張り付くと行方不明になっていました。そこで、アナログオシロっぽく枠の上下まで信号を出し、クリップすると点線表示にしました。
  6. スキンを作り直し、その他のUI要素も少し好みに変えました。

結果としてできたものは、こんな感じです:
Mscope01
はい、またMINTIA BREEZEのケースを使いました。

スクリーンキャプチャはこちら:
Mscope06
右下の"offset CAL"がDCオフセット校正項目です。ここでは、表示色を"change COLOR"で変えてキャプチャしました。

回路は基板2枚に分けています。その1枚目LOGIC boardは、ほぼkit_scopeそのものです:
Mintiascope_sch1
Arduinoクローンを作ったときに入れ忘れていたアナログ電源へのLCフィルタを、今回は入れています。また、間違えてArduinoのスケッチを書き込まないように、RTS(DTR)ラインにジャンパーを付け、通常は外してあります。

2枚目の基板ANALOG boardは、正負電源と増幅回路です:
Mintiascope_sch2
USBの5Vから倍電圧ICで+10Vを作り、これから負電圧ICで-10Vを作って、簡単なLPFを通してからオペアンプの電源にしています。但し、オペアンプを駆動すると電圧ドロップが生じ、実働上は+9.3Vと-8.9Vになりました。
1/4倍の差動アンプを構成するにあたっては、高精度の金属皮膜抵抗を使うまでもないかなと思って、袋入り(ほぼ同一ロット)の5%カーボン抵抗から抜き取って選別した上で、2直列と2並列で使いました。結果として、抵抗自体のばらつきは0.65%、組み合わせた差動アンプとしての利得誤差は0.45%に収まりました。

ソフトはATmega328Pの組み込みと、PC用のProcessingの二本立てです。
ATmega328Pには前に作ったブートローダライタを使ってArduino UNOのブートローダーを書き込んだ上で、九工大さんの配布されているArduinoスケッチ"kit_scope.ino"を改変せずそのまま使っています。
一方、ProcessingによるUI周りのコードは色々と改変しました。こちらは、GitHubにリポジトリを作ってアップしてあります。実は今回ほとんど初めてProcessingを使って、とても勉強になりました。なお、macOS Catalina, Windows10, Ubuntu 20.04で動作確認済みです。

ケースを開けたところはこちら:
Mscope02
上側がLOGIC board、下側がANALOG boardです。USBシリアル変換には安い秋月電子さんのCH340Eモジュールを使っています。実はこのモジュールはスケッチの書き込みに使うには少々クセがあるのですが、単なる通信用では問題ありません。なお、macOSでもWindows10でもUbuntuでもOS標準ドライバで使えます。
どちらのボードも、配置検討に使った図をシールに印刷して貼り付けて、工作キットのように楽に部品実装できるようにしてみました。結果として、設計上の勘違いや改善点が分かりやすくなりました。そのため、印刷していない部品を追加したり予定していた回路が無くなったりしています。その最たるものはANALOG board左下の、NJW4191を使った負電圧発生回路のところで、増幅基準電圧を細かくチューニングして校正しようと考えていたところ、オペアンプの負荷によって可変範囲がずれ、イタチごっこになったのでやめた跡が残っています。

反対面は、チップ部品と配線です:
Mscope03
…あれこれと試行錯誤しながら配線していた様子が見て取れます(汗

その、配線が整理されていないせいだと思いますが、チャネル間のアイソレーションが充分に取れておらず、CH1に入れた信号の微分波形がCH2に出ています。このとき、CH1には1kHz 5Vp-pのPULSE入力をしており、CH2はオープン状態です。
Mscope04
なお、ここでCH1が上側にクリップして点線になっているのが上記5.で見直した表示です。

今回、オペアンプ回路を20年ぶりに触りました。元々、30数年前に社会人になって最初の仕事がセンサの駆動回路で、そこで様々な種類の設計とトラブルを経験したのが下地にはあるのですが、専門分野が高周波側へシフトしたこともあって(20年前に少しアクティブフィルタを触ったとき以外)離れていたので、すっかりカンが錆び付いていました。けれど、基本的に式を書けばその通りに動く回路だということを思い出すことができて良かったです。

最後に、MINTIA工作シリーズの集合写真を撮っておきました。
Mscope05
左上の少し小さいのはISPプログラマで、下2つはRPN電卓です。

これで、けっこう使い勝手のいい簡易オシロができたと思っています。ただ、クロストークが多いのは問題なので追って修正します。また、今回Processingの勉強が結構できたので、プリトリガ機能が実装できないか、ぼちぼち考えてみたいと思います。

以上、何かの参考になれば幸いです。

パドラッパ from MacBook Air (2017)

| | | コメント (0)

« 2021年1月 | トップページ | 2021年3月 »