Вытяжка Krona Alva 600 Sensor поступила в ремонт с диагнозом не работает. Нет реакции на кнопку включения, прерывисто пищит.
Приведу краткое описание принципа работы.
Вытяжка в своем составе имеет два блока: блок питания и сенсорный блок управления.
Восстановленная схема блока питания приведена на изображении.
Горячая часть состоит из ШИМ контроллера IC1, низковольтная часть на стабилизаторе 78L05. Для управления исполнительными механизмами (скорость двигателя, подсветка, пьезоизлучатель) применен микроконтроллер IC2 SN8P2501BSG в паре со сборкой Дарлингтона IC3 (ULN2003A).
Схема сенсорного блока управления HJ-S02-0W-D собрана на управляющем микроконтроллере IC1 SN8P2501BSG и тач-контроллере IC2 FTC334B.
В других же вытяжках, где сенсор собран на АЦП, а кнопки подключены к калиброванным резисторам уже есть готовое решение: схема, печатная плата и прошивка в формате ардуино. Здесь же применен тач-контроллер. А значит, продолжим изучение..
Для индикации режимов работы здесь применили семисегментный индикатор и 4 светодиода.
Связь между блоками осуществляется по 3-х проводной схеме. Два провода питания (5В и GND) и один провод для последовательной передачи данных между блоками (URT).
Диагностика начинается с проверки напряжений блока питания. Выходные напряжения 12В и 5В присутствуют и в норме. Далее было интересно посмотреть на наличие обмена между блоками. Вывод URT. Нажатия на различные кнопки не приводили к активности на данном выводе.
Далее, согласно даташита на тач-контроллер FTC334B, проверялась работа данного контроллера. При касании конкретной сенсорной проволочки наблюдалось изменение соответствующих напряжений на выводах D0..D3. И сравнивалось с таблицей истинности.
Красными точками обозначены задействованные выводы в нашей плате.
K1 - кнопка "-"
K5 - кнопка "+"
К6 - кнопка вкл/выкл
K8 - кнопка включения подсветки
Проверка по таблице прошла успешно. Тач-контроллер работает корректно. Соответствующий цифровой код поступает на входы программируемого контроллера.
Так как достоверно неизвестно какой из программируемых контроллеров вышел из строя (в БП или в сенсорном блоке), было принято решение попробовать восстановить работоспособность вытяжки путем встраивания модуля Arduino Nano и написания управляющей программы.
Первый шаг. Доработка сенсорной платы. Особенность сенсорного блока управления в том, что программируемый контроллер имеет мало входов и выходов, и программистам нужно было совмещать функции ввода/вывода на одном выводе. Так например, к одному выводу подключен один сегмент индикатора и вывод с тач-контроллера. Поэтому, чтобы упростить написание программы, плата управления была доработана: сделаны разрывы печатных проводников (красным), удалены резисторы R8, R11, R20, JR2 (синим), добавлена связь на светодиод включения (желтым) . Таким образом, сигналы на сегментный индикатор и сигналы с тач-контроллера стали независимыми. Из светодиодов я оставил только светодиод включения.
В итоге получаем следующую схему подключения, которую реализуем на практике.
Вторым шагом идет отпаивание штатного контроллера IC1 с платы и припаивание Arduino Nano согласно схемы:
Третий шаг. Доработка блока питания. Там также необходимо удалить с платы контроллер. И припаять косу от платы с Ардуино.
После доработки и прошивки скетчем устройство становится работоспособным.
Что реализовано: выбор скорости двигателя вытяжки. Индикация режима на индикаторе. Подсветка кнопки включения. Включение внешней подсветки вытяжки вне зависимости от включения вытяжки. Звуковое подтверждение нажатий. Таймер автоматического выключения вытяжки через 5 минут (необходимо кратковременно и одновременно нажать кнопки «-» и «+»).
Что не реализовано: подсветка кнопок «-», «+», «LED». Включение таймера по длинному зажатию кнопок.
Примечание. В зависимости от модели вытяжки, подсветка рабочей поверхности может быть реализована как светодиодной (LED), так и от 220В (EL). На плате блока питания производителем предусмотрены оба варианта. Однако в моём случае было 220В. Поэтому подключено к (8). Второй вариант: нужно перепаять провод на (6).
Ссылка на прошивку-скетч.
https://drive.google.com/file/d/1HaI3-Bzr3zpMnl8DA34T2hg7O-89qm-5/view
constexpr int PIN_LED = 13;
//Дисплей
int pins[7] = { 10, 12, 11, 7, 9, 6, 8 };
byte numbers[3] = { B10011111, B00100101, B00001101 };
byte SENSOR;
int mode;
bool LED; //подсветка на А3
bool TIMER_ON;
bool pState; // состояние вытяжки. Включена/ выключена
uint32_t tmr;
uint32_t tmr2; //таймер для Таймера автоматического выключения
//Сенсор
/*
const byte K6 = B00000101; 5
const byte K1 = B00000000; 0
const byte K5 = B00000100; 4
const byte K8 = B00000111; 7
const byte K1K5 = B00000100; 4
//const int K8
#define ButtonON_OFF K6
#define ButtonMinus K1
#define ButtonPlus K5
#define ButtonADD K8
#define ButtonTogether K1K5
*/
enum States : byte {
ON_OFF = B00000101,
MINUS = B00000000,
PLUS = B00000100,
LIGHT = B00000111,
K1K5 = B00000100,
};
States State;
void showNumber(int num) {
for (int i = 0; i < 7; i++) {
if (bitRead(numbers[num], 7 - i) == HIGH) //зажечь сегмент
digitalWrite(pins[i], HIGH);
else
digitalWrite(pins[i], LOW);
};
digitalWrite(A5, HIGH);
}
void update(int velo) {
PORTC &= ~0b111;
switch (velo) {
case 0: PORTC |= 0b00000001; break;
case 1: PORTC |= 0b00000010; break;
case 2: PORTC |= 0b00000100; break;
};
}
void fON_OFF() {
tone(A4, 2200, 100);
mode = 0;
if (pState == 0) { //Если вытяжка выключена, включить. Выставить 1 скорость.
showNumber(mode);
update(mode);
digitalWrite(PIN_LED, HIGH);
pState = 1;
} else {
digitalWrite(PIN_LED, LOW);
digitalWrite(A5, LOW);
pState = 0;
tmr = 0;
tmr2 = 0;
TIMER_ON = false;
PORTC &= ~0b111; //Выключение двигателя (Motor Off)
};
}
void fMINUS() {
if (pState && mode > 0) {
--mode;
tone(A4, 2200, 50);
showNumber(mode);
update(mode);
};
}
void fPLUS() {
if (pState && mode < 2) {
++mode;
tone(A4, 2200, 50);
showNumber(mode);
update(mode);
;
};
}
void fLIGHT() {
tone(A4, 2200, 50);
digitalWrite(A3, LED = !LED);
};
void setup() {
// put your setup code here, to run once:
mode = 0;
pState = 0;
TIMER_ON = false;
for (int i = 0; i < 7; i++)
pinMode(pins[i], OUTPUT); //Выходы сегментов индикатора
pinMode(PIN_LED, OUTPUT); //подсветка кнопки ON_OFF
pinMode(A0, OUTPUT); //1 скорость
pinMode(A1, OUTPUT); //2 скорость
pinMode(A2, OUTPUT); //3 скорость
pinMode(A3, OUTPUT); //подсветка LED
pinMode(A4, OUTPUT); //BUZZER
pinMode(A5, OUTPUT); //общий вывод индикатора
pinMode(2, INPUT); //D0
pinMode(3, INPUT); //D1
pinMode(4, INPUT); //D2
pinMode(5, INPUT); //D0
Serial.begin(9600);
PORTC &= ~0b111;
}
void loop() {
static bool flag = false;
static bool flag_tmr = false;
if (!digitalRead(5) && !flag && (millis() - tmr > 100)) {
delay(50);
State = (PIND & B00011100) >> 2;
flag = true;
tmr = millis();
switch (State) {
case States::ON_OFF: fON_OFF(); break;
case States::MINUS: fMINUS(); break;
case States::PLUS: fPLUS(); break;
case States::LIGHT: fLIGHT(); break;
}
;
}
if (digitalRead(5)) {
State = (PIND & B00011100) >> 2;
if (State == 7 && flag && (millis() - tmr > 60)) {
flag = false;
tmr = millis();
};
};
if (digitalRead(5) && pState) { //включение таймера
State = (PIND & B00011100) >> 2;
if (State == States::K1K5 && pState) {
//tone(A4, 1000, 10);
TIMER_ON = true;
tmr2 = millis();
};
};
if (pState && TIMER_ON && millis() - tmr2 > 10000) { //таймер на 5 минут
fON_OFF();
TIMER_ON = false;
pState = false;
};
if (pState && TIMER_ON && millis() - tmr > 500) { // мигание индикатора во время работы таймера
tmr = millis();
digitalWrite(A5, flag_tmr = !flag_tmr);
};
}