Архив апреля 2018

Эксперты, где вы?

Выложили фотографии остатков американских “Томагавков”. В мятых железках я не особо понимаю, а вот что касается электроники – интересно, куда делись многочисленные эксперты, которые ставили диагноз по фотографиям “черного ящика” Су-24?

tomahawk-parts-1

tomahawk-parts-2

Арифметика, бессердечная ты сука

По на водке Биссо Атанасова – заходим на сайт “Таманской винной компании” (страна должна знать своих героев!), прокручиваем страничку донизу и видим сделанные безвестным веб-дизайнером “счетчики”, сообщающие нам, что с 480 га виноградников “компания” умудряется получить 82 984 320 литров вина в год и разлить их в 55 000 000 бутылок.

Делим одно на другое – хрен с ними, с бутылками по полтора литра (объем стандартной винной бутылки вдвое меньше, если что) – но вот урожайность в 1729 гектолитров с гектара, на порядок больше “нормальной” заслуживала бы нобелевской премии по биологии.

Вывод из этого довольно простой – “Таманская винная компания” в основном занимается розливом привозного “виноматериала” не самого высокого качества. Заходим на том же сайте в раздел “Каталог” и запоминаем – это так называемое “вино” брать не стоит.

Великая битва слона с китом

Как известно, в своем крестовом походе против Телеграма Роскомнадзор придерживается тактики РВСН – “точность попадания компенсируется мощностью заряда”. Телеграм, говорят, пока не накрыли, а вот подсеть, через которую работает гугловская баннерокрутилка, заблокировали надежно.

Надо бы в качестве ответки на американские санкции включить Adblock на государственном уровне. Будет достаточно ассиметрично, а заодно – приятно.

Пайка в печке

Хочу поделиться впечатлениями от сборки и использования контролера печки для пайки оплавлением по мотивам описанного Олегом Артамоновым – собственно, это будет большой и развернутый комментарий к статье по ссылке:

http://olegart.ru/wordpress/reflow-soldering/

Собственно, такой девайс понадобился мне для сборки относительно “серийных” изделий – но что значит “серийных”? Скажем, “серые коробочки” для любительского и ретро-ралли разошлись уже тиражом в несколько десятков штук – правда, в процессе проектирования находится более продвинутый вариант. Пайка вручную даже пяти AtMega, пусть даже в “человеческом” корпусе с шагом выводов 0,8 мм – занятие малоинтересное по определению. В общем, запаивая к новому сезону очередную “партию” коробочек, я задумался – а нельзя ли как-то упростить это дело?

Вариант с заказом производства в том же “Резоните” я не расмматривал – во-первых, стыдно заказывать изготовление штучных партий устройств, где всех деталей – AtMega, пара резисторов и оптопара, во-вторых – это получалось относительно дорого (в частности, стоимость “подготовки производства” в 3000 рублей, даже будучи “размазанной” на партию в десяток изделий, все равно оказывалась в числе значимых статей расходов). Наверное, 3000 можно потратить как-то иначе – например, вот на такую печку.

В принципе, вариантов переделки электродуховки в печку для пайки довольно много, но иностранцы почему-то не склонны к экономии в такого рода проектах. Например, зачем-то они используют твердотельные реле – да, это стильно, модно и молодежно, но одновременно – довольно дорого (раза в два дороже “дискретных” тиристора и оптопары). Зачастую используют готовые контролеры типа Controleo – да, с ним вся переделка печки сводится к правильному подключению проводов, но сам контролер стоит совершенно неприличных денег (да, силовой части в нем нет, придется городить несколько твердотельных реле и блок питания, а это дополнительные расходы). Короче говоря, контролер за авторством Олега Артамонова показался мне более приближенным к российским реалиям – с легкодоставаемыми компонентами (все есть в Чип-и-Дипе и Терраэлектронике) и в целом доступный для повторения.

Сама электродуховка “для опытов” досталась мне бесплатно, будучи вытащенной из лежащего на балконе хлама. Подходящие дешевые печки стоят “в магазине” что-то около 2000-3000 рублей, б/у можно найти либо в собственном хламовнике (бесплатно), либо на каком-нибудь авито (недорого).

Плату устройства я немного переделал – во-первых, заменил SMD-шные резисторы и конденсаторы на выводные (просто их у меня много, да и паять вручную кучу SMD совсем неинтересно), во-вторых, сделал ее односторонней с несколькими перемычками на верхнем слое – для изготовления по “лазерно-утюговой” технологии (кстати, переход с SMD на выводные детали это дело значительно упрощает). Заодно выкинул “лишнее” – например, USB-порт и реле. Избавившись от USB, можно было бы попробовать и заменить микроконтролер на более дешевый – как выясняется, прошивка с ампутированным обменом по USB прекрасно влезет и в AtMega8, но я понадеялся, что получится использовать готовую прошивку без доработок. Забегая вперед, скажу – они понадобились, в первую очередь из-за того, что в выкидывании всякого ненужного барахла я немного поторопился и избавился от термодатчика TMP37.

Заодно я поменял габариты платы, рассчитывая вписать ее в корпус Gainta G767 (я придерживаюсь той точки зрения, что проектируя печатную плату – надо сразу задуматься, в какой корпус ее поставить) – но с этим облажался по-крупному. Конечно, надо было сначала купить этот корпус и промерить его “по месту” – но я понадеялся на чертеж и лоханулся с размерами. Вот какое там расстояние между крепежными отверстиями для платы? Я подумал, что в чертеже ошибка – но нет, кто-то додумался указать расстояние именно между этими двумя точками. Интересно, каким инструментом его можно замерить? Добавлю еще, что вычислить расстояние между крепежными отверстиями возможно лишь в том случае, если известны диаметры стоек.

Еще из моей лажи – я не сразу заметил, что несмотря на то, что дисплеи Winstar WH1602A (самый дешевый в продаже) и WH1602J (а этот использован в схеме) имеют очень похожие разъемы, назначение выводов в этих разъемах совсем разное – и после того, как я просто припаял дисплей к плате на “гребенке” и долго выяснял, почему он не работает, мне все равно пришлось сидеть и долго запаивать проводочки :)

Довольно важный вопрос, почему-то обойденный стороной в описании на сайте Олега – калибровка датчика температуры. Судя по всему, в ранних прошивках она была жестко зашита в контролер – а в выложенной на сайте версии прошивки появилась возможность немного варьировать параметры. К сожалению, описания этого процесса либо нет, либо оно погибло вместе с сайтом fclab.ru – так что кратенько прокомментирую, что нужно сделать. Используемая в устройстве термопара типа K (как в мультиметрах) имеет практически линейную характеристику в интересующем нас диапазоне от +25 до +250 °С – поэтому в EEPROM микроконтролера прошиваются два 16-битных числа, первое из которых для термопары равно 31 (расчет этого коэффициента можно увидеть в файле thcouple.c в исходниках прошивки) – и без особой необходимости менять его не надо. Второе число задает сдвиг шкалы – в единицах, равных 1/4 °С. Например, значение -100 увеличит показания температуры на 25 °C, а 100 – напротив, уменьшит их на ту же величину. Так как я выкинул термодатчик, показания которого принимались за температуру холодного спая термопары, пришлось записать в эту ячейку памяти -100 – приняв “комнатную температуру” за 25 °C. Конечно, можно было бы сделать и лучше – но, как показала практика, и так нормально. Показания прибора, когда термопара засунута в чайник с кипящей водой – около 96-97 °С, что можно считать более-менее приемлемым. Так как я выкинул дополнительный термодатчик, пришлось все-таки поставить WinAVR и добавить в прошивку обнуление показаний канала АЦП, к которому тот был подключен – иначе “градусник” начинал безбожно врать.

Да, еще один волнующий многих вопрос по поводу прошивки – какие использовать значения fuse. В принципе, все написано и в тексте – но чтобы не вдумываться в фразы типа “в конфигурации отключены DIV8, JTAGEN и HWBEN” – приведу здесь значения, которые мне подсказал “AVR fuses calculator” – L=0xDE, H=0xDD, E=0xCF.

Больше, наверное, никаких проблем и не возникло – ну разве что внезапно выяснилось, что в Москве проблематично недорого купить термопару – имеющаяся у меня термопара от мультиметра в металлическом корпусе оказалась довольно инерционной в показаниях, а провод явно пованивал при нагреве до 250 °C. Да, в некоторых магазинах (Промэлектроника, например) термопары типа K можно купить рублей за 100 – но только не в том случае, если такое желание внезапно возникло в пятницу в конце рабочего дня. В общем, проще и дешевле всего оказалось купить в Юлмарте самый дешманский мультиметр модели 838 (кстати, сравнив его со своим десятилетней давности Mastech 830, я просто офигел, насколько деградировали дешманские мультиметры). Заодно мне достались два разъема-”банана” – термопару я подключил проводками к клеммной колодке.

С учетом покупки мультиметра бюджет проекта составил примерно те самые 3000 рублей, которые жаба не позволила тратить на “подготовку производства” в Резоните – и надо сказать, что я в целом остался доволен – даже нанося паяльную пасту (я взял на пробу Multicore CR36) вручную из шприца (медицинского, с обрезанной толстой иглой), удалось добиться вполне приемлемого количества брака (прежде всего слипшихся ножек на микросхемах с малым шагом – это исправляется с помощью паяльника и “оплетки для выпайки”). Но главное – это скорость монтажа, нанести пасту, расставить детали и сунуть несколько плат в печку получается намного быстрее, чем в случае, когда все надо запаивать вручную. Надо бы попробовать нанести паяльную пасту через трафарет – я, конечно, попробовал вырезать какое-то подобие трафарета из прозрачной пленки, но ножом это делать неудобно, и те же ножки микроконтролера я объединил в одну широкую прорезь – замыканий получается меньше, чем при ручном нанесении, но все равно они иногда случаются.

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

Cyberforum – пидарасы

А что случилось с Чип-и-Дипом?

Смотрю цены на разные микроконтролеры – и неожиданно ЧиД оказывается одним из наиболее выгодных вариантов.

Atmega8A – 75 рублей в розницу в ЧиДе, и 74,51 – оптом в Терраэлектронике или Электронщике (я так понимаю, что он ищет, в частности, и в Терре) (UPD Терра=Компэл=Электронщик).

STM32F103RBT6 – 190 в розницу в ЧиД, и 212 – в Терре (правда, начиная от 40 штук – Терра выгоднее).

LPC1768FBD100.551 – 350 в ЧиД – и опять же, Терра может что-то противопоставить только при партии от 40 штук.

Кто-то в лесу сдох?

Внезапное открытие про дизайн ThinkPad

“Классическая” легенда про дизайн IBMовских ноутбуков утверждает, что дизайнеры первых ThinkPad сделали их черными и угловатыми, потому что вдохновлялись формой японской коробочки для еды – бэнто (или, в вольном переводе на русский, тормозка). Смею утверждать, что это все чушь, а на самом деле они фанатели от в равной мере нестареющего дизайна “Волги” модели 3102 :)

gaz-3102-gon

PS Нет, папа точно не “Мазерати”:

thinkpad-maserati

Reflow soldering

Попробовал пайку оплавлением в самом быдлячьем варианте – с нанесением паяльной пасты через медицинский шприц и последующим запеканием в бытовой электродуховке с очень условным контролем температуры. Понравилось, удобно.

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

Операционная система из говна и палок

На “Гиктаймсе” опубликовали конспект первой лекции курса Олега Артамонова по программированию микроконтролеров. Курс, конечно, немного экзотический в сравнении с любым интернетовским руководством по тем же STM32 – в нем рассматривается программирование с использованием операционной системы RIOT. Никакого вам CubeMX, никакой FreeRTOS – но в целом материал не особо привязан к конкретной ОС и “железу” и ориентирован скорее на то, чтобы продемонстрировать подходы к программированию для микроконтролеров “вообще”.

Для тех, кому проще воспринимать видео – на Youtube выкладываются и видеозаписи лекций:

https://www.youtube.com/playlist?list=PLJEYfuHbcEIApuZR4L5tRiBCwTZCYeTNY

Но при всех заявленных и видимых достоинствах этих лекций, хвалить их целиком пока рано – поэтому перейду к всякой ерунде. Как водится, половина удовольствия от чтения “околоэлектронных” материалов на “Хабре” и “Гиктаймсе” – это комментарии, где обычно ссаными тряпками гоняют ардуинщиков. В этот раз к “гонимым” добавились также те, кто не осилил ничего, кроме всевозможных HAL и StdPeriphLib от производителя, и те, кто почему-то считает микроконтролером Raspberry Pi. Но все это не заслуживало бы упоминания – если бы не один комментарий:

…например, в Contiki — там многозадачность с инвалидностью третьей группы, там надо в треде либо без switch-case, либо без сообщений жить. Этому в университете всех учить не надо, кому в жизни не посчастливится — сами научатся.

https://geektimes.ru/company/samsung/blog/299187/#comment_10699171

Полез смотреть, что же за альтернативный подход к многозадачности исповедуют авторы операционной системы Contiki – и обнаружил там совершенно замечательную штуку. Оказывается, тамошнее подобие “потоков” обычной RTOS реализовано довольно необычно, исключительно средствами языка C.

Для начала – вот такой хитрый пример кода, который обычно называется Duff’s device – “Прием Даффа”, в честь Тома Даффа, обратившего внимание на то, что метки в конструкции switch языка C позволяют нарушать “блочную” структуру программы – например, перейти сразу внутрь цикла:

switch (count % 8) {
    case 0:    do { *to = *from++;
    case 7:         *to = *from++;
    case 6:         *to = *from++;
    case 5:         *to = *from++;
    case 4:         *to = *from++;
    case 3:         *to = *from++;
    case 2:         *to = *from++;
    case 1:         *to = *from++;
               } while ((count -= 8) > 0);
}

Кстати говоря, Duff’s Device упомянут [info]sharpc в известном “Теоретическом минимуме для программиста“. Конструкция довольно дикая, мало чем отличающаяся от GOTO – и хочу заметить, что особых преимуществ по скорости (в оригинале она использовалась для того, чтобы развернуть цикл в memcpy) на современных процессорах она не дает. Знать о ней, наверное, надо, а вот применять – только по необходимости.

А теперь сделаем еще один шаг вперед – обратите внимание, что такой переход позволяет “сохранить” текущее положение “внутри” выполняемой функции. Сначала пример без макросов (взятый со странички Адама Дункельса про protothreads и немного измененный):

volatile int counter;

int example( int *lc ) {
    switch ( *lc ) { case 0:

    printf( "First run!\n" );
    while ( 1 ) {
        *lc = 9; case 9: if ( !(counter > 10) ) return 0;
        printf( "Threshold reached\n" );
        counter = 0;
    }

    } *lc = 0; return 2;
}

Будем вызывать эту функцию примерно таким образом:

int main( void ) {
    int lc = 0;

    while ( 1 ) {
        example( &lc );
        printf( "Back in main, counter = %d\n", counter );
        counter++;
    }

    return 0;
}

Обратите внимание, что строчка First run! напечатается только один раз, несмотря на то, что функция вызывается многократно. Фактически, таким нехитрым приемом реализован механизм ожидания событий – нетрудно догадаться, что в промежутках между вызовами нашей функции counter может изменяться как угодно (на это я намекаю, объявив его volatile). А теперь определим несколько макросов:

struct pt {
    int lc;
};
#define PT_BEGIN(pt)          switch((pt)->lc) { case 0:
#define PT_WAIT_UNTIL(pt, c)  pt->lc = __LINE__; case __LINE__: if(!(c)) return 0
#define PT_END(pt)            } (pt)->lc = 0; return 2
#define PT_INIT(pt)           (pt)->lc = 0

И перепишем пример, используя их:

volatile int counter;

int example( struct pt *pt ) {
    PT_BEGIN( pt );

    printf( "First run!\n" );
    while ( 1 ) {
        PT_WAIT_UNTIL( pt, counter > 10 );
        printf( "Threshold reached\n" );
        counter = 0;
    }

    PT_END( pt );
}

int main( void ) {
    struct pt example_pt;
    PT_INIT( &example_pt );

    while ( 1 ) {
        example( &example_pt );
        printf( "Back in main, counter = %d\n", counter );
        counter++;
    }

    return 0;
}

Хочу добавить, что в компиляторе из Microsoft Visual Studio этот пример не работает, если при компиляции указан параметр /ZI (он по умолчанию установлен для конфигурации Debug) – можно заменить его на /Zi.

Оцените, что получилось – исключительно средствами языка C реализован простенький, из говна и палок, механизм кооперативной многозадачности. Если добавить к нему планировщик и, скажем, какой-нибудь таймер, то получится та самая операционная система Contiki – названная в честь построенной из тех же говна и палок лодки Тура Хейердала. Теоретически, в Contiki есть и механизм вытесняющей многозадачности – но реализован он не для всех архитектур, в отличие от кооперативной, для которой достаточно лишь компилятора C. Это позволяет “портировать” ядро Contiki куда угодно.

Какие же у этого подхода недостатки? Начну с очевидного – использовать одновременно и protothreads, и конструкцию switch нельзя. Другая нехорошая штука – при переходе потока в состояние ожидания и выходе в планировщик теряются значения всех локальных переменных внутри функции этого потока. Это довольно неприятно, так как требует постоянно держать в голове “нестандартное” поведение программы. Бороться с этим можно либо объявляя локальные переменные потока, как static, либо используя глобальные переменные. Наконец, ждать событий можно только в основной функции потока, что резко ограничивает “полет фантазии” в реализации какой-то нетривиальной логики.

Впрочем, все это позволяет реализовать некоторое количество не очень сложных примеров – которые и составляют большую часть “дистрибутива” Contiki.