2018年6月23日土曜日

着席センサユニットの製作

うっかりミス多発・失敗だらけの製作記となった。
今回の装置は、次の二つの機能を実現する。
  1. 離席したときに、別にある監視カメラのモニタのバックライトをオフして省エネ化する
  2. 人感センサ付き夜間照明LED用のバッテリの充電機能

離着席の検出は、「超音波距離測定センサモジュール US-015 を使ってみた」にあるように、超音波センサを使用する。超音波センサの音速の温度補正用に温度計が必要なため、「温度センサTMP05をCCPで使用する」にあるように、温度センサを組み込む。
別にある監視カメラのモニタとは、「PHOTO-U2のLCDを活かす」で製作したもの。


マイクロクロステーブルとエンドミル」の記事までは、クロステーブルを使ったブラスチックの角穴加工だったが、今回初めて、t=1.0mm のアルミ板へのエンドミルによる角穴加工をすることになった。 


また、6mmの「すぱっとドリル」を購入し使ってみたが、良好だった。
10φ, 16φ, 20φ の穴は、6ミリの穴からステップドリルで10φjまで大きくする。10φからシャーシパンチを使った。


【失敗1】
修理用に購入したまま残っていたオプトレックス社の DMC16202NYの取り付け方向を上下逆に穴開けしてしまった。(シルク印刷が倒立、が正しい)
おかげで、写真のようなオフセットしたスペーサをアクリル板から作る羽目に。(クロステーブルが無かったら作る気にはならない)


【失敗2】
PWM式の温度センサにしたこと。測定時間が掛かる。
アナログ出力式のセンサにしておけば、距離センサの測定周期に合わせて測定するだけでOKだった。

【失敗3】
温度センサを基板上にハンダ付けしてしまったこと。外に引き出す等の根本対策ができない。ケースのフタをかぶせ密閉すると、室温より 8℃ 位高めになってしまう。
  • 温度センサの直下に、電源の発熱部が配置されてしまった
    電源を小型、小容量のものにかえて、レイアウトを修正した
  • フタに、通気用の小穴を明けた
  • 温度センサの近くの発熱部品を離した
  • 対策しても 5~6℃ 高いので、室温の表示としては違いが大きすぎてダメ
【失敗4】
そもそも、離着席程度の検出で使うレベルの「距離センサ」としての精度は、温度補正など要らない。着席とする範囲より、離席と判定する距離(背景との距離)を設定すればいい。

【失敗5】
距離センサを装置と一体化したこと。ユニットの置き場所と向きが限定される。

【充電機能】
ニッカドバッテリの充電は、ボタン操作で充電開始。180mA程度の定電流で設定電圧に達したら充電停止するというもの。こちらは、元になった基板にある回路をいかに活かす回路にするかに苦心した。

【未完】
バッテリの充電開始は自動開始になっていないので、過放電防止のアラームが必要。また、充電完了電圧に温度補正をかけるとしたら今の温度センサの位置が意味を持ってくるかもしれない。


2018年6月15日金曜日

超音波距離測定センサモジュール US-015 を使ってみた

アマゾンで208円、しかも送料無料で販売されていたので、5つまとめ買いした。ただし2週間くらい待った。簡易梱包で、中国から送られてきた。

ネットで見つかる例と同様に、トリガ後、ECHO出力の立ち上がりから立ち下がりまでの H のパルス幅をタイマを使用してカウントすることにした。(右オシロ波形の上のチャンネル)
数 ms のパルス幅計測になるので、トリガ後この間は、計測に専念する。
16MHzクロックが実装済みの基板を使ったが、1cm 単位の分解能でいいので、4MHz クロックでも十分と考えられる。
ただし、温度による音速の補正は必須。

回路の動作としては難なく出来た。また、計算式で導いた結果も10~70cmくらいの間は問題無し(反射板では)。

目的の人体の検知の場合、正面からだと、腕の動きに反応して大きく測定値が乱れる。
一応 8回測定の移動平均で使うようにしてみたが、手を近づけた事を検知する使い方も予定しているので、反応が鈍くなっても困る。・・・使ってみて改めることに。

2018年6月10日日曜日

温度センサTMP05をCCPで使用する

アナログ・デバイセズの温度センサIC、TMP05B を PICマイコンで使ってみた。
アナログ出力タイプ、I2Cのデジタル出力タイプなどあるが、これはパルス幅の比で温度を表すPWMタイプである。(長く延ばせるメリットがある)

ワンショット・モード
PICマイコンプログラムは、温度だけを測定する目的だけでは無いため、ワンショット・モードを使用することにした。
パルス幅の計測時間が120ms位必要とされるが、操作ボタンに軽快に反応してほしいので温度計測に専念せず、PIC の CCP機能を使用して、立ち下がりエッジ、立ち上がりエッジまでの時間をタイマ1 を使用して計測することにした。好きなタイミングで計測結果を読みに行ける(実際はトリガ前に前回計測値を読込む)
当初 H のパルス幅、L のパルス幅を二度に分けて測ろうと考えていたが、一度で済ませる事にした。
  • CCP1を立ち下がりエッジに指定し、Hパルス幅として使う
  • CCP2を立ち上がりエッジに指定し、立ち下がりエッジとの差をLパルス幅に
  • トリガHに戻してから、カウントイネーブル迄の時間がHパルスの誤差になる
  • Hの区間が公称値40msとなっているが、計測を省略できるほど正確ではない
  • 温度(℃)=421-(751×(Hパルス幅/Lパルス幅) の式の通りでOK
  • ポケットタイプの温度計より0.7℃高めの表示値が出たが、追求はしなかった
  • PIC のクロックが16MHzと高いため、立ち上がりエッジまでの計測可能な最大時間が131msになってしまい、温度上限が90℃位になる(室温で使うのでこのまま)
つまずいた点
データシートにある、「OUTピンをローレベルにしてから解除する」を読み飛ばして、入力ピンにトリガをかけて勝手に悩んでしまった。

  • OUTピンを強制 L に出来るよう出来ている
  • センサのOUTピン接続先をPICの入力として設定するが、
  • トリガを出力する際だけ、出力ピンモードにして使用する
  • (オープンコレクタ出力を使用してトリガする方法もある)


2018年6月3日日曜日

MPLAB X-IDE, XC8 への移行(4)

三年ぶりに、PICプログラムを作ることになった。C18で作成した過去のプログラムを流用するため、XC8へまず移植することにした。例によって大いに悩まされたので、その顛末。
  1. X-IDE, XC8を最新版にした(MPLABX-v4.15, xc8-v1.45)
  2. C18で作成したソースをXC8のプロジェクトへ単純に貼り付けてビルドするとエラーがたくさん出て、一気にやる気が失せる
  3. そこで、MPLAB X-IDE, XC8 への移行(3)にある通り少しずつ貼り付けながら、エラーを解決していく手法にした
  4. エラーのほとんどが、プログラム本体よりコンフィグレーションやペリフェラル部分のエラーだ
  5. ADCやTimerの設定がC18ではキーワードを使用して出来たが、これがエラーになるので、レジスタ毎に直接ビットパターンを指定する旧来の方法に戻した(データシートを参照せざるを得ないので手間はどちらも同じか)
  6. 結果的には、MPLAB X-IDE, XC8 への移行(3)にある通りの変更内容で、全て貼り付け終え、ビルド成功まで至った
【5の、XC8 V1.45になったことで】
前回の「MPLAB X-IDE, XC8 への移行(3)」の時のバージョンは XC8 V1.34 で、今回バージョンは大きな違いがあった(大きな違いがあるということが分かるまでが大変)。
  • ペリフェラルライブラリが削除された
    ペリフェラルライブラリを別途ダウンロードしインストールする必要がある
  • ペリフェラルライブラリと同じようなことをするには「MPLAB Code Configurator (MCC)」を使用せよとある・・・ただし対応する品番に制限有り
  • ビルドする際に、ペリフェラルライブラリを使う、という設定が必要
    プロジェクトプロパティの XC8 Linkerを選択し Runtime 設定の Link in Peripheral Library という項目にチェック
前回意識していなかった「MPLAB Code Configurator」(MCC)に寄り道してしまった。 PIC18F2321 を使うと決めていたので、それが使用できないと調べが付くまで時間をロスした。

【前回未解決の問題】
これを整理中に、前回の「MPLAB X-IDE, XC8 への移行(3)」の時点で、EEPROMの記事が未完のまま、未解決で残っている事に気づいた。今回のビルドでもEEPROM読み書きは、使う予定が無かったため最初にコメントアウトしたままだった。

【延長戦】
EEPROMの問題とビルド成功後も残っていたワーニングを調べてゼロにした。
  • warning: (373) implicit signed to unsigned conversion
    定数の加算やビット演算等にも出る
    (unsigned)を該当個所に追加して対処したが途中でうっとうしくなり、
    XC8 Project Properties にある、XC8 Compiler のワーニングレベルを、初期値 -3 を -2 にしたら消えた
  • 1/0 に書き換えた true/false の定数は #include <stdbool.h> で解決
  • warning 967 unused function は、未使用関数をコメントアウトすればいい
  • 最後に、warning level -2 にしても消えていないワーニング
    warning: (356) implicit conversion of float to integer が残った
    よく考えてみると、ここはバグっていることが分かった
  • EEPROMの読み書きは、ネットで見つかった方法、「関数を新たに作る」を使うことにした

2018年6月2日土曜日

Nakamichi CDプレーヤー OMS-50II の修理

80年代製のナカミチの CDプレーヤーの修理を頼まれた。機械的な部分のメンテナンスは終わっているので「どうしてもわからない基板のトラブル」3台分だ。
完動品が一台あるのでなんとかなるはずと思い引き受けた。
メンテナンスマニュアルをネットで探したが、図面がモノと一致しない。OMS-50ではなくて、OMS-70IIで探して出てきた図面が一致した(70IIの下位機種)。

【ひとつ目の故障内容】
  • うんともすんとも言わない状態で、前面パネル表示も何も無い。CDも回転しない状態
  • リセット回路、オペアンプ回路に電源が供給されていない
  • 原因は、部品固定用の接着剤が、パターンを侵食し断線を2個所作っていた
【二つ目】
  • CDを入れると回り出すが、CDの検知後一旦止まる動作をせずそのまま回りっぱなし
  • 前面パネルからの操作は受け付けない
  • 故障個所はヒューズ抵抗の断線によるもので、プラス側電源系に供給されていない
  • 何故断線に至ったかは不明(モータの過負荷?)
【三つ目】
  • 完動品の基板と置き換えて試し、回路基板の故障では無いことを確認
  • CDをローディング後CDが廻り出さない
  • CDを手で回すと、偏心している感じ
  • 二つ目の抵抗の断線していた基板が載っていたプレーヤーなのかも
  • 修理不能
【ナカミチ】
1970年代に、高級カセットデッキのメーカーとして有名だった。当時、Nakamichi の製品などとても自分の給料では手は届かず、選択肢にも入らなかった。

【カセットデンスケ】
Nakamichi は買えなかったが、SONY のカセットデンスケを購入。NHK-FM の「ひるの歌謡曲」をタイマを使ってエアチェックしていたものだ。

【今の目で見ると】
  • デザインは、重厚感があっていかにも高級品
  • 照明や、ディスプレイも控えめで、飾っておくにはかっこいいかも
  • 重量は重からず軽からず、持ったときのバランスもいい、動作音も静か
  • フタを取ると全くハイグレードな製品の感じがしない
  • 故障原因がお粗末だった
  • 電源ライン側にノイズフィルタが無い
  • 半固定ボリウムが、密閉型でなく開放型の最も安いタイプ
  • フォトカプラを使いデジアナ分離しているらしいが、電源のグランドが分離しているわけではない(ただしアイソレーテッド・グランド⽅式回路云々)
  • 片面基板のせいか電源ラインが貧弱だったようで、補強の電線を何カ所か這わしてある
  • 表面実装タイプのICは、ハンダ面に手ハンダしてあり、それも雑
  • 感度の高いピックアップのラインがシールド線を使っていないため、手が触れると再生中の曲が飛んだり雑音が入る
  • 今では普通な機能であるが、曲名が表示されないので非常に不便
  • 高価格品ではあるが、高品質では無い、のでは
BGM用のアンプとスピーカなので元々たいした音は出ないのだけれど、車載用のCDデッキでの再生、PCでの再生と比べてみた。特に「感動」は無かった。普通のおとなしめのCD品質の音だった。