暗くなったら点灯する人感センサーライトの製作

暗くなったら明るさを検知し、人が近づいた時に点灯するライトが壊れた。
今、会社経営で新聞を賑やかにしている東芝製の大分昔の製品だったのだが、暫くの間放置されていたので内部電池の漏液が回路接点をダメにしたようだ。最近、朝早く暗いうちにトイレに起きるようになったので、あれがあると足元が明るく助かる。

これくらいの物ならば今どき安いのが売っているだろうと、以下の条件で探してみた。

1.省エネ型(LED)であること
2.当然ながら人感センサーで点灯すること
3.暗い時に自動で動作すること
4.電池や充電型ではなくACDCアダプターで動作すること(コンセント型や電球型では設置場所的にダメ)

・・・いろいろググってみましたが、1.2.の条件ならばたくさんあるのですが、更に3.4.が加わるとあまりありません。そして高額のものになるようです。

それならば作りましょうという結論です。

【完成写真】
話が長くなりそうなので最初に完成写真を載せます。

MotionSensorLight_2.jpg

右上がLEDライト、その左が人感センサー、左下に欠けているのが照度センサー、中央下が自作したコントローラです。

【製作説明】

材料は容易に入手できる安いものが良いですね。以下の画像は秋月さんからのNETからお借りしました

・LEDライト:9~12VDC、3.8W、昼光色(秋月・900円)
MotionSensorLight_12.jpg

・人感センサー:焦電型赤外線センサモジュール、5~12VDC、2m検知(秋月・850円)
MotionSensorLight_13.jpg

・光センサー:リニア光センサー、VCC=5V、1~200Lux(秋月・150円)
MotionSensorLight_15.jpg

早速物を入手して作ってみることにしました。基本的な考え方は
1)光センサーで暗くなったらONリレーが動作すること
2)AND 人感センサーがONしたら、LEDライトをONさせる
3)2)ではデレイ・リレーを起動させ20秒後程度にOFFさせる。タイマーIC、555を使います。

順に単品で機能を確認して行きます。

1)光センサーでリレーをONさせる : 簡単に考えていましたがここが一番時間がかかりました。

問題点その1:簡単な回路でOKなのだが出力がかなり低い

MotionSensorLight_16.jpg

5Vを印加し、光強度に比例した電流が流れるので負荷抵抗で電圧を取り出すのですが、

MotionSensorLight_17.jpg

暗い、明るいの境目となる10Lux 付近では、8 uA程度しか流れません。10kΩの負荷抵抗で算定すると、80mV程度になります。これではトランジスタ動作のVbe 0.7V まで昇圧するにはオペアンプで10倍程度増幅が必要になります。

そこで、【増幅オペアンプ回路】が必要になります。

MotionSensorLight_6.jpg

LM358という廉価オペアンプなのですが、電源電圧の10%~90%範囲はリニアに増幅します。このような回路に好んで使用するオペアンプです。
10Kの負荷抵抗で発生した電圧をオペアンプで増幅しますが、120k/12kΩなので、約10倍に増幅します。

尚、マイコンの電源は当初単電源を試みましたが、特に今回必要な低レベル電圧ではリニアで無くなるため、LTC1144という負電圧コンバータを使い±12Vの電源を供給しています。

問題点その2:リレーが動作時に唸ります

このオペアンプ出力は10Lux 付近では10倍の0.8Vになるので、リレーを駆動するためのスイッチとなるトランジスタをONさせることができます。しかし、そうやって作ってみた単動作回路では、「リレーが発振するように動く」というトラブルが出ました。
即ち、光の強弱や、リレーON-OFF時の電圧減増によりON-OFFを繰り返すのです。これではリレーが壊れます。

・・・色々調べてみると、このような比例制御によってON-OFFする場合は、「ヒステリシスを付ける」必要があるということです。
即ち、ONする時の電圧よりもOFFする時の電圧をある程度低く設定すれば、その範囲にある場合はON-OFFしないという不感帯が設けられるということです。

更に調べてみると、これを実現するには、「シュミット・トリガー」という回路が良いらしいですが、「ディスクリート」で勉強して作ってみたい小生としてはトランジスタで構成する回路を選びました。

・・・勉強し、シミュレーションして達成したのが以下の回路と、LTSpiceシミュレーション結果です。

MotionSensorLight_9.jpg

一番左が入力電圧で、光センサーの負荷抵抗から、10 Lux + α 時点で約100mVが入力される前提です。0~500mVまで変化するように設定しています。
これがOPAMPで10倍に増幅されます。
これ以降にある、Q1、Q2トランジスタと周辺の抵抗で構成された回路が、「シュミット・トリガー」です。その後にあるQ3トランジスタはR6というリレーコイルを駆動するものです。

詳しい回路の動作は「シュミット・トリガー」を参照願いたいのですが、結果的に上側のシミュレーション図に示すように、光センサーからの出力V(in)が110mV になるとリレーがONします。その状態から、光センサーからの出力が下がり、65mV程度になった時点でリレーがOFFします。即ち、光センサー出力が 65~110mV範囲の時には、リレーはON-OFFどちらかの状態から動かないということになります。

このような検討から、【シュミットリガー回路+光センサーONでリレーOFF(暗くなるとON)】 回路を設けました。
光センサーが受光して、OPOUT電圧が0.7V以上に上がると、K1リレーが切れます(=明るいと動作しない)

まとめを書いてみると簡単ですが、シュミットトリガー回路の抵抗定数設定はトライ&エラーなので時間がかかりました。

MotionSensorLight_7.jpg

2)人感センサーで動作させる

使ったセンサーは、「動体センサー」なので人体が近くにあっても動かなければONしません。
即ちこれは、「動いた時にだけONする」仕様なので、後述するオフディレイ・タイマーのパルス起動要件には合っています。

MotionSensorLight_14.jpg

モーション・センサー(人感センサー)は、電源、GND、内部TTL回路(ONでLOW)のコネクタで接合されます。
このLOW信号をPNPトランジスタで受け、K2リレーをONします。
当初5Vで動作させようとしていましたが、内部に5VのDC-DCコンバータがあり動作が安定しないようなので、電源を12Vに変更しました。
リレーは5V用しか無かったので、動作コイルに直列に230Ω(実際は220Ω)を入れました。

3)点灯時間を遅延させるオフディレイ・タイマー

MotionSensorLight_8.jpg

点灯させたLEDをある時間以降に消灯を遅延させるOFF Delay Timer です。
定番の555タイマーICを使っていますので、特段の説明は省きます。10uFコンデンサと1M+1M=2MΩ抵抗を使っていますので、計算動作時間は 22sec ですが、作ったものは 29sec 動作でした。抵抗値が大きいか、コンデンサが大きいかですが、31%もの偏差ですので、多分コンデンサの容量が実際に大きいのではないかと推測されます。


4)番外編:ユニバーサル基板製作を容易にするためには

一品料理である今回の基板を製作するに当たり、どうやって確実に正確にユニバーサル基板で作るか という課題です。

簡単な回路であれば、PasSという基板回路エディタを使って来たが、これは回路を最初から実体配線図で描く必要があるので、特殊な部品も登録しそのリソーセスが使え、回路図ベースで設計し、そこから基板図が作成できるEAGLEのようなツールが良い。

ここで一計を案じました。

1.EAGLEの回路図で設計する
2.基板図の設定を以下のようにする
  1)グリッドは0.1inchに設定する(ディフォルト)
  2)グリッドを線で表示させる。グリッドの交差点がユニバーサル基板の穴位置になる
  3)使用するユニバーサル基板サイズや、目印となる番号・記号などを記載する
3.部品配置はグリッド交差ポイントに合わせるようにする。
4.配線もグリッド線、グリッド好転をベースに配置する。

このようにすると、EAGLEで作った回路図をベースにしてユニバーサル基板図が容易に作成できます。

【今回作成したユニバーサル基板図】

MotionSensorLight_10.jpg

周囲にある数値やアルファベットは、使用したユニバーサル基板に銘打たれたものです。
これを記載し、EAGLEの表、裏印刷機能を使って印刷して置けば、部品配置が容易、裏面の配線も容易になります。

最後に参考までにEAGLEの回路図全体を載せておきます。

MotionSensorLight_18.jpg

-----------------------------------------------------------------------------
一晩使ってみての結果です。

良かったこと
・人感センサーの感度は問題ありません。ちょうど良い距離でセンシングしてくれます。
・昼光色LEDライトの質感もOK、もうちょっと暗くても良いかもとの意見もあり
・OFFディレイ時間29秒もちょうど良い長さです

不満なこと
・周囲が明るくなって、廊下もほんのりと明るいのに点灯する。OFF感度をもう少し暗めにしたい
 ⇒光センサーの負荷抵抗を低くすれば簡単に調整ができそうだ。いっそ可変抵抗にするか?
・意外に人感センサー・リレーの音が大きい。特に深夜になると周囲騒音が下がるので気になる
 ⇒機械式リレーを止めて電子リレーにしようか。
 秋月に安いリレーがあるようだが、制御信号ONでリレー接点ON回路しかないので、信号側で反転回路が必要かも

MotionSensorLight_20.jpg

-------------------------------------------------------------------------------------------
調べてみると、この電子リレーはAC電圧専用のようです。

・・・考えてみると、ここにはリレーではなくフォトカプラを入れても良いことに気が付きました。
明るさでON-OFFしているリレーコイルに直列に入れてあげればOKでしょう。

MotionSensorLight_21.jpg

リレーが入っていた赤丸部分をTLP521-1フォトカプラに交換しました。
注意すべきはこのフォトカプラは5V用なので、感度の問題で12V で使っている人感センサー回路では、一次側に1.2k の抵抗を入れLED電流を抑えています。2次側回路はタイマー・トリガーが5Vなのでそのまま接続します。

ついでに光センサー負荷抵抗を可変抵抗に交換しました。

MotionSensorLight_22.jpg

人感センサーのリレーが無くなり、豆粒大のフォトカプラになりました。カチカチ音がしないのでGoodです。

廊下がほんのり明るい時には点灯しないように半固定抵抗で調整を試みましたがダメのようです。
人間の目の感度が相当良いのでしょうね。




Arduinoもどきを使ったフォークリフト(おもちゃ)運転の自動化

例年連休になると、いつもは時間がかかってなかなか手が出せない課題をやることにしているが、今回はオーディオでは無く、おもちゃいじりである。
子供の頃を思い出し、心をくすぐるものがあります。
(尤もコマーシャルの一環でもあるので、休み前から進んでおりますが・・・)

さて、お題は、「Arduinoもどきを使ったフォークリフトの自動運転」です。

FRK_4.jpg
最近のおもちゃは、なかなか手が込んでいます。Amazonで売ってます。
これはかなり大きな1/8スケールモデルなので、全長45cm、全高35cm、全幅15cmもあります。
ラジコンで前後進、左右旋回、リフト上下、クラクション操作ができ、運転操作を覚えさせると自動運転までできます。

FRK_5.jpg

でも、やはりおもちゃはおもちゃです。
・旋回半径が大きい。
・旋回が安定しない。
・急停止できない。
と、今回の課題をこなすには少し荷が重いです。

課題は安全教育に使うための以下のデモ走行ができることです。

1.フォーンを2回鳴らして発進・走行後、急停止する(フォーク上の荷が滑る)
2.同上発進・走行後、急旋回する(後輪の外輪差が大きくはみ出す)

この動作を常に安定して再現させなければなりません。ラジコンの手動ではどうも再現性に乏しいです。

FRK_1.jpg
中を開けてみると、基本的な構造はしっかりしているようです。

・駆動輪にはディファレンシャル・ギアが付いていますので(ハンドル安定すれば)、旋回動作はしっかりできます。
 しかし、速度調整機能がありません。スピードが速過ぎます(暴走フォークリフトの感強い)
 また、停止する際は電源OFFだけなのでブレーキ停止になりません。モータの短絡ブレーキ改造が必要です。

・旋回輪の角度が足りません。ロッドを削って角度を増やしました。
 また、装着されていた旋回角度用駆動モータは内部スリップするためトルクが足りません。
 汎用サーボに交換します。
 
FRK_6.jpg

Arduinoもどきの秋月・AE-ATmegaボードです。汎用サーボを付けて動作テストしました。
(4,5年前に買っておいた機材が役にたってます。当りでした。理由は下記)

いつも愛用しているPICを使用せずArduinoを使った理由は2つあります。
・servoをコントロールする関数を内蔵しており、servo動作に安定性がある。
・ポテンションボリュームからの電圧を計測し、動作させる中心サーボ角等を調整する値を演算する場合、mapという関数がありとてもプログラムが楽に行える。

忘備録1:Arduino化するためブートローダーをBitBang法(こちら)で書き込もうとしたがうまくいかなかった。結局AtmelStdioのToolsにあるDeviceProgrammingとAVRライターを使うことになった。しかし、その後はマイコン(ATMEGA328)を新品に変えてもBitBang法が使えるようになった。PC側の状態が変わったとしか思えないのですが、その根源が不明です(継続調査中)

忘備録2:Arduinoの電源とサーボの電源を同時に入れると、サーボが0位置付近まで動いてしまう。これではフォークリフトのハンドル角がロック状態になるので問題となる。サーボの電源はArduino起動後にArduinoで入れるようにする。これならば少しの揺るぎで収束します。

発進前のフォーン音やエンジン音(最近はバッテリフォークに変わって来たので不要?)もマイコンで鳴らします。

FRK_7.jpg

汎用基板に効果音IC2種とアンプを付けました。3V~5Vで駆動できます。5cm程の小さなスピーカーを鳴らします。
エンジン音は電源を入れておくと12秒程度鳴ってOFFします。フォーンは信号ピンをHIGHにすると鳴ります。マイコンで駆動できます。
詳細はデジットを参照してください。HK637シリーズの4,5とHT82V739アンプを使いました。
2つのICからの出力を1つのアンプに入れると音はミキシングされます。IC出力側に個別の半固定抵抗でボリュームを付けました。

さて以上の準備ができれば、制御回路作りと、Arduinoのプログラミングですが、その前に頭の中をまとめる必要があります。
要点は、できるだけプログラムは修正せずとも、ハードで調整ができるように作っておくことです。

FRK_2.jpg

【制御基板回路図】
FRK_8.jpg

サーボへの信号はマイコンから直接出ます。その電源はNPNトランジスタ出力で駆動するリレー経由で供給します。
フォーンへの信号は念のためNPNトランジスタ経由で出します。多分マイコン直接でもOKです。
駆動モータへの電源はCMOSトランジスタスイッチでで供給しますが、これがOFFの時はモータ回路がリレーによって短絡し、ブレーキがかかるようになっています。
ただ、このままではリレー応答遅れや故障時に電源ショートになるため、本番では回路変更の可能性があります。
速度調整はMOTOR端子後に設けた切り替えスイッチ(図には無い)で固定抵抗値を切り替えて行います。走行させてみないと速度が判らないので完成後の抵抗値選択になります。

【基板図】
FRK_3.jpg

Arduinoもどき基板AE-ATmegaの上に差し込めるように作りました。

さあてと、基板を作ってプログラムを流し込めば動くはずです。結果は連休明けです。




FET計測ツールの製作

ある方からの問い合わせで、FET計測ツールを再製作することになりました。

以前製作したこれは、ぺるけさんオリジナルこちらのかたがダブル化(JとPチャンネル両方が計測できる)したものであるが、これを私がマイコンタイプにしたものです。

ぺるけさんのツールを久しぶりにググってみると、なんと改訂版が発表されていました。
ボリュームでIdを調整するタイプから、固定抵抗をセレクトするタイプになり、更には定電流特性の温度変化を安定化する回路が付与されています。流石、ぺるけさんです。

早速この回路を真似てみることにしました。頻度を考えるとPチャンネルFETの計測はほとんどないのでダブル化は止めました。

【EAGLE回路図】
FET_Tool_1_sch.jpg

左下側がベースの計測回路です。
まずこちら側を完成させて性能を確かめ、テスター計測の値をえます。
そのご右側にあるオペアンプとマイコンによる計測、表示部を完成させるという流れです。

【EAGLEボード図】
FET_Tool_2_brd.jpg

以前の作例では、切り替えスイッチと基板間の配線が山のようにあってごちゃごちゃしてました。
今回はスイッチを基板に直付けし、そのスイッチで基板をぶら下げようと思います。よって、足サイズが大きい汎用スイッチを基板に付けるため、EAGLE用スイッチパーツを作りました(左下、右下に見える2回路2接点スイッチです)。左下は電電スイッチ用なので、片側の穴しか使いません。

【Id 計測】
FET_Tool_3_Id.jpg

2SK170BL を使ってテスト計測しています。

中央ジャンパーで2mAセットの抵抗を選択しています(ここはセレクタースイッチに接続されます)

S1スイッチが上、S2スイッチが下で Id 計測モードです。100Ωの両端電圧で計測しますので、2mA×100=200mVです。
ほんの少し誤差があって2.002mAですが、Id セットですからこれくらいの誤差で十分です。問題は安定度です。ピタッと決まって動きません。現在使っているボリューム調整品比べれば雲泥の差です。

【Idss 計測】
FET_Tool_4_Idss.jpg

これも100Ωで計測してます。953mV→9.53mAということになります。これは定電流回路を通さないので時間と共に数値が若干変化します。LEDを通すので印加電圧は電源電圧12V電圧が10Vに下がってます。

【Vgs 計測】
FET_Tool_5_Vgs.jpg

ぺるけさんがFET選別に使う特性 Vgs 計測です。ここで先に選択した2mA定電流が使われます。安定した計測です。

本日はここまでです。
次は、マイコン装着(ソフトも再製作)になります。

--------- 2015/7/15 追記 ---------

マイコン装着での電圧、電流計測範囲をチェックしていたら、次の問題があると気が付きました。

・以前私がこのツールを作った時の計測対象FETは2SK170が主であったが、2SA30Aや2SK246を計測するとすると、Vgsの計測レンジがマイコンの計測範囲を超える場合が生ずる。

・この打開策として、マイコンでもテスターでも計測できるようにと試みたが、オペアンプに微弱電圧をかけた場合に流れる微弱電流の影響が、テスターでの計測値に影響する。言い換えると、オペアンプ計測回路流入電流が大元の値をドリフトさせるという問題がある。
これでは両用にはできない。

悩んだ結果、大量に計測しないというユーザーさんの環境を加味し、マイコン計測無しの仕様にしました。

【完成品】
FET_Tool_6.jpg

とてもシンプルな外観になりました。電源スイッチが変な場所になってますが、一体基板上配置の制約なのでご容赦。
2SK170BL の Vgs を計測しています。

左上がbias電流を切り替える3択スイッチです。
計測項目の選択は、右下2個のスイッチを組み合わせて行います。

Idss:スイッチ2個共に上に上げる。  読み値例(0.946Vは946mVなのでその1/100の9.46mA)
Vgs :スイッチ2個共に下に下げる。  読み値例(-252.3mVは直読の-0.2523V)
Id  :左S1を上(Id)、右S2を下(Var) 読み値例(200.4mVはその1/100の2.004mA)、bias電流を確認します。




Fusion PCB へ基板をオーダーしてみました (2回目:DHL輸送を追加)

「Seeed Studioという会社が、Fusin PCBという名前で基板を激安で作っている」という記事を目にしていたので、PCM2706 USB DAC基板の回路を変えることがあるので頼んでみました。

以下、発注から基板入手までのプロセスを簡単に記載します(詳細手順は他のNET記事を参照願います)
以下、備忘録です。

1.Seeed Studio にユーザー登録をします。ありがとうというメールが届きます。

2.Seeed Stdio のPCB設計基準に合った設計にしておかねばなりません。
  私の場合、φ0.3のスルーホールをφ0.5に変更するのが大きな変更で、他は特にありませんでした。
  また専用のデータ形式でデータを用意する必要があります。
  私はEagleユーザーですが、Eagle用のDRCチェックやデータ出力用camファイルも用意されています。
  詳細は他のNET記事を参照してください(不親切ダナア)

3.ユーザーID(メルアド)とパスワードでseeed StdioのHP にログインし、基板を発注します。
  サイズ(5cm×5cm以内、10cm×10cm以内等)や、厚さ、枚数等の発注スペックを選択し、先に用意して
  おいたデータ(zip形式)をアップロードします。

  以前はオーダーエントリーしたオーダー番号を基板裏に書かねばならなかったらしいですが不要になってます。

4.オーダーを入れると間髪をおかずメールが来ます。

  seeed_1.jpg

  オーダーした10日も108円/ドルだったので、基板費10枚は2365円、送料715円、合計3,080円でした。
  同じものをP板での発注20枚で約3万円だったので、1,500円/枚が300円/枚、1/5の費用になります。
  これは激安です。さて品質はどうなるでしょうか。とても気になるところです。

5.10日には「作ってるよ」、4日目(13日)には、「送ったよ」、というメールが来ました。おっ、意外に早いな。

  seeed_2.jpg

  seeed_3.jpg

  ここまでは早かったですが、問題はこれからです。私は費用の安い一般メール便にしたからです。

6.送ったものが何処まで行っているかを追いかけることができます。

  seeed_4.jpg
  seeed にログインして自分がオーダーした案件の Tracking Number を調べます。
  Truck This Order という緑のボタンを押します。

  seeed_5.jpg

  Tracking Number という英数字が追いかける対象の番号です。
  Or Track Here というボタンを押しても多分エラーになります。
  そこで、日本郵便から追いかけをします。

7.確かではありませんが、日本向けの郵便に託されるAir Mail のTracking 情報は、
  現地の海外発送所に託された時点で日本郵便の Tracking 情報にアップされるようです。
  (ebayからの他の荷物受け取りで推測)

  seeed_6.jpg

  先ほどの Tracking Number を日本郵便の追跡サービスに入力すると情報が表示されます。
  この画面は私の所に到着した全ての経過が記録されたものです。

  最初の SINGAPOLE S05 局が受け入れたのが18日です。Shiped メールを貰ってから5日経っています。
  即ち、Shiped メールを貰ってから5日間はTracking ができませんでした。
  この5日間は、中国からシンガポールの国際交換局までの移送期間と考えられます。
  この期間は国際交換局までの距離や手続き関連でバラツクのでしょうね。
  ebay では国際交換局は中国本土のようで、到着まで3日間でした。

  その後の輸送期間は見ての通りです。
  日本の郵便交換局に到達するまで5日間です。これはebay でも同じでした。
  後は日本郵便の迅速な処理で2日間で入手できます。

  ここまで、seeedにオンライン・オーダーしてから15日を要して入手できました。

8.荷姿
  基板がたったの10枚なのですが、予想に反して箱に入ってました。

  seeed_7.jpg

  アドレスシートは2枚貼ってありました。各々使い分けがあるのでしょうが、詳細はわかりません。

  seeed_8.jpg

  綺麗にパックされてました。残念ながら10枚きっちりでした。おまけはありませんでした。

9.肝心の基板品質です

  seeed_9.jpg

  基板そのものには殆ど問題ありません。
  パターンやスルーホールも綺麗です。レジスト品質や光沢(即ちムラ)にも問題は皆無です。

  でも、やはりNET評価にあるように小さな文字のシルク印刷はかすれるようだ。
  品質的な問題ではないのですが、0,5φのスルーホールにはレジスト流入が数多くあります。

  内心心配していたのは、外周ギリギリにあけたドリルホールです。
  でも、完璧なカットができていました。周囲の崩れも無くOKです。

10.総括

  P板に頼むと約7日間で作ってくる基板が、約二倍の15日かかるが 、約1/5価格でできてくるのは魅力です。
  データを直接送るので、P板でやってくれるボンミスチェックは無いと思うようでしょうね。
  基板設計に自信のある方は頼んでみると良いでしょう。

--------------------------------------------------------------------------------------------
21014/11/14 追記

2回目のオーダーをしました。今度は30ドルの輸送費をかけDHL輸送をしてみました。さて早く届いたでしょうか?

1.11月2日にオーダーしました。DACのHPA側基板をスマホ用Li-ion電池(並列)に変更したもの10枚です。
  基板が18.9ドルなのに、DHL送料は何と30.4ドルもします。
seeed_13.jpg

2.11月6日に製作し、11月7日に発送したよとメールが来ました。ここまでは5日目発送で、前回と同じです。

3.DHL発送なのでDHLのTrackingをかけましたが、seeedからの追跡番号ではヒットしません。
  3日ほど経過した後、seeedのTracking番号が変わってます。この番号でDHLをTrackingします。

  荷物が届いた後の最終のTracking結果です。

seeed_10.jpg

 何と、DHLが荷物を引き取ったのは11月9日、しかも深夜でした。この2日間はどこで何してたのでしょうか?

 その後は、翌10日にDHLで出荷処理、11日早朝便で日本到着、12日は不在だったので13日に受け取りました。
 2日にオーダーして12日に受け取れたら10日間かかったことになります。前回は15日間でした。
 ちなみに宅配はSAGAWA便でした。

 6ドル送料が30ドル送料になって5日間の短縮ですが、これは微妙です。安いほうが良さそうです。

 DHLに託してからは超迅速なのですが、そこまでの中国本土内の物流プロセスに問題がありそうです。

今回のパッケージはこんなでした。
seeed_11.jpg

大きなDHLの袋です。

seeed_12.jpg

軽く真空引きされたビニール袋に入ってました。

基板そのものに問題は何もないのですが、シルク印刷品質はチョットダメですね。
小さな文字は完全にかすれて見えません。





WAVプレーヤーの製作(その12 小型TFT LCD, part2)

先回、小型TFT LCDについて述べたが、まだ諦めきれずに弄っています。

課題は
1.このアイコン背景色の問題
2.タッチパネルが4線式のA/D入力なのでSPIに慣れた身には未体験領域だ。安定度が心配です。
  ソフトも新作を要します。
3.タッチの割り込みはどうやるのだろうか? A/Dの割り込みってあるの? 動作安定するの?

1.は一応の暫定処置ができたので、今回は2.と3.です。

【タッチができるようになりました】
stm32_proj_47.jpg

左右・上下計測を順に行うために、DC電圧出力とA/D計測を順に切り替えながら計測しなければならないので、これは大変かなと覚悟していたのですが、結構あっさりとできました。

ボールペンでスクリーンの真ん中へんを押してます。xは上下、yは左右方向です。
左上にタッチされた座標を表示させていますが、下一桁が0なので、ぴったり安定のように見えてしまいますが、実際の表示はかなり数値がバラツイテいます。

これだけならば、良さそうに思ってしまいますが、実はx、y方向の数値分布がゆがんでます。

stm32_proj_48.jpg

この画像はスクリーン9箇所をタッチして、おおよその値を読んだものです。上の画像とは異なり (x左右,y上下)で表記してます。
スクリーンの中央付近の上下左右電圧を読んで、(0-320,0-240)になるようにスケーリングしてあります。左下がゼロです。

ところが、左右・上下がかなり歪の大きい値になります。特に、左側の上下方向は酷い状態で使い物になりません。

この4線抵抗膜式タッチスクリーンのAD値はタッチしないとほぼゼロで、タッチするとある値以上にピッと上がるので、「アナログウォッチドック」という割り込み機能を使えば(まだ調べていないが)、音楽演奏中に停止時間僅かでボリューム変更ができるのだが、タッチ精度が悪いと操作ができないとなってしまう。

まあ、この小さなTFT液晶は、表示専用か、タッチ機能を使うとしても大雑把な機能に減退されるのかもしれません。


折角、タッチができるようになったので、その処理内容を備忘録とします。
-----------------
私はこれまでpicマイコンを使ってきたので、後閑さんのタッチスクリーンの記事を参考にさせて頂きました。
ここにはタッチスクリーンの原理が、とっても解りやすく図解されているので、stm32のソフトに反映するのがとても楽にできました。

・stm32側で用意するハード
 1) アナログ入力とGPIO入力に切り替えできるピンを2個、これを LCDタッチの y-,x- 端子に配線する
 2) GPIO出力と入力が切り替えられるピンを2個、 これを LCDの y+,x+端子に配線する
(picと違い、stm32には訳も無いことですね)
 3) ノイズ防止のため、この4ピンは10kぐらいの抵抗でプルダウンしておく。
 4) A/D入力に使うピン2個には、これもノイズ防止のため0.1uF程度のコンデンサをGND間に付ける。

・ソフト
動作と計測の手順は
 計測してもらう側:座標数値を大きくしたい側に+3V、反対側を0(GND)にする
 計測する側   :一方をアナログ計測、もう一方を入力(フローティング)とする → 電圧を計測する

 以上の動作をするチャンネルを切り替えて別方向の座標を計測する。

【GPIOを切り替えてx,yを交互に計測する部分】
この後で、計測した10回の rPoint データの真ん中辺3点の平均値を使ってます。

void readTouch(void)
{
  uint16_t rPoint[2][10],temp = 0;
  uint8_t t,t1,count;

  // OUT DC GPIOB_Pin7(Y+), IN DC GPIOA_Pin3(Y-)
  GPIO_Conf_touchY();     // y 方向への切り替え

  GPIO_SetBits(GPIOB,GPIO_Pin_7);   //PB7(Y+) is OUT DC
  GPIO_ResetBits(GPIOA,GPIO_Pin_3); //PA3(Y-) is IN DC
  GPIO_ResetBits(GPIOB,GPIO_Pin_6); //PB6(X+) is IN DC
                                      //PA2(X-) is Analog IN
  delay_ms(5);  // 安定時間
  for(count = 0; count<10; count++ )  //10回計測する
    {
      Present_ParamY = ReadADC1(ADC123_IN2_CH);   //STBee.hへDefine追加してます
      delay_ms(1);
      if(Present_ParamY > 3000 || Present_ParamY < 5000){
          rPoint[0][count] = Present_ParamY;
      }
    }

  // OUT DC GPIOB_Pin6(X+), IN DC GPIOA_Pin2(X-)
  GPIO_Conf_touchX();   // x 方向に切り替える

  GPIO_SetBits(GPIOB,GPIO_Pin_6);   //PB6(X+) is OUT DC
  GPIO_ResetBits(GPIOA,GPIO_Pin_2); //PA2(X-) is IN DC
  GPIO_ResetBits(GPIOB,GPIO_Pin_7); //PB7(Y+) is IN DC
                                      //PA3(Y-) is Analog IN
  delay_ms(5);  // 安定時間
  for(count = 0; count<10; count++ )
    {
      Present_ParamX = ReadADC1(ADC123_IN3_CH);  //STBee.hへ追加
      delay_ms(1);
      if(Present_ParamX > 3000 || Present_ParamX < 5000){
          rPoint[1][count] = Present_ParamX;
      }
    }


【y方向へ切り替え】
void GPIO_Conf_touchY(void)
{
  //GPIOD,GPIOE clock set
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA, ENABLE);

  GPIO_InitTypeDef GPIO_initstruc;

  // OUT DC (Y+) pin = PB7
  GPIO_initstruc.GPIO_Pin=GPIO_Pin_7;
  GPIO_initstruc.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_initstruc.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOB,&GPIO_initstruc);

  // IN DC (Y-) pin = PA3
  GPIO_initstruc.GPIO_Pin=GPIO_Pin_3;
  GPIO_initstruc.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  GPIO_initstruc.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOA,&GPIO_initstruc);

  // IN DC (X+) pin = PB6
  GPIO_initstruc.GPIO_Pin=GPIO_Pin_6;
  GPIO_initstruc.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  GPIO_initstruc.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOB,&GPIO_initstruc);
  ADC_InitTypeDef  ADC_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;

  /* ADCCLK = PCLK2/6 = 72/6 = 12MHz*/
  RCC_ADCCLKConfig(RCC_PCLK2_Div6);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | ADC_IN0_3_GPIO_RCC, ENABLE);

  GPIO_InitStructure.GPIO_Pin = ADC123_IN2_PIN;  // PA2(X-) pin is Analog IN
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(ADC123_IN2_PORT, &GPIO_InitStructure);
}

【x方向に切り替え】
void GPIO_Conf_touchX(void)
{
  //GPIOD,GPIOE clock set
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA, ENABLE);

  GPIO_InitTypeDef GPIO_initstruc;

  // OUT DC (X+) pin = PB6
  GPIO_initstruc.GPIO_Pin=GPIO_Pin_6;
  GPIO_initstruc.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_initstruc.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOB,&GPIO_initstruc);

  // IN DC (X-) pin = PA2
  GPIO_initstruc.GPIO_Pin=GPIO_Pin_2;
  GPIO_initstruc.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  GPIO_initstruc.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOA,&GPIO_initstruc);

  // IN DC (Y+) pin = PB7
  GPIO_initstruc.GPIO_Pin=GPIO_Pin_7;
  GPIO_initstruc.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  GPIO_initstruc.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOB,&GPIO_initstruc);

  ADC_InitTypeDef  ADC_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;

  /* ADCCLK = PCLK2/6 = 72/6 = 12MHz*/
  RCC_ADCCLKConfig(RCC_PCLK2_Div6);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | ADC_IN0_3_GPIO_RCC, ENABLE);

  GPIO_InitStructure.GPIO_Pin = ADC123_IN3_PIN;  // PA3(Y-) pin is Analog IN
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(ADC123_IN3_PORT, &GPIO_InitStructure);
}

この他に、ADチャンネルの設定、読み込みがありますが、一般的な設定なので省略します。



・・・小型化は諦めてプレーヤーを完成させなくてはなりません。




プロフィール

haiga

Author:haiga
私のブログへようこそ!
電気オンチが始めた自作オーディオです
2010/3/17 電子工作をプラスしました。

自作オーディオの楽しみ共有のため、私が作ったパーツ提供をしてます。質問や要望を遠慮なくコメント欄に書き込んでください。

FC2カウンター
その日1回目にアクセスいただいた方の総カウントです
最新記事
最新コメント
最新トラックバック
カテゴリ
月別アーカイブ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード