Показано с 1 по 10 из 200

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #26
    Пользователь Аватар для WhyMax
    Регистрация
    09.10.2011
    Возраст
    33
    Сообщений
    54
    Вес репутации
    183

    По умолчанию Re: Объединенный проект для Carduino (Arduino) All-In-One.

    Подправил код, оставил только рулевые кнопки и энкодер с нажатием.
    Хочу так же подключить второй энкодер, но ничего не получается :-(
    На данный момент у меня работает полноценно один энкодер и у второго энкодера работает только нажатие.
    Код:
    Код:
    #include <IRremote.h>  
    #include <EEPROM.h>
    
     byte bytes[4]={0,3}; // 0-3 байт - энкодер, рулевые кнопки, ИК приемник 
    
     int JOYSTIK_PIN = 5 ; // вход для рулевых кнопок 
    
     int RECV_PIN = 10; // вход ИК приемника
     int encoder0PinA = 2 ; // вывод А энкодера
     int encoder0PinB = 3 ; // вывод В энкодера
     int encoder0PinC = 4 ; // вход кнопки энкодера
     
     int encoder1PinA = 5 ; // вывод А энкодера 2
     int encoder1PinB = 6 ; // вывод В энкодера 2
     int encoder1PinC = 7 ; // вход кнопки энкодера 2
    
    
    byte temp; 
    //IRrecv irrecv(RECV_PIN);
    //decode_results results;
    unsigned long res_dt;
    
     //****************************************** 
     void setup() 
     { 
     pinMode(encoder0PinA, INPUT); 
     digitalWrite(encoder0PinA, HIGH); // подключить подтягивающий резистор энкодера
     pinMode(encoder0PinB, INPUT); 
     digitalWrite(encoder0PinB, HIGH); // подключить подтягивающий резистор энкодера
     pinMode(encoder0PinC, INPUT); 
     digitalWrite(encoder0PinC, HIGH); // подключить подтягивающий резистор энкодера
    
     pinMode(encoder1PinA, INPUT);      
     digitalWrite(encoder1PinA, HIGH);    // подключить подтягивающий резистор     
     pinMode(encoder1PinB, INPUT);      
     digitalWrite(encoder1PinB, HIGH);    // подключить подтягивающий резистор   
     pinMode(encoder1PinC, INPUT);      
     digitalWrite(encoder1PinC, HIGH);    // подключить подтягивающий резистор   
         
     attachInterrupt(0, doEncoderA, FALLING); // настроить прерывание энкодера interrupt 0 на pin 2 
     attachInterrupt(1, doEncoderB, FALLING); // настроить прерывание энкодера interrupt 0 на pin 3
    
     Serial.begin(115200); // настроить скорость com порт 
    
     } 
     //****************Кнопка Энкодера**************************** 
     void loop() 
     { 
     if(digitalRead(encoder0PinC)==LOW) 
     { 
     bytes[0] = 0; 
     bytes[1] = 8; 
     bytes[2] = 0; 
     bytes[3] = 0; 
     Serial.write(bytes,4); 
     while(digitalRead(encoder0PinC)==LOW){delay(50);} 
     bytes[0] = 0; 
     bytes[1] = 7; 
     bytes[2] = 0; 
     bytes[3] = 0; 
     }
    
     if(digitalRead(encoder1PinC)==LOW) 
     { 
     bytes[0] = 0; 
     bytes[1] = 6; 
     bytes[2] = 0; 
     bytes[3] = 0; 
     Serial.write(bytes,4); 
     while(digitalRead(encoder1PinC)==LOW){delay(50);} 
     bytes[0] = 0; 
     bytes[1] = 5; 
     bytes[2] = 0; 
     bytes[3] = 0; 
     } 
     joystik(); 
     } 
    
     //****************Резистивные кнопки************************** 
     void joystik() 
     { 
     res_dt = analogRead(JOYSTIK_PIN); // прочитать данные АЦП 
     if( res_dt < 1023) 
     { 
     delay(50); // пауза для проверки дребезга 
     if(res_dt == analogRead(JOYSTIK_PIN)) // если нет дребезга 
     { 
     bytes[0] = res_dt & 255; // преобразовать в 2-байта 
     bytes[1] = (res_dt & 768) >> 8; 
     bytes[2] = 0; 
     bytes[3] = 0; 
     Serial.write( bytes,4); // отправить прочитаное значение компьютеру 
     delay(250); // пауза между нажатиями 
     } 
     } 
     } 
     //*******************Поворот Энкодера (обработка прерывания)**** 
     void doEncoderA() 
     { 
     cli(); 
     if(digitalRead(encoder0PinB)==HIGH){bytes[1]=25;}else{bytes[1]=5;} 
     bytes[0] = 0; 
     bytes[2] = 0; 
     bytes[3] = 0; 
     Serial.write( bytes,4); 
     sei(); 
     } 
     //*******************Поворот Энкодера (обработка прерывания)**** 
     void doEncoderB() 
     { 
     cli(); 
     if(digitalRead(encoder0PinA)==HIGH){bytes[1]=5;}else{bytes[1]=25;}
     bytes[0] = 0; 
     bytes[2] = 0; 
     bytes[3] = 0; 
     Serial.write( bytes,4); 
     sei(); 
     }
    Пробовал добавить заменить строки в конце кода на такие:
    Код HTML:
     if(digitalRead(encoder0PinB)==HIGH){bytes[1]=25;}else{bytes[1]=5;} 
     if(digitalRead(encoder1PinB)==HIGH){bytes[1]=25;}else{bytes[1]=5;}
    И даже:
    Код HTML:
     if(digitalRead(encoder1PinB)==HIGH){bytes[1]=25;}else{bytes[1]=5;}
    Со значениями bytes[1]=25; так же экспериментировал.

    Но ничего не выходит, второй энкодер молчит.
    И главное - при повороте первого энкодера (когда в коде прописываю encoder1PinB) работает именно первый.

    2 энкодера отдельно (без резистивных кнопок) работали прекрасно: http://compcar.ru/forum/showthread.p...ll=1#post88754
    Но там смотрю принцип немного другой.
    По такому же принципу исправил код на такой:
    Код:
    #include <IRremote.h>  
    #include <EEPROM.h>
    
     byte bytes[4]={0,3}; // 0-3 байт - энкодер, рулевые кнопки, ИК приемник 
    
     int JOYSTIK_PIN = 5 ; // вход для рулевых кнопок 
    
     int RECV_PIN = 10; // вход ИК приемника
     int encoder0PinA = 2 ; // вывод А энкодера
     int encoder0PinB = 3 ; // вывод В энкодера
     int encoder0PinC = 4 ; // вход кнопки энкодера
     
     int encoder1PinA = 5 ; // вывод А энкодера 2
     int encoder1PinB = 6 ; // вывод В энкодера 2
     int encoder1PinC = 7 ; // вход кнопки энкодера 2
    
    
    byte temp; 
    //IRrecv irrecv(RECV_PIN);
    //decode_results results;
    unsigned long res_dt;
    
     //****************************************** 
     void setup() 
     { 
     pinMode(encoder0PinA, INPUT); 
     digitalWrite(encoder0PinA, HIGH); // подключить подтягивающий резистор энкодера
     pinMode(encoder0PinB, INPUT); 
     digitalWrite(encoder0PinB, HIGH); // подключить подтягивающий резистор энкодера
     pinMode(encoder0PinC, INPUT); 
     digitalWrite(encoder0PinC, HIGH); // подключить подтягивающий резистор энкодера
    
     pinMode(encoder1PinA, INPUT);      
     digitalWrite(encoder1PinA, HIGH);    // подключить подтягивающий резистор     
     pinMode(encoder1PinB, INPUT);      
     digitalWrite(encoder1PinB, HIGH);    // подключить подтягивающий резистор   
     pinMode(encoder1PinC, INPUT);      
     digitalWrite(encoder1PinC, HIGH);    // подключить подтягивающий резистор   
         
     attachInterrupt(0, doEncoderA, FALLING); // настроить прерывание энкодера interrupt 0 на pin 2 
     attachInterrupt(1, doEncoderB, FALLING); // настроить прерывание энкодера interrupt 0 на pin 3
    
     Serial.begin(115200); // настроить скорость com порт 
    
     } 
     //****************Кнопка Энкодера**************************** 
     
     
     unsigned graydecode(unsigned gray)  
    {  
     unsigned bin;  
    
     for (bin = 0; gray; gray >>= 1)  
        bin ^= gray;  
    
     return bin;  
    }  
    
    
    
     void loop() 
     { 
    static uint8_t tmp_code = 0;   
     uint8_t gray_code = digitalRead(encoder1PinA) | (digitalRead(encoder1PinB) << 1),  
      code = graydecode(gray_code);  
     if (code == 0)  
     {  
       if (tmp_code == 3)  
         {  
           bytes[0]=9;  
           bytes[1]=6;     
          Serial.write( bytes,2);    
          bytes[0]=0;    
         } else if (tmp_code == 1)  
                   {  
                      bytes[0]=9;  
                     bytes[1]=7;     
                      Serial.write( bytes,2);    
                      bytes[0]=0;   
                   }  
      }  
     tmp_code = code;  
     delay(2);  
       
       
     if(digitalRead(encoder0PinC)==LOW) 
     { 
     bytes[0] = 0; 
     bytes[1] = 8; 
     bytes[2] = 0; 
     bytes[3] = 0; 
     Serial.write(bytes,4); 
     while(digitalRead(encoder0PinC)==LOW){delay(50);} 
     bytes[0] = 0; 
     bytes[1] = 7; 
     bytes[2] = 0; 
     bytes[3] = 0; 
     }
    
     if(digitalRead(encoder1PinC)==LOW) 
     { 
     bytes[0] = 0; 
     bytes[1] = 6; 
     bytes[2] = 0; 
     bytes[3] = 0; 
     Serial.write(bytes,4); 
     while(digitalRead(encoder1PinC)==LOW){delay(50);} 
     bytes[0] = 0; 
     bytes[1] = 5; 
     bytes[2] = 0; 
     bytes[3] = 0; 
     } 
     joystik(); 
     } 
    
     //****************Резистивные кнопки************************** 
     void joystik() 
     { 
     res_dt = analogRead(JOYSTIK_PIN); // прочитать данные АЦП 
     if( res_dt < 1023) 
     { 
     delay(50); // пауза для проверки дребезга 
     if(res_dt == analogRead(JOYSTIK_PIN)) // если нет дребезга 
     { 
     bytes[0] = res_dt & 255; // преобразовать в 2-байта 
     bytes[1] = (res_dt & 768) >> 8; 
     bytes[2] = 0; 
     bytes[3] = 0; 
     Serial.write( bytes,4); // отправить прочитаное значение компьютеру 
     delay(250); // пауза между нажатиями 
     } 
     } 
     } 
     //*******************Поворот Энкодера (обработка прерывания)**** 
     void doEncoderA() 
     { 
     cli(); 
     if(digitalRead(encoder0PinB)==HIGH){bytes[1]=25;}else{bytes[1]=5;} 
     bytes[0] = 0; 
     bytes[2] = 0; 
     bytes[3] = 0; 
     Serial.write( bytes,4); 
     sei(); 
     } 
     //*******************Поворот Энкодера (обработка прерывания)**** 
     void doEncoderB() 
     { 
     cli(); 
     if(digitalRead(encoder0PinA)==HIGH){bytes[1]=5;}else{bytes[1]=25;}
     bytes[0] = 0; 
     bytes[2] = 0; 
     bytes[3] = 0; 
     Serial.write( bytes,4); 
     sei(); 
     }
    Второй энкодер срабатывает примерно 1 раз из 5-10 (иногда проскакивают значения при повороте).

    Не поможете подправить скетч?
    Последний раз редактировалось WhyMax; 01.06.2013 в 16:36.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •