Arduino Uno

Тема в разделе "Arduino & Shields", создана пользователем rod73, 14 май 2017.

  1. rod73

    rod73 Нуб

    !
     
    Последнее редактирование: 15 май 2017
  2. mcureenab

    mcureenab Гуру

    Код без разметки некорректно отображается. Поравьте своё сообщение.
     
  3. mcureenab

    mcureenab Гуру

    Энкодер двоично - десятичный. первые четыре бита (единицы из 10) досчитывают до 9 и происходит перенос разряда в пятый бит (десятки). Затем 5,6,7,8 биты досчитывают до 9, и происходит перенос разряда в бит 9.
     
  4. mcureenab

    mcureenab Гуру

    Для BCD кода.

    Код (C++):


    static const uint8_t input_pin[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Config Pins Input Here bit-0 to 9

    unsigned int Read_input(){
      unsigned int res(0);
      for ( uint8_t i = 4; --i;  ) // 3 .. 1
      {
        uint8_t D(0);  // decimal digit
        for( uint8_t j = 5; --j; ) // 4 .. 1
        {
          D << 1;
          D |= digitalRead( input_pin[ 4 * i - j ]) == LOW; // Bitwise for active LOW
        }
        res = res * 10 + D;
      }
      // Print 0-1023 position with line feed
      return res;
    }

     
     
    Последнее редактирование: 14 май 2017
  5. mcureenab

    mcureenab Гуру

    300 и 900 это реальные значения? И так, от балды.
    Давайте ло с реальными значениями и скачками.
     
  6. ostrov

    ostrov Гуру

    То есть надо из состояний десяти ножек составить одно десятибитовое число?
     
  7. mcureenab

    mcureenab Гуру

    Попробуйте выводить результат в бинарном виде, так будет проще понять, если провода перепутаны.
     
  8. mcureenab

    mcureenab Гуру

    это зачем? хэш какой то...

    Код (C++):
    ^ (dec_position&0x1)
    Код (C++):
    dec_position = pin_state[9];
      for( int i = 8; i >= 0; i = i -1){
        dec_position = (dec_position << 1) | (pin_state[i]);
      }
     
    rod73 нравится это.
  9. mcureenab

    mcureenab Гуру

    Serial.print(dec_position, BIN)
     
  10. mcureenab

    mcureenab Гуру

    Для бинарного 10 битного

    Код (C++):
    static const uint8_t input_pin[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Config Pins Input Here bit-0 to 9

    unsigned int Read_input1024(){
      unsigned int res(0);
      for ( uint8_t i = 10; i--;  ) // 9 .. 0
      {
          res << 1;
          res |= digitalRead( input_pin[ i ]) == LOW; // Bitwise for active LOW
      }
      // Print 0-1023 position with line feed
      return res;
    }
     
     
  11. mcureenab

    mcureenab Гуру

    У вас в коде нет синхронизации опроса со сменой кода. Пока ардуина читает бит, другие биты могут поменяться. Нужно сразу после изменения бита 0 (+ небольшая фора ) начинать чтение, пока код установлен.

    Или подряд два показания снимать. Если не поменялись, значит можно засчитывать попытку. Если поменялись, первое отбрасываем и повторяем попытку.
     
    Последнее редактирование: 14 май 2017
  12. mcureenab

    mcureenab Гуру

    С синхронизацией. Исправлено и проверено на стенде.

    Код (C++):

    // 1.1
    static const uint8_t input_pin[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Config Pins Input Here bit-0 to 9


    unsigned int Read_input1024(){ // 10 бит binary
      unsigned int res(0);
      for ( uint8_t i = 10; i--;  ) // 9 .. 0
      {
          res = ( res << 1 ) | digitalRead( input_pin[ i ] ) == LOW; // Bitwise for active LOW
      }
      // Print 0-1023 position with line feed
      return res;
    }

    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
      while(!Serial){}
      Serial.println("Starting...");
      for(byte i = 10; i--; ){ // declare pin mode
          pinMode( input_pin[i], INPUT );
      }
    }

    void loop() {
      // put your main code here, to run repeatedly:
      static unsigned int v1( 0xFFFF );
      bool new_v(false);
      unsigned int v2;
      while ( ( v2 = Read_input1024() ) != v1 ) { // значение изменилось, повторим попытку до стабилизации
        v1 = v2;
        new_v = true; // если значение не менялось, new_v останется false
      }
      if ( new_v )
      { // значение изменилось, обработаем его
        Serial.print( v2 , BIN);
        Serial.print( "\t" );
        Serial.println( map( v2, 0, 1024, 0, 360), DEC);    // градусы
      }
    }
     
     
    Последнее редактирование: 14 май 2017
  13. mcureenab

    mcureenab Гуру

    Максимальная частота - 35кГц хорошая нагрузка для Arduino!
     
  14. mcureenab

    mcureenab Гуру

    Код (C++):
    unsigned int = map(dec_position, 0, 1024, 0, 360);
     
  15. mcureenab

    mcureenab Гуру

    код поправил и проверил на Arduino Leonardo .

     
  16. ostrov

    ostrov Гуру

    Может во флоат? Или на 10 умножать. А то получается, что два из трех шагов пропадает.