Raspberry Pi Zero2 WでGPSロガー作成 ~ PIGPIOライブラリを使う

以前、Raspberry Pi Zero WでGPSロガーを作成する連載を投稿しましたが、内容が古くなったこともあり、Raspberry Pi Zero 2 Wを使用する2025年版を作成してみました。

今まで、Raspberry Piのプログラムを作成する時は、WiringPiライブラリを多用していました。しかしながら、WiringPiライブラリは2020年頃から開発停止?しており、非推奨と言われていました。それでも現在、検索すると、Raspberry Pi 5において制限事項があるものの、提供自体は終わっていないようです。

今、C言語でGPIOの操作をする場合は、他のライブラリの使用が推奨されています。その一つがPIGPIOライブラリです。これも現在(投稿時点)、Raspberry Pi 5では使えないという制約がありますが、安定動作を期待するならばPIGPIOライブラリを使う方が良いようです。

Raspberry Piの開発環境がブレていることに懸念を感じますが、今回は最新のRaspberry Pi OS(bookworm)の64ビット版を使うため、PIGPIOライブラリを使ってGPSロガーを作成してみます。

1.ハードウェアの接続

今回、使用するのは、Raspberry Pi Zero 2 Wと下記のGPSユニット、そして終了のためのタクトスイッチ一つです。

GPSユニットとRaspberry Pi Zero 2Wの接続は以下のとおりです。左がGPSで右がRaspberry Pi Zero 2 Wです。

Vc -> 5V出力
GND -> GND
TX -> GP15 (RX)
RX -> GP14 (TX)
PPS -> 使わない LEDを光らせるのに使うと良いかも
EN -> 3.3V

created by Rinker
KKHMF
¥599 (2025/06/24 11:14:57時点 Amazon調べ-詳細)

また、プログラム終了のために、GPIO26にタクトスイッチを接続しています。タクトスイッチを押すとGPS受信を終了してプログラムが終了します。

2.ソフトウェア

Raspberry Pi OS

先ほども紹介しましたが、Raspbery Pi OS bookworm 64bit Desktop をインストールしました。画面を使わないプログラムなのでLite版でもいいのですが、OS設定画面が楽なことと、時刻の取得をOSから行っている※のでデスクトップ版を使っています。

Raspberry Pi Zero 2 Wであれば、デスクトップ版でもあまりストレスはないと思いますが、人によってはあるかもしれません。

※起動時にGPSログのファイル名作成にOS時刻を取得しているので、GPSからの時刻取得を省いています。

PIGPIOライブラリのインストール

PIGPIOライブラリをインストールします。以下のコマンドを実行します。

sudo apt update
sudo apt install pigpio

PIGPIOライブラリを用いたシリアル通信

PIGPIOライブラリを使ったシリアル通信と終了スイッチの動作部分を抜粋したプログラムを以下に用意しました。実際はエラー系の処理が入っていますが、省略していることをご了承ください。

#include <stdio.h>
#include <stdlib.h>
#include <pigpio.h>
#include <string.h>
#include <unistd.h>
#define GPIOSW 26

int init() {

    if (gpioInitialise() < 0){
      printf("gpioInitialise error") ;
      return 1;
    }

    gpioSetMode(GPIOSW, PI_INPUT); 
    gpioSetPullUpDown(GPIOSW, PI_PUD_UP); //プルアップ
    
    return 0 ;

}

int main() {
    char buff[256];
 
    if (init() != 0 ) {
      return 1 ;
    }  

    // UARTを開く (/dev/serial0, 9600bps)
    int handle = serOpen("/dev/serial0", 9600, 0);

    while (1) {
	int sw = gpioRead(GPIOSW); // 終了入力
	if(sw == 0) { 
	  break ;
	}

        int count = serRead(handle, buff, sizeof(buff) - 1);
        if (count > 0) {
            buff[count] = '\0';
            printf("%s", buff);
        }
                
        usleep(100000); // 100ms wait
    }

    serClose(handle);
    gpioTerminate();
    return 0;
}

シリアル通信の有効化と"/dev/serial0″が使えるようにしておいてください(過去記事で、方法を載せています)

サンプルプログラムのダウンロード

サンプルプログラムは、以下のURLからダウンロードすることができます。

実行は、

sudo ./gps_pigpio

で行ってください。実行すると、必ずGPX形式のGPSログが出力されます。そして、ターミナルにはNMEA-0183のデータが表示されます。(※ターミナルから起動した時)

3.実際に使用してみた

必要な部品をケースに詰め込んで、実際にGPSログを取得してきました。

今回作成したアプリケーションは、起動時の定義を行う「/etc/rc.local」ではタイミングが合わないせいか、うまく起動できませんでした。そのため、Raspberry Pi OSが起動した後でGPSロガーアプリケーションを起動させる必要がありました。

起動の方法は、デスクトップにGPSロガーアプリケーションのショートカットを置いて、ショートカットから起動するようにしました。ショートカットの作成方法はいろいろありますが、私は「lxshortcut」を使用しました。

GPSログの取得を終了する時は、GPIO26に接続したタクトスイッチを押します。そのタイミングでGPXログファイルが完成します。

実際にログを取得すると、やはり高度の精度が良くありません。秋月電子通商さんのGPSもそうでしたが、高度を期待するのは無理なのでしょうか。素直に気圧高度計を利用する方が良さそうです。

4.GPSログをWindowsで確認する

GPSログをカシミール3Dに読み込ませてみた

GPSログのファイル名は、「年月日時分秒.gpx」で作成されます。これを、Windowsパソコンで読み込みます。使用するアプリケーションは、「カシミール3D」です。

帯広市グリーンパークから帯広駅へのログを取得してみましたが、問題なく取得されました。Raspberry Pi Zero 2 WでGPSログを取得しているので、理論上はSDカードの空き領域分ログを取得できます。しかしながら、ログ取得中に電源が切れるなどのトラブルがあると、ログが出力されない、もしくは途中までしかないという事態も考えられます。実用に耐えるためには、もう一工夫が必要ですね。

5.ライブラリの不整合が増えてきた

Raspberry Pi においても、新しいRaspberry Pi OSが出たり、Raspberry Pi 5が出てきたりすることで、従来利用していたライブラリが使えなくなる事例が増えてきました。今も、GPIOの操作にどのライブラリを使って行けば良いのか、迷っています。

その点、自前のプログラムであれば、臨機応変に対応できます。今回ソースで示していませんが、NMEA-0183データの解析を自前ソースで行っています(以前の投稿で載せてます)。それにより、欲しいデータ項目を取得することができました。

一方、ESP32系やRP2040系でソフトウェアシリアルライブラリを使用すると、うまく取得できない場合があって困っています。何でもライブラリに依存することではなく、自前のソースもうまく活用していくことが大事だと思いました。