2016年12月21日水曜日

感雨センサーをつくってみる。

今回はオペアンプとADCを組み合わせて、感雨センサーを作ってみました。
今回のは今までの記事を総合していけば難しい話ではない。

感雨センサーは割とお安く売っているのだけれど、
MEMS、つまりは専用ICになっているというわけじゃ無くて
むき出しの配線に水滴が当たると抵抗値が下がると言う仕組み。
ひずみゲージとかと同じで、
どう考えてもアナログフロントエンドが必要な類のセンサーです。

さて、分圧回路をするか差動増幅みたいな感じなるのかなと考えてチョロット
実験をしてみました。結果から言うと分圧してあげる方がよさそうという事がわかりました。しかし、感雨センサーに水滴を付けたりさせても200KΩ~1MΩぐらいの変化なので分圧回路に使う抵抗は変に小さくすると反応が出ないので「どうしたもんかね?」と言うのが出る訳ですな。

通常のMCUだと「どうしたもんかね…」でおしまいになるのですが、
PSoCなら分圧回路から出力される電圧値をオペアンプで増幅してあげれば
ADCにつなげた時にADCの分解能を最大限使える様になるはずです。
これは今回構成したPSoCの中身です。



分圧回路→オペアンプで1.5倍に増幅→ADCでデジタルに変換
デジタル値はI2CのLCDへ表示する。と言う感じ。
ただし、デジタル値は乾いているとき(抵抗値が大きいとき)は
電圧が大きくなる。なのでそこは気を付けないといけない。



MCUで同じことをするにはオペアンプを買ってきて、
電流制限を付けた電源を作ったりして流れる電流量を調整したり
(しないと配線むき出しのセンサーが熱を持つ可能性がある)
と非常に面倒臭い…。
ま、PSoCだとセンサーの性質を調べる方に時間がかかったけど
割と簡単にできちゃいます。

温度や湿度、気圧などは専用のICとして売られているけれど
今回みたいに物理的な現象を電圧値に変えてセンサーとして使う場合は
アナログフロントエンドを避けて通る事は中々難しい。
また、王道のアナログ回路をするのは部品や機材も多く必要になる。
けどPSoCであれば、途中から部品を買い足す事も少なくなるので
お財布にも優しく、多種多様構成が出来るのでうまく使って
高速に作りたいシステムや作品を作りましょう!!

2016年12月16日金曜日

ルックアップテーブル(LUT)ってなんじゃろ

アドベントカレンダーの15日目

さて、前回はオペアンプとコンパレータ―をつかってアナログ回路の序盤を試してみました。
今回はその対極側のデジタル回路の方にトライして見ようと思います。

「デジタル回路って言うとソフトウェアのことでしょ!」と思う人も多いかも知れない。
けれど、今回はCPUによるソフトウェアのパワーと言うわけでは無く
ある意味正統なデジタル回路、つまりは
0と1(OFFとON)の組み合わせによって動く回路
の論理回路をしてみる。

 論理回路は簡単に言うとある入力の組み合わせの時に、ある出力がされる」のこと
だと考えてもらえば大筋間違いはないだろう。
論理回路では入出力の組み合わせのことを真理値表と言う。
試しにAND回路とOR回路の入力と出力の真理値表を見てみよう。




これはCypressのANDとORのデータシートの抜粋です。
真理値表では1と0で表現されていて
「0」OFFもしくはLowのことで、日本語だと偽
「1」ONもしくはHighのことで、日本語だと真
となっている。

AND回路は入力が片方だけではなく、両方ともの入力が入ると出力される。
OR回路ではどちらかの入力が入っていると出力がされている。
王道では「または×の時」の論理和や論理積、否定論理を知って置くべきだが、
カルノー図をつかって縮小した論理作り出すことも珍しいので
細かい部分は電子回路の本を見てほしい。

今回はカルノー図や、論理回路の組み立て方になじみがなくても、論理回路を作る方法がある。
それはルックアップテーブル(LUT)を使う方法になる。

今回はタクトスイッチ3つとLED4つをつかって、ルックアップテーブルを試してみようと思う。
タクトスイッチは始めの状態が「OFF」、「Low」の状態つまりは、正論理でないといけないので
スイッチの配線には注意が要る。
それでは試してみよう。


空のプロジェクトを作ったら、
今回は出力ピンが4つ、入力ピンが3つ使う。なので、DigtalOutが4つ、DigitalInが3つをドラックアンドドロップする。


DigitalInの初期状態がLowの状態でないといけないため、内部に接続する抵抗の設定をPullDownにする。よくある電気工作の本だとPullUpと書いてあることが多いと思うが、今回はこれで大丈夫なので進めてほしい。


ここまでできたら、Digital→logicの中になるLookup table
ドラックアンドドロップしてトップデザインに入れる。



こんな感じになる。



Lookup tableのコンポーネントをダブルクリックして、設定を開くと
こんな感じになっている。



ルックアップテーブルと言うのは真理値表をそのまま入力すれば、動作する
コンポーネントになっている。しかし、入力数と出力数には制限があるので注意してほしい。
表の左側の灰色側が入力側黒の縦線を挟んだ右側が出力側となっている。
今回は3入力、4出力となっているので、増やす必要がある。
左上側のフォームにinput outputが書いてあるここを操作して3入力4出力にしてほしい。
操作し終わるとこんな感じ。



ここまで出来たら、入力の組み合わせに対する出力の設定をしていこうと思う。
試しに、出力側の表の「0」をクリックしてみると「1」に変わるだろう。
逆に「1」をクリックすると「0」に変わるだろう。
つまり左側の組み合わせの時に、任意の出力の組み合わせとなることになる。
今回はこのような組み合わせにしてみた。


任意の設定が出来たら「OK」をクリックして閉じよう。
ここまで出来たら、LUTと入出力のピンを接続しよう。 
接続し終わるとこのような形になる。


ここまで出来たら、使うPinの番号もしくはポート番号を左側のメニューバーにある
「Pin」をダブルクリックして設定をしよう。
今回は特に制約がないので任意のポートに設定をします。
ここまで出来たら、コンパイルをしよう。
コンパイルをしている間に、実際の配線をしましょう。
こんかいはこんな感じで配線をします。
スイッチの配線は間違えないようにしないと正しく動作しないので注意が要ります。


配線が終わったら、プログラムは一切書かないのでこのまま書き込みます。
書き込みができたら、タクトスイッチを押して
ルックアップテーブルの設定通りに動くか試してみよう。
正しく動いたら成功だ!
(/・ω・)/

さて、今回はタクトスイッチとLED4つをつかってルックアップテーブルを試してみました。
ルックアップテーブルは内部の設定次第で今回みたいな使い方(デコーダー)や
カウンタ―にも変わる便利な道具です。
使い方次第で、ロボットやLEDの動作にも使えるので
うまく使うと時間的な制約が緩くなるのでプログラミングも楽になると思います。

上手く組み合わせるとこういう風な動作もプログラミングをしなくても出来るようになります。


2016年12月11日日曜日

コンパレータ―をつかってみる。(前回の続き)

前回の記事のつづき。

前回の記事で触れた通りで
コンパレータ―は電圧を比べる機能を持っている。
カンが良い人もいるかも知れないけど、
比べて上回れば出力されるという事出力が0or1、つまりはONとOFFという事になる。
そう、じつはコンパレータの入力部はアナログだけど、出力されるのはデジタルなんだ。
つまり、コンパレータはアナログとデジタルの境界にある物なんだね。アナログフロントエンドの最後に使われるADCにも、コンパレータが入っている。ただ、コンパレータを沢山つかうと言うケースは中々ないのであまり登場しない。もちろん設計の仕方やリソースが減ってくると使う事もあるので知っていて損はないだろう。

さて、今回はADCを使ってみたときに使った温度センサー(LM61BIZ)
コンパレータ―で温度の検出をしてみる。このセンサーは0℃の時に600Vを出力して
1℃あたり10mV増減する。
よってこのセンサーは600mAXmAの電圧値が出力されるという事になる。
目標とする温度の電圧が用意出来れば、センサーの電圧を比較して
センサーの電圧値が上回ればその温度以上ある事が分かる。
つまり、目標の電圧とセンサーの電圧をコンパレータで比較してHIGH(ON)になれば
その温度以上ある事がわかる。

それではやってみよう。
今回は前回と比べてかなり単純。
温度センサーとコンパレータをつなげて、ある温度以上になったら
LEDが光ると言うのをやってみる。

アナログのコンポーネントの中から、コンパレータと
VDACをドラッグアンドドロップしてトップデザインへ入れる。



トップデザインに入れるとこんな感じ。

コンパレータ―のコンポーネントを開いたら、



Speedの項目のラジオボタンをFastに設定をして、Syncの項目のBypassを設定する。


出来たら、OKをクリックして閉じます。
今回はVDACの電圧設定がキーになる。
温度センサーに触れてしばらくしたら、LEDが光るようにしたいので
あまり高い電圧設定ではLEDが光ってくれない。かといって電圧が低くて光りっぱなしでは
テストにならない。と言うことで私の本業の知識から引っ張り出すと、
指の温度は個人差が多少なりともあるが28℃位を超えるかあれば
コンパレータのテストになるだろう。
なので、今回は600+28*10=880mAに設定をすれば良さそうだ。

設定が出来たらOKをクリックして設定を閉じよう。
ここまで出来たらコンポーネント同士を接続しよう。
記事の冒頭で書いた通り、コンパレータ―はアナログとデジタルの堺になる。
つまり、コンパレータは入力側のピンの種類がAnalogPin
出力側のピンがDigitalPinを接続する事になる。
なので、今回はこのようにつなぐことになる。


これが出来たら使うピンの設定をしよう。
オペアンプの時と比べ、コンパレータ―は内部のリソースに余裕があるので
どのピンでも問題は特にない。しかし、デジタル専用のPort12は使えないので注意が要る。
光らせるLEDのピンは基板についているLEDを使いたいのでP2[1]にしておくと良いだろう。
わたしはこんな感じ。

ここまで出来たら、コンパイルをしよう。
コンパイルをしている間に、センサーとPSoCをつなげよう。

つなげられたらプログラミングをしよう。今回も単純。
コンパレータ―と比較対象のVDACのスタートを書いておしまい。
int main(void)
{
    CyGlobalIntEnable; /* Enable global interrupts. */

    WaveDAC8_1_Start();
    Opamp_1_Start();
    VDAC8_1_Start();

    Comp_1_Start();
    VDAC8_2_Start();

前回のプロジェクトを引き継いでいるのでWaveDAC云々があるが必要なのは2行だけ。
Comp_1_Start();
    VDAC8_2_Start();

ここが書けたら、もう一度コンパイルをしてPSoCへ書き込んでみよう。
書けたら、温度センサーに触れてみよう。
しばらくしたらLEDが光れば成功だ!!
(/・ω・)/

全2回をつかってアナログ回路の始めの方をしてみた。
実際のアナログフロントエンドでもアナログ回路の基本的な使い方を組わせてほしい機能を実現している。
PSoC3,PSoC5LPにはプログラム側から倍率の変更が出来るオペアンプや
電流値として出力されるセンサー等に対してADCが使えるように電流電圧変換アンプもある。
上手に使えば、ワンチップでアナログフロントエンドが出来てしまうでしょう。
また、オペアンプやコンパレーターを工夫して取り入れることで今回のように
CPUを使わないことで並列処理の様なシステムも組める。
なのでプログラミングに自信が無い人もアプローチを変える事も考えてみると良いでしょう。

2016年12月7日水曜日

PSoCでオペアンプとコンパレータを試す(コンパレータ―は別の記事で書くよ)

I2CやキャラクターLCDを含め、割とCPUのパワーを使う事が多かったので
今回は真反対のアナログ系について触れてみようと思う。

さて、以前の記事ではアナログをデジタルに変換をするADCのコンポーネントをつかって温度センサーの値を変換した。しかし、ADC以外にもPSoCには、アナログ回路を直接的に構成する事ができるコンポーネントがある。「高速、高分解能のADCがあればいいのでは?」っと思うかもしれない。けど、ADCへ接続する前に必要な電圧を取り出したり増幅する事が出来れば、ADCをより効果的に使う事ができる。これにはオペアンプを使ったり、コンパレータ―を使う事で取り出したり増幅することが出来る。ADCへつなぐ前の信号に、増幅や加工をすることをアナログフロントエンドとかシグナルコンディショニングと呼ぶ。
PSoC3,PSoC5LP,PSoC4に差はあるもの、オペアンプとコンパレータを内蔵している。
どのファミリーでも最大でオペアンプが4個、コンパレータ―が4個を内蔵している。
特にPSoC3とPSoC5LPにはスイッチキャパシタとオペアンプを合成したSC/CTブロックが4個ある。
これにより外部から抵抗を足すことなく特定のアナログ回路も構成することが出来る。
そのためPSoC3,PSoC5LPはPSoC4よりもアナログ系が得意と言って問題は無いだろう。
 通常のMCUばかりでオペアンプやコンパレータ―になじみが薄い人も多いので
少しオペアンプとコンパレータについて触れよう。
オペアンプとコンパレータは2つとも電圧の状態によって動いている部品になっている。
MCUではCPUがメモリー内にある数値を読みだす事で計算を出力する。
しかしオペアンプやコンパレータ―はメモリーではなく、
電圧同士の計算を行った結果を出力すると考えてもらえばいいだろう。

オペアンプは簡単に2つの機能がある。
 ①電圧を増幅する機能
 ②電圧同士を演算する機能(微積分もできたりする)

コンパレータの機能は1つ
 ①電圧同士を比較する機能

っと簡単にこんな機能がある。
オペアンプやコンパレータ―は単体ではほしい機能を得ることは中々少ない。それは入力部側(+と-の線)の関係性が出力側の結果へ反映される。そのため、抵抗やコンデンサを外付けする必要がある。オペアンプやコンパレータ―の全てを解説するのはなかなか難しいので、電子回路の本等でどういう使い方をするのかを調べて欲しい。
今回はPSoCをつかって簡単にオペアンプとコンパレータ―を使ってみようと思う。
今回はオペアンプを使って、増幅率2倍の反転増幅回路をしてみる。
反転増幅なので、オペアンプに入力した信号がプラスの電圧なら、出力は入力と比べて
マイナスの電圧が出力される。教科書でも出てくる標準的な使い方だ。
けど、PSoCが持っているオペアンプは方電源(+だけ)のため、教科書に出てくるような正負電源(プラスマイナス両方)をつかったオペアンプとは少し違う。
簡単に言うと増幅した信号が0Vより下回ると出力されない。
そのため出力電圧が0Vよりも下回る場合にはちょっとした工夫が要る。

それではやってみよう。
必要なものはPSoC5LP、もしくはPSoC3。100KΩ1個と200KΩ1個。
オシロスコープ(キットのオシロスコープでもかまわない)
今回は電源電圧を5Vで行う方が良い。

空のプロジェクトを用意したら。

アナログコンポーネントから

OpAmpとWaveDACとVDACをトップデザインへドラックアンドドロップする。



WaveDACは周波数発生器の代わりとして使って、
VDACは0Vより下に出力されてしまうのを解決させるのに使う。
トップデザインに並べるとこんな感じ。


先ずは、OpAmpのコンポーネントをダブルクリックして設定をしよう。

今回は実験なのでPowerのプルダウンメニューからHigh Powerを選択して


設定が出来たら、OKボタンをクリックして閉じよう。
その次はVDACをダブルクリックして設定をしよう。

Speedの項目にあるラジオボタンのHigh Speedに設定をして、
Valueの項目のmVの項目を668に設定をする。

出来たら、OKボタンをクリックして閉じよう。
その次はWaveDACをダブルクリックして設定する。

設定はほとんど触らないのですが
Range selectionのプルダウンメニューから
VDAC0 1.020V(Buffered)を選ぶ。


それが出来たらOKボタンをクリックして閉じる。
このままだと回路が動かないので、必要な所に結線とAnalog Pinを足して
抵抗をつなげるようにしていく。
WaveDACにはWSのピンにDigtal → LogicのLogic Lowのコンポーネントをつなげてあげて

WaveDACの先にはPort and Pins → Analog Pinのコンポーネントを追加する。

ピンやコンポーネントを反転させたいときはコンポーネントを選択した状態で、
メニューバー近くの反転ボタン(青い囲いの中)をクリックすると反転する。

繋ぎ終わるとWaveDACはこんな感じになる。

VDACはOpAmpの入力側のプラス側につなげる。

OpAmpは入力側のマイナス側にAnalog Pinをつなげる。

使うAnalog Pinは名前を変更しておいた方があとあと楽なので変えておく方が良いでしょう。
ここまで出来たら左側のツリーチェーンからPinをダブルクリックして
使うピンを設定しよう。
どこでもいいと言えばいいけれど、今回はOpAmpを使うのでプルダウンメニューから
OpAmp[*],***と表記されている物の方が内部リソースを無駄に消費しなくて済む。

例えば、オペアンプのマイナスに繋ぐピンにはOpAmp[*],vminusに設定をするような感じで設定してほしい。WaveDACの出力ピンはOpAmp[*],Voutに設定してほしい。
私はあまりギチギチにしなかったので、こんな感じにしました。

ここまで出来たら一度コンパイルしよう。
コンパイルをしている間にPSoCに抵抗を追加して反転増幅回路を構成しよう。
WaveDACとOpAmpのマイナスの間に100KΩをつないで、
OpAmpのマイナスと出力側の間に200KΩをつなぐ。
繋ぐとこんな感じ。

コンパイルが終わったら、プログラムを書いてOpAmpやDACが使えるようにしよう。
プログラムは単純。
int main(void)
{
    CyGlobalIntEnable; /* Enable global interrupts. */

    WaveDAC8_1_Start();
    Opamp_1_Start();
    VDAC8_1_Start();

  
だけ。For文の中身は空っぽでOK
それが終わったら、もう一度コンパイルをしてPSoCに書き込もう。
書き終わったら、WaveDACの出力ピンとオペアンプの出力ピンに
オシロスコープのプローブをつなげてみよう。
(1CHがWaveDAC,2CHがオペアンプの出力)

WaveDACからは0~1Vの電圧で1Khzの正弦波(sin)が出ていて
OpAmpの出力側からは0~2Vの間でWaveDACとは電圧が反転した波形が2倍で出力されていれば成功!
(/・ω・)/

反転増幅回路は「マイナス」X倍で出力される。そのためどうしても0Vより下の電圧値が出てしまう。
オペアンプのバーチャルショートを利用して0Vより下回っている部分を0Vより上にする事が出来る。

記事が長くなり過ぎたので、ここで中断するよ。
別の記事にコンパレータ―の実験を試してみるよ~。