ラベル レベル2 の投稿を表示しています。 すべての投稿を表示
ラベル レベル2 の投稿を表示しています。 すべての投稿を表示

2016年12月21日水曜日

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

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

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

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

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



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



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

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

2015年10月17日土曜日

キャラクターLCDの文字コードを使ってみる。

今回はキャラクターLCDの「文字コード」を使って
半角英数だけでは無い表示をさせてみようと思います。

さて、キャラクターLCDの文字コードとはなに?
っと言う話を少ししておこうと思います。

パソコンはもちろんなのですが
コンピューターは人間の文字が分かりません。
なので、数値の組み合わせに人間の文字を対応させる事によって
コンピューターが人間へ文字を見せられる様になります。
数値の組み合わせと文字の対応の事を「文字コード」と言います。
この文字コードで有名なのは恐らくASCIIコードでしょう。

では、なんで文字コードとキャラクターLCDに関係があるかと言うと
キャラクターLCDとPSoCは文字コードを使ってLCDに表示させているのです。
つまりは、キャラクターLCDに文字コードが内蔵されているいてそれを使っているのです。

え、「プログラムで文字コードなんて意識していないって?」

それはPSoC Creatorのライブラリーが見えない様にしていたからです。
普段は文字コードを意識せずに表示させていました。
ですが今回は文字コードを使って表示させようと思います。

キャラクターLCDモジュールはHD44780(コンパチブル)っと言う
コントロールICを返してLCDに表示させています。
先ずはHD44780が使う文字コードを調べましょう。

これはSparkFanにあったHD44780データシートの抜粋



これが内蔵されている文字コード
アルファベットとカタカナと特殊な文字が使える様になっています。
HD44780互換であればこの文字コードが使えます。
また、任意の文字や絵を8個まで表示させる事が出来ます。

表の上の番号がありますね、それはHD44780が使う文字コードの上位ビットです。
表の左側にも番号がありますね、文字コードの下位ビットを表しています。
この表を使うには8bit分の上位4bitと下位4bit分を合わせないと
使えないと言う訳なのですね。

例えばカタカナの「ア」であれば上位ビットの「1011」と
下位ビットの「0001」を合わせた「10110001」となる訳です。
16進数表記であれば「0xB1」と言う事になります。
では実際にやってみましょう。

まずはいつも通りに空のプロジェクトを作って、
キャラクターLCDのコンポーネントを入れます。



しかし今回は任意で作った絵や文字を入れたいので設定を変えちゃいます。


設定画面を開いたら、ラジオボタンの「None」を「User Defined」に切り替えます。
これで任意の表示が出来るようになりました。



今の状態は「Custom 0」が選択されている状態です。
このマトリックス状に表させているのが1文字分です。
このマトリックスをマウスでクリックして任意の文字を作って行きます。
白をクリックし見ると黒へと逆に黒をクリックすると白へと変わります。



何でも良いのですが、携帯のアンテナみたいなのを作ってみました。
これで文字のデザインはおしまいです。
デザイン増やしたい場合はとなりのYの字ブロックをクリックしてみると
Custom1へと変わっています。このようにして変えていきます。


では「OK」をクリックして閉じましょう。

配線は以前の書いた記事にあるので省略します。


配線が終わったら、一度コンパイルをしましょう。
コンパイルが終わったら次はプログラミングですね。
今回のプログラムの内容は意外とシンプル
int main()
{
    CyGlobalIntEnable; /* Enable global interrupts. */

    LCD_Char_1_Start();//LCDをスタートさせる
    LCD_Char_1_Position(0,0);//上の段の左端からスタート
    LCD_Char_1_PrintString("Hello PSoC3");///まずは普通のやり方
   
    LCD_Char_1_Position(1,0);//下の段の左端からスタート
    LCD_Char_1_PutChar(0xB1);//文字コードを使うときはPutCharを使う。数字は16進数表記
    LCD_Char_1_PutChar(LCD_Char_1_CUSTOM_0);//作った文字には***_CUSTM_*で使える
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */

    for(;;)
    {
        /* Place your application code here. */
    }
}
打てたら、再度コンパイルをしましょう。
コンパイル出来たら、実際にPSoC5LPへと書き込みましょう。
(今回はPSoC3を使いましたがPSoC5LPでも全く同じです)



こういう風に表記されれば完成(/・ω・)/
どうでしょうか出来ましたか??

M●edやAru●inoで同じことが出来るかは知りませんが、
文字コードを使えば簡単にカタカナが出力出来ましたね。
またコンポーネントのエディターで絵文字も作れました。

いや~PSoC5LPは便利ですね。

PS:
スイッチサイエンスの
16×2 日本語フォント付きLCDモジュール(青地・白文字)
https://www.switch-science.com/catalog/2448/
でも使えるはずだぞ~。

2015年8月15日土曜日

PSoC3の変数で迷う

PSoC5LPを開発するの様に
PSoC3でもPSoC5LPと同じように開発が出来る訳ですが
やっぱり、微妙に差があるのですね。



さて、変数と言うと
intやcharの様に文字や数値を入れておく道具ですね。
通常は、main()関数の中でも外でもどっちでも
平気なのですが、PSoC3ではどっちでも良いと言うわけでは無いようです。

下の写真はmain()関数の内側で変数の宣言(変数を使いますよ)をしています。
通常は、この方法で問題は無いのですがビルドをかけると



この通り、エラーが出てしまいます。
しかもエラーの説明も「近くに原因がありますよ」位なので
何が原因だったのかが良く分かりません。

ちょっと古い書き方でmain()関数の外側で変数の宣言をして
ビルドをかけると



ビルドが通りました。
使うコンパイラーがPSoC3では異なるので
ちょっとした違いはあるのかなと思います。

*すこし追加

手ほどきをしていただいて、分かったのですが
「 CyGlobalIntEnable」の前に変数の宣言をしてあげる必要があるようです。

つまり
int main(){

   uint32 cou;

 CyGlobalIntEnable;
・
・
・
}
としてあげれば良い様です。

2015年7月13日月曜日

I2Cってなんじゃいな。

PSoCまつり明けの記事としてはちょっと高難易度かもしれません。

さて、I2Cはアイ・ツー・シー、もしくは
アイ・スケア(スクエア)・シーと読みます。

I2Cはフィリップス・セミコンダクター(今のNXP)が開発した
2線式の双方向バスです。
シリアルデータライン(SDA)とシリアルクロックライン(SCL)の
2本を用いて通信をし100kbit/s,400kbit/s,1Mbit/s,3.4Mbit/s,5Mbit/s
の4つの通信スピードがあります。

UART(シリアル通信)と同じようにデバイス間の通信方式ですが
UARTとは異なり複数のデバイスとも通信することが出来ます。

I2Cには、デバイス同士にマスターとスレーブと言う関係性を持っています。

マスターのデバイスはスレーブに対する設定をしたり、スレーブが作ったデータを取ったりします。
スレーブのデバイスはスレーブ同士を見分けるための固定のアドレスと
レジスター(メモリーの集合郵便ポストみたいなもの)を持っています。
レジスターに設定やスレーブが用意したデータが格納され、
レジスター内のデータを返してマスター側とデータのやり取りをします。



多くの場合、I2Cの接続にはマスターが1つに対して
複数のスレーブが接続する単一マスター接続があります。
場合によって、複数のマスターと複数のスレーブを接続する
マルチマスター接続と言うのもあります。

I2Cで難しいのは8bitのセットで格納されているスレーブ側のレジスターです。
レジスターには0,1のビットが8個セットで格納されており、
格納してあるビット列で設定やデータの受け渡しをしています。
スレーブ側のレジスターに格納されているビット列を変更する事によって
スレーブ側の設定が変更されます。
また、一つのビットだけでも大きい意味を持つので、設定に関しては
スレーブ側のデーターシートを良く見る必要があります。
受け渡すデータも格納されている8bitだけでは無く、16bit,24bitと長くなる場合には
マスター側が「ビット演算子」を使ってデータを復元する必要性もあります。

ここまで分かっていればPSoCでI2Cを使う場合には問題ないかなと思います。
PSoCではCapSenseのモニターにもI2Cは使われており、何かとI2Cは登場する機会が
多いかなと思いますので、習得しておくと便利だと思います。

もしも、I2Cの細かい所を知りたい場合には
NXPの中の人が書いた解説を読むのが良いと思います。
https://developer.mbed.org/users/okano/notebook/i2c-access-examples/


次回は実際にPSoC5LPをマスター、スレーブ側を
センサーモジュールでI2Cの通信してみたいと思います。

2015年1月6日火曜日

セグメントLCDを使ってみよう。

以前に書いた「7segLEDを使ってみよう」の記事にある
「4 Digit 7-segment LED Driver」はPSoC4にはありません。

じゃあ、簡単に同じような事をしたい場合はどうしたら?
そう言う場合では、セグメントLCDを使いましょう!

セグメントLCDと言ってもピンと来ないでしょう。
簡単に言えば、キッチンタイマーで使われるような液晶です。
決まった形の表示が出来る液晶で、省電力に優れています。
消費電力の設計が厳しい場合において表示させるには非常に良いでしょう。

LCDと言うと秋月電子とかで見るようなキャラクターLCDの様な
モジュール化された物を想像するかもしれません。
しかし、必ずしもセグメントLCDの場合ではモジュール化されている訳ではありません。

PSoC4,5LPではどのようにべきか
PSoCにはLCDコントローラーが伝統的に(?)導入されています。
ただし、全てのPSoCに入っている訳では無いのではありません。
LCDコントローラーが入っているかどうかはデータシートの確認が必要です。

今回はPSoC4でセグメントLCDとaitendoで売っている
多機能表示器 [JY2941B]を動かしたいと思います。
もちろんPSoC5LPでも似た方法です。

コンポーネントの一覧の「Display」から「Segment LCD」を

ドラッグアンドドロップで入れます。
PSoC4ではクロック供給をしてあげる必要があるので
1KHz~のクロックを作って接続します。(私は1MHzでしました。)


始めに設定を開くとこのように出てきます。


7segLEDの時と同じでコモンとセグメント数の設定があります。
ほかは、駆動方法、フレッシュレートフレームレート、ブライトネスコントラストの設定となっています。
フレッシュレートフレームレートを上げるとブライトネスコントラストの設定幅が広がります。
今回はセグメント数とコモンの設定はそのままにして
フレッシュレートフレームレートを120Hz、ブライトネスコントラストを50%にします。

設定が終わったら、「Display Helpers」のタブを開きます。 


この設定では、使う液晶のコモンとセグメントの関係を設定していきます。
今回はこの設定が非常に重要です。
この設定が出来ていないと、便利なAPIを使うことが出来ません。
左側の「Helpers」が設定の候補です。今回は7segなので
「7 Segment」をクリックしたら、緑の右矢印をクリックします。
そうすると次のように画面が変わります。



中段の7セグの表記の「Helpers function configuration」
と下段の「Pixel mapping table」が出てきます
7segのA,B,Cがコモンとセグメントのどれに対応するかを設定していきます。
操作の仕方は、たとえば7セグのAがCom0とseg0が対応しているとします。
まず、7セグのAをクリックして選択します。


選択したらそのまま、PIX0に向かってドラッグアンドドロップします。
出来るとこのようになります。


この作業は7segLCDのデータシートを見ながら設定していくと良いでしょう。
多機能表示器 [JY2941B]用に設定が終わるとこんな感じになります。 


(Helper_Bar_0が足されていますが、コンマ向けです。)
設定を閉じて、ピンの接続と設定をしていきましょう。
LCDの使うピンをPSoC4の適当なピンに接続していきます。
接続が終わったら、LCDのコモン側にはNameがCom[*]、LCDのseg側にはSeg[*]に設定していきます。
設定が終わったら、一度コンパイル。
プログラムは2行でおしまい。

2行書いたら、もう一度コンパイルをして書き込みましょう。
7segLCDに「1234」が表記されていれば
成功(/・ω・)/


segmentLCDのAPIは7segLEDのAPIと似ていて、一番左側の桁が0番目となっています。
しかし、7segLCDのAPIは文字(A,B,C)の表記が出来ません。
7segLCDで文字を表記したい場合はピクセルごとにON,OFFが必要になります。
そう言う場合では、14,16segLCDを使う方がよいでしょう。

白黒液晶(TN液晶)は大抵のMCUでは表示させるだけで一苦労ものです。
こう言うタイプの液晶は交流電圧で動くことが出来ます。つまりLEDみたいに
GNDに単純につなげば動いてくれる訳ではありません。PSoCには面倒な事を引き受けて
自分のやりたい事を優先させてくれます。
mb*dで同じことが出来るんですかね??