Pull to refresh

Comments 38

Конденсатор параллельно обмотке реле зачем? 8)
Там еще R5 мелковат, как будто КТ819 — полевик, а не биполярник, а на место конденсатора C2 просится диод в обратном включении, чтобы КТ819 раньше времени не упокоился.
Также не ясно, почему использована LM317 вместо 7805.
LM317 был под рукой на момент идеи.
Я подумал о диоде уже позже. Еще всё можно исправить.
По поводу R5 можно подробнее? Я пока что учусь всему этому.
mlu, кондер поставил что бы не так громко щелкало (мне показалось что помогло).
Обратитесь к учебному курсу, который подготовил dihalt:
Управление мощной нагрузкой постоянного тока: 1, 2, 3
Кстати, судя по всему, конденсатор — электролит, да еще его при каждом выключении реле по нему обратной полярностью шарашит… Нехорошо это. Маловероятно, что несчастный рванет, но может и потечь когда-нибудь.
Да, это проблема. Пока как фикс можно конденсатор заменить диодом. Аппарат редко выключается по реле и думаю что ничего не случится, но для часто используемых вариантов надо будет пофиксить.
Обратным током, но не полярностью! Импульса обратного выброса не хватит чтобы переполюсовать конденсатор. А вот при открытии реле транзистор будет работать чисто на ESR конденсатора, и если поставить отличный электролит… то транзистор может вышибить. Но это не случится — источник питания слишком слаб чтобы обеспечить ток для пробоя динозавра КТ819, этому еще будет способствовать ограниченный ток базы…

И кстати, КТ819 пишется без черточки.
Скажем так, спорить о том, кто в переходном процессе главнее (напряжение или ток), это все равно что спорить о первичности курицы или яйца (эти величины взаимосвязаны и рассматривать их нужно совместно, не зря же придумали использовать комплексные числа для этой цели). Из той же серии вопрос о том, что поражает человека — ток или напряжение.

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

При отключении тот же страдалец C2 не дает току через обмотку быстро прекратиться, придерживая якорь и подтормаживая его, что также выражается в менее интенсивном срабатывании.

Фактически С2 с катушкой реле представляют собой контур, но добротность у него низкая — звенеть будет, но не так хорошо как голое реле.
Плавное включение и отключение реле кстати чревато быстрым износом контактов под действием тока — искрить будет дольше и контакты быстрее подгорят. На высоковольтных выключателях так там вообще стараются размыкать его на сверхзвуковых скоростях, из-за чего звук размыкания линейного выключателя 330КВ линии подобен пушечному выстрелу и слышен за пару километров.
Тоже писал свой велосипед с декодированием команд пульта. Правда на ассемблере, код выполнялся в прерывании от TSOPа, ел пару байт ОЗУ, и никак не мешал контроллеру выполнять другие функции. Правда код «не по феншую», т.е. не по стандарту, просто снимал битовый слепок команды, а дальше он неспешно сравнивался с такими же слепками, снятыми в режиме обучения.
Со всеми пультами, что были дома, работало. Точнее и девайс и сейчас работает.
Ассемблер у меня только в планах. Я сильно избалован perl, php, js. Про стандарт поверхностно почитал, а потом просто разобрался как готовый код работает и доработал для младшей модели, убрав всё лишнее.
Можно было не играть в спарту, а взять тини45 или 85. Ну и диодик поставь на реле, а то у тебя контроллер вышибить может.
Это увлекательно и хорошо дисциплинирует. Я получил удовольствие от разработки.
И это самое главное. Если искать лёгкие пути, то проще купить готовый девайс у китайцев баксов за 10.
Баксов за 10 у китайцев будет что-то сильно круче :) Я ногда поражаюсь что у них за 10 баксов бывает :)
Насколько круче, настолько же и глючней.
ну все таки сначала транзистор вышибет, а дальше как повезет.
МК оказался довольно живучим. Я уже на ту самую ногу управляющую транзистором подавал 12В. ATtiny нагрелась сильно, но ничего не страшного не случилось, хотя я немного испугался.
Очень может быть, что выгорели защитные диоды, оберегающие контроллер от статического электричества (подключены от каждой ноги на плюс и минус питания).
Можно проверить :) Запитать пустой МК через GPIO и попробовать считать фуз биты.
Скорей всего случилось, просто внешне это незаметно. Уже сколько раз с такими микросхемами сталкивался — они работают, но у них наблюдается повышенный ток потребления — видать часть кристалла повреждена и ток просто протекает по неиспользуемым структурам. Когда такой ток будет приличным, со временем может выжечь до чего-то важного и перестанет работать.
Если что заменю другой микросхемой — у меня таких еще 9 штук. Надо же сжечь хоть какой то мк первый раз, а программатор с закрытыми глазами собираю уже. Думаю потом шилд сделать для программирования в виде Arduino as ISP.
С электролитом параллельно реле не вышибет. Мог бы вышибить при включении но слабый источник питания не даст — просто просядет.
Я обычно «прижимаю» Reset к +5В при помощи резистора на 10 кОм чтобы избежать невольных перегрузок микроконтроллера.
А ещё можно подцепить керамику на 0.1 мкФ(100 нФ).

image

А то микроконтроллер будет чуть что сразу «ловить» ресет, слегка коснулся чем-то порт Reset и перезагрузка МК гарантирована.
UFO landed and left these words here
Если приёмник на окончательной плате можно развернуть, то минус две перемычки:

Если нельзя — то минус одна.
Спасибо. Обновил схемы. Перевернуть скорее всего нельзя т.к. приемник будет смотреть вглубь платы. Конечно можно согнуть ножки и повернуть, но зачем? Единственное что, можно было светодиоды и приёмник попробовать поменять местами.
Просто на видео приёмник смотрит вверх, т.е. ему всё равно, в какую сторону он впаян — поэтому и уточнил «если можно».
Понятен ваш ход мыслей. Я сначала хотел сверху поставить маленькую коробочку с приёмником, но решил что можно попробовать поместить в корпус и пихнул всё в окошко от сломанного переключателя стерео/моно. Правда пришлось все хомутами обмотать и изолентой.
Хочу реализовать почти идентичный проект — управление Н-мостом (драйвер двигателя TA7291P) при помощи пульта. При помощи примера IRrecvDemo узнал 16-ричные коды кнопок вверх и вниз: 0x40BFA857 и 0x40BF8877 соответственно. Перевёл в 10-ричную систему, получилось 1086302295 и 1086294135. Изменил соответственно код, 3-я нога приёмника у меня на 3-м пине (PINB4), получилось:
#define IRpin 4

Записал прошивку — ноль реакции. К стати, прошиваю через USBasp программатор скомпилированный Arduino .hex файл. Пробовал устанавливать фьюзы на 9.6МГц:
avrdude -c usbasp -p t13 -U lfuse:w:0x7a:m
avrdude -c usbasp -p t13 -U hfuse:w:0xff:m

Подскажите как можно отладить прошивку, хотя бы узнать в какие блоки кода выполняются, а какие нет? Может быть проблема банальная…
Добавил в качестве отладки мигание диодом остатка от деления на 10, в итоге диод начинает мигать как только я нажимаю на клавишу на пульте, но, вот что интересно, намигивает мне значение 2147483648 — т.е. минимальное значение signed long (какую бы кнопку я бы не нажимал), хотя irCode определено как:
unsigned long irCode = 0; // Wait for an IR Code

Такое впечатление, что irCode где-то переваливает за максимальное значение unsigned long.
Долго мучался, но получилось!
Приведу только конечный код функции ожидания сигнала:

Функция listenForIR
unsigned long listenForIR() {
  byte currentpulse = 0;
  unsigned int pulse;  // temporary storage timing
  unsigned long irCode = 0;

  while (true) {
    pulse = 0;
    while (IRpin_PIN & _BV(IRpin)) { // got a high pulse
      pulse++;
      delayMicroseconds(RESOLUTION);
      if (((pulse >= MAXPULSE) && (currentpulse >= 0)) || currentpulse == NUMPULSES) {
        if (currentpulse > 3) {
          if (lastcode != irCode) prevcode = lastcode;
          lastcode = irCode;
        } else if (currentpulse > 0) irCode = lastcode;
        return irCode;
      }
    }
    if (currentpulse > 1) {
      irCode = irCode << 1;
      if (pulse > 0 && (pulse * RESOLUTION) < 60) {
        irCode |= 0;
      } else {
        irCode |= 1;
      }
    }
    pulse = 0;
    while (!(IRpin_PIN & _BV(IRpin))) { // got a low pulse
      pulse++;
      delayMicroseconds(RESOLUTION);
      if (((pulse >= MAXPULSE) && (currentpulse >= 0)) || currentpulse == NUMPULSES) {
        if (currentpulse > 3) {
          if (lastcode != irCode) prevcode = lastcode;
          lastcode = irCode;
        } else if (currentpulse > 0) irCode = lastcode;
        return irCode;
      }
    }
    currentpulse++;
  }
}

Я так понимаю вы изменили resolution? Сейчас не могу сравнить толком с кодом из моего проекта по причине маленького экрана телефона и службы в армии. Возможно мой вариант либо быстрее либо дольше считывает код кнопки. Надо будет поэксперементировать потом, но это уже летом.
Да, методом научного тыка, а вернее методом научного мигания диодом отладочной информации (кол-во тактов между импульсами), было установлено, что значение нужно скорректировать, возможно это из-за того, что мне не удалось прошиться на 9.6МГц (хотя я вроде как попытался установить фьюзы — видимо безрезультатно).
Кстати, я тогда 9.6МГц использовал из за того что в мк что то сжег и фьюзы не шились, а мк надо куда то применить. Хорошая пища для размышления, надо бы сократить потребление тока.
Сжёг фьюзы? Это ж на до так.
Sign up to leave a comment.

Articles