пятница, 15 февраля 2019 г.

Netis WF2411E Восстановление

Попался мне в руки Netis wf2411e, на котором горят только pwr и wps, реагирует на кабель. Что значит сие, я не знал, предположил что слетел загрузчик. После разборки роутера и изучения внутренностей я выяснил, что есть возможность подключиться и восстановить по UART.
Сам роутер построен на процессоре RTL8196E, посмотрев datasheet на него я отследил линии TX и RT. На самой плате имеется отладочный разъем, на который выведен и UART. Вот фото как подключиться к роутеру по UART.


Земля там представлена двумя контактными площадками. В качестве переходника - дешевый китайский USB-UART переходник. На всякий случай подключил его к роутеру через резисторы по 470 килоом, можно и без них - я просто перестраховался. Подключил RX переходника на TX на плате и, соответственно, TX переходника на RX на плате.
Программное обеспечение - Putty. И тут я столкнулся с тем, что не знал какая скорость COM-порта должна быть у RTL3411E. Методом перебора выяснил, что скорость UART роутера 38400. После подключения по UART и включения питания роутера он мне сыпонул в консоль вот такую вот вещь:

no sys signature at 00010000!
no sys signature at 00020000!
no rootfs signature at 000E0000!
no rootfs signature at 000F0000!
no rootfs signature at 00130000!
no rootfs signature at 000D0000!
no rootfs signature at 000D1000!
no rootfs signature at 000D2000!
no rootfs signature at 000D3000!
no rootfs signature at 000D4000!
no rootfs signature at 000D5000!
no rootfs signature at 000D6000!

Далее стандартный загрузчик realtek пригласил меня с ним побеседовать. Список команд я выяснил, воспользовавшись вопросительным знаком.


Из всего этого нас интересует только IPCONFIG. Команда IPCONFIG нужна для того, чтоб установить адрес роутера, по умолчанию это 192.168.1.6. На этот адрес мы будем заливать прошивку по tftp.
Для начала нам нужна сама прошивка, идем на официальный сайт netis - netis-systems.com. У меня этот сайт почему-то не открылся, потому я пошел на его украинский вариант netis.ua


Самая новая прошивка была с пометкой "обновление только через веб-интерфейс", поэтому я использовал прошивку от 17.03.2017. Скачал, распаковал, создал на диске С папку с коротким циферным названием, чтоб долго не прописывать путь и скопировал бинарный файл прошивки в эту папку. Сам файл я так же переименовал для удобства.

Теперь посмотрим, как включить TFTP-сервер в Windows. Для этого нам понадобиться всего одна команда:
dism /online /Enable-Feature /FeatureName:TFTP
Прошивать роутер можно напрямую подключив кабель в сетевую карту ПК, но я шью с ноутбука с нерабочей картой, потому шить буду по wi-fi. Для этого присваиваю роутеру IP из подсети, в которой нахожусь, командой ipconfig



Так же необходимо включить автозапись прошивки в постоянную память, для этого есть команда autoburn



Теперь подключим наш Netis к рабочему роутеру (или к ПК, если будете шить с компьютера). Подключаем кабель к 4-тому порту нетиса, именно LAN4, с другими портами ничего не выйдет. Если шьем напрямую с пк, то присвойте сетевой карте пк статический адрес из той же сети, что и адрес на нетисе (если на нетисе стандартный 192.168.1.6, то у компьютера дорлжен быть 192.168.1.2, например).
После подключения с командной строки переходим в папку с прошивкой командой cd, после чего запускаем отдачу файла прошивки по TFTP командой
tftp -i 192.168.88.100 put netis.bin
netis.bin - имя прошивки, я уже писал, что переименовал ее, дабы в командной строке было меньше писанины - меньше шансов ошибиться.
Запускаем команду и ждем, пока прошивка загрузится на роутер. После успешной загрузки увидим сообщение об успешной передаче



Смотрим вывод консоли с UART, если все нормально - роутер перезагрузится сам. Если в перезагрузку не ушел, ничего нового не пишет - немного ждем на всякий случай и перезагружаем вручную отключением питания. Если прошили успешно - будет вот такой вывод в консоль



Теперь это уже полностью рабочий нормальный роутер. Можно подключиться к нему и зайти через браузер. На всякий случай я залью самую новую версию прошивки уже через веб.



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

четверг, 14 февраля 2019 г.

Усилитель звука на lm358

Пришла мне в голову идея собрать на lm358 усилитель для наушников. Идея вызвана тем, что мне срочно понадобился прибор для проверки операционных усилителей, а поскольку осциллографа у меня на данный момент нет, то решил собрать такой прибор своими руками. В качестве прибора будет выступать унч на lm358, так как именно этот ОУ мне надо проверить.


Для начала посмотрим характеристики LM358. Для этого найдем даташит на этот ОУ и обратим внимания на вот эту таблицу.



Из таблицы мы видим, каким напряжением можно питать lm358, это от 3 вольт до 30 при однополярном питании. Мой выбор остановился на 5 вольтах, так как это напряжение можно взять откуда угодно - хоть с порта USB, хоть с павербанка.
Дальше надо определится со схемой, это будет классическая схема усилителя на ОУ с отрицательной обратной связью. За основу возьмем схему из даташита и немного ее доработаем.



Резисторы RG и RF отвечают за глубину обратной связи, регулируя коэффициент усиления. Резистор RIN ограничивает входной сигнал. Перед RIN поставим конденсатор, дабы отсечь постоянный ток, а RG можно сделать переменным, чтоб регулировать громкость. По питанию в обязательном порядке поставим электролитический конденсатор для того, чтоб не было краткосрочных просадок напряжения питания.

После сборки тестового образца звук был настолько ужасным, что схему пришлось существенно переделать. В итоге от того примера, что в datasheet, пришлось немного отступить. Путем вычислений а так же проб и ошибок сформировалась вот такая вот схема. Получился полноценный усилитель, который я нагрузил не наушниками, а 15-ти ваттными колонками сопротивлением 4 Ома. Усилитель конечно же не выдаст подобной мощности, просто эти колонки были в наличии.

Схема усилителя на LM358


Давайте разберем эту схему по порядку, что и зачем тут стоит. Первым делом начнем с конденсаторов C1 и C2. Изначально планировалось поставить керамические конденсаторы небольшой емкости, но практика показала, что лучше всего подошли конденсаторы большой емкости. Сначала поставил на 1 mF неполярный и это привело к громадным искажениям, при попытке подать сигнал в обход конденсатора искажения пропадали. Пробовал различные конденсаторы, в итоге лучше всего звучат электролитические конденсаторы, которые покупались мной для материнской платы. Возможно дело в ESR или в коэффициенте гармоник, которые напрямую зависят от качества конденсаторов и эти просто оказались более качественными, нежели остальные имеющиеся. К сожалению, замерить ESR или коэффициент вносимых гармоник не представляется возможным из-за отсутствия соответствующей измерительной аппаратуры.

Резисторы R1 и R2 на 22 Ома поставил дабы компенсировать высокое входное сопротивление микросхемы, выбор номинала обусловлен сопротивлением наушников, вместо которых подключается данный усилитель.

Резисторы R3, R4, R5 и R6 формируют отрицательную обратную связь. Изменяя значения резисторов R3 и R4 можно регулировать громкость, поэтому вместо них можно поставить один переменный сдвоенный резистор. Я предпочел поставить постоянный и регулировать громкость на телефоне, к которому подключал данный усилитель.

Конденсаторы C3 и C4 емкостью 0,47 микрофарад выступают фильтрами, без них очень сильные искажения на высоких частотах. Это электролитические конденсаторы китайского производства и я подозреваю, что именно из-за своего качества (ESR и высокий коэффициент вносимых гармоник) они делают звук качественнее. Это как раз тот случай, когда плохое качество деталей улучшает схему. Хотя может быть я ошибаюсь и они просто выступают в роли фильтра.
Если поставить параллельно R5 и C3 переменный резистор номиналом 10-50 кОм и конденсатор 47 нанофарад, можно получить фильтр высоких частот. Получится усилитель с регулятором баса, но для этого такое же изменения надо внести и во второй канал.

Переходим к конденсаторам C5 и C6. Они отфильтровывают постоянный ток на выходе усилителя, и с ними та же ситуация, что и с конденсаторами на входе. Поставил те, которые предназначались для установки на материнскую плату компьютера, с другими попросту растут искажения. И это даже учитывая то, что данные электролиты я покупал лет 7-10 назад и за период хранения их характеристики должны были бы ухудшиться.

Резисторы R7 и R8 компенсируют низкий импеданс нагрузки, без них очень сильные искажения. Поставил номиналом в 22 Ома, по примеру тех же наушников.

В качестве нагрузки выступают советские колонки 15 ватт - то, что было в наличии. Звук вполне приличный, на максимуме громкости телефона есть искажения, но уже на 70-80 процентах их нет. Вместо колонок можно смело подключать наушники, только изменить номинал резисторов на выходе до 5-10 Ом, например. Хотя можно и не изменять, дабы не сжечь наушники или не оглохнуть самому.

Микросхема LM358P китайского производства, заказана с али.
Усилитель собран на макетной плате, вот что получилось в итоге.



На схеме не указан конденсатор, который я поставил между плюсом и минусом питания, это электролит на 470 микрофарад. Питал сей девайс от обычной телефонной зарядки 5 V 750 mA, замеры показали, что просадок напряжения нет и потребления тока совсем смехотворное - 10-15 mA. С оглядкой на то, что в схеме на входе и выходе стоят конденсаторы на 10 вольт, я все же рискнул подать питание 12 вольт, дабы посмотреть как изменится звук. Усилитель выдержал данное испытание более чем достойно, увеличив немного громкость звучания и при этом не внося искажений в звук. Потребление по току увеличилось до 20 mA.

В заключение скажу, что если вам нужен стенд для проверки операционных усилителей, то этот усилитель звука с однополярным питанием вполне подходящий вариант. С учетом того, что схема собрана на макетной плате, то для проверки большого количества LM358 просто вытаскиваем одну микросхему и ставим вместо нее другую. Если выполнить все на печатной плате - то надо ставить dip-панельку для удобства замены микросхем.
Что касается сложности - то собрать своими руками на коленке за 20 минут при наличии необходимых деталей даже ребенок сможет.

среда, 6 февраля 2019 г.

Датчик газа MQ-2 подключение к Arduino nano

В этой статье я расскажу как подключить датчик газа MQ-2 к Arduino nano.
Описание датчика MQ-2.



Датчик пришел в виде готового модуля, имеет четыре вывода, которые подписаны AO, DO, GND и Vcc. Назначение выводов: AO - это аналоговый выход, DO - это цифровой выход, GND - это земля (минус питания) и Vcc - это +5 вольт. Распиновка проста, но есть одно НО! - цифровой вывод имеет только два состояния - 0 и 1, никаких данных об концентрации регистрируемых датчиком газов с него не получить.
Так же на плате модуля присутствует подстроечный резистор для регулировки чувствительности датчика в случае получения данных с цифрового вывода, вернее порог срабатывания. Для этой цели тут стоит компаратор LM393.
В интернете рекомендуют прогреть новый только что купленный датчик на протяжении 24-рех часов, после чего время его прогрева будет около минуты с моменте включения. В даташите же я нашел Preheat time, время разогрева, и там указано больше 48 часов. Думаю, для домашнего использования вполне достаточно будет и 24-рех часов.

Итак, для начала давайте все же подключим его к ардуине дабы посмотреть что же он нам скажет в не прогретом состоянии. Для получения информации воспользуемся аналоговым выходом датчика, подключив его на аналоговый вход Arduino nano, соединив AO датчика с A0 ардуины. Разведем питание и напишем небольшой скетч, задача которого считывать показания с АЦП ножки A0 и отправки его по UART. Монтаж я сделал на макетной плате, должно получится как-то вот так.



Пример кода



После прошивки ардуины открываем монитор последовательного порта. Данные, что мы получаем, это вовсе не значение газа в PPM, это всего лишь содержание регистра АЦП микроконтроллера. Тем не мене, по этим данным уже можно о чем-то судить. Подождав около получаса и дождавшись, когда датчик немного прогреется, видим, что напряжение уже довольно сильно просело. Берем зажигалку и, не зажигая ее, пускаем газ в датчик. Видим, что датчик работает, так как показания сразу же изменяются. Таким образом можно проверить датчик MQ-2.
Теперь проведем несложный расчет для того, чтоб получить значение сопротивления нашего датчика. Для начала сырые данные АЦП переведем в вольты. Для этого замерим опорное напряжение, которым у нас выступает напряжение питания. У меня мультиметр показал 4,9 вольт. Ацп 10-ти битный, это значит что у него всего 1024 значения, тоесть при 4,9 вольтах он нам даст значение 1023. Делим 4,9 на 1024 и получаем 0,0047 вольта с округлением. Добавляем в наш код переменную float Vdat, равную 0.0047. Дальше попросту значение ацп умножаем на эту переменную и получаем напряжение на ноге A0 в вольтах. Переходим к сопротивлению датчика. На плате модуля у нас есть резистор, который подтягивает наш аналоговый выход на землю, номиналом 5 Ом. По сути весь модуль - это некий делитель напряжения. Прямо в даташите видим формулу:
Resistance of sensor(Rs): Rs=(Vc/VRL-1)×RL
Смотрим схему и таблицу в даташите, разбираем что к чему.



Подставляем то, что нам надо и получаем следующее:
Rs = (4.9/Vdat-1)*5
Займемся формулой расчета ppm. Для этого снова смотрим datasheet на MQ-2.



Из данного куска даташита можно сделать несколько выводов. Первый - с разными газами при одних и тех же показаниях датчика будет разная концентрация газа. Это переводит наш датчик из разряда "измерительный прибор" в разряд "показометр". Максимум, что можно посмотреть - это загрязненность воздуха. Для бытовых нужд этого вполне достаточно, но для чего-то серьезного - нет. Второй вывод: дабы получить точное значение в ppm, датчик нужно откалибровать на чистом воздухе. Это не проблема, открываем окно, суем на улицу датчик, делаем вид, что за окном чистый воздух и сохраняем показатели в переменную Rs_air.
Теперь можем высчитать R0, которое есть в соотношении Rs/R0. На чистом воздухе в графике Rs/R0 составляет примерно 9.5. Делим Rs_air на 9.5, получаем R0.
Вешаем прерывание на ногу микроконтроллера, цепляем туда тактовую кнопку и с помощью этого прерывания вызываем функцию калибровки
int calibr()
{
R0 = Rs_air/9.5;
}
Дальше упираемся в нелинейную функцию. Решать сию задачку для показометра мне влом, потому я попросту разобью данный график на несколько составляющих, в которых прослеживается хоть какая-то линейность. Например, с 200 до 500, с 500 до 1000, с 1000 до 2000, с 2000 до 5000, с 5000 до 10000. Упираемся в то, что это таки показометр, а значит для CO и для, например, пропана показатели будут совершенно разными. Для кого из них строить формулу? Для примера сделаем расчет для CO.
Для начала высчитаем первый угловой коэффициент. Первая точка - это 200 ppm с соотношением Rs/R0 примерно 5.1, вторая - 500 ppm с соотношением 4. Получаем уравнение
K = (4-5.1)/(500-200)= -0.003666

Высчитываем остальные коэффициенты и приступаем к формуле расчета, которая имеет вид y=kx+b, где b - это смещение прямой по оси Y. Для начала рассчитаем для первого отрезка b.
4=-0.003666*500+b
b = 5.8335
После чего высчитываем b для остальных отрезков и приступаем к формированию нашего кода для ардуино. Для каждого кусочка нам необходимы будут разные значения двух одних и тех же переменных. Например, b для первого кусочка и b для второго кусочка - это разные числовые значения. Будем передавать их через переменные в виде аргументов.
Получился вот такой кусок кода

int ppm_co(float k, float b)
{
float pp = 0;
pp = Rs_R0 - b;
ppm = pp/k;
Serial.println(ppm);
}


Rs_R0 = Rs/R0;
if (Rs_R0 > 5.1)
{
Serial.println("<100");
}
else if (4 < Rs_R0 < 5.1)
{
ppm_co(-0.003667, 5.8335);
}
else if (3.1 < Rs_R0 < 4)
{
ppm_co(-0.0018, 4.9);
}
else if (2.1 < Rs_R0 < 3.1)
{
ppm_co(-0.0005, 3.6);
}
else if (1.9 < Rs_R0 < 2.1)
{
ppm_co(-0.0001, 2.4);
}
else if (1.5 < Rs_R0 < 1.9)
{
ppm_co(-0.00008, 2.3);
}
else
{
Serial.println("you died");
}

Теперь несколько советов. Сенсор MQ-2 чувствителен к питанию, потому при отладке помните, что USB порт ПК может давать заниженное питание, мне пришлось использовать питание внешнее. Так же не стоит забывать о времени на прогрев - холодный датчик MQ-2 выдаст абракадабру вместо вменяемых данных. Ну и сам процесс калибровки должен быть в условиях с чистым воздухом. В коде используйте тип переменных, который способен вместить в себя большое число, ибо от этого зависит результат вычислений. Я использовал float для всех чисел, кроме данных с ацп - там мне хватило integer)
Данный код приведен как пример, кода вполне достаточно, дабы регистрировать уровень загрязненности воздуха и включать-выключать вытяжку на кухне, для более серьезных вещей надо считать все не для СО, а для LPG, чтоб добиться более низких порогов срабатывания. Так же из кода можно выкинуть калибровку, замерив и прописав как константу показатель датчика на чистом воздухе.
В интернете гуляет библиотека для датчика MQ-2, у меня чет с ней не сложилось, она просто-напросто отказалась выдавать какие-либо данные. Потому писал свой скетч. Вышеприведенный код написан на C, потому его с легкостью можно использовать на любом микроконтроллере, хоть STM32, хоть PIC, лишь бы был ацп. Выкинуть с него только Serial.print, ибо это ардуиновская библиотека Wire и в других средах разработки ее нет.
P.S. Если кто-то напишет код поинтересней - пишите в комментарии к статье, с радостью почитаю)))