Оглавление:
- Шаг 1: проектирование печатной платы
- Шаг 2: разработка протокола
- Шаг 3: Разработка прошивки
- Шаг 4: Взаимодействие через Flowcode
- Шаг 5: другие методы взаимодействия
- Шаг 6: Готовый продукт
Видео: Встроенная универсальная интерфейсная плата - управление USB / Bluetooth / WIFI: 6 шагов
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:52
Я часто нахожу, что создаю библиотеки для новых встроенных модулей с нуля на основе таблицы данных устройства. При создании библиотеки я застреваю в цикле кода, компиляции, программирования и тестирования, чтобы убедиться, что все работает и не содержит ошибок. Часто время компиляции и программирования может быть намного больше, чем время, необходимое для редактирования кода, и поэтому способ вырезать эти шаги при разработке был бы очень удобен.
Я также часто обнаруживаю, что хочу связать встроенный модуль с ПК. Если модуль специально не имеет USB-соединения, что часто бывает, вам обычно приходится покупать USB-преобразователь по завышенной цене, который будет выполнять одну работу, например, только SPI или просто I2C.
Именно по этим причинам я решил создать универсальную интерфейсную плату. Он разработан, чтобы обеспечить простую связь на базе ПК со встроенными модулями.
Я остановился на встроенных интерфейсных функциях платы.
- Цифровой ввод / вывод
- I2C
- SPI
- UART
- ШИМ
- Серводвигатель
- Вход АЦП
- Выход ЦАП
Все это можно использовать совершенно независимо.
Интерфейсная плата может управляться через USB-соединение с ПК, но также имеет дополнительные подключения модуля Wi-Fi или Bluetooth, что позволяет использовать плату удаленно или в сценарии типа IoT.
Используя стандартные SIL-заголовки с шагом 2,54 мм, можно напрямую подключать кабели Dupont с внутренней резьбой между платой и встроенным модулем, что обеспечивает быстрое, надежное соединение без пайки.
Я также думал о добавлении таких вещей, как CAN, LIN, H-bridge и т. Д., Но они, возможно, появятся позже с версией v2.
Шаг 1: проектирование печатной платы
При разработке печатной платы я стараюсь делать все как можно проще. Когда вы собираетесь собирать платы вручную, важно добавлять компоненты только тогда, когда они служат для определенной цели и используют как можно больше внутренних функций микроконтроллера.
Посмотрев на поставщика электроники, которого я предпочел, я нашел микросхему, с которой мне было комфортно, с теми функциями, которые я искал, и по разумной цене. Чип, на который я попал, был PIC18F24K50.
Благодаря доступным 23 контактам ввода / вывода это позволило мне эти функции
- Цифровой ввод / вывод
- I2C
- SPI
- UART
- ШИМ x 2
- Сервомотор x 6
- Вход АЦП x 3
- Выход ЦАП x 1
- Ввод / вывод с питанием от 5 В или 3 В 3
- Светодиод состояния
Одним из недостатков выбранной мной микросхемы является то, что она имеет только одно периферийное устройство UART, поэтому использование метода управления Bluetooth или Wi-Fi не позволит вам использовать соединение UART.
На изображениях выше показаны готовая схема и печатная плата.
Шаг 2: разработка протокола
Первым шагом в разработке протокола является решение, что конкретно вам нужно, чтобы плата могла делать. Разбивка на части повышает уровень контроля, тогда как объединение вещей воедино упрощает интерфейс и снижает коммуникационный трафик между платой и ПК. Это балансирующая игра, и ее сложно довести до совершенства.
Для каждой функции платы вы должны указать какие-либо параметры и возвраты. Например, функция для чтения входа АЦП может иметь параметр, указывающий, какой вход отбирать, и возвращаемое значение, содержащее результат.
Вот список функций, которые я хотел включить в свой дизайн:
-
Цифровой ввод / вывод
- SetPin (номер вывода, состояние)
- Состояние = GetPin (PinNumber)
-
SPI
- Инициализация (режим SPI)
- DataIn = передача (DataOut)
- ControlChipSelect (канал, состояние)
- SetPrescaler (скорость)
-
I2C
- Инициализировать ()
- Начинать ()
- Рестарт ()
- Стоп ()
- SlaveAck = Отправить (DataOut)
- DataIn = получение (последний)
-
UART
- Инициализировать ()
- Байт TX (выход данных)
- BytesAvailable = Количество приемов ()
- DataIn = Байт RX ()
- SetBaud (бод)
-
ШИМ
- Включить (канал)
- Отключить (канал)
- SetFrequency (канал, частота)
- GetMaxDuty (Долг)
- SetDuty (Долг)
-
Сервопривод
- Включить (канал)
- Отключить (канал)
- SetPosition (канал, позиция)
-
АЦП
ADCsample = Sample (канал)
-
ЦАП
- Давать возможность
- Запрещать
- SetOutput (напряжение)
-
ВАЙ ФАЙ
- SetSSID (SSID)
- Установить пароль (пароль)
- Статус = CheckConnectionStatus ()
- IP = GetIPAddress ()
Параметры показаны в скобках, а возвращаемые значения показаны перед знаком равенства.
Прежде чем я начну кодировать, я назначаю каждой функции код команды, начиная с 128 (двоичный 0b10000000) и двигаясь вверх. Я полностью документирую протокол, чтобы убедиться, что, как только моя голова окажется в коде, у меня будет хороший документ, к которому можно вернуться. Полный документ протокола для этого проекта прилагается и включает коды входящих команд и разрядность.
Шаг 3: Разработка прошивки
После того, как протокол установлен, можно приступить к реализации функций на оборудовании.
При разработке ведомых систем я использую простой подход типа конечного автомата, чтобы попытаться максимизировать потенциальную пропускную способность команд и данных, сохраняя при этом простоту понимания и отладки микропрограмм. Вместо этого можно использовать более продвинутую систему, такую как Modbus, если вам нужно лучшее взаимодействие с другими подключенными устройствами, но это добавляет накладные расходы, которые замедляют работу.
Конечный автомат состоит из трех состояний:
1) Ожидание команд
2) Параметры приема
3) Ответить
Эти три состояния взаимодействуют следующим образом:
1) Мы просматриваем входящие байты в буфере, пока не получим байт, в котором установлен самый старший бит. Получив такой байт, мы сравниваем его со списком известных команд. Если мы находим совпадение, мы назначаем количество байтов параметра и возвращаем байты в соответствии с протоколом. Если байтов параметров нет, мы можем выполнить команду здесь и либо перейти к состоянию 3, либо перезапустить состояние 1. Если есть байты параметров, мы переходим к состоянию 2.
2) Мы просматриваем входящие байты, сохраняя их, пока не сохраним все параметры. Когда у нас есть все параметры, мы выполняем команду. Если есть байты возврата, мы переходим к этапу 3. Если нет байтов возврата для отправки, мы возвращаемся к этапу 1.
3) Мы просматриваем входящие байты и для каждого байта перезаписываем эхо-байт допустимым байтом возврата. После того, как мы отправили все байты возврата, мы вернемся к этапу 1.
Я использовал Flowcode для разработки прошивки, поскольку она наглядно демонстрирует то, что я делаю. То же самое можно было бы сделать в Arduino или других встроенных языках программирования.
Первый шаг - установить связь с ПК. Для этого микроконтроллер должен быть настроен для работы с нужной скоростью, и мы должны добавить код для управления периферийными устройствами USB и UART. В Flowcode это так же просто, как перетащить в проект компонент USB Serial и компонент UART из меню компонентов Comms.
Мы добавляем прерывание RX и буфер для перехвата входящих команд на UART, и мы регулярно опрашиваем USB. Затем мы можем на досуге обработать буфер.
Прилагаются проект Flowcode и сгенерированный код C.
Шаг 4: Взаимодействие через Flowcode
Симуляция Flowcode очень мощная и позволяет нам создать компонент для общения с платой. Теперь при создании компонента мы можем просто перетащить компонент в наш проект и сразу же получить доступ к функциям платы. В качестве дополнительного бонуса любой существующий компонент, имеющий периферийное устройство SPI, I2C или UART, может быть использован в моделировании, а данные связи могут быть переданы на интерфейсную плату через компонент инжектора. Прикрепленные изображения показывают простую программу для вывода сообщения на дисплей. Коммуникационные данные, которые отправляются через интерфейсную плату на фактическое оборудование дисплея и компонентную настройку с компонентами дисплея I2C, инжектора I2C и интерфейсной платы.
Новый режим SCADA для Flowcode 8.1 является абсолютным дополнительным бонусом, поскольку мы можем взять программу, которая что-то делает в симуляторе Flowcode, и экспортировать ее, чтобы она работала автономно на любом ПК без каких-либо проблем с лицензированием. Это может быть отличным вариантом для таких проектов, как испытательные стенды или сенсорные кластеры.
Я использую этот режим SCADA для создания инструмента конфигурации WIFI, который можно использовать для настройки SSID и пароля, а также для сбора IP-адреса модуля. Это позволяет мне настроить все, используя USB-соединение, а затем перейти к сетевому подключению WIFI, как только все будет запущено.
Некоторые примеры проектов прилагаются.
Шаг 5: другие методы взаимодействия
Как и Flowcode, вы можете в значительной степени использовать свой язык программирования для связи с интерфейсной платой. Мы использовали Flowcode, поскольку в него уже была включена библиотека частей, которые мы могли сразу же запустить и запустить, но это также относится ко многим другим языкам.
Вот список языков и методов для связи с интерфейсной платой.
Python - использование последовательной библиотеки для потоковой передачи данных на COM-порт или IP-адрес.
Matlab - Использование команд File для потоковой передачи данных на COM-порт или IP-адрес
C ++ / C # / VB - использование предварительно написанной DLL, прямой доступ к COM-порту или Windows TCP / IP API
Labview - использование предварительно написанной DLL, последовательного компонента VISA или компонента TCP / IP.
Если кто-то хотел бы, чтобы вышеперечисленные языки были реализованы, дайте мне знать.
Шаг 6: Готовый продукт
Готовый продукт, вероятно, будет важной особенностью моего встраиваемого набора инструментов на долгие годы. Это уже помогло мне разработать компоненты для различных дисплеев и датчиков Grove. Теперь я могу полностью обработать код, прежде чем прибегать к каким-либо махинациям компиляции или программирования.
Я даже раздал несколько досок коллегам, чтобы они тоже могли улучшить свой рабочий процесс, и они были очень хорошо приняты.
Спасибо за то, что прочитали мою инструкцию. Надеюсь, она была вам полезна, и надеюсь, что она вдохновит вас на создание собственных инструментов для повышения производительности.
Рекомендуемые:
Универсальная печатная плата расширения ввода / вывода для управления многими лампами Nixie с помощью I2C: 9 шагов (с изображениями)
Универсальная печатная плата расширителя ввода / вывода для управления многими лампами Nixie с помощью I2C: В настоящее время существует большой интерес к воплощению в жизнь старинных ламп Nixie. На рынке доступно множество комплектов часов с трубкой никси. Оказалось, что даже шла оживленная торговля старинными русскими никси-лампами. Также здесь, на Instructables, там
Встроенная светодиодная 3D-печать рождественской елки: 10 шагов (с изображениями)
Встроенная светодиодная 3D-печатная рождественская елка: это 3D-печатная рождественская елка со встроенными адресными светодиодами внутри. Таким образом, можно запрограммировать светодиоды для получения красивых световых эффектов и использовать 3D-печатную структуру в качестве диффузора. Дерево разделено на 4 этапа и базовый элемент (дерево
Встроенная EEPROM вашей Arduino: 6 шагов
Встроенная EEPROM вашей Arduino: в этой статье мы собираемся изучить внутреннюю EEPROM в наших платах Arduino. Что такое EEPROM, возможно, некоторые из вас говорят? EEPROM - это электрически стираемая программируемая постоянная память. Это форма энергонезависимой памяти, которая может запоминать
Печатная плата Тима (печатная плата): 54 шага (с изображениями)
Печатная плата Тима (Plotted Circuit Board): это процесс, который я использую для создания пользовательской печатной платы для своих проектов. Чтобы сделать это: я использую свой XY Plotter с Scribe, чтобы удалить пленку для травления, чтобы обнажить медь для травителя. . Я использую свой XY-плоттер с лазером, чтобы выжигать чернила на
Интерфейсная светодиодная матрица (8x8) с NodeMCU: 6 шагов (с изображениями)
Интерфейсная светодиодная матрица точек (8x8) С NodeMCU: Hello Makers, у меня есть еще одно простое и интересное руководство. В этом руководстве мы узнаем, как подключать светодиодную матрицу точек (8x8) к интерфейсу с NodeMCU. Итак, давайте начнем