Ad5206 и управление с ик пульта с помощью ардуино.

Тема в разделе "Arduino & Shields", создана пользователем bichko, 24 янв 2020.

  1. bichko

    bichko Нерд

    Буду рад огорчить пользователя по совместительству модератора DetSimen.
    Прилагаю изображение действий как мне бы хотелось реализовать. Это схематическое понимание для одного из каналов, все каналы будут идентичны, только выбор канала для их управление будет принадлежать другим кнопкам. [​IMG]
    Не получается прикрепить изображение и загрузить, что то не разобрался в редакторе, файл тоже почему то не грузит, он меньше максимального объема. Вставляю ссылку на обменник картинками. https://ibb.co/JzFTSsZ
     
  2. bichko

    bichko Нерд

    В принципе схематически я все и отобразил, что написал словами. Может Конечно программистам так легче, спорить с этим не буду. В схеме 6 кнопок на пульте которые выбирают тот или иной канал и на управление этими каналами две кнопки для всех каналов - плюс и минус на пульте, которые собственно и уменьшают или увеличивают сопротивление каждого из цифровых потенциометров.
     
  3. KindMan

    KindMan Гуру

    Не всё ясно из схемы - Как определить увеличивать или уменьшать громкость? Я бы сделал так - Сначала выбираем канал цифровыми кнопками - 1..6, этот канал запоминаем, затем кнопками + - делаем с громкостью, что надо, в канале, который предварительно выбрали. Правильно я понял?
     
    bichko нравится это.
  4. bichko

    bichko Нерд

    Спасибо Вам за ранее, что есть желание помочь мне. Да все верно Вы поняли. Выбрали канал , если лучше его сохранить на Ваше мнение, то можно сохранить, что б делать потом манипуляции с ним на свое усмотрение увеличить или уменьшить сопротивление.
     
  5. KindMan

    KindMan Гуру

    Типа этого? IMG_20200124_220938_resized_20200124_101007518.jpg
    Как бы вы это обернули в if else?
    Подумайте, до воскресения, у меня будет время, пошаманим.
     
    bichko нравится это.
  6. bichko

    bichko Нерд

    Да именно так. Да, я попробую обернуть это в if else к завтра. То как именно я понимаю. Не уверен что этот код у меня заработает. Но честно, буду стараться, может Вам просто понадобится пару ошибок исправить, надеюсь))) Но заранее Вам благодарен.
     
  7. parovoZZ

    parovoZZ Гуру

    А зачем? Здесь так и просится секвенсор состояний.
     
  8. bichko

    bichko Нерд

    Извините, даже не знаю как это сделать. По секвенсору нашел только миди секвенсоры, и да, которые и делают на потенциометрах электронных. Но боюсь мне это точно не под силу, если я даже не знаю и приблизительно что, да как. Извините.
     
  9. b707

    b707 Гуру

    bichko - еще гляньте, как вы обернули в if-else текущий код. Может найдете ошибки
     
  10. KindMan

    KindMan Гуру

    Вот такой каркас лупа можно применить в вашем случае
    Код (C++):
    void loop() {
      if (irrecv.decode(&results)){
        Serial.println(results.value, HEX);
        switch (results.value) {
          case CH1:
            channel = 1;
            break;
         /* case CH2: Второй и т.д.
            channel = 2;
            break;   */

          case VOLP:
            if (channel) {
              //  Громкость вверх
            }
            break;
          case VOLM:
            if (channel) {
              //  Громкость вниз
            }      
            break;
        }
      }
    irrecv.resume(); // Получаем следующее значение
    // Тут уже можно запускать ваш таймер, и обнулять channel, чтобы потом не реагировать на нажатия, если хотите
    }
    Кнопки громкости будут регулировать канал, который был ранее нажат
     
    bichko нравится это.
  11. parovoZZ

    parovoZZ Гуру

    Я рассказываю здесь
    http://forum.amperka.ru/threads/Пощебечем-Часть-i.19009/
     
  12. bichko

    bichko Нерд

    Спасибо Вам большое за наводку в коде, я ее попробовал применить, в дальнейшей работе, даже что то да получилось, вот только изменяет сразу все каналы одновременно, а не по каналу который выбрал. А по поводу своего кода, то плюс минус у меня все равно выходил код который я приложил в самом первом своем сообщении.
    Код (C++):
    #include <SPI.h>
    #include <IRremote.h>
    const int slaveSelectPin = 10;
    int channel = 0;
    unsigned long previousMillis = 0;  // для хранения данных о том,
                                       // когда кнопка была нажата
                                       // в последний раз для выбора канала

    #define START_VOLUME_CH1 124  //стартовое значение громкости канал 1
    #define START_VOLUME_CH2 124  //стартовое значение громкости канал 2
    #define START_VOLUME_CH3 124  //стартовое значение громкости канал 3
    #define START_VOLUME_CH4 124  //стартовое значение громкости канал 4
    #define START_VOLUME_CH5 124  //стартовое значение громкости канал 5
    #define START_VOLUME_CH6 124  //стартовое значение громкости канал 6
    #define VOLUME_STEP 8          // шаг изменения громкости
    #define VOLP      0xFFA857    //кнопки пульт
    #define VOLM      0xFFE01F   //кнопки пульт
    #define CH1      0xFF30CF    //кнопки пульт канал 1
    #define CH2      0xFF18E7    //кнопки пульт канал 1
    #define CH3      0xFF7A85    //кнопки пульт канал 1
    #define CH4      0xFF10EF    //кнопки пульт канал 1
    #define CH5      0xFF38C7    //кнопки пульт канал 1
    #define CH6      0xFF5AA5    //кнопки пульт канал 1

    int value_tmp = 0;
    int RECV_PIN = 9; //пин подключения IR приёмника
    IRrecv irrecv(RECV_PIN);
    decode_results results;

    byte volume_CH1 = START_VOLUME_CH1;
    byte volume_CH2 = START_VOLUME_CH2;
    byte volume_CH3 = START_VOLUME_CH3;
    byte volume_CH4 = START_VOLUME_CH4;
    byte volume_CH5 = START_VOLUME_CH5;
    byte volume_CH6 = START_VOLUME_CH6;


    void setup()
    {
    Serial.begin(9600);
    pinMode(slaveSelectPin, OUTPUT);
    SPI.begin();
    digitalPotWrite(channel=0, volume_CH1);
    digitalPotWrite(channel=1, volume_CH2);
    digitalPotWrite(channel=2, volume_CH3);
    digitalPotWrite(channel=3, volume_CH4);
    digitalPotWrite(channel=4, volume_CH5);
    digitalPotWrite(channel=5, volume_CH6);
    irrecv.enableIRIn();

    }
    void digitalPotWrite(int address, int value) {
      // установить на выводе SS лог.0, чтобы выбрать чип:
      digitalWrite(slaveSelectPin, LOW);
      // отправить адрес и значение через SPI:
      SPI.transfer(address);
      SPI.transfer(value);
      // установить на выводе SS лог.1, чтобы отменить выбор чипа:
      digitalWrite(slaveSelectPin, HIGH);
    }
    void loop() {
    if(irrecv.decode(&results)){
      Serial.println(results.value, HEX);
      switch(results.value){
    case CH1:
            channel = 1;
            break;
          case CH2:
            channel = 2;
            break;

          case CH3:
            channel = 3;
            break;
          case CH4:
            channel = 4;
            break;
          case CH5:
            channel = 5;
            break;
          case CH6:
            channel = 6;
            break;

         
          case VOLP:
            if (channel=2) {
             volume_CH2 = volume_CH2 + VOLUME_STEP;
              digitalPotWrite(channel=2, volume_CH2);
             Serial.println(volume_CH2);
            }
            if (channel=1) {
             volume_CH1 = volume_CH1 + VOLUME_STEP;
            digitalPotWrite(channel=1, volume_CH1);
             Serial.println(volume_CH1);
            }
            break;
          case VOLM:
            if (channel=2) {
              volume_CH2 = volume_CH2 - VOLUME_STEP;
             digitalPotWrite(channel=2, volume_CH2);
              Serial.println(volume_CH2);
            }
            if (channel=1) {
             volume_CH1 = volume_CH1 - VOLUME_STEP;
             digitalPotWrite(channel=1, volume_CH1);
             Serial.println(volume_CH1);
             }
            break;
         
        }
        irrecv.resume(); // Получаем следующее значение
      }

    // Тут уже можно запускать ваш таймер, и обнулять channel, чтобы потом не реагировать на нажатия, если хотите

    }

     
     
    Последнее редактирование: 25 янв 2020
  13. KindMan

    KindMan Гуру

    Вот это что? Если вы хотите проверить чему равен channel то использовать надо ==
    В функции изменения громкости просто используйте текущий канал, а переменные громкости каждого канала поместите в массив, не нужно каждый раз проверять что там в channel.
     
    bichko нравится это.
  14. bichko

    bichko Нерд

    Простите. Да заменил, все заработало, отдельно для каждого канала. Сохраняет, передает, управляет. Осталось дописать сравнения на необходимость управления и что б не перескакивало с 255 в 0 и обратно, а то будет очень прикольно, хоть в жизни возможно этого и не будет скорее всего, но программно лучше уберечься от этого. Вам очень благодарен за помощь. Я всегда завидовал программистам за их умения и усидчивость. Ведь даже есть разница между одним равно и сдвоенным, ух)))
     
  15. KindMan

    KindMan Гуру

    Вот так, выглядит симпатичней
    Код (C++):
    #include <SPI.h>
    #include <IRremote.h>

    const int slaveSelectPin = 10;
    const int RECV_PIN = 9; //пин подключения IR приёмника

    byte channel;
    byte volume[6];

    #define START_VOLUME  124  // стартовое значение громкости
    #define VOLUME_STEP 5      // шаг изменения громкости
    #define VOLP   0xFFA857    //кнопки пульт
    #define VOLM   0xFFE01F    //кнопки пульт
    #define CH1    0xFF30CF    //кнопки пульт канал 1
    #define CH2    0xFF18E7    //кнопки пульт канал 1
    #define CH3    0xFF7A85    //кнопки пульт канал 1
    #define CH4    0xFF10EF    //кнопки пульт канал 1
    #define CH5    0xFF38C7    //кнопки пульт канал 1
    #define CH6    0xFF5AA5    //кнопки пульт канал 1

    IRrecv irrecv(RECV_PIN);
    decode_results results;

    void setup()
    {
    Serial.begin(9600);
    pinMode(slaveSelectPin, OUTPUT);
    SPI.begin();
    for (int n = 0; n < 6; n++) {
      digitalPotWrite(n, START_VOLUME);
    }
      irrecv.enableIRIn();
    }

    void digitalPotWrite(int address, int value) {
      // установить на выводе SS лог.0, чтобы выбрать чип:
      digitalWrite(slaveSelectPin, LOW);
      // отправить адрес и значение через SPI:
      SPI.transfer(address);
      SPI.transfer(value);
      // установить на выводе SS лог.1, чтобы отменить выбор чипа:
      digitalWrite(slaveSelectPin, HIGH);
    }

    void PrintVolume(byte ch){ // Выводим в монитор данные о громкости
        digitalPotWrite(ch-1, volume[ch-1]);
        Serial.print("Channel - ");
        Serial.print(ch);
        Serial.print(" ; Volume - ");
        Serial.println(volume[ch-1]);
    }

    void VolumeUp(byte ch) {
      if (!channel) return;
      if (volume[ch-1] != 255) { // Приращение изменили на 5, поэтому проверять выход за пределы не будем
        volume[ch-1] = volume[ch-1] + VOLUME_STEP;
        PrintVolume(ch);
      }
    }

    void VolumeDown(byte ch) {
      if (!channel) return;
      if (volume[ch-1] != 0) {
        volume[ch-1] = volume[ch-1] - VOLUME_STEP;
        PrintVolume(ch);
      }
    }

    void loop() {
    if(irrecv.decode(&results)){
      Serial.println(results.value, HEX);
      switch(results.value){
        case CH1:
            channel = 1;
            break;
        case CH2:
            channel = 2;
            break;
        case CH3:
            channel = 3;
            break;
        case CH4:
            channel = 4;
            break;
        case CH5:
            channel = 5;
            break;
        case CH6:
            channel = 6;
            break;
        case VOLP:
            VolumeUp(channel);
            break;
          case VOLM:
            VolumeDown(channel);
            break;
        }
        irrecv.resume(); // Получаем следующее значение
      }
    }
    Не проверял, но вроде нигде не накосячил, проверьте.
     
    bichko нравится это.
  16. b707

    b707 Гуру

    А сами вы даже не планируете хоть что-нибудь почитать по вопросу? так и будете сидеть и ждать, пока Киндман вам все напишет?
    За такую работу, вообще-то, принято платить.
     
    DetSimen нравится это.
  17. bichko

    bichko Нерд

    Вы извините конечно, но поверьте я читал, и не мало читал. И да, что то элементарное я смогу написать, да я смог бы написать все это под 12 кнопок, я сам написал себе код управлением реле, в том числе с удержанием кнопки на пульте, что б и реле держало контакты для запуска блютуз модуля вместо кнопки тактовой, я читал, и сам сидел делал, то что реально не смог одолеть, то там попросил помощь. Этот код который мне помог написать, что скрывать, полностью написал уважаемый человек Киндман, это всего лишь малая часть кода из всего скетча. Если попросит Киндман оплатить его труд, я это сделаю. Если бы мне нужно было написать код под весь проект, а я б это не мог или не хотел, я бы полностью бы заказал все где то.Что не раз делал, когда нужно было что то для сервера со стримингом видио. То что я делаю это для души, и хочется сделать полностью самому, своими ручками. Но так уж получилось, что отпуск заканчивается, а осталось совсем чуть чуть и на что мозгов не хватило, ну плохо я ориентируюсь в программировании к сожалению моя деятельность и программирование совсем по жизни не пересекаются.
     
  18. bichko

    bichko Нерд

    Уважаемый KindMan, сегодня проверю Ваш код, и отчитаюсь по поводу работы его на реальном железе. Может кому пригодится эта наработка в своих проектах и надеюсь эту ветку не удалят со временем. Код хороший, я подобное решение в интернете не нашел.
     
  19. bichko

    bichko Нерд

    Добрый вечер уважаемый KindMan, спасибо Вам большое за Ваш код. Загрузил и проверил в реальное железо, все отлично работает, после 255 не перескакивает на 0. Скрин прилагаю. Код отлично работает, очень классно. Спасибо Вам большое. Я б к такому не пришел, мне до такого мастерства ооочень далеко. Но как говорится, каждый должен заниматься своим делом, невозможно быть специалистом во всем. Вы в программировании думаю специалист высокого уровня. Искренне Вам благодарен.
     

    Вложения:

  20. bichko

    bichko Нерд

    Немного присмотрелся к коду, понял что не подтягиваются начальные значения громкости. Начинает с 5 по всем каналам. Почему-то из setup он не записывается в микросхему, и я не понимаю чего.
     
    Последнее редактирование: 27 янв 2020