Spisu treści:
- Krok 1: Schemat blokowy - sprzęt
- Krok 2: Schemat blokowy - Sieć
- Krok 3: Części, narzędzia, środowisko IDE i zestawienie materiałów
- Krok 4: Projekt sprzętu - płyta główna
- Krok 5: Projektowanie sprzętu - moduł ESP32
- Krok 6: Układ PCB
- Krok 7: Obudowa 3D
- Krok 8: Implementacja oprogramowania - MCU
- Krok 9: Implementacja oprogramowania - aplikacja na Androida
- Krok 10: Testowanie
2025 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2025-01-13 06:58
Pod koniec XX wieku pojawiły się różne innowacje technologiczne, zwłaszcza w dziedzinie komunikacji; ale nie tylko. Dla nas użytkownicy, konsumenci i inżynierowie wyszli na jaw szybki rozwój urządzeń elektronicznych, które mogą znacznie ułatwić nam życie: inteligentne zegarki, inteligentne domy, smartfony itp.
Ponieważ w dzisiejszych czasach wszystko może być „inteligentne”, zdecydowałem się zaprojektować bardzo przydatne urządzenie, które będzie częścią niezbędnego elektronicznego sprzętu laboratoryjnego - przenośny generator funkcji, sterowany za pomocą smartfona z systemem Android za pośrednictwem Wi-Fi Direct lub WiFi Local Area Network (WLAN).).
Dlaczego powinniśmy budować to urządzenie?
Zdecydowana większość sprzętu testującego jest obecnie dość droga. A czasami te urządzenia nie są przenośne. Jako rozwiązanie dla wysokich cen, braku przenośności i braku dostępu do sieci, urządzenie dostarcza dwukanałowy generator przebiegów, który jest rzeczywiście przenośny i ma nieograniczony dostęp do sieci - internetowej lub lokalnej.
No i oczywiście urządzenie powinno być zbudowane z entuzjazmu, z zachowaniem zasad DIY - Czasem po prostu musimy robić rzeczy sami, żeby czuć się dobrze:)
Kluczowe cechy
Zasilacz
- Złącze USB typu A, zarówno dla systemów zasilania, jak i programowania
- Kompletny system zarządzania baterią Li-Ion - Ładowanie i stabilne tryby
- Implementacja Smart Switch - nie ma potrzeby używania przełącznika zasilania
- Podwójne zasilanie: +3,3 V i -3,3 V dla symetrycznego generowania przebiegu napięcia
Generowanie przebiegu
- Implementacja poziomu DC w kaskadzie wyjściowej - przesunięty przebieg między granicami napięcia
- Generowanie 4-rodzajów przebiegów w oparciu o DDS - sinusoidalne, trójkątne, kwadratowe i DC
- Obsługa częstotliwości do 10 MHz
- Prąd wyjściowy do 80mA z maksymalną dostępnością mocy 500mW
- Odseparowane kanały do generowania przebiegów - dzielone obwody oparte na AD9834
Komunikacja
- Wdrożenie ESP32 - Odpowiednie możliwości WiFi
- Pełna obsługa protokołu TCP/IP przez urządzenie generatora i smartfon z systemem Android
- Możliwość przechowywania parametrów użytkownika dla każdego cyklu urządzenia
- Monitorowanie stanu - oba systemy są świadome siebie nawzajem: FuncGen (nazwijmy to w ten sposób od teraz) i smartfon.
Interfejs użytkownika
- 20 x 4 znakowy wyświetlacz LCD z prostym 4-bitowym interfejsem danych
- Aplikacja na Androida - pełna kontrola użytkownika nad urządzeniem FuncGen
- Obwód brzęczyka - dźwiękowa informacja zwrotna dla użytkownika
Krok 1: Schemat blokowy - sprzęt
Jednostka mikrokontrolera - ATMEGA32L
Mikrokontroler to programowalny układ scalony, który składa się z wszystkich funkcji komputera, które znajdują się w jednym elektronicznym układzie scalonym. W naszym przypadku jest to „mózg” i centralny element systemu. Zadaniem MCU jest zarządzanie wszystkimi systemami peryferyjnymi, obsługa komunikacji pomiędzy tymi systemami, kontrolowanie pracy sprzętu oraz zapewnienie pełnej obsługi interfejsu użytkownika i jego interakcji z rzeczywistym użytkownikiem. Projekt oparty na mikrokontrolerze ATMEGA32L, który może pracować na 3,3V i częstotliwości 8MHz.
Komunikacja SoC - ESP32
Ten SoC (System on Chip) zapewnia pełną obsługę komunikacji dla FuncGen - dostęp do funkcji Wi-Fi, w tym komunikacji bezpośredniej, lokalnej lub internetowej. Cele urządzenia to:
- Obsługa transmisji danych między aplikacją na Androida a urządzeniem FuncGen
- Zarządzanie wiadomościami kontrolnymi/danych
- Wsparcie ciągłej konfiguracji TCP/IP Klient-Serwer
W naszym projekcie SoC to espressif ESP32, który jest zbyt popularny, aby go jeszcze bardziej rozbudować:)
System zarządzania akumulatorem litowo-jonowym
W celu przekształcenia naszego urządzenia w przenośne urządzenie zawiera zaprojektowany układ ładowania akumulatorów Li-Ion. Układ oparty jest na układzie scalonym MC73831, z kontrolowanym prądem ładowania poprzez regulację wartości pojedynczego rezystora programującego (omówimy ten temat w kroku Schematy). Wejście zasilania urządzenia to złącze USB typu A.
Inteligentny obwód przełącznika
Obwód sterowania zasilaniem urządzenia z inteligentnym przełącznikiem zapewnia pełną kontrolę oprogramowania nad sekwencją wyłączania urządzenia i brak potrzeby stosowania zewnętrznego przełącznika do odcięcia napięcia akumulatora urządzenia. Wszystkie operacje zasilania są wykonywane przez naciśnięcie przycisku i oprogramowania MCU. W niektórych przypadkach konieczne będzie wyłączenie systemu: niskie napięcie baterii, wysokie napięcie wejściowe, błąd komunikacji i tak dalej. Inteligentny przełącznik oparty jest na inteligentnym układzie scalonym przełącznika STM6601, który jest tani i bardzo przyjazny w obsłudze.
Główny zasilacz
Jednostka ta składa się z dwóch zasilanych bateryjnie obwodów zasilania - +3,3V dla wszystkich obwodów zasilania cyfrowego/analogowego oraz -3,3V dla wyjścia symetrycznego FunGen względem potencjału 0V (tzn. generowany przebieg można ustawić w [-3,3V:3,3V] region.
- Główny obwód zasilania oparty jest na liniowym regulatorze napięcia LP3875-3.3 LDO (low dropout) 1A.
- Wtórny obwód zasilania oparty jest na układzie scalonym LM2262MX, który dokonuje konwersji ujemnego napięcia DC-DC za pomocą kondensatora-pompy ładującej - układu, na którym opiera się układ scalony.
System generatorów przebiegów
System został zaprojektowany z naciskiem na oddzielne układy scalone DDS (bezpośrednia synteza cyfrowa), które umożliwiają pełną kontrolę generowania przebiegów przez SPI (szeregowy interfejs peryferyjny) MCU. Obwody użyte w projekcie to Analog Devices AD9834, które mogą dostarczać różne rodzaje przebiegów. Wyzwania, z którymi musimy się zmierzyć podczas pracy z AD9834 to:
- Stała amplituda przebiegu: amplituda przebiegu jest kontrolowana przez zewnętrzny moduł DAC
- Bez względu na poziom offsetu DC: Implementacja obwodów sumujących z pożądanymi wartościami offsetu DC
- Oddzielne wyjścia dla fali prostokątnej i trójkątnej/sinusoidalnej: Implementacja obwodu przełączającego wysokiej częstotliwości, dzięki czemu każde pojedyncze wyjście kanału może zapewnić wszystkie pożądane przebiegi: sinusoidalne, trójkątne, kwadratowe i DC.
Wyświetlacz ciekłokrystaliczny
LCD jest częścią UI (interfejsu użytkownika), a jego celem jest umożliwienie użytkownikowi zrozumienia, co robi urządzenie w trybie czasu rzeczywistego. Współdziała z użytkownikiem w każdym stanie urządzenia.
Brzęczyk
Prosty obwód generatora tonów dla dodatkowej informacji zwrotnej od urządzenia do użytkownika.
Zintegrowany programista ISP
Każdy inżynier ma problem z procesem programowania: zawsze istnieje najgorsza potrzeba rozmontowania produktu w celu przeprogramowania go nowym oprogramowaniem. Aby przezwyciężyć tę niedogodność, programator AVR ISP został podłączony do urządzenia od środka, natomiast linie danych USB i zasilania podpięte są do złącza USB typu A urządzenia. W tej konfiguracji wystarczy podłączyć nasz FuncGen przez kabel USB do programowania lub ładowania!
Krok 2: Schemat blokowy - Sieć
Dwukanałowy generator funkcyjny
Główne urządzenie. Ten, który sprawdziliśmy w poprzednim kroku
ESP-WROOM-32
Zintegrowany System-on-Chip z funkcjami Wi-Fi i BLE. SoC jest podłączony do płyty głównej (omówimy to w kroku ze schematami) za pośrednictwem modułu UART i działa jako transciever wiadomości między urządzeniem głównym a smartfonem z systemem Android.
Sieć lokalna WiFi
Smartfon i urządzenie będą komunikować się za pośrednictwem sieci Wi-Fi direct lub sieci lokalnej, w oparciu o konfigurację serwera/klienta TCP. Gdy urządzenia rozpoznają się w sieci WiFi, urządzenie główne tworzy serwer TCP o odpowiednich parametrach i jest w stanie wysyłać/odbierać wiadomości. Urządzenie pełni funkcję drugorzędną w stosunku do smartfona. Z kolei urządzenie z systemem Android łączy się z serwerem TCP jako urządzenie sieciowe klienta, ale jest traktowane jako główny nadajnik wiadomości - smartfon jest tym, który inicjuje pełny cykl komunikacji: Wysyłanie wiadomości - odbieranie odpowiedzi.
Smartfon z Androidem
Smartfon z systemem operacyjnym Android, który działa na aplikacji FuncGen
Krok 3: Części, narzędzia, środowisko IDE i zestawienie materiałów
Zestawienie materiałów (patrz załączona tabela XLS)
Interfejs użytkownika i połączenia systemowe
- 1 x 2004A Char-LCD 20x4 niebieski
- 1 x złącze USB typu B
- 1x10 Zestaw Mini Micro JST XH 2,54mm 4 Pin
- 1x6 sztuk Chwilowy SW
Zamawianie PCB (wg Seeed Studio)
Materiał bazowy FR-4
Liczba warstw 2 warstwy
Ilość PCB 10
Liczba różnych wzorów 1
Grubość PCB 1,6 mm
Kolor PCB Niebieski
Wykończenie powierzchni HASL
Minimalna zapora maski lutowniczej 0,4 mm↑
Waga miedzi 1 uncja
Minimalny rozmiar otworu wiertła 0,3 mm
Szerokość śladu / odstępy 6/6 mil
Półotwory platerowane / Otwory koronowe Nie
Kontrola impedancji Nie
Narzędzia
- Pistolet na gorący klej
- Pinceta
- Nóż
- ~ Przewód 22AWG do obsługi usterek
- Lutownica/stacja lutownicza
- Cyna lutownicza
- Stacja naprawcza SMD (opcja)
- Drukarka 3D (opcja)
- Wytłaczanie pliku
- Programista AVR ISP
- Konwerter USB na szeregowy (opcjonalnie, do celów debugowania)
Zintegrowane środowisko programistyczne (IDE) i oprogramowanie
- Autodesk EAGLE lub edytor schematów Cadence / edytor PCB Allegro
- OpenSCAD (opcjonalnie)
- Ultimaker Cura (opcjonalnie)
- Saleae Logic (do rozwiązywania problemów)
- Atmel Studio 6.3 lub nowszy
- Android Studio lub Eclipse IDE
- Monitor szeregowy Docklight/inne oprogramowanie do monitorowania portu COM;
- ProgISP do programowania flash AVR ATMEGA32L
Krok 4: Projekt sprzętu - płyta główna
Obwód zarządzania baterią
Układ ładowania akumulatora oparty jest na układzie scalonym MCP7383, który pozwala na dobranie pożądanego prądu ładowania dla akumulatora Li-Ion - 3,7V o pojemności 850mAh. Prąd ładowania ustawiamy programując wartość rezystora (R1) w naszym przypadku
R1 = 3KOhm, I(ładowanie) = 400mA
Napięcie USB VBUS jest filtrowane przez filtr π (C1, L3, C3) i działa jako źródło zasilania dla obwodu ładowania.
Obwód dzielnika napięcia (R2, R3) pozwala MCU wskazać, czy zewnętrzny zasilacz USB jest podłączony, czy nie, poprzez dostarczenie następującego napięcia do kanału A/D MCU:
V(wskazanie) ~ (2/3)V(BUS)
Ponieważ nasz A/D ATMEGA32L jest 12-bitowy, możemy obliczyć zakres cyfrowy:
A/D (zakres) = 4095 V (wskazanie) / V (REF).
A/D ∈ [14AH: FFFH]
Zasilacz z inteligentnym przełącznikiem
Układ pozwala systemowi na sterowanie zasilaniem każdego zaprojektowanego bloku zarówno z przycisku jak i oprogramowania na MCU i jest oparty na STM6601 Smart-Switch z opcją POWER zamiast RESET. Terminale, które chcemy rozważyć, to:
- PSHOLD - Linia wejściowa, która określa stan urządzenia: jeśli jest wyciągnięty w stan LOW, urządzenie wyłącza wszystkie zasilacze wtórne (+3.3V i -3.3V). Jeśli jest przytrzymany HIGH - urządzenie utrzymuje stan ON.
- nSR i nPB - Linie wejściowe. Zaciski przyciskowe. Po wykryciu spadającej krawędzi na tych pinach urządzenie próbuje przejść do trybu zwiększania/wyłączania zasilania
- nINT - Linia wyjściowa. Pociągnięty LOW za każdym razem, gdy przycisk jest wciśnięty
- PL - Linia wyjściowa, służy do włączania zasilania dla zasilaczy pomocniczych. Gdy jest trzymany w stanie LOW, oba dodatkowe zasilacze są wyłączone
Zanim przejdziemy do ostatecznego projektu, jest kilka ważnych uwag:
- PSHOLD powinien być podciągnięty do 3,3 V, ponieważ zdarzają się przypadki, gdy MCU wymuszają, aby wszystkie I/O były w stanie HIGH-Z. W takim przypadku stan PSHOLD z MCU jest nieznany i może drastycznie wpłynąć na proces programowania urządzenia.
- STM6601 powinien być zamawiany z opcją regulacji EN przy długim naciśnięciu, zamiast opcji RESET (w tym się zakochałem).
Zasilacz: +3,3 V
Zasilanie główne dla wszystkich systemów w naszym projekcie. Gdy linia +3.3V jest utrzymywana na poziomie GND (tj. Brak napięcia), wszystkie układy scalone z wyjątkiem inteligentnego przełącznika są wyłączone. Obwód oparty jest na układzie scalonym LDO LP-3875-3.3, z możliwością sterowania przez zacisk EN i dostarczania prądu do 1A.
Źródłem zasilania dla tego obwodu jest napięcie akumulatora z dołączonym wskaźnikiem A/D do wykrywania VBAT w konfiguracji podobnej do obwodu wykrywania VBUS. W tym przypadku obliczenia nieco się różnią;
V (akumulator do A/D) = 0,59 V (akumulator); A/D (zakres) ∈ [000H: C03H]
Zasilacz: -3,3 V
Obwód zasilania ujemnego napięcia pozwala nam na generowanie przebiegów symetrycznych o współczynniku DC równym 0V (tj. średnia wartość przebiegu może wynosić 0V). Obwód ten oparty jest na przetworniku LM2662MX IC - DC/DC pracującym na zasadzie „pompy ładującej”. Maksymalny prąd wyjściowy układu wynosi 200mA, co jest wystarczające dla naszych wymagań projektowych - ogranicza nas prąd wyjściowy 80mA z każdego kanału urządzenia.
IC wykonuje całą niezbędną pracę, więc jedyne części, które musimy podłączyć, to dwa kondensatory elektrolityczne: C33 do przełączania i C34 do obejścia linii -3,3 V (uwzględnienie redukcji szumów). Częstotliwość przełączania jest pomijalna w projekcie, jeśli umieszczamy obwód wystarczająco daleko od części generujących przebieg (omówimy to w kroku Układ PCB).
Jednostka mikrokontrolera - MCU
To jest menedżer i dyrektor generalny naszego systemu - kontrola, obsługa sieci, transmisja wiadomości i obsługa interfejsu użytkownika - wszystko odbywa się przez MCU.
Wybrany MCU to Atmel ATMEGA32L, gdzie L oznacza pracę pod napięciem ∈ [2,7V: 5,5V]. W naszym przypadku napięcie robocze wynosi +3,3V.
Rozważmy główne bloki operacyjne, które są niezbędne do zrozumienia pracy z MCU w naszym projekcie:
- Oscylator zewnętrzny - jest elementem opcjonalnym, ponieważ interesuje nas częstotliwość robocza 8 MHz
-
Kontrola urządzeń peryferyjnych, sieć SPI - Wszystkie urządzenia peryferyjne (z wyjątkiem ESP32) komunikują się z MCU przez SPI. Istnieją trzy wspólne linie dla wszystkich urządzeń (SCK, MOSI, MISO), a każdy obwód peryferyjny ma swoją dedykowaną linię CS (Chip Select). Urządzenia SPI wchodzące w skład urządzenia:
- C/A do kontroli amplitudy - kanał A
- C/A do sterowania amplitudą - kanał B
- Urządzenie AD9834 - Kanał A
- Urządzenie AD9834 - Kanał B
- C/A do kontroli napięcia polaryzacji - kanał A
- C/A do kontroli napięcia polaryzacji - kanał B
- Potencjometr cyfrowy do ustawień jasności/kontrastu LCD
- Obsługa LCD - Ponieważ LCD jest typowym wyświetlaczem 20 x 4 znaków, używamy 4-bitowego interfejsu (linie D7:D4), pinów kontrolnych (linie RS, E) i kontroli jasności/kontrastu (linie V0 i anoda)
- Obsługa diod LED RGB - Ten moduł jest opcjonalny, ale istnieje wspólne katodowe złącze LED RGB z odpowiednimi rezystorami, podłączone do MCU.
-
Kontrola zasilania - MCU monitoruje system zasilania w trybie czasu rzeczywistego i obsługuje wszystkie potrzebne zdarzenia zasilania:
- VBAT_ADC - Monitorowanie napięcia akumulatora i określanie jego stanu (kanał ADC0)
- PWR_IND - Sygnalizacja podłączenia zewnętrznego zasilania (kanał ADC1)
- PS_HOLD - linia włączania zasilania podstawowego dla wszystkich zdefiniowanych systemów. Gdy MCU jest obniżany, urządzenie jest wyłączone
- Terminal przerwań inteligentnego przełącznika - Monitorowanie stanu przycisku
- Zarządzanie siecią WiFi - ESP32: MCU komunikuje się z ESP32 poprzez interfejs UART. Ponieważ 8MHz pozwala nam na implementację szybkości transmisji 115200 ze stosunkowo małym błędem, możemy zastosować ESP32 w układzie bez predefiniowania zmian szybkości transmisji.
Programista AVR ISP
Nasz MCU jest zaprogramowany przez SPI z linią resetującą (/RST) musi być wyciągnięta na WYSOKO dla prawidłowego działania (jeśli nie - MCU znajdzie się na zawsze w stanie resetowania).
Aby urządzenie było programowane i ładowane przez USB, dołączyłem programator AVR ISP (Mały produkt, kupiony w serwisie eBay). W celu utrzymania pełnej obsługi USB urządzenia, konieczne jest powiązanie terminali USB typu A (D+, D-, VBUS i GND) z urządzeniem AVR ISP.
Obwód generowania przebiegu
Rdzeniem urządzenia są te obwody. AD9834 to urządzenie DDS o małej mocy, które zapewnia nam wszystkie przebiegi, które chcielibyśmy pobrać z systemu. Układy zawierają dwa niezależne układy scalone AD9834 z odseparowanymi zewnętrznymi oscylatorami 50MHz (jak widać na schemacie). Powodem wydzielonego oscylatora jest względy redukcji szumów obwodów cyfrowych, więc zdecydowano się obsłużyć odpowiednie linie 50MHz z oscylatorami umieszczonymi w sąsiedztwie AD9834.
Teraz spójrzmy na trochę matematyki:
Ponieważ urządzenie DDS działa w technologii Phase Wheel z wartością wyjściową umieszczoną w 28-bitowym rejestrze, możemy matematycznie opisać generowanie przebiegu:
dP(faza) = ωdt; ω = P' = 2πf; f(AD9834) = ΔP * f(clk) / 2^28; ΔP ∈ [0: 2^28 - 1]
I zgodnie z kartą katalogową AD9834, biorąc pod uwagę częstotliwość maksymalną, rozdzielczość częstotliwości wyjściowej można uzyskać:
Δf = k * f(oscylator) / f(maksymalnie) = 0,28 * 50M / 28M = 0,187[Hz]
Układy scalone AD9834 zapewniają analogowe wyjście prądowe dla fali trójkątnej/sinusoidalnej (złącze IOUT) i wyjście cyfrowe dla fali prostokątnej (złącze SIGN_OUT). Użycie bitu znaku jest trochę skomplikowane, ale jesteśmy w stanie sobie z tym poradzić - Za każdym razem, gdy DDS przekroczy próg wartości porównania, SIGN_OUT zachowuje się odpowiednio. Rezystor 200Ohm jest podłączony do wyjścia każdego kanału, więc napięcie wyjściowe będzie miało sensowne wartości:
I(pojedynczy kanał) = V(wyjście) / R(wybór napięcia); V(wyjście) = R(VS)*I(SS) = 200I(SS) [A]
Obwody sterowania amplitudą (C/A)
Zgodnie z arkuszem danych AD9834 jego amplitudę można regulować, dostarczając prąd do systemu DDS o pełnej skali, więc za pomocą podwójnego układu D/A możemy kontrolować amplitudę sygnału wyjściowego, dostosowując ten prąd. Jeszcze raz trochę matematyki:
I (pełna skala) = 18 * (V_REF - V_DAC) / R_SET [A]
Zgodnie ze schematami i wstawiając kilka liczb do równania:
I (pełna skala) = 3,86 - 1,17 * V_DAC [A]
Moduł D/A zastosowany w konstrukcji to 12-bitowy MCP4922, gdy prąd jest w zakresie [0mA: 3,86mA] a liniowa funkcja amplitudy wynosi:
V(wybór amplitudy) = 1 - [V(D/A) / (2^12 - 1)]
Obwód multipleksowania przebiegów
Wyjścia generujące falę prostokątną i falę sinusoidalną/trójkątną są oddzielone w AD9834, dlatego musimy użyć szybkiego obwodu multipleksowania dla obu wyjść, aby umożliwić pobranie wszystkich pożądanych przebiegów fal z jednego odseparowanego kanału. Układ scalony multipleksera to analogowy przełącznik ADG836L o bardzo niskiej rezystancji włączania (~0,5 Ohm).
Tabela wyboru, której MCU używa dla wyjść, tak jak jest:
Wybór trybu [D2:D1] | Kanał wyjściowy A | Kanał wyjściowy B
00 | Sinus/Trójkąt | Sinus/Trójkąt 01 | Sinus/Trójkąt | Kwadrat 10 | Kwadrat | Sinus/Trójkąt 11 | Kwadrat | Kwadrat
Obwody sterowania napięciem polaryzacji (C/A)
Jedną z głównych cech generatora przebiegów jest sterowanie jego wartością DC. W tym projekcie odbywa się to poprzez ustawienie żądanego napięcia D/A na każdy kanał, a te napięcia polaryzacji są sumowane ze zmultipleksowanymi wyjściami, które omówiliśmy nieco wcześniej.
Napięcie pobierane z D/A mieści się w zakresie [0V: +3.3V], więc istnieje obwód oparty na wzmacniaczu operacyjnym, który mapuje zakres D/A do [-3.3V: +3.3V], dzięki czemu urządzenie zapewnia pełny zakres żądanej składowej DC. Pominiemy irytującą matematykę analityczną i skupimy się tylko na ostatecznych wynikach:
V_OUT(kanał B) = V_BIAS_B(+) - V_BIAS_B(-); V_OUT(kanał A) = V_BIAS_A(+) - V_BIAS_A(-)
Teraz zakres składowej DC znajduje się w zakresie [-3,3 V: +3,3 V].
Obwody sumujące - składowe prądu stałego i wyjścia falowe
W tym momencie mamy wszystko, czego potrzebujemy do prawidłowego wyjścia urządzenia – napięcie biasu (składowa DC) w pełnym zakresie napięciowym oraz wyjścia multipleksowane AD9834. Zrobimy to za pomocą wzmacniacza sumującego - konfiguracja op-amp
Pomińmy jeszcze raz matematykę (omówiliśmy już wiele podejść matematycznych) i zapiszmy końcowy wynik wyjścia wzmacniacza sumującego:
V(wyjście urządzenia) = V(dodatnie odchylenie) - V(ujemne odchylenie) - V(zmultipleksowane wyjście) [V]
Stąd:
V_OUT = ΔV_BIAS - V_AD9834 [V]
Złącza wyjściowe typu BNC połączone są z rezystorami doboru (R54, R55; R56, R57). Powodem tego jest to, że w przypadku, gdy konstrukcja może być niesprawna, nadal możemy wybrać, czy chcemy zastosować wzmacniacz sumujący.
Ważna uwaga: Sieci rezystorów końcowych wzmacniaczy sumujących mogą być dostosowane przez projektanta, aby zmienić maksymalną amplitudę, którą można pobrać z urządzenia. W moim przypadku wszystkie wzmacniacze mają to samo wzmocnienie = 1, więc maksymalna buforowana amplituda wynosi 0,7 Vpp dla fali trójkątnej / sinusoidalnej i 3,3 Vpp dla fali prostokątnej. Specyficzne podejście matematyczne można znaleźć wśród załączonych obrazów kroku.
ESP32 jako moduł zewnętrzny
MCU komunikuje się z ESP32 poprzez interfejs UART. Ponieważ chciałem mieć własną płytkę drukowaną dla ESP32, dostępne są 4 zaciski: VCC, RX, TX, GND. J7 to złącze interfejsu pomiędzy płytkami, a ESP32 zostanie przydzielony jako moduł zewnętrzny wewnątrz urządzenia.
Interfejs użytkownika - wyświetlacz LCD i głośnik
Zastosowany wyświetlacz LCD to typowy wyświetlacz 20x4 znaków z 4-bitowym interfejsem. Jak widać z projektu do zacisków LCD "A" i "V0" dołączony jest potencjometr cyfrowy SPI - jego zadaniem jest regulacja jasność i kontrast modułu LCD programowo.
Głośnik zapewnia wyjście dźwięku dla użytkownika poprzez proste generowanie fali prostokątnej z MCU. BJT T1 kontroluje prąd płynący przez głośnik, który może znajdować się tylko w dwóch stanach - ON / OFF.
Krok 5: Projektowanie sprzętu - moduł ESP32
ESP32 służy jako zewnętrzny moduł do głównej płytki drukowanej. Komunikacja urządzenia opiera się na poleceniach AT, które są dostępne w oprogramowaniu układowym ogólnego urządzenia.
Nie ma wiele do rozwinięcia w tym projekcie, ale są pewne uwagi dotyczące projektu:
- Do obsługi awarii przy użyciu odpowiedniego modułu UART ESP32 dołączyłem trzy rezystory doboru zarówno dla linii TX jak i RX. (0Ohm dla każdego). W konfiguracji standardowej do komend AT wykorzystywany jest moduł UART2 (należy przylutować R4, R7)
- Urządzenie posiada 4-liniowe wyjście - VCC, GND, TX, RX.
- Piny IO0 i EN oceniają działanie urządzenia i powinny być zaprojektowane tak, jak przedstawiono na schematach
Wszystkie funkcje PCB omówimy w następnym kroku.
Krok 6: Układ PCB
Cele projektowania PCB
- Stwórz system wbudowany dla wszystkich układów scalonych na tej samej płycie
- Popraw wydajność urządzenia, projektując pojedynczą główną płytkę drukowaną
- Redukcja kosztów - jeśli chcesz sprawdzić ceny, tanie projekty są NAPRAWDĘ tanie
- Zminimalizuj rozmiar płytki elektronicznej
- Łatwość rozwiązywania problemów - możemy użyć punktów TP (punktów testowych) dla każdej możliwej niesprawnej linii.
Parametry techniczne
Obie płytki PCB: główna i ESP32 mają te same cechy dla procesu produkcyjnego - tanie i sprawne dla naszych celów. Zobaczmy je:
A - Zarząd Główny
- Rozmiar: 10 cm x 5,8 cm
- Liczba warstw: 2
- Grubość PCB: 1,6 mm
- Minimalna przestrzeń śladu/szerokość: 6/6mil
- Minimalna średnica otworu: 0,3 mm
- Miedź do krawędzi PCB minimalna odległość: 20 mil
- Wykończenie powierzchni: HASL (dość dobrze wyglądający tani kolor srebrny)
B - Zarząd Główny
- Rozmiar: 3 cm x 4 cm
- Liczba warstw: 2
- Grubość PCB: 1,6 mm
- Minimalna przestrzeń śladu/szerokość: 6/6mil
- Minimalna średnica otworu: 0,3 mm
- Miedź do krawędzi PCB minimalna odległość: 20 mil
- Wykończenie powierzchni: HASL
Krok 7: Obudowa 3D
Nie projektowałem tego sam, bo wtedy namawiałem to urządzenie do pracy, więc nie miałem pojęcia o wszystkich podstawach drukowania 3D. Użyłem więc projektu SCAD z Thingiverse i przymocowałem różne apertury do granic, zgodnie ze specyfikacją mojego urządzenia.
- Urządzenie drukujące: Creality Ender-3
- Rodzaj łóżka: Szkło, grubość 5 mm
- Średnica żarnika: 1,75 mm
- Rodzaj filamentu: PLA+
- Średnica dyszy: 0,4 mm
- Prędkość początkowa: 20 mm/s
- Średnia prędkość: 65 mm/s
- Wsparcie: nie dotyczy
- Wypełnienie: 25%
-
Temperatura:
- Łóżko: 60(oC)
- Dysza: 215(oC)
- Kolor żarnika: czarny
- Całkowita liczba przysłon: 5
-
Liczba paneli obudowy: 4
- TOP Shell
- Powłoka dolna
- Przedni panel
- Panel tylny
Krok 8: Implementacja oprogramowania - MCU
GitHub Link do kodu Androida i Atmega32
Algorytm oprogramowania
Wszystkie operacje wykonywane przez MCU zostały opisane w załączonych schematach blokowych. Dodatkowo dołączony jest kod do projektu. Omówmy specyfikacje oprogramowania:
Wzmocnienie
Na tym etapie MCU wykonuje wszystkie sekwencje inicjalizacji wraz z określeniem zapisanego typu komunikacji z urządzeniem z systemem Android: Bezpośrednia komunikacja sieciowa WiFi lub WLAN - dane te są zapisywane w pamięci EEPROM. Na tym etapie użytkownik może przedefiniować typ parowania urządzenia z systemem Android.
Bezpośrednie parowanie urządzeń z Androidem
Ten rodzaj parowania opiera się na tworzeniu sieci WiFi przez urządzenie FuncGen. Utworzy AP (punkt dostępowy) i serwer TCP na lokalnym IP urządzenia z określonym SSID (nazwą sieci WiFi) i określonym numerem portu. Urządzenie powinno utrzymywać stan - otwarte dla połączeń.
Gdy urządzenie z systemem Android jest połączone z FuncGen, MCU przechodzi w tryb AKTYWNY i reaguje zgodnie z instrukcjami użytkownika z urządzenia z systemem Android.
Parowanie WLAN
Aby komunikować się w lokalnej sieci WiFi, MCU powinno wydać polecenia dla ESP32, aby utworzyć AP, komunikować się z urządzeniem z systemem Android i wymieniać kluczowe dane sieciowe:
- Urządzenie z systemem Android otrzymuje od FuncGen swój adres MAC, przechowuje go w pamięci.
- Urządzenie FuncGen odbiera z urządzenia z systemem Android wybrane parametry sieci WLAN: SSID, rodzaj zabezpieczenia oraz Hasło i przechowuje je w pamięci EEPROM.
Gdy urządzenia są rzeczywiście podłączone do tej samej sieci WLAN, urządzenie z systemem Android wyszuka FuncGen, skanując wszystkie adresy MAC urządzeń podłączonych do sieci WLAN. Gdy urządzenie z Androidem określa dopasowanie MAC, próbuje się komunikować.
Obsługa połączeń i stanu - MCU
Gdy urządzenia komunikują się ze sobą, protokół (patrz krok wstępny) pozostaje taki sam, a schemat blokowy jest taki sam.
Monitorowanie stanu urządzenia
Przerwanie czasowe zapewnia MCU niezbędne szczegóły dotyczące obsługi stanu. W każdym cyklu przerwania czasowego aktualizowana jest następująca lista parametrów:
- Zasilanie zewnętrzne - Włącz/Wyłącz
- Stan napięcia akumulatora
- Aktualizacja interfejsu użytkownika dla każdego dostosowania
- Przycisk: wciśnięty/nie wciśnięty
Krok 9: Implementacja oprogramowania - aplikacja na Androida
Aplikacja na Androida jest napisana w stylu Java-Android. Postaram się to wyjaśnić w taki sam sposób jak poprzednie kroki - dzieląc algorytm na osobne bloki kodu.
Sekwencja włączania
Pierwsza sekwencja urządzenia. Tutaj prezentowane jest logo aplikacji wraz z włączaniem modułów GPS i WiFi urządzenia z Androidem (nie martw się, GPS jest potrzebny tylko do skanowania odpowiednich sieci WiFi).
Menu główne
Po uruchomieniu aplikacji na ekranie pojawią się cztery przyciski. Działanie przycisków:
- POŁĄCZENIE BEZPOŚREDNIE: Inicjowanie połączenia z AP FuncGen przez identyfikator SSID IOT_FUNCGEN. Jeśli połączenie się powiedzie, urządzenie przejdzie w tryb głównego interfejsu użytkownika.
- POŁĄCZENIE WIFI: Urządzenie sprawdza, czy w pamięci są zapisane parametry danych: wifi.txt, mac.txt. Jeśli nie ma zapisanych żadnych danych, urządzenie odrzuci żądanie użytkownika i wyświetli komunikat, że najpierw należy przeprowadzić parowanie WLAN.
- PAROWANIE: Komunikacja z FuncGen w taki sam sposób jak POŁĄCZENIE BEZPOŚREDNIE, ale zamiast ciągłej wymiany wiadomości następuje pojedyncze uścisk dłoni. Urządzenie z systemem Android sprawdza, czy jest już podłączone do sieci WiFi i prosi użytkownika o podanie hasła. Jeśli ponowne połączenie się powiedzie, urządzenie z Androidem przechowuje identyfikator SSID i hasło w pliku wifi.txt. Po udanej komunikacji z FuncGen zapisuje otrzymany adres MAC w pliku mac.txt.
- Wyjście: Dość powiedziane:)
Menedżer skanowania WiFi
Chciałem, aby aplikacja była w pełni operacyjna i nie wymagała wprowadzania zmian poza aplikacją. Dlatego zaprojektowałem skaner WiFi, który wykonuje wszystkie niezbędne operacje, aby połączyć się z siecią WiFi ze znanym hasłem i identyfikatorem SSID.
Transmisja danych i komunikacja TCP
To jest główny blok kodu w aplikacji. Dla wszystkich jednostek interfejsu użytkownika istnieje zdefiniowany komunikat w określonym formacie (krok przedfinalowy), który zmusza FuncGen do zapewnienia żądanego wyjścia dla kanałów. W działaniu występują trzy typy pól interfejsu użytkownika:
-
Seek Bars: Tutaj definiujemy rzeczywisty zakres parametrów wyjściowych FuncGen
- Amplituda
- Przesunięcie DC
- Jasność LCD
- Kontrast LCD
- Edycja tekstu: Aby wartości liczb całkowitych były dobrze zdefiniowane i precyzyjne, wprowadzanie częstotliwości odbywa się wyłącznie za pomocą pól tekstowych
-
Przyciski: Wybór parametrów z dostępnych list:
-
Typ przebiegu
- Sinus
- Trójkąt
- DC
- Kwadrat
- WYŁĄCZONY
-
Zdobyć informacje
- Stan baterii (procent)
- Stan AC (zasilanie zewnętrzne)
-
Opcja rozruchu (dla FuncGen MCU)
- Ustawienia Fabryczne
- Uruchom ponownie
- Zamknąć
- Bezpośrednie - uruchom ponownie w trybie bezpośredniego parowania
- WLAN - Uruchom ponownie w trybie parowania WLAN
- Wyjście do Menu Głównego: Dość powiedziane:)
-