インフォメーション

2009年02月 ブログ運用開始(玄箱,Web Diary Professional 使用)

2012年10月 ブログシステムをfreoに移行

2015年05月 サーバを「Cubieboard」に移行し運用開始

2018年10月20日 なんちゃって百葉箱(後に「な!百葉箱」と命名)の運用開始(HomeWeather)

2019年09月01日 な!百葉箱(第2版)運用開始

2023年03月04日 NOAA受信システムの運用開始

2024年06月09日 システムダウンにより新サーバにて復旧作業中(6/20現在も本Blogは更新不可)

2024年06月10日 サーバ移行開始(6/29復旧)

2025年08月13日 最後となったNOAA19が11日に運用を終了した模様(暫くゴミ画像)

2025年10月23日 「な!百葉箱」はダウン中(11/23復旧)

2025年12月01日 新居浜市受信のADS-Bを正式公開

2025年12月12日 ひまわりの画像は国立情報学研究所(NII)が提供するデジタル台風という公開データベースから取得

2026年09月05日 「な!百葉箱」は重大なトラブルでダウン中

 

注)本ブログをスマホやタブレットで閲覧する場合はブラウザをPCモードにすると見易くなります

エントリー

GPSモジュールから時刻を取得

安価な(正確には安価になった)GPSモジュールを手に入れたので使えるか試してみた

仕様

IMG_20260905_132652.jpgIMG_20260905_133026.jpg

データシートとか添付されていないので仕様はネットで調べた

名称:アンテナ付きVK2828U7G5 GPSモジュールTTL 1-10Hz FLASH飛行制御GPSモデル(Amazon)

コアチップ:u-blox(ユーブロックス)製の「UBX-G7020-KT」を搭載

対応コマンド:UBXプロトコル(u-blox社独自),および標準NMEA-0183コマンド(当然ながらMediaTek(MTK)社独自の「PMTKコマンド」は使用できない)

ケーブル(色に注意)
赤: 1 PPS Time standard pulse output
黒: 2 VCC Power supply input 3.3V-5V
黄: 3 TX UART/TTL Interface
緑: 4 RX UART/TTL Interface
青: 5 GND Ground
白: 6 EN 有効・無効(LOWでシャットダウン,HIGHまたはオープンで有効)

動作確認

GPSとは添付のケーブルで電源供給とデータはシリアル接続で良し

ESP32-C3を使い2つ目のシリアル(Serial1)でGPSと接続,arduinoIDEにてシリアル出力で確認

IMG_20260906_152828.jpg

スケッチ

//GPSモジュール:VK2828U7G5
//
const int rxPin = 20;
const int txPin = 21;

void setup(void) {
    Serial.begin(115200);
    while(!Serial) delay(200);

    Serial1.begin(9600, SERIAL_8N1, rxPin, txPin);
    while(!Serial1) delay(200);
}

//GPSから送られてくるNMEA文字列をそのままシリアルモニタで表示
void loop(void) {
    if(Serial1.available() > 0) { //If anything comes in Serial1 (pins 0 & 1)
        Serial.write(Serial1.read()); //read it and send it out Serial (USB)
    } else {
        delay(10);
    }
}

結果として座標や時間が標準形式(NMEA-0183)で表示される

出力されるテキストデータはセンテンス(データ種類)で分類されていて,デフォルトでは全て出力されるようになっているのでひっきりなしにデータが流れてくる

主なセンテンス(データ種類)の種類

  • GGA: 時刻、緯度、経度、高度、受信衛星数などの詳細な測位情報
  • RMC: 時刻、緯度、経度、速度、方位角などの最小限の航法情報
  • GSV: 視界にいる衛星の数や、その電波強度(SNR)などの衛星情報
  • GSA: 測位に使われた衛星の番号や、精度の指標(DOP値)
時刻のみ取得にセット

いまのところ実用になるのは時刻なので時刻だけ取得してみる

そのまま出力データから時刻だけを抽出する方法もあるが,必要ないデータは受ける必要もないので送られるセンテンスを選択する

このチップ(UBX-G7020-KT)はフラッシュメモリで設定情報を格納できるので,一度設定すれば良くu-blox専用の設定ツールを使うのが推奨されている

しかしツールのためだけに接続準備するのも面倒なのでUBXコマンド使用してスケッチで対応

//GPSモジュール:VK2828U7G5
//    GPSを時計のみの出力にセット
//
const int rxPin = 20;
const int txPin = 21;

// u-blox UBXコマンド (各NMEA出力を無効/有効にするためのバイナリデータ)
const byte DISABLE_GGA[] PROGMEM = {0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x23};
const byte DISABLE_GLL[] PROGMEM = {0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A};
const byte DISABLE_GSA[] PROGMEM = {0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x31};
const byte DISABLE_GSV[] PROGMEM = {0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x38};
const byte DISABLE_VTG[] PROGMEM = {0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x46};
const byte ENABLE_RMC[] PROGMEM = {0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x04, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, 0x4E};

void sendUBX(const byte *cmd, byte len) {
for(int i = 0; i < len; i++) {
Serial1.write(pgm_read_byte(cmd + i));
}
}

void setup(void) {
Serial.begin(115200);
while(!Serial) delay(200);
Serial1.begin(9600, SERIAL_8N1, rxPin, txPin);
while(!Serial1) delay(200);

//不要なセンテンスを無効化
sendUBX(DISABLE_GGA, sizeof(DISABLE_GGA)); delay(100);
sendUBX(DISABLE_GLL, sizeof(DISABLE_GLL)); delay(100);
sendUBX(DISABLE_GSA, sizeof(DISABLE_GSA)); delay(100);
sendUBX(DISABLE_GSV, sizeof(DISABLE_GSV)); delay(100);
sendUBX(DISABLE_VTG, sizeof(DISABLE_VTG)); delay(100);

//RMC(時刻含む)のみ有効化
sendUBX(ENABLE_RMC, sizeof(ENABLE_RMC)); delay(100);

Serial.println("GPS configuration complete. Only RMC will be output.");
}

//GPSから送られてくるNMEA文字列をそのままシリアルモニタで表示
void loop(void) {
if(Serial1.available() > 0) { //If anything comes in Serial1 (pins 0 & 1)
Serial.write(Serial1.read()); //read it and send it out Serial (USB)
} else {
delay(10);
}
}
リセット

工場出荷状態に戻す場合は以下(再起動はデータのみなので使用する場合は要編集)

//GPSモジュール:VK2828U7G5
//    工場出荷状態にリセット
const int rxPin = 20;
const int txPin = 21;

//工場出荷状態にリセット(設定の初期化)
// モジュールの内蔵フラッシュ(EEPROM/BBR)に書き込まれた
// カスタム設定(ボーレート変更、出力頻度など)を消去し、デフォルトに戻す
//
const byte FACTORY_RESET[] PROGMEM = {0xB5, 0x62, 0x06, 0x09, 0x0D, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x17, 0x2F, 0xAE};

//再起動(コールドスタート)
// 設定の初期化ではなく、GPSの衛星補足データ(アルマナック・エフェメリス)を
// すべてクリアしてゼロから衛星を探し直す(コールドリセット)
//
const byte COLD_START[] PROGMEM = {0xB5, 0x62, 0x06, 0x04, 0x04, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x0C, 0x5D};

void sendUBX(const byte *cmd, byte len) {
for(int i = 0; i < len; i++) {
Serial1.write(pgm_read_byte(cmd + i));
}
}

void setup(void) {
Serial.begin(115200);
while(!Serial) delay(200);
Serial1.begin(9600, SERIAL_8N1, rxPin, txPin);
while(!Serial1) delay(200);

//工場出荷状態にリセット(設定の初期化)
sendUBX(FACTORY_RESET, sizeof(FACTORY_RESET)); delay(100);

Serial.println("GPS configuration complete. Only RMC will be output.");
}

//GPSから送られてくるNMEA文字列をそのままシリアルモニタで表示
void loop(void) {
if(Serial1.available() > 0) { //If anything comes in Serial1 (pins 0 & 1)
Serial.write(Serial1.read()); //read it and send it out Serial (USB)
} else {
delay(10);
}
}
時計

時刻のみにして時計(シリアル出力まで)にする

NMEA-0183のエンコードには「TinyGPSPlus」を利用

スケッチ(SJIS,TAB4,LF)

GPSからpps信号を処理しようとして実験中止

表示部分などは今後の展開による

AceGamer Aurora PCコントローラーはコスパ良し

安価になっていた「Thief Simulator 2」を購入,PS4対応コントローラでプレイしようとしたが,初期画面からゲーム開始した以降操作できなくなる

TS2.png

Steamのコントローラ設定画面からはSteamDeck対応でないと駄目なような感じで表示されていたのと,1つはSteamDeck対応が欲しいと製品選択していたこともあり,丁度セールだった「AceGamer Aurora PCコントローラー」を購入(8月中旬のセールで¥2,417)

IMG_20260821_195145.jpg

評価

  • Amazonのカスタマレビューでも悪くない評価で,実際手にとってみてガタツキもなく表面が手に馴染ような感じで手持ちは良好
  • ジョイスティック・ボタンの位置,操作感も良好で,この形が見た目から考え得られないほど手にフィットするのに驚いた
  • 裏にもボタン(兼用)があるが,握りだけで誤操作するので慣れが必要である(押せなくできる物理機能もあるので誤操作は避けられる)
  • バッテリー持ちもまずまずで8時間は問題なく使える
  • 耐久性は今後の利用状況によるので現在のところは判らないが初期不良は無かった
  • 唯一残念なのは2.4Gのレシーバを利用しない場合に本体に収納できないことだろうか
  • 価格からするとコストパフォーマンスは良い

早速,Steamのコントローラ設定を見るとエミュレートしなくても使えることが判るが,「Thief Simulator 2」ではPS4コントローラ同様で操作できない

結局ネットで調査した結果,初期画面の右側にある歯車アイコンからコントローラ使用設定を行えば良いことが判る

TS2_top.png

この設定によりPS4コントローラでも問題なく操作可能となった

ただゲーム途中から戻った初期画面ではコントローラからの操作できないのでマウスが必要となるようだ

ゲームの方はコントローラでストーリーモードを終わらせた後,KBで再度プレイして再終了(KBでプレイしたほうが操作性は良い)

ESP32のAP+Web機能を試す

ESP32でネットワークに接続する場合,通常は無線LANのAPに接続するSTA(ステーションモード)を使うが,ESP32をAP(アクセスポイントモード)にしてAPにすることもできる

しかしESP32をAPにして接続してもネットワークにならず,大抵はESP32に接続されたセンサ類の情報をHTTPなどで取り出すようなことになる

そこでESP32をAP+Webサーバにして,性能・問題点など評価のためスマホから接続できれば利用できる独立型審査システムを作ってみた

審査システム

審査システムは何かというと,何らかの発表大会で審査員が審査して点数を付ける簡単な物で,こういった発表の場はそのたびに都合のよい場所で開催される場合が多く,大抵は審査用紙を利用することとなり手間がかかるらしいのを電子化するという試みである

予算があれば簡単に構築できるところを,ESP32とスマホで安価に完結させてやろうとしている(実際の運用ではPC1台は必要かな)

ESP32

コンパクトな「ESP32-C3 Super Mini」は技適マークがないので,技適を取得している「ESP32-WROOM」を使う

IMG_20260813_114536.jpg

後に「Seed studio ESP32-C6」(左)を購入して使用

IMG_20260817_193526.jpg

AP+Web化

まずはESP32のAP化となるが,先駆者の情報が多いので特に問題なく動作した

(例:AP)
#include <WiFi.h>
・・・
static const IPAddress apIP(192, 168, 201, 1);
static const IPAddress apMASK(255, 255, 255, 0);
static const char *WIFIMGR_ssid = "WebGradingSystem";
static const char *WIFIMGR_pass = "xxxxxxxx";
・・・
void setup() {
・・・
WiFi.mode(WIFI_AP);
WiFi.softAP(WIFIMGR_ssid);  //パスワード無
WiFi.softAPConfig(apIP, apIP, apMASK);
・・・
}

次にWeb化では,URLを指定するのにmDNSを利用する手もあるが,接続先が1つしかないのでDNSによる名前解決は全てESP32を返すようにするとAP接続でESP32のトップページが開くので便利になるようだ

(例:Web)
#include <WebServer.h>
・・・
static WebServer webServer(80);
・・・
void setup() {
・・・
webServer.on("/", top);
webServer.onNotFound(top);
webServer.begin();
 ・・・
}

(例:DNS)
#include <DNSServer.h>
・・・
static DNSServer dnsServer;
・・・
void setup() {
・・・
dnsServer.setErrorReplyCode(DNSReplyCode::NoError);
dnsServer.start(53, "*", apIP);
 ・・・
}

(例:mDNS)
void setup() {
・・・
if(!MDNS.begin("esp32")) {
    //回復不能エラーのため停止
    for(;;);    //halt
}
MDNS.addService("http", "tcp", 80);  //サービス登録
・・・
}
画面(参考)

(AP選択)

Screenshot_20260829-105526.png

(TOP画面)→(審査員選択)

Screenshot_20260829-105543.pngScreenshot_20260829-105557.png

(発表者を選択して審査)

Screenshot_20260829-105610.pngScreenshot_20260829-105620.pngScreenshot_20260829-105629.png

(管理者)

Screenshot_20260829-105644.pngScreenshot_20260829-105651.png

(集計)(審査員と発表者の名簿アップロード)(審査初期化)

Screenshot_20260829-105658.pngScreenshot_20260829-105708.pngScreenshot_20260829-105722.png

(デバッグでファイル確認)

Screenshot_20260829-105730.pngScreenshot_20260829-105740.pngScreenshot_20260829-105748.png

システム構成

IMG_20260829_151118.jpg

  • ESP32-C6
  • モバイルバッテリ(省電力なのでスマホのUSBからでも可)
  • 手持ちのスマホ
  • 管理者用にPC(スマホでも可)
スケッチ(参考)

AP-directWeb.txt(SJIS,LF,TAB4)

評価
  • ESP32ではやや厳しい性能も,デュアルコアのC6だとそこそこ使える
  • Web画面がほとんどダイナミック生成になるため大変(LittleFSを活用,もしくはツールが欲しいところだ)
  • メモリが厳しいかと思ったがdataは余裕があった
改善点
  • APの接続数(問題点)

softAPの接続数の最大数は4台となっているため最大数を増やすか運用で接続断をする必要がある

softAP(ssid, password, channel, ssid_hidden, CLIENT_MAX)

channel: 1(def), 6, 11のいずれかが良い
ssid_hidden: 0(公開), 1(非公開)
CLIENT_MAX: 4(def)変更箇所

ハード的にESP32は10台程度,ESP32C6で14台にできることが実証されているようだ

最大数が4台になっているのは性能面の問題があるためのようなので確認が必要

  • csvファイルのコード変換

csvはSJISなのでダウンロードで変換する必要がある

  • ケース

使うなら基板むき出しでなくケースが必要

しかしPCのUSB-Cに刺して使うケースの場合はどうか

  • ダウンロードかSDか

データのやりとりをSDカード(マイクロになる)で行った方が判り易く扱い易いかどうか

  • 未対応箇所

パスワード対応

点数指定を10点と5点に切替できるようにする(当初5点で設計しトグルしてあった)

cssを外部ファイル化(LittleFSにおく)してデザイン変更可能にする

昨日「な!百葉箱」で40℃を記録

昨日,当家の気象台である「な!百葉箱」で,最高気温が遂に40℃を超えた

Screenshot_2026-08-03-11-44-15-156_org.mozilla.firefox.png

強制通風筒化しているとはいえ正規の物ではないので参考気温となる

新居浜のアメダスでは最高気温37.6℃(15:00)だった

(過去一週間の最高気温)

Screenshot_2026-08-03-11-44-45-488_org.mozilla.firefox.png

「な!百葉箱」のESP8266は埃除けでカバーしたせいか50℃を超えているようだ

Screenshot_2026-08-03-11-44-15-157_org.mozilla.firefox.png

室外サーバは通気を良くした効果があり上が2~3℃下がった感じだ

Screenshot_2026-08-03-11-45-37-396_org.mozilla.firefox.png

ページ移動

ユーティリティ

検索

エントリー検索フォーム
キーワード

過去ログ

Feed