Подключение мультиплексора.

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

  1. varvik85

    varvik85 Нерд

    Здравствуйте!Помогите пожалуйста разобраться с программой для расширения аналоговых входов для ардуино.Существует хорошо написанный код для работы с мультиплексором 4051 :

    Код (Text):
    /*
     
     
     
     
     
    int r0 = 0;   //value of select pin at the 4051 (s0)
    int r1 = 0;   //value of select pin at the 4051 (s1)
    int r2 = 0;   //value of select pin at the 4051 (s2)
    int count = 0;  //which y pin we are selecting
    void setup(){
    pinMode(2, OUTPUT); // s0
    pinMode(3, OUTPUT); // s1
    pinMode(4, OUTPUT); // s2
     
     
    }
    void loop () {
     for (count=0; count<=7; count++) {
      // select the bit
     r0 = bitRead(count,0); // use this with arduino 0013 (and newer versions)  
     r1 = bitRead(count,1); // use this with arduino 0013 (and newer versions)  
     r2 = bitRead(count,2); // use this with arduino 0013 (and newer versions)  
    //r0 = count & 0x01;      // old version of setting the bits
    //r1 = (count>>1) & 0x01;     // old version of setting the bits
    //r2 = (count>>2) & 0x01;     // old version of setting the bits
    digitalWrite(2, r0);
    digitalWrite(3, r1);
    digitalWrite(4, r2);
    //Either read or write the multiplexed pin here
      }
     
     
    }
    и собственно вопрос как теперь считывать значения на аналоговом входе 1?? допустим на Y1 мультиплексора подается лог1 что повличет за собой включение светодиода например на 4 ножке и т.д
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    http://alexval2007.ucoz.ru/forum/10-146-1
    Заведите 8 сигналов, которые нужно измерять, на входы мультиплексора Y0..Y7.
    Выход мультиплексора z подключите к аналоговому входу ардуино.

    Код (Text):
    #define ANALOG_PIN A0
    #define S0 2
    #define S1 3
    #define S2 4
    #define GET_BIT(value, but_number) (((value) >> (bit_number)) & 0x1)
     
    int buffer[8];
     
    void GetAnalogData()
    {
      for(int i = 0; i < 8; i++)
      {
        digitalWrite(S0, GET_BIT(i, 0));
        digitalWrite(S1, GET_BIT(i, 1));
        digitalWrite(S2, GET_BIT(i, 2));
        buffer[i] = analogRead(ANALOG_PIN);
      }
    }
    Примерно так.
     
  3. varvik85

    varvik85 Нерд

    пробую совместить написанный вами код и не получается,не могли бы вы помочь с этим и прокоментировать работу вашей программы
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Да там и комментировать особо нечего - в цикле перебираются входы мультиплексора, с каждого входа читается значение и кладется в массив. В итоге имеем массив, в котором лежат 8 значений.
    Вам остается только подставить эти значения в свою программу.
    Что именно не получается? Что именно не понятно?
     
  5. varvik85

    varvik85 Нерд

    где там массив и что откуда брать то? как мне привязать выходы ардуино с загружеными светодиодами к входам мультиплексора? как мне составить условия при котором,в случае появления сигнала допустим на первом входе мультиплексора,загарается светодиод на 13 выходе ардуино. Понятно только что входы перебираются,а как и что куда заводится не понятно.Разъясните чайнику вконце концов то)
     
  6. varvik85

    varvik85 Нерд

    просто если Вам не сложно прокоментируйте каждую строчку в вашем коде
     
  7. Megakoteyka

    Megakoteyka Оракул Модератор

    Код (Text):
    #define ANALOG_PIN A0// аналоговый вход, на который пойдут сигналы через мультиплексор
    #define S0 2 // нога адреса мультиплексора
    #define S1 3 // вторая
    #define S2 4 // третья
     
    // макрос возвращает заданый разряд из числа
    #define GET_BIT(value, but_number) (((value) >> (bit_number)) & 0x1)
     
    // массив на 8 элемнтов
    int buffer[8];
     
    // функция перебирает все каналы мультиплексора и сохраняет данные в массиве
    void GetAnalogData()
    {
      // перебираем 8 каналов мультиплексора - с 0-го по 7-й включительно
      for(int i = 0; i < 8; i++)
      {
        // выставляем на мультиплексоре адрес очередного канала
        digitalWrite(S0, GET_BIT(i, 0));
        digitalWrite(S1, GET_BIT(i, 1));
        digitalWrite(S2, GET_BIT(i, 2));
        // выставили. теперь мультиплексор подает сигнал с ножки Yi на ножку z,
        // которая подключена к аналоговому входу A0 ардуины
     
        // читаем аналоговый вход и сохраняем его в i-й элемент массива
        buffer[i] = analogRead(A0);
      }
    }
    Если что-то непонятно - спрашивайте, объясню подробней.
     
  8. Megakoteyka

    Megakoteyka Оракул Модератор

    А как вообще мультиплексор работает - разобрались?
    Это и то читали? И это заодно.
     
  9. varvik85

    varvik85 Нерд

    Немного стало понятней!Спасибо большое!Как теперь достать числа из массива buffer ??? и здесь наверно for(int i = 0; i < 8; i++) не i < 8 а i < 7 ; и как мне знать что число из массива, соответствует именно тому входу,который нужен в данный момент? допустим если на входе 1 появился сигнал лог 1 то я перенаправляю его на 9 выход дуины,если на входе 2 (мультиплексора) то включаю (лог1) выход 10 дуины и так далее,либо вывожу числа на дисплей первый вход lcd print 1 второй вход lcd print 2 ???
     
  10. varvik85

    varvik85 Нерд

    читал,как работает мультиплексор понимаю,понимаю ту часть программы которая заставляет переключать входы мультиплексора,но как мне считать значения с аналогового входа?
    Код (Text):
    if (на аналоговом входе плексора 4(не знаю как написать программно) ==high
    {
      ledPin9=high
    if (на аналоговом входе плексора 5(не знаю как написать программно) ==high
    {
      ledPin10=high
    }
    }
     
     
  11. Megakoteyka

    Megakoteyka Оракул Модератор

    Именно i < 8, читайте это.
    Получить значение нужного канала можно так:
    buffer[номер_канала]
     
  12. varvik85

    varvik85 Нерд

    да ??? так просто??? т.е

    if (buffer[1] < 64)
    {
    LedPin9=Hight
    }
    if (buffer[1] < 64)
    {
    LedPin10=Hight
    }
    он же аналоговое число вытаскивает из первого входа,оно же может быть 0 до 1024 верно? т.е может принимать значения до 64 и как только примет его то зажгется светодиод на 9 пине так?
     
  13. Megakoteyka

    Megakoteyka Оракул Модератор

    Не если мультиплексор переключился. Вы его сами переключаете в цикле.
    Когда на мультиплексоре стоит адрес 3 (011дв.), у него выбран вход Y3. И то, что на этом входе висит, подается на выход z мультиплексора, который нужно подключить к аналоговому входу ардуино. И тогда мы будем читать один и тот же аналоговый вход 8 раз и каждый раз на нем будет сигнал с очередного входа мультиплексора. После пробежки по циклу в массиве будут лежать свежие значения.
     
  14. varvik85

    varvik85 Нерд

    все...теперь окончательно запутался...:(
     
  15. Megakoteyka

    Megakoteyka Оракул Модератор

  16. varvik85

    varvik85 Нерд

    а понял,в цикле переключаются входы по кругу, и после каждого круга в буфер или массив (с аналогового входа который подключен к выходу z мультиплекса) будут скидываться все восемь значений, а как выбрать из массива именно то число которое мне нужно,число с входа Y3 например?:(
     
  17. Megakoteyka

    Megakoteyka Оракул Модератор

  18. varvik85

    varvik85 Нерд

    почему при совмещении выдает ошибку компиляции??
    Код (Text):
    int r0 = 0;   //value of select pin at the 4051 (s0)
    int r1 = 0;   //value of select pin at the 4051 (s1)
    int r2 = 0;   //value of select pin at the 4051 (s2)
    int count = 0;  //which y pin we are selecting
    void setup(){
    pinMode(2, OUTPUT); // s0
    pinMode(3, OUTPUT); // s1
    pinMode(4, OUTPUT); // s2
     
     
    }
    void loop () {
    for (count=0; count<=7; count++) {
      // select the bit
    r0 = bitRead(count,0);  // use this with arduino 0013 (and newer versions)
    r1 = bitRead(count,1);  // use this with arduino 0013 (and newer versions)
    r2 = bitRead(count,2);  // use this with arduino 0013 (and newer versions)
    //r0 = count & 0x01;      // old version of setting the bits
    //r1 = (count>>1) & 0x01;     // old version of setting the bits
    //r2 = (count>>2) & 0x01;     // old version of setting the bits
    digitalWrite(2, r0);
    digitalWrite(3, r1);
    digitalWrite(4, r2);
    //Either read or write the multiplexed pin here
      }
    #define ANALOG_PIN A0// аналоговый вход, на который пойдут сигналы через мультиплексор
    #define S0 2 // нога адреса мультиплексора
    #define S1 3 // вторая
    #define S2 4 // третья
     
    // макрос возвращает заданый разряд из числа
    #define GET_BIT(value, but_number) (((value) >> (bit_number)) & 0x1)
     
    // массив на 8 элемнтов
    int buffer[8];
     
    // функция перебирает все каналы мультиплексора и сохраняет данные в массиве
    void GetAnalogData()
    {
      // перебираем 8 каналов мультиплексора - с 0-го по 7-й включительно
      for(int i = 0; i < 8; i++)
      {
        // выставляем на мультиплексоре адрес очередного канала
        digitalWrite(S0, GET_BIT(i, 0));
        digitalWrite(S1, GET_BIT(i, 1));
        digitalWrite(S2, GET_BIT(i, 2));
        // выставили. теперь мультиплексор подает сигнал с ножки Yi на ножку z,
        // которая подключена к аналоговому входу A0 ардуины
     
        // читаем аналоговый вход и сохраняем его в i-й элемент массива
        buffer[i] = analogRead(A0);
      }
    }
     
  19. Megakoteyka

    Megakoteyka Оракул Модератор

    Ругается на отсутствие завершающей скобки - "}", читайте сообщения компилятора.
    Что Вы пытаетесь "совместить"? Код, перебирающий входы мультиплексора и код, перебирающий входы мультиплексора? :)
    Вам бы не помешало сперва прочесть все вот здесь, а потом еще тут раздел "Программирование", а то у Вас каша в голове.
     
  20. varvik85

    varvik85 Нерд

    на счет каши Вы правы:) ну это наверно естественный процесс обучения, в ходе которого,эта субстанция в голове всегда возникает:) по этому хочу сказать Вам Спасибо за полезные ссылки!