7-сегментные индикаторы

Тема в разделе "Arduino & Shields", создана пользователем sempol451, 27 май 2013.

  1. sempol451

    sempol451 Нуб

    Вопрос такой. Для одного из проектов понадобились два 7-сегментных индикатора, они у меня были, используя туториал с сайта, соединил микросхемы-драйвера и индикаторы. В качестве теста скопировал программу из туториала. И тут начались странности.

    Я много раз перепроверял соединения - все верно, распиновка соблюдена. Но почему-то
    а) Некоторые цифры отображаются странно (см. фото)
    б) Отсчет идет от 60 вверх, до 09 (или так и должно было быть?), затем по-новой, но почему-то в первый раз после 63 идет сразу 65 :D

    [​IMG]
    [​IMG]

    В чем может быть дело?

    Заранее спасибо.
     
  2. Mitrandir

    Mitrandir Гуру

    а зачем столько резисторов?
    я через 1 на общей земле подключал, или так как я делал неправильно?
     
  3. nailxx

    nailxx Официальный Нерд Администратор

    @sempol451 Проблема точно в подключении, в неправильной распиновке. Кропотливо, но ничего не поделаешь — нужно искать

    @Mitrandir — вы читер :) Будет работать, но в зависимости от количества подожжённых сегментов, их яркость будет разной. Чем больше, тем тусклее. Это «болезнь» всех дешёвых китайских часов.
     
    Megakoteyka и Mitrandir нравится это.
  4. sempol451

    sempol451 Нуб

    @nailxx Понятно, спасибо!

    А со счетом почему странности (63->65)?
     
  5. NR55RU

    NR55RU Гик

    Я так же собирал это по уроку с вики амперки.
    Сперва собрал с 1 индикатором чтобы детально разобраться в принципе работы, ведь когда один "щелкает" нормально второй подключить уже не проблема.
    Посему могу порекомендовать сперва аккуратно собрать с 1 индикатором.
    Так же порекомендую с увеличительным стеклом рассмотреть все резисторы, какие то могут задевать ножками в такой мешанине что тоже может сказаться.
    Вот моя схема, только я reset не подключал так как собирал просто ради понять как работает а не для дела :)
    Все "щелкало" отлично.
    [​IMG]
     
  6. sempol451

    sempol451 Нуб

    Спасибо всем!

    Проблема, конечно же, оказалась на моей стороне. Первый индикатор был подключен совершенно правильно, а вот на втором я умудрился перепутать порядок перехода с 5 на 6 - то есть 6-м контактом у меня чудесным образом оказался не крайний правый, а крайний левый, так что все контакты верхнего ряда были подключены наоборот.

    Впредь постараюсь быть повнимательнее :)
     
  7. Recoshet

    Recoshet Нерд

    Подскажите, вот пытаюсь подружить ардуину с таким led дисплеем:
    Фото032.jpg Фото033.jpg
    сбоку написано: CC56-12GWA

    Тут получается так. Контакты 4 для цифр одинаковые, а земли для каждой цифры разные. В итоге при помощи драйвера CD4026 получилось задействовать только одну цифру, либо если земли объединить везде показываются одни и те же цифры. Попробовал подключить к разным землям два драйвера, но так как контакты сегментов общие, получилась каша , так как земли снова объединились. Может посоветуете способ включения при помощи 4х CD4026 или наверняка есть какой другой драйвер...
     
  8. Unixon

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

    Если не жалко пинов, можно и вовсе без драйвера обойтись, а если их просто нет свободных, тогда через расширитель I/O на I2C.
     
  9. Recoshet

    Recoshet Нерд

    Мне не жалко пинов, но вот проблема в том что я не могу заставить показывать разные цифры из-за одинаковых контактов к сегментам... По поводу I/O на I2C пока незнакомые для меня выражения. Буду изучать.
     
  10. Unixon

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

    Сегменты нужно включать по очереди.
    Выключили текущий сегмент - набрали новую цифру - включили следующий сегмент - подождали - повторили сначала.
     
  11. Recoshet

    Recoshet Нерд

    Это всё мерцать, получается, будет...
     
  12. Unixon

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

    Теоретически, да, но если переключать достаточно быстро, но глаз этого не будет замечать.
    На инерционности глаза держится вся динамическая индикация.
    Мы ежедневно наблюдаем ее вокруг и даже не догадываемся.
     
    Recoshet нравится это.
  13. Recoshet

    Recoshet Нерд

    Хорошо. Спасибо, буду пробовать... Я так понимаю, это захватит громадное процессорное время :) ну чтож сначала надо сделать, что бы хотя бы заработало!
     
  14. grx1a

    grx1a Гик

    Может поможет! Книга Margolis M. 2011 Arduino Cookbook
    стр 248-----
     
  15. Ujin

    Ujin Нерд

    расширитель портов на шинах типа spi и i2c интересное дело но для использования их для семисегментных индикаторов довольно дорогое удовольствие, стоит обратить внимание на микросхемы сдвиговых регистров (например типа нс164 или нс595 последняя еще умеет в третьем состоянии быть)сэкономите ноги мк +выходы микросхем более "мощные"чем выводы микроконтроллера которые можно "поджечь" даже индикаторами как у вас в схеме если не ограничивать ток протекающий через ногу мк.Управлять этим добром непросто легко а очень легко эти микра есть и дип корпусах...воткнуть в макетку без проблем + легко купить и стоят ведро 5 копеек...про схемы подключения прогуглите и всё найдёте народ их юзает давно и много + гуглподсказка для прочтения про динамическую индикацию вам будет весьма полезна...(еще посоветую посмотреть вам с сторону программы PROTEUS это симулятор электронных схем причем он неплохо симулирует мк всякие авр который торчит у вас в ардуинке так же тама есть ети шифт регистры каторые я советовал вам + есть и различные индикаторы,семисегментных там куча.Набросав там схему и подцепив к мк программу вы уже сможете не делая физически схему примерно посмотреть и оценить как это у вас будет работать. Естественно собранная в железе схема это круто но перед этим не мешает посмотреть на неё в симуляторе на стадии проектирования и отладки именно логики работы программы мк, сама программа тоже очень известна хелпы и даже на русском много почерпнете много полезного из неё)
     
    Recoshet нравится это.
  16. Unixon

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

    На всякий случай напомню, что лицензия на Proteus стоит от $480 до $6600, в зависимости от варианта, и работает всё это добро исключительно под Windows.
     
  17. Recoshet

    Recoshet Нерд

    Сегодня я понял что если в пин записать LOW, то это будет "-", а если записать HIGH, то это будет "+". Раньше думал что если записать LOW то там вообще не будет никакого сигнала.

    Сегодня реализовал при помощи драйвера CD4026 и переключения "-" отображение нескольких цифр на этом LED дисплее:
    Посмотреть вложение 628 Посмотреть вложение 629

    Всё получилось! Но тёмные сегменты начинают светиться при больших числах. У меня в коде надо как то выводить необходимый разряд числа. Подскажите? А то слишком много лишних холостых переключений посылается на драйвер...

    Код (C):
    #define CLOCK_PIN 52
    #define RESET_PIN 50
    #define a_PIN 39
    #define b_PIN 37
    #define c_PIN 35
    #define d_PIN 33
     
    int i = 1;
    int j = 1;
    /*
     * Функция resetNumber обнуляет текущее значение
     * на счётчике
     */

    void resetNumber()
    {
        // Для сброса на мгновение ставим контакт
        // reset в HIGH и возвращаем обратно в LOW
        digitalWrite(RESET_PIN, HIGH);
        digitalWrite(RESET_PIN, LOW);
    }
     
    /*
     * Функция showNumber устанавливает показания индикаторов
     * в заданное неотрицательное число `n` вне зависимости
     * от предыдущего значения
     */

    void showNumber(int n)
    {
        // Первым делом обнуляем текущее значение
        resetNumber();
     
        // Далее быстро «прокликиваем» счётчик до нужного
        // значения
        while (n--) {
            digitalWrite(CLOCK_PIN, HIGH);
            digitalWrite(CLOCK_PIN, LOW);
        }
    }
     
    void setup()
    {
        pinMode(RESET_PIN, OUTPUT);
        pinMode(CLOCK_PIN, OUTPUT);
       
        pinMode(a_PIN, OUTPUT);
        pinMode(b_PIN, OUTPUT);
        pinMode(c_PIN, OUTPUT);
        pinMode(d_PIN, OUTPUT);
     
        // Обнуляем счётчик при старте, чтобы он не оказался
        // в случайном состоянии
        resetNumber();
    }
     
    void loop()
    {
        for (j = 0; j <= 500; j++)
        {
        digitalWrite(c_PIN, LOW);
        showNumber(i);
        delay(2);
        digitalWrite(c_PIN, HIGH);
        digitalWrite(b_PIN, LOW);
        showNumber(i/10);
        delay(2);
        digitalWrite(b_PIN, HIGH);
        digitalWrite(a_PIN, LOW);
        showNumber(i/100);
        delay(2);
        digitalWrite(a_PIN, HIGH);
        }
       
        i++;
     
    }

     
  18. Unixon

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

    Поменяйте местами переключение разряда и набор цифры так, чтобы функция ShowNumber() вызывалась при выключенном разряде.

    Код (C):

    digitalWrite(c_PIN, HIGH);
    showNumber(i);
    digitalWrite(c_PIN, LOW);
    delay(2);
    digitalWrite(c_PIN, HIGH);
    }
     
    Recoshet нравится это.
  19. Recoshet

    Recoshet Нерд

    Сейчас попробую, однако вот так сделал, и сейчас сколь угодно большое число показывается одинаково.
    Код (C):
        for (j = 0; j <= 10; j++)
        {
        digitalWrite(c_PIN, LOW);
        showNumber(i%10);
        delay(4);
        digitalWrite(c_PIN, HIGH);
        digitalWrite(b_PIN, LOW);
        showNumber(i/10%10);
        delay(4);
        digitalWrite(b_PIN, HIGH);
        digitalWrite(a_PIN, LOW);
        showNumber(i/100%10);
        delay(4);
        digitalWrite(a_PIN, HIGH);
        }
    А вот конечный вариант вывода. Большое спасибо! Сейчас вообще всё чётко получилось!
    Код (C):
        for (j = 0; j <= 100; j++)
        {
        digitalWrite(c_PIN, HIGH);
        showNumber(i%10);
        digitalWrite(c_PIN, LOW);
        delay(2);
        digitalWrite(c_PIN, HIGH);
       
        digitalWrite(b_PIN, HIGH);
        showNumber(i/10%10);
        digitalWrite(b_PIN, LOW);
        delay(2);
        digitalWrite(b_PIN, HIGH);
       
        digitalWrite(a_PIN, HIGH);
        showNumber(i/100%10);
        digitalWrite(a_PIN, LOW);
        delay(2);
        digitalWrite(a_PIN, HIGH);
        }
     
  20. Yoda

    Yoda Нерд

    А я, когда делал подключение 7-сегментного индикатора по статье Вики - чуть вывих мозга не получил. Подключаю правильно - пропадает питание на ардуинке. ДООООЛГО искал - где КЗ. Оказалось - амперка прислала бракованную макетку! В нижнем ряду шина (-) и шина (+) - коротили. Пока я это выяснял - смог заставить работать этот индикатор по другой схеме включения. Хотел уже писать в Амперку, чтобы правили статью в вики, и нашел у себя глюк.
    А кто бы подумал! КЗ на макетке изначально! ))))