Корпус от DRS-8300 в Ардуино-проектах

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Коллеги, этот материал для тех, кому попадётся убитый спутниковый ресивер DRS-8300 (он же GS-8300) и захочется использовать его корпус для своих поделок, а также для тех, кому нужен пример подключения микросхемы TM1668 к Ардуино.

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

Итак, достался мне ресивер DRS-8300 во вполне приличном на вид состоянии.


DRS-8300

Подумалось, что если выбросить собственно спутниковую начинку (зелёная плата справа), то получим вполне симпатичный корпус, имеющий на борту:

1. шнур «в розетку» с выключателем на задней стороне корпуса;

2. работающий блок питания  на 3,3В, 5В и 24В DC (плата слева). Мощность не проверял – электронная нагрузка разобрана и переделывается, но, судя по дросселям и диодам на плате БП, разумная мощность;

3. работающую переднюю панель с экраном на 4 цифры, двоеточием, четырьмя спец. символами по углам (конвертик, нота, символ питания и символ сигнала), а также с четырьмя кнопками и IR-приёмником для дистанционного пульта;

4. динамик (маленькая писклявка, но именно динамик, а не баззер);

5. девятипиновый DSUB на задней стороне корпуса (остальные разъёмы припаяны к плате ресивера и «уйдут» вместе с нею).

Ну, и, разумеется, мысль: а почему бы не сделать что-то своё в этом корпусе? Но для этого нужно понять как работать с блоком питания и передней панелью.

С блоком проблем нет, на его плате просто подписаны пины разъёма. А вот с передней панелью … вот собственно про это и статья.

Итак, вскрытие показало, что на плате передней панели находится семисегментный индикатор с общим катодом, четыре тактовые кнопки, микросхема TM1668 для управления всем этим добром и, наконец, IR-приёмник.

От передней панели к основной плате идёт 7-пиновый шлейф, оканчивающийся разъёмом JST-EH (мама). Если взять шлейф в руку отверстиями вверх и синей стороной шлейфа к себе,


Разъём 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 вольт от местного блока питания
и выводит слово ПОПА на переднюю панель


Хватит про ПОПУ, пошёл отсчёт секунд



Тест экрана - горят все светодиода, какие есть

Ну, вот, теперь у меня есть хороший корпус с питанием, передней панелью – можно для чего-нибудь приспособить!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Могу ошибаться, но вроде TM1668 - это тоже самое, что и HT1668, а также MC2102.

fid
Offline
Зарегистрирован: 20.12.2014

Вот молодец! Пойду поковырять свою DRE-5000.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

ЕвгенийП пишет:

Нанка, лежит на месте спутниковой платы, кушает вкусные 5 вольт от местного блока питания
и выводит слово ПОПА на переднюю панель

Нано должна выводить только " НАНО" и ничего другого ;)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Значит, неправильная нанка попалась, не той ориентации :(

Alexej550271
Offline
Зарегистрирован: 03.02.2018

Добрый день. Отличнаяработа! Единственное из всего, что нашел, что заставило запуститься мою панельку, огромное вам спасибо за ваш труд и за то, что поделились им с "нуждающимися"))) Но у меня есть один мааааленький проблем и огромная просьба, ели вас не затруднит конечно... В общем у меня практически всё работает, кроме двоеточия, которое должно мигать, оно мигает на месте последней цифры, в правом верхнем углу)))) Образуя так сказать букву Г наоборот.. То есть мигают два угловых сигмента самый правый верхний и верхний справа... Я только начинаю вникать во все тонкости данного дела и мне совершенно не в домек, чего и как творить... не могли бы вы меня выручить? Буду вам очень признателен за помощь! С уважением Алексей.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1. А на тесте экрана горит правильное двоеточие?

2. У Вас такая же панелька?

3. Программу мою запускаете?

Alexej550271
Offline
Зарегистрирован: 03.02.2018

Нет, двоеточие работает только на нажатие кнопки и три раза меняет яркость, потом гаснет и снова по той же схеме, ярче, ярче, ярче, потухло) 

Панелька у меня аналогичная, но не такая...  Семь кнопок, четыре индикатора, на кажном индикаторе еще есть точка внизу, после сигментов, на третьем сигменте, еще и сверху точка после сигмента, и собрана на микросхеме HT 1628 B... Так же на панельке два светодиода красный и зеленый и ИК приемник.

Программа только ваша и подошла! За что спасибо огромное!

Но если вы выручите и поможете доработать код под мою панельку, будет просто супер!....

Заранее премного благодарен!

 

Alexej550271
Offline
Зарегистрирован: 03.02.2018

Ещё, если это конечно поможет, есть обозначение 10. 1030-00С

И такое S-N60-57DB.4           2010/09/16 

Двоеточие зажигается кстати на третьей кнопке(по расположению ваших), если это важно конечно.

Отсчет кнопок у меня начинается с моей четвертой кнопки, ваша первая. То есть на моей четвертой уменьшение яркости, на пятой увеличение, на шестой двоеточие, работает, как я писал. На седьмой сброс.

Весь алгоритм программы работает как надо. Пишет слово ПОП и работает отсчет)) И мигает двоеточие, жаль не там где нужно)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

28-ую я тоже мучал в другой теме. Кстати, Вы её полный даташит видели?

Проблема определения где находится символ - это по сути проблема "понять куда его распаяли на плате". Т.е. надо просто включать знаки по одному и смотреть когда она загорится. А когда загорится вставить в программу правильные константы. Мы это проделаем.

Давай делать это по шагам. Для начала запустите код из #44 (номера пинов с втрока 6-8 свои поставьте) и скажите, всё ли там нормально, всё ли светится и меняется ли яркость.

Alexej550271
Offline
Зарегистрирован: 03.02.2018

Даташит честно скажу не видел... Через минут 15, буду пробовать.

Alexej550271
Offline
Зарегистрирован: 03.02.2018

Светится все, кроме зеленого светодиода, точек про которые я вам писал и не реагирует на кнопки.

В общем все цифры светятся и двоеточие, еще красный светодиод))

Alexej550271
Offline
Зарегистрирован: 03.02.2018

Да еще прочитал, про изменение яркости, постави8, засветилось ярко, 0, без изменений и вообще на изменение цифр не влияет больше, горит на максимальной яркости.

Alexej550271
Offline
Зарегистрирован: 03.02.2018

Виноват, просто при загрузке другого скетча, индикатор зависает) Перезагрузка платы, меняет положение дел и яркость меняется, так что в этом планевсе ОК!))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Alexej550271 пишет:

Светится все, кроме зеленого светодиода, точек про которые я вам писал и не реагирует на кнопки.

В общем все цифры светятся и двоеточие, еще красный светодиод))

Стоп, я ничего не понял. На кнопки реаигровать и не должно.

Об остальном, давайте по порядку.
 
1. Печислите просто по пунктам, что у Вас там есть. Все светодиоы, сегменты, что там ещё за точки, прямо по пунктам или фото дайте.
2. Потом скажите, что засветилось, а что - нет.
 
Потом, попробуйте в строке 17 заменить 0xf0ff на 0xffff. По идее ничего не должно измениться, но чем чёрт не шутит. Попробуйте и скажите, измнилось что-то или нет.

 

Alexej550271
Offline
Зарегистрирован: 03.02.2018

Семь кнопок, четыре индикатора, на кажном индикаторе еще есть точка внизу, после сигментов, на третьем сигменте, еще и сверху точка после сигмента, так же на панельке два светодиода красный и зеленый и ИК приемник.

Alexej550271
Offline
Зарегистрирован: 03.02.2018

Ни чего не изменилось.

Alexej550271
Offline
Зарегистрирован: 03.02.2018

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

Alexej550271
Offline
Зарегистрирован: 03.02.2018

фото я бы с радостью, но оно не хочет грузится((

Alexej550271
Offline
Зарегистрирован: 03.02.2018

на всякий случай по пунктам)

1. Семь кнопок.

2. четыре индикатора

3. на кажном индикаторе еще есть точка внизу, после сигментов

4. на третьем сигменте, еще и сверху точка после сигмента

5. два светодиода красный и зеленый 

6. ИК приемник.

Alexej550271
Offline
Зарегистрирован: 03.02.2018

Alexej550271
Offline
Зарегистрирован: 03.02.2018

Победил, в самом низком качестве смог загрузить) 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Тогда пробуем так. В строке 76 (всё того же кода из поста 44), вместо INIT_6x12 поставьте INIT_7x11.

Вообще, эта программа должна реально зажечь всё, что подключено к микросхеме и этого надо добиться.

Если звгорится всё, пойдём дальше, если нет, смотрите на плату и глазами, и мультиметром (например, убедитесь что зелёный светодиод соединяется с микросхемой и скажите с каким пином). А то может он расаян как-то сам по себе, а мы микросхему мучаем.

Alexej550271
Offline
Зарегистрирован: 03.02.2018

Поменял, все осталось без изменений...

Если точка сверху, то по правой стороне микрухи 11 пин, сверху вниз)

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А зелёный светодиод?

Alexej550271
Offline
Зарегистрирован: 03.02.2018

Это я о зеленом и написал))

А красный по тем же координатам, но на 8 ноге микросхемы.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Alexej550271 пишет:

Если точка сверху, то по правой стороне микрухи 11 пин, сверху вниз)

Давайте, Вы будете говорить "официальные" номера пинов по даташиту. Насколько я понимаю, Вы говорите о 18-ом пине. Если так, то это GRID7 - т.е. общий пин для кучи светодиодов. Куда идёт вторая нога светодиода?

Alexej550271
Offline
Зарегистрирован: 03.02.2018

Извините, Даташита у меня на микросхему нет.. 

Вторая идет на минус, от обоих светодиодов.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Alexej550271 пишет:

Извините, Даташита у меня на микросхему нет.. 

Не извиню, так как он у Вас есть, я его Вам лично давал в посте #9.

На какой минус? На GND что ли? Вы не ошиблись? Это как-то неправильно, так не должно быть. Перепроверьте мульлтиметро и скажите точно куда подключены оба светодиода.

Alexej550271
Offline
Зарегистрирован: 03.02.2018

Виноват, я как то упустил этот момент((

Зеленый светодиод одна нога минус, вторая SEG12/GRID7

Красный я так понял, что просто на включение питания. Одна нога минус, вторая через резистор на VDD

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, вот смотрите. Если Вы написали, как я просил "в строке 76 (всё того же кода из поста 44), вместо INIT_6x12 поставьте INIT_7x1", то по идее он должен сетиться.

Ну, давайте ещё раз 

1. В строке 17 вемсто 0xf0ff ставим 0xffff
2. В строке 76  вместо INIT_6x12 поставьте INIT_7x1

Если светодиод по-прежнему не горит, попробуйте вместн 0xffff поставить 0x0000 - не верю, но вдруг загорится светодиод (а всё остальное погаснет). Попробуйте.

Расскажите, что получилось.

Alexej550271
Offline
Зарегистрирован: 03.02.2018

Если поставить 7х1, то просто ошибку компиляции выдает, если 7х11, то без изменений...

0x0000 ставил, действительно все потухло, но светодиод не загорелся(( 

Чего еще сотворить сенсей))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, 7x1 - опечатка.

Так, ну, прежде, чем делать выводы и начинать искать двоеточие, скажите. Точки возле цифр (внизу и и одну вверху) Вы когда-нибудь светящимися видели?

Alexej550271
Offline
Зарегистрирован: 03.02.2018

Двоеточие есть, его не нужно искать уже)

Врать не буду у меня этот агрегат давно уже не в работе, но насколько я помню, вроде бы как, когда то, что то горело, но это не точно))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Понимаете, что меня смущает.

Всего в этой микросхеме возможны 14 байтов памяти (стр. 5 даташита). Мы задействовали их все - все 14. Значит, должно светиться все, что может. И если что-то не светится, значит оно не может. Перегорело или никогда не было распаяно.

Теперь про двоеточие, т.е. Вы знаете как его включать? Раньше Вы говорили, что оно неправильно включается.

svm
Offline
Зарегистрирован: 06.11.2016

Я давно использую DVB-T2 ресиверы как доноры для свох экспириментов. Волею судеб их у меня скопилось несколько десятков. С нних и началось увлечение Ардуино. Выкинуть рука не поднималась. Из ценного там можно вынутьТМ1650 I2C контроллер 7 сегментного дисплея и 4х7  клавиатуры  . Недостаток- отсутствие точек на дисплее - только двоеточие. Неплохой выбор стабилизаторов 1,1 1,8  2,5 3.3 В, SPI флеш память на 32 мегабайта, кварцы на 27 и 16 мгц, куча мелочевки -полевики транзисторы,разъемы. Так что если кому что нужно обращайтесь.

Alexej550271
Offline
Зарегистрирован: 03.02.2018

После того, ка загрузил ваш пример из 44 поста, двоеточие загорелось. Я же вам фото скинул, думал обратили вниманеи. Единственное, что не светится, это точки и зеленый светодиод)

Ну и кнопки не контакт.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Погодите, Алексей, Вы не поняли.

Мой пример из поста 44 засвечмвает ВСЁ. Но Если Вы воспользуетесь другим моим примером (с которого Вы начали), то двоеточие у Вас светится в пеправильном месте. Так?

Значит, нам надо найти это чёртово двоеточие и поменять константы в библиотеке, чтобы по команде включить двоеточие, включалось именно двоеточие, а не что попало.

Теперь понятно, что хначит "найти".

В примере, где у меня секунды считаются двоеточие ведь по-прежнему не на месте? Да или нет?

Что касается кномпок, мы к ним вернёмся, давайте дожмём символы.

Alexej550271
Offline
Зарегистрирован: 03.02.2018

Да если подойти с этой стороны, вы совершенно правы, двоеточие не там, и последняя цифра отсутствует(((

Если это чем то поможет, я разобрался, в том примере с попой который))) У вас на кнопку заведено переключение символов или светодиодов, так вот при нажатии на эту кнопку три раза, двоеточие загорается, на четвертый гаснет..

Alexej550271
Offline
Зарегистрирован: 03.02.2018

Спасибо, буду иметь ввиду, но одна проблемка, я с Приморского края) Если чего, вы отправите мелким пакетом?))

Alexej550271
Offline
Зарегистрирован: 03.02.2018

Вы совершенно правы, теперь понятно, что значит нати)) Затупил просто, так сказать маленько))

svm
Offline
Зарегистрирован: 06.11.2016

Без прблем. Доставка за Ваш счет + пиво.

Alexej550271
Offline
Зарегистрирован: 03.02.2018

Добрый жень ЕвгенийП. Извините, что беспокою, хотел поинтересоваться, вы моим вопросом не занимались случайно?))

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Чем, поиском правильного кода для : ?

Так я не могу этим заниматься, я могу только сказать как это делать, а делать должны Вы на железе, у меня ж его нет.

Вы готовы?

Если готовы, давайте так: сначала сделаем, чтобы нормально работало двоеточие, а потом посмотрим что там с кнопками.

Первый шаг в поиске двоеточия (будет и второй) - возьмите практически тот же скетч. что у Вас высвечивает всё (отсюда берите) и сделайте то, что написано в строках 19-23

#include <stdio.h>
static int serial_fputchar(const char ch, FILE *stream) { ((void*)stream); Serial.write(ch); return ch; }
static FILE *serial_stream = fdevopen(serial_fputchar, NULL);
	
	
#define	PIN_DIO	9
#define	PIN_CLK	8
#define	PIN_STB	7	

#define	INIT_6x12	2
#define	INIT_7x11	3

#define	LED_DATA_LENGTH	14
//
// Глобальные переменные
//
#define	ALL_LEDS	0xf0ff
static uint16_t ledGRID[LED_DATA_LENGTH / 2] =  {// текущее состояние экрана
// Ниже по очереди ставьте все 0, кроме одного, один оставляйте ALL_LEDS
// Найдите тот при котором двоеточие светится и скажите мне его номер
// Возможно окажется, что разные точки двоеточия сидят на разных
// эдлементах массива, тогда скажите мне два номера
// Номера у них с 0 (сейчас ALL_LEDS - нулевой)
	ALL_LEDS,
	0,
	0,
	0,
	0,
	0,
	0
};
static uint8_t currentBrightness = 1;	// текущая яркость

//
//	Запись одиночной команды в TM1628
//
void writeSingleCommand(const uint8_t command) {
	digitalWrite(PIN_STB, LOW);
	shiftOut(PIN_DIO, PIN_CLK, LSBFIRST, command);
	digitalWrite(PIN_STB, HIGH);
	delayMicroseconds(1); // Пауза до следующей команды
}

//
//	Запись состояния дисплея в TM1628
//
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); // Пауза до следующей команды
}

//
// Установить яркость от 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;
}

void setup(void) {
stdout = serial_stream; // эта строка первая в setup
	Serial.begin(115200);
	//
	// Инициализация пинов
	pinMode(PIN_CLK, OUTPUT);
	pinMode(PIN_DIO, OUTPUT);
	pinMode(PIN_STB, OUTPUT);
	digitalWrite(PIN_STB, HIGH);
	digitalWrite(PIN_CLK, HIGH);
	//
	// Инициализация экрана
	writeSingleCommand(INIT_7x11); // Режим отображения
	setBrightness(currentBrightness);
	//
	// Выводим содержимое регистров
	updateDisplay();
}


void loop(void) {}

 

Ivam_Dino
Offline
Зарегистрирован: 06.03.2018

   Доброго времени суток.

 

   Большое спасибо за проделанную работу, очень хорошая идея использовать для своих разработок корпус и экран от ресивера триколор.

   Но есть одна проблема. Почти все ресиверы что я пересмотрел имеют панель с другой микросхемой вот надпись на ней кц746су. 

Увы но при подключении ее к ардуинке на экране тишина. Аналог этой микросхемы вроде как вот такой STLED316SMTR. Самое забавное что сам ресивер работает с обеими версиями экранов.

  Как вы думает, в чем может быть проблема? Учитываю что из 20 ресиверов только на одном была обнаружена  TM1668....

 

  Спасибо.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, если он сам работает, а моя программа нет, остаётся только предположить, что он как-то узнаёт что ему подсунули, по какому-нибудь уровне где-нибудь, или там ещё как. Если бы у меня был такой вариант, я бы во-певрых внимательно изучил бы плату (срисовал бы схему), поискал бы даташит на микросхему и тогда бы думал.

Ivam_Dino
Offline
Зарегистрирован: 06.03.2018

    Изучение схемы показало что главное отличие в первой ноге микросхемы. Если в варианте с 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, красивый корпус и вкруг кнопки включение стоят две пары свето диодов. Подключенных на туже микросхему

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, сравнивайте даташиты и смотрите в чём разнича.

ChiffaC3
Offline
Зарегистрирован: 24.11.2018

Большое спасибо за материал, помог мне оживить морду от oriel310 на такой же микросхеме, единственное что не осилил это зажечь двухцветный светодиод подключенный на ноги 15(seg9), 16(seg10) и 24(grid1). Пробовал использовать скетчи которые должны зажигать все но зажигается только семисегментник. Прошу помощи разобраться в том какие байты на какие адреса нужно отослать микрухе чтобы все таки зажечь светодиоды. 

Порядок семисегментника для работы такой:

(выдержка теста из скетча)

void showTest(void) {
	memcpy(saveGRID, ledGRID, sizeof(saveGRID));
	ledGRID[0] = 0xFF; //1 цифра
	ledGRID[1] = 0xFF; //2 цифра
	ledGRID[2] = 0xFF; //3 цифра
	ledGRID[3] = 0xFF; //4 цифра
	ledGRID[4] = 0x80; //двоеточие
	updateDisplay();
	saveBrightness = setBrightness(8);
}

пробовал зажигать другие варианты ledGRID но ничего не работало

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Если не помогает вс как у Вас, только 

ledGRID[4] = 0xFF;

то, лучше бы посмотреть схему, как он развелён. Он чётырёхногий? Расскажит про вес 4 ноги - куда они распаяны?

ChiffaC3
Offline
Зарегистрирован: 24.11.2018

ledGRID[4] это только двоеточие, я пробовал отправлять ему 0xFF по существу ничего не меняется, 0x80 это просто эксперименты с тем какой именно адрес зажигает двоеточие, он одним сегментом идет а не как две отдельные точки. Светодиод трехногий с общим анодом на ноге 24(grid1). Подключение ног я написал выше.

Так же пробовал добавлять пункты ledGRID[] с 0xFF вплоть до ledGRID[9], ничего кроме дисплея так же не горело. Вероятно все таки где то проблема в коде, иначе он должен был загореться как и семисегментник я так полагаю.