
【センサー】ロータリーエンコーダー Part1

ロータリーエンコーダーは回転方向、回転速度などを取るセンサーです。
黒い部分が軸になってます。ここをひねると、クリクリッと回ります。

3本足のいずれかがGNDと接続します。
ゼミにある秋月のロータリーエンコーダーは図の右端がGNDです。
以下の図のように接続します。

Arduino側のプログラムはStandardFirmataではありません。
以下のプログラムをUploadしてください。

Arduinoの右上の虫眼鏡(Serial Monitor)を押して、ロータリーエンコーダーを回すと
1 or 2 が出てきます。
変な文字が出るという人は、Serial Monitorの右下を9600 baudに合わせてください。

とりあえずこれでロータリーエンコーダーが使える状態になりました。
それでは次にProcessingにそのデータを送ります。
こちらも今まで習ったプログラムとは少し違います。
Processing
ロータリーエンコーダーを回すと、四角が左右に動きます。
今まではArduinoのライブラリを使っていましたが、こちらはシリアル通信用のライブラリだけを使用しています。
そのため、若干見慣れない関数などが使われています。
とりあえずProcessingで動かす説明はここまでとします。
「動けばいいや」っていう人はこれを改造していってください。
「なんでこうなってるの?」って思う人は詳細な説明を後日あげます。→こちら
わからなければ聞いてください。
文責:目次護
tag: [ロータリーエンコーダー]
黒い部分が軸になってます。ここをひねると、クリクリッと回ります。

3本足のいずれかがGNDと接続します。
ゼミにある秋月のロータリーエンコーダーは図の右端がGNDです。
以下の図のように接続します。

Arduino側のプログラムはStandardFirmataではありません。
以下のプログラムをUploadしてください。
//val:1,2が回転を表す。
//val:1:right 2:left
int val, val1, val2;
float ave_1;
float ave_2;
int t_1;
int t_2;
void setup(){
val = 0;
pinMode( 6, INPUT );
pinMode( 7, INPUT );
Serial.begin( 9600 );
ave_1=0;
ave_2=0;
}
void loop(){
val1 = digitalRead( 6 );
val2 = digitalRead( 7 );
//take average to avoid chattering, but better to make anchi-chattering cirkit
//チャタリング防止用の平均化処理、完全ではないので、理想的にはハードウェア回路上で対応すべき
if(val1==HIGH){
t_1=1;
}
else{
t_1=0;
}
if(val2==HIGH){
t_2=1;
}
else{
t_2=0;
}
float ratio=0.9;
ave_1=ave_1*ratio+t_1*(1-ratio);
ave_2=ave_2*ratio+t_2*(1-ratio);
if(ave_1>0.5){
val1=HIGH;
}
else{
val1=LOW;
}
if(ave_2>0.5){
val2=HIGH;
}
else{
val2=LOW;
}
if( val1 == HIGH && val2 == HIGH ){
if( val != 3 ){
Serial.print( val, DEC );
}
val = 3;
}
else {
if( val1 == HIGH ){
val = 1;
}
if( val2 == HIGH ){
val = 2;
}
}
}

Arduinoの右上の虫眼鏡(Serial Monitor)を押して、ロータリーエンコーダーを回すと
1 or 2 が出てきます。
変な文字が出るという人は、Serial Monitorの右下を9600 baudに合わせてください。

とりあえずこれでロータリーエンコーダーが使える状態になりました。
それでは次にProcessingにそのデータを送ります。
こちらも今まで習ったプログラムとは少し違います。
Processing
import processing.serial.*;
////// ロータリーエンコーダー用の変数 //////////////
int n;
int rflag=-1;
int val=0;
int mae=-1;
int count=0;
Serial myPort;
///////////////////////////////////////////////
//Arduino arduino;
void setup() {
size(800, 600);
////// ロータリーエンコーダー用arduino の設定 //////////////
myPort=new Serial(this, Serial.list()[0], 9600);
myPort.clear();
///////////////////////////////////////////////
n=400;
}
void draw() {
background(255);
update_arduino();
fill(0);
if (rflag==0) {
n++;
if (n>780) {
n=780;
}
}
else if (rflag==1) {
n--;
if (n<0) {
n=0;
}
}
rect(n, 300, 20, 20);
}
void update_arduino() {
//////arduino.analogRead();の代わり
if (myPort.available()>0) {
val=myPort.read();
///////////////////////////////////////////////
println(val);
//////// 何回おんなじ{1もしくは2}が来たか数える
if (val==mae) {
count++;
}
else {
count=0;
rflag=-1;
}
mae=val;
if (count>10) {
//////// 動き出すためのフラグを決定
if (val==49) { // 1→49
rflag=0;
}
else if (val==50) { // 2→50
rflag=1;
}
}
}
}
ロータリーエンコーダーを回すと、四角が左右に動きます。
今まではArduinoのライブラリを使っていましたが、こちらはシリアル通信用のライブラリだけを使用しています。
そのため、若干見慣れない関数などが使われています。
とりあえずProcessingで動かす説明はここまでとします。
「動けばいいや」っていう人はこれを改造していってください。
「なんでこうなってるの?」って思う人は詳細な説明を後日あげます。→こちら
わからなければ聞いてください。
文責:目次護
スポンサーサイト