こんな記事もあります!今回の必要素材PIC16F1938ブレッドボードI2C接続LCDLEDジャンパケーブル抵抗(100Ω)必要な前提知識PICの基礎(動けばいい人のためのPICマイコン入門編)I2C接続LCDの使いかた今回作る工作(動画)PICのピンに繋がった抵抗の足を指で触れると、LEDが点灯します(タッチスイッチ)。LCDの値が指の触れる前後で変動していることが分かりますね。タッチセンサ今回はタッチセンサを扱っていきます。タッチセンサとはその名の通り、タッチされたことを感知するセンサです。このサイトで扱っているPIC16F1938にはもともとタッチセンサ機能が付いています。拡張パーツなしでこのセンサが利用できます。この技術をMicrochip社はmTouchTMと呼んでいます。mTouchTMとは簡単に言えば、mTouchの機能が割り当てられているピンのコンデンサとしての容量を数値化するという機能です。コンデンサというのは、そのピンと空気中との間に電気が溜まることを指します。この電気が溜まるまでの時間を勝手に測ってくれると思えばOKです。このピンに巨大な電極(ただの四角い鉄板でもなんでもいい)がつながっていれば、充電には時間がかかるのでこの数値は変化します。何かがピンに触れたことを感知出来るのです。人間も導電性がありますから、巨大な電極として働き、この値がかなり大きく変動します。よって、例えば「mTouchの値が100以下ならLEDをオンにする」というプログラムを書けば、人間がそのピンを触った時にLEDをオンにするように動かせるということです。タッチスイッチですね。詳しい説明(飛ばしてもOK)実際のmTouchの動きは若干直感と異なり、指が触れた時に値が小さくなります。この原理に関しては、いつもお世話になっているこちらのサイトの開いてすぐ下に書いてあります。ある時間(例えば1秒間など)に何回充放電ができたかをカウントして、その値を返すということをしてくれます。指を触れた方が電荷が多く溜まって充放電に時間がかかりますから、1秒間にできる充放電の回数は少なくなります。よって、指が触れた方がmTouchの値は小さくなるわけです。実際にプログラムで使うときは、指が触れたらどのくらいまで値が下がるのかを確かめる必要があります。人によっても値は違うかもしれませんね。センサの値を表示する今回使う回路図では早速mTouchの技術を使ってみましょう。これから各関数を紹介していきますが、内容がある程度理解できればいいので、実際にプログラムを書くときは目次最後の完成プログラムからコピペして、自分のやりたいように関数の中身を変えたりするのが早いかと思います。PICinit()ほぼこのサイトの他の記事のコピペですが、一部変わっているところがあります。}ANSELAのAN4を1にしました。今回mTouchを使えるピンにはCPSという表記がされています。今回私はピン番号7のCPS7を使いたいのですが、この時充放電をするのでアナログ入力にしなければなりません。そのため、ANSELの5bit目はAN4,つまり7番ピンに当たるので1を割り当て、アナログ入力ができるようにしました。TRISAに関しても同様に7番ピンであるRA5を入力に割り当てています。これで入力する準備はできました。CPSinit()今度は容量検知モジュール(CPS)の初期設定をする関数です。}コメントを見ていただければ、そのまま分かるかとは思います。これらのレジスタの意味が分からなくなったら、PIC16F1938のデータシートを開き、ctrl+Fでレジスタ名を入れれば出てきますので参考にしてください。Timer1はある発振子を基準にカウントします。デフォルトではPICを駆動している内部発振子なのですが、今回はクロックソースを容量検知オシレータ(CPSモジュールのことです)にしました。よって、容量が変わるとクロック周波数も変わり、Timer1の時間の刻みが変化します。getCap()実際にこの容量を検知する関数です。}CPSinit()関数の後では常にCPS(mTouch)がオンになっています。よって、TMR1の値がどんどん増えて行っているわけです。これでは計算が面倒なので、計測前に0にしています。その後9ms待っていますね。この間も充放電を繰り返して、その回数がTMR1にカウントされていきます。この秒数は適当に決めて構いません。多ければカウント数が多くなります。ある程度待ったらCPSONを再度オンにします。TMR1の値をcapに代入し、それをreturnで返しています。showCap()getCap()で取得した値をLCDの使い方を参考にLCDに表示します。LCDへの接続関数はこのサイトのままです。}文字列用の配列Capを用意して、sprintfで「Cap:getCap()」をCapに入れます。これをLCD_strでLCDに表示します。}始めの方にあるinitラッシュはそのまま初期化しているだけです。そこに先程作ったCPSinitがありますね。次にLCDのセットアップ待ちを入れ、RB7をオンにしています。RB7には今回の動画では青色LEDを繋いでいるので、これが点灯します。while文の中ではまずshowCap()で容量の値をLCDに表示しています。次にif文内でgetCap()が800以下の時にLEDをオンにしています。私の環境ではmTouchのピンに抵抗を繋いでピンを拡張しているようになっていて、通常時は900ぐらいの値を示します。指で触れた時に300程度まで落ち込むので、その判定基準を800にしました。if文の後の__delay_msですが、別にこの値である必要は全くありません。応答性を良くしたい場合は、これを無くしてもいいかもしれません。}上記のコードをコピペして貼り付ければ、同じ回路であれば動作するでしょう。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。支援のお願いサイト維持のため、ご支援をお願いします。Wellington.。