2014年4月22日火曜日

PSoC5LPでキャラクターLCDを使おう!

「キャラクターLCDはちょっと値段が高いし
壊したり、扱い切れないともったいないよなぁ・・・」

PSoC5LPなら
設定も簡単に、易しく、表現豊かに
扱うことができます。

さて、キャラクターLCDモジュールを使って
文字(アスキーコード)
数字(整数)
バーグラフ
をキャラクターLCDに表示させましょう。

使うキャラクターLCDモジュールは
HD44780互換のモジュール
(秋月だとSC1602***系のLCDモジュール、心配ならお店の人と相談しよう。)

つなぎ方が気になるかと思う。けれど先にPSoC5LPで使う
ポートを決めて置く方が先になります。
「ポート」と言うのは
「ある7本のピンを1つのカデゴリーとして表すこと」です。
ちょうど、住所を
緯度と経度で書くのか、
市区町村の番地で書くのか
だと近いかも??。


LCDのデータ入出力用のピンが6本あるのですが
設定の時点で、ポートごとの設定となってしまいます。なので
今回は先に使うポートをザックリ決めておいてください。


さて、まずは「LEDチカチカしようの準備編」の状態から
「Character LCD」をドラックアンドドロップだけ


さて、ドラックアンドドロップしたら

ダブルクリックをして設定をしましょう。


ここで設定できるのは、
「バーグラフ」の設定で
「Vertical Bargraph」は、垂直棒グラフ
「Horizontal Bargrah」は、水平棒グラフ

今回は水平棒グラフを選びます。

そうしたら、「OK」ボタンを押して閉じましょう。

次にポートの設定をしましょう。
[****].cydwrをダブルクリックして
「Pin」のタブでつなぐポートの設定しましょう。
「Port」のプルダウンメニューを開くと不思議な表記になっていますね。

P*[6:0]とP*[7:1]と言うような表記ですね。
これは、ポート*の何番目から何番目まで使いますよ。
って言う表記です。

カッコの中のコロン(:)の右側が「X番目から」と言う意味で
コロンの左側が「Y番目まで」と言う意味なのです。
今回の表記だと、
「ポート*番の0番目~6番目まで」
もしくは
「ポート*番の1番目~7番目まで」
が選択できるようになっています。
ポートはどこでも良いのですがP*[6:0]と表記されているタイプが良いでしょう。

選んだら、一度コンパイル。
ここまで来たら、LCDモジュールの準備をしましょう。
まずは、LCDのバックライトが点灯する様に抵抗とジャンパーをはんだづけします。
(へたくそだったのでJ3のパターンを壊しただけです。)


PSoC5LPとキャラクターLCDのつなぎ方はコンポーネットの
データシートにあるのでそれを見ましょう。
つなぎ方を見やすくしたのでこれを参考にすると良いでしょう。


PSoC5LPとの接続ができたら、
「main.c」をダブルクリックして、main.cのタブを出しましょう。

まずは
Int main(){…の中に

LCD_Char_1_Start();
LCD_Char_1_Position(0,0);
LCD_Char_1_PrintString("Hello PSoC5LP");

と書きましょう。

LCDモジュールに文字や数字を書くには
「LCDのここから書き始めて!」っと言うのをプログラムに書きます。
ディスプレイ内を行と列として扱うことで「LCDのここ!」を指定できます。
2列16行の場合このようになっていて

左上が「0行0列」となっています。

LCD_Char_1_Position(0,0);
が「ここから書き始めて」っという事です。
次の行に書いた
LCD_Char_1_PrintString(“Hello PSoC5LP”);

はStringとあるように「文字列」なんです。
表示させたいことを()の中“”の中に書きます。
残念ながら日本語の表示には対応していないので、
アスキーコードの中にあるものしか使えません。

数値の場合は
LCD_Char_1_PrintNumber();
となります。PrintNumber()の場合は“”は要りません。
ただし16bit整数しか使えません。つまり0~65536までしか扱えないので
注意してください。(小数点も使いたい場合、文字に変換するひと手間がいります。)

さてバーグラフは
uint8 Bar=0;
   
    while(Bar <=80){
   
    LCD_Char_1_DrawHorizontalBG(1,0,16,Bar);
    CyDelay(200);
    Bar++;
   
    }
とこんな感じに書くと動きます。

LCDに書いている本体は
LCD_Char_1_CrawHorizontalBG(行,始めの列,終わりの列,ここまで書く);

となっていて、「ここまで書いて」と言うのは
LCD表示の1つのブロックを縦に5等分したものを「1個」としています。
「80」の場合、始めの列から縦に80個分という事になります。

今回は、プログラムが単純な割に長いので
私が書いたものをコピーしておきます。

int main()
{
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
    LCD_Char_1_Start();
   
    LCD_Char_1_Position(0,0);//0行0列に書く
    LCD_Char_1_PrintString("Hello PSoC5LP");//書くのは文字列
    CyDelay(2000);
    LCD_Char_1_ClearDisplay();//ディスプレイをすべて消せ!
   
    LCD_Char_1_Position(0,0);//0行0列に書く
    LCD_Char_1_PrintString("print number");
    LCD_Char_1_Position(1,0);//1行0列に書く
    LCD_Char_1_PrintNumber(43210);//書くのは数値
   
    CyDelay(2000);
   
    LCD_Char_1_Position(0,0);
    LCD_Char_1_PrintString("Downlod START");
   
    uint8 Bar=0;//8bitの整数の箱
   
    while(Bar <=80){
   
    LCD_Char_1_DrawHorizontalBG(1,0,16,Bar);//水平バーグラフを書け
    CyDelay(200);
    Bar++;
   
    }
   
    LCD_Char_1_ClearDisplay();
   
    LCD_Char_1_Position(0,0);
    LCD_Char_1_PrintString("Exit Test");
   
    LCD_Char_1_Position(1,0);
    LCD_Char_1_PrintString("==Complete==");
   
    /* CyGlobalIntEnable; */ /* Uncomment this line to enable global interrupts. */
    for(;;)
    {
        /* Place your application code here. */
    }
}

これに書き替えたら、もう一度コンパイル。

LCDモジュールとPSoC5LPとの配線が比較的にややこしいかと思いますので
ゆっくり配線するのがいいでしょう。

 ~~2行のLCDと4行のLCD~~
HD44780互換のLCDモジュールには
2行16列のタイプと4行20列のタイプがあります。

どちらも動かすのが可能ですが、
0行19列を超えると1行0列となってしまいます。

2行16列のタイプを使う方が簡単なのでそちらを使うことを勧めます。

2014年4月19日土曜日

PSoC5LPでLEDをふわふわ光らせよう。

せっかく、LEDのほぼ書かないプログラムが出来たので
それを改造して

LEDをふわふわ(じわじわ)光らせよう。

改造が必要なのは
使った部品の設定とプログラム


さて、改造をしてLEDをフワフワさせましょう!

設定を変えるのは
クロック と PWM

クロックの設定が500Hzだと遅すぎるので
500Hz ⇒ 12kHzに
設定しましょう。

PWMも16bitもいらないので、
16bit ⇒ 8bitに
しましょう。


ただ、ラジオボタンを移動させただけだと


「!」マークが出て「エラー」が出ます。
なので、「Max」のボタンをクリックしてエラーを取りましょう。


「OK」をクリックしたら、一度コンパイル。


コンパイルが終わったら、「main.c」のタブを開いて

for(;;)の外側に

PWM_1_Start();
int i;

を書きましょう。

for(;;)の内側に

for(i=0;i<=254;i=i+1){
PWM_1_WriteCompere(i);
CyDelay(5);
}

を書いて、もう一度コンパイル。

書けたら、PSoC5LPに書きこんでみましょう。
どうです??ふわふわ(ジワジワ)光りました??

書き方としてはArduino系に近い書き方かな?っと思います。
同じ要領で、通常のモーターやサーボモーターも制御できますよ。



~~番外編 ほしいPWMを作るには??~~


今回、手順通りにすればLEDがフワフワする様になりますが
実際では

サーボモーター制御するためにベストなPWMを作りたい とか
赤外線LEDを38kHでチカチカさせたい 等だと思います。

なので、PWMコンポーネットに供給するクロックの
計算法について書いておきたいと思います。

8bitの場合
1÷{(1÷X[Hz])÷256}=Y[Hz]

16bitの場合
1÷{(1÷X[Hz])÷65536}=Y[Hz]

このひと手間で、「ライブラリーがなぁ・・・」という事も無くなります

2014年4月18日金曜日

マニュアルはどこ?~~ソフトの中にマニュアル~~

Arduino系もmbed系も使うのにはwebページのマニュアル(handbook等)
を読むなり、探すなり、の必要がある。


PSoC5LPにもマニュアルがある。
実のところPSoC5LPの部品(コンポーネント)ごとにマニュアルがあり
PSoC5LPの場合マニュアルの事をデータシートと呼んでいる。


データーシートの言語には、英語、中国語、日本語と言語があるので
最適なのを選ぶとよいでしょう。
ただし、最新バージョンは英語のみなので、
日本語マニュアルを読んでから、英語マニュアルを読むのが
いいかもしれません。

なぜ、古いバージョンでも読んでも平気かと言うと、新しいバージョンでも呼び出す関数
(Pin1_write()みたいな文章のこと)などはそんなに変わらない事が多いためです。

ただし、必ず日本語対応のデーターシートがあるわけでは無いのでちょっと注意してくださいね。



データーシートの探し方は、2通りあります。


1つ目は、使いたいコンポーネットを入れて、とりあえず一度ビルドをした後




左側のウインドウにある「Detasheets」のタブをクリックすると


PDFのファイルがたくさん入っているはずです。
このファイル一つ一つがコンポーネットのデーターシートです。
もちろん、使ったコンポーネットしか表示されていないので、
探す手間はありません。

この「Detasheets」のタブにはPSoC5LP自体のデーターシートを含め
使うであろう全てのデータが表示されます。
英語に苦労しない人は良いでしょう。


2つ目は、Helpの中にあるデーターシート



この2つ目は、日本語のデーターシートをいち早く見つける事が出来る方法
インターネットに接続した状態で

「Help」をクリックして写真のように日本語ドキュメントのボタンが出てきます。



クリックするとブラウザーが起動して
日本語対応のデーターシートがずらりと出るでしょう。



ここから必要なデーターシートをダウンロードしましょう。


コンポーネットのデーターシートにはコンポーネットのピンに対する意味や使い方、
必要となる追加の電子部品、コンポーネットを操作するための関数についてが書いてあります。


これを読みながらPSoC5LPを思い通りの形に変化させ、使うことが出来るようになるでしょう。