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

Доброго вам дня, уважаемые знатоки!

Я постараюсь описать стоящую передо мной задачу.

1. Итак, у нас есть некоторое устройство. Оно выполняетизмерение электрических параметров пластин. Делает это в автоматическом режиме — самостоятельно опускает измерительную головку, проводит замер, и выдаёт результат (причём в формате CSV), поднимает головку в положение базы. К устройству имеется дравер, само оно подключается через USB-порт. Допускается управление устройством по порту RS232 с использованием системы примерно из 20 команд.

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

3. Таким образом, требуется создать программу на С (Си), причём под Windows, которая будет — устанавливать координатный столик в нужную позицию, запоминая эту позицию — посылать команду начала измерений на измерительный прибор — принимать с измерительного прибора результат и сохранять его в excell-файл (это нужно, чтобы далее автоматически построить диаграмму на основе данных, полученных при измерении).

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

Нужна развёрнутая консультация с разъяснением решения вопроса.

Ну а следом нужно будет написать эту программу.

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

Время на прочтение
5 мин

Количество просмотров 6.3K

Доброго времени суток! Сегодня я поделюсь опытом разработки программы для контроллера ROBO TX от немецкой фирмы Fischertechnik. Возможно, на данный момент он не является топовой моделью, однако базовые принципы, которые я собираюсь описать далее, могут быть полезны юным разработчикам, которые столкнутся с контроллерами этого производителя.

Контроллер ROBO TX

image

Данный контроллер в основном предназначен для конструирования простых роботов с целью обучения. В комплекте идет графическая среда программирования, которая помогает заложить в него простые алгоритмы. Также ребята из русского представительства Fischertechnik подсказали, что имеется динамическая библиотека c API от создателей, которая предоставляет полный контроль и позволяет решать требуемые задачи более гибко уже путем разработки собственного софта, что как раз и произошло в моем случае.

Раньше, когда учился, я работал в ЦТПО «Интеллектуальные роботы» на базе института МГУПИ. Центр занимался подготовкой абитуриентов и школьников старших классов по специальностям робототехники. И Андрей Назарович Будняк, который возглавлял его в то время, предложил создать для этого контроллера программу, которая позволит управлять роботом в реальном времени. Также был интересен вариант управления этим контроллером через Bluetooth, чтобы получить своего рода пульт управления как у радио-машинки.

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

Выяснилось, что у контроллера два режима:

  1. Прошивка контроллера программой заранее (с помощью софта разработчика).
  2. Подключение к контроллеру с компьютера через COM-порт и передача ему команд в реальном времени.

Нас интересует второй. Он делится на несколько этапов:

  1. Поиск доступных COM-портов
  2. Подключение через определенный COM-порт
  3. Запуск Transfer Area (протокол общения контроллера с компьютером)
  4. Передача требуемых команд
  5. Завершение Transfer Area
  6. Закрытие COM-порта

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

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

Весь исходный код с комментариями выложен на Гитхабе в виде проекта на QT. Здесь опишу ключевые моменты по нему.

Постановка задачи

У контроллера 8 контактов для подключения 4 моторов (M1-M4). Наша задача при нажатии/отжатии клавиши подавать сигнал в контроллер, который включит/отключит определенный мотор.

image

Нам понадобится список клавиш, в котором мы сохраним код клавиши и соответствующий номер мотора. Но это не все. Контакты у ROBO TX способны выдавать последовательность импульсов с широтно-импульсной модуляцией (ШИМ) для регулировки скорости вращения моторов. Диапазон регулировки от 1 до 512. Это означает, что чем меньше цифра, тем реже подается напряжение, которое всегда имеет одинаковое значение (12В). Еще есть направление вращения. И вдобавок контроллеры способны объединяться в группы с помощью шлейфов до 9 за раз (1 мастер и 8 дополнительных).

Резюмируем и для быстрого понимания одновременно смотрим на финальный интерфейс формы ввода параметров клавиши:

  • Код клавиши
  • Номер контроллера
  • Номер мотора
  • Направление вращения
  • Скорость

image

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

Реализация

Для хранения состояния кнопки в памяти я использовал следующую структуру:

struct Button {
    QString name;
    int code;
    int controller;
    int motor;
    bool direction;
    int speed;
};

Метод из динамической библиотеки ftMscLib.dll, который передает параметры на конкретный мотор называется setOutPwmValues.

Принимает 4 параметра:

  1. Идентификатор соединения через COM-порт
  2. Номер контроллера (0 — основной, 1-8 подключаемые)
  3. Номер контакта (1-8), но в нашем случае это номер мотора (1-4) * 2 + направление (0-1)
  4. Плотность импульсов (0-512)

Весь функционал программы разбил на следующие компоненты, реализованные отдельными классами:

  1. LibLoader — отвечает за подключение динамической библиотеки ftMscLib.dll.
  2. Сonnector — отвечает за подключение к контроллеру.
  3. Сontroller — отвечает за управление моторами контроллера в зависимости от списка клавиш и инкапсулирует его.
  4. FileManager — отвечает за выгрузку/загрузку списка клавиш в файл/из файла.

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

Возвращаясь к этапам, которые были перечислены в начале.

1. Поиск доступных COM-портов

Connector::Connector() { //устанавливаем флаги в начальные значения
    found = false;
    connected = false;
    started = false;
}

//поиск доступных портов
bool Connector::searchCom()
{
    ports.clear();
    char *portName = new char[256];
    for (int i=0;i<libLoader.getAvailableComPorts(0);i++) {
        libLoader.enumComPorts(i,portName,256);
        ports.push_back(QString::fromLocal8Bit(portName));
    }
    return found = ports.size()>0 || debug;
}

2. Подключение через определенный COM-порт

//подключение по определенному порту
bool Connector::openCom(char* comPortName) {
    DWORD errCode = FTLIB_ERR_SUCCESS;
    fthdl = libLoader.ftxOpenComDevice(comPortName, 38400, &errCode);
    if (errCode==FTLIB_ERR_SUCCESS || debug) connected = true;
    return connected;
}

3. Запуск Transfer Area

//запуск протокола общения с контроллером (Transfer Area) [необходимо уже иметь подключение через порт]
bool Connector::startTA() {
    if (libLoader.ftxStartTransferArea(fthdl)==FTLIB_ERR_SUCCESS || debug) {
        started = true;
    }
    return started;
}

4. Передача требуемых команд

void Controller::exec(int buttonKey, bool pressed) //установить на контроллере состояние мотора в зависимости от конфигурации клавиши
{
    if (connector.getStarted()) {                  //если Трансфер Арея запущена
        for (int i=0;i<getButtons().size();i++) {  //перебираем список клавиш
            if (buttonKey==getButtons()[i].code) { //если текущая нажатая или отпущенная клавиша имеется в списке
                libLoader.setOutPwmValues(         //то посылаем конфигурацию мотора на контроллер, соответствующую этой клавиши и ее статусу нажатия (нажата или отпущена)
                    connector.fthdl,
                    getButtons()[i].controller,
                    getButtons()[i].motor * 2 + (getButtons()[i].direction ? 1 : 0),
                    getMemorySpeed(getButtons()[i], pressed)
                );
            }
        }
    }
}

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

5. Завершение Transfer Area

//остановка протокола общения с контроллером (Transfer Area) [необходимо уже иметь подключение через порт]
bool Connector::stopTA() {
    if (libLoader.ftxStopTransferArea(fthdl)==FTLIB_ERR_SUCCESS || debug) {
        started = false;
    }
    return !started;
}

6. Закрытие COM-порта

//отключение открытого порта
bool Connector::closeCom() {
    if (libLoader.ftxCloseDevice(fthdl)==FTLIB_ERR_SUCCESS || debug) {
        started = false;
        connected = false;
    }
    return !connected;
}

Всю ключевую работу, в принципе, за нас делает библиотека ftMscLib.dll. Нам лишь важно это обернуть в удобную оболочку и приспособить для наших потребностей.

Данная разработка оказалась полезной на форуме роботов в 2012 году в соревновании «Трудная дорога». С помощью неё осуществлялся контроль роботом в реальном времени.

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

→ Немецкий Сайт Fischertechnik
→ Русский Сайт Fischertechnik
→ Сайт русского комьюнити Fischertechnik
→ Архив с библиотекой, документацией к ней и примерами с немецкого сайта Fischertechnik

Отдельное спасибо Андрею Назаровичу Будняку за помощь при составлении статьи.



Что это?
Программирование микроконтроллеров тесно связано с интернетом вещей. То есть вы пишите программу для компактного умного устройства, который управляет, к примеру, десятками девайсов в вашем умном доме или определенными процессами на производстве.



Как научиться?
Чтобы научиться программировать микроконтроллеры, необходимо для начала разобраться в самой архитектуре этих устройств, понять, как они работают, выучить один из языков программирования. Всё это можно сделать на специальных курсах.

В статье рассказывается:

  1. Что такое микроконтроллер
  2. Классификация микроконтроллеров
  3. 3 условия для программирования микроконтроллеров
  4. Программы и алгоритмы для микроконтроллеров
  5. Языки программирования микроконтроллеров
  6. Быстрый способ начать программировать микроконтроллеры
  7. Пройди тест и узнай, какая сфера тебе подходит:
    айти, дизайн или маркетинг.

    Бесплатно от Geekbrains

Что такое микроконтроллер

Эту микросхему (микроконтроллер) можно назвать ЭВМ, собранной на одном кристалле. Она также содержит процессор и периферийные устройства, оперативную память и ПЗУ. Такой однокристальный компьютер предназначен для управления периферией и вполне способен выполнять некоторые вычислительные функции.

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

Что такое микроконтроллер

Что такое микроконтроллер

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

Развитие и программирование микроконтроллеров происходит одновременно с разработкой новых процессоров. Разработанный в далеком 1980 году Intel 8051 до сих пор можно увидеть даже в современных изделиях. Время от времени отличий между этими устройствами становилось меньше.

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

За последние 10 лет наибольшую популярность завоевали такие модели микроконтроллеров:

  • 8-битные микроконтроллеры PIC фирмы Microchip Technology и AVR фирмы Atmel;
  • 16-битные MSP430 фирмы TI;
  • 32-битные микроконтроллеры, архитектуры ARM. Разработчики других компаний могут её приобрести и использовать как базу для конструирования своих наработок.

Скачать файл

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

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

  • Тактовая частота колеблется около величины в 200 МГц (чаще даже ниже – не превышая 100 МГц).
  • Объём ОЗУ и памяти программ составляет от нескольких десятков килобайт до 1 Мб.

Классификация микроконтроллеров

Устройства подразделяются по параметрам:

  • разрядность;
  • система команд;
  • архитектура памяти.

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

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

По разрядности различают:

  • 8-бит;
  • 16-бит;
  • 32-бита;
  • 64-бита.

pdf иконка

Топ-30 самых востребованных и высокооплачиваемых профессий 2023

Поможет разобраться в актуальной ситуации на рынке труда

doc иконка

Подборка 50+ ресурсов об IT-сфере

Только лучшие телеграм-каналы, каналы Youtube, подкасты, форумы и многое другое для того, чтобы узнавать новое про IT

pdf иконка

ТОП 50+ сервисов и приложений от Geekbrains

Безопасные и надежные программы для работы в наши дни

Уже скачали 19862 pdf иконка

Классификация по типу системы команд:

  • RISC-архитектура, или вычислитель с комплектом редуцированных команд. Этот подход к проектированию процессоров с целью повышения их скорости за счет упрощения декодирования инструкций позволяет повысить тактовую частоту. Часто UNIX-системы работают на устройствах с этой архитектурой.
  • СISC-архитектура (complexinstruction set computer) характеризуется нефиксированным значением длины команд и небольшим количеством регистров, имеющих жестко заданный набор функций. Классическим примером является процессоры Motorola MC680x0. Некоторые процессоры Intel совместимы с СISC, но у них всё же RISC-ядро, и их можно отнести к гибридным.

Типы памяти:

  • Архитектура Фон-Неймана – это принцип одновременного хранения в ячейках памяти и данных. Недостатком такого принципа является ограничение пропускной способности между вычислителем и памятью. Отчасти такая проблема решается кэшировнием, но оно приводит к усложнению всей архитектуры и вызывает когерентность памяти. Основы были заложены Нейманом в 1944 году.
  • Гарвардская архитектура. Отличается от предыдущей тем, что для хранения инструкций и данных предназначены отдельные физические устройства. По такому же принципу построены каналы данных и команд. Была разработана Говардом Эйкеном в конце 30-х годов 20 века.

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

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

Условие №1: Готовность к реализации поставленной задачи

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

Условие №2: Иметь понятие о структуре микроконтроллера

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

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

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

Условие №3: Уверенное знание инструкций управления микроконтроллером

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

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

Программы и алгоритмы для микроконтроллеров

Программа

В основе программирования микроконтроллеров лежит набор выполняемых в определённой последовательности инструкций. Это и есть программа (в переводе с греческого это слово означает – “запись”), которая, по сути, является последовательными шагами определённого алгоритма действий. Руководствуясь этими предписаниями, устройство и будет осуществлять те или иные действия.

В качестве практического программирования микроконтроллеров рассмотрим следующий тривиальный случай: нам необходимо, чтобы светодиод начал мигать. Для этого необходимо с помощью команд «рассказать» управляющему устройству последовательность выполняемых им манипуляций, то есть написать программу.

Что-то вроде такого:

Активировать светодиод:

  • подготовить вывод микроконтроллера, к которому подключен светодиод для работы;
  • осуществить подачу логического уровня, который позволит светодиоду начать излучение в видимом диапазоне.
Микроразметка: понятие, виды, применение

Читайте также

Выдержать паузу:

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

Потушить светодиод:

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

Понятие «Программа» тесно связано с другим термином – «Алгоритм».

Алгоритм является совокупностью точно заданных правил, задающих порядок их выполнения для решения определённых задач

Алгоритм – набор инструкций, описывающих порядок действия для достижения нужного результата. Одна и та же совокупность правил в разных средах программирования микроконтроллеров может быть реализована неодинаковыми методами.

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

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

Отличие алгоритма от программы состоит в том, что он определяет общий порядок действия устройства, который потом и находит подробнейшее воплощение в коде. По аналогии с вышеприведенном примером:

  • Активировать светодиод.
  • Сделать паузу.
  • Деактивировать светодиод.

pdf иконка

Точный инструмент «Колесо компетенций»

Для детального самоанализа по выбору IT-профессии

pdf иконка

Список грубых ошибок в IT, из-за которых сразу увольняют

Об этом мало кто рассказывает, но это должен знать каждый

doc иконка

Мини-тест из 11 вопросов от нашего личного психолога

Вы сразу поймете, что в данный момент тормозит ваш успех

Регистрируйтесь на бесплатный интенсив, чтобы за 3 часа начать разбираться в IT лучше 90% новичков.

Только до 6 марта

Осталось 17 мест

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

Языки программирования микроконтроллеров

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

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

  • 00110101 011000100

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

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

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

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

  • Низкоуровневые языки программирования.
  • Языки программирования высокого уровня.

Их отличие состоит в «близости» к микроконтроллеру.

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

01010010
01000110
10010011

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

Наиболее востребованные языки программирования:

  • язык низкого уровня – Ассемблер.
  • язык высокого уровня – С (Си).

Таким образом, подходят не только низкоуровневые, но возможно и программирование микроконтроллеров на С.

Приведём абстрактный пример их различия:

Допустим перед нами стоит задача найти сумму чисел: 25 и 35.

Машинным кодом это описывается так:

  • 00000101 1101001

На языке низкого уровня:

  • ADD Rd, Rr

На языке высокого уровня:

  • 25+35

Как видите, разница в наглядности очевидна.

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

Инструкция ADD Rd, Rr ставит перед микроконтроллером задачу сложения двух чисел, находящихся соответственно в Rd и в Rr (но предварительно необходимо их туда записать). Таким образом, контроллер получает чёткое указание: где что находится, что надо просуммировать, и куда записать результат. В этом заключается работа с электронным устройством напрямую.

Третий пример выглядит как обычная математическая запись. Но, в этом случае микроконтроллер не является прямым объектом нашего воздействия. Перед ним поставлена задача, аналогичная команде на Ассемблере: записать эти числа, произвести арифметическое действие. Записать сумму.

Здесь то и есть главное принципиальное отличие высокоуровневых и языков низкого уровня. Кодирование на Ассемблере независимо от нашего желания подразумевает полный контроль всего процесса: нам известно, в каком месте записаны эти два числа, и мы знаем, где будет результат. Другая картина при использовании языка С: программа сама решает местонахождение чисел и их суммы. В большинстве случаев в этом и нет необходимости, главное получить итог – число 60 на выходе.

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

Эту задачу выполнит компилятор – «переводчик» на машинный код. Тут и скрывается один из недостатков: один и тот же алгоритм, реализованный на Ассемблере и на С после компиляции, будет иметь разный размер. Низкоуровневая программа будет чуть ли не вдовое короче. В некоторых случаях даже делают вставки на Ассемблере в программу, написанную на С.

Быстрый способ начать программировать микроконтроллеры

Специалисты, проектирующие электронные устройства, часто оперируют таким термином как «быстрый старт». Им описывают случаи, когда необходимо в сжатые сроки испытать после тестового программирования, например, микроконтроллер Atmel и посмотреть, как он выполняет элементарные задачи.

Оперативно получив приемлемый результат, можно более углубленно изучить все тонкости и «подводные камни» этого процесса.

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

GeekBrains представляет учебное пособие «Факультет. Инженер умных устройств».

Пройдя этот курс вы можете стать специалистом в области интернета вещей — Internet of Things (IoT) и научиться создавать сеть умных гаджетов. Изучите язык C, способы компилирования, отладки и программирования микроконтроллеров Arduino. Кроме этого, овладев необходимыми знаниями, наработаете опыт работы по технологиям удалённого доступа (Bluetooth, Wi-Fi). Что позволит с лёгкостью конструировать современные встраиваемые системы.

Быстрый способ начать программировать микроконтроллеры

Быстрый способ начать программировать микроконтроллеры

Плюсы прохождения данного курса:

  • Регулярно обновляемая программа. Фундаментом служит принцип experiential learning, или по-русски: «повторение – мать учения», который поможет систематизировать накопленные знания и получить практический опыт. Между теоретическими блоками предусмотрен практикум в 7-14 дней для самостоятельного проектирования.
  • Получение в виде бонуса Starter box. Подаренное оборудование для работы в первой четверти пригодится для практической работы. Теория чередуется с тренировками, закрепляющими полученные знания. Изучите устройство и принцип действия транзисторов, датчиков и др., и, наконец, самостоятельно сможете осуществить программирование микроконтроллеров.
  • Улучшение навыков программирования. В конце каждой четверти в рамках дискуссионного клуба происходит выступление эксперта. Все участники могут напрямую обмениваться опытом и своими наработками.
    Суть языков программирования: для чего они нужны

    Читайте также

  • Компетентные учителя. Авторами этой программы являются преподаватели GeekBrains, имеющие опыт запуска проектов в масштабах России. Единственные представители СНГ на международном форуме Arduino Day 2021, объединившим как любителей, так и профессионалов, занятых конструированием умных устройств.

Содержание этой части обучения

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

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

Далее нам надо для связи по USB сделать устройство, программу для микроконтроллера AVR и программу для компьютера.

USB управление для своего устройства

Берем кабель USB и с одной стороны срезаем провода, видим 4 провода, которые нам нужны — красный, чёрный, жёлтый (бывает зеленым) и белый. Красный провод — это плюс питания +5V, чёрный провод — это минус питания. Этими проводами запитываем наше устройство. А другие 2 провода — жёлтый D+ и белый D- используются для обмена данными по USB.

Схема USB устройства на микроконтроллере AVR

Схема USB устройства на микроконтроллере AVR

На рисунке показана схема простого самодельного USB устройства. Оно выполнено со всеми требованиями стандарта USB и при корректной сборке отлично работает. Встроенной частоты, на которой может работать USB в микроконтроллере AVR нет, поэтому потребуется установить внешний генератор частоты в 12 МГц, а для сглаживания сигнала от него еще два конденсатора по 20 пФ. По документации на используемый микроконтроллер AVR узнаем куда подключается внешний генератор частоты на том микроконтроллере, который мы используем. В данном случае это линии PA1 и PA0, в других же микроконтроллерах побольше обычно есть линии XTAL, тут их нет, поэтому подключаем куда написано вместо них.

Красным и чёрным проводом запитываем микроконтроллер — эти линии просто подключаются к VCC и GND. Линии с данными USB — это D+ и D- подключаются к линиям микроконтроллера, не к случайным, а к тем что заданы в программе для микроконтроллера, которую позднее будем делать, сразу скажу что это будут линии PD2 и PD4. Просто так нельзя подключать их, надо на пути поставить резистор на 68 Ом по требованию стандарта USB и еще снизить напряжение на данных линиях с 5V до 3.6V. Для резисторов посчитаем их мощность — ток USB задается в программе для микроконтроллера и мы его зададим на уровне 0.05 A, значит мощность резисторов 0.05 A * 5 V = 0.25 Вт. Такие и берем. Напряжение снижается параллельным подключением дидов Зенера 3V6 как показано на рисунке, эти диоды надо воткнуть правильной стороной, напомню что чёрная полоска на диоде с одной стороны должна быть направлена в сторону линий D+ и D-, а обратная сторона к минусу питания. И последнее, чтобы работало устройство USB, надо резистором в 1.5 кОм указать режим его работы, подключаем его к D-, это означает низкоскоростной режим, который нам нужен, поскольку мы не планируем передавать большие объемы данных, а только будем посылать простые сигналы, низкоскоростной режим нам нужен. Чтобы увидить что наше устройство работает, подключим светодиод к линии PB0, длинной плюсовой стороной к линии, а другой стороной к минусу питания.

Также воспользуемся вспомогательными инструментами для удобства — это зажим на 20 гнезд, чтобы легко извлекать микроконтроллер для перепрограммирования. И это 2 клеммника, чтобы прикрутить провода USB к макетной плате. Вообщем для сборки устройства нам потребуется сделать такой закуп:

ATtiny2313A купить

Что это: Микроконтроллер

Управление: 20 линий

Память программы: 2 Kb

Резистор 68 Ом купить

Сопротивление: 68 Ом

Мощность: 0.25 Вт

Диод Зенера 3V6 купить

Пропускает: 3.6 В

Тип: Понижающий

Резистор 1.5 кОм купить

Сопротивление: 1.5 кОм

Мощность: 0.25 Вт

Кварцевый генератор 12 купить

Частота: 12 МГц

Тип: пассивный

Конденсатор 20 pF купить

Емкость: 20 pF

Тип: Керамический

Макс. напряжение: 50 V

Светодиод купить

Цвет: Белый

Напряжение: 3 V

Зажим на 20 гнезд купить

Клеммник купить

Контактов: 2

Зажим: прикрутка

Кабель USB купить

НЕТ В НАЛИЧИИ
Нужно 1 шт.

Интерфейс: USB 2.0

Длина: 100 см

Макетная плата купить

Размер: 63 x 2 горизонтальных линий и 4 вертикальные линии

Проводки купить

Тип: Навесные

Количество: 40

Набор проводков купить

Собранное готовое к работе USB устройство выглядит так:

USB устройство своими руками

USB устройство своими руками

Программа на микроконтроллер AVR для USB связи

1) Скачиваем исходные коды OpenRoboFW и распакуйте архив на диск C:, я собрал этот архив из файлов проекта V-USB, настроил их на Attiny2313A и тактовую частоту 12 МГц (эти настройки меняются в файле Makefile, если используется другой микроконтроллер), упростил код для внесения изменений. V-USB дает нам исходники программ с идентификаторами VID и PID, которые нужны для распознания USB устройства компьютером. На всякий случай вот ссылка на проект

V-USB

. После распаковки архива содержимое директории

C:OpenRoboFW

выглядит так:

Назначение важных файлов:
main.c — главный файл программы на языке C, она осуществляет обработку информации, пришедшей по USB, и в ней программируется реакция микроконтроллера на USB пакеты с компьютера
Makefile — параметры сборки, тип микроконтроллера (взяли — attiny2313a), частота, информация по фьюзам для других микроконтроллеров, при использовании другого микроконтроллера, в этом файле его нужно прописать в строке DEVICE (например — atmega16a)
usbconfig.h — параметры USB, порт подкючения линии D-, ток

Откройте main.c и обратите внимание на 2 области кода, которые там выделены — программа реакции на USB пакет и настройка портов. В этих областях надо вставлять свой код,
остальное можно не трогать. Для примера там уже стоит код, его можно менять. В приходящем пакете USB с компьютера есть 2 параметра — p1 и p2, которые передаются из программы в виде параметров, в зависимости от их значений можно менять состояние линий микроконтроллера (портов) в программе реакции.

2) Скачиваем программу WinAVR и устанавливаем, она нужна для создания HEX-прошивки микроконтроллера AVR, сайт WinAVR

3) Запускаем командную строку Windows, которая находится тут c:WindowsSystem32cmd.exe появляется чёрное окно. В этом окне вводим 2 команды (набираем команду, нажимаем enter):

Это команды для командной строки Windows, которая находится здесь C:WindowsSystem32cmd.exe, команды набираются вручную по одной строке и в конце каждой строки необходимо нажать клавишу Enter Командная строка Комментарии

1

2

cd c:OpenRoboFW
 

make hex

Переходим в директорию OpenRoboFW

Запускаем подготовку программы для микроконтроллера

Подготавливаем программу МК

Подготавливаем программу МК

После чего в директории C:OpenRoboFW забираем файл main.hex и прошиваем его в микроконтроллер. Если в процессе появилась ошибка типа warning unused variable, а также can not set period, или нечто подобное, что не имеет большого значения, ничего страшного, все в порядке, используем полученный файл, он полностью нормальный и рабочий. Главное если файл появляется, значит программа была успешно сделана и может быть использована.

Напоминаю Как прошивать.

Также надо прошить fuse-биты настроек микроконтроллера, чтобы изменить его тактовую частоту на совместимую с USB стандартом. Встроенной подходящей частоты нет, поэтому применяется внешний источник тактовой частоты 12 МГц. Для прошивки настроек fuse-битов устройство с программатором надо доработать, подключить к микроконтроллеру внешний кварцевый генератор 12 МГц и 2 конденсатора 20 пФ по схеме как на устройстве USB, т.е. в случае с ATTiny2313A к линиям PA1 и PA0, и также соединить это всё с минусом питания, вообщем как на схеме USB устройства, смотрите на фото ниже как подключено. Это нужно для того, чтобы устройство продолжило работу после установки для него нового источника тактового сигнала, именно этот источник 12 МГц и подключаем. Не забудьте кроме программы также прошить fuse-биты.

Меняем настройки программатором

Доработка программатора для прошивки настроек USB

Программатор USBasp купить

Кварцевый генератор 12 купить

Частота: 12 МГц

Тип: пассивный

Конденсатор 20 pF купить

Емкость: 20 pF

Тип: Керамический

Макс. напряжение: 50 V

Мини макетная плата купить

Размер: 17 x 2 горизонтальных линий

Зажим на 20 гнезд купить

При этом установите такие биты конфигурации:

Для ATtiny2313A (наш случай):
CKSEL0..3=1111   SUT0..1=10   CKOUT=1   CKDIV=1   RSTDISBL=1   BODLEVEL2..0=101   WDTON=1   SPIEN=0   EESAVE=1   DWEN=1

Установите В справочнике эти fuse-биты и прошейте их в микроконтроллер полученной строкой через программу AVR dude, о том Как прошить тут. Также дам на всякий случай fuse-биты для других микроконтроллеров.

Для ATmega8A:
CKSEL0..3=1111   SUT0..1=10   BODEN=0   BODLEVEL=1   BOOTRST=1   BOOTSZ0..1=00   EESAVE=1   CKOPT=0   SPIEN=0   WDTON=1   RSTDISBL=1

Для ATmega16A:
CKSEL3..0=1111   SUT0..1=10   BODEN=0   BODLEVL=1   BOOTRST=1   BOOTSZ0..1=00   EESAVE=1   CKOPT=0   SPIEN=0   JTAGEN=1   OCDEN=1   LB1..2=00   BLB=0000

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

Программа на компьютер для USB связи

Для начала сделаем простую консольную программу, потом будем делать программу с окнами.

1) Скачиваем исходные коды консольной программы OpenRobo, которые собраны из исходников проектов V-USB и LibUSB. Распаковываем архив на диск C:, после чего содержимое директории C:OpenRobo должно выглядеть так:

Назначение файлов:
include и lib — это драйверы LibUSB для доступа к USB из программы
set-led.c — это исходник нашей программы

2) Скачиваем программу LibUSB, которая нужна для работы с устройством из программы. Устанавливаем. Сайт разработчика LibUSB. После установки подключите собранное устройство к USB. Запустите через меню Пуск/Программы/LibUSB-Win32/Filter Wizard. В открывшейся программе выберите

Install a device filter

для установки фильтра на порт, в следующем списке выберите только что подключенное устройство, его можно найти по vid:16c0 pid:05df. Нажмите кнопку Install. Если устройства в списке нет, значит вы либо не правильно собрали устройство и оно не опозналось, либо драйверы уже были установлены. В случае смены порта подключения устройства, надо опять заходить и устанавливать фильтр, иначе программа не сможет распознать устройство. Обязательно подключайте устройство USB к тому же порту USB, что был подключен при установке фильтра!

3) Скачиваем программу MinGW, которая нужна для сборки программы из исходника. Устанавливаем. Сайт разработчика MinGW. После установки зайдите в Панель управления, Система, Дополнительные параметры системы, Дополнительно (вкладка), Переменные среды (кнопка), Системные переменные (список), Переменная Path (найти в списке, выделить, нажать кнопку Изменить). Дописываем в поле Значение переменной в конце ;c:MinGWbin и нажимаем ОК, надеюсь вы установили MinGW в C:MinGW, иначе надо путь другой прописать.

Настраиваем системную переменную Path для MinGW

Настраиваем системную переменную Path для MinGW

4) Запускаем командную строку Windows, которая находится тут c:WindowsSystem32cmd.exe
В этом окне вводим 2 команды (набираем команду, нажимаем enter):

Это команды для командной строки Windows, которая находится здесь C:WindowsSystem32cmd.exe, команды набираются вручную по одной строке и в конце каждой строки необходимо нажать клавишу Enter Командная строка Комментарии

1

2

cd c:OpenRobo
 

make

Переходим в директорию OpenRobo

Запускаем подготовку программы для компьютера

Если выходит ошибка, что команды make нет, значит вы не установили выше указанную программу WinAVR, сделайте это. Если выходит ошибка, что команды gcc нет, значит не прописан правильно путь в системную переменную Path, сверьте со скриншотами то как прописано у вас, также возможно командная строка была запущена до прописывания пути, надо перезапустить.

Подготовка программы ПК

Подготовка программы ПК

5) Теперь смотрим в директорию C:OpenRobo, там появился готовый файл программы set-led.exe. Не выходим из cmd, здесь же теперь мы можем набрать команды запуска программы и получить результаты:

Это команды для командной строки Windows, которая находится здесь C:WindowsSystem32cmd.exe, команды набираются вручную по одной строке и в конце каждой строки необходимо нажать клавишу Enter Командная строка Комментарии

1

2

3

set-led on
 

set-led off
 

set-led status

Включает светодиод

Отключает светодиод

Показывает включен или отключен светодиод

7) Если все сделано правильно, то при подключении USB устройства и наборе команд в консоле, светодиод будет включаться и выключаться.

Изменяем программы под наши нужды

Берём под контроль все порты, прибавляем свои функции. И так, теперь в C:OpenRobo размещены исходные коды программы для компьютера, а в C:OpenRoboFW исходные коды программы для микроконтроллера. Их можно изменять, но после каждого изменения надо их занова пересобирать (и перепрошивать микроконтроллер), делать это теперь вы умеете — см. выше пример — пересобрать обе программы можно 4-мя командами в cmd:

Это команды для командной строки Windows, которая находится здесь C:WindowsSystem32cmd.exe, команды набираются вручную по одной строке и в конце каждой строки необходимо нажать клавишу Enter Командная строка Комментарии

1

2

3

4

cd c:OpenRoboFW
 

make hex
 

cd c:OpenRobo
 

make

Переходим в директорию OpenRoboFW

Запускаем подготовку программы для микроконтроллера

Переходим в директорию OpenRobo

Запускаем подготовку программы компьютера

Нам нужно подключить к управлению все порты микроконтроллера Attiny2313. Свободных линий портов у нас получается 13 штук, под контролем находится сейчас только 1 линия, светодиод подключен к ней. Возьмём под контроль все 13 линий.

Изменение программы для микроконтроллера

1) Открываем файл C:OpenRoboFWmain.c, находим там область кода, обозначенную как

настройка портов

, надо установить все свободные порты на вывод командами DDR, меняем содержимое области на следующий код. Код для main.c:

Это программа для микроконтроллера AVR, которая создана в программе WinAVR Программа Комментарии

1

2

3

4

5

6

DDRB = 0b11111111;
 

DDRD |= _BV(0);
 

DDRD |= _BV(1);
 

DDRD |= _BV(3);
 

DDRD |= _BV(5);
 

DDRD |= _BV(6);

Настроили порт B на вывод записав единицы в DDR

Порт D не весь настраиваем, а по одному биту вбиваем единицы таким образом на биты 0, 1, 3, 5 и 6

Небольшое пояснение этого кода — порт B полностью свободен, все его разряды сразу ставим на вывод, порт A полностью занят, его не трогаем, порт D частично занят, поэтому на вывод ставим только свободные разряды, которые тут и перечисляем — 0, 1, 3, 5, 6.

2) Открываем файл C:OpenRoboFWmain.c, находим область кода, обозначенную как

программа реакции на USB пакет

, сделаем, чтобы по команде зажигались светодиоды на всех свободных линиях. Меняем содержимое области на… Код для main.c

Это программа для микроконтроллера AVR, которая создана в программе WinAVR Программа Комментарии

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

if (p1==1) {
 

PORTB = 0b11111111;
 

PORTD |= _BV(0);
 

PORTD |= _BV(1);
 

PORTD |= _BV(3);
 

PORTD |= _BV(5);
 

PORTD |= _BV(6);
 

} else {
 

PORTB = 0b00000000;
 

PORTD &= ~_BV(0);
 

PORTD &= ~_BV(1);
 

PORTD &= ~_BV(3);
 

PORTD &= ~_BV(5);
 

PORTD &= ~_BV(6);
 

}

Если первое число пришло 1

Записываем единицы в порт B и в части порта D

Если первое число пришло другое

Записываем нули в порт B и в части порта D

Пересобираем и перепрошиваем, убеждаемся, что светодиод работает на всех линиях.

К тому же неплохо бы научится вставлять свои функции, которые будут выполняться по вашим командам, пока есть только on, off, status, нужно добавить еще команд, например добавим команду discoteka, по которой будет вызываться какая-нибудь наша функция в микроконтроллере, например — светодиоды горят через один на порте B. Добавим в микроконтроллере обработку дополнительных кодов, пусть это будет код 2, т.к. 1 и 0 уже используются для функций on и off, из программы для компьютера будем посылать потом микроконтроллеру код 2 функцией, вызываемой по команде discoteka. Опять меняем файл C:OpenRoboFWmain.c, область реакции… Код для main.c

Это программа для микроконтроллера AVR, которая создана в программе WinAVR Программа Комментарии

1

2

3

4

5

6

7

8

9

if (p1==1) {
 

PORTB = 0b11111111;
 

} else if (p1==2) {
 

PORTB = 0b10101010;
 

} else {
 

PORTB = 0b00000000;
 

}

Если пришла единица

Включить весь порт B

Если пришла двойка

Включить биты порта B через один

Если пришло другое

Вылючить весь порт B

Вставляем обработку кодов таким образом, старые коды 1 и 0 как видите сохранили свои функции (зажечь / потушить светодиоды) и появился еще новый код 2, по которому на порте B выставляется состояние, при котором светодиоды через один горят. Таким же образом можно сюда поставить любые другие коды и написать для них необходимые функции.

Изменение программы для компьютера

1) Открываем файл C:OpenRoboset-led.c

2) Надо научиться отправлять микроконтроллеру более сложные сообщения, при приеме которых он будет выполнять нужные функции. Сейчас отправляется только 2 сообщения в переменной isOn — 0 = выключить светодиод, 1 = включить светодиод. Научимся отправлять также код 2 = выставить светодиоды через один на порте B (в предыдущем примере мы подготовили микроконтроллер для обработки этого кода, теперь просто пошлём его программой с компьютера).

3) Редактируем файл set-led.c вставляем сверху от строчки

  Программа

1

} else if ((isOn = (strcasecmp(argv[1], «on») == 0)) || strcasecmp(argv[1], «off») == 0) {

следующий код, который добавляет новый код вызова 2 для функции микроконтроллера

  Программа

1

2

3

4

} else if (strcasecmp(argv[1], «discoteka») == 0) {
 

fprintf(stderr, «Every body dance now!n»);
 

cnt = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT, CUSTOM_RQ_SET_STATUS, 2, 0, buffer, 0, 5000);
 

if (cnt < 0) {fprintf(stderr, «USB error: %sn», usb_strerror());}

Код отправляет команду 2 микроконтроллеру, что вызывает там запуск дискотеки. Пересобираем программу для компьютера и нам становится доступна новая команда — discoteka. Таким образом можно вставить любые другие коды и функции для них. В C++ есть функция Sleep(1000); она задаёт задерку выполнения в милисекундах, например 1000 — это 1 секунда. Она полезна, с ней также можете сделать светодиоды мигающими. В будующем эта функция пригодится.

Обратите внимание на функцию usb_control_msg, в ней можно передать 2 изменяемых параметра (в первом у нас передаётся 2 или переменная isOn, которая равна 1 или 0), следующее число (там стоит 0) может передать еще 1 значение, например, 1 переменная может быть всё также быть изначальной командой на on или off, а второй переменной можно передать, например, номер порта, который следует включить. Получить доступ к этим параметрам в программе для микроконтроллера можно по именам p1 и p2, для этого примера p1=2, p2=0.

Как сделать программу для Windows

Чтобы создать программу для Windows, скачайте бесплатное средство разработки программ для Windows

Microsoft Visual C++ 2010 Express

. На указанной странице найдите в середине где-то по названию продукт Microsoft Visual C++ 2010 Express и установите его. Но перед этим проверьте, что у вас не установлена программа .NET Framework версии выше 4. Если такая установлена в вашей системе — перед установкой удалите ее. В комплекте будет поставлен фреймворк нужной версии 4 автоматом. Иначе у вас не будут работать проекты, будет возникать ошибка — Microsoft Resource File To COFF Object Conversion не работает при попытке компиляции проекта. Windows update автоматом попытается поставить последнюю версию .NET Framework, нужно такую установку отменить — не перезагружать компьютер с новыми обновлениями, а зайти в Windows Update и снять галочку напротив фреймворка.

1) Заходим на сайт, выбираем русский язык, нажимаем INSTALL NOW.
2) После установки запускаем, нажимаем Создать проект. Для начала создадим простую программу с 1 кнопкой — нажимаем эту кнопку, текст в ней меняется.
3) Выбираем шаблон Приложение Windows Forms, внизу вводим название программы, нажимаем OK.
4) Перетаскиваем справа элемент Button на центральное окно с формой и оставляем его внутри формы.
5) Кликаем на форму и на кнопку, при этом справа внизу есть окно Свойства, его содержимое меняется. В этом окне задаём необходимые свойства элементов — текст кнопки и окна. Редактируем свойство Text, пишем там любой текст, например, Моя кнопка. Текст на кнопке меняется, это видно на форме в центральном окне.
6) Теперь сделаем так, чтобы при нажатии на эту кнопку, ее свойство, которое определяет текст на ней менялось на другое. Так же можно менять любые другие свойства.
7) Делаем двойной клик на кнопке Моя кнопка, которая находится в форме в центральном окне, попадаем в файл кода Form.h (его можно выбрать в любое время слева в меню). В этом файле после двойного клика была создана функций button1_Click (остальной код автоматом был создан по шаблону при создании проекта), курсор находится внутри нее, нажмите Enter, чтобы создать пустую строку, куда и будем писать код.
8) Как можно видеть в этом же файле чуть повыше есть разделы — button1 и form1, там заданы начальные установки для элементов — кнопки и формы. Воспользуемся ими, скопируем внутрь нашей функции клика по кнопке (это место отмечено красной стрелкой) строчку, где устанавливается название кнопки, а именно this->button1->Text = L»Моя кнопка»;   Только текст Моя кнопка изменим на Работает!
9) Нажимаем на кнопку с зеленым треугольником, через некоторое время наша программа запустится (если вы не совершили ошибок) и при нажатии на кнопку, текст внутри меняется с Моя кнопка на Работает!
10) Забрать готовую программу (файл .exe) можно в директории текущего пользователя …DocumentsVisual Studio 2010ProjectsУправление роботомDebug

Весь процесс показан на картинках.

Делаем свою программу для Windows, из которой будем управлять устройством USB

Делаем свою программу для Windows, из которой будем управлять устройством USB

Перенос программы для USB в Windows Forms.
Я перенес программу управления из консольного приложения в приложение с окнами Windows и немного улучшил её — сделал управление шаговым двигателем в дополнение к управлению светодиодом, добавил горячие клавиши запуска двигателя в определенном направлении с заданным количеством шагов, управляющие сигналы драйвера шагового двигателя подключены к портам PB7 (шаг), PB6 (направление), PB5 (питание), светодиод подключен к порту PB0. Вы можете просто скачать мой проект для Microsoft Visual C++ 2010 Express Edition (русская версия) и посмотреть как я это сделал.

Микроконтроллер – микросхема, предназначенная для управления электронными устройствами, или по другому – простенький компьютер (микро-ЭВМ), способный выполнять несложные задачи.

Микроконтроллеры AVR: устройство и программирование
Рано или поздно, любой радиолюбитель (я так думаю), приходит к мысли о применении в своих разработках микроконтроллеров. Микроконтроллер позволяет существенно «облегчить» радиолюбительскую конструкцию, сделать ее проще и намного функциональнее.

Что нужно для того, чтобы начать пользоваться всеми возможностями микроконтроллеров? Я считаю, что не так уж и много. Главное в этом деле — желание. Будет желание, будет и результат.

 В этом разделе (и в разделе «Устройство AVR») сайта я постараюсь помочь начинающим «микроконтроллерщикам» сделать первый, он же самый трудный шаг навстречу микроконтроллерам — попробуем разобраться в устройстве и программировании микроконтроллеров AVR семейства ATtiny и ATmega.

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

В своих статьях я буду опираться на материалы из публикаций популярных авторов микроконтроллерной тематики: Рюмика С.М., Белова А.В., Ревича Ю.В., Евстифеева А.В., Гребнева В.В., Мортона Д., Трамперта В., Фрунзе А.В. и Фрунзе А.А. (и многих других), а также материалы радиолюбительских сайтов. Ну и, может быть, немного своих «умных мыслей».


Программирование микроконтроллеров AVR фирмы Atmel


Микроконтроллеры - первый шаг1. Микроконтроллеры — первый шаг

Эта статья, как и все последующие, — маленький шажок в мир микроконтроллеров. И таких «шажков» у нас будет много, пока не дойдем до того момента, когда сможем сказать: «Микроконтроллер — последний шаг». Но и это, скорее всего, из области фантастики — нельзя объять необъятное, — мир микроконтроллеров постоянно развивается и совершенствуется. Наша задача — сделать первый шаг, логическим итогом которого должна стать первая, самостоятельно разработанная и собранная конструкция на микроконтроллере.


Системы счисления2. Системы счисления: десятичная, двоичная и шестнадцатиричная

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


Логические выражения3. Логические операции, логические выражения, логические элементы

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


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


5. Прямой, обратный и дополнительный коды двоичного числа

Прямой, обратный и дополнительный коды двоичного числа — способы представления двоичных чисел с фиксированной запятой в компьютерной (микроконтроллерной) арифметике, предназначенные для записи отрицательных и неотрицательных чисел


Программатор USBASP AVR6. USBASP программатор для микроконтроллеров AVR — идеальное решение для начинающих, и не только

Сегодня мы рассмотрим как, без особых затрат и быстро, запрограммировать любой микроконтроллер AVR поддерживающий режим последовательного программирования (интерфейс ISP) через USB-порт компьютера. В качестве программатора мы будем использовать очень простой и популярный программатор USBASP, а в качестве программы — AVRdude_Prog V3.3, которая предназначена для программирования МК AVR.


Программа AVRdudeProg7. Программа AVRDUDE_PROG: программирование микроконтроллеров AVR ATmega и ATtiny

Популярнейшая программа AVRDUDE_PROG 3.3 предназначена для программирования микроконтроллеров AVR ATmega и ATtiny


Основы программирования микроконтроллеров8. Основы программирования микроконтроллеров AVR

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


Программа Atmel Studio9. Русификация программы Atmel Studio

В этой статье мы поговорим о проблемах русификации программы Atmel Studio, как перевести программу на русский (или другой) язык, и как сделать более удобной работу программы с программатором USBASP. После установки программы Atmel Studio весь интерфейс будет на английском языке. Кому-то, кто знаком с английским, или уже привык работать с программами с английским интерфейсом, это вполне устроит. Меня лично, такой подход создателей программы к великому и могучему не устраивает, мне более комфортно работать с русскими меню.


Почему С10. Введение в язык программирования С (Си) для микроконтроллеров

В этой статье будут рассмотрены основные сведение о языке С, структура программы на языке С, дано понятие о функциях, операторах и комментариях данного языка программирования.


Арифметические операции С11. Переменные и константы в языке С (Си) для микроконтроллеров AVR

В этой статье будут рассмотрены типы переменных в языке С (Си) для микроконтроллеров AVR, объявление переменных, способы задания констант, будет дан обзор арифметических операций языка С, присваивания, инкремента и декремента.


Зажигание светодиода12. Управление портами микроконтроллеров AVR на языке С (Си)

В этой статье будет рассмотрено управление портами микроконтроллеров AVR на языке программирования С (Си): установка выводов порта на вход или выход, считывание значений на входах портов, программа для управления миганием светодиода.



Структура цикла с предусловием13. Циклы в языке С (Си) для микроконтроллеров AVR

В данной статье будут рассмотрены циклы в языке программирования Си для микроконтроллеров AVR. Будут рассмотрены циклы типа «для» (for) и циклы типа «пока» (while), будет показано как осуществить принудительное прерывание цикла и организовать бесконечный цикл.



Что такое массив14. Массивы в программировании микроконтроллеров AVR

В данной статье мы рассмотрим основы использования массивов в языке С для микроконтроллеров AVR и рассмотрим их практическое применение в программе для изменения цифр на семисегментном индикаторе.



Что такое конечный автомат15. Конечные автоматы в микроконтроллерах AVR

В данной статье мы рассмотрим применительно к микроконтроллерам AVR такой интересный стиль программирования микроконтроллеров как автоматное программирование. Точнее это даже не стиль программирования а целая концепция, благодаря которой программист микроконтроллеров может существенно облегчить свою жизнь. Благодаря ей многие задачи, поставленные перед программистом, решаются гораздо легче и проще, избавляя программиста от многих сложностей. Автоматное программирование часто также называют Switch-технологией


(29 голосов, оценка: 4,76 из 5)
Загрузка…


Программирование микроконтроллеров AVR

Микроконтроллеры AVR: программирование и применение микроконтроллеров ATmega и ATtiny для начинающих

Published by: Мир микроконтроллеров

Date Published: 04/01/2015

В этой статье представлена пошаговая инструкция, которая поможет вам самостоятельно создать приложение для Android-смартфона, предназначенное для управления чем-либо через Bluetooth. Для демонстрации мы подробно разберем пример мигания светодиодом на Arduino по командам с телефона или планшета. В результате выполнения наших инструкций вы научитесь делать вот так:

Для управления домашним роботом достаточно добавить кнопок и обработать их команды на стороне Arduino.

Что для этого потребуется

  1. Любая Arduino-совместимая плата
  2. Bluetooth-модуль
  3. Устройство на котором установлена ОС Android

В качестве Bluetooth-модуля лучше всего использовать HC-05. Его легко купить в китайском интернет магазине или на eBay. Модуль питается от 3.3 В, но его линии I/O могут работать и с 5-вольтовой логикой, что позволяет подключать его UART к Arduino.

Внешний вид Bluetooth-модуля HC-05

Bluetooth-модуль HC-05

Подключение Bluetooth-модуля к Arduino

Так теперь нам нужно подключить нашу Arduino с Bluetooth. Если на Arduino нет вывода с 3.3В , а только 5В то нужен будет поставить стабилизатор чтобы снизить питание. Назначение выводов HC-05 легко найти в интернете. Для использования рекомендуем вам сделать плату с выведенными линиями питания, Rx и Tx. Подключение к Arduino необходимо производить в следующем порядке:

  • вывод Arduino 3.3В или (5В через стабилизатор!) — к 12 пину модуля Bluetooth
  • вывод Arduino GND — к 13 пину модуля Bluetooth
  • вывод Arduino TX — к 2 пину модуля RX Bluetooth
  • вывод Arduino RX — к 1 пину модуля TX Bluetooth

После подключения необходимо проверить работоспособность Bluetooth модуля. Подключим Светодиод к 12 выводу Arduino и загрузим на плату следующий скетч:

char incomingByte;  // входящие данные
int  LED = 12;      // LED подключен к 12 пину

void setup() {
  Serial.begin(9600); // инициализация порта
  pinMode(LED, OUTPUT); //Устанавливаем 12 вывод как выход
  Serial.println("Press 1 to LED ON or 0 to LED OFF...");
}

void loop() {
  if (Serial.available() > 0) {  //если пришли данные
    incomingByte = Serial.read(); // считываем байт
    if(incomingByte == '0') 
    {
       digitalWrite(LED, LOW);  // если 1, то выключаем LED
       Serial.println("LED OFF. Press 1 to LED ON!");  // и выводим обратно сообщение
    }
    if(incomingByte == '1') {
       digitalWrite(LED, HIGH); // если 0, то включаем LED
       Serial.println("LED ON. Press 0 to LED OFF!");
    }
  }
}

Теперь скачиваем из Play Market программу Bluetooth-терминал и устанавливаем его. Включаем нашу Arduino. В приложении Нажимаем кнопку меню->Connect a device-Secure.
Тем самым ваше устройство начнём искать Bluetooth поблизости. Наш модуль должен называться HC-05. Вам потребуется выписать его MAC-адрес, так он понадобится в дальнейшем. Как только он обнаружит устройство HC-05 выберите его. Пароль, если потребуется: 1234 (это стандартный код). После того как вы подключились к нему у вас должно вывести сообщение которое пришло в Bluetooth терминал от Arduino: “Press 1 to LED ON or 0 to LED OFF..” Далее введите 1 и нажмите отправить. Тем самым вы посылаете цифру 1 через Bluetooth на Arduino. Как только он примет цифру 1 должен загореться светодиод подключенный к 12 выводу Arduino. После введите цифру 0 и светодиод должен погаснуть. Если всё получилось переходим дальше.

Установка Android SDK

Скачиваем с официального сайта программу для создания приложений для android любых моделей. Распаковываем архив, запускаем SDK Manager.exe и устанавливаем программу. Вам предложат установить API, и версию android для которой вы в дальнейшем будете устанавливать приложения.

Окно Android SDK Manager

Android SDK Manager

После нажимаем кнопку Install, ждём когда завершиться установка и закрываем окно.
Заходим в саму программу, она находиться в папке eclipse/eclipse.exe. После открытия программы в диалоговом окне необходимо указать директорию для хранения будущих проектов. Лучше создавать папку на локальном диске, используя при этом только латинские буквы.

Создание приложения

Выбираем File->New->Project.
Window
Так как мы создаём приложение для android, выбираем Android-> Android Application Project, и нажимаем Next
Window2
Следующее диалоговое окно:
Window3
Application Name -> пишем имя приложение,
Project Name -> пишем имя проекта,
Package Name -> Ни чего не пишем он создается автоматически!
Minimum Required SDK -> это минимальные требование указываем нашу версию Android у меня 4.1 её я и выбираю.
Target SDK -> выбираем вашу версию Android
Compile with -> выбираем вашу версию Android
Theme: для начала я бы советовал выбрать None.
Нажимаем Next.
В следующем окне ничего менять не нужно. Просто жмем Next.
Window4
Далее нам предлагают создать свою иконку для приложения, можете изменить стандартный ярлык загрузив свою картинку, я же для начала предлагаю просто нажать Next.
Window5
В следующем необходимо выбрать пункт меню Blank Activity и нажимать Next.
Window6
Жмем Finish и через несколько секунд открывается главное окно нашей программы. Выбираем вкладку Activity_main.xml и видим наш редактор:
Window7

  1. Файлы нашего проекта.
  2. Run Запуск эмулятора для проверки программы на наличие ошибок
  3. Панель кнопок текста и многое другое от сюда вы будите выбирать что вам нужно и добавлять в качестве элементов приложения
  4. Для выбора размера дисплея вашего телефона или планшета
  5. Выбор ориентации. Два вида: горизонтальный и вертикальный
  6. API уровень (лучше не трогать)
  7. Тут будет отображаться всё то что вы добавили в приложение, так же тут можно переименовать ваши добавленные элементы или удалять их.
  8. Показывает свойства элемента, его размер цвет и т.д., так же тут можно редактировать элемент
  9. Показывает наличие ошибок.
  10. Выбор редактирования (графический либо текстовой). Для начинающих конечно лучше пользоваться графическим режимом
  11. Окно вашего приложения , можно видеть интерфейс будущего приложения

Теперь добавим две кнопки в интерфейс приложения. Выбираем элемент Button и переносим его на форму.
Window8
Справа вверху мы видим объекты которые мы добавили. Так же важно, какой из объектов выбран в данный момент. Справа внизу можно редактировать кнопку, давайте изменим текст подписи кнопки и его цвет.
Для этого в поле свойств элемента «Text» введите, вместо button1, значение «ВКЛ», а у button2 — “ВЫКЛ”. Должно получиться вот так:
Window9
Мы можем запустить только что созданное приложение на эмуляторе. Идем в настройки запуска «Run» → Run Configurations», в левой части нажимаем на «Android Application». Появляется новая конфигурация «New_configuration». В правой части окна выбираем вкладку «Target» и выбираем опцию «Launch on all compatible devices/AVD» и добавляем устройство. Проверяем что кнопки появились и их можно нажимать. Если всё хорошо — продолжаем дальше.
Теперь в файлах проекта выбираем bin->AndroidManifest.hml
Window10
Теперь нажмём снизу на AndroudManifest.hml
Window11
В этот файл нам нужно будет добавить две строки:

Они будут запрашивать включение Bluetooth при старте приложение, если он будет выключен приложение попросит пользователя его включить. Добавить его нужно сюда:
Window12
Далее откроем другой файл: src->com.example(name)
Window13
В этом файле и будет наш основной код. Все его содержимое нужно удалить и вставить вот этот код:

package com.example.NAME;//Вместо NAME введите имя вашего проекта

import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;

import com.example.NAME.R;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
  private static final String TAG = "bluetooth1";

  Button button1, button2;//Указываем id наших кнопок

  private static final int REQUEST_ENABLE_BT = 1;
  private BluetoothAdapter btAdapter = null;
  private BluetoothSocket btSocket = null;
  private OutputStream outStream = null;

  // SPP UUID сервиса 
  private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

  // MAC-адрес Bluetooth модуля
  private static String address = "00:00:00:00:00";  //Вместо “00:00” Нужно нудет ввести MAC нашего bluetooth

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    button1 = (Button) findViewById(R.id.button1); //Добавляем сюда имена наших кнопок
    button2 = (Button) findViewById(R.id.button2);

    btAdapter = BluetoothAdapter.getDefaultAdapter();
    checkBTState();

    button1.setOnClickListener(new OnClickListener()  //Если будет нажата кнопка 1 то
    { 
      public void onClick(View v) 
      {
        sendData("1");         // Посылаем цифру 1 по bluetooth
        Toast.makeText(getBaseContext(), "Включаем LED", Toast.LENGTH_SHORT).show();  //выводим на устройстве сообщение
      }
    });

    button2.setOnClickListener(new OnClickListener() {
      public void onClick(View v) 
        {
        sendData("0"); // Посылаем цифру 1 по bluetooth
        Toast.makeText(getBaseContext(), "Выключаем LED", Toast.LENGTH_SHORT).show(); 
      }
    });
  }

  @Override
  public void onResume() {
    super.onResume();

    Log.d(TAG, "...onResume - попытка соединения...");

    // Set up a pointer to the remote node using it's address.
    BluetoothDevice device = btAdapter.getRemoteDevice(address);

    // Two things are needed to make a connection:
    //   A MAC address, which we got above.
    //   A Service ID or UUID.  In this case we are using the
    //     UUID for SPP.
    try {
      btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
    } catch (IOException e) {
      errorExit("Fatal Error", "In onResume() and socket create failed: " + e.getMessage() + ".");
    }

    // Discovery is resource intensive.  Make sure it isn't going on
    // when you attempt to connect and pass your message.
    btAdapter.cancelDiscovery();

    // Establish the connection.  This will block until it connects.
    Log.d(TAG, "...Соединяемся...");
    try {
      btSocket.connect();
      Log.d(TAG, "...Соединение установлено и готово к передачи данных...");
    } catch (IOException e) {
      try {
        btSocket.close();
      } catch (IOException e2) {
        errorExit("Fatal Error", "In onResume() and unable to close socket during connection failure" + e2.getMessage() + ".");
      }
    }

    // Create a data stream so we can talk to server.
    Log.d(TAG, "...Создание Socket...");

    try {
      outStream = btSocket.getOutputStream();
    } catch (IOException e) {
      errorExit("Fatal Error", "In onResume() and output stream creation failed:" + e.getMessage() + ".");
    }
  }

  @Override
  public void onPause() {
    super.onPause();

    Log.d(TAG, "...In onPause()...");

    if (outStream != null) {
      try {
        outStream.flush();
      } catch (IOException e) {
        errorExit("Fatal Error", "In onPause() and failed to flush output stream: " + e.getMessage() + ".");
      }
    }

    try     {
      btSocket.close();
    } catch (IOException e2) {
      errorExit("Fatal Error", "In onPause() and failed to close socket." + e2.getMessage() + ".");
    }
  }

  private void checkBTState() {
    // Check for Bluetooth support and then check to make sure it is turned on
    // Emulator doesn't support Bluetooth and will return null
    if(btAdapter==null) { 
      errorExit("Fatal Error", "Bluetooth не поддерживается");
    } else {
      if (btAdapter.isEnabled()) {
        Log.d(TAG, "...Bluetooth включен...");
      } else {
        //Prompt user to turn on Bluetooth
        Intent enableBtIntent = new Intent(btAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
      }
    }
  }

  private void errorExit(String title, String message){
    Toast.makeText(getBaseContext(), title + " - " + message, Toast.LENGTH_LONG).show();
    finish();
  }

  private void sendData(String message) {
    byte[] msgBuffer = message.getBytes();

    Log.d(TAG, "...Посылаем данные: " + message + "...");

    try {
      outStream.write(msgBuffer);
    } catch (IOException e) {
      String msg = "In onResume() and an exception occurred during write: " + e.getMessage();
      if (address.equals("00:00:00:00:00:00")) 
        msg = msg + ".nnВ переменной address у вас прописан 00:00:00:00:00:00, вам необходимо прописать реальный MAC-адрес Bluetooth модуля";
        msg = msg +  ".nnПроверьте поддержку SPP UUID: " + MY_UUID.toString() + " на Bluetooth модуле, к которому вы подключаетесь.nn";

        errorExit("Fatal Error", msg);       
    }
  }
}

ОБЯЗАТЕЛЬНО! Введите вместо 00:00:00:00:00 МАС вашего Bluetooth модуля, который можно узнать через Bluetooth терминал!!!
Ваше приложение готово. Теперь нам нужно проверить, как оно поведёт себя на устройстве. Запустите для этого симулятор. Если он запустился нормально без ошибок, то в папке, где вы создавали свой проект, будет создан файл с вашей программой. Его необходимо скопировать и установить на свое устройство.

Работа приложения

При нажатии на кнопку “Вкл” ваше Android-устройство передаст через Bluetooth цифру 1 и, как только Arduino примет цифру 1, светодиод загорится. При нажатии на кнопку “Выкл” передается цифра 2 и светодиод выключится, как показано на видео в начале статьи. Всё просто))

Мы будем очень рады, если вы поддержите наш ресурс и посетите магазин наших товаров shop.customelectronics.ru.

Метки: Bluetooth, создание Android-приложения

Просмотров: 61487

РадиоКот >Статьи >

Управление USB-устройствами под Windows

Написать данный мануал меня сподвигло желание помочь окружающим в вопросе написания программ под Windows для управления USB устройствами, т.к. в сети на этот счет очень мало сколь более менее толковой информации. «Мало??» — удивятся некоторые. Да, мало.. Нет, есть конечно инструкции по написанию софта с использованием всяких внешних библиотек, типа libusb и т.д. Когда передо мной стала задача написания софта под Windows, я тоже смотрел в сторону данных библиотек. Но меня жутко не устраивал тот факт, что при переносе программы на другой компьютер также необходимо было и перекачивать прилагающуюся usb-либу. Многие согласятся, что это весьма неудобно, особенно, если свой продукт вы собираетесь куда-то продвигать. Поэтому было принято решение — сделать всё средствами Windows. Тем более поставляющиеся драйвера и ресурсы от Майкрософта позволяют программистам делать ПО для USB устройств без всяких там libusb или ещё черт знает каких рудиментов. И такие программы без проблем запустятся на других машинах. Кроме установщика ничего копировать не придется. Что ж.. 

Для начала.. Статья ориентирована на более продвинутых пользователей, нежели чем на начинающих. В статье отсылок к коду будет мало. Для этого смотрите сам проект. Софт писался для устройства USB класса Custom-HID.  Оговорюсь об используемом средстве разработки. У меня это C++ Builder Embarcaderro XE7. В Visual Studio настройка проекта и т.п. может быть немножко по другому. Но общий принцип не меняется — и там и там код по сути одинаков. ОС — Windows 7. Проект я прикрепил в архиве. Напоминаю, данный проект работает только в C++ Builder XE7 и выше. Для того, чтобы открыть в более старых версиях, нужно будет выкинуть из кода инициализации некоторые инклуды и описатели (реализация C++ Builder старых и новых версий отличается). В старых версиях проще создать свой проект и скопировать туда приложенный в моем проекте код.

Это было предисловие. Поехали..

Для начала, для того чтобы программировать под Windows для USB вам нужно скачать пакет для разработчиков от Майрософта Windows WDK по ссылке https://www.microsoft.com/en-us/download/details.aspx?id=11800

Качаем и устанавливаем. Пути оставляем по умолчанию. После этого открываем наш Builder. Заходим в свойства Tools->Options и далее в Environment Options->C++ Options->Paths And Directories.. ищем строку System Include Path.. и добавляем следующие пути для хидер-файлов из WDK. У меня пути для h-файлов такие:

C:WinDDK7600.16385.1incddk
C:WinDDK7600.16385.1incapi

Потом добавляем путь для библиотек lib. Всё тоже самое, но на этот раз ищем строку System Library Path.. В данном блоке должны быть прописаны пути:

C:WindowsSystem32
C:WindowsSysWOW64 (нужно также добавить, если у вас ОС 64 бит)

Готово. Переходим непосредственно к программе. В софте имеются 3 кнопки (Connect, Disconnect и Check). Нас интересует прежде всего волшебная кнопка Connect, а именно тот код, который она выполняет. Итак.. Открываем файл Unit2.cpp и смотрим Инициализация USB и поиск устройства осуществляется с помощью функций Windows, подробное описание которых приведено на сайте MS. Все базовые функции для работы с HID на уровне Windows и указатели на них объявляются в начале программы.

Код инициализации (и поиска нашего устройства) — это функция enumd()

Сразу вызываем:

hDev = SetupDiGetClassDevs(&hguid,NULL,0,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);

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

Далее получаем размеры структур инфы об устройствах и интерфейсе:

dInf.cbSize = sizeof(SP_DEVINFO_DATA);
dIntDat.cbSize = sizeof (SP_DEVICE_INTERFACE_DATA);

А дальше в хитроумной цикле while поочередно получаем инфу о каждом USB-устройстве, пока те не закончатся)) Из этого перебора читаем данные (VID и PID или ещё чего), с и ищем нужное нам устройство (сравниваем полученные данные с теми, что нам нужны . -> функция connecthid()). 

В функции connecthid мы поочередно пытаемся открыть каждое обнаруженное системой устройство. Многие знающие заметят, что тут используются функции, знакомые некоторым по работе с COM-портом. Те же CreateFile и CloseFile. Да, USB устройство открывается как объект файла. А также как и для COM-порта для USB-девайса создаются потоки записи и чтения.

Функция getinfo сравнивает значение VID и PID текущего устройства с искомым. Если такового нет, то ненужное устройство отключается функцией disconhid(), если мы вдруг с ним соединились (не всякое HID устройство можно открыть методом CreateFile). Если устройство успешно найдено, то индикатор на форме меняет цвет с красного на зеленый, а надпись Off внутри него на On. Искомые VID и PID (а также я добавил строку продукта) определены в переменной:

AnsiString productdata[3] = {«1155″,»22350″,»I2Cdial»};

VID и PID тут представлены в десятичном, а не hex-виде.

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

Ссылка для скачки самого проекта — внизу.

Исправлено и дополнено (06.07.2017): Друзья, нюанс в данном коде был найден давно. Но я решил дополнить статью сейчас, чтобы некоторые не наступили на те грабли, что и я. Вопрос касается самого порядка инициализации девайса. В проекте инициализация происходит так:

-получаем путь каждого устройства, после чего пытаемся открыть (CreateFile) данное устройство. -После этого считываем методом GetAttribute его VID и PID.                                                                   -И если устройство не то, то закрываем его (CloseFile).

Друзья, как оказалось, так делать не рекомендуется. Во превых, постоянным вызовом Create/CloseFile расходуются ресурсы памяти, во вторых — при отключении нашего девайса по нажатию на кнопку Disconnect, программа может закрыть потоки другого какого-либо устройства. С целью исправления данной ошибки порядок инициализации должен быть следующим:

1) Находим устройство, получаем его путь в строке. Данная строка в проекте передается как аргумент в функцию connecthid

2) Найдя путь, вычленяем из строки пути искомые VID и PID. Работаем чисто со строкой, девайс не открываем! Для того чтобы понять, какое положение значения VID и PID занимают в строке, советую вывести её куда-либо (какой-нибудь MEMO или StringList). Копируем полученные значения VID и PID в переменные и сравниваем с исходными. Здесь вся работа целиком со строками.

3) Если по пункту 2. VID и PID совпали с искомыми то только сейчас! мы вызываем функцию CreateFile и открываем наше устройство!

Наслаждаемся))

Файлы:
USB project

Все вопросы в
Форум.


Как вам эта статья?

Заработало ли это устройство у вас?

Понравилась статья? Поделить с друзьями:
  • Как написать программу диалог
  • Как написать программу джарвиса
  • Как написать программу генератор случайных чисел
  • Как написать программу вычисляющую значение функции
  • Как написать программу вычисления площади круга