Управление TM1637. Arduino.

2016-04-06_23-31-15TM1637На просторах китайского интернет-ширпотреба можно найти кучу полезных в нашем деле вещей. Речь сегодня как пойдет именно о такой полезной вещи — модуле семисегментных индикаторов на четыре знакоместа на базе драйвера ТМ1637, позволяющем управлять всем модулем всего по двум проводам. Данная микросхема родилась в недрах китайской электронной промышленности и была предназначена для управления отображением времени и счетчика в видеоплеерах. Соответственно datasheet на неё придумывали китайцы и (вы не поверите!) на китайском языке.
Производитель то ли микросхемы, то ли модуля (я так и не разобрал) порадовал потенциальных пользователей своего продукта небольшим куском кода в даташите, а также скромной, но вполне годной библиотекой «TM1637.h», позволяющей выводить на экранчик как отдельные цифры, так и числа целиком (положительные, отрицательные, целые и с плавающей точкой). Если внимательно приглядеться ко второй картинке, можно увидеть, что индикатор имеет как десятичные точки в каждом знакоместе, так и сдвоенные точки между вторым и третьим разрядом, предназначенные для отображения времени. И по заявлению продавца, продавшего мне сие чудо, все сегменты индивидуально управляемые. Кстати, купил я эти модули примерно за 120 рублей за штучку, это что-то около 1,6 бакса. Модули были доступны в трёх цветах — зеленом, красном и желтом. Все цвета красивые и радующие глаз. Если интересно, то вот магазин . Радость от покупки была не очень долгой. После того, как я порадовался эстетичной пайке и красивому внешнему виду, я решил испытать их на деле.

Раскопал в закромах китайский аналог Arduino Nano 3.0, прикрутил библиотеку, прошил скетч из примеров, прилагавшихся к уже вышеупомянутой библиотеке и, о чудо!.. Ничего не заработало… Я прошил еще один — та же ерунда. Лишь третий скетч под названием NumberFlow, так уж и быть, заработал. Это выглядело как одолжение со стороны разработчика модуля или библиотеки, но тем не менее это позволило мне проверить работоспособность купленных модулей. Так что если перед Вами стоит задача проверить модули на исправность, то
— смело качайте библиотеку и прикручивайте её к Arduino IDE,
— подсоединяйте к Вашей Arduino модуль ТМ1637, по умолчанию тактовый вход (CLK) цепляется на 3-й цифровой пин, а вход данных (DIO) на 2-й цифровой пин;
— берите пример NumberFlow и прошивайте им свою Arduino.
— радуйтесь тому, как шестнадцатеричные цифры бегут по индикатору.

В целом библиотека для Arduino позволяет:
— выводить шестнадцатеричный знак в любое знакоместо — функция Display(x,y) где x — номер разряда от 0 до 3, y — знак 0..9, A,b,C,d,E,F
— выводить сразу группу из 4-х шестнадцатеричных знаков- функция Display(x[]) где x[] — массив из 4 элементов, по числу знаков.
— выводить десятичное целое число — функция Display(x) где x — целое от -999 до 9999
— выводить десятичное число с плавающей точкой — функция Display(x) где x — число с плавающей точкой от -999 до 9999
— очищать дисплей — функция clearDisplay(x) — дело в том, что информация на индикаторе сохраняется до тех пока не запишешь новую
— устанавливать яркость индикатора функция set(x) где x — яркость от 0 до 7, по умолчанию яркость равна 2.

Пример простейшего кода:

#include <TM1637.h>

#define CLK 3 //определим константы как номера пинов на которые будут соединены с одноименными пинами на модуле
#define DIO 2 //это нужно будет позже

TM1637 tm1637(CLK,DIO);//создаем экземпляр объекта типа «TM1637», с которым будем далее работать и задаем пины.
// можно было и не определять константы, а написать проще — вместо трёх предыдущих строк одну:
// TM1637 tm1637(3,2);, но так как мы сделали наглядней

void setup()
{
tm1637.init();// инициализация библиотеки «TM1637.h»
tm1637.set(BRIGHT_TYPICAL);//установка яркости указанная константа равна 2, значение по умолчанию
}void loop()
{
tm1637.display(1234);//выводим на индикатор целое «1234»
delay(3000);//ждём 3 секунды
tm1637.display(0,9);//выводим на первое знакоместо индикатора (с индексом 0) знак «9», таким образом у нас на экранчике — «9234»
delay(3000);}//опять ждём 3 секунды, чтобы заценить результат

Ладно, хорошо. На Arduino вроде работает. Но меня интересовало подключение к «голому» микроконтроллеру AVR. Попытка раскопать аналогичную библиотеку на Си для Atmel Studio вообще ни к чему не привела. Мало того, кое-как я умудрился нарыть перевод datasheet’а на английский язык. Ага, на английский с небольшим кантонским диалектом. Но тем не менее, кое-что разобрать было можно и я решил с помощью datasheet’а переписать ардуиновскую библиотеку на Си для AVR.

Но про это в другой статье, а пока для ленивых все ссылки из текста:

«TM1637.h» — Библиотека для Arduino
RoboDyne — магазин
Управление TM1637. AVR (Си). — следующая статья на эту же тему

P.S. Пока писалась статья, выяснилось, что я никак не могу заставить отображать этот модуль десятичные точки. Вот это поворот! Пишу это немного забегая вперед, так как я уже полностью перекопал библиотеку и подрихтовал её в соответствии с даташитом. Но даже записывая в микросхему напрямую, в обход библиотечных функций, команды, прямо указывающие отобразить десятичные точки, я не получал нужного мне результата. Так, что вывод простой — полноценной функциональности от связки модуля с приложенной библиотекой вы не добьетесь. Будем копать и стараться исправить.

Метки , , , , , , , , , , , , . Закладка постоянная ссылка.

25 комментариев: Управление TM1637. Arduino.

  1. Евгений Глущенко говорит:

    при загрузке Вашего скетча пишет такую ошибку:
    error: initializing argument 1 of ‘void TM1637::display(int8_t*)’ [-fpermissive]

    void display(int8_t DispData[]);

    ^

    exit status 1
    invalid conversion from ‘int’ to ‘int8_t* {aka signed char*}’ [-fpermissive]
    может подскажите в чем причина?

    • admin говорит:

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

  2. Евгений Глущенко говорит:

    Спасибо за ответ, я постарюсь пояснить.
    скетч под названием NumberFlow работает.
    Ваш пример простейшего кода скопировал и при проверке останавливается на строке
    tm1637.display(1234);//выводим на индикатор целое «1234»
    сам текст ошибки
    C:\Documents and Settings\Admin\РњРѕРё документы\Arduino\led2\led2.ino: In function ‘void loop()’:

    led2:15: error: invalid conversion from ‘int’ to ‘int8_t* {aka signed char*}’ [-fpermissive]

    In file included from C:\Documents and Settings\Admin\Мои документы\Arduino\led2\led2.ino:1:0:

    C:\Documents and Settings\Admin\Мои документы\Arduino\libraries\tm1637/TM1637.h:51:10: error: initializing argument 1 of ‘void TM1637::display(int8_t*)’ [-fpermissive]

    void display(int8_t DispData[]);

    ^

    led2:18: error: expected ‘}’ at end of input

    exit status 1
    invalid conversion from ‘int’ to ‘int8_t* {aka signed char*}’ [-fpermissive]

  3. Евгений Глущенко говорит:

    не помогло

    • admin говорит:
      #include <TM1637.h>
      
      #define CLK 3 //определим константы как номера пинов на которые будут соединены с одноименными пинами на модуле
      #define DIO 2 //это нужно будет позже
      
      TM1637 tm1637(CLK,DIO);//создаем экземпляр объекта типа «TM1637», с которым будем далее работать и задаем пины.
      // можно было и не определять константы, а написать проще — вместо трёх предыдущих строк одну:
      // TM1637 tm1637(3,2);, но так как мы сделали наглядней
      
      void setup()
      {
      tm1637.init();// инициализация библиотеки «TM1637.h»
      tm1637.set(BRIGHT_TYPICAL);//установка яркости указанная константа равна 2, значение по умолчанию
      }void loop()
      {
      tm1637.display(1234);//выводим на индикатор целое «1234»
      delay(3000);//ждём 3 секунды
      tm1637.display(0,9);//выводим на первое знакоместо индикатора (с индексом 0) знак «9», таким образом у нас на экранчике — «9234»
      delay(3000);}//опять ждём 3 секунды, чтобы заценить результат
      
      
    • admin говорит:

      Нашел две ошибки, поправил. компилируется

  4. Евгений Глущенко говорит:

    что нужно поправить?

    • admin говорит:

      я поменял первую и последнюю строчки. Можете скопировать рабочий вариант прямо из моего комментария в 21:02

  5. Евгений Глущенко говорит:

    хмм, у меня не работает, та же строчка

  6. Евгений Глущенко говорит:

    и изменений не вижу

    • admin говорит:

      #include «TM1637.h» — имя файла было в кавычках

      delay(3000);//опять ждём 3 секунды, чтобы заценить результат} — была неверно установлена фигурная закрывающая скобка

      Вот и вся разница

  7. Евгений Глущенко говорит:

    #include «TM1637.h»
    #define CLK 3 //определим константы как номера пинов на которые будут соединены с одноименными пинами на модуле
    #define DIO 2 //это нужно будет позже

    TM1637 tm1637(CLK,DIO);//создаем экземпляр объекта типа «TM1637», с которым будем далее работать и задаем пины.
    // можно было и не определять константы, а написать проще — вместо трёх предыдущих строк одну:
    // TM1637 tm1637(3,2);, но так как мы сделали наглядней
    void setup()
    {
    tm1637.init();// инициализация библиотеки «TM1637.h»
    tm1637.set(BRIGHT_TYPICAL);//установка яркости указанная константа равна 2, значение по умолчанию
    }void loop()
    {
    tm1637.display(1234);//выводим на индикатор целое «1234»
    delay(3000);//ждём 3 секунды
    tm1637.display(0,9);//выводим на первое знакоместо индикатора (с индексом 0) знак «9», таким образом у нас на экранчике — «9234»
    delay(3000);//опять ждём 3 секунды, чтобы заценить результат
    }

    Arduino: 1.6.7 (Windows XP), Плата:»Arduino Nano, ATmega328″

    C:\Documents and Settings\Admin\РњРѕРё документы\Arduino\led2\led2.ino: In function ‘void loop()’:

    led2:14: error: invalid conversion from ‘int’ to ‘int8_t* {aka signed char*}’ [-fpermissive]

    In file included from C:\Documents and Settings\Admin\Мои документы\Arduino\led2\led2.ino:1:0:

    C:\Documents and Settings\Admin\Мои документы\Arduino\libraries\tm1637/TM1637.h:51:10: error: initializing argument 1 of ‘void TM1637::display(int8_t*)’ [-fpermissive]

    void display(int8_t DispData[]);

    ^

    exit status 1
    invalid conversion from ‘int’ to ‘int8_t* {aka signed char*}’ [-fpermissive]

  8. Евгений Глущенко говорит:

    кавычки и скобку я сразу попрвил, не только в этом проблема

    • admin говорит:

      компиляциятогда попробуйте 1.6.5 скачать. У меня на машине с XP примерно такая же беда была. Win7 исправно компилирует скетч. У Вас почему то не ту полиморфную функцию из библиотеки подтаскивает компилятор

  9. Евгений Глущенко говорит:

    Все заработало в 1.6.12!
    Спасибо за наводку!

  10. DenisO говорит:

    Похоже у вас не оригинальная библиотека.
    В ней зачем-то включена запись в серийник того, что уходит на экран. Плюс просматривая оригинальную либу (ну или похожее на то: https://github.com/linksprite/Linkerkit/tree/master/Linker_4D7SLED) , заметил что можно обNull-ить нужный индикатор отправив 0x7F.

    • admin говорит:

      Вроде я её не изменял, перед тем как выложить. Хотя гарантировать не могу. Давно уже было. Просто не помню. Подозреваю, что отлаживал её через монитор порта, поэтому писал в Serial.

  11. Владислав говорит:

    Вы не могли бы скинуть че там в шине анализатором?
    Так как у меня PI16f819 и я пытаюсь его заставить работать.

    • admin говорит:

      Всё намного проще, Владислав. Если Вы на Си пишете под PIC, то код софтверного I2C почти ничем отличаться не будет, за исключением управления состоянием лапок (реализацией вывода в порт). Он лежит тут.А если хочется посмотреть, что именно происходит на шине в момент отправки данных от МК к ТМ1637, то вот Вам датащит

  12. Дмитрий говорит:

    Приветствую!
    Кто-то пробовал использовать весь функционал данной микросхемы на платформе Arduino? Я имею ввиду использование 6-ти разрядов и клавиатуры.

    • admin говорит:

      У китайцев есть готовый модуль с полным функционалом. Но мне он без надобности. Разницы в использовании — никакой вообще. Те же регистры, такая же запись.

  13. Сергей говорит:

    «Но даже записывая в микросхему напрямую, в обход библиотечных функций, команды, прямо указывающие отобразить десятичные точки, я не получал нужного мне результата. Так, что вывод простой — полноценной функциональности от связки модуля с приложенной библиотекой вы не добьетесь.»

    Так ведь продавец указывает, что под десятичными точками физически отсутствуют светодиоды. Так что либа в порядке. А вот в индикаторах на бОльшее кол-во цифр (без двойной точки) они присутствуют.

    • admin говорит:

      Подтверждаю! Библиотека в полном порядке. На момент продажи этих модулей мне информации об отсутствии светодиодов не было. Продавец ничего не ответил разумного на мои вопросы, но… О, чудо! Не далее как вчера у него появилась еще одна разновидность этих модулей — с ДЕСЯТИЧНЫМИ ТОЧКАМИ!!!! Но без двойной точки посередине. Теперь продается как старая разновидность, так и новая. Самодовольно надеюсь, что к выпуску новых модулей и я приложил руку, аргументировано критикуя RobotDyne. 😉

      • Сергей говорит:

        Занятно, покупал у этого же продавца, но с десятичными точками на 4 сегмента (и без двоеточия) не было. Зато мне пришел индикатор (4 сегмента) на котором зажигается и двоеточие и десятичные! Мечта прям! ))
        Так что да здравствует критика!

        P.S. Осталось разобраться как прикрутить библиотеку к Rasperry. Сейчас удалось найти рабочий пример на немецком сайте — буду отталкиваться от него.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *