РЕШЕНО Uno slot+slot expande и тройка энкодер.

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем otis, 22 апр 2020.

Метки:
  1. otis

    otis Гик

    У меня собрана схема на UNO Slot+ Slot Expander( адрес 43)+Slot Expander( адрес 44)+Slot Expander( адрес 45). I2c сканер видит платы. На каждой плате Slot Expande поставил один светодиод (пин 2) и один энкодер Амперка тройка энкодер (выход А= пин 5; выход В=пин 6)
    При компиляции скетча ошибок нет. Но скетч не работает.
    1) Нет опроса плат Slot Expander( не горят синие светодиоды)
    2) Не горят светодиоды на пин 2.
    Вот не рабочий скетч
    Код (C++):
     //UNO Slot + Expander Slot led fade encoder
    //Управление яркость светодиода с помощью энкодера.
    // библиотека для работы I²C
    #include <Wire.h>
    // библиотека для работы с модулем GPIO Expander (I²C IO)
    #include <GpioExpander.h>
    // создаём объект adio класса GpioExpander по адресу 43
    GpioExpander adioR(43);
    // создаём объект adio класса GpioExpander по адресу 44
    GpioExpander adioG(44);
    // создаём объект adio класса GpioExpander по адресу 45
    GpioExpander adioB(45);
    int brightnessR = 120;          // яркость R LED, начинаем с половины
    int fadeAmountR = 10;           // шаг изменения яркости LED
    unsigned long currentTimeR;     // время опроса энкодера
    unsigned long loopTimeR;        // цикл опроса энкодера
    const int Rpin_A = 5;           // pin 5
    const int Rpin_B = 6;           // pin 6
    unsigned char encoderR_A;       //сохроняем значение А
    unsigned char encoderR_B;       //сохроняем значение В
    unsigned char encoderR_A_prev=0;//сохроняем зачение для седущего опроса.

    int brightnessG = 120;          // яркость G LED, начинаем с половины
    int fadeAmountG = 10;           // шаг изменения яркости LED
    unsigned long currentTimeG;     // время опроса энкодера
    unsigned long loopTimeG;        // цикл опроса энкодера
    const int Gpin_A = 5  ;         // pin 5
    const int Gpin_B = 6;           // pin 6
    unsigned char encoderG_A;       //сохроняем значение А
    unsigned char encoderG_B;       //сохроняем значение В
    unsigned char encoderG_A_prev=0;//сохроняем зачение для седущего опроса.

    int brightnessB = 120;          // яркость B LED, начинаем с половины
    int fadeAmountB = 10;           // шаг изменения яркости LED
    unsigned long currentTimeB;     // время опроса энкодера
    unsigned long loopTimeB;        // цикл опроса энкодера
    const int Bpin_A = 5;           // pin 5
    const int Bpin_B = 6;           // pin 6
    unsigned char encoderB_A;       //сохроняем значение А
    unsigned char encoderB_B;       //сохроняем значение В
    unsigned char encoderB_A_prev=0;//сохроняем зачение для седущего опроса.
    void setup()  {
      // включаем I²C. Для Arduino Due - Wire1.begin();
      Wire.begin();
        // Инициализируем объекты expander. Для Arduino Due - adio.begin(&Wire1);
      adioR.begin();
      adioG.begin();
      adioB.begin();
    // Инициализируем объект adio. Для Arduino Due - adio.begin(&Wire1);
      adioR.begin();
      // настраиваем пин 2 на модуле GPIO Expander в режим выхода
      adioR.pinMode(2, OUTPUT);
      // настраиваем пин 5 на модуле GPIO Expander в режим входа
      adioR.pinMode(Rpin_A, INPUT);
      // настраиваем пин 6 на модуле GPIO Expander в режим входа
      adioR.pinMode(Rpin_B, INPUT);
       // включаем I²C. Для Arduino Due - Wire1.begin();
      Wire.begin();
      // Инициализируем объект adio. Для Arduino Due - adio.begin(&Wire1);
      adioG.begin();
      // настраиваем пин 2 на модуле GPIO Expander в режим выхода
      adioG.pinMode(2, OUTPUT);
      // настраиваем пин 5 на модуле GPIO Expander в режим входа
      adioG.pinMode(Gpin_A, INPUT);
      // настраиваем пин 6 на модуле GPIO Expander в режим входа
      adioG.pinMode(Gpin_B, INPUT);
       // включаем I²C. Для Arduino Due - Wire1.begin();
      Wire.begin();
      // Инициализируем объект adio. Для Arduino Due - adio.begin(&Wire1);
      adioB.begin();
      // настраиваем пин 2 на модуле GPIO Expander в режим выхода
      adioB.pinMode(2, OUTPUT);
      // настраиваем пин 5 на модуле GPIO Expander в режим входа
      adioB.pinMode(Bpin_A, INPUT);
      // настраиваем пин 6 на модуле GPIO Expander в режим входа
      adioB.pinMode(Bpin_B, INPUT);
       // включаем I²C. Для Arduino Due - Wire1.begin();
       currentTimeR = millis();
      loopTimeR = currentTimeR;
       currentTimeG = millis();
      loopTimeG = currentTimeG;
       currentTimeB = millis();
      loopTimeB = currentTimeB;
     
    }
    void loop()  {
     
      currentTimeR = millis();
      if(currentTimeR >= (loopTimeR + 5)){         // проверяем каждые 5мс (200 Гц)
        encoderR_A = digitalRead(Rpin_A);          // считываем состояние выхода А энкодера
        encoderR_B = digitalRead(Rpin_B);          // считываем состояние выхода B энкодера  
        if((!encoderR_A) && (encoderR_A_prev)){    // если состояние изменилось с положительного к нулю
          if(encoderR_B) {
                                                   // выход В в полож. сост., значит вращение по часовой стрелке
                                                   // увеличиваем яркость, не более чем до 255
            if(brightnessR + fadeAmountR <= 255) brightnessR += fadeAmountR;              
          }  
          else {
                                                   // выход В в 0 сост., значит вращение против часовой стрелки    
                                                   // уменьшаем яркость, но не ниже 0
            if(brightnessR - fadeAmountR >= 0) brightnessR -= fadeAmountR;              
          }  
        }  
        encoderR_A_prev = encoderR_A;              // сохраняем значение А для следующего цикла
       
        analogWrite(2, brightnessR);               // устанавливаем яркость на 2 ножку
        loopTimeR = currentTimeR;
     
        currentTimeG = millis();
      if(currentTimeG >= (loopTimeG + 5)){         // проверяем каждые 5мс (200 Гц)
        encoderG_A = digitalRead(Gpin_A);          // считываем состояние выхода А энкодера
        encoderG_B = digitalRead(Gpin_B);          // считываем состояние выхода B энкодера  
        if((!encoderG_A) && (encoderG_A_prev)){    // если состояние изменилось с положительного к нулю
          if(encoderG_B) {
                                                   // выход В в полож. сост., значит вращение по часовой стрелке
                                                   // увеличиваем яркость, не более чем до 255
            if(brightnessG + fadeAmountG <= 255) brightnessG += fadeAmountG;              
          }  
          else {
                                                   // выход В в 0 сост., значит вращение против часовой стрелки    
                                                   // уменьшаем яркость, но не ниже 0
            if(brightnessG - fadeAmountG >= 0) brightnessG -= fadeAmountG;              
          }  
        }  
        encoderG_A_prev = encoderG_A;              // сохраняем значение А для следующего цикла
       
        analogWrite(2, brightnessG);               // устанавливаем яркость на 2 ножку
       
        loopTimeG = currentTimeG;
       
        currentTimeB = millis();
      if(currentTimeB >= (loopTimeB + 5)){         // проверяем каждые 5мс (200 Гц)
        encoderB_A = digitalRead(Bpin_A);          // считываем состояние выхода А энкодера
        encoderB_B = digitalRead(Bpin_B);          // считываем состояние выхода B энкодера  
        if((!encoderB_A) && (encoderB_A_prev)){    // если состояние изменилось с положительного к нулю
          if(encoderB_B) {
                                                   // выход В в полож. сост., значит вращение по часовой стрелке
                                                   // увеличиваем яркость, не более чем до 255
            if(brightnessB + fadeAmountB <= 255) brightnessB += fadeAmountB;              
          }  
          else {
                                                   // выход В в 0 сост., значит вращение против часовой стрелки    
                                                   // уменьшаем яркость, но не ниже 0
            if(brightnessB - fadeAmountB >= 0) brightnessB -= fadeAmountB;              
          }  
        }  
        encoderB_A_prev = encoderB_A;             // сохраняем значение А для следующего цикла
       
        analogWrite(2, brightnessB);              // устанавливаем яркость на 2 ножку
       
        loopTimeB = currentTimeB;
       
      }                      
      }
      }
    }
     
    Последнее редактирование: 24 апр 2020
  2. otis

    otis Гик

    Ответ поддержки Амперка.
    Модуль энкодер нельзя подключать к модулям расширения. Нужен постоянный опрос. Поэтому рекомендуем подключить энкодер к управляющей плате UNO Slot.
     
  3. b707

    b707 Гуру

    логично. Или нужен модуль специально для энкодера
     
  4. otis

    otis Гик

    Но вот если с энкодероми все понятно. То почему в этом скетче не работает сеть I2C.