Официальный сайт компании Arduino по адресу arduino.cc
Корпус от DRS-8300 в Ардуино-проектах
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Коллеги, этот материал для тех, кому попадётся убитый спутниковый ресивер DRS-8300 (он же GS-8300) и захочется использовать его корпус для своих поделок, а также для тех, кому нужен пример подключения микросхемы TM1668 к Ардуино.
Одно время DRS-8300 были весьма популярны, благодаря своей доступности, а сейчас пришло время им отправляться на «утилизацию». Все мои друзья и знакомые используют меня как «предприятие по утилизации отслужившего свой век электронного барахла». Уверен, что у многих коллег по форуму ситуация похожая. Потому решил потратить некоторое время на написание этого материала, в надежде, что он кому-нибудь да пригодится. Да и пример использования TM1668 не помешает, т.к. информации об этой микросхеме в сети не так много.
Итак, достался мне ресивер DRS-8300 во вполне приличном на вид состоянии.

Подумалось, что если выбросить собственно спутниковую начинку (зелёная плата справа), то получим вполне симпатичный корпус, имеющий на борту:
1. шнур «в розетку» с выключателем на задней стороне корпуса;
2. работающий блок питания на 3,3В, 5В и 24В DC (плата слева). Мощность не проверял – электронная нагрузка разобрана и переделывается, но, судя по дросселям и диодам на плате БП, разумная мощность;
3. работающую переднюю панель с экраном на 4 цифры, двоеточием, четырьмя спец. символами по углам (конвертик, нота, символ питания и символ сигнала), а также с четырьмя кнопками и IR-приёмником для дистанционного пульта;
4. динамик (маленькая писклявка, но именно динамик, а не баззер);
5. девятипиновый DSUB на задней стороне корпуса (остальные разъёмы припаяны к плате ресивера и «уйдут» вместе с нею).
Ну, и, разумеется, мысль: а почему бы не сделать что-то своё в этом корпусе? Но для этого нужно понять как работать с блоком питания и передней панелью.
С блоком проблем нет, на его плате просто подписаны пины разъёма. А вот с передней панелью … вот собственно про это и статья.
Итак, вскрытие показало, что на плате передней панели находится семисегментный индикатор с общим катодом, четыре тактовые кнопки, микросхема TM1668 для управления всем этим добром и, наконец, IR-приёмник.
От передней панели к основной плате идёт 7-пиновый шлейф, оканчивающийся разъёмом JST-EH (мама). Если взять шлейф в руку отверстиями вверх и синей стороной шлейфа к себе,

то распиновка на нём такая (слева направо):
1 |
GND |
|
2 |
3,3V |
Неясно для чего. На плате панели этот пин никуда не подсоединён. Наверное, заготовка под другие модели передней панели. |
3 |
CLK |
Напрямую к пину CLK микросхемы TM1668 |
4 |
DIO |
В принципе к пину DIO микросхемы TM1668, но через защитную схему на полевом транзисторе, призванную не допустить большого тока, если вдруг пин TM1668 и пин МК, к которому это подключено оба окажутся в состоянии OUTPUT, причём один в HIGH, а другой в LOW. Такое возможно в силу логики работы TM1668 (см. ниже) |
5 |
STB |
Напрямую к пину STB микросхемы TM1668 |
6 |
IR‑OUT |
К пину OUT инфракрасного приёмника через резистор в 100 ом. Также этот пин притянут к питанию. |
7 |
5V |
|
Проще всего работать с инфракрасным приёмником. Подходит библиотека IRremote и практически любой 38 кГц пульт стандарта NEC, например, вот этот, а также все пульты от чего угодно, какие я смог найти у себя дома – коды, конечно, у всех разные, но работают все.
Кнопки же и экран управляются TM1668. Я не буду переписывать здесь весь даташит, отмечу только самые важные моменты.
Микросхема соединяется с МК по трём проводам: CLK, DIO и STB, и поддерживает до 20 (2х10) кнопок и до 70 (7х10) светодиодов с общим чем угодно. STB играет роль «Chip Select».
Вывод на TM1668 осуществляется последовательным интерфейсом, очень похожим на SPI. Всё пересылается младшим битом вперёд (LSBFIRST). Биты считываются на переднем фронте. Собственно SPI нормально работает, если дать ему правильный делитель, т.к. микросхема довольно медленная – импульс часов должен быть не короче 400 наносекунд (это важно, для тех, кто захочет ускорить мой код или использовать SPI – не забывайте!)
К сожалению, ввод информации о нажатых кнопках с SPI не совместим. Он осуществляется по тому же проводу DIO. Нужно передать команду на ввод информации о кнопках, затем переключить DIO на INUP_PULLUP (подтяжка обязательна!!!) и читать информацию также LSBFIRST, но на заднем фронте.
Как видите, здесь возможна ситуация, о которой говорилось выше, при описании подключения пина DIO – с обеих сторон может оказаться OUTPUT, причём в разных состояниях. Для защиты от такой неприятности и сделана схема защиты на полевом транзисторе на плате панели.
Всего на микросхему можно вывести до 14 байтов (7 пар по два байта, в каждых 2-ух байтах использутся 10 бит для 10-сегментного индикатора). Ввести можно до 5 байтов. В устройстве DRS-8300 распаяны не все выводы TM1668, потому я ввожу и вывожу меньшее количество информации в примере, который приведён в конце.
Подключения кнопок и сегментов светодиодного индикатора к ногам TM1668 в принципе можно вызвонить на плате, но я не парился, а просто вычислил их программно (читал и смотрел, что прочитается и, наоборот, подавал и смотрел, что загорается).
В итоге, родился вот такой проверочный скетч. Прошу не искать в нём никакого смысла – ничего разумного он не делает, просто проверяет, что всё работает, всё ли понято правильно.
Подключение к пинам ардуино:
CLK - 13
DIO - 11
STB - 10
IR - 7
Здесь нет никакой «специализации», можно подключаться к любым другим пинам. Распиновка указана в define в начале скетча.
Скетч при запуске пишет на экране слово «ПОПА», держит его 5 секунд, затем начинает отсчёт секунд. При этом двоеточие гаснет и зажигается раз в полсекунды.
Кнопки (слева направо): 1-ая – уменьшение яркости, вплоть до выключения экрана; 2-ая – увеличение яркости; 3-я – переключение дополнительных символов экрана по кругу; и 4-ая – сброс отсчёта времени в 0.
Наконец, при поступлении команды с дистанционного пульта (любой) выполняется тест экрана – ненадолго зажигаются ВСЕ светодиоды, какие есть, затем экран восстанавливается.
Скетч написан по-быстрому, на коленке и далёк от «образца для подражания», но он даёт пример работы с передней панелью DRS-8300 (особенно с микросхемой TM1668) и, надеюсь, кому-нибудь пригодится.
#include <IRremote.h> // // Подключение пинов // разъём отверстиями кверху и синей стороной шлейфа к себе, тогда рсапиновка: // GND 3,3V CLK DIO STB OUT-IR 5V // #define PIN_CLK 13 #define PIN_DIO 11 #define PIN_STB 10 #define PIN_IR 7 ///////////////////////////////////////////////////////////// ///////////// ТИПА "библиотека" ДЛЯ TM1668 //////////// ///////////////////////////////////////////////////////////// // // при том подключении, что есть // достаточно 10 байтов на светодиоды и 2 на кнопки // #define LED_DATA_LENGTH 10 #define KEY_DATA_LENGTH 2 // // Маски нажатых кнопок (слева направо) // #define KEY_1 0x0800 #define KEY_2 0x0100 #define KEY_3 0x0008 #define KEY_4 0x0001 // // Подключено 5 "цифр". // 0-ая - это двоеточие, залействовано только два младших бита // 1-4 - собственно цифры слева направо. // В цифрах задействовано 7 битов под сегменты (с 0-го по 6-ой) // и 7-ой бит под доплнительный символ (питание, конверт и т.п.) // #define SEG_A 0x01 // цифры с 1 по 4 #define SEG_B 0x02 // цифры с 1 по 4 #define SEG_C 0x04 // цифры с 1 по 4 #define SEG_D 0x08 // цифры с 1 по 4 #define SEG_E 0x10 // цифры с 1 по 4 #define SEG_F 0x20 // цифры с 1 по 4 #define SEG_G 0x40 // цифры с 1 по 4 #define SEG_H 0x80 // Дополнительный символ ( // цифры с 1 по 4) #define SEG_ENVELOP SEG_H // только 1-ая цифра #define SEG_ANTENNA SEG_H // только 2-ая цифра #define SEG_POWER SEG_H // только 3-я цифра #define SEG_MUSIC SEG_H // только 4-ая цифра #define SEG_UDOT 0x01 // Верхняя точка двоеточия (только 0-ая цифра) #define SEG_LDOT 0x02 // Нижняя точка двоеточия (только 0-ая цифра) #define SYMBOL_COLON (SEG_UDOT | SEG_LDOT) // Двоеточие (только 0-ая цифра) // // Символы (цифры / буквы, можно ещё добавить всяких) // #define SYMBOL_0 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F) #define SYMBOL_1 (SEG_B | SEG_C) #define SYMBOL_2 (SEG_A | SEG_B | SEG_D | SEG_E | SEG_G) #define SYMBOL_3 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_G) #define SYMBOL_4 (SEG_B | SEG_C | SEG_F | SEG_G) #define SYMBOL_5 (SEG_A | SEG_C | SEG_D | SEG_F | SEG_G) #define SYMBOL_6 (SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G) #define SYMBOL_7 (SEG_A | SEG_B | SEG_C) #define SYMBOL_8 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G) #define SYMBOL_9 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G) #define SYMBOL_MINUS (SEG_G) #define SYMBOL_A (SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G) #define SYMBOL_C (SEG_A | SEG_E | SEG_F | SEG_D) #define SYMBOL_E (SEG_A | SEG_D | SEG_E | SEG_F | SEG_G) #define SYMBOL_H (SEG_B | SEG_C | SEG_E | SEG_F | SEG_G) #define SYMBOL_P (SEG_A | SEG_B | SEG_E | SEG_F | SEG_G) #define SYMBOL_G (SEG_A | SEG_E | SEG_F) #define SYMBOL_L (SEG_D | SEG_E | SEG_F) #define SYMBOL_F (SEG_A | SEG_E | SEG_F | SEG_G) #define SYMBOL_d (SEG_B | SEG_C | SEG_D | SEG_E | SEG_G) #define SYMBOL_b (SEG_C | SEG_D | SEG_E | SEG_F | SEG_G) #define SYMBOL_rP (SEG_A | SEG_B | SEG_C | SEG_E | SEG_F) // // Глобальные переменные // static uint16_t ledGRID[LED_DATA_LENGTH / 2]; // текущее состояние экрана static uint8_t currentBrightness = 1; // текущая яркость static uint8_t digits[] = { SYMBOL_0, SYMBOL_1, SYMBOL_2, SYMBOL_3, SYMBOL_4, SYMBOL_5, SYMBOL_6, SYMBOL_7, SYMBOL_8, SYMBOL_9 }; // static uint16_t saveGRID[LED_DATA_LENGTH / 2]; // нужно для сохранения состояния экрана на время теста static uint8_t saveBrightness; // нужно для сохранения яркости на время теста // static IRrecv irrecv(PIN_IR); // // Запись одиночной команды в TM1668 // void writeSingleCommand(const uint8_t command) { digitalWrite(PIN_STB, LOW); shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, command); digitalWrite(PIN_STB, HIGH); delayMicroseconds(1); // Пауза до следующей команды } // // Запись состояния дисплея в TM1668 // void updateDisplay(void) { writeSingleCommand(0x40); // запись данных, автоматический адрес digitalWrite(PIN_STB, LOW); shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0xC0); // Установка адреса в 0 uint8_t * p = (uint8_t *) ledGRID; for (int8_t i = 0; i < LED_DATA_LENGTH; i++, p++) shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, *p); // запись данных digitalWrite(PIN_STB, HIGH); delayMicroseconds(1); // Пауза до следующей команды } // // Чтение состояния кнопок с TM1668 // void readKeyData(uint16_t * data) { digitalWrite(PIN_STB, LOW); shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, 0x42); // чтение данных pinMode(PIN_DIO, INPUT_PULLUP); delayMicroseconds(1); * data = shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) + (shiftIn(PIN_DIO, PIN_CLK, LSBFIRST) << 8); pinMode(PIN_DIO, OUTPUT); digitalWrite(PIN_STB, HIGH); } // // Установить яркость от 0 (выключено) до 8 // (возвращает старую яркость) // static inline uint8_t setBrightness(const uint8_t newBrighness) { const uint8_t res = currentBrightness; currentBrightness = (newBrighness > 8) ? 8 : newBrighness; if (currentBrightness == 0) writeSingleCommand(0x80); // Выключить дисплей else writeSingleCommand(0x88 + (currentBrightness - 1)); // Установить яркость return res; } // // Увеличить яркость на 1 (возвращает старую яркость) // static inline uint8_t increaseBrightness(void) { const uint8_t res = currentBrightness; if (currentBrightness < 8) setBrightness(currentBrightness + 1); return res; } // // Уменьшить яркость на 1 (возвращает старую яркость) // static inline uint8_t decreaseBrightness(void) { const uint8_t res = currentBrightness; if (currentBrightness > 0) setBrightness(currentBrightness - 1); return res; } // // Показать тест экрана // (все символы включены на максимальной яркости) // void showTest(void) { memcpy(saveGRID, ledGRID, sizeof(saveGRID)); ledGRID[0] = 3; ledGRID[1] = 0xFF; ledGRID[2] = 0xFF; ledGRID[3] = 0xFF; ledGRID[4] = 0xFF; updateDisplay(); saveBrightness = setBrightness(8); } // // Восстановить экран после теста // void hideTest(void) { memcpy(ledGRID, saveGRID, sizeof(saveGRID)); updateDisplay(); setBrightness(saveBrightness); } // // Показать/скрыть/инвертировать дополнительный символ на цифре n // Одополнительные символы по цифрам: // 1-ая - конверт // 2-ая - сигнал (антенна), а может громоксть? // 3-я - значок питания // 4-ая - нота (типа музыка) // static inline void showExtraSymbol(const int8_t n) { ledGRID[n] |= SEG_H; } static inline void hideExtraSymbol(const int8_t n) { ledGRID[n] &= ~SEG_H; } static inline void invertExtraSymbol(const int8_t n) { ledGRID[n] ^= SEG_H; } // // Показать/скрыть/инвертировать конверт // static inline void showEnvelope(void) { showExtraSymbol(1); } static inline void hideEnvelope(void) { hideExtraSymbol(1); } static inline void invertEnvelope(void) { invertExtraSymbol(1); } // // Показать/скрыть/инвертировать антенну // static inline void showAntenna(void) { showExtraSymbol(2); } static inline void hideAntenna(void) { hideExtraSymbol(2); } static inline void invertAntenna(void) { invertExtraSymbol(2); } // // Показать/скрыть/инвертировать символ питания // static inline void showPower(void) { showExtraSymbol(3); } static inline void hidePower(void) { hideExtraSymbol(3); } static inline void invertPower(void) { invertExtraSymbol(3); } // // Показать/скрыть/инвертировать ноту // static inline void showMusic(void) { showExtraSymbol(4); } static inline void hideMusic(void) { hideExtraSymbol(4); } static inline void invertMusic(void) { invertExtraSymbol(4); } // // Показать/скрыть/инвертировать верхнюю точку двоеточия // static inline void showUpperDot(void) { ledGRID[0] |= SEG_UDOT; } static inline void hideUpperDot(void) { ledGRID[0] &= ~SEG_UDOT; } static inline void invertUpperDot(void) { ledGRID[0] ^= SEG_UDOT; } // // Показать/скрыть/инвертировать нижнюю точку двоеточия // static inline void showLowerDot(void) { ledGRID[0] |= SEG_LDOT; } static inline void hideLowerDot(void) { ledGRID[0] &= ~SEG_LDOT; } static inline void invertLowerDot(void) { ledGRID[0] ^= SEG_LDOT; } // // Показать/скрыть/инвертировать двоеточие // static inline void showColon(void) { ledGRID[0] |= SYMBOL_COLON; } static inline void hideColon(void) { ledGRID[0] &= ~SYMBOL_COLON; } static inline void invertColon(void) { ledGRID[0] ^= SYMBOL_COLON; } // // Показать цифру value (0-9) в позиции digit (1-4) // при этом, если у цифры горит дополнительный символ, сохраняем его // static inline void setDigit(const int8_t digit, const uint8_t value) { if (digit < 1 || digit > 4) return; // цифры у нас с 1-ой по 4-ую слева направо ledGRID[digit] = value | (ledGRID[digit] & SEG_H); // не обижать дополнительный символ, если есть } // // Показать число m в двух правых цифрах (типа минуты или там секунды) // static inline void showMinutes(const int8_t m) { setDigit(4, digits[m % 10]); setDigit(3, digits[m / 10]); } // // Показать число h в двух левых цифрах (типа часы или там минуты) // static inline void showHours(const int8_t h) { setDigit(2, digits[h % 10]); setDigit(1, digits[h / 10]); } // // Показать и часы, и минуты // static inline void showClock(const int8_t h, const int8_t m) { showHours(h); showMinutes(m); } ///////////////////////////////////////////////////////////// //////////// КОНЕЦ "библиотеки" ДЛЯ TM1668 //////////// ///////////////////////////////////////////////////////////// void setup(void) { // // Инициализация пинов pinMode(PIN_CLK, OUTPUT); pinMode(PIN_DIO, OUTPUT); pinMode(PIN_STB, OUTPUT); pinMode(PIN_IR, INPUT); digitalWrite(PIN_STB, HIGH); digitalWrite(PIN_CLK, HIGH); // // Инициализация экрана writeSingleCommand(0x03); // Режим отображения (1 и 2 - ничего не меняется) setBrightness(currentBrightness); // // Пишем на экране слово ПОПА setDigit(1, SYMBOL_rP); setDigit(2, SYMBOL_0); setDigit(3, SYMBOL_rP); setDigit(4, SYMBOL_A); updateDisplay(); // // Даём 5 секунд полюбоваться delay(5000); // // Рисуем нулевое время showClock(0, 0); showColon(); updateDisplay(); // // Приступаем к слушанию "эфира" irrecv.enableIRIn(); // Слушаем пульт } // // Функция обработки кнопки №3 // Гасит текущий доп. символ и зажигает следующий // static void swicthExtraSymbol(void) { static int8_t extraSymbol = 0; if (extraSymbol) ledGRID[extraSymbol] &= ~SEG_H; extraSymbol = (extraSymbol + 1) % 5; if (extraSymbol) ledGRID[extraSymbol] |= SEG_H; } void loop(void) { static int8_t m = 0, s = 0; // минуты и секунды для показа static uint32_t oldMillis = 0; // запомненное состояние счётчика миллисекунд static bool alreadyBlinked = false; // флаг. Если true, то на этой секунде двоеточием уже мигали bool haveToUpdate = false; // Если true, то в конце нужно обновить экран const uint32_t currMillis = millis(); const uint32_t diffMillis = currMillis - oldMillis; // // Двоеточием мигаем вдвое чаще, чем меняются цифры // if (! alreadyBlinked && diffMillis >= 500) { invertColon(); haveToUpdate = true; alreadyBlinked = true; } // // Пришла пора сменить цифру // if (diffMillis >= 1000) { s++; if (s == 60) { s = 0; m = (m + 1) % 60; } showClock(m, s); invertColon(); haveToUpdate = true; alreadyBlinked = false; oldMillis = currMillis; } // // Читаем состояние кнопок // и отрабатываем команды // static uint16_t keys = 0; uint16_t newKeys; readKeyData(& newKeys); if (keys != newKeys) { keys = newKeys; if (keys & KEY_1) { // уменьшить яркость decreaseBrightness(); } if (keys & KEY_2) { // увеличить яркость increaseBrightness(); } if (keys & KEY_3) { // включить следующий доп. символ swicthExtraSymbol(); haveToUpdate = true; } if (keys & KEY_4) { // сбросить время в 0 m = 0; s = 0; showClock(m, s); haveToUpdate = true; oldMillis = currMillis; } } // // Если пришла команда с пульта (любая, кроме символа повтора), // Показываем тест экрана // decode_results results; if (irrecv.decode(&results)) { if (results.value != 0xFFFFFFFFUL) { showTest(); delay(1000); hideTest(); } irrecv.resume(); } if (haveToUpdate) updateDisplay(); // Обновляем экран, если нужно } ///// Всё! Веселье закончилось!
Вот, как всё это работает:
Нанка, лежит на месте спутниковой платы, кушает вкусные 5 вольт от местного блока питания
и выводит слово ПОПА на переднюю панель
Хватит про ПОПУ, пошёл отсчёт секунд

Тест экрана - горят все светодиода, какие есть
Ну, вот, теперь у меня есть хороший корпус с питанием, передней панелью – можно для чего-нибудь приспособить!
Могу ошибаться, но вроде TM1668 - это тоже самое, что и HT1668, а также MC2102.
Вот молодец! Пойду поковырять свою DRE-5000.
Нанка, лежит на месте спутниковой платы, кушает вкусные 5 вольт от местного блока питания
и выводит слово ПОПА на переднюю панель
Нано должна выводить только " НАНО" и ничего другого ;)
Значит, неправильная нанка попалась, не той ориентации :(
Добрый день. Отличнаяработа! Единственное из всего, что нашел, что заставило запуститься мою панельку, огромное вам спасибо за ваш труд и за то, что поделились им с "нуждающимися"))) Но у меня есть один мааааленький проблем и огромная просьба, ели вас не затруднит конечно... В общем у меня практически всё работает, кроме двоеточия, которое должно мигать, оно мигает на месте последней цифры, в правом верхнем углу)))) Образуя так сказать букву Г наоборот.. То есть мигают два угловых сигмента самый правый верхний и верхний справа... Я только начинаю вникать во все тонкости данного дела и мне совершенно не в домек, чего и как творить... не могли бы вы меня выручить? Буду вам очень признателен за помощь! С уважением Алексей.
1. А на тесте экрана горит правильное двоеточие?
2. У Вас такая же панелька?
3. Программу мою запускаете?
Нет, двоеточие работает только на нажатие кнопки и три раза меняет яркость, потом гаснет и снова по той же схеме, ярче, ярче, ярче, потухло)
Панелька у меня аналогичная, но не такая... Семь кнопок, четыре индикатора, на кажном индикаторе еще есть точка внизу, после сигментов, на третьем сигменте, еще и сверху точка после сигмента, и собрана на микросхеме HT 1628 B... Так же на панельке два светодиода красный и зеленый и ИК приемник.
Программа только ваша и подошла! За что спасибо огромное!
Но если вы выручите и поможете доработать код под мою панельку, будет просто супер!....
Заранее премного благодарен!
Ещё, если это конечно поможет, есть обозначение 10. 1030-00С
И такое S-N60-57DB.4 2010/09/16
Двоеточие зажигается кстати на третьей кнопке(по расположению ваших), если это важно конечно.
Отсчет кнопок у меня начинается с моей четвертой кнопки, ваша первая. То есть на моей четвертой уменьшение яркости, на пятой увеличение, на шестой двоеточие, работает, как я писал. На седьмой сброс.
Весь алгоритм программы работает как надо. Пишет слово ПОП и работает отсчет)) И мигает двоеточие, жаль не там где нужно)
28-ую я тоже мучал в другой теме. Кстати, Вы её полный даташит видели?
Проблема определения где находится символ - это по сути проблема "понять куда его распаяли на плате". Т.е. надо просто включать знаки по одному и смотреть когда она загорится. А когда загорится вставить в программу правильные константы. Мы это проделаем.
Давай делать это по шагам. Для начала запустите код из #44 (номера пинов с втрока 6-8 свои поставьте) и скажите, всё ли там нормально, всё ли светится и меняется ли яркость.
Даташит честно скажу не видел... Через минут 15, буду пробовать.
Светится все, кроме зеленого светодиода, точек про которые я вам писал и не реагирует на кнопки.
В общем все цифры светятся и двоеточие, еще красный светодиод))
Да еще прочитал, про изменение яркости, постави8, засветилось ярко, 0, без изменений и вообще на изменение цифр не влияет больше, горит на максимальной яркости.
Виноват, просто при загрузке другого скетча, индикатор зависает) Перезагрузка платы, меняет положение дел и яркость меняется, так что в этом планевсе ОК!))
Светится все, кроме зеленого светодиода, точек про которые я вам писал и не реагирует на кнопки.
В общем все цифры светятся и двоеточие, еще красный светодиод))
Стоп, я ничего не понял. На кнопки реаигровать и не должно.
Семь кнопок, четыре индикатора, на кажном индикаторе еще есть точка внизу, после сигментов, на третьем сигменте, еще и сверху точка после сигмента, так же на панельке два светодиода красный и зеленый и ИК приемник.
Ни чего не изменилось.
Собственно говоря, хрен бы с ними, этими точками, если это геморой лишний)) Я просто описывал, думал может так будет понятнее, что за панелька)
фото я бы с радостью, но оно не хочет грузится((
на всякий случай по пунктам)
1. Семь кнопок.
2. четыре индикатора
3. на кажном индикаторе еще есть точка внизу, после сигментов
4. на третьем сигменте, еще и сверху точка после сигмента
5. два светодиода красный и зеленый
6. ИК приемник.
Победил, в самом низком качестве смог загрузить)
Тогда пробуем так. В строке 76 (всё того же кода из поста 44), вместо INIT_6x12 поставьте INIT_7x11.
Вообще, эта программа должна реально зажечь всё, что подключено к микросхеме и этого надо добиться.
Если звгорится всё, пойдём дальше, если нет, смотрите на плату и глазами, и мультиметром (например, убедитесь что зелёный светодиод соединяется с микросхемой и скажите с каким пином). А то может он расаян как-то сам по себе, а мы микросхему мучаем.
Поменял, все осталось без изменений...
Если точка сверху, то по правой стороне микрухи 11 пин, сверху вниз)
А зелёный светодиод?
Это я о зеленом и написал))
А красный по тем же координатам, но на 8 ноге микросхемы.
Если точка сверху, то по правой стороне микрухи 11 пин, сверху вниз)
Давайте, Вы будете говорить "официальные" номера пинов по даташиту. Насколько я понимаю, Вы говорите о 18-ом пине. Если так, то это GRID7 - т.е. общий пин для кучи светодиодов. Куда идёт вторая нога светодиода?
Извините, Даташита у меня на микросхему нет..
Вторая идет на минус, от обоих светодиодов.
Извините, Даташита у меня на микросхему нет..
Не извиню, так как он у Вас есть, я его Вам лично давал в посте #9.
На какой минус? На GND что ли? Вы не ошиблись? Это как-то неправильно, так не должно быть. Перепроверьте мульлтиметро и скажите точно куда подключены оба светодиода.
Виноват, я как то упустил этот момент((
Зеленый светодиод одна нога минус, вторая SEG12/GRID7
Красный я так понял, что просто на включение питания. Одна нога минус, вторая через резистор на VDD
Ну, вот смотрите. Если Вы написали, как я просил "в строке 76 (всё того же кода из поста 44), вместо INIT_6x12 поставьте INIT_7x1", то по идее он должен сетиться.
Ну, давайте ещё раз
1. В строке 17 вемсто 0xf0ff ставим 0xffff
2. В строке 76 вместо INIT_6x12 поставьте INIT_7x1
Если светодиод по-прежнему не горит, попробуйте вместн 0xffff поставить 0x0000 - не верю, но вдруг загорится светодиод (а всё остальное погаснет). Попробуйте.
Расскажите, что получилось.
Если поставить 7х1, то просто ошибку компиляции выдает, если 7х11, то без изменений...
0x0000 ставил, действительно все потухло, но светодиод не загорелся((
Чего еще сотворить сенсей))
Да, 7x1 - опечатка.
Так, ну, прежде, чем делать выводы и начинать искать двоеточие, скажите. Точки возле цифр (внизу и и одну вверху) Вы когда-нибудь светящимися видели?
Двоеточие есть, его не нужно искать уже)
Врать не буду у меня этот агрегат давно уже не в работе, но насколько я помню, вроде бы как, когда то, что то горело, но это не точно))
Понимаете, что меня смущает.
Всего в этой микросхеме возможны 14 байтов памяти (стр. 5 даташита). Мы задействовали их все - все 14. Значит, должно светиться все, что может. И если что-то не светится, значит оно не может. Перегорело или никогда не было распаяно.
Теперь про двоеточие, т.е. Вы знаете как его включать? Раньше Вы говорили, что оно неправильно включается.
Я давно использую DVB-T2 ресиверы как доноры для свох экспириментов. Волею судеб их у меня скопилось несколько десятков. С нних и началось увлечение Ардуино. Выкинуть рука не поднималась. Из ценного там можно вынутьТМ1650 I2C контроллер 7 сегментного дисплея и 4х7 клавиатуры . Недостаток- отсутствие точек на дисплее - только двоеточие. Неплохой выбор стабилизаторов 1,1 1,8 2,5 3.3 В, SPI флеш память на 32 мегабайта, кварцы на 27 и 16 мгц, куча мелочевки -полевики транзисторы,разъемы. Так что если кому что нужно обращайтесь.
После того, ка загрузил ваш пример из 44 поста, двоеточие загорелось. Я же вам фото скинул, думал обратили вниманеи. Единственное, что не светится, это точки и зеленый светодиод)
Ну и кнопки не контакт.
Погодите, Алексей, Вы не поняли.
Мой пример из поста 44 засвечмвает ВСЁ. Но Если Вы воспользуетесь другим моим примером (с которого Вы начали), то двоеточие у Вас светится в пеправильном месте. Так?
Значит, нам надо найти это чёртово двоеточие и поменять константы в библиотеке, чтобы по команде включить двоеточие, включалось именно двоеточие, а не что попало.
Теперь понятно, что хначит "найти".
В примере, где у меня секунды считаются двоеточие ведь по-прежнему не на месте? Да или нет?
Что касается кномпок, мы к ним вернёмся, давайте дожмём символы.
Да если подойти с этой стороны, вы совершенно правы, двоеточие не там, и последняя цифра отсутствует(((
Если это чем то поможет, я разобрался, в том примере с попой который))) У вас на кнопку заведено переключение символов или светодиодов, так вот при нажатии на эту кнопку три раза, двоеточие загорается, на четвертый гаснет..
Спасибо, буду иметь ввиду, но одна проблемка, я с Приморского края) Если чего, вы отправите мелким пакетом?))
Вы совершенно правы, теперь понятно, что значит нати)) Затупил просто, так сказать маленько))
Без прблем. Доставка за Ваш счет + пиво.
Добрый жень ЕвгенийП. Извините, что беспокою, хотел поинтересоваться, вы моим вопросом не занимались случайно?))
Чем, поиском правильного кода для : ?
Так я не могу этим заниматься, я могу только сказать как это делать, а делать должны Вы на железе, у меня ж его нет.
Вы готовы?
Если готовы, давайте так: сначала сделаем, чтобы нормально работало двоеточие, а потом посмотрим что там с кнопками.
Первый шаг в поиске двоеточия (будет и второй) - возьмите практически тот же скетч. что у Вас высвечивает всё (отсюда берите) и сделайте то, что написано в строках 19-23
Доброго времени суток.
Большое спасибо за проделанную работу, очень хорошая идея использовать для своих разработок корпус и экран от ресивера триколор.
Но есть одна проблема. Почти все ресиверы что я пересмотрел имеют панель с другой микросхемой вот надпись на ней кц746су.
Увы но при подключении ее к ардуинке на экране тишина. Аналог этой микросхемы вроде как вот такой STLED316SMTR. Самое забавное что сам ресивер работает с обеими версиями экранов.
Как вы думает, в чем может быть проблема? Учитываю что из 20 ресиверов только на одном была обнаружена TM1668....
Спасибо.
Ну, если он сам работает, а моя программа нет, остаётся только предположить, что он как-то узнаёт что ему подсунули, по какому-нибудь уровне где-нибудь, или там ещё как. Если бы у меня был такой вариант, я бы во-певрых внимательно изучил бы плату (срисовал бы схему), поискал бы даташит на микросхему и тогда бы думал.
Изучение схемы показало что главное отличие в первой ноге микросхемы. Если в варианте с TM1668 там стоит защита и дальше на третий пин кабеля, то в случае с STLED316SMTR просто напрямую на кабель.
В описании это самой STLED316SMTR первая нога обозначена как DIN/DOUT (Output serial data at falling edge of the shift clock,
starting from lower bit. Input serial data is clocked in at
rising edge of the shift clock, starting from lower bit.)
Я не сильно в этом разбираюсь. Но такая схема использована в целом ряде ресиверов - 8302,8304,8306,8307
Самый вкусный на мой взгляд это 8307, красивый корпус и вкруг кнопки включение стоят две пары свето диодов. Подключенных на туже микросхему
Ну, сравнивайте даташиты и смотрите в чём разнича.
Большое спасибо за материал, помог мне оживить морду от oriel310 на такой же микросхеме, единственное что не осилил это зажечь двухцветный светодиод подключенный на ноги 15(seg9), 16(seg10) и 24(grid1). Пробовал использовать скетчи которые должны зажигать все но зажигается только семисегментник. Прошу помощи разобраться в том какие байты на какие адреса нужно отослать микрухе чтобы все таки зажечь светодиоды.
Порядок семисегментника для работы такой:
(выдержка теста из скетча)
пробовал зажигать другие варианты ledGRID но ничего не работало
Если не помогает вс как у Вас, только
ledGRID[4] = 0xFF;
то, лучше бы посмотреть схему, как он развелён. Он чётырёхногий? Расскажит про вес 4 ноги - куда они распаяны?
ledGRID[4] это только двоеточие, я пробовал отправлять ему 0xFF по существу ничего не меняется, 0x80 это просто эксперименты с тем какой именно адрес зажигает двоеточие, он одним сегментом идет а не как две отдельные точки. Светодиод трехногий с общим анодом на ноге 24(grid1). Подключение ног я написал выше.
Так же пробовал добавлять пункты ledGRID[] с 0xFF вплоть до ledGRID[9], ничего кроме дисплея так же не горело. Вероятно все таки где то проблема в коде, иначе он должен был загореться как и семисегментник я так полагаю.