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

ロータリーエンコーダー解説編
前回の解説です。
ロータリーエンコーダーの原理はこちらのページを参考にしました。
・はじめる電子回路ーロータリーエンコーダを使う
・TekuRobo工作室-113.ロータリーエンコーダを使う
ロータリーエンコーダーには軸が回転すると2つの出力信号を出しています。

この2つの出力信号、ちょっとずれて信号を出します。
そして両方1(HIGH)になる前の信号を見ると、回転方向によってA相とB相にHIGH、LOWの違いがでています。
これを利用してどちらに回転しているか判別できます。
前回のArduinoのプログラムでの回転方向の判別およびデータ送信部分はここです。
A相、B相どちらもHIGHになった時だけ、Processingにデータを送っています。
その手前に変化したvalの値(1 or 2)を送ったあと(Serial.print( val, DEC );)、val=3にすることで、余計なデータを送らないようにする(if( val != 3 ))、つまり回転方向の値だけを送っているということになります。
続いてProcessing側です。
こちらはArduinoにStandardFirmataを入れた時と、少し違っています。
「ArduinoがSerialに変わってる」と思う方もおわれると思いますが、基本的にはそんなに違いはありません。
そういうものだと思ってくれてもいいし、気になる方は直接聞いてください。
さて、説明しておくのはupdate_arduino()の中です。
Arduinoが使える状態(myPort.available()>0)になったら、値を読み込んでます。(val=myPort.read();)
続いてこの部分。
「いったい何やってるんだ…」と思うかもしれませんが、一応「チャタリング防止」です。
なにそれと思うなら、調べてみましょう。完結に言えば誤作動防止。
同じ値が何回か来たら「やってみましょう、見せましょう」の状態になるだけです。
最後にここ。
四角が右か左か動くのを指定するところです。
「Arduinoで1か2を送ったけど、49か50しか来てない」と思われますが、
実はArduinoから送った値は「ASCII文字」として送られています。
ここ(外部)に対応表が載っているので確認しておいてください。
また、ワンステップとしてArduinoの日本語リファレンス(外部)にSerial.printの基数(進数とか)指定の方法が載っているので、参考にしてください。
ちなみにBYTEはver1.0から非対応のご様子。
少し複雑に見えますが、理解すれば単純です。
わからないことがあれば気軽に聞いてください。
文責:目次護
tag: [ロータリーエンコーダー]
前回の解説です。
ロータリーエンコーダーの原理はこちらのページを参考にしました。
・はじめる電子回路ーロータリーエンコーダを使う
・TekuRobo工作室-113.ロータリーエンコーダを使う
ロータリーエンコーダーには軸が回転すると2つの出力信号を出しています。

この2つの出力信号、ちょっとずれて信号を出します。
そして両方1(HIGH)になる前の信号を見ると、回転方向によってA相とB相にHIGH、LOWの違いがでています。
これを利用してどちらに回転しているか判別できます。
前回のArduinoのプログラムでの回転方向の判別およびデータ送信部分はここです。
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;
}
}
A相、B相どちらもHIGHになった時だけ、Processingにデータを送っています。
その手前に変化したvalの値(1 or 2)を送ったあと(Serial.print( val, DEC );)、val=3にすることで、余計なデータを送らないようにする(if( val != 3 ))、つまり回転方向の値だけを送っているということになります。
続いてProcessing側です。
こちらはArduinoにStandardFirmataを入れた時と、少し違っています。
「ArduinoがSerialに変わってる」と思う方もおわれると思いますが、基本的にはそんなに違いはありません。
そういうものだと思ってくれてもいいし、気になる方は直接聞いてください。
さて、説明しておくのはupdate_arduino()の中です。
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が使える状態(myPort.available()>0)になったら、値を読み込んでます。(val=myPort.read();)
続いてこの部分。
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で1か2を送ったけど、49か50しか来てない」と思われますが、
実はArduinoから送った値は「ASCII文字」として送られています。
ここ(外部)に対応表が載っているので確認しておいてください。
また、ワンステップとしてArduinoの日本語リファレンス(外部)にSerial.printの基数(進数とか)指定の方法が載っているので、参考にしてください。
ちなみにBYTEはver1.0から非対応のご様子。
少し複雑に見えますが、理解すれば単純です。
わからないことがあれば気軽に聞いてください。
文責:目次護
スポンサーサイト