Как написать программу для управления устройством

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

Как написать программу на Python для управления сетевыми устройствами с помощью YANG и RESTCONF

Источник: codernet.ru

Настольный пульт управления на JavaScript/Node.js для робота на Ардуине

Сегодня делаем настольное приложение с графическим интерфейсом для управления роботом на Ардуине через последовательный порт. На языке JavaScript на платформе Electron с виджетами ReactJS+MaterialUI.

image

Теперь пульт управления для своего станочка с ЧПУ сделать не сложнее, чем написать сайтик.

Ранее:

Главные ссылки

— Библиотека для робота: babbler_h
— Библиотека для Node.js: babbler-js
— Виджеты Babbler для Node.js+ReactJS+MaterialUI: babbler-js-material-ui
— Примеры приложений для babbler-js: babbler-js-demo

Ссылки на инструменты

Дополнительные ссылки

Быстрый старт

Эта прошивка обменивается данными в формате JSON, умеет мигать лампочкой, содержит 4 команды: ping, help, ledon, ledoff

2. Качайте пульт управления:

git clone https://github.com/1i7/babbler-js-demo.git cd babbler-js-demo/babbler-serial-react npm install

3. Запускайте пульт управления:

./babbler-serial.sh

4. Нажимайте на кнопочки, мигайте лампочкой:

image

Структура проекта

Задача проекта — запустить библитеку Babbler.js для общения с роботом в окружении Electron (запускалка приложений JavaScript в отдельном окне, основана на коде Google Chrome), для графического интерфейса подключить ReactJS с виджетами MaterialUI. В общем, все не сложнее «Здравствуй мира» для перечисленных проектов, но в процессе собирания всех этих библиотек в одном приложении было выявлено несколько проблем и нюансов, поэтому в качестве шаблона новых проектов рекомендую брать за основу исходники этого примера.

Как написать программу на Python для управления сетевыми устройствами с помощью YANG и RESTCONF

Предварительные требования: иметь на компьютере установленными node.js, npm и (желательно) git.

Еще раз, качаем исходники и идем в проект babbler-js-demo/babbler-serial-react:

git clone https://github.com/1i7/babbler-js-demo.git cd babbler-js-demo/babbler-serial-react

Файлы проекта

— package.json — проект для npm (Node package manager): настройки проекта, список зависимостей.

Благодаря ему мы можем установить все зависимости, перечисленные в package.json (включая платформу Electron), одной командой внутри проекта:

npm install

— main.js — главный файл для приложения Electron (взят из какого-то «здравствуй мир» для электрона).

Содержимое говорит само за себя. Единственное интересное место — команда, открывающая панель с инструментами разработки при старте приложения:

// Открываем DevTools. mainWindow.webContents.openDevTools();

Рекомендую оставлять этот вызов при разработке приложения (открыть вручную через меню: View → Toggle Developer Tools) и удалять/комментировать при релизе.

— index.html — содержимое главного экрана приложения Electron.

Т.к. для формирования графического интерфейса мы используем React, всё, что должно быть внутри body, — элемент div с >

Этот файл мы править не будем, главный код будет дальше.

— react-app-ui.js — главный файл приложения, здесь главное дерево виджетов для главного экрана (отправляется в index.html в div с весь пользовательский код, правим только его.

Читайте также:
Какие значения может принимать целая переменная y если в программе записано

#!/bin/sh ./node_modules/electron-prebuilt/dist/electron .

Дополнительные нюансы

— Проблема с node-serialport и Electron

Библиотека node-serialport не захотела работать на последних версиях платформы Electron (при том, что на «голом» Node.js всё было прекрасно).

Не вдаваясь в подробности, отмечу, что проблему можно обойти, откатившись на старую версию Electron 1.1.3 или (как пишут в одном из обсуждений) пересобрать его из исходников.

Эта же проблема наблюдается в платформе NWJS (альтернатива Electron), очевидно, что-то поломали в движке Хрома, на котором они все основаны.

Работающая версия Electron указана в зависимостях проекта в package.json, поэтому с демо-проектом всё ок.

Сообщения в баг-трекерах проектов:

Возможно, в одном из следующих релизов проблема будет исправлена, в таком случае можно будет переключить Electron на более свежую версию.

— Babel, синтаксис JSX и ES6

Приложение и компоненты ReactJS используют специальный синтаксис JSX — это HTML-подобный XML для описания структуры дерева элементов управления приложения прямо в коде JavaScript. Так же внутри приложения мы будем местами использовать расширенный синтаксис JavaScript ES6 (это набор всевозможных синтаксических конструкций языка, которые еще не вошли в стандарт JavaScript или вошли в него не так давно, поэтому пока не реализованы даже в самых свежих версиях браузеров). Сначала я хотел исключить конструкции ES6 (их все можно заменить на аналоги из «классического» JavaScript), чтобы не городить лишних конфигураций в проекте. Но потом сдался, т.к. многие примеры в интернете для ReactJS (и, в особенности, для MaterialUI) написаны с использованием синтаксиса ES6, и, в таком случае, мне бы пришлось всех их конвертировать в старый синтаксис JavaScript.

Для того, чтобы использовать нестандартный синтаксис на старом движке JavaScript, используют специальный инструмент — Babel. Он умеет на лету конвертировать нестандартные конструкции в их аналоги на обычном JavaScript, если в проекте задать правильные настройки. Здесь начинаются костыли и огород. В шаблоне проекта все необходимые настройки уже заданы, поэтому в подробности разбирать не буду, перечислю основные пункты:

— package.json должен содержать блок с настройками Babel:

«babel»:

— Аналогичные настройки нужно указать в файле .babelrc, если в проект импортируете виджеты из каталогов за пределами текущего каталога (например: babbler-js-meterial-ui/src/.babelrc).

— Чтобы включить конвертацию Babel в блоках script (type=«text/babel») в HTML-файлах (у нас — index.html), в этом же файле нужно импортировать скрипт browser.min.js (локальная копия в проекте: babbler-serial-react/script/browser.min.js, чтобы не зависеть от интернета).

— Чтобы включить конвертацию Babel в отдельных js-файлах, нужно загрузить модуль ‘babel-register’, а сами js-файлы загружать через require(‘./react-app-ui.js’); (см всё тот же index.html).

Может быть через какое-то время новации ES6 перекочуют в основную ветку JavaScript в варианте Гугл Хрома (а оттуда — в Электрон) и часть этих подпорок можно будет выкинуть за ненадобностью.

— Для работы виджетов MaterialUI в index.html необходимо загрузить модуль ‘react-tap-event-plugin’ и выполнить injectTapEventPlugin()

Смотрим исходники

Весь полезный пользовательский код расположен в одном файле — babbler-js-demo/babbler-serial-react/react-app-ui.js

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

Предварительные приготовления

Базовые объекты Реакта:

var React = require(‘react’); var ReactDOM = require(‘react-dom’);

Виджеты MaterialUI — кнопки, иконки, табы, панельки:

// виджеты MaterialUI import getMuiTheme from ‘material-ui/styles/getMuiTheme’; import MuiThemeProvider from ‘material-ui/styles/MuiThemeProvider’; import Paper from ‘material-ui/Paper’; import from ‘material-ui/Tabs’; import Divider from ‘material-ui/Divider’; import RaisedButton from ‘material-ui/RaisedButton’; import FontIcon from ‘material-ui/FontIcon’; import from ‘material-ui/styles/colors’; import Subheader from ‘material-ui/Subheader’;

Виджеты Babbler из проекта babbler-js-material-ui — взаимодействие с устройством:

Читайте также:
Программа чтобы экран гас во время разговора

— BabblerConnectionPanel — панель подключения: выбор устройств из выпадающего списка, кнопки подключиться/отключиться (в зависимости от статуса подключения)
— BabblerConnectionStatusIcon — иконка статуса подключения к устройству: отключены, подключаемся, подключены
— BabblerConnectionErrorSnackbar — всплывающая внизу экрана панелька, извещающая о разрыве соединения и других ошибках подключения
— BabblerDataFlow — полный лог в реальном времени: добавление команды в очередь, обмен данными с устройством и т.п.
— BabblerDebugPanel (пока определен не в библиотеке, а внутри тестового проекта) — панель отладки: отправка команд устройству вручную, кнопки help, ping, лог с BabblerDataFlow

// виджеты Babbler MaterialUI import BabblerConnectionStatusIcon from ‘babbler-js-material-ui/lib/BabblerConnectionStatusIcon’; import BabblerConnectionErrorSnackbar from ‘babbler-js-material-ui/lib/BabblerConnectionErrorSnackbar’; import BabblerConnectionPanel from ‘babbler-js-material-ui/lib/BabblerConnectionPanel’; import BabblerDataFlow from ‘babbler-js-material-ui/lib/BabblerDataFlow’; import BabblerDebugPanel from ‘./widgets/BabblerDebugPanel’;

Babbler.js для связи с устройством:

// Babbler.js import BabblerDevice from ‘babbler-js’;

Стиль для кнопочек:

const btnStyle = < margin: 12 >;

Наконец, самая интересная часть — общение с роботом, панель управления лампочкой

Панель — обычный компонент React: кнопка «Включить лампочку», кнопка «Выключить лампочку», иконка статуса лампочки.

Про компоненты React следует знать:

— Компонент React работает как машина состояний (стейт-машина).
— Текущее состояние компонента определяют две группы значений: статические свойства this.props и динамические состояния this.state.
— Статические свойства this.props: передаются через параметры тега компонента при добавлении его на экран.
— Динамические состояния this.state: меняются в процессе выполнения приложения, устанавливаются в нужный момент при помощи this.setState.
— Изменения состояний через this.setState приводит к перерисовке компонента.
— Перерисовка компонента происходит в функции render, внешний вид зависит от значений this.props и this.state.
— Внешний вид компонента внутри render определяется через синтаксис React JSX.

— Объект BabblerDevice попадает в компонент через статический параметр this.props.babblerDevice.
— События babblerDevice меняют динамические состояния компонента (если подключены, делаем все кнопки активными, если не подключены — делаем неактивными).
— Кнопки «Включить лампочку» и «Выключить лампочку» отправляют команды ledon и ledoff устройству через babblerDevice.
— В случае получения положительного ответа «ok» меняют картинку статуса лампочки через запись значения свойства this.state.ledOn (true/false).

// Управление лампочкой var BabblerLedControlPnl = React.createClass(< // http://www.material-ui.com/#/components/raised-button // http://www.material-ui.com/#/components/subheader getInitialState: function() < return < deviceStatus: this.props.babblerDevice.deviceStatus(), ledOn: false >; >, componentDidMount: function() < // слушаем статус устройства this.deviceStatusListener = function(status) < this.setState(); >.bind(this); this.props.babblerDevice.on(BabblerDevice.Event.STATUS, this.deviceStatusListener); >, componentWillUnmount: function() < // почистим слушателей this.props.babblerDevice.removeListener(BabblerDevice.Event.STATUS, this.deviceStatusListener); >, render: function() < var connected = this.state.deviceStatus === BabblerDevice.Status.CONNECTED ? true : false; return ( >> disabled= style= /> disabled= style= /> > color= <(this.state.ledOn ? green200 : red200)>> ); >, cmdLedon: function() < this.props.babblerDevice.sendCmd(«ledon», [], // onReply function(cmd, params, reply) < if(reply == ‘ok’) < this.setState(); > >.bind(this), // onError function(cmd, params, err) < console.log(cmd + (params.length >0 ? » » + params : «») + «: » + err); >.bind(this) ); >, cmdLedoff: function() < this.props.babblerDevice.sendCmd(«ledoff», [], // onReply function(cmd, params, reply) < if(reply == ‘ok’) < this.setState(); > >.bind(this), // onError function(cmd, params, err) < console.log(cmd + (params.length >0 ? » » + params : «») + «: » + err); >.bind(this) ); > >);

Главный экран приложения

Создаем устройство BabblerDevice для подключения к роботу:

// Устройство Babbler, подключенное к последовательному порту var babblerDevice1 = new BabblerDevice();

Финальная верстка главного экрана приложения — синтаксис ReactJS JSX (HTML-подобный XML внутри кода JavaScript). Рисуем дерево элементов управления, отправляем в index.html в div с .

Здесь у нас панель подключения к устройству — полоска наверху, блоки общения с роботом — внутри табов.

// Контент приложения ReactDOM.render( > /> iconSize= style=> /> >/> /> /> reverseOrder= maxItems= timestamp= // filter=> // filter= >> // filter=, data: >> style=>/> /> , document.getElementById(‘app-content’) );

Читайте также:
Что такое программа парус 8

Запускаем

./babbler-serial.sh

image

image

image

image

image

image

Шлем команды в ручном режиме:

Источник: habr.com

2. Разработка управляющих программ

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

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

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

Рис. 5. Алгоритм программы-монитора.

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

2.2. Система команд

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

Третий адрес должен указать, куда записывается результат операции. Четвертый операнд это следующая команда, к которой надо перейти после завершения текущей. Если реализовать вычислительную систему непосредственно по приведенным соображениям, то получим вычислительную машину с большим объемом требуемой памяти и относительно низким быстродействием. Если для задания адреса требуется 16 бит, то четырехоперандная команда займет минимум 9 байт памяти. В PIC-микроконтроллерах команда занимает только 1,5 байта.

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

1. Адрес следующей команды указывается только в командах переходов; в остальных случаях очередная команда выбирается из ячеек памяти, следующих за выполненной командой.

2. Использование команд с регистром аккумулятором, в котором находится один из операндов и в нем же запоминается результат операции.

Так как лабораторные работы у нас выполняются на микроконтроллерах фирмы Microchip мы будем рассматривать все на примере PIC–микроконтроллеров, но все выводы применимы и к микроконтроллерам других производителей.

В PIC используется RISC-система команд, характеризующаяся малым набором одноадресных инструкций (33, 35 или 58) в зависимости от разрядности шины программ в разных семействах (12, 14 или 16 бит). Каждая из них имеет длину в одно слово и большинство выполняется за один машинный цикл, состоящий из четырех тактов ГТИ. В системе команд отсутствуют сложные арифметические команды (умножение, деление), предельно сокращен набор условных переходов.

Систему команд микроконтроллера условно можно разбить на пять групп:

  • арифметические команды
  • логические команды
  • команды пересылки данных
  • команды ветвления программ и передачи управления
  • команды управления режимами работы микроконтроллера

Источник: studfile.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru