概要
RaspberryPi Zero を使って秋月電子さんで購入した LED 付きのロータリエンコーダを使ってみました
今回は wiringPi + C 言語でロータリエンコーダを制御しています
環境
- RaspberryPi Zero rev1.3
- Raspbian 8.0 (Jessie, 4.4.11+ #888)
- LED 付きロータリエンコーダ (EC12PLRVF-D-24K-24-24C-02/06-6)
- ロータリーエンコーダ DIP 化基板
- wiringPi 2.32
- gcc 4.9.2
ロータリエンコーダのハンダ付け
今回せっかくなので DIP 化用の基盤も勝手ハンダ付けしました
白く線が書いてある方を表として表側にロータリエンコーダが来るようにハンダ付けします
ヘッダピンは 5 ピンづつ上下にハンダします
裏側にピンが伸びるようにハンダしました
裏側はこんな感じです
横についている爪の部分はハンダしませんでした
wiringPi のインストール
まだの方は実施してください
- git clone git://git.drogon.net/wiringPi
- cd wiringPi/
- git pull origin
- ./build
配線
では RaspberryPi と配線します
基盤に A, C, B とプリントされていると思います
その A, C, B をそれぞれ
- A -> RaspberryPi 6 Pin (GND)
- C -> RaspberryPi 11 Pin (GPIO17)
- B -> RaspberryPi 12 Pin (GPIO18)
に接続します
全体としてはこんな感じです
この写真だとオレンジのケーブルが GND につながっており黄色 2 本がそれぞれ GPIO 17, 18 ピンにつながっています
補足
たぶんなのですが今回 DIP 化基盤上には 10 ピン分のピンがあると思います
が、実際に使用するのは 5 ピンだけです
ロータリエンコーダを制御するための A, C, B ピン用に 3 ピン使用して LED の制御用に 2 ピン使用します
なので、他の 5 ピンは使いません ( たぶん )
おそらく DIP 化するときにハンダしやすいように 10 ピンハンダさせているのだと思います
スクリプト
今回は C 言語を使います
参考サイト にあるコードをそのまま使えば動作しました
コンパイル時にオプションが必要なので注意してください
割り込み用の関数を用意してロータリエンコーダが回ったら指定の関数が実行される感じです
- vim enc_test.c
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
int a;
int b;
int p_a;
int p_b;
int num;
void click_a(void) {
int _a;
_a = digitalRead(0);
if (_a != a) {
if (a == 1) {
p_a = 1;
} else {
p_a = 0;
}
a = _a;
if (a == 0 && b == 0 && p_a == 1 && p_b == 1) {
printf("right %d\n", ++num);
}
}
}
void click_b(void) {
int _b;
_b = digitalRead(1);
if (_b != b) {
if (b == 1) {
p_b = 1;
} else {
p_b = 0;
}
b = _b;
if (a == 0 && b == 0 && p_a == 1 && p_b == 1) {
printf("left %d\n", --num);
}
}
}
int main(void){
int setup = 0;
a = 1;
b = 1;
p_a = 0;
p_b = 0;
num = 0;
setup = wiringPiSetup();
pullUpDnControl(0, PUD_UP);
pullUpDnControl(1, PUD_UP);
wiringPiISR(0, INT_EDGE_BOTH, click_a);
wiringPiISR(1, INT_EDGE_BOTH, click_b);
while(setup != -1){
sleep(1);
}
}
ちなみに今回ピンは GPIO17 と GPIO18 で信号を受信していますが wiringPiSetup
でピンを初期化することで wiringPiPin というピン番号で GPIO ピンを制御することができます
wiringPiPin の場合、0 が GPIO17 で 1 が GPIO18 に対応しているので今回の配線とスクリプトで動作させることができます
https://projects.drogon.net/raspberry-pi/wiringpi/pins/
コンパイルと実行
gcc -lwiringPi enc_test.c -o enc_test
sudo ./enc_test
コンパイル時に -lwiringPi
を指定しないと「enc_test.c:(.text+0x10): undefined reference to 'digitalRead'
」的なエラーが出てしまいます
実行してロータリエンコーダを左右にグリグリ回すと以下のように増減すると思います
left -1
left -2
left -3
left -4
left -5
left -6
right -5
right -4
right -3
right -2
right -1
right 0
最後に
RaspberryPi でロータリエンコーダを制御してみました
あとは Python や Nodejs など高級言語で制御してみるのと LED 付きなので LED も制御してみたいと思います
0 件のコメント:
コメントを投稿