Вградена универсална интерфейсна платка - USB/Bluetooth/WIFI управление: 6 стъпки
Вградена универсална интерфейсна платка - USB/Bluetooth/WIFI управление: 6 стъпки
Anonim
Вградена универсална интерфейсна платка - USB/Bluetooth/WIFI управление
Вградена универсална интерфейсна платка - USB/Bluetooth/WIFI управление
Вградена универсална интерфейсна платка - USB/Bluetooth/WIFI управление
Вградена универсална интерфейсна платка - USB/Bluetooth/WIFI управление

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

Също така често намирам, че искам да свържа вграден модул с компютър. Ако модулът няма специално USB връзка, което често се случва, тогава обикновено трябва да купите скъп USB конвертор, който ще свърши една работа, като например само SPI или само I2C.

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

Функциите на вградения интерфейс на дъската, върху която се спрях, включват.

  • Цифров I/O
  • I2C
  • SPI
  • UART
  • ШИМ
  • Серво мотор
  • ADC вход
  • DAC изход

Всички те могат да се използват напълно независимо.

Интерфейсната платка може да се управлява чрез USB връзка към компютъра, но също така има опционални WIFI или Bluetooth модулни връзки, за да позволи на платката да се използва дистанционно или в сценарий тип IoT.

С помощта на стандартни SIL заглавия с размери 2,54 мм е възможно директно свързване на женски кабели dupont между платката и вградения модул, което позволява бързи, надеждни и без спойка връзки.

Мислех и за добавяне на неща като CAN, LIN, H-bridge и т.н., но те може би ще дойдат по-късно с v2 ревизия.

Стъпка 1: Проектиране на печатни платки

Проектиране на печатни платки
Проектиране на печатни платки
Проектиране на печатни платки
Проектиране на печатни платки
Проектиране на печатни платки
Проектиране на печатни платки
Проектиране на печатни платки
Проектиране на печатни платки

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

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

С наличните 23 I/O пина това ми позволи тези функции

  • Digtal I/O
  • I2C
  • SPI
  • UART
  • ШИМ x 2
  • Серво мотор x 6
  • ADC вход x 3
  • DAC изход x 1
  • I/O задвижвани от 5V или 3V3
  • Светодиод за състоянието

Един недостатък на интегралната схема, която избрах, е, че тя има само една периферна UART и по този начин използването на Bluetooth или Wifi метод за управление ще ви попречи да използвате UART връзката.

На горните изображения са показани готовите схеми и печатни платки.

Стъпка 2: Проектиране на протокола

Проектиране на протокола
Проектиране на протокола

Първата стъпка при проектирането на протокола е да решите какво конкретно ще ви е необходимо на борда, за да можете да правите. Разбиването на нещата добавя по -добро ниво на контрол, докато комбинирането на нещата опростява интерфейса и намалява комуникационния трафик между платката и компютъра. Това е балансираща игра и трудно се усъвършенства.

За всяка функция на платката трябва да посочите всички параметри и връщания. Например функция за четене на ADC вход може да има параметър за определяне на кой вход да се вземе и възвращаема стойност, съдържаща резултата.

В моя дизайн тук е списъкът с функции, които исках да включа:

  • Цифров I/O

    • SetPin (PinNumber, състояние)
    • Състояние = GetPin (PinNumber)
  • SPI

    • Инициализиране (SPI режим)
    • DataIn = Прехвърляне (DataOut)
    • ControlChipSelect (канал, състояние)
    • SetPrescaler (Rate)
  • I2C

    • Инициализиране ()
    • Старт ()
    • Рестартирам ()
    • Спри се ()
    • SlaveAck = Изпращане (DataOut)
    • DataIn = Получаване (последно)
  • UART

    • Инициализиране ()
    • TX байт (DataOut)
    • BytesAvailable = RX Count ()
    • DataIn = RX байт ()
    • SetBaud (Бод)
  • ШИМ

    • Активиране (канал)
    • Деактивиране (канал)
    • SetFrequency (канал, честота)
    • GetMaxDuty (мито)
    • SetDuty (Дълг)
  • Серво

    • Активиране (канал)
    • Деактивиране (канал)
    • SetPosition (канал, позиция)
  • ADC

    ADCsample = Проба (канал)

  • DAC

    • Активиране
    • Деактивиране
    • SetOutput (напрежение)
  • WIFI

    • 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 сериен компонент и UART компонент от менюто на компонента Comms.

Добавяме RX прекъсване и буфер за улавяне на входящи команди на UART и редовно анкетираме USB. След това можем в свободното си време да обработим буфера.

Приложен е проектът Flowcode и генерираният C код.

Стъпка 4: Свързване чрез Flowcode

Взаимодействие чрез Flowcode
Взаимодействие чрез Flowcode
Свързване чрез Flowcode
Свързване чрез Flowcode
Взаимодействие чрез Flowcode
Взаимодействие чрез Flowcode

Симулацията на Flowcode е много мощна и ни позволява да създадем компонент за разговор с дъската. При създаването на компонента вече можем просто да плъзнем компонента в нашия проект и незабавно да имаме налични функции на борда. Като допълнителен бонус всеки съществуващ компонент, който има SPI, I2C или UART периферно устройство, може да бъде използван в симулацията и комуникационните данни могат да бъдат доставени по интерфейсната платка чрез Injector компонент. Прикачените изображения показват проста програма за отпечатване на съобщение на дисплея. Комуникационните данни, които се изпращат през интерфейсната платка до действителния хардуер на дисплея и настройката на компонента с компоненти I2C Display, I2C Injector и Interface Board.

Новият режим SCADA за Flowcode 8.1 е абсолютен допълнителен бонус, тъй като след това можем да вземем програма, която прави нещо в симулатора на Flowcode, и да я експортираме, така че да работи самостоятелно на всеки компютър без проблеми с лицензирането. Това би могло да бъде чудесно за проекти като тестови платформи или сензорни клъстери.

Използвам този SCADA режим, за да създам инструмента за конфигуриране на WIFI, който може да се използва за конфигуриране на SSID и парола, както и за събиране на IP адреса на модула. Това ми позволява да настроя всичко с помощта на USB връзката и след това да прехвърля към WIFI мрежова връзка, след като нещата се изпълняват.

Приложени са някои примерни проекти.

Стъпка 5: Други методи за взаимодействие

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

Ето списък на езици и методи за комуникация с интерфейсната платка.

Python - Използване на серийна библиотека за поточно предаване на данни към COM порт или IP адрес

Matlab - Използване на файлови команди за поточно предаване на данни към COM порт или IP адрес

C ++ / C# / VB - Използване на предварително написана DLL, директен достъп до COM порта или Windows TCP / IP API

Labview - Използвайки предварително написана DLL, VISA сериен компонент или TCP/IP компонент

Ако някой би искал да види горепосочените езици изпълнени, моля да ме уведомите.

Стъпка 6: Готов продукт

Крайния продукт
Крайния продукт
Крайния продукт
Крайния продукт
Крайния продукт
Крайния продукт

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

Дори раздадох няколко табла за колеги, за да могат те също да подобрят работния си поток и те бяха много добре приети.

Благодаря, че прочетохте моята инструкция. Надявам се да ви е била полезна и да се надяваме, че ще ви вдъхнови да създадете свои собствени инструменти, за да ускорите производителността си.

Препоръчано: