Уже много лет известна такая бесплатная CAD-программа, как FreeCAD. Если посмотреть ютуб-ролики, то можно убедиться, что умеет эта программа практически всё. Вот только порог вхождения в нее очень не очень... Особенно, после Fusion360. Но делать особо нечего, нужно переползать на опенсурсные альтернативы и происходит это, скажем так... со скрипом.
Главное неудобство — в оригинальном фрикаде нельзя нарисовать скетч, а потом разом на нем повыдавливать карманов, выступов и т.д. Нужно развлекаться с разными верстаками: Part, Part Design... Говорят, есть и куча других неудобств, но они возникают настолько стихийно, что лично я ничего особенного не запомнил.
И вот забрезжил свет в конце туннеля. Уже несколько лет активно развивается форк фрикада — realthunder Freecad link branch, который позволяет создавать модель «одним эскизом», плюс там куча других плюшек. Скачать можно с гит-репозитория, там же инструкция по установке.
А вообще, лучше один раз увидеть, например, тут (советую поставить скорость 2х):
https://www.youtube.com/watch?v=dWiTNMhEuac
Ну и вот еще плейлист с пошаговой настройкой:
https://www.youtube.com/playlist?list=PL6Fiih6ItYsWCE20KtUJYpiDPrCA2rVpN
1. Введение
Несмотря на то, что COM-порт на компьютерах и ноутбуках ушел в прошлое чуть ли не в начале этого века, сам протокол RS-232 до сих пор живет и здравствует. По большому счету, ни один микроконтроллер, ни одно встраиваемое решение не лишено хотя бы одного UART/USART интерфейса. А если его и нет, то его делают программно. В повседневной жизни про USART вспоминают, например, после окирпичивания роутера, да и прошивку зачастую можно перезалить только с его помощью.
Бывают и другие задачи: например, вы купили USB-датчик, а программа с ним не хочет работать. Да еще и выдает максимально «информативную» ошибку вроде «ошибка 41, нет связи с устройством». При этом лампочка на устройстве моргает, как бы намекая, что связь-то есть... Вот было бы здорово узнать, что за пакеты улетели, а главное, отреагировала ли на них наша USB-железка.
2. Ложка дегтя
Если вы знакомы с сетевыми снифферами (будь то гуишный wireshark или консольный tcpdump), то вы, конечно, знаете, насколько просто прослушивать трафик (разумеется, если он не зашифрован). Для этого достаточно подключиться к нужному интерфейсу и дальше наблюдать за байтиками.
Так вот. Для UART это невозможно. От слова совсем. Вот выжимка из вольного перевода FAQ сниффера jpnevulator, который мы как раз и будем использовать далее:
Сначала плохие новости: два процесса GNU/Linux не могут одновременно открыть один и тот же последовательный порт. Если это происходит, результаты могут быть непредсказуемыми.
Сожалею, но Jpnevulator не создавался для работы в режиме «посредника» между ядром и вашим приложением.
Я обычно использовал Jpnevulator в паре с устройством, которое сидело как бы в разрыве последовательного кабеля. На выходе из устройства дублировалось всё, что поступало на вход. Получалось что-то вроде «человека посередине» (man in the middle).
3. Бочка меда
Продолжаем читать FAQ:
Теперь, как кажется, хорошие новости: некоторое время назад Эрик Шатоу (Eric Shattow) предложил использовать псевдотерминальные устройства для реализации работы «посредника» между ядром и вашим приложением. Поддержка псевдотерминальных устройств пока что недостаточно тестировалась, но это работает.
То есть, логика проста: к последовательному порту устройства подключается тулза jpnevulator, которая открывает «виртуальный» порт, на который уже будет цепляться оригинальная программа. Как будет показано далее, работает такая связка, прямо скажем, не очень стабильно, да и о высоких скоростях (вроде baudrate 115200) придется по-видимому забыть. Однако, это явно лучше, чем ничего.
4. Установка софта и первые тесты
Для дальнейших экспериментов вам нужен будет любой USB-USART преобразователь. Предполагается, что вы знаете, что это такое и как с ним работать в Linux, иначе зачем вообще вам эта статья :-)
Так же установим необходимый софт: jpnevulator и cutecom. Первое — это уже упомянутый сниффер, а второй — обычный последовательный терминал с графическим интерфейсом.
sudo apt-get install jpnevulator minicom
Ну и весьма желательно, чтобы текущий пользователь входил в группу dialout, чтобы иметь права на чтение-запись в последовательный порт без необходимости заходить под рута.
Теперь откройте cutecom. Далее подключитесь к вашему USB-USART и замкните RX и TX на нем. Проверьте, что всё работает как надо: при отправке текста в поле input, этот текст должен одновременно появиться в верхнем и нижнем окне:
Получилось? Тогда закрывайте порт и пока выйдите из программы.
Дело в том что cutecom не позволяет прописывать «виртуальные» порты в самом интерфейсе. Это можно сделать в конфиге, который автоматом создается в домашней директории при первом открытии ~/.config/CuteCom/CuteCom5.conf. К конфигу вернемся позже, а пока зайдите в консоль и введите команду:
jpnevulator --read --tty=/dev/ttyUSB1 --pty --pass --ascii
Кратко по параметрам:
После запуска команда выведет что-то вроде
jpnevulator: slave pts device is /dev/pts/12.
То есть открылся порт /dev/pts/12. Далее, отредактируйте файл ~/.config/CuteCom/CuteCom5.conf и замените в Device порт ttyUSB на /dev/pts/12 (у вас будет свой).
Теперь можно запустить cutecom: там будет ваш псевдодевайс. Нажимайте open, вводите в поле input слово test и смело нажимайте Enter... Ааааа! Что происходит?!
В консоли как-будто что-то взбесилось. Ну а что вы хотели? Порт-то мы не настроили. Да, в саму программу настройку порта не завезли, его нужно настраивать предварительно самому. Закрываем порт, стопаем jpnevulator и перетыкаем заново USB-USART. Теперь в консоли набираем:
stty 9600 ignbrk -brkint -onlcr -icrnl -imaxbel -opost -isig00icanon -iexten -echo noflsh </dev/ttyUSB1
Вместо /dev/ttyUSB1, разумеется, свой порт. Снова запускаем jpnevulator, открываем псевдотерминал в cutecom и пишем test. Теперь всё прошло гладко:
В выводе jpnevulator можно видеть два блока: после /dev/pts/12 идет то, что мы послали на устройство, а после /dev/ttyUSB1 — то, что устройство ответило. Теперь посмотрим, как можно посниффить прошивку микроконтроллера.
5. Практика: подключаемся по JTAG
Для прошивки и отладки микроконтроллеров AVR по JTAG-интерфейсу существует внутрисхемный отладчик JTAG ICE, который хотя и считается устаревшим, продолжает быть популярным: как по причине низкой цены, так и по причине того, что его достаточно несложно собрать «на коленке». А еще проще — сжечь. Потому что он не прощает даже секундной переполюсовки, что и произошло с одним моим экземпляром на новогодних праздниках.
Собственно, это и послужило главным поводом раскурить работу снифферов в линуксе. По итогу подтвердилось, что отладчик мертв (хотя и не совсем — через раз нужные байты частично прилетали), что делает его не особо интересным для дальнейшего разбора (ну что вы, в самом деле, рандомных байтов не видели?). Так что достаем из кармана еще один «Эмулятор льда usb AVR JTAG» и начинаем эксперименты.
Как уже упоминалось, через сниффер не получается гнать большие скорости. К счастью, в avrdude кроме режима jtag1 (скорость 115200 бод) предусмотрен еще jtag1slow со скоростью 19200 бод.
Сначала настраиваем интерфейс (делается при каждой перезагрузке, либо повторном втыкании отладчика в usb порт).
stty 19200 ignbrk -brkint -onlcr -icrnl -imaxbel -opost -isig -icanon -iexten -echo noflsh </dev/ttyUSB2
Обратите внимание, интерфейс в данном случае /dev/ttyUSB2 (у вас будет свой).
Так же предварительно проверим, что отладчик всё еще работает как надо и успешно определяет микроконтроллер.
avrdude -F -c jtag1slow -P /dev/ttyUSB2 -p m16
jpnevulator --read --tty=/dev/ttyUSB2 --pty --pass --ascii
Далее снова запускаем avrdude, но теперь в качестве интерфейса указываем /dev/pts/1 (у вас он будет другой, в зависимости от вывода команды выше).
avrdude -F -c jtag1slow -P /dev/pts/1 -p m16
Для того, чтобы понять, что в сниффере означают те или иные байты, следует ознакомиться с протоколом JTAG ICE — см. appnote AVR060 в архиве ниже, либо его краткий перевод (зеркало).
Смотрим дальше:
Таким образом, мы установили параметры для отладчика: размер страницы ОЗУ 128 байт (0x80), размер страницы EEPROM — 4 байта. Что полностью соответствует документации на Atmega16.
В заключение, приведу еще небольшой отрывок — во время записи прошивки.
Вывод самой программы:
Видно, что прошивка прошла успешно (1), а вот проверка (чтение прошивки) — неудачно. С чем это связано сказать довольно сложно, скорее всего нужно подстраивать параметры порта. Но уже это дает возможность увидеть через сниффер, как идет заливка прошивки на микроконтроллер.
Заключение
Мы рассмотрели далеко не все возможности сниффера jpnevulator, но этого уже достаточно для того, чтобы заглянуть «под капот» любого протокола или программы, работающей по RS-232 интерфейсу. Тулза более чем адекватно справляется с поставленной задачей — особенно с учетом того, что она бесплатная.
Так уж сложилось, что для изготовления шаблонов для фоторезиста у меня используется лазерный принтер. Да, немного убегают размеры. Да, изготовление двусторонних плат нередко превращается в квест «совмести несовместимые переходки на отпечатках». Но это всё решаемо, взамен же мы получаем гораздо больший ресурс печати, головки не сохнут, а отпечатки хранятся гораздо дольше (не в пример пленкам с желатиновым слоем для струйных принтеров). Врочем, мы здесь не ради холивора лазерный/струйный принтер, а скорее вот за этим (см. КДПВ ниже).
Знакомо? Тогда добро пожаловать под кат.
Когда мне надоело извращаться, я решил покончить с проблемой распечаток шаблонов раз и навсегда. Во-первых, заказал на авито старенький HP LaserJet 1020 — без этих ваших хипстерских новомодных eco-режимов. Далее купил несколько стопок ломондовской пленки для лазерных принтеров. Казалось бы, бери да печатай. Но первый же распечаток пошел комом. И второй... И третий... И десятый... Какие бы настройки принтера я не выставлял, упорно получался дуршлаг с грязью по краям:
В какой-то момент я случайно взял пленку из другой упаковки и внезапно результат оказался весьма приемлемым:
Проверил еще несколько раз, действительно, пленка из другой упаковки печатала как надо: без пропусков и грязи. Решив, что просто в первой упаковке брак, я на некоторое время забыл об этой проблеме. А потом удачная стопка закончилась, я взял третью упаковку, начал печатать и... Опять та же история!
Поигравшись немного с настройками принтера и убедившись что это не помогает, взял пленку из четвертой упаковки — результат аналогичный (хреновый). Так в чем же разница? На вид пленка курильщика и пленка здорового человека были совсем одинаковы: даже под микроскопом фактура была схожей. А что если виновато... статическое электричество? Снять его можно очень просто при помощи влажной салфетки (те которые гигиенические, с пропиловым спиртом). Протираем, даем высохнуть, печатаем.
Грязь по краям почти пропала, вот только полосы... Но уже гораздо лучше! Напоминаю, что было вот так:
Идем дальше. Протираем пленку влажной салфеткой, а следом — сухой бумажной. Печатаем.
Как по мне, отличный результат! Надеюсь, кому-то это сэкономит кучу нервов и пленки.
Постскриптум
Спасибо за комментарий Technicum505SU (портал easyelectronics), дело было в заземлении — розетка была без заземляющего провода.
Подключил принтер к другой розетке и всё распечаталось успешно! Более того, когда я вернул принтер обратно на старую розетку (хотел сделать печать для сравнения), он продолжил печатать нормально (хотя по краям заметны дефекты)!
На фото ниже: печать на принтере с заземлением, дальнейшая печать без заземления, дальнейшая печать без заземления из другой «неудачной» стопки.
Давно хотел завести что-то подобное, и вот результат новогадских праздников. Добро пожаловать
Предисловие
Несмотря на КДПВ, данная статья не ставит своей целью «хайпануть» на модной во все времена теме контрафакта. По правде говоря, ее могло и не появиться, но обо всем по порядку. Не так давно на сайте 3dtoday появилась очередная заметка о «неправильном» ацетоне — на этот раз тему поднял booroondook. Оставим в стороне комментарии, которые несколько огорчают, главное в другом — с автором удалось пересечься, взять образцы «хорошего» / «плохого» ацетона и довезти их до лаборатории. Кому интересно, чем все закончилось и как с этим жить — просим под кат. Всем, кто бездумно предлагает перегнать плохой ацетон, «потому что в нем много воды», посвящается...
Образцы разлили по пробиркам Эппендорфа, пометили соответственно «+», «—» и «N» (new) и поместили туда по кусочку ABS-пластика. Пробирки закрыли и оставили на двое суток.
Хорошо видно, что пластик в «плохом» ацетоне остался практически без изменений. Кроме того, наблюдался небольшой запах спирта, что наталкивало на определенные мысли.
2. Присядем на дорожку...
Следующий шаг — проверка на хроматографе. Для тех, кто не знает, что такое хроматография, небольшое отступление. При желании эту часть можно пропустить, но лучше прочтите — тогда диаграммы, которые пойдут ниже, не будут такими скучными (-:
Все вы знаете, что такое активированный уголь (АУ). И для чего он нужен знаете тоже (-: АУ является эффективным поглотителем (адсорбентом), и это используется во многих отраслях: начиная очисткой сточных вод, заканчивая таблетками, которые можно найти почти в каждой аптечке. Если у вас в аптечке не уголь, а какой-нибудь полисорб или энтеросгель, это тоже адсорбенты. Уголь в противогазах, в домашнем воздухоочистителе итд — все это примеры использования адсорбентов. К чему это я?
Адсорбенты можно использовать не просто для поглощения, но и для разделения смесей на компоненты. Представьте себе обычную метровую трубку из алюминия диаметром 3-4 мм. Наполним трубку активированным углем и начнем пропускать через нее инертный газ гелий (тот самый, из воздушных шариков). Пока ничего интересного.
Не прекращая подавать гелий, нагреем трубку до 100 градусов и впрыснем микрошприцом смесь спиртов — метанол (от которого слепнут), этанол (который пьют) и пропанол (который не пьют, но добавляют во всякие незамерзайки и влажные салфетки). Много не надо, максимум 10 микролитров. Что произойдет? Сначала спирты поглотятся — адсорбируются на угле, но тут же, из-за высокой температуры, пойдет обратный процесс — десорбция. Грубо говоря, испарение с поверхности адсорбента. Испарившийся спирт будет подхвачен потоком гелия, совсем чуть-чуть продвинется по трубке и... правильно, снова адсорбируется на АУ. В таком состоянии он будет пребывать недолго — опять испарение, опять небольшое продвижение по трубке и снова поглощение.
Похоже на бег с препятствиями, не правда ли? «Препятствия» у нас одни и те же, а вот «бегуны» отличаются. Логично, что первыми к финишу придут те, кто легче преодолевает эти самые препятствия. Это применимо и к нашему углю со спиртами. Метанол поглощается на угле хуже остальных, потому он будет быстро проходить этапы: «адсорбция-десорбция-адсорбция-десорбция» и выйдет из трубки раньше. Этанол поглощается лучше, потому это будет уже «адсорбция-десооорбция-адсорбция-десооорбция», он выйдет следующим. Пропанол, как вы догадываетесь, будет самым медленным: «адсорбция-десооооорбция-адсорбция-десооооорбция».
К сожалению, до сих пор нет таких приборов, чтобы прям сразу, как в мультике, определило вещество и нарисовало его 3D молекулу. Потому, идут обходным путем. Что можно измерить? Ну, например, можно измерять теплопроводность газа. Детектор так и называется — детектор по теплопроводности (ДТП, или более благозвучное, катарометр).
Пока из трубки выходит чистый гелий (никто не дошел до финиша), катарометр будет показывать одно и то же напряжение. С появлением первых молекул метанола на выходе из трубки, напряжение на катарометре начнет возрастать, дойдет до пика и постепенно снизится до первоначального уровня (когда весь метанол выйдет из трубки), следующим пойдет этанол — опять напряжение возрастет итд. Если записывать значения напряжений, а потом построить график, то мы получим примерно следующую картину:
Из диаграммы видно, что пики отличаются двумя вещами: время появления (выхода) и площадь. По времени выхода можно с определенной вероятностью судить о том, какое это вещество. По размеру пика (по его площади) можно сказать сколько этого вещества, определить его концентрацию. Увы, на практике все гораздо сложнее, одинаковые площади пиков разных веществ будут соответствовать их разным концентрациям и... И мы не будем вдаваться в эти дебри, приступим уже к практике!
3. Подключаем тяжелую артиллерию
Набираем 10 мкл «плохого» ацетона, отправляем его в хроматограф и получаем диаграмму:
По опыту, последний пик соответствует ацетону, первый — воде. Но что это за пик между ними? Судя по слабому запаху спирта, это может быть пропанол. Что ж, вполне логично, ацетон запрещен к свободной продаже в концентрации более 60% (точнее, не запрещен, а подлежит отдельному контролю), а потому магазин продает под видом ацетона некий растворитель. Ну а что? Ацетоном пахнет, даже частично что-то растворяет... Ладно, это тема отдельного обсуждения, коснемся ее в конце статьи, а пока просто возьмем и вколем в хроматограф чистый пропанол:
Хорошо видно, что пик пропанола (справа) совсем не совпадает по времени выхода со вторым пиком предыдущей хроматограммы. То есть, постороннее вещество в «плохом» ацетоне — явно не пропанол. Что там дальше у нас? Перед пропанолом идет этанол (ну тот, который пьют), но вряд ли производители стали бы мешать ацетон с чистым «питьевым» спиртом. Начинают подтверждаться худшие предположения. Неужели... Надеясь ошибиться, закалываем в хроматограф чистый метиловый спирт (метанол):
Ну что же, время выхода не совсем совпадает со вторым пиком «плохого» ацетона, это объясняется тем, что мы вкололи много метанола. По крайней мере, становится понятно, в каком направлении копать. Теперь добавим метанол к «плохому» ацетону (0,1 мл) и проверим: если на хроматограмме появится новый (четвертый) пик, то метанола в нем нет, если же второй пик увеличится, то вывод очевиден.
Итак, добавляем 100 мкл (0,1 мл) метанола в «плохой» ацетон, закалываем в хроматограф, смотрим хроматограмму:
Что мы видим... По сравнению с первой хроматограммой, площадь второго пика возросла почти на 20 процентов. Таким образом, в «плохом» ацетоне с вероятностью 99% содержится метанол (!). Но сколько? Сделав прикидочные расчеты на клочке бумаги, пробуем приготовить 50% раствор. Смешаем по 0.5 мл чистых ацетона и метанола (их плотность практически одинакова, так что сильной погрешности не будет) и заколем это в хроматограф.
Составим простейшую пропорцию концентрация-площадь второго пика:
Вот так, оказалось, что под видом ацетона продали 45% раствор какой-то посторонней жидкости в ацетоне, подозрительно напоминающей метиловый спирт. Это не считая примерно 5% воды. Можно было бы и точнее определить, но смысл... Для сравнения, так выглядят легкие здорового человека хроматограммы «плохого», «хорошего» и «нового» ацетона:
К сожалению, простых химических способов однозначно определить метиловый спирт не так много, причем часть из них дорогостоящи, а другие бесполезны в присутствии ацетона, потому на этом пришлось остановиться.
4. Как определить чистоту ацетона в домашних условиях
Если кратко — никак. Я серьезно, если вы купили ацетон, а он не растворяет ABS-пластик (к примеру), то лучшее, что вы можете сделать, это завернуть его в газетку и донести до ближайшей помойки. Ну или попытаться вернуть в магазин, как товар ненадлежащего качества (об этом так же чуточку поговорим в конце статьи). Здоровье дороже. Но поскольку нашему человеку запрещать что-то бессмысленно, лучше я приведу способ, когда однозначно от жидкости с этикеткой «ацетон» следует избавиться.
Начнем с простого. При какой концентрации ацетон перестает растворять ABS-пластик. Приготовим 4 раствора ацетона 60%, 70%, 80%, 90%, добавим туда ABS и оставим на сутки. После взбалтывания:
Видно, что пластик растворился только в 90% ацетоне. Иначе говоря, если в ацетоне больше 10% воды, то работать он не будет. Что это нам дает? Итак, перейдем к домашним экспериментам.
Для проверки ацетона вам потребуется медный купорос, который вы можете свободно купить в магазине удобрений. Голубые кристаллы следует растолочь в порошок и осторожно нагреть (медный купорос ядовит, надо ли говорить, что это следует делать в непищевой посуде под вытяжкой и/или на открытом воздухе?).
Получившийся порошок залейте небольшим количеством ацетона. Перемешайте. Если в ацетоне присутствует вода, через минуту белый порошок станет голубым.
На фото для сравнения чистый ацетон и ацетон с 20% воды. Если через минуту не цвет на голубой не изменился, а ABS-пластик в этом ацетоне не растворяется, то смело несите его на помойку, даже не пытайтесь перегонять. Надышитесь какого-нибудь метанолу и... Кстати, а что и? Насколько это опасно?
5. Настолько ли опасен метанол?
Началось все в далеком 2007 году, когда с легкой руки Г.Г. Онищенко вышло Постановление Главного государственного санитарного врача Российской Федерации от 11 июля 2007 г. N 47 г. Москва «О прекращении использования метилового спирта в средствах по уходу за автотранспортом» . В нем говорится:
Метиловый спирт (метанол) является наиболее опасным токсическим веществом, по органолептическим свойствам практически не отличим от этилового спирта и в случае использования его в качестве суррогатного алкоголя приводит к летальному исходу. Вместе с тем недостаточное информирование населения о тяжелых последствиях употребления технических средств, содержащих метанол, в качестве суррогатов алкоголя, пренебрежительное отношение к факторам, наносящим вред здоровью, приводят к многочисленным случаям отравлений им в быту.
Было ли это актом заботы о населении или просто нужно было протолкнуть на рынок мало кому нужный до этого пропиловый спирт, оставим этот вопрос конспирологам и прочим рен-тв. Однако ясно, что если бы просто заявили, мол, не пейте незамерзайку с метиловым спиртом, а то ослепнете, это бы у нормального человека ничего кроме недоумения и смеха не вызвало. Вон, медный купорос при проглатывании тоже сильный яд, но это никак не мешает его свободной продаже. А потому, благодаря нашим СМИ, метиловый спирт предстал перед обывателем ядом, стоящим в одном ряду с фосгеном, цианистым калием и другими боевыми отравляющими веществами.
Так что там с нашим паленым ацетоном с метанолом? Насколько реальна опасность?
Вот вырезка из книги Тарасов А.В. Основы токсикологии: (учеб. пособие / А.В. Тарасов, Т.В. Смирнова. — М.: Маршрут, 2006. — 160 с.), страница 79:
Отравления парами метанола носят хронический характер, а острые практически не наблюдаются.
Вырезка из книги Дрогичина Э.А. «Профессиональные болезни нервной системы» (Л.: Медицина, 1968. — 272с.), страница 160:
Острые профессиональные отравления, вызванные вдыханием паров метилового спирта, протекают преимущественно в легкой форме и в отличие от пероральных отравлений сопровождаются явлениями раздражения со стороны слизистых глаз и верхних дыхательных путей. Одновременно возникают головокружение, слабость, чувство опьянения, иногда легкие расстройства зрения.
Кроме того, в постановлении о запрете метанола 2007 года так же нет ни слова об опасности вдыхания его паров, там только об опасности случайного употребления внутрь. Судя по всему, надышаться метиловым спиртом до серьезного отравления и не заметить этого надо постараться — раздражение глаз и носоглотки дадут о себе знать. Это я к тому, что поднимать панику на тему «нас травят метанолом, мы все умрем» явно не стоит. Если вы работаете даже с таким ацетоном в проветриваемом помещении, не каждый день и не употребляете его внутрь, то вам ничего не грозит. Оправдывает ли это магазин, который продал вам под названием «Ацетон» какую-то неведомую смесь? Вовсе нет!
6. Можно ли вернуть некачественный ацетон
На бутылке с ацетоном есть «Состав». Обычно там значится что-то типа 99% или 98% ацетона. По ГОСТу, даже технический ацетон должен быть концентрации не менее 99% (ГОСТ 2768-84):
Поэтому, теоретически, если у вас не растворился в ацетоне пластик, то вы можете отнести его в магазин и затребовать экспертизу. Статья 18 ЗоЗПП гласит:
Продавец (изготовитель), уполномоченная организация или уполномоченный индивидуальный предприниматель, импортер обязаны принять товар ненадлежащего качества у потребителя и в случае необходимости провести проверку качества товара. Потребитель вправе участвовать в проверке качества товара.
В случае спора о причинах возникновения недостатков товара продавец (изготовитель), уполномоченная организация или уполномоченный индивидуальный предприниматель, импортер обязаны провести экспертизу товара за свой счет ... Потребитель вправе присутствовать при проведении экспертизы товара и в случае несогласия с ее результатами оспорить заключение такой экспертизы в судебном порядке.
Если в результате экспертизы товара установлено, что его недостатки возникли вследствие обстоятельств, за которые не отвечает продавец (изготовитель), потребитель обязан возместить продавцу (изготовителю), уполномоченной организации или уполномоченному индивидуальному предпринимателю, импортеру расходы на проведение экспертизы, а также связанные с ее проведением расходы на хранение и транспортировку товара.
То есть, на бумаге все красиво. Вы приходите в магазин с бутылкой и чеком, говорите продавцу, что его ацетон никудышный, потому что не растворяет пластик, если продавец отказывается возвращать деньги, пишете претензию с требованием экспертизы, через 45 дней получаете обратно свои деньги. Или расстаетесь со своими деньгами (вы ведь не знаете, на чьей стороне будет экспертиза) и дальше идете по судам. Оно вам надо? Просто не покупайте больше ацетон данного производителя, не так он дорого стоит.
7. Еще немного о законах
Как уже упоминалось выше, ацетон является прекурсором, т.е. веществом, которое (по мнению нашего правительства) является важным компонентом при изготовлении наркотиков, взрывчаток и прочих незаконных штук. Прекурсоры бывают разные, некоторые (как, например, нитроэтан) физлицу вообще не купить. Другие купить можно. Например, ацетон с концентрацией выше 60% находится в таблице III прекурсоров «оборот которых в Российской Федерации ограничен и в отношении которых допускается исключение некоторых мер контроля». К мерам контроля относится регистрация в специальных журналах любых операций с прекурсорами. То есть, при покупке в магазине ацетона, этот факт должен регистрироваться отдельно и (в идеале) продавец должен пробить по этому товару отдельный чек, записать в журнал сколько именно вы купили ацетона, а также ваше ФИО. Видели что-то такое в реальности? Конечно, нет (-:
Но как же так получается, что некоторые магазины продают ацетон? Ну во-первых, как видим, это не всегда ацетон. Во-вторых, видимо, это пока никому не мешает. Вот помешала продажа этанола серьезному бизнесу, ну и где теперь его купишь, даже в качестве растворителя? В общем, вопрос «как» — это явно не тема данной статьи.
Главные выводы
Заключение и отказ от ответственности
Автор статьи не представляет официальную аттестованную лабораторию. Выводы о содержании метанола в ацетоне могут быть ошибочны и базируются исключительно на общих принципах хроматографии. На самом деле, это мог быть не метанол, а что-то другое. С похожей хроматограммой. И похожей плотностью. И похожим запахом. В общем, главный посыл статьи — не надо советовать перегонять некачественный ацетон. В нем может быть не только вода, но и другая бяка, даже более вредная, чем ацетон. Всем добра и хорошего настроения (-:
1. Пустой треп
Не знаю как у других, но у меня при изготовлении плат главный источник ненависти — это переходные отверстия. До некоторого времени я обходился пропаиванием кусочков проволочки с обеих сторон. И проблема даже не столько в геморе запаивания (откуси, заканифоль, залуди, пропаяй), сколько в невозможности дальше использовать фен. И ладно при запайке: в 99% можно обойтись паяльником. А если нужно выпаять? Особенно QFN. Тут нужен фен. И пока выпаиваешь микруху, есть шанс потерять переходку (например, проволочка внутри сместится или вообще выпадет). Когда-нибудь обязательно прокачаю скилл evsi и забахаю химическую металлизацию, а пока приходится искать другие варианты. Подробности под катом.
2. Откуда растут ноги
На одном популярном ресурсе уже писали лет шесть назад о механической металлизации. «Прикольно», — подумал тогда я и пошел дальше паять проволочки. Потому что 0.1-0.2 евро за одну заклепку — это как-то перебор. Видимо по этой причине купить их можно только в Китае, в Москве их нет ни в одном магазине. И тут на днях наткнулся на статью о заклепках из говна и палок. Прочитал, стибрил идею вдохновился, опробовал, усовершенствовал, решил написать свою статью.
Самый маленький диаметр — это под провод 0.14 квадратов (внешний диаметр втулки 1 мм):
В магазинах обычно продается под названием «Втулочный наконечник Klauke 0,14 мм2». Продается по 1-100 штук, стоит около трех рублей за штучку.
Кроме того понадобится кренер. Я юзаю автоматический, вы можете расклепывать молоточком.
4. Сама технология
Берем плату, кладем на подложку (высота подбирается опытным путем, у меня она составила 3 листа ломондовского картона). В переходное отверстие помещаем втулку:
Начинаем раскачивать втулку в разные стороны, пока не отломится:
Можно конечно просто обрезать кусачками, но тогда втулка сминается и при расклепывании рвется (ниже будет показан пример).
Теперь берем картон подходящей толщины (я взял так же три листа Ломонда). Картон должен быть достаточно толстым, чтобы не его не пробило насквозь и достаточно мягким, чтобы при расклепывании заклепка немного в нем утонула. Помещаем его на металлическое основание, на него кладем плату, вставляем туда получившуюся заклепку, берем кернер и расклепываем:
Результат:
Переворачиваем:
После расклепки:
Диаметр расклепки ~2 мм.
Тестовая плата:
Обратная сторона:
Красным обведены как раз порвавшиеся заклепки, которые обрезались кусачками.
5. Выгоды
Итак, такие заклепки:
Из недостатков можно выделить разве что относительно большой диаметр расклепки (2 мм), что может быть неприемлемо на миниатюрных платах. В общем, за сим все, данная технология мне очень зашла, надеюсь и вам будет полезно.
1. Водная часть
Во всех микроконтроллерах (мк) есть такая полезная штука, как сторожевая псина (watchdog), призванная для одной цели: искать и уничтожать ребутать мк в случае его зависания. Если основная программа в каком-то месте не успела сбросить таймер watchdog, то ее ждет аварийный ребут. И если в любительских устройствах поговорка «семь бед ― один резет» еще допустима, то в случае более серьезного использования желательно узнать причину перезагрузки. Но ведь после перезагрузки все данные потеряны, искать больше нечего. Или нет?
2. Инструменты
В качестве среды разработки мы будем использовать IAR (IAR Embedded Workbench for Arm, version 8.50.6), в качестве подопытного мк ― stm32f030f4p6, в качестве тоника ― чай, кофе, шило в...
3. Ой, а кто это сдееелал?
Если верить мануалу, то при перезагрузке мк сбрасываются в дефолт все регистры, кроме RCC_CSR. По его состоянию можно определить, почему произошел ребут. Вотчдогу выделен бит IWDGRSTF, вот его и будем использовать:
... //инициализация переменных итд ... void main(void) { if (RCC->CSR & RCC_CSR_IWDGRSTF) { while(1) { lcd_str("Ошибка в программе", 0); //вывод сообщения на дисплей/в терминал/etc sleep(100); } } //whatchdog init - обратите внимание, что собаку инитим ПОСЛЕ сообщения об ошибке IWDG->KR = 0xCCCC; /* (1) */ IWDG->KR = 0x5555; /* (2) */ IWDG->PR = IWDG_PR_PR_1; /* (3) */ IWDG->RLR = 0xFFF; /* (4) */ while(IWDG->SR); /* (5) */ while (1) { //тут код программы }
Бит IWDGRSTF сбрасывается вручную, либо по питанию (просто замкнуть reset не прокатит). Это очень удобно — после аварийного ребута можно например корректно остановить все оборудование, которым управляет мк, вывести на экран сообщение об ошибке, включить сигнализацию и ждать ответного гудка решения оператора. Но вот оператор подошел, увидел неполадку, а дальше что? Максимум что он может сделать — это включить/выключить устройство из розетки и написать разработчику, что его поделка зависает. Это, конечно, лучше, чем просто бездумный ребут, но хотелось бы больше информации. И тут на помощь приходит... Оперативка!
Все дело в том, что ОЗУ при перезагрузке мк через watchdog практически остается нетронутой. Вот если бы можно было заранее записать туда полезную информацию (например, номер строки зависания), а при ребуте прочитать...
4. Память: краткий экскурс по секциям
При компиляции программы формируется объектный файл, который поделен на секции:
Строго говоря, секция bss физически в файле отсутствует, т.к. она инициализирована нулем, но это тема отдельной статьи, для упрощения примем следующую схему: код (.text) попадает во флеш-память, данные (.data) — тоже во флеш, но из расчета, что они будут доступны в оперативной памяти, .bss — в оперативную память.
5. Хачим конфиг линкера
Сначала идем в конфиг проекта и выбираем раздел Linker
Во вкладке Config надо нажать галку Override default, потом скопировать дефотный файл icf в папку с проектом и выбрать новый путь к файлу.
Далее создаем следующие файлы
extern unsigned int debugvar; // - explicit init
#include "separately_inited_vars.h" unsigned int debugvar=0; // - explicit init
/*###ICF### Section handled by ICF editor, don't touch! ****/ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08000000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; define symbol __ICFEDIT_region_ROM_end__ = 0x08003FFF; define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; define symbol __ICFEDIT_region_RAM_end__ = 0x20000FFF; /*-Sizes-*/ define symbol __ICFEDIT_size_cstack__ = 0x400; define symbol __ICFEDIT_size_heap__ = 0x400; /**** End of ICF editor section. ###ICF###*/ define memory mem with size = 4G; define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; initialize by copy { readwrite }; place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv CUT HERE vvvvvvvvvvvvvvvvvvvvvvvvvv */ place in ROM_region { readonly }; place in RAM_region { readwrite, block CSTACK, block HEAP }; /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ CUT HERE ^^^^^^^^^^^^^^^^^^^^^^^^^^ */ export symbol __ICFEDIT_region_RAM_start__; export symbol __ICFEDIT_region_RAM_end__;
/*###ICF### Section handled by ICF editor, don't touch! ****/ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08000000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; define symbol __ICFEDIT_region_ROM_end__ = 0x08003FFF; define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; define symbol __ICFEDIT_region_RAM_end__ = 0x20000FFF; /*-Sizes-*/ define symbol __ICFEDIT_size_cstack__ = 0x400; define symbol __ICFEDIT_size_heap__ = 0x400; /**** End of ICF editor section. ###ICF###*/ define memory mem with size = 4G; define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; initialize by copy { readwrite }; place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvv PASTE HERE vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */ do not initialize { section .bss object separately_inited_vars.o }; /* 1 */ initialize manually { section .data object separately_inited_vars.o }; /* 2 */ define block MYBLOCK { section .data object separately_inited_vars.o }; /* 3 */ place in ROM_region { readonly }; place in RAM_region { readwrite, block MYBLOCK, /* 4 */ block CSTACK, block HEAP }; /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PASTE HERE ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ export symbol __ICFEDIT_region_RAM_start__; export symbol __ICFEDIT_region_RAM_end__;
Что тут происходит? Попробуем разобраться:
Далее прописываем в main.c следующую директиву:
#pragma section = "MYBLOCK"
Готово! Теперь напишем простейшую функцию:
void ram_debug(int line) { if (RCC->CSR & RCC_CSR_IWDGRSTF) return; //при аварийной перезагрузке не переназначать переменную debugvar debugvar = line; //иначе - вписать в переменную номер строки }
Как это работает. Вставляем функцию в критические участки кода:
...
ram_debug(__LINE__);
while ((USART1->ISR & USART_ISR_TC) != USART_ISR_TC); //line 156
...
__LINE__ — встроенный макрос, который вставит номер строки из исходника программы. Таким образом, при аварийном ребуте мы получим сообщение, выполнение какой строки кода этому предшествовало. Конечно, нет 100% гарантий, что причиной была именно эта строка, но в любом случае это хорошее подспорье для разбора полетов. Поправим первоначальный код:
... //инициализация переменных итд ... void main(void) { if (RCC->CSR & RCC_CSR_IWDGRSTF) { sprintf(buf, "%03d", debugvar); while(1) { lcd_str("Ошибка в строке ", 0); lcd_str(buf, 64); lcd_str(" !!!", -1); ram_debug(__LINE__); sleep(100); } } ... //инит вотчдога и остальная программа
Результат: