ここから本文です

arduinoでDXディケイドライバーの読み取り部分を再現しようと思っています。 構造...

kap********さん

2019/2/2523:26:51

arduinoでDXディケイドライバーの読み取り部分を再現しようと思っています。
構造的にスリット部を通った白黒印字を2個のフォトリフレクタで読み取って判別しているようです。

カードバーコード部、下がクロック、上がデータとわかり調べてみた所

何もない時170-200
バーコード読み取り時
50以下がLOWレベル 白
170以上がHIGHレベル 黒

このようになっていたので
データ黒、クロック黒&隣のデータ白、クロック黒なら1
データ白、クロック白&隣のデータ黒、クロック白なら0
としデータ部を2進数で表示したいと考えています。


写真のバーコードなら右から読むと11101010101だと思うのですが読み飛ばし、重複などが頻繁に起き
うまく読み取れません。

どのようにすればデータ部バーコードをうまく読み取れるでしょうか?


int pt1_h,pt1_l,pt2_h,pt2_l,state;

void setup() {
Serial.begin(9600);

}

void loop() {

int pt1 = analogRead(A0);//クロック
int pt2 = analogRead(A1);//データ


if(pt1>100){pt1_h=1;} //100以上がHIGHレベル 黒
else{pt1_l=1;} //100以下がLOWレベル 白

if(pt2>100){pt2_h=1;} //100以上がHIGHレベル 黒
else{pt2_l=1;} //100以下がLOWレベル 白


if(pt1_h == pt2_h && pt1_l == pt2_h)//黒黒&白黒

{
state=1;
pt1_h=0,pt1_l=0,pt2_h=0,pt2_l=0;
Serial.println(state);
}

if(pt1_l == pt2_l && pt1_h == pt2_l)//白白&黒白
{
state=0;
pt1_h=0,pt1_l=0,pt2_h=0,pt2_l=0;
Serial.println(state);
}


}

クロック,analogRead,Serial.println,0 pt2,int pt1,データ,Serial.begin

閲覧数:
134
回答数:
3
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

kou********さん

2019/2/2601:03:26

読み込み開始と終了をチェックした方が良いです

クロック:白→黒 叉は 黒→白 変更時にデータを読み出して0、1を判別します

開始:
クロック 白→黒→白 の時点でデータ1読み込み
クロック 白→黒 で データ2読み込み
クロック 黒→白 で データ3読み込み
クロック 白→黒 で データ4読み込み
クロック 黒→白 で データ5読み込み
クロック 白→黒 で データ6読み込み


クロック 黒→白 で データ11読み込み
終了

なおデータ11は黒で終了しています

参考
https://sites.google.com/site/dxdikeidoraiba/KAMEN-RIDE

  • 質問者

    kap********さん

    2019/2/2612:13:48

    ご回答ありがとうございます。
    なんとなく理解はできるのですがスケッチが思い浮かびません。どのように書けばいいのか教えていただく事はできますか?

  • その他の返信を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2019/3/3 06:20:04

無事に動かすことができました。
本当にありがとうございます。

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

nac********さん

2019/2/2701:15:33

スケッチ書いてみました。読み取り時間0.2~1秒程度を想定。
ただ、analogReadは結構おかしな値を続けて出る事もあるので「8回連続」の判定では甘いかも。
要点は
・クロックの色が切り替わった時にデータを読み出す
・必要な個数データがたまったら出力
・計測時間を超えたらリセット
です。一番難しいのはスタート判定かもしれません。
※色が切り替わるまでの時間が0.2sを超えたらリセットにしています。

また、クロック判定は100以上か以下か?ではなく、170以上か50以下か、で判定した方が良いですね。→面倒なので書き換えませんけど。

void setup() {
Serial.begin(9600);
}

void loop() {
uint32_t time=-1;
byte clk=0,cnt=0,state=0;
word DATA=0;

while(cnt<11){
clk<<=1;
if(analogRead(A0)>100)clk++;

if(((clk==0xff)&&(state==0)) || ((clk==0)&&(state==1))){
state=clk&1;
time=millis()+200;
DATA|=(analogRead(A1)>100)<<cnt;
cnt++;
}
if(millis()>time)break;
}

if(cnt==11){
for(byte i=0;i<11;i++){
if((DATA>>i)&1)Serial.print("■");
else Serial.print("□");
}
Serial.print("\n");
}
}

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

プロフィール画像

カテゴリマスター

qui********さん

2019/2/2607:45:27

子供が買った(買わされた)けど、もう現物は残ってないなぁ。最近はピンク(マゼンタ)になったみたいですけど。

クロックがH->L, L->Hに「変化した」ことを捕まえて、その時点のデータを読み取る、というのがこの手の動作の基本です。つまり、「今」の状態からだけでは判断できず、直前のクロックのレベルを覚えておいて、現在のクロックと比較して変化したかどうか、という判断が必要になるということ。

なので、ループ処理は
---
いまのクロックを調べる
直前のクロックと比べて変化あり? ならば
__データを読み込む
いまのクロックを直前のクロックとして保存
---
を繰り返すような形になると思います。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる