You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/cs/3-transport/lessons/1-location-tracking/pi-gps-sensor.md

8.5 KiB

Čtení GPS dat - Raspberry Pi

V této části lekce přidáte k Raspberry Pi GPS senzor a budete z něj číst hodnoty.

Hardware

Raspberry Pi potřebuje GPS senzor.

Senzor, který budete používat, je Grove GPS Air530 senzor. Tento senzor se může připojit k více GPS systémům pro rychlé a přesné určení polohy. Senzor se skládá ze dvou částí - hlavní elektroniky senzoru a externí antény připojené tenkým kabelem, která zachycuje rádiové vlny ze satelitů.

Jedná se o UART senzor, takže posílá GPS data přes UART.

Připojení GPS senzoru

Grove GPS senzor lze připojit k Raspberry Pi.

Úkol - připojení GPS senzoru

Připojte GPS senzor.

Grove GPS senzor

  1. Zasuňte jeden konec Grove kabelu do konektoru na GPS senzoru. Kabel lze zasunout pouze jedním směrem.

  2. S vypnutým Raspberry Pi připojte druhý konec Grove kabelu do konektoru UART označeného UART na Grove Base hat připojeném k Pi. Tento konektor se nachází ve střední řadě na straně blíže k slotu na SD kartu, na opačné straně od USB portů a ethernetového konektoru.

    Grove GPS senzor připojený k UART konektoru

  3. Umístěte GPS senzor tak, aby připojená anténa měla viditelnost na oblohu - ideálně vedle otevřeného okna nebo venku. Je snazší získat jasnější signál, pokud anténě nic nepřekáží.

Programování GPS senzoru

Raspberry Pi nyní může být naprogramováno pro použití připojeného GPS senzoru.

Úkol - programování GPS senzoru

Naprogramujte zařízení.

  1. Zapněte Pi a počkejte, až se spustí.

  2. GPS senzor má 2 LED diody - modrou LED, která bliká při přenosu dat, a zelenou LED, která bliká každou sekundu při příjmu dat ze satelitů. Ujistěte se, že modrá LED bliká při zapnutí Pi. Po několika minutách začne blikat zelená LED - pokud ne, možná budete muset přemístit anténu.

  3. Spusťte VS Code, buď přímo na Pi, nebo se připojte přes rozšíření Remote SSH.

    ⚠️ Můžete se podívat na instrukce pro nastavení a spuštění VS Code v lekci 1, pokud je to potřeba.

  4. U novějších verzí Raspberry Pi, které podporují Bluetooth, existuje konflikt mezi sériovým portem používaným pro Bluetooth a tím, který používá Grove UART port. Pro vyřešení tohoto problému postupujte následovně:

    1. Z terminálu VS Code upravte soubor /boot/config.txt pomocí nano, vestavěného textového editoru terminálu, pomocí následujícího příkazu:

      sudo nano /boot/config.txt
      

      Tento soubor nelze upravovat přímo ve VS Code, protože je potřeba použít sudo oprávnění, což je zvýšené oprávnění. VS Code neběží s tímto oprávněním.

    2. Pomocí kurzorových kláves přejděte na konec souboru, poté zkopírujte níže uvedený kód a vložte jej na konec souboru:

      dtoverlay=pi3-miniuart-bt
      dtoverlay=pi3-disable-bt
      enable_uart=1
      

      Vkládání můžete provést pomocí běžných klávesových zkratek pro vaše zařízení (Ctrl+v na Windows, Linux nebo Raspberry Pi OS, Cmd+v na macOS).

    3. Uložte tento soubor a ukončete nano stisknutím Ctrl+x. Stiskněte y, když budete dotázáni, zda chcete uložit upravený buffer, poté stiskněte enter, abyste potvrdili přepsání /boot/config.txt.

      Pokud uděláte chybu, můžete ukončit bez uložení a poté tyto kroky zopakovat.

    4. Upravte soubor /boot/cmdline.txt v nano pomocí následujícího příkazu:

      sudo nano /boot/cmdline.txt
      
    5. Tento soubor obsahuje několik dvojic klíč/hodnota oddělených mezerami. Odstraňte všechny dvojice klíč/hodnota pro klíč console. Pravděpodobně budou vypadat nějak takto:

      console=serial0,115200 console=tty1 
      

      Pomocí kurzorových kláves přejděte na tyto položky a poté je smažte pomocí běžných kláves del nebo backspace.

      Například pokud váš původní soubor vypadá takto:

      console=serial0,115200 console=tty1 root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
      

      Nová verze bude:

      root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
      
    6. Postupujte podle výše uvedených kroků pro uložení tohoto souboru a ukončení nano.

    7. Restartujte Pi a poté se znovu připojte ve VS Code, jakmile se Pi restartuje.

  5. Z terminálu vytvořte novou složku v domovském adresáři uživatele pi nazvanou gps-sensor. V této složce vytvořte soubor nazvaný app.py.

  6. Otevřete tuto složku ve VS Code.

  7. GPS modul posílá UART data přes sériový port. Nainstalujte balíček pyserial pomocí Pip, abyste mohli komunikovat se sériovým portem z vašeho Python kódu:

    pip3 install pyserial
    
  8. Přidejte následující kód do vašeho souboru app.py:

    import time
    import serial
    
    serial = serial.Serial('/dev/ttyAMA0', 9600, timeout=1)
    serial.reset_input_buffer()
    serial.flush()
    
    def print_gps_data(line):
        print(line.rstrip())
    
    while True:
        line = serial.readline().decode('utf-8')
    
        while len(line) > 0:
            print_gps_data(line)
            line = serial.readline().decode('utf-8')
    
        time.sleep(1)
    

    Tento kód importuje modul serial z balíčku pyserial. Poté se připojí k sériovému portu /dev/ttyAMA0 - to je adresa sériového portu, který Grove Pi Base Hat používá pro svůj UART port. Poté vymaže všechna existující data z tohoto sériového připojení.

    Dále je definována funkce print_gps_data, která vypisuje předaný řádek do konzole.

    Poté kód běží v nekonečné smyčce, čte co nejvíce řádků textu ze sériového portu v každé iteraci smyčky. Pro každý řádek volá funkci print_gps_data.

    Po přečtení všech dat smyčka na 1 sekundu usne a poté se pokusí znovu.

  9. Spusťte tento kód. Uvidíte surový výstup z GPS senzoru, něco jako následující:

    $GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67
    $GPGSA,A,1,,,,,,,,,,,,,,,*1E
    $BDGSA,A,1,,,,,,,,,,,,,,,*0F
    $GPGSV,1,1,00*79
    $BDGSV,1,1,00*68
    

    Pokud při zastavení a opětovném spuštění kódu dostanete jednu z následujících chyb, přidejte blok try - except do vaší while smyčky.

    UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 0: invalid start byte
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 0: invalid continuation byte
    
    while True:
        try:
            line = serial.readline().decode('utf-8')
    
            while len(line) > 0:
                print_gps_data()
                line = serial.readline().decode('utf-8')
    
        # There's a random chance the first byte being read is part way through a character.
        # Read another full line and continue.
    
        except UnicodeDecodeError:
            line = serial.readline().decode('utf-8')
    
    time.sleep(1)
    

💁 Tento kód najdete ve složce code-gps/pi.

😀 Programování vašeho GPS senzoru bylo úspěšné!


Prohlášení:
Tento dokument byl přeložen pomocí služby pro automatický překlad Co-op Translator. I když se snažíme o přesnost, mějte na paměti, že automatické překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho původním jazyce by měl být považován za autoritativní zdroj. Pro kritické informace doporučujeme profesionální lidský překlad. Neodpovídáme za žádná nedorozumění nebo nesprávné interpretace vyplývající z použití tohoto překladu.