Ardublock для arduino
Содержание:
Byte тип #
Байты являются фундаментальными строительными блоками низкоуровневых вычислений. Многие аппаратные периферийные устройства
посылают или потребляют последовательность байтов для взаимодействия с контроллером. По существу байт представляет собой
группу из восьми бит, которые являются либо 0, либо 1.
В XOD байт представляет собой отдельный тип данных, который используется для выполнения операций низкого уровня. Он не может
быть непосредственно заменен цифрами, как это происходит на C ++. Вы должны использовать явные ноды преобразования из
стандартной библиотеки. Там предоставлены и другие побитовые операционные ноды.
Добавление названий #
В большинстве случаев рекомендуется четко указывать метки пинов, тогда никто их не будет путать.
Пины получают свои метки от ярлыков своих конечных нод.
Откройте патч, выберите входные терминалы один за другим и установите их названия через Inspector.
Примечание:
Обычно XOD использует названия пинов, которые похожи на метки ножек IC.
Названия могут содержать не более четырех символов, и обычно они являются аббревиатурами.
Ограничение позволяет размещать патчи довольно компактно.
Как назначить имена терминалов, отраженные в патче? Посмотрим. Названия пинов стали намного яснее и понятнее.
Если это сделает вас счастливее, переместите терминал между и и посмотрите, как изменяется порядок контактов на ноде.
Как сделать Ардуино весы на hx711
Но, предположим, вы решили сделать простейшие Ардуино весы (мы публиковали отдельный урок), тогда выбирайте один из вариантов, описанных выше, для получения выходящих данных.
Это может быть блютуз или wi-fi модуль, который будет передавать всё на другое устройство. Но можно использовать и обычный LED-экран. Однако, в таком случае, учитывайте, что вам необходимо будет написать немало строчек кода и для того, чтобы этот экран научить выводить нужные вам числа, а в некоторых ситуациях и буквы.
Сами Ардуино весы на hx711 крайне просты, как по конструкции, так и по пайке. Программирование тоже не вызовет больших проблем, ведь, в крайнем случае, вы сможете найти все необходимые библиотеки в интернете. Поэтому можно модифицировать устройство, с помощью дополнительных датчиков переменного электричества.
Выше на картинке вы можете увидеть примерный вариант устройства весов на Arduino Uno. В комплекте с модулем HX711 идет тензорезистор. На фото к нему прикреплены два небольших куска оргстекла — как основа и как опора для измеряемого предмета.
Схема устройства самая простая:
После того как библиотека скачана мы можем добавить наш код. Сначала код программы для калибровки:
/* Setup your scale and start the sketch WITHOUT a weight on the scale Once readings are displayed place the weight on the scale Press +/- or a/z to adjust the calibration_factor until the output readings match the known weight Arduino pin 6 -> HX711 CLK Arduino pin 5 -> HX711 DOUT Arduino pin 5V -> HX711 VCC Arduino pin GND -> HX711 GND */ #include "HX711.h" HX711 scale(A1, A0); // DT, CLK float calibration_factor = -3.7; // this calibration factor is adjusted according to my load cell float units; float ounces; void setup() { Serial.begin(9600); Serial.println("HX711 calibration sketch"); Serial.println("Remove all weight from scale"); Serial.println("After readings begin, place known weight on scale"); Serial.println("Press + or a to increase calibration factor"); Serial.println("Press - or z to decrease calibration factor"); scale.set_scale(); scale.tare(); //Reset the scale to 0 long zero_factor = scale.read_average(); //Get a baseline reading Serial.print("Zero factor: "); //This can be used to remove the need to tare the scale. Useful in permanent scale projects. Serial.println(zero_factor); } void loop() { scale.set_scale(calibration_factor); //Adjust to this calibration factor Serial.print("Reading: "); units = scale.get_units(), 10; if (units < 0) { units = 0.00; } ounces = units * 0.035274; Serial.print(ounces); Serial.print(" grams"); Serial.print(" calibration_factor: "); Serial.print(calibration_factor); Serial.println(); if(Serial.available()) { char temp = Serial.read(); if(temp == '+' || temp == 'a') calibration_factor += 1; else if(temp == '-' || temp == 'z') calibration_factor -= 1; } }
И сам код для весов ниже.
В коде добавлен перевод единицы измерения веса из унций в граммы.
#include "HX711.h" HX711 scale(A1, A0); float calibration_factor = -3.7; // калибровка! float units; float ounces; void setup() { Serial.begin(9600); scale.set_scale(); scale.tare(); //Сбрасываем на 0 scale.set_scale(calibration_factor); //Применяем калибровку } void loop() { Serial.print("Reading: "); for(int i = 0;i < 10; i ++) units =+ scale.get_units(), 10; // усредняем показания считав 10 раз units / 10; // делим на 10 ounces = units * 0.035274; // переводим унции в граммы Serial.print(ounces); // отправляем в монитор порта Serial.print(" grams"); Serial.println(); }
В целом на этом всё. Более подробные уроки по использованию этого модуля мы обязательно опубликуем в ближайших уроках. Подробный урок по созданию весов на данном модуле смотрите здесь.
Inertial measurement units (IMU)
Part/Module/Vendor | XOD Node | Shopping Links |
---|---|---|
Accelerometer, IMU |
xod/common‑hardware/adxl335‑accelerometer |
Adafruit #163 Brk |
Gyroscope, IMU |
xod‑dev/st‑mems/l3g4200‑gyro |
|
Gyroscope, IMU |
xod‑dev/st‑mems/l3gd20h‑gyro |
Adafruit #1032 Brk |
Accelerometer, IMU |
xod‑dev/st‑mems/lis331dlh‑accelerometer |
|
Accelerometer, IMU |
xod‑dev/st‑mems/lis331hh‑accelerometer |
SparkFun SEN-10345 Brk |
Accelerometer, IMU |
xod‑dev/st‑mems/lis3dh‑accelerometer |
Adafruit #2809 Brk |
Линки и значения #
Ноды взаимодейтсвуют друг с другом, передавая значения по линкам.
Линк — это своего рода провод, который вы используете для подключения вывода одной ноды к входу другой ноды.
Значения в XOD очень похожи на электрические сигналы. Однако, в отличие от их электрических коллег, они могут
нести не только необработанные значения напряжения, но и более понятные данные, такие как произвольные числа
и текстовые строки. Подробнее о значениях читайте в статье Типы данных .
В аналоговых электронных схемах уровни напряжения постоянно и одновременно изменяются во всех точках.
Нет такой вещи, как «этот чип подумал бы сначала, чем подумал другой чип». В цифровой электронике, однако,
многие обновления сопровождаются дискретными импульсами, которые получают микроконтроллер и вызываются тактовыми сигналами.
Значения ведут себя очень точно в XOD. Они меняются и распространяются мгновенно. Эти обновления каскадных значений
называются транзакциями. В XOD роли тактовых сигналов выступают импульсы . В статье Модель исполнения
подробно описывается, как они работают.
Существует несколько правил, которые определяют, какие контакты могут быть связаны, а какие нет.
Они достаточно интуитивно понятны, более детально читайте в Правила линков.
Создание цикла #
Устройство приостанавливается после последнего состояния, потому что ничто не возвращает его обратно в первоначальное состояние.
Мы могли бы связать последний импульс состояния с первым импульсом состояния, чтобы завершить цикл, но, к сожалению,
XOD не позволяет этого сделать.
XOD запрещает циклы в графике программы, чтобы избежать возможных взаимоблокировок.
В нашем конкретном сценарии невозможны взаимоблокировки, потому что мы используем ноды,
но XOD пока недостаточно умен, чтобы понять это.
К счастью, так называемые “defer nodes” (отложенные ноды) здесь помогают нам. Они могут сломать любой цикл и сказать XOD:
“Эй, я тот момент, когда ты можешь перевести дух, если настал тупик”.
Примечание
Вы можете спросить, почему XOD не добавляет отложенную ноду на каждую ссылку. Это возможно, но при этом будет возникать
больше проблем, чем решений. Во-первых, исполняемая модель будет разбита, чтобы транзакции перестали быть атомарными.
Во-вторых, каждая отложенная нода должна хранить несколько байтов данных, которые потребляют драгоценное ОЗУ.
Чтобы избежать проблем, вы вынуждены размещать их вручную.
Мы имеем дело с импульсами, поэтому мы будем использовать ноды для разрыва цикла.
Упс. Входному пину ноды не разрешено иметь линки из и одновременно.
Но мы можем легко решить это, добавив ноду :
Ура! Отлично сработано. Загрузите программу и посмотрите, как она работает.
Поиграйтесь со значениями тайм-аута, попробуйте запустить последовательность из другого состояния,
добавьте еще три светодиода, чтобы сформировать дополнительный светофор. Повеселись!
Блог и сообщество #
Чем больше сообщество, тем более динамичная экосистема XOD.
Знают ли ваши друзья и коллеги о XOD? Краткая заметка о XOD в Twitter, блоге
или в любом другом информацмонном пространстве поможет распространению это
слова и делает его более узнаваемым и популярным.
Если вы создали какое-то устройство, проект, видео или статью, используя XOD —
это круто! Поделитесь им как можно скорее на форуме в разделе
Посмотрите, что я сделал.
Мы делимся интересными проектами.
Оффлайн-события — это ещё одна плюшка. Вы хотели бы выступить на конференции,
встрече или семинаре? Сообщите нам, мы можем поддержать вас в любом случае с
помощью оборудования или медиа: напишите сообщение на
hello@xod.io.
Объединение в узел #
Текущая программа работает, но имеет значение , жестко закодированное и
содержит нода — всё это не удобно к использованию. Давайте перейдем от
черновика к полному решение.
Создайте новый патч и назовите его как .
Примечание
Мы рекомендуем следовать правилам именования
.
Это упрощает дальнейший поиск и идентификацию нода на патче.
Как и раньше, вырезать / вставить все нода, кроме из патча на
. Опять же, нам нужно несколько элементов для
взаимодействия с нода. По крайней мере, со значением и результатом. Не
забывай дать им разумные названия.
Вернитесь к . Перетащите нода . Это наш измеритель
диапазона, и он обеспечивает значения расстояния. Свяжите его выходной вывод
с. Загрузите программу с помощью отладчика и проверьте показания
с фактическим расстоянием.
Выполнение патчей состояния #
Хорошо, у нас есть шаблон патча состояния (state), давайте наполним его.
Перед тем, как это сделать, Вы ответите на несколько вопросов.
- Что нужно сделать в state?
- Когда он должен выйти?
- Что он должен делать прямо перед выходом?
В нашем случае, когда мы входим в состояние (state), он должен включить соответствующий светодиод.
Затем он должен подождать несколько секунд, выключить светодиод и выйти. Довольно просто.
Сделайте это для :
Установите соответствующие значения для ’ пина (установим значение 2-го порта) и значение пина
ноды (установим 3 секунды, отлично подходит для нашего эксперимента).
Мы сделали зеленый. А как же желтый и красный? Просто скопируйте патч и .
Не забудьте ввести и значения. Используйте копировать / вставить, чтобы сделать это быстро.
Примечание
Умный xoder увидит шаблон и избежит дублирования, создав патч-ноду со всей логикой, вставленной внутри.
И он будет прав, но ради краткости урока мы сделали иначе.
Прошивка Arduino
Для того, чтоб залить скетч на Arduino нам необходимо сначала просто сохранить его. Далее, во избежание проблем при загрузке, необходимо проверить настройки программатора. Для этого на верхней панели выбираем вкладку «Инструменты». В разделе «Плата», выберете Вашу плату. Это может быть Arduino Uno, Arduino Nano, Arduino Mega, Arduino Leonardo или другие. Также в разделе «Порт» необходимо выбрать Ваш порт подключения (тот порт, к которому вы подключили Вашу платформу). После этих действий, можете загружать скетч. Для этого нажмите на стрелочку или во вкладке «Скетч» выберете «Загрузка» (также можно воспользоваться сочетанием клавиш “Ctrl + U”). Прошивка платы завершена успешно.
Ноды-действия #
Чтобы работать с экземпляром класса в XOD мы должны обернуть вызовы его методов
в ноды, а сам класс, с которым предстоит работать, передавать в виде созданного
нами кастомного типа. Таким образом, любая нода-действие для этой библиотеки
будет содержать вход типа .
Методы класса могут совершать различные сайд-эффекты (общаение с железкой) и
быть асинхронными. Это значит, что наша программа не должна остановиться и ждать
пока этот сайд-эффект не будет выполнен. Поэтому для каждого такого действия нам
потребуются еще pulse терминалы, для запуска действия и для оповещении о
завершении, успешном или провальном.
Для нашей задачи нам потребуется создать две ноды-действия:
- — инициализирует работу модуля
- — обнаружит метку и считает ее UID
Note
Обратите внимание, что названия нод-действий начинаются с глаголов. По конвенции,
любые ноды, которые передают инструкции что делать в императивном виде, должны
начинаться с глагола (`init`, `read-byte`, `read-uid`, `write-line` и т.п.).
Создадим ноду
Давайте начнем с создания ноды, которая инициализирует работу NFC сканера.
Note
Терминал был автоматически сгенерирован после добавления терминала
в ноде . Вы можете найти его в Браузере Проекта.
Перейдем к C++:
Теперь мы можем инициализировать работу NFC сканера. Далее мы подготовим все для
чтения UID и его сравнения с нашей меткой, а затем создадим ноду для чтения
метки.
Note
Не забывайте давать терминалам и патчам описание.
Хранение и сравнение UID
Т.к. UID метки это набор байтов, который по спецификации ISO14443A может быть
размером от 4 до 10 байт для разных типов карт и разных видов UID (Single size
UID, Double size UID, Triple size UID, RUID, NUID, FNUID), то для надежности
давайте упакуем это значение в специальный тип данных, который мы сейчас
создадим.
Создадим патч :
Обратите внимание, что здесь у нас есть 7 входов типа , чтобы мы могли
вручную задать UID нашей метки. Это нам пригодится далее, когда мы будем
сравнивать UID прочитанной карты с UID нашей карты активации
Перейдем к коду:
По подобию мы можем сделать ноду, которая “развернет” UID на набор байтов с
семью выходами снизу ( отличное название для нее). Это может
быть полезно если мы захотим сравнивать, например, конкретные байты после
прочтения карты. Так, например, Double size UID содержит ID производителя на 0
позиции.
Для нашей задачи важно сравнить UID поднесенной метки с UID нашей метки (мы ведь
не хотим чтобы кто попало включал и выключал наш светодиод). Давайте создадим
ноду
Обратите внимание, что в скбоках мы указали наш тип
данных, это будет
именно для
сравнения UID. Таким образом пользователь сможет не задумываться и использовать
привычную ноду для сравнения UID меток
Для сравнения двух массивов мы воспользуемся встроенной функцией :
Давайте проверим что все работает и заодно создадим демонстрационный патч:
.
Теперь мы можем создавать и хранить UID и сравнивать их между собой. Пришло
время прочитать UID нашей NFC-метки.
Создадим ноду
Для того чтобы взаимодействовать с метками — нужно сначала обнаружить карту и
прочитать её UID. Именно поэтому нода называется не , а .
Перейдем к C++:
Всё готово чтобы считать UID метки. Но на самом деле библиотека от Adafruit
позволяет нам читать не только UID метки, но и считывать и записывать данные на
метку. И если вы делаете обертку над библиотекой, то мы рекомендуем обернуть
хотя бы самые распространенные методы, чтобы избежать появления множества
оберток над одной и той же библиотекой, которые имеют только ограниченный набор
возможностей.
Попробуйте самостоятельно сделать ноды и , используя
методы и из библиотеки
Adafruit. И сделайте example patch, на котором будете считать количество
прикладываний метки, сохраняя его на самой метке (для работы с этими методами
вам потребуются метки Mifare Ultralight).