====== 13. Qt - Osciloskop ====== Cvičení zaměřené na komunikaci mezi Qt a externím zařízením v podobě Nuclea po sériové lince. Nucleo se zde chová jako generátor signálu posílaný po sériové lince s konfigurací: * 115200 baud * 8 bitů * bez parity Verze Qt 6 už má v sobě zabudovanou knihovnu sériové linky, kterou lze přidat přes hlavičkový soubor ''#include ''. Nesmíme zapomenout zahrnout knihovnu **serialport** do překladu, která se přidá do řádku kompilace QT v projektovém souboru .pro, např. ''QT += core gui serialport''. Jelikož používáme pro vykreslení grafu QtCharts, je třeba zahrnout ještě knihovnu **charts**, takže výsledný řádek poté bude vypadat ''QT += core gui serialport charts'' ===== Podklady pro cvičení ===== {{ :courses:b2b99ppc:tutorials:oscilloscope_template.zip | Qt Template osciloskopu}} {{ :courses:b2b99ppc:tutorials:nucleo_oscilloscope.zip | Zkompilovaný soubor pro Nucleo s procesorem STM32F401RE}} Pro nahrání zkompilovaného elf souboru se řiďte podle návodu na konci. ===== Příkazy pro nastavení ===== Příkazy, kterými lze nastavit chod jednoduchého osciloskopu je vždy zakončen novým řádkem ''\n''. * ''start'' - spouští odesílání dat sinusovky * ''adc'' - spouští odesílání dat z analogového vstupu * ''stop'' - zastavuje odesílání dat * ''fvz=x'' - vzorkovací frekvence v Hz, kde ''x'' je frekvence od 1 do 100 Hz (víc nestíhá Qt zpracovat bez redukce dat) * ''fper=x'' - frekvence periodického signálu v Hz, kde ''x'' je frekvence od 1 do 10 Hz * ''tim_rst'' - resetování času ===== Formát dat ===== Přijatá data jsou ve tvaru ''t.tttt, yyyy;\n'', kde * ''t.tttt'' je čas v sekundách od začátku od spuštění zařízení nebo resetu času, * ''yyyy'' je poté naměřená hodnota nebo hodnota posílaného signálu ===== Nahrání kódu do STM32F401 ===== Kód pro procesory STM32 můžete nahrát pomocí programu STM32CubeProgrammer, který lze stáhnout z https://www.st.com/en/development-tools/stm32cubeprog.html Pro nahrání kódu postupujte následovně: - Připojit vývojový kit a režim programátoru mít na typ [[https://www.segger.com/products/debug-probes/j-link/models/other-j-links/st-link-on-board/|ST-Link]] (J-link formát STM32CubeProgrammer nepodporuje) - Spustit STM32CubeProgrammer - Vpravo nahoře se připojte k vývojovému kitu - Nalevo vybrat možnost ''Erasing & Programming'' - Vybrat příslušný .elf soubor - Stisknout ''Start Programming'' a vyčkat, než se program nahraje ===== Možné řešení pro kity Arduino/ESP32 ===== Možné řešení rozhodně není optimální, protože využívá funkci delay - lépe by bylo využít časovač, který by vracel v přesný časový okamžik hodnotu vzorku. Pro demonstrační účely je ale tato varianta dostatečná. class Generator { int prodleva, status, f; double cas; public: Generator(): status(0), cas(0), f(10), prodleva(100) {} void tick() { cas += prodleva/1000.; if (status) { Serial.print(cas); Serial.print(", "); Serial.print(int(1000*sin(6.28*cas))); Serial.println(";"); } delay(prodleva); } void start() {status = 1;} void stop() {status = 0;} void reset() {cas = 0;} void setFR(int fr) {f = fr;} void setSR(int sr) {prodleva = 1000/sr;} }; void setup() { Serial.begin(115200); } Generator g; void loop() { if(Serial.available()) { String cmd = Serial.readStringUntil('\n'); int ind = cmd.indexOf('='); if (ind > 0) { String cmd1 = cmd.substring(0, ind); int value = cmd.substring(ind+1).toInt(); if (cmd1 == "fvz") g.setSR(value); else if (cmd1 == "fper") g.setFR(value); } if (cmd == "start") g.start(); else if (cmd == "stop") g.stop(); else if (cmd == "tim_rst") g.reset(); } g.tick(); } Program je možné otestovat na platformě [[https://wokwi.com/projects/398475884085570561|Wokwi]].