fc2ブログ

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

ロータリーエンコーダー解説編

前回の解説です。

ロータリーエンコーダーの原理はこちらのページを参考にしました。
・はじめる電子回路ーロータリーエンコーダを使う
・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から非対応のご様子。

少し複雑に見えますが、理解すれば単純です。
わからないことがあれば気軽に聞いてください。

文責:目次護
スポンサーサイト



tag: [ロータリーエンコーダー]

テーマ : ゼミ
ジャンル : 学校・教育

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

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

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;
}
}
}


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

9600

とりあえずこれでロータリーエンコーダーが使える状態になりました。
それでは次に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で動かす説明はここまでとします。

「動けばいいや」っていう人はこれを改造していってください。
「なんでこうなってるの?」って思う人は詳細な説明を後日あげます。→こちら

わからなければ聞いてください。

文責:目次護 tag: [ロータリーエンコーダー]

テーマ : ゼミ
ジャンル : 学校・教育

プロフィール

Moonwalkers

Author:Moonwalkers
メディアアート、インタラクティブメディア制作ゼミ

最新記事
タグクラウドとサーチ

カテゴリ
月別アーカイブ
ディクテーション
Polyglot Free Language Lessons Online
リンク
Twitter
検索フォーム
RSSリンクの表示
QRコード
QRコード