PSoCでロータリーエンコーダーを利用する

psoc_encoder_01.gif
今回はPSoCにロータリーエンコーダーを接続する。ロータリーエンコーダーを回すと液晶に表示した数字が回転方向によって増えたり減ったりするようにした。

psoc_encoder_02.gif
数字を表示するための液晶モジュールを追加する。「Misc Digital」の「LCD」をダブルクリックすればいい。そして「Config」メニューの「Interconnect」で画面を切り替える。

psoc_encoder_03.gif
ここでポートの設定をする。「LCD_1」の「LCDPort」を「Port_2」に、「Port_0_1」と「Port_0_7」の「Drive」を「Pull Up」にする。
設定したら「View」メニューの「Application Editor」で画面を切り替える。

psoc_encoder_04.gif
そして「Source Files」の「main.c」に処理を書く。

ソースコード中で一番重要なのが「SW_PORT = SW_A | SW_B;」の部分だ。これはロータリーエンコーダーからの信号を入力するポートに出力するための命令になる。「Pull Up」設定をしたポートにはこのように事前に出力しておかないと、プルアップが有効にならない。PSoCに外付けでプルアップ抵抗を用意しても同様に動作しないので注意しよう。


//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------

#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#include "stdlib.h"


#define SW_PORT PRT0DR
#define SW_A 0x02
#define SW_B 0x80

void PrintCount(unsigned char nCount)
{
char pszBuff[4];

LCD_1_Position(0,0);
itoa(pszBuff,nCount,10);
LCD_1_PrString(pszBuff);
LCD_1_PrCString(" ");
}


void main()
{
unsigned char nCount;

LCD_1_Start();

nCount = 0;
SW_PORT = SW_A | SW_B; //Enable Pull-UP
while(1)
{
PrintCount(nCount);

while(SW_PORT & SW_A)
{
}

if(SW_PORT & SW_B)
nCount--;
else
nCount++;

while(!(SW_PORT & SW_A))
{
}
}
}





_DSC9049.JPG
これが今回利用したロータリーエンコーダー。秋月電子で200円程度で販売されている。「EC16B」という型番のようだ。

写真で上からA、B、C端子となる。一番上のA端子をポート01に、B端子をポート07に、一番下のC端子をGNDに接続する。PSoC内でプルアップしているため抵抗などは必要ない。

ちなみに購入時は「ロータリースイッチ」と間違えないように。ロータリーエンコーダーとロータリースイッチは全然別物だ。

_DSC9050.JPG
これがテスト時の様子。直接ポート端子に接続した。

_DSC9051.JPG
これでロータリーエンコーダーをぐるぐる回すと数字が変わる。


カテゴリー「電子工作」 のエントリー