2015-11-12 3 views
-1

Я делаю этот проект, который включает в себя датчики. У меня два датчика, один слева и справа. Мне удалось обнаружить левое и правое движения, но когда я просто спам «ощущаю» датчик, скажем, левый датчик, он читается, когда я вылетел влево. Не могли бы вы рассказать мне, в чем проблема?Левый правый ИК-датчик движения на Arduino

Чтобы понять мой код, я нарисовал «требуемую» последовательность, чтобы сказать, что я проверил. (0 обнаружено, не обнаружено 1 ничего)

Для левого 1. L = 1, R = 1 2. L = 0, R = 1 3. L = 0, R = 0 4. L = 1 R = 0

Для правильного 1. L = 1, R = 1 2. L = 1, R = 0 3. L = 0, R = 0 4. L = 0, R = 1

Вот мой код

int rs=7,ls=6,r,l,x,xx,xxx,z; //rs right sensor, ls left sensor 
void setup() { 
    Serial.begin(9600); 
    pinMode(rs, INPUT); 
    pinMode(ls, INPUT); 
    pinMode(13,OUTPUT); 
} 

void loop() { 
    digitalWrite(12,LOW); 
    digitalWrite(13,LOW); 
    r= digitalRead(rs); 
    l= digitalRead(ls); 

    if(r==1&&l==1) 
    x=1; 
    else x=0; 

//RIGHT MOTION 
    if(x==1){ 
    for(z=1;z<10000;z++){ 
    if(digitalRead(ls)<digitalRead(rs)){ 
    z=10000;xx=1;}} 
    if(xx=1){ 
    for(z=1;z<10000;z++){ 
    if(digitalRead(ls)==0&&digitalRead(rs)==0){ 
    z=10000;xxx=1;}}} 
    if(xxx==1){ 
    for(z=1;z<10000;z++){ 
    if(digitalRead(ls)>digitalRead(rs)){ 
    z=10000;Serial.println("Right motion");digitalWrite(12,HIGH);}}}} 
//LEFT MOTION 
    if(x==1){ 
    for(z=1;z<10000;z++){ 
    if(digitalRead(ls)>digitalRead(rs)){ 
    z=10000;xx=1;}} 
    if(xx=1){ 
    for(z=1;z<10000;z++){ 
    if(digitalRead(ls)==0&&digitalRead(rs)==0){ 
    z=10000;xxx=1;}}} 
    if(xxx==1){ 
    for(z=1;z<10000;z++){ 
    if(digitalRead(ls)<digitalRead(rs)){ 
    z=10000;Serial.println("Left motion");digitalWrite(13,HIGH);}}}} 


} 

I s et my loop 10000 раз, потому что 1 целая петля настолько быстро обнаруживает движение.

Заранее спасибо.

ответ

0

Вкратце: вы никогда не сбрасываете свои vars x, xx, xxx обратно на 0. Также вы используете оба параметра «Sets» для обоих типов движений. Так что digitalRead(ls) < digitalRead(rs) множества хх = 1 и digitalRead(ls) > digitalRead(rs) устанавливает также хх = 1.

Первое, что нужно сделать было бы назвать «первый» (все после // ПРАВИЛЬНО MOTION для // ЛЕВЫЙ MOTION) х , xx, xxx для чего-то вроде: rightMotionStep1 rightMotionStep2 и rightMotionStep3 и более поздних x, xx, xxx to: leftMotionStep1 leftMotionStep2 и leftMotionStep3.

, конечно, вы также должны объявить эти Vars.

Следующая вещь, что вы должны сбросить все Варс так после вашего

Serial.println("Right motion"); 

должно быть

rightMotionStep1 = 0; 
rightMotionStep2 = 0; 
rightMotionStep3 = 0; 

же самое для левого движения.

+0

О, да, я пропустил это! x, xx, xxx - это этапы, и да, я забыл их сбросить. Хорошо, спасибо! Я посмотрю, сработает ли это сейчас. –

+0

ладно сэр, я уничтожил ту ошибку, о которой я сказал. теперь, похоже, не удается обнаружить какое-либо движение в течение некоторого времени. но все показания направления верны. вы знаете, почему это происходит –

+0

заранее! :) –

Смежные вопросы