Spisu treści:

Wbudowana uniwersalna karta interfejsu - sterowanie USB/Bluetooth/WIFI: 6 kroków
Wbudowana uniwersalna karta interfejsu - sterowanie USB/Bluetooth/WIFI: 6 kroków

Wideo: Wbudowana uniwersalna karta interfejsu - sterowanie USB/Bluetooth/WIFI: 6 kroków

Wideo: Wbudowana uniwersalna karta interfejsu - sterowanie USB/Bluetooth/WIFI: 6 kroków
Wideo: Prosty sposób na samodzielną diagnostykę auta! #101_Gadżetów 2024, Listopad
Anonim
Wbudowana uniwersalna karta interfejsu - sterowanie USB/Bluetooth/WIFI
Wbudowana uniwersalna karta interfejsu - sterowanie USB/Bluetooth/WIFI
Wbudowana uniwersalna karta interfejsu - sterowanie USB/Bluetooth/WIFI
Wbudowana uniwersalna karta interfejsu - sterowanie USB/Bluetooth/WIFI

Często stwierdzam, że od podstaw tworzę biblioteki dla nowych wbudowanych modułów na podstawie arkusza danych urządzenia. Podczas generowania biblioteki utknąłem w cyklu kodu, kompilacji, programowania i testowania, upewniając się, że wszystko działa i jest wolne od błędów. Często czas kompilacji i programowania może być znacznie dłuższy niż czas potrzebny na edycję kodu, więc sposób na wycięcie tych kroków podczas programowania byłby bardzo przydatny.

Często stwierdzam, że chcę połączyć wbudowany moduł z komputerem. Jeśli moduł nie ma konkretnie połączenia USB, co często ma miejsce, zwykle musisz kupić drogi konwerter USB, który wykona tylko jedno zadanie, takie jak tylko SPI lub tylko I2C.

Właśnie z tych powodów zdecydowałem się stworzyć uniwersalną płytkę interfejsu. Został zaprojektowany, aby umożliwić łatwą komunikację opartą na komputerze PC z wbudowanymi modułami.

Wbudowane funkcje interfejsu płyty, na które się zdecydowałem, obejmują.

  • Cyfrowe we/wy
  • I2C
  • SPI
  • UART
  • PWM
  • Siłownik
  • Wejście ADC
  • Wyjście DAC

Z których można korzystać całkowicie niezależnie.

Płytką interfejsu można sterować za pomocą połączenia USB z komputerem PC, ale ma ona również opcjonalne połączenia modułu WIFI lub Bluetooth, aby umożliwić korzystanie z karty zdalnie lub w scenariuszu typu IoT.

Korzystając ze standardowych nagłówków SIL o rastrze 2,54 mm, można bezpośrednio podłączyć żeńskie kable dupontowe między płytą a wbudowanym modułem, co pozwala na szybkie, niezawodne i wolne od lutowania połączenia.

Myślałem też o dodaniu takich rzeczy jak CAN, LIN, H-bridge itp., ale może to być później z wersją v2.

Krok 1: Projektowanie PCB

Projektowanie PCB
Projektowanie PCB
Projektowanie PCB
Projektowanie PCB
Projektowanie PCB
Projektowanie PCB
Projektowanie PCB
Projektowanie PCB

Projektując PCB lubię starać się, aby wszystko było tak proste, jak to tylko możliwe. Kiedy zamierzasz budować płytki ręcznie, ważne jest, aby dodawać komponenty tylko wtedy, gdy mają określony cel i wykorzystują jak najwięcej wewnętrznych funkcji mikrokontrolera.

Patrząc na mojego preferowanego dostawcę elektroniki, znalazłem chip, z którym czułem się komfortowo, który miał funkcje, których szukałem, i był rozsądny. Chip, na którym wylądowałem, to PIC18F24K50.

Dzięki dostępnym 23 pinom we/wy pozwoliło mi to uzyskać te funkcje

  • Cyfrowe we/wy
  • I2C
  • SPI
  • UART
  • PWM x 2
  • Silnik serwo x 6
  • Wejście ADC x 3
  • Wyjście DAC x 1
  • We/Wy zasilane z 5V lub 3V3
  • Dioda stanu

Jedną wadą układu scalonego, który wybrałem, jest to, że ma tylko jedno urządzenie peryferyjne UART, więc użycie metody sterowania Bluetooth lub Wifi uniemożliwi korzystanie z połączenia UART.

Na powyższych zdjęciach pokazano gotowy schemat i płytkę drukowaną.

Krok 2: Projektowanie protokołu

Projektowanie protokołu
Projektowanie protokołu

Pierwszym krokiem w projektowaniu protokołu jest podjęcie decyzji, co konkretnie będzie potrzebne, aby tablica była w stanie zrobić. Rozbijanie elementów zapewnia lepszy poziom kontroli, podczas gdy łączenie elementów upraszcza interfejs i zmniejsza ruch komunikacyjny między płytą a komputerem. To gra w równowagę i trudna do perfekcji.

Dla każdej funkcji planszy należy wskazać dowolne parametry i zwroty. Na przykład funkcja odczytująca dane wejściowe ADC może mieć parametr określający, które dane wejściowe mają być próbkowane, oraz wartość zwracaną zawierającą wynik.

W moim projekcie oto lista funkcji, które chciałem uwzględnić:

  • Cyfrowe we/wy

    • SetPin (PinNumber, State)
    • Stan = GetPin (PinNumber)
  • SPI

    • Inicjalizacja (tryb SPI)
    • Wejście danych = Transfer (Wyjście danych)
    • ControlChipSelect (kanał, stan)
    • Ustaw Preskaler (szybkość)
  • I2C

    • Zainicjuj ()
    • Początek ()
    • Uruchom ponownie ()
    • Zatrzymać ()
    • SlaveAck = Wyślij (DataOut)
    • DataIn = Odbierz (ostatni)
  • UART

    • Inicjuj()
    • Bajt TX (wyjście danych)
    • Dostępne bajty = Liczba RX ()
    • Wejście danych = Bajt RX ()
    • SetBaud (bodów)
  • PWM

    • Włącz (kanał)
    • Wyłącz (kanał)
    • Ustaw częstotliwość (kanał, częstotliwość)
    • GetMaxDuty (Cło)
    • SetDuty (obowiązek)
  • Serwo

    • Włącz (kanał)
    • Wyłącz (kanał)
    • SetPosition (kanał, pozycja)
  • ADC

    Próbka ADC = Próbka (kanał)

  • DAC

    • Włączyć
    • Wyłączyć
    • SetOutput (napięcie)
  • WIFI

    • Ustaw SSID (SSID)
    • Ustaw hasło (hasło)
    • Status = Sprawdź stan połączenia ()
    • IP = Uzyskaj adresIP ()

Parametry są wyświetlane w nawiasach, a zwroty są wyświetlane przed symbolem równości.

Zanim zacznę kodować przypisuję każdej funkcji kod komendy zaczynający się od 128 (binarny 0b10000000) i idący w górę. W pełni dokumentuję protokół, aby mieć pewność, że kiedy moja głowa znajdzie się w kodzie, będę miał ładny dokument, do którego mogę się odwołać. Pełny dokument dotyczący protokołu dla tego projektu jest załączony i zawiera kody poleceń przychodzących i szerokości bitów.

Krok 3: Projektowanie oprogramowania układowego

Projektowanie oprogramowania układowego
Projektowanie oprogramowania układowego
Projektowanie oprogramowania układowego
Projektowanie oprogramowania układowego
Projektowanie oprogramowania układowego
Projektowanie oprogramowania układowego

Po ustanowieniu protokołu następuje implementacja funkcjonalności na sprzęcie.

Przy opracowywaniu systemów podrzędnych przyjmuję proste podejście typu maszyna stanów, aby spróbować zmaksymalizować potencjalną przepustowość poleceń i danych, jednocześnie utrzymując oprogramowanie układowe proste do zrozumienia i debugowania. Zamiast tego można użyć bardziej zaawansowanego systemu, takiego jak Modbus, jeśli potrzebujesz lepszej interakcji z innymi podłączonymi urządzeniami, ale to zwiększa obciążenie, co spowolni działanie.

Maszyna stanowa składa się z trzech stanów:

1) Czekam na polecenia

2) Odbieranie parametrów

3) Odpowiedz

Te trzy stany oddziałują w następujący sposób:

1) Przechodzimy przez przychodzące bajty w buforze, aż mamy bajt, który ma ustawiony najbardziej znaczący bit. Gdy otrzymamy taki bajt, porównujemy go z listą znanych poleceń. Jeśli znajdziemy dopasowanie, przypisujemy liczbę bajtów parametrów i zwracamy bajty, aby pasowały do protokołu. Jeśli nie ma bajtów parametrów, możemy wykonać polecenie tutaj i albo przejść do stanu 3, albo zrestartować stan 1. Jeśli są bajty parametrów, przechodzimy do stanu 2.

2) Przechodzimy przez przychodzące bajty, zapisując je, dopóki nie zachowamy wszystkich parametrów. Gdy mamy już wszystkie parametry, wykonujemy polecenie. Jeśli są bajty powrotne, przechodzimy do etapu 3. Jeśli nie ma bajtów powrotnych do wysłania, wracamy do etapu 1.

3) Przechodzimy przez przychodzące bajty i dla każdego bajtu nadpisujemy bajt echa prawidłowym bajtem powrotu. Po wysłaniu wszystkich bajtów powrotu wracamy do etapu 1.

Użyłem Flowcode do zaprojektowania oprogramowania, ponieważ ładnie pokazuje wizualnie, co robię. To samo można zrobić równie dobrze w Arduino lub innych wbudowanych językach programowania.

Pierwszym krokiem jest nawiązanie komunikacji z komputerem. Aby to zrobić, mikro musi być skonfigurowany do pracy z odpowiednią prędkością i musimy dodać kod do obsługi urządzeń peryferyjnych USB i UART. W Flowcode jest to tak proste, jak przeciągnięcie do projektu komponentu USB Serial i komponentu UART z menu komponentu Comms.

Dodajemy przerwanie RX i bufor do przechwytywania przychodzących poleceń na UART i regularnie odpytujemy USB. Możemy wtedy w wolnym czasie przetworzyć bufor.

Projekt Flowcode i wygenerowany kod C są załączone.

Krok 4: Łączenie przez Flowcode

Łączenie przez Flowcode
Łączenie przez Flowcode
Łączenie przez Flowcode
Łączenie przez Flowcode
Łączenie przez Flowcode
Łączenie przez Flowcode

Symulacja Flowcode jest bardzo potężna i pozwala nam stworzyć komponent do rozmowy z tablicą. Tworząc komponent, możemy teraz po prostu przeciągnąć komponent do naszego projektu i natychmiast udostępnić funkcje tablicy. Jako dodatkowy bonus dowolny istniejący komponent, który ma urządzenie peryferyjne SPI, I2C lub UART, może być użyty w symulacji, a dane komunikacyjne mogą być przesyłane do płyty interfejsu za pośrednictwem komponentu wtryskiwacza. Załączone obrazy przedstawiają prosty program do drukowania wiadomości na wyświetlaczu. Dane komunikacyjne przesyłane przez kartę interfejsu do rzeczywistego sprzętu wyświetlacza i konfiguracji komponentów z komponentami wyświetlacza I2C, wtryskiwacza I2C i płyty interfejsu.

Nowy tryb SCADA dla Flowcode 8.1 to absolutny dodatkowy bonus, ponieważ możemy następnie wziąć program, który robi coś w symulatorze Flowcode i wyeksportować go, aby działał samodzielnie na dowolnym komputerze bez żadnych problemów licencyjnych. Może to być świetne w przypadku projektów takich jak stanowiska testowe lub klastry czujników.

Używam tego trybu SCADA do tworzenia narzędzia konfiguracyjnego WIFI, które może być użyte do konfiguracji SSID i hasła, a także do zbierania adresu IP modułu. To pozwala mi skonfigurować wszystko za pomocą połączenia USB, a następnie przenieść się do połączenia sieciowego WIFI, gdy wszystko jest uruchomione.

W załączeniu kilka przykładowych projektów.

Krok 5: Inne metody łączenia

Oprócz Flowcode, do komunikacji z płytą interfejsu można w dużym stopniu używać wybranego języka programowania. Użyliśmy Flowcode, ponieważ zawierał już bibliotekę części, którą mogliśmy natychmiast uruchomić, ale dotyczy to również wielu innych języków.

Oto lista języków i metod komunikacji z płytą interfejsu.

Python - korzystanie z biblioteki szeregowej do przesyłania danych do portu COM lub adresu IP

Matlab - Używanie poleceń File do przesyłania danych do portu COM lub adresu IP

C++ / C# / VB - Korzystanie z wstępnie napisanej biblioteki DLL, bezpośredni dostęp do portu COM lub Windows TCP/IP API

Labview - przy użyciu wstępnie napisanej biblioteki DLL, komponentu VISA Serial lub komponentu TCP/IP

Jeśli ktoś chciałby zobaczyć zaimplementowane powyższe języki, proszę o informację.

Krok 6: Gotowy produkt

Ukończony produkt
Ukończony produkt
Ukończony produkt
Ukończony produkt
Ukończony produkt
Ukończony produkt

Gotowy produkt będzie prawdopodobnie przez wiele lat wyróżniał się w moim wbudowanym zestawie narzędzi. Pomogło mi to już w opracowaniu komponentów do różnych wyświetlaczy i czujników Grove. Mogę teraz uzyskać kod całkowicie przybity, zanim ucieknę się do jakiejkolwiek kompilacji lub programowania.

Rozdałam nawet kilka tablic dla kolegów, aby także mogli usprawnić swoją pracę i zostały one bardzo dobrze przyjęte.

Dziękuję za przeczytanie mojego Instructable. Mam nadzieję, że okazał się on przydatny i mam nadzieję, że zainspiruje Cię do stworzenia własnych narzędzi, które przyspieszą Twoją produktywność.

Zalecana: