よろしくお願いします.
arduino UNOと秋月で購入したロータリーエンコーダ(RE-160F-40E3-(L)A-24P)を用いて,
シリアルモニタ上で数値のインクリメント・デクリメントを見ようとしています.
初心者のため,
http://www.ct-robo.sakura.ne.jp/371
を参考にまずはやっています.
配線は同じ,ソースはほんの少しだけいじっていますが,
デクリメントされるのに,インクリメントされません.
ソースはこんなかんじです.
// ロータリーエンコーダーの配線に合わせる
int dRotAPin = 2;
int dRotBPin = 4;
int R_count = 0;
//時刻表示
int minute = 0;
int second = 0;
int msecond = 0;
// ロータリーエンコーダーの状態を記憶する
// 割り込み中に変化する変数はvolatileはをつけて宣言する
volatile int m_nOldRot = 0;
volatile int m_nValue = 0;
void setup()
{
// ピンの設定
// INPUTモードにします。
pinMode(dRotAPin, INPUT);
pinMode(dRotBPin, INPUT);
// プルアップを有効にします
digitalWrite(dRotAPin, HIGH);
digitalWrite(dRotBPin, HIGH);
// 外部割り込みを設定します
// D2ピンが 変化 した時にrotRotEnd()を呼び出します
attachInterrupt(0, rotRotEnc, CHANGE);
//シリアル通信速度
Serial.begin(9600);
}
void loop()
{
//シリアルモニター角度表示
if(m_nValue == 1){
R_count++;
m_nValue = 0;
//if(R_count == 12){
// R_count = -11;
//}
}
if(m_nValue == -0.5){
R_count--;
m_nValue = 0;
//if(R_count == -12){
// R_count = 11;
//}
}
//Serial.println(R_count);
//delay(10);
Serial.print("m_nValue:");
Serial.print(m_nValue);
Serial.print("---m_nOldRot:");
Serial.println(m_nOldRot);
//delay(500);
}
// 外部割り込みから呼び出される変数
void rotRotEnc(void){
if(!digitalRead(dRotAPin)){ // ロータリーエンコーダー回転開始
if(digitalRead(dRotBPin)){
//右回転
m_nOldRot = 'R';
}else{
//左回転
m_nOldRot = 'L';
}
}else{ // ロータリーエンコーダー回転停止
if(digitalRead(dRotBPin)){
if(m_nOldRot == 'L'){
// 左回転の時の処理
m_nValue--;
}
}else{
if(m_nOldRot == 'R'){
//右回転の時の処理
m_nValue++;
}
}
// ここでロータリーエンコーダーの状態をクリア
m_nOldRot = 0;
}
}
完全にインクリメントされないわけではなく,
何回か回している時に何度かだけはインクリメントされるときがあります.
http://just-k.mydns.jp/blog/?p=6619
このサイトのやり方も参考に,同じように回路を組んで動作させてみたのですが,
やはりインクリメントされません.
解決策ありましたら教えていただきたいです.
よろしくお願いいたします.
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
両方とも使ったことはありませんので間違ってるかもしれません
間違ってたらごめんなさい
}else{ // ロータリーエンコーダー回転停止
とそれに対する閉じかっこ } 不要だと思うんですが
時々インクリメントされることがあるってのがよくわからない
rotRotEnc 関数内で A相 と B相の信号チェックして回転方向と
パルス数カウントしてると思いますが
記載コードでは片方向(反転状態)でしかカウントしないように読めます
その為にデクリメントでしかカウントしないってことだと思うんですが
(インクリメント動くことがあるってのが逆にわからなかったり)
試に以下のコードで動きませんか?
見やすくするため大文字ネスとしているのでそのままコピーしてもエラーになります
if(!digitalRead(dRotAPin)){ // 回転方向チェック
if(digitalRead(dRotBPin)){
//右回転
m_nOldRot = 'R';
} else {
//左回転
m_nOldRot = 'L';
}
} else { // 回転方向異常(クリア)
m_nOldRot = 0;
}
if(digitalRead(dRotBPin)){
if(m_nOldRot == 'L'){
// 左回転の時の処理
m_nValue--;
}
}else{
if(m_nOldRot == 'R'){
//右回転の時の処理
m_nValue++;
}
}
No.1
- 回答日時:
とりあえず、目についたのが、
volatile int m_nValue = 0;
と宣言しておいて、
loop()関数の中で、
if(m_nValue == -0.5){
と、やっている(m_nValueってintでしょ?)から、比較がおかしくなっているん
じゃないかな?と、思います。ただ、これデクリメント側ですしねぇ。
おかしいのがR_countがデクリメントされないことなら、ここだろうと思うんですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【組込み】割り込み中のstatic...
-
このレジの並び方は間違ってま...
-
組込み系プログラマに必要なハ...
-
ゲームプログラマーは優秀なの?
-
PIC24F C言語プログラミングに...
-
スーパーのレジで並んでいたら...
-
CPU負荷率の安全な上限と計...
-
割り込み処理から引数を取得す...
-
DMA
-
1年前の 清潔感あるでしょ なの...
-
割り込み処理のシミュレート
-
電車のドアの前での並び方
-
Macターミナルで実行中のプログ...
-
3のつく数字と3の倍数のみを表...
-
VBSの処理中一旦処理を止めて再...
-
vba listviewにおけるtextのAli...
-
緯度、経度の 10進法と 60進法...
-
C# シリアル通信でデータ受信...
-
「ヒープサイズの設定」て何?
-
VBSで応答不要のメッセージボッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
スーパーのレジで並んでいたら...
-
電車で待機列の割り込みについ...
-
CPU負荷率の安全な上限と計...
-
駅のトイレでナイチンに邪魔さ...
-
pic 複数の割り込み関数 切り分...
-
CPUの処理量を減らすコーデ...
-
【組込み】割り込み中のstatic...
-
irqbalance って
-
このレジの並び方は間違ってま...
-
VB6でSendKeyを利用したTab移動...
-
USJでの割り込み
-
割り込みのカウントの仕方
-
PICのPWMの正しい使い方につい...
-
マイコン C言語 割り込み処理...
-
VB.net 割り込みの禁止
-
一定時間操作がなかったら、と...
-
電車のドアの前での並び方
-
PIC24F C言語プログラミングに...
-
H8SX/1655のタイマー割り込みに...
-
PICマイコン 割り込み実行時間...
おすすめ情報