Почему нужно изучать микроконтроллеры, мотивации пост
Оптимисты изучают английский. Пессимисты изучают китайский. Реалисты изучают микроконтроллеры ;)
By MrПоделкинЦ
Оптимисты изучают английский. Пессимисты изучают китайский. Реалисты изучают микроконтроллеры ;)
By MrПоделкинЦ
Всем привет! :)
Очередной выпуск из серии Arduino для начинающих, в котором мы впервые познакомимся со структурой программ на Arduino, а так же разберем пару примеров по работе со светодиодом и кнопкой и их подключением.
Прежде чем начать работу с программами, еще раз напомню, зачем они нужны. Любая программа для микроконтроллера представляет собой набор определенных команд, которые этот микроконтроллер и будет выполнять. А специальным средством для общения человека с микроконтроллером являются языки программирования. На сегодняшний день их существует огромное количество, и каждый из них является отдельным инструментом со своими отличительными особенностями. Стоит отметить, что эти языки делятся по так называемым уровням. Уровень языка показывает, насколько язык близок к естественной для человека записи. Немного позднее я поясню эту разницу.
Ну а сейчас давайте запустим среду Arduino IDE и откроем пример BareMinimum (Файл - Примеры - Basic). Он представляет собой некоторый шаблон для написания программ.
Открыв его, мы с вами видим две записи, void setup и void loop – это так называемые функции, первая выполняется единоразово, при подаче питания на Arduino, а вторая выполняется циклически до тех пор, пока присутствует питание микроконтроллера. В функцию setup записываются различные настройки микроконтроллера для дальнейшей работы - например, это может быть конфигурация портов ввода/вывода, о которых мы говорили ранее, либо инициализация подключенного вами дисплея или датчика. Главное, что нужно запомнить, с этой функции начинается работа микроконтроллера и все, что в ней написано, выполняется только один раз.
Чего не скажешь о функции loop – эта функция выполняется сразу же после функции setup, и после этого микроконтроллер постоянно работает в ней.
Перед тем, как разобрать работу функций на конкретном примере, я хочу показать вам разницу в уровнях языка программирования, о которой говорил ранее.
Выше вы видели программный код на высокоуровневом языке программирования Wiring, который является языком платформы Arduino по умолчанию. Давайте посмотрим, как же подобная структура будет выглядеть на языках более низкого уровня.
Смотрите, в какую запись превратилась наша программа, когда мы опустились до уровня языка программирования Си. Вы можете заметить добавление некоторых деталей и новых строчек кода, которые скрываются за простыми двумя функциями в случае языка Wiring.
А вот еще более низкоуровневый язык программирования Ассемблер, на нем запись нашего шаблона выглядела бы примерно так. Этот язык, можно сказать, позволяет общаться с микроконтроллером «на ты», и контролировать каждый шаг его работы.
Именно поэтому, работая с более простым, высокоуровневым языком Wiring, вы должны всегда иметь ввиду, что за простой записью скрывается несколько строк, так сказать, универсального кода, за который приходится платить бОльшими размерами готовой программы и отсутствием тонкой настройки работы микроконтроллера.
А теперь настало время запустить пример из прошлого выпуска, на котором мы остановились – это пример мигания светодиодом под названием Blink.
Итак, прежде чем разбирать этот код, давайте подумаем, каким образом мы можем заставить наш микроконтроллер мигать светодиодом с нужной нам частотой?
Составим для себя некоторый, обобщенный алгоритм, по которому должна работать программа.
Что мы имеем? Микроконтроллер с портами ввода/вывода, к одному из которых подключен светодиод.
Нужно запомнить, что каждый вывод микроконтроллера может настраиваться как на вход, то есть прием сигнала, так и на выход, то есть подачу сигнала на этот вывод. В нашем случае необходимо зажигать светодиод, то есть подавать на него сигнал, поэтому, первым делом, мы должны указать микроконтроллеру, что один из его выводов должен работать как выход.
В нашем случае, на плате Arduino уже есть подключенный светодиод к 13-му пину (pin – вывод микроконтроллера). Поэтому, настроив 13-й пин как выход, можно посылать команды на подачу высокого и низкого уровня на этот пин, тем самым зажигая и гася светодиод. Укажем подачу высокого уровня на 13-й пин в нашем алгоритме.
Раз у нас стоит задача мигать светодиодом, то необходимо сделать некоторую задержку перед его выключением и включением, поэтому, после подачи высокого уровня, мы добавляем в наш алгоритм блок задержки на, допустим, 1 секунду.
После чего посылаем на 13-й пин сигнал низкого уровня, то есть гасим светодиод, и снова делаем задержку. Далее, нам нужно повторять это действие бесконечно, поэтому направим стрелку обратно к тому месту, где мы подавали высокий уровень. Ну что ж, с точки зрения алгоритма теперь все должно работать, давайте перенесем это на язык программного кода.
В первом блоке мы указали настройку 13-го пина как выхода, посмотрим на наш код - строчка pinMode(LED_BUILTIN, OUTPUT); как раз и отвечает за эту настройку.
Функция pinMode специально реализована для того, что бы указывать в ней какой пин мы хотим настроить, и в какой режим. В данном случае указано, что мы настраиваем константу LED_BUILTIN как выход, то есть - OUTPUT. За константой LED_BUILTIN как раз и скрывается наша цифра 13, то есть номер пина, к которому подключен светодиод, поэтому, заменив эту запись на цифру 13, ничего не изменится, просто разработчики сделали это для упрощения понимания кода начинающими. Итак, повторим, функцией pinMode мы можем настроить нужный нам пин на вход – INPUT или выход – OUTPUT, указав при этом номер пина. Эта команда не зря записана в первую функцию Setup, поскольку настройку пинов микроконтроллера нужно осуществлять всего один раз, при старте программы.
Также я прошу обратить ваше внимание на синтаксис языка программирования, то есть правила написания команд и комментариев. Это схоже с правилами в русском языке, где, например, после каждого предложения необходимо ставить точку. У языка Wiring после каждой команды, не имеющей своих фигурных скобок, необходимо ставить точку с запятой - ; Иначе строчки, подобно предложениям, сольются в одну, и компилятор выдаст вам синтаксическую ошибку.
Так же, как вы могли заметить, кроме команд для микроконтроллера, существуют некоторые серые пометки для самого программиста – они называются комментариями.
Что бы добавить комментарий к какой-либо, одной строке, необходимо поставить двойной слеш и затем писать все необходимое. Такой комментарий может размещаться только на одной строке, и двойной слеш не будет действовать на следующие. Если же вам необходимо добавить комментарий в несколько строк, как это сделал автор примера blink в самом начале, то сперва ставится один слеш, за ним звездочка, дальше ваш комментарий любой длины, а затем, что бы обозначить конец комментария, ставятся звездочка и слеш.
Комментарии могут быть полезными для пояснения другим людям или самому себе каких-либо фрагментов кода, способных вызвать затруднения в будущем. Так же, с помощью комментариев, можно выключать определенные фрагменты кода, которые пока не должны учитываться компилятором. Для компилятора, все то, что вы укажете в комментариях, становится просто невидимым.
Итак, идем дальше - функция loop, задача которой бесконечно повторять код, написанный внутри нее.
Границы функции определяются фигурными скобками, где, после записи функции, сперва идет открывающая скобка, а после всех необходимых команд – закрывающая. Вы должны всегда внимательно следить за этими скобками, поскольку зачастую в одной функции у вас будут другие команды, имеющие свои фигурные скобки, и запутаться в их расположении будет очень легко. Подробно об этом мы поговорим в одном из следующих выпусков.
Ну а пока посмотрим, что внутри нашей функции - я думаю, вы уже заметили аналогию написанных команд с нашим алгоритмом.
В алгоритме мы указали необходимость подачи на наш 13-й пин сигнала высокого уровня, посмотрим на код – так и есть, функция digitalWrite как раз и делает это. В ее скобках мы опять же указываем номер пина и уровень сигнала, низкий – LOW или высокий – HIGH, так же, аналогом низкого либо высокого уровня являются цифры 0 и 1 соответственно.
Далее нам необходимо осуществить задержку – для таких простых случаев можно прописать её обычной функцией Delay, где в скобках указывается количество миллисекунд. Запись delay(1000); означает задержку работы микроконтроллера на одну секунду. Стоит заметить, что использование в своих проектах функции delay крайне не желательно, поскольку эта функция полностью останавливает работу микроконтроллера, не позволяя выполнять каких-либо других задач. О том, как реализовать более правильный вариант задержки мы поговорим в следующих выпусках, ну а пока, на этапе первого знакомства с программой и простоты поставленной задачи, нам подойдет и такая, упрощенная реализация.
Надеюсь, что вы уже догадываетесь о назначении следующей команды нашей программы. Всё верно - на сей раз, эта команда гасит наш светодиод, подавая на 13-й пин сигнал низкого уровня. Кстати, об уровнях – высокий уровень сигнала в нашем случае равен 5 вольтам, а низкий, соответственно, нулю.
После того, как светодиод погас, программа снова замирает на одну секунду и, дойдя до конца содержимого функции, или, как еще говорят – тела функции, переходит вновь на верхнюю строчку, зажигая наш светодиод повторно. Весь этот процесс будет продолжаться до тех пор, пока мы будем подавать напряжение на микроконтроллер.
Ну что же, думаю, с этим примером всё понятно, и настало время немножко усложнить нашу задачу, а именно – добавить к нашему светодиоду небольшую кнопку, при нажатии на которую светодиод начнет мигать.
Давайте модернизируем наш алгоритм, и добавим в него необходимые блоки.
Наша кнопка умеет замыкать и размыкать какую-либо линию, а это значит, что с ее помощью мы можем либо подавать напряжение на порт, либо снимать его.
По аналогии со светодиодом, один из пинов нашей Arduino нужно настроить на прием сигнала, и, считывая состояние этого пина, делать вывод о том, нажата кнопка или нет. Поэтому в функции настройки микроконтроллера мы прописываем команду pinMode(pin, INPUT); где вместо pin необходимо указать номер пина, к которому подключена кнопка - в моем случае это 3-й пин.
Итак, пины для светодиода и кнопки настроены, теперь необходимо указать условие, при котором наш светодиод должен мигать. А мигать он должен при появлении на 3-м пине положительного сигнала, подаваемого кнопкой. Поэтому, сперва мы считываем состояние этого пина, и затем, если оно равно единице или высокому уровню, выполняем тело условия, в котором прописано мигание нашим светодиодом.
В коде тем временем добавляется новая запись, представляющая собой условный оператор if, что в переводе означает «если».
После написания оператора if в скобках указывается условие, при истинности которого будет выполняться тело оператора, которое ограничивается уже знакомыми нам фигурными скобками. В нашем случае в условии мы должны проверить, равно ли считанное с 3-го пина значение единице или нет, поэтому в скобках мы указываем такую запись: digitalRead(3) == 1. Функция digitalRead, по последнему слову в наименовании, означает чтение – read, и при ее выполнении возвращает результат в виде единицы или нуля – в зависимости от состояния пина, указанного в скобках. Таким образом, мы получили проверку условия: «равен-ли 3-й пин единице?», и, если равен, выполнить указанные действия в фигурных скобках. Дословно это можно читать так: «если считанное значение с пина 3 равно одному, выполнить команды в скобках». Более подробно об условных операторах и циклах мы поговорим в следующем выпуске, ну а пока, чтобы не перегружать вас информацией, остановимся на таком простом варианте.
На всякий случай я оставил подробные комментарии к каждой строке программного кода, файл которого вы найдете здесь.
Ну что же, кажется наш код готов к загрузке, но мы с вами не учли еще один нюанс – он касается подключения кнопок к микроконтроллеру. Все дело в том, что пины Arduino, или выводы микроконтроллера, когда мы считываем с них значение, реагируют на малейшие изменения электромагнитной обстановки окружающей среды, и, оставляя их незащищенными, мы рискуем получить ложные срабатывания нашего условия, что приведет к ошибочным включениям светодиода. Я могу просто касаться пальцем 3-го пина, а микроконтроллер зафиксирует это как подачу высокого потенциала на свой вход и разрешит мигать светодиоду.
Чтобы не было таких неприятных ситуаций, нам необходимо, когда кнопка выключена, постоянно и уверенно подавать на вход микроконтроллера отрицательный потенциал, который не будет давать различным наводкам обмануть наш микроконтроллер. И, в качестве такой защиты при подключении кнопок, используют подтягивающие резисторы на 10-20кОм.
Подтягивающим резистором называется такой резистор, который, при выключенной кнопке, как-бы подтягивает наш вывод к земле, не давая образоваться лишним сигналам на входе микроконтроллера, но при этом, за счет своего большого сопротивления, при нажатии кнопки, свободно разрешает управляющему сигналу попасть на этот вход. Я постарался упрощенно изобразить это на двух картинках – при нажатой, и при отпущенной кнопке.
В данном примере мы рассматриваем подтягивающий резистор к минусу питания, потому что ожидаем при считывании состояния входа сигнал высокого уровня. Но, так же существуют подтягивающие резисторы, наоборот, к плюсу питания, когда управляющим сигналом является минус питания.
Такие резисторы, кстати, встроены внутрь самого микроконтроллера Atmega и их легко можно включить в программе – достаточно дописать в функции настройки команду digitalWrite(pin, HIGH); которая подключит к нашему входу подтягивающий к плюсу питания внутренний резистор на 20кОм. В таком случае внешний резистор нам не понадобится, но и в коде необходимо будет заменить условие срабатывания с единицы на ноль.
Еще одним нюансом подключения кнопок является их дребезг, то есть незаметная и очень быстрая коммутация кнопки несколько раз за момент нажатия, из-за механических свойств её контактов.
Но, об этом мы поговорим в следующих выпусках, так как в нашем примере это не является критичным моментом.
Ну что же, теперь, осуществив подключение по схеме, мы готовы загрузить наш код в микроконтроллер и проверить правильность его работы. Нажимаем кнопку «Загрузить» и ждем, пока наш код пройдет компиляцию и загрузится в микроконтроллер.
Загрузив код вы увидите, что светодиод не мигает сразу же, как это было раньше, так как микроконтроллер ждет, когда мы нажмем на кнопку и подадим на 3-й пин сигнал высокого уровня. Если сделать это, то при нажатии на кнопку светодиод начинает мигать с частотой один раз в две секунды. Мы можем изменить значение частоты на любое другое, просто поменяв число, указанное в скобках функции delay();
В качестве домашнего задания попробуйте настроить программу и схему подключения на срабатывание от минусового полюса питания, а так же самостоятельно подключить светодиод к любому другому пину, только не забудьте про токоограничивающий резистор, о назначении которого я рассказывал в первом выпуске.
Ну а на этом, пожалуй, всё, в конце я хотел бы пригласить всех желающих в наше скромное сообщество ВКонтакте, где периодически выходит рубрика «Nano за 60 минут» и мы разыгрываем в течение часа бесплатную Arduino Nano. Не забывайте делиться своим мнением о выходящих выпусках и пишите свои вопросы, всем большое спасибо за внимание и до встречи в новом выпуске!
Нашёл этот проект на AVRProject, может кому то из подписчиков сообщества будет полезным этот терминал
Тема такого устройства как минитерминал, поднималась на этом сайте уже пару раз: первая версия, вторая версия. И за время использования второй версии, устройство показало себя отличным помощником при отладке во многих проектах. Единственное чего иногда не хватало, это возможности отправлять в отлаживаемое устройство своих команд. Поэтому разобравшись с работой большого цветного дисплея на контроллере ILI9325, решил сделать новую версию минитерминала на нём. К тому-же на этом дисплее уже есть сенсорная панель, благодаря которой можно организовать все управление, а также набор текста, не прибегая к подключению внешней клавиатуры.
У меня уже лежала распаянная под дисплей плата с микроконтроллером ATMega128a, ее я и использовал в качестве основы для устройства. Так как дисплей соединен с контроллером напрямую, схема предусматривает питание не более 3,3 вольта, если выше - есть вероятность что дисплей выйдет из строя. Сначала я хотел применить в качестве источника питания связку из двух батареек R20, у них очень большая емкость и они долго держат нужное напряжение. Но когда стал примеряться, выходило слишком громоздко. Поэтому был откопан, купленный несколько лет назад, модуль преобразователя на LM2577. А источником послужила Li-Ion батарея емкостью 2500мА/ч. Получилась очень годная связка, способная отдавать стабильные 3,3 вольта во всём рабочем диапазоне напряжений аккумулятора. Для подзарядки использован модуль на микросхеме TP4056. Его я давно применяю и он хорошо зарекомендовал себя, плюс очень низкая цена такого решения.
Чтобы иметь возможность подключать минитерминал к пятивольтовым устройствам не боясь спалить дисплей, порты UART развязаны через модуль согласования уровней. Я применил готовый, как раз имелся в наличии на 4 канала. Его можно собрать самому, схема элементарная. Кстати, почему нужно 4 канала? Дело в том что у ATMega128 целых два аппаратных UART интерфейса, и я подумал что неплохо бы использовать оба и сделать двухканальный терминал.
На разъемы, помимо Rx / Tx выведено питание, на случай если нужно будет запитать отлаживаемое устройство напряжением 3,3 вольта. В разрыв цепи запаян диод Шоттки, если вдруг по ошибке от испытуемого устройства в схему пойдет напряжение выше 3,3 вольт.
На плату также добавлен пьезодинамик для озвучивания действий и двухцветные светодиоды с ОК (общим катодом) для индикации работы. У меня это все напаяно поверх, но в конце можно будет скачать доработанную печатную плату.
В конечном виде схема выглядит так
При программировании микроконтроллера необходимо запрограммировать фьюзы на работу от внешнего высокочастотного кварца, отключить совместимость с ATMega103 и отключить JTAG
В Khazama-AVR фьюзы выглядят так
После сборки и прошивки микроконтроллера особых настроек не требуется, нужно только с помощью подстроечного резистора R4 подогнать отображаемое на экране напряжение к реальному значению на аккумуляторе. Для этого рекомендую сперва выставить подстроечник в среднее положение и только после этого подавать питание, чтобы после включения на вход АЦП шло менее 3,3 вольта (опять же для того чтобы обезопасить дисплей).
Из настроек терминал имеет изменяемую частоту работы UART интерфейса, формат отображения принятых данных (ASCII и HEX) и их вид (DISP и LAST).
Чтобы было понятно, остановлюсь на последнем параметре: в обычном режиме DISP (Displacement) идет отображение всех последних принятых данных, и при заполнении экрана идет смещение, таким образом на экране помещается 22 строки. Очистка и перерисовка, при каждом новом приеме данных, занимает относительно много время и чтобы увеличить возможную скорость приема, введен режим LAST. В этом режиме на экране выводится только последний принятый пакет данных. В общем, что получили то и вывели.
При нажатии на кнопку CLEAR, происходит очистка дисплея. INFO - информация о версии прошивки и контактная информация. Кнопка STOP, как не трудно догадаться, останавливает прием данных (полезно когда данные идут сплошным потоком и нужно остановиться и разглядеть).
При первом включении скорость работы UART по умолчанию стоит 1200 бод. Её можно поменять на значения 2400, 4800, 9600, 19200, 38400, 57600 и 115200 бод. Скорость сохраняется в энергонезависимой памяти и при следующем включении терминал будет работать на последней выбранной скорости.
Для набора текста использована клавиатура описанная чуть ранее, для того чтобы открыть клавиатуру нужно нажать на прямоугольник внизу экрана, в нем же будет отображаться последний набранный текст. Клавиатура позволяет напечатать любой текст в латинской раскладке, а также большинство дополнительных символов
Как я уже писал, в схеме я предусмотрел одновременную работу двух UART интерфейсов. Но в прошивке пока реализован только один канал - на аппаратном UART0. Второй - UART1, оставил как задел на будущее. Поэтому набранный текст улетает в Tx0.
Было упомянуто, что в режиме DISP на экран помещается 22 строки принятых данных, ограничение по длине принимаемого и отправляемого пакета составляет 30 символов. А если перевести отображение данных в HEX формат, тогда ограничение по длине пакета составит 10 символов. Ограничение обусловлено оставшимся на экране местом. Для простых задач, которые возложены на это устройство, этого должно хватить.
Ну и для примера достал не задействованную плату с распаянным GSM-модулем SIM900D, которая давно уже у меня лежит. Два запроса о версии прошивки модуля, первый в ASCII формате, второй с отображением данных в HEX формате:
В общем, девайс получился удобным и очень полезным. Рекомендую к повторению. Если что-то упустил оставляйте свои вопросы в комментариях.
Ссылки на детали использованные в проекте:
Дисплей
Микроконтроллер + горсть светодиодов + фотоаппарат на длинной выдержке =
Привет всем любителям Arduino или пока только присматривающимся к этой платформе:)
Рад представить вам первое, а, точнее, нулевое видео из серии Arduino для начинающих. В нем я расскажу из чего будет состоять этот небольшой курс и с чем нам придется работать.
P.S. На камеру я работаю в первый раз, поэтому прошу сильно не пинать :) Так же для тех, кто скажет зачем нужен этот курс, если есть много информации в сети, хочу сказать, что я был того же мнения, пока не узнал мнение большинства в своем сообществе - к моему удивлению оказалось, что он очень нужен и востребован. Ваши пожелания и предложения приветствуются ;)
Nanite это сверх-мини DEV плата построена вокруг Atmel ATtiny85 микроконтроллера (MCU).
Плата имеет размер 0,4 дюйма, и имеет такое же расположение контактов как и DIP версия ATtiny85.
Я хотел иметь свою собственную плату для отладки и разработки с USB загрузчиком и оптимизированную для вездесущих 170 контактных (и более) брэдбордов.
Nanite имеет быструю кнопку сброса RESET, но не имеет встроенного конвертера напряжения, так как питание будет от USB. — Nanite creator Tim explained in a recent blog post.
Кроме маленького размера, Nanite имеет небольшую схему-трюк чтобы совместно использовать один пин с светодиодом и кнопкой сброса.
Схема платы показана ниже, схема крепится к контакту сброса, PB5 который расположен справа.
Дело вот в чём, если PB5 сконфигурирован как обычный сброс то кнопка будет как обычный сброс, вместе с LED принимая на себя роль «pull up» функцию RESET.
НО, если отключить функцию RESET и настроить порт как обычный I/O пин — то состояние кнопки можно опрашивать простым чтением из порта.
Тим уточнил что:
«Светодиод может быть включен путем установки выхода на»LOW» и выключен путем настройки выхода в состояние высокого импеданса. Не рекомендуется устанавливать выход ‘HIGH’, так как в этом случае кнопка может коротнуть выход на землю «
«Я использую микроядро в конфигурации, где оно запускается только тогда, когда кнопка нажата. Это означает, что пользовательская программа запускается без задержки после того устройство получает питание «.
В то же время, функциональность кнопки сброса эмулируется с помощью программного обеспечения, периодически опрашивает состояние кнопки и активации таймера Watch Dog, если она нажата. Если Watch Dog время вышло, сбрасывается устройство.
Также он добавил что:
«Помимо LED вывода, взаимодействия с пользователем и мягкого сброса, PB5 также может быть использован в качестве простого вывода SERIAL отладки — подключен к входу RX SERIAL к адаптеру USB. Я использую простую реализацию программного обеспечения-UART и макрос для перенаправления STDOUT к SERIAL выходу. Это обеспечивает очень удобную отладку с PRINTF(), «
Хотите узнать больше? Вы можете посмотреть Nanite’s official page здесь и также Eagle файлы и исходный код доступны на Github здесь.
Оригинал статьи — ATtiny85 goes uber-mini with The Nanite
Перевод от Dionisnation
Привет всем любителям электроники, микроконтроллеров, программирования. Не так давно обзавелся халявными development kit-ами от Nordic на основе микроконтроллеров NRF51 со встроенным Bluetooth 4.1. Так же получил пару BLE модулей от Microchip для теста:
Модули эти отличаются очень низким энергопотреблением, довольно просты в программировании, в отличии например от CC2541 с их ОС)). было решено начать осваивать технологию BLE c самых простых режимов: Observer и Broadcaster в качестве элементов так многими любимой метеостанции. Просто маячки (Beacon) мне не так интересны, а вот по передавать свои данные было любопытно.
Первым делом опробовал примеры от Nordic для NRF51. Довольно быстро разобрался что к чему. В итоге был написан код для передатчика. В качестве датчика пробовал SHT21, BMP180, BMЕ280. Выбор остановил на датчике температуры и влажности SHT21. накидал схемку:
Сделал "лутом" платку и запаял все "пиздюлинки" (оказались довольно паябельны, особенно согласующий трансформатор, который выглядит как блоха между мк и чип-антенной):
Питание броадкастера от литиевой батарейки CR2032 - 3V, хватить которой должно на довольно долгое время (надеюсь год хотя бы проживет). Потребляет передатчик в режиме ожидания менее 2 мкА (так показывает мультиметр на режиме 2 мА, поэтому может и меньше) Пока проработал 2 недели, разряд батареи составил около 0,01 В. Передает данные (adversting) раз в 10 сек. Измерение происходит раз в 20 сек., зависит от желания.
Рабочее расстояние метров 10 - 15, так как антенна с низким усилением 0,5 дБ, да и в NRF51 только один уровень выходной мощности, вроде бы 0 дБм (в NRF52 уже поинтереснее).
Приемник (Obsrver) решил сделать на MSP430G2553 и RN4020 чтоб протестировать (тоже самое и проще на NRF51 ). Управление BLE модулем осуществляется по UART, довольно простое. Потребляет модуль в режиме ожидания менее 1 мкА. В режиме передачи 15 - 20 мА.
Информация выводится на дисплей на PCD8544.
Схема приемника:
Приемник раз в 30 секунд сканирует на наличие широковещательных сообщений и принимает нужное по известному MAC адресу. Расшифровывает строку с сообщением и высчитывает показатели температуры, влажности и заряда батарее с модуля передатчика, RSSI.
Так же выводится на дисплей заряд собственной батареи. Так же параметры для отладки (кол-во полученных пакетов, код выполняемой операции).
В итоге потребляет приемник в режиме ожидания со включенным дисплеем 100 - 120 мкА,в режиме сканирования 20 мА. Питание осуществляется аккумулятором на 1150 мАч.
В результате можно сделать вывод: nrf51 везде сующийся китайцами для BLE устройств чип вполне пригоден для любительской техники, устройств. Единственное это разобраться со стеком и настройкой разных режимов Bluetooth, благо примеров от Nordic достаточно идет в комплекте с SDK. Есть идеи для подключаемых устройств, но пока так и не понял как организовать свой сервис.
RN4020 вполне пригодный модуль для ардуино-проектов. Работает шустро. Паяется просто. Жрет мало. Есть возможность реализовывать свои сервисы и многие стандартные. Так же поддерживает скрипты. пару раз подвисал когда во время сканирования принимал часто передаваемые сообщения с других BLE устройств и в этот момент я останавливал сканирования, после чего проскакивало еще одно широковещательное сообщение. Возможно какой то мой косяк, сейчас не наблюдается.
Сейчас есть желание написать программу для смартфона для приема инфы с подобных датчиков. Если есть уже опыт помогите начинающему android программисту)))
Если интересует мой быдло код, спрашивайте))). Благодарю за внимание.
Вот так выглядит оригинальная ардуино:
И для сброса контроллера который отвечают за подключение по USB ATmega16U2 надо кратковременно замкнуть два контакта обведенные выше. НО! Ваша плата может выглядеть вот так:
На ней этих контактов нет, да и проблема тут в другом. Обведенный красным чип не имеет драйвера, и наша задача его установить. Для этого качаем установщик отсюда: http://www.wch.cn/download/CH341SER_EXE.html подключаем ардуино к компу, запускаем установщик и тычем install.
После этого в диспетчере устройств должно появиться устройство USB-SERIAL CH340
На русском подобного руководства не нашел, нашел здесь: http://www.instructables.com/id/How-to-fix-bad-Chinese-Ardui...
Надеюсь кому-то поможет. Спасибо за внимание!