2017年1月7日土曜日

RaspberryPi Zero でロータリエンコーダを使ってみた

概要

RaspberryPi Zero を使って秋月電子さんで購入した LED 付きのロータリエンコーダを使ってみました
今回は wiringPi + C 言語でロータリエンコーダを制御しています

環境

ロータリエンコーダのハンダ付け

今回せっかくなので DIP 化用の基盤も勝手ハンダ付けしました
白く線が書いてある方を表として表側にロータリエンコーダが来るようにハンダ付けします
ヘッダピンは 5 ピンづつ上下にハンダします
裏側にピンが伸びるようにハンダしました
rpi_renc_handa1.jpg

裏側はこんな感じです
横についている爪の部分はハンダしませんでした
rpi_renc_handa2.jpg

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)

に接続します
全体としてはこんな感じです
rpi_renc_circuit.jpg

この写真だとオレンジのケーブルが 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 件のコメント:

コメントを投稿