Взаимодействие с NIDD через SCEF с использованием утилиты Postman. Краткий экскурс в SCEF и его возможности

 Arduino  Комментарии к записи Взаимодействие с NIDD через SCEF с использованием утилиты Postman. Краткий экскурс в SCEF и его возможности отключены
мая 132020
 

https://habr.com/ru/post/489608/

Continue reading »

Подключение модулей связи 2,4ГГц на базе чипов nRF24 L01+ к микроконтроллеру

 Arduino  Комментарии к записи Подключение модулей связи 2,4ГГц на базе чипов nRF24 L01+ к микроконтроллеру отключены
мая 112020
 

Подключение модулей связи 2,4ГГц на базе чипов nRF24L01+ к микроконтроллеру

Continue reading »

ПРОЦЕСС ЗАКАЗА ПЕЧАТНЫХ ПЛАТ С КИТАЯ JLCPCB+DIPTRACE

 Arduino  Комментарии к записи ПРОЦЕСС ЗАКАЗА ПЕЧАТНЫХ ПЛАТ С КИТАЯ JLCPCB+DIPTRACE отключены
Мар 162020
 

Изготавливать платы в китае очень удобно. Заводское качество и многослойность безусловно превосходит домашние варианты изготовления плат ЛУТом.

Первым делом необходимо спроектировать плату в любом удобном редакторе, для меня это DipTrace.

Continue reading »

Схемы управления питанием

 Arduino  Комментарии к записи Схемы управления питанием отключены
Фев 112020
 

С батарейным питанием все замечательно, кроме того, что оно кончается, а энергию надо тщательно экономить. Хорошо когда устройство состоит из одного микроконтроллера — отправил его в спячку и все. Собственное потребление в спящем режиме у современных МК ничтожное, сравнимое с саморазрядом батареи, так что о заряде можно не беспокоиться. Но вот засада, не одним контроллером живо устройство. Часто могут использоваться разные сторонние периферийные модули которые тоже любят кушать, а еще не желают спать. Прям как дети малые. Приходится всем прописывать успокоительное. О нем и поговорим.

▌Механическая кнопка
Что может быть проще и надежней сухого контакта, разомкнул и спи спокойно, дорогой друг. Вряд ли батарейку раскачает до того, чтобы пробить миллиметровый воздушный зазор. Урания в них для этого не докладывают. Какой нибудь PSW переключатель то что доктор прописал. Нажал-отжал.

psw.JPG

Вот только беда, ток он маленький держит. По паспорту 100мА, а если запараллелить группы, то до 500-800мА без особой потери работоспособности, если конечно не клацать каждые пять секунд на реактивную нагрузку (катушки-кондеры). Но девайс может кушать и поболее и что тогда? Приматывать синей изолентой к своему хипстерскому поделию здоровенный тумблер? Нормальный метод, мой дед всю жизнь так делал и прожил до преклонных лет.

Continue reading »

Программирование регистра конфигурации датчика температуры DS18B20.

 Arduino  Комментарии к записи Программирование регистра конфигурации датчика температуры DS18B20. отключены
Фев 082020
 

Программирование регистра конфигурации датчика температуры DS18B20.

Сообщение Эдуард » 21 янв 2017, 23:32

Разрешающая способность датчика температуры DS18B20 может быть задана в регистре конфигурации. Возможны варианты: 9, 10, 11 и 12 битов.

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

Continue reading »

ПРОТОКОЛ 1-WIRE

 Arduino  Комментарии к записи ПРОТОКОЛ 1-WIRE отключены
Фев 072020
 

ПРОТОКОЛ 1-WIRE

1-Wire – протокол передачи данных в обе стороны по одному проводу.

Данный протокол разработан корпорацией Dallas Semiconductor (сейчас Maxim Integrated) в далёких 90-х, но активно используется и сейчас: именно на 1-Wire работает большинство «таблеток» — домофонных чипов (DS1990A), карточек доступа, а также через 1-Wire общаются популярные датчики температуры (DS18S20 и DS18B20), транзисторные ключи (DS2405, DS2406), программируемые порты ввода-вывода (DS2408), АЦП и ЦАП, часы реального времени (DS2417) и многое другое.

Continue reading »

Отправка данных с Arduino на WEB-сервер GET-запросом

 Arduino  Комментарии к записи Отправка данных с Arduino на WEB-сервер GET-запросом отключены
Фев 012020
 

Описание устройства

Вычислительным мозгом устройства является платформа Arduino UNO, для связи с сетью используется Ethernet Shield, помимо этого, я установил LCD KeyPad Shield для вывода информации о состоянии различных устройств и команд, также установил все возможные датчики и реле. Continue reading »

Устройство контроля целостности кабеля связи

 Arduino  Комментарии к записи Устройство контроля целостности кабеля связи отключены
Фев 012020
 

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

Continue reading »

Плата TTGO T-Call

 Arduino  Комментарии к записи Плата TTGO T-Call отключены
Ноя 272019
 

На протяжении многих лет компания LilyGo выпускала платы TTGO, обычно основанные на базе Espressif ESP8266 или ESP32. Вот еще один вариант, который может быть полезен, если конечно в вашей стране еще не отказались от сотовой сети 2G: TTGO T-Call. Continue reading »

Регулярные выражения в PHP.

 Arduino  Комментарии к записи Регулярные выражения в PHP. отключены
Окт 262019
 

Регулярные выражения в PHP.

Регулярные выражения позволяют найти в строке последовательности, соответствующие шаблону. Например шаблон «Вася(.*)Пупкин» позволит найти последовательность когда между словами Вася и Пупкин будет любое количество любых символов. Если надо найти шесть цифр, то пишем «[0-9]{6}» (если, например, от шести до восьми цифр, тогда «[0-9]{6,8}»). Здесь разделены такие вещи как указатель набора символов и указатель необходимого количества: Continue reading »

Полный список команд языка Ардуино

 Arduino  Комментарии к записи Полный список команд языка Ардуино отключены
Окт 172019
 

Полный список команд языка Ардуино

На этой странице представлен список всех (или почти всех) доступных “из коробки” команд для Arduino с кратким описанием и примерами. Часть информации взята из Гугла, в основном некоторые особенности языка, часть получена методом проб и ошибок. Полную информацию о том, как этим пользоваться, можно получить из уроков или официального reference. Также изо всех сил рекомендую вот этот онлайн справочник по C++, из него можно узнать гораздо больше о некоторых особенностях использования операторов и типов данных.

Continue reading »

Arduino проект выходного дня – футболка на светодио дах SK6812

 Arduino  Комментарии к записи Arduino проект выходного дня – футболка на светодио дах SK6812 отключены
Сен 162019
 

Arduino проект выходного дня – футболка на светодиодах SK6812

Continue reading »

Китайский повышающий блок

 Arduino  Комментарии к записи Китайский повышающий блок отключены
Сен 092019
 

Здравствуйте. Имеется идея изготовления повышающих dc-dc преобразователей, которые продаются на Ali-express, в домашних условиях.

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

Схему нашёл на просторах ютуба у одного человека на канале, добра ему.

Помогите определить номинал C1, C2, C7, C8, C9, C10

tl494.jpg

Изготовление плат

 Arduino  Комментарии к записи Изготовление плат отключены
Авг 212019
 

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

Итак, вводная – надо собрать дюжину плат с SMD-деталями типоразмера 0603 и Bluetooth-модулем на CC2541. Плату я нарисовал в DipTrace, заказал в Резоните изготовление собственно плат, а в OSH Stencils – трафарета из полиимидной пленки. Детали куплены частично на алиэкспрессе (собственно сами Bluetooth-модули), а частично – в Чип-и-Дипе и Электронщике. И вот со всей этой фигней мы попытаемся взлететь 🙂

paste-printer

По-хорошему, нужен трафаретный принтер, который натягивает трафарет и правильно позиционирует его относительно платы, и есть даже неплохие “самодельные” варианты – но для кустарных условий сойдет и такое приспособление из обрезков других плат той же толщины.

paste-ready

Паста размазывается чем-нибудь типа шпателя или пластиковой карты, при небольшом навыке это делается довольно быстро и непринужденно – на 12 плат у меня ушло меньше 10 минут.

placing

Расстановка деталей – довольно муторный этап, особенно, если делать это обычным пинцетом – но с перерывами я расставил две сотни деталей за два часа. Для сравнения – у самого-самого простого “любительского” установщика типа какого-нибудь Liteplacer заявленная производительность составляет 500-600 деталей в час (хотя с учетом времени на его программирование этот процесс занял бы примерно то же время).

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

into-the-oven

Дальше загружаем платы в печку.

oven-running

Это обычная бытовая электродуховка, снабженная специальным контролером, который обеспечивает “правильный” температурный профиль. Цикл пайки занимает несколько минут.

oven-done

В течение еще нескольких минут платы остывают.

boards

Готово! Остается запаять лишь пару разъемов.

Монтаж

 Arduino  Комментарии к записи Монтаж отключены
Авг 212019
 

Монтаж

И вот тут, конечно, начинается самое интересное — платы есть, компоненты есть, дальше-то что?

Главный тезис: современные платы паяльником вручную не собирают.

Даже на опытном производстве. Даже десять штук. Это попросту муторно, долго, неэффективно и некачественно. Ручная пайка нарушает главный принцип эффективности работы — монотонность. Ручная пайка — это постоянная, ежесекундная смена инструментов в руках. Если провозиться подольше не является вашей целью, так делать нельзя.

На современных платах абсолютное большинство компонентов — SMD, и более того, когда вы попробуете минимально пристойные методики сборки, вы будете плакать каждый раз, когда будете вынуждены ставить THD-компонент.

SMD-компоненты паяются пастой — смесью из флюса и микронного размера шариков припоя (мы используем Multicore CR36, но это не обязательно).

Паста наносится строго на контактные площадки компонентов одним из двух способов:

  • пневматическим — компрессором на 4-6 атмосфер (подойдёт любой с ресивером, чтобы обеспечить стабильность давления) и диспенсером типа такого. Диспенсер стоит у китайцев баксов сто и обеспечивает простую вещь — при нажатии педали подаёт в шприц с пастой воздух под заданным давлением в течение заданного времени, выжимая заданное количество пасты. Немного муторно, но среднего размера плату вы заплюёте минут за пятнадцать-двадцать, причём при определённой сноровке можно работать даже с компонентами 0402. Паста для диспенсеров продаётся уже в шприцах, мы используем EFD SolderPlus (точнее, почти не используем, ибо диспенсер минимум 364 дня в году просто покрывается пылью).
  • по трафарету — листу стали или пластика с вырезанными в нём отверстиями контактных площадок, толщиной 100-125 мкм. Трафарет кладётся сверху на плату, на него вываливается шлепок паяльной пасты и размазывается шпателем или просто пластиковой карточкой. В идеале для этого процесса нужен ручной трафаретный принтер, обеспечивающий вертикальное поднимание и опускание трафарета, но в небольших масштабах можно просто закреплять плату и трафарет малярным скотчем на столе. Обработка одной платы занимает, очевидно, всего пару минут.

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

wydtchrcepcswghlapp16zdsv_m.jpeg

Данная часть была бы не столь весёлой — трафарет штука довольно дорогая — если бы не одно чудесное изобретение человечества: режущий плоттер Silhouette Curio, предназначенный для вырезания аппликаций для скрапбуков, но также прекрасно справляющийся с «прозрачками» для проекторов. Последние имеют толщину 100 мкм — думаете, это просто так, совпадение?

Плоттер принимает на вход файлы DXF (причём в бесплатной версии софта; платная добавляет поддержку очень нужного для скрапбуков SVG) и без проблем справляется с компонентами размером вниз до SOIC и 0603. Пассивка 0402 выходит похуже, но ещё приемлемо, а во всяких QFN приходится убирать отдельные ножки и делать сплошную прорезь.

Это, конечно, не трафарет для производства десяти тысяч устройств. Но возможность таки сделать трафарет, вполне себе подходящий для большинства несложных конструкций, на оборудовании за 14 тысяч рублей, без мокрой химии и вообще каких-либо значимых отходов, а также за пятнадцать-двадцать минут времени — бесценна.

После вырезания и намазывания идёт расстановка деталей.

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

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

В отличие от обычных пинцетов, эта штука позволяет брать компоненты любой формы и с любой поверхности, в том числе прямо из лент, а в отличие от механических вакуумных пинцетов с кнопкой и резиновой грушей внутри, не даёт рывка при отпускании детали. Стоит такой пинцет копейки — меньше 1500 рублей у китайцев, а при желании можно сделать и самому натурально из аквариумного воздушного компрессора. Иголки со временем забиваются паяльной пастой, но без проблем покупаются отдельно, как наборами разного диаметра, так и пакетами одного диаметра по 10-20-50-100 штук.

Обычным пинцетом останется расставить только самые крупные компоненты, вроде процессоров в LQFP-корпусах.

Важный момент: на дворе XXI век, расстановку по бумажной распечатке из CAD’а никто уже не делает.

Для ручной расстановки есть небольшая и крайне полезная программа VisualPlace, которая всасывает в себя герберы, перечень компонентов и их координаты на плате — и показывает вам, где какой компонент должен стоять, а также в какой ориентации:

evkvnpabpeihivvznqryiljfoxa.png

Более того, VisualPlace умеет группировать компоненты по полю value, так что, взяв в руки катушку транзисторов SI2333 и ткнув в группу с ними, вы увидите сразу все места, где они должны стоять.

Авторами утилита писалась явно в первую очередь для себя (и, кстати, они же делают прекрасную маленькую терминалку Termite), поэтому, с одной стороны, она не перегружена ненужным хламом и красивыми иконками, с другой — есть много шероховатостей в понимании единиц измерения (дюймы или миллиметры), точки отсчёта координат в герберах (рекомендую всегда ставить начало на нижний левый угол платы) и т.п. На это иногда накладываются ещё и особенности CAD’ов — например, DipTrace на системе с русской локалью сохраняет числа с десятичным разделителем «,», а VisualPlace ждёт «.» независимо от локали.

Впрочем, подгонка выхлопа CAD под VisualPlace занимает от силы несколько минут, а пользу утилиты переоценить невозможно. Утилита официально бесплатна для коммерческого использования.

Где-то примерно в этот момент вы почувствуете всю прелесть такого подхода к монтажу. Сравните — паяльник:

  • в правую руку паяльник, в левую — припой
  • поставить каплю припоя на одну площадку резистора
  • отложить припой, отложить паяльник
  • вытряхнуть резистор из ленты, перевернуть маркировкой вверх
  • в левую руку пинцет, взять резистор пинцетом, поставить на плату
  • не отпуская резистор, взять в правую руку паяльник, прихватить ту площадку, на которую был нанесён припой
  • отложить пинцет, взять припой
  • прихватить вторую площадку
  • повторить для остальных 146 компонентов

Паста:

  • намазать всю плату пастой
  • взять вакуумный пинцет, расставить все компоненты прямо из лент и поддонов
  • сунуть плату в печку

О, да. После того, как вы расставили компоненты (ставить надо с небольшим усилием, чтобы они впечатались в пасту), приходит пора печки.

Задача печки — нагреть пасту с заданной скоростью до 140-160 градусов (температура активации и испарения флюса), потом до 220-230 (плавление припоя), подержать недолго и охладить.

Строго говоря, на совсем штучных изделиях можно прогревать пасту феном, но это годится только буквально на 5-10 экземпляров, а также подвергает компоненты серьёзному стрессу из-за больших градиентов температур. Печка же греет равномеро и плавно.

Опять же, что очень радует — хотя китайцы делают вполне себе недорогие печки, совсем самодельную можно сделать из совершенно грошовой электродуховки (я не рекомендую данную конкретную модель, это просто ссылка) или аэрогриля, добавив к ним сделанный хоть на Arduino контроллер температуры, выдерживающий нужный профиль по градусам и по минутам. Стоимость такого решения в наколенном варианте будет меньше 5 тысяч рублей за всё в сумме.

Собственно, всё. После запекания остаётся на компонентах с мелким шагом проверить ножки на предмет возможных залипаний (вопреки утверждениям в многочисленных руководствах — нет, паяльная паста далеко не всегда сама идеально собирается точно на ножке, если её чуть больше, чем надо, или размазана она сильнее, чем надо — поверхностного натяжения не хватит, чтобы разорвать перемычку между соседними ножками), всё найденное убрать обычным паяльником, на чипах с длинными ногами и мелким шагом, вроде LQFP или TSSOP с шагом 0,5 мм, — с оплёткой для выпайки.

Изменение размера изображения средствами PHP

 Arduino  Комментарии к записи Изменение размера изображения средствами PHP отключены
Авг 212019
 

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

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

<?php class SimpleImage { var $image; var $image_type; function load($filename) { $image_info = getimagesize($filename); $this->image_type = $image_info[2]; if( $this->image_type == IMAGETYPE_JPEG ) { $this->image = imagecreatefromjpeg($filename); } elseif( $this->image_type == IMAGETYPE_GIF ) { $this->image = imagecreatefromgif($filename); } elseif( $this->image_type == IMAGETYPE_PNG ) { $this->image = imagecreatefrompng($filename); } } function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) { if( $image_type == IMAGETYPE_JPEG ) { imagejpeg($this->image,$filename,$compression); } elseif( $image_type == IMAGETYPE_GIF ) { imagegif($this->image,$filename); } elseif( $image_type == IMAGETYPE_PNG ) { imagepng($this->image,$filename); } if( $permissions != null) { chmod($filename,$permissions); } } function output($image_type=IMAGETYPE_JPEG) { if( $image_type == IMAGETYPE_JPEG ) { imagejpeg($this->image); } elseif( $image_type == IMAGETYPE_GIF ) { imagegif($this->image); } elseif( $image_type == IMAGETYPE_PNG ) { imagepng($this->image); } } function getWidth() { return imagesx($this->image); } function getHeight() { return imagesy($this->image); } function resizeToHeight($height) { $ratio = $height / $this->getHeight(); $width = $this->getWidth() * $ratio; $this->resize($width,$height); } function resizeToWidth($width) { $ratio = $width / $this->getWidth(); $height = $this->getheight() * $ratio; $this->resize($width,$height); } function scale($scale) { $width = $this->getWidth() * $scale/100; $height = $this->getheight() * $scale/100; $this->resize($width,$height); } function resize($width,$height) { $new_image = imagecreatetruecolor($width, $height); imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight()); $this->image = $new_image; } } ?>

Скачать клаcc SimpleImage

Теперь после того как мы поместили данный файл класса SimpleImage к себе на сервер посмотрим как его можно использовать.

Следующий участок кода загрузит изображение image.jpg, изменить его ширину до 400 пикселей и высоту до 200 пикселей, а затем сохранит как image1.jpg.

<?php include('classSimpleImage.php'); $image = new SimpleImage(); $image->load('image.jpg'); $image->resize(400, 200); $image->save('image1.jpg'); ?>

Если необходимо изменить размеры изображения, основываясь только на ширине и при этом сохранить его пропорции, то сценарий сам выберет необходимую высоту. Для этого необходимо использовать метод resizeToWidth.

<?php include('classSimpleImage.php'); $image = new SimpleImage(); $image->load('image.jpg'); $image->resizeToWidth(250); $image->save('image1.jpg'); ?>

Возможно вы пожелаете изменить размер в процентном соотношении от его оригинала. Для этого существует метод scale, в качестве параметра которому передаются проценты.

<?php include('classSimpleImage.php'); $image = new SimpleImage(); $image->load('image.jpg'); $image->scale(50); $image->save('image1.jpg'); ?>

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

<?php header('Content-Type: image/jpeg'); include('classSimpleImage.php'); $image = new SimpleImage(); $image->load('image.jpg'); $image->resizeToWidth(150); $image->output(); ?>

Автор данного класса Simon Jarvis, на своем сайте предлагает следующий пример для изменения размера изображения загруженного через форму.

<?php if (isset($_POST['submit']) ) { include('classSimpleImage.php'); $image = new SimpleImage(); $image->load($_FILES['uploaded_image']['tmp_name']); $image->resizeToWidth(150); $image->output(); } else { $form = '<form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="uploaded_image" /> <input type="submit" name="submit" value="Upload" /> </form>'; echo $form; }

Вот такой очень маленький, но довольно функциональный получился класс SimpleImage, который очень пригодиться любому разработчику.

Режимы для фрез/сверл/резьбофрез по металлам, ал юминию, дереву, пластикам

 Arduino  Комментарии к записи Режимы для фрез/сверл/резьбофрез по металлам, ал юминию, дереву, пластикам отключены
Авг 152019
 

Режимы для фрез/сверл/резьбофрез по металлам, алюминию, дереву, пластикам

Дерево/Пластики Алюминий (стр.58) Металлы (стр.59) Резьбофрезы (стр.61) Свёрла (стр.62)

Гироскутер

 Arduino  Комментарии к записи Гироскутер отключены
Авг 112019
 

Этим опусом я начну и постараюсь довести до читателя полную структуру программы изменяющую гироскутер в любое иное изделие для нужд потребителя и вашей инженерной мысли.
Прежде всего хочу выразить благодарность за разработку а главное за выкладывание полной рабочей версии программы ссылка
если вы знаете английский напишите ему мое спасибо буду очень вам признателен :-)
ссылка

Что может программа:
1. Управление от RC передатчика ppm-sum в этом случае работают два колеса не зависимо друг от друга (вперед, назад, вправо и в лево).
y4eacz_thumb.jpeg
uhfhmj_thumb.jpeg
приемник подключается на прямую к контроллеру гироскутера.

2. Управление от джойстика необходим джойстик от видеоигры плейстейшен. (вперед,назад, вправо и в лево).
uxm0x2_thumb.jpeg

3. Управление переменным сопротивлением, вперед, назад и переключение скоростей информация предоставлена Viktor_7
ссылка
1mfppw1_thumb.jpeg
Подходит для самокатов и машинок можно ставить ограничение по скорости максимальная скорость 25 км час.

4. То что использую Я это управление arduino по протоколу uart.

5. Танковое управление от двух джойстиков организуется только при помощи двух контроллеров.

Выбирайте на ваше усмотрение.
Дальше больше :exactly:

Сам контроллер гироскутера
1350e45_thumb.jpeg

Так как программа написана на языке С++ ее надо скомпилировать для так сказать волшебного превращения в прошивку для контроллера гироскутера.

рассмотрим настройку программы под свои проекты.
это файл в программе где вы делаете свои установки config.h

#pragma once
#include «stm32f1xx_hal.h»

// ############################### Менять данные запрещено 100% выход из строя контроллера ну или его не работа

#define PWM_FREQ 16000 // PWM частота 16 кГц
#define DEAD_TIME 32 // PWM deadtime

#define DELAY_IN_MAIN_LOOP 5 // in ms. default 5. it is independent of all the timing critical stuff. do not touch if you do not know what you are doing.

#define TIMEOUT 5 // number of wrong / missing input commands before emergency off

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

// ############################### GENERAL ###############################

// How to calibrate: connect GND and RX of a 3.3v uart-usb adapter to the right sensor board cable (be careful not to use the red wire of the cable. 15v will destroye verything.). if you are using nunchuck, disable it temporarily. enable DEBUG_SERIAL_USART3 and DEBUG_SERIAL_ASCII use asearial terminal.

// Battery voltage calibration: connect power source. see <How to calibrate>. write value nr 5 to BAT_CALIB_ADC. make and flash firmware. then you can verify voltage on value 6 (devide it by 100.0 to get calibrated voltage).
#define BAT_CALIB_REAL_VOLTAGE 43.0 // установить напряжение измеренное тестером на вашем аккумуляторе (в данный момент используется 43 вольта)

#define BAT_CALIB_ADC 1704 // BAT_CALIB_ADC -это калибровочный коэффициент для расчёта напряжения, т.е. число 1704 — это количество
отсчётов, при подаче на вход делителя напряжения НАПРЯЖЕНИЯ = 43.0

#define BAT_NUMBER_OF_CELLS 10 // количество ячеек в аккумуляторе: 10s
#define BAT_LOW_LVL1_ENABLE 0 // вкл/выкл звука при низком напряжении, 1 or 0
#define BAT_LOW_LVL1 3.6 // пищит на этом уровне напряжения. [В/эл.]
#define BAT_LOW_LVL2_ENABLE 1 // to beep or not to beep, 1 or 0
#define BAT_LOW_LVL2 3.5 // your battery is almost empty. Charge now! [V/cell]
#define BAT_LOW_DEAD 3.37 // undervoltage poweroff. (while not driving) [V/cell]

#define DC_CUR_LIMIT 15 // DC current limit in amps per motor. so 15 means it will draw 30A out of your battery. it does not disable motors, it is a soft current limit.

// Board overheat detection: the sensor is inside the STM/GD chip. it is very inaccurate without calibration (up to 45В°C). so only enable this funcion after calibration! let your board cool down. see <How to calibrate>. get the real temp of the chip by thermo cam or another temp-sensor taped on top of the chip and write it to TEMP_CAL_LOW_DEG_C. write debug value 8 to TEMP_CAL_LOW_ADC. drive around to warm up the board. it should be at least 20В°C warmer. repeat it for the HIGH-values. enable warning and/or poweroff and make and flash firmware.
#define TEMP_CAL_LOW_ADC 1655 // temperature 1: ADC value
#define TEMP_CAL_LOW_DEG_C 35.8 // temperature 1: measured temperature [В°C]
#define TEMP_CAL_HIGH_ADC 1588 // temperature 2: ADC value
#define TEMP_CAL_HIGH_DEG_C 48.9 // temperature 2: measured temperature [В°C]
#define TEMP_WARNING_ENABLE 0 // to beep or not to beep, 1 or 0, DO NOT ACTIVITE WITHOUT CALIBRATION!
#define TEMP_WARNING 60 // annoying fast beeps [В°C]
#define TEMP_POWEROFF_ENABLE 0 // to poweroff or not to poweroff, 1 or 0, DO NOT ACTIVITE WITHOUT CALIBRATION!
#define TEMP_POWEROFF 65 // overheat poweroff. (while not driving) [В°C]

#define INACTIVITY_TIMEOUT 8 // установка времени отключения если вы не используете включено устройство

// ############################### LCD DEBUG ###############################

Здесь вы включаете или выключаете работу дисплея ( дисплей 128х64 i2c ssd1306 или 1602 i2c
выводит напряжение и обороты каждого колеса.

//#define DEBUG_I2C_LCD // standard 16×2 or larger text-lcd via i2c-converter on right sensor board cable

// ############################### UART протокол ###############################

#define DEBUG_SERIAL_USART3 // PB10,PB11 disable if I2C (nunchuck or lcd) is used!
#define DEBUG_BAUD 115200 // UART
//#define DEBUG_SERIAL_SERVOTERM
#define DEBUG_SERIAL_ASCII // «1:345 2:1337 3:0 4:0 5:0 6:0 7:0 8:0\r\n» сам протокол

// ############################### INPUT ###############################

// ###### CONTROL VIA UART (serial) ######
//#define CONTROL_SERIAL_USART2 // left sensor board cable, disable if ADC or PPM is used!

скорость передачи общения между контроллером и Ардуино
#define CONTROL_BAUD 19200 // control via usart from eg an Arduino or raspberry

эту строчку надо вписать в ваш скетч для управления ардуино.
// for Arduino, use void loop(void){ Serial.write((uint8_t *) &steer, sizeof(steer)); Serial.write((uint8_t *) &speed, sizeof(speed));delay(20); }

// ###### использование PPM-SUMM######
// left sensor board cable. Channel 1: steering, Channel 2: speed.
//#define CONTROL_PPM // use PPM-Sum as input. disable DEBUG_SERIAL_USART2!
//#define PPM_NUM_CHANNELS 6 // количество каналов

// ###### CONTROL VIA TWO POTENTIOMETERS ######
// ADC-calibration to cover the full poti-range: connect potis to left sensor board cable (0 to 3.3V) (do NOT use the red 15V wire in the cable!). see <How to calibrate>. turn the potis to minimum position, write value 1 to ADC1_MIN and value 2 to ADC2_MIN. turn to maximum position and repeat it for ADC?_MAX. make, flash and test it.
#define CONTROL_ADC // use ADC as input. disable DEBUG_SERIAL_USART2!
#define ADC1_MIN 0 // min ADC1-value while poti at minimum-position (0 — 4095)
#define ADC1_MAX 4095 // max ADC1-value while poti at maximum-position (0 — 4095)
#define ADC2_MIN 0 // min ADC2-value while poti at minimum-position (0 — 4095)
#define ADC2_MAX 4095 // max ADC2-value while poti at maximum-position (0 — 4095)

// ###### CONTROL VIA NINTENDO NUNCHUCK ######
// left sensor board cable. keep cable short, use shielded cable, use ferrits, stabalize voltage in nunchuck, use the right one of the 2 types of nunchucks, add i2c pullups. use original nunchuck. most clones does not work very well.
//#define CONTROL_NUNCHUCK // use nunchuck as input. disable DEBUG_SERIAL_USART3!

// ############################### DRIVING BEHAVIOR ###############################

// inputs:
// — cmd1 and cmd2: analog normalized input values. -1000 to 1000
// — button1 and button2: digital input values. 0 or 1
// — adc_buffer.l_tx2 and adc_buffer.l_rx2: unfiltered ADC values (you do not need them). 0 to 4095
// outputs:
// — speedR and speedL: normal driving -1000 to 1000
// — weakr and weakl: field weakening for extra boost at high speed (speedR > 700 and speedL > 700). 0 to ~400

#define FILTER 0.1 // lower value == softer filter. do not use values <0.01, you will get float precision issues.
#define SPEED_COEFFICIENT 0.5 // higher value == stronger. 0.0 to ~2.0?
#define STEER_COEFFICIENT 0.5 // higher value == stronger. if you do not want any steering, set it to 0.0; 0.0 to 1.0
#define INVERT_R_DIRECTION
#define INVERT_L_DIRECTION
#define BEEPS_BACKWARD 1 // 0 or 1

//Turbo boost at high speeds while button1 is pressed:
//#define ADDITIONAL_CODE \
if (button1 && speedR > 700) { /* field weakening at high speeds */ \
weakl = cmd1 — 700; /* weak should never exceed 400 or 450 MAX!! */ \
weakr = cmd1 — 700; } \
else { \
weakl = 0; \
weakr = 0; }

// ###### МАЛЕНЬКАЯ МАШИНКА ######
// for better bobbycar code see: ссылка
// #define FILTER 0.1
// #define SPEED_COEFFICIENT -1
// #define STEER_COEFFICIENT 0

// #define ADDITIONAL_CODE \
if (button1 && speedR < 300) { /* drive backwards */ \
speedR = speedR * -0.2f; \
speedL = speedL * -0.2f; } \
else { \
direction = 1; } \
if (button1 && speedR > 700) { /* field weakening at high speeds */ \
weakl = speedR — 600; /* weak should never exceed 400 or 450 MAX!! */ \
weakr = speedR — 600; } \
else { \
weakl = 0; \
weakr = 0; }

// ###### КРЕСЛО ######
// #define FILTER 0.05
// #define SPEED_COEFFICIENT 0.5
// #define STEER_COEFFICIENT -0.2

// #define ADDITIONAL_CODE if (button1 && scale > 0.8) { /* field weakening at high speeds */ \
weakl = speedL — 600; /* weak should never exceed 400 or 450 MAX!! */ \
weakr = speedR — 600; } \
else {\
weakl = 0;\
weakr = 0;

// ############################### VALIDATE SETTINGS ###############################

#if defined CONTROL_SERIAL_USART2 && defined CONTROL_ADC
#error CONTROL_ADC and CONTROL_SERIAL_USART2 not allowed. it is on the same cable.
#endif

#if defined CONTROL_SERIAL_USART2 && defined CONTROL_PPM
#error CONTROL_PPM and CONTROL_SERIAL_USART2 not allowed. it is on the same cable.
#endif

#if defined DEBUG_SERIAL_USART3 && defined CONTROL_NUNCHUCK
#error CONTROL_NUNCHUCK and DEBUG_SERIAL_USART3 not allowed. it is on the same cable.
#endif

#if defined DEBUG_SERIAL_USART3 && defined DEBUG_I2C_LCD
#error DEBUG_I2C_LCD and DEBUG_SERIAL_USART3 not allowed. it is on the same cable.
#endif

#if defined CONTROL_PPM && defined CONTROL_ADC && defined CONTROL_NUNCHUCK || defined CONTROL_PPM && defined CONTROL_ADC || defined CONTROL_ADC && defined CONTROL_NUNCHUCK || defined CONTROL_PPM && defined CONTROL_NUNCHUCK
#error only 1 input method allowed. use CONTROL_PPM or CONTROL_ADC or CONTROL_NUNCHUCK.
#endif

есть еще один файл установки main но он для продвинутых пользователей его я разберу позже.

забегу немного в перед эта прошивка ссылка работает с RPiZeroW платформа для робота.
tkzbbj.jpeg

Пишите, спрашивайте что знаю то отвечу.


* 1ow004c.jpeg (290.12 кБ, 2000×1230 — просмотрено 21565 раз.)

MH-Z19B

 Arduino  Комментарии к записи MH-Z19B отключены
Авг 072019
 

Чтобы окончательно решить исход вековечной вражды в офисе между «теми, кому дует» и «теми, кому душно» решил разориться на бюджетный датчик содержания CO2 в атмосферном воздухе и прикрутить к нему сирену. Поскольку цена на такие датчики — совсем негуманная, выбрал вариант «MH-Z19B», который оказался самым бюджетным.

К сожалению, датчик подарил головоломку. Подробности — под катом.

(Внимание — в обзоре много «программизма», ругани в адрес китайских даташитов, присутствует шестнадцатеричная математика — так что если тема DIY вам не близка, проходите мимо, иначе будете разочарованы).

Датчик «MH-Z19B» сделан китайской компанией «Winsen» (даташит, PDF) и неоднократно упоминался на Habrahabr и Geektimes. Это вторая ревизия, с буквой «b» в названии, по результатам китайской «работы над ошибками». Первую ревизию одним неверным движением можно было ввести в режим калибровки, для которой требовалась атмосфера с нулевым содержанием CO2. Бедолагам, которые в это влетали, приходилось искать баллон с чистым азотом или кислородом, чтобы её организовать. В ревизии «b» китайцы сделали так, что модуль «эталонной» считает смесь с 400ppm углекислоты — то есть его можно, теоретически, перекалибровать просто в лесу или в парке.

Модуль пришёл в паре с небольшим шлейфом, основная плата имеет надпил, позволяющий отломать кусок с разъёмом и вместо этого припаять гребёнки. Модуль работает в двух режимах — UART (передавая показания по последовательному порту на 9600 бод) и PWM, контакты слева и справа, соответственно:

1183e04671.jpg

Для удобства я обрезал шлейф и насадил на провода дюпоновские наконечники. Правда, выяснилось, что часть проводов вообще ни к чему не подключена. Напротив, PWM оказался не выведен на шлейф, к контакту пришлось дополнительно подпаиваться, завернув из предосторожности датчик в плёнку поплотнее:

2cf726.jpg

Датчик работает по следующему принципу — он получает по UART девятибайтовые команды (последний байт — CRC) и отвечает также девятибайтовыми пакетами. Замер концентрации СО2 выполняется командой с байтом 0x86:

c71935.jpg

Также показания можно прочитать, померяв ширину PWM-сигнала:

2e5c04.png

Тут подстерегала первая проблема — как узнать текущую размерность измерений? Даташит упоминает, что датчик может мерять в диапазаонах от нуля как до 2000, так и от нуля до 5000ppm:

039492.jpg

Запросить текущее значение у датчика нельзя, поэтому остаётся только явно задавать размерность при каждом старте. Даташит описывает формат команды, которая скажет модулю, в какой шкале работать:

2a7f4c.jpg

Почему-то ни одна инструкция в интернете этого вопроса не касается — никто толком не интересовался настройками датчика и просто принимают их как данность. Кряхтим и пишем код для Ардуино, который пошлёт модулю нужную команду:

  • 2000 ppm: «2000» в десятичной системе это «0x07 d0» в шестнадцатеричной, получается — третий байт команды будет 0x07, четвёртый байт — 0xD0, CRC (девятый байт) 0x8F
  • 5000 ppm: третий байт 0x13, четвёртый байт 0x88, CRC (девятый байт) 0xCB

(CRC вычисляем по формуле из того же даташита, (NOT(Byte1 + Byte2 + Byte3 + Byte4 + Byte5 + Byte6 + Byte7)) +1)

Пробуем и так, и эдак, но в результате получаем на выходе дикие неправдоподобные значения концентрации СО2, вылетающие за паспортные диапазоны показаний датчика в разы. Уже испугавшись, что запороли дорогой прибор, через какое-то время нагугливаем ссылку revspace.nl/MHZ19 со словами

According to the MH-Z19B datasheet, you can configure the measurement range by putting the desired range in byte 3 and 4. However, unlike what the MH-Z19B datasheet says, you can set the range using the following command (in this case 0x07d0 = 2000 ppm in byte 6 and 7)

Замечательные китайцы ухитрились ошибиться в даташите! Материмся, и вместо третьего и четвёртого байта пишем в шестой и седьмой. Благодаря подсказке неизвестного голландца — модуль воскресает.

Поскольку теперь доверия модулю нет никакого, решил разобраться с его показаниями досконально и сравнить результаты по UART и PWM. Пишем код под Ардуино, который сначала, в блоке setup, даёт команду установки размерности, а потом в цикле loop делает замеры. Модуль располагаем на сквозняке у форточки.
Код (финальный, уже включающий все позднейшие *открытия*

Все замеры проводим, подключив модуль к питанию от 5 вольт; при 3.3 вольтах он выдаёт очевидно некорректные значения по верху диапазона.

В режиме PWM при заданном диапазоне значений от 0 до 2000ppm получаем, в условиях центра города, заполночь у форточки во двор, 1208ppm, что, безусловно, завышено. UART выдаёт нам близкое значение 1227ppm — различия вполне объяснимы ошибками оцифровки PWM-показаний.

Для сравнения, вот примерные дапазоны концентраций СО2, найденные в интернете:

— 350 — 450 ppm: Нормальный уровень на открытом воздухе.
— < 600 ppm: Приемлемые уровни. Уровень. рекомендованный для спален, детских садов и школ.
— 600 — 1000 ppm: Жалобы на несвежий воздух, возможно снижение концентрации внимания.
— 1000 ppm: Максимальный уровень стандартов ASHRAE (American Society of Heating, Refrigerating and Air-Conditioning Engineers) и OSHA (Occupational Safety & Health Administration).
— 1000 — 2500 ppm: Общая вялость, снижение концентрации внимания, возможна головная боль.
— 2500 — 5000 ppm: Возможны нежелательные эффекты на здоровье.

Переключаем датчик в диапазон 0 — 5000ppm. В режиме PWM у той же форточки во двор получаем 478ppm, что гораздо больше похоже на правду. Но вот в режиме UART наш датчик снова выдаёт совершенно неправдоподобное значение 1213ppm.

Десять раз перепроверив формулы, по близости показаний начинаю догадываться, что датчик считает с ошибками в арифметике. Модифицирую код, чтобы формула расчёта концентрации CO2 по данным PWM рассчитывалась с подстановкой всех вариантов верхнего предела значений. В момент какого-то озарения также дополнительно модифицирую код, чтобы значение, полученное по UART, дополнительно выводилось домноженным на 2000/5000:

диапазон 0 — 2000ppm

Range was set! (bytes 6 and 7) 1227 <- ppm (UART) 490 <- two fifths of it 606 <- Milliseconds PWM is HIGH 1208 <- ppm2 (PWM) with 2000ppm as limit 3020 <- ppm3 (PWM) with 5000ppm as limit

диапазон 0 — 5000ppm

Range was set! (bytes 6 and 7) 1213 <- ppm (UART) 484 <- two fifths of it 241 <- Milliseconds PWM is HIGH 478 <- ppm2 (PWM) with 2000ppm as limit 1195 <- ppm3 (PWM) with 5000ppm as limit

Делаем выводы:

  • в качестве рабочего диапазона работы датчика надо задавать 0 — 5000ppm
  • несмотря на это, для расчёта значений, полученных через PWM, надо в формулу подставлять константу 2000, а не 5000
  • для получения правдивых показаний от UART надо полученное значение умножать на 2/5
  • китайским даташитам, даже на вид добротным, верить нельзя
  • готовые скетчи для Ардуино из интернета брать нельзя
  • показания всех китайских «показометров» надо проверять хотя бы на соответствие здравому смыслу и внутреннюю непротиворечивость