Управление семисегментным индикатором через ТМ1637.

2016-04-06_23-31-157segs
В этой короткой статье я поясню как именно микросхема TM1637 управляет семисегментным индикатором. Управление происходит путем записи в регистры ТМ1637 однобайтовых слов. Каждый регистр отвечает за отображение одного знака, состоящего из семи сегментов ABCDEF и десятичной точки dp — итого 8 сегментов, как раз по числу битов в байте. Зажигает нужный нам сегмент установленный в «1» разряд байта. Сегменту А соответствует самый младший разряд, десятичной точке dp — самый старший.
2016-04-14_22-03-31

Таким образом, записывая байты в соответствующие регистры можно управлять каждым сегментом в отдельности. Запишем в регистр знакоместа байт 00000110 — он зажжет сегменты В и С, которые образуют знак «1», запишем 00000111 — включатся сегменты А, В и С, образуя цифру «7».  Если же отправить 01100011, то загорятся сегменты A, B, F и G, образуя маленький нолик, который можно использовать как значок градусов Цельсия при отображении температуры.Пример программы в прилагаемом файле, а на видео — пример работы этой программы.

Управление TM1637. AVR (Си)

2016-04-06_23-31-15TM1637Краткое содержание предыдущей серии: купил модули, очень красивые, вроде работают, а вроде и не очень. К Ардуине вроде как прикручиваются, но не совсем. То ли библиотека не очень подходящая, то ли модули недоработанные. Написал продавцу, так мол и так, или не работает ваше добро как надо или библиотеку пришлите нормальную. Писал, как надо, на английском, мозг аж вспотел, а продавец возьми да и ответь на русском, типа: «всё нормально, дядя, модули исправные, зуб даю, а вот библиотеки у нас нет…».
Ладно, думаю, разберемся… Взял и напрямую прозвонил выводы — пожалуй, продавец был не прав — похоже, что на индикаторе просто нет светодиодов в десятичных точках. Ну да и ладно — первый блин комом, если эти модули нужны для индикации целых чисел, то не пугайтесь — покупайте. А вот если нужно отображать, что-то с плавающей точкой, то увы — ничего не выйдет.Итак, как я уже говорил, библиотеки для микроконтроллеров AVR в среде AtmelStudio я не нашел, а потому был вынужден переписать ардуиновскую. Для этого надо было переписать с C++ на Си полиморфную функцию Display, которая занимается отображением как единичных разрядов, так и всех четырех, а также выводит на дисплей целые и дробные (ха-ха, три раза) числа.

Библиотеку переписывать в полном объеме я не стал, а реализовал лишь служебные функции, а также несколько публичных функций — Display(), осуществляющих вывод знаков на экран. Дисплей применялся мной для отображения текущей скорости вращения двигателей двухколесного шасси для робота. Особенностью этого шасси является то, что ровно оно не едет из-за того, что колеса имеют разные угловые скорости. Для того, чтобы заставить ездить её ровно, я решил управлять с помощью ШИМ (широтно-импульсной модуляции) скоростью вращения каждого колеса. Установленный на машинку дисплейчик в левых двух символах показывает скорость левого колеса, а правые два символа — скорость правого.

Общение с ТМ637 происходит по протоколу I2C. В библиотеке он реализован программно, тоже самое я сделал и для себя. Это нужно для того, чтобы цеплять дисплей на любые выводы контроллера, так как аппаратная поддержка данного протокола в микроконтроллерe Atmega8 поддерживается только на двух пинах — SDA и SCL. Использовать мой перевод библиотеки можно путем копирования из файла описанных ниже функций:

//СЛУЖЕБНЫЕ ФУНКЦИИ (секция Private)
void TM1637_writeByte(int8_t wr_data) // служебная функция для общения с дисплеем по протоколу I2C
void TM1637_start(void) // служебная функция для общения с дисплеем по протоколу I2C
void TM1637_stop(void) // служебная функция для общения с дисплеем по протоколу I2C
void TM1637_coding_all(uint8_t DispData[])// служебная функция — шифратор
int8_t TM1637_coding(uint8_t DispData) //служебная функция — шифратор

//ПОЛЕЗНЫЕ ФУНКЦИИ (секция Public)
void TM1637_display_all(uint8_t DispData[]) // полезная функция, пожалуй даже самая полезная. Выводит содержимое массива на индикаторы
void TM1637_display(uint8_t BitAddr,uint8_t DispData) // выводит один знак на указанное место на индикаторе
void TM1637_display_int_decimal(int16_t Decimal) //выводит целое десятичное число
void TM1637_display_float_decimal(double Decimal) // должна выводить десятичное число с плавающей точкой
void TM1637_clearDisplay(void) // чистит дисплей
void TM1637_init(uint8_t DispType,uint8_t Clk, uint8_t Data) // инициализация глобальных переменных: DispType — Тип дисплея как правило равна 1, Clk — номер пина SCL, Data — номер пина SDA. Порт по умолчанию — PORTC, но можете поставить тот, который Вам нужен, кое-что поменяв в коде
void TM1637_set(uint8_t brightness)// ставим яркость от 0 до 7

Собственно, скачать эти функции можно здесь. Там же заодно и пример работы с ними.
На видео как раз и показана работа программы.

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

Управление 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. Пока писалась статья, выяснилось, что я никак не могу заставить отображать этот модуль десятичные точки. Вот это поворот! Пишу это немного забегая вперед, так как я уже полностью перекопал библиотеку и подрихтовал её в соответствии с даташитом. Но даже записывая в микросхему напрямую, в обход библиотечных функций, команды, прямо указывающие отобразить десятичные точки, я не получал нужного мне результата. Так, что вывод простой — полноценной функциональности от связки модуля с приложенной библиотекой вы не добьетесь. Будем копать и стараться исправить.