Table of Contents

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í:

Verze Qt 6 už má v sobě zabudovanou knihovnu sériové linky, kterou lze přidat přes hlavičkový soubor #include <QtSerialPort/QSerialPort>. 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í

Qt Template osciloskopu

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.

Formát dat

Přijatá data jsou ve tvaru t.tttt, yyyy;\n, kde

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ě:

  1. Připojit vývojový kit a režim programátoru mít na typ ST-Link (J-link formát STM32CubeProgrammer nepodporuje)
  2. Spustit STM32CubeProgrammer
  3. Vpravo nahoře se připojte k vývojovému kitu
  4. Nalevo vybrat možnost Erasing & Programming
  5. Vybrat příslušný .elf soubor
  6. 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ě Wokwi.