エントリー

タグ「ESP32」の検索結果は以下のとおりです。

ページ移動

  • ページ
  • 1
  • 2

みちびきの災害・危機管理通報サービス受信実験

スイッチサイエンスさんで「GPSシールドを使ってみちびき(QZSS)の災害・危機管理通報サービス(DC Report・DCX)を受信してみた。」という記事が公開されていて面白そうなんで試してみる

記事が出た時から気になっていて,地球上の通信はインターネットの普及で有線化されてしまったもんだから,通信(受信も)を楽しむなら地球外だなと思っていたところ,アマチュアレベルでみちびきの情報受信ができるというのは魅力があった訳である

実験といっても既に実装方法が公開されているので,そのまんま利用させてもらい,まずはベースとなる構成の確認となる

IMG_20260629_131422.jpg

購入したのは動作確認が取れている以下の2つ

  • ESPrR Developer C6(ESP32C6)
  • ESPrR Developer用GPSシールド(SAM-M8Q)
ハードウェア

ESP32C6は予備として使用しないでESP32C3 SuperMiniを使う

IMG_20260726_113156.jpg

SAM-M8Qとの接続はSerialだけで良いようなのでESP32C3のSerial1と繋ぐ

SAM-M8QのTXD,RXDはシールド上で切替可能となっており,初期はIO4,IO5に接続されていることに注意

ソフトウェア

必要ライブラリは以下の3つでIDEからインストール

  • SparkFun_u-blox_GNSS_Arduino_Library:V2を使う(ライブラリ名通りで良い)
  • QZQSM:修正する必要はない
  • DCX

メインスケッチは「espr_dev_qzss_drc_drx_decode.ino」をgithubからDLして一部修正

#ifdef ARDUINO_ESP32C6_DEV
const int rxPin = 15;
const int txPin = 21;
#elif ARDUINO_ESP32C3_DEV //Super Mini
const int rxPin = 20;
const int txPin = 21;
#elif ARDUINO_ESP32S3_DEV
const int rxPin = 40;
const int txPin = 35;
#else // ESP32_DEV
const int rxPin = 19;
const int txPin = 21;
#endif
テスト

ビルドでESP32は対応してない旨のメッセージが表示されるが問題なし

ところが最初は動作しなかった(以下がデバッグメッセージ込みの出力)

createFileBuffer: Warning. fileBufferSize is zero. Data logging is not possible.

Sending: CLS:CFG ID:0x0 Len: 0x1 Payload: 1
sendCommand: Waiting for ACK response
waitForACKResponse: TIMEOUT after 1100 msec.
begin: isConnected - second attempt

Sending: CLS:CFG ID:0x0 Len: 0x1 Payload: 1
sendCommand: Waiting for ACK response
waitForACKResponse: TIMEOUT after 1100 msec.
begin: isConnected - third attempt

Sending: CLS:CFG ID:0x0 Len: 0x1 Payload: 1
sendCommand: Waiting for ACK response
waitForACKResponse: TIMEOUT after 1100 msec.
createFileBuffer: Warning. fileBufferSize is zero. Data logging is not possible.

Sending: CLS:CFG ID:0x0 Len: 0x1 Payload: 1
sendCommand: Waiting for ACK response
waitForACKResponse: TIMEOUT after 1100 msec.
begin: isConnected - second attempt

Sending: CLS:CFG ID:0x0 Len: 0x1 Payload: 1
sendCommand: Waiting for ACK response
waitForACKResponse: TIMEOUT after 1100 msec.
begin: isConnected - third attempt

Sending: CLS:CFG ID:0x0 Len: 0x1 Payload: 1
sendCommand: Waiting for ACK response
waitForACKResponse: TIMEOUT after 1100 msec.
u-blox GNSS not detected. Please check wiring. Freezing.

これをSAM-M8Qとの通信であるSerial1の問題だと考え調査

IMG_20260726_125559.jpg

ESP32C3のSerial1テスト(tx:20,rx:21)は問題なし(後で判ったが確認したのは送信だけだったのが失敗)

IMG_20260726_130455.jpg

SAM-M8Qのシリアル出力

IMG_20260726_130507.jpg

こちらも問題なしと思っていて実際は出力ピンを観間違えていた

問題点

実は問題が2点あり解決まで時間が掛かることになる

①SAM-M8Qのシリアル出力のピンが反対

シールドにTx,Rxと記載されているが動作は反対になっていてRxが出力(どうやら相手側を記載しているようだ)

②ESP32C3 SuperMiniのSerial1のピンの割り当てに制限があり,受信の割り当てピンは20でないと動作しない

これはSAM-M8Qの出力が問題なかったので,ESP32C3のSerial1(SAM-M8Qから受信)をSerialで出力したところ何も出力されなかったので,ネットで調べたらSuperMiniでは基板がコンパクトな影響もあって受信が安定していないことが判明

修正点

Rx,Tx指定ピンの変更(上記のスケッチでは修正されている),配線は結果的に修正なしでOKとなる

まずは受信はできるようになったので基本構成は良しで,災害・危機管理通報試験日に情報取得テストを実施する予定

ジョイスティック赤外線リモコンの改修

制作したジョイスティック赤外線リモコンを試用してみたところ,OKボタンの操作は向上したが上下左右の動作に違和感がありスケッチを確認したところatan()の式でミスを発見したので修正

ついでに以下の改修を行い実際に使えるようにした

  • 電源を充電池にする
  • DeepSleepで省電力化,復帰はボタン操作
  • 方向スティック操作が軽いため傾け易いので,スイッチ判定となる傾け度合いを増やす
消費電力確認

(通常)

IMG_20260525_123224.jpg

約20mAで赤外線送信時は設計上+70mAとなるが瞬間的であることもありピークも34mAのようだ

(DeepSleep時)

IMG_20260525_123232.jpg

LEDが消費しているせいか1.5mAとなる

電源

単4電池×2か単4充電池×2として,2.4~3.0Vを5Vに昇圧してESP32C3に印加する

手持ちの昇圧モジュールだと2A出力とかオーバースペックなので,よりコンパクトなモジュールはないかとAmazonで発見したので購入

IMG_20260527_143918.jpg

  • 寸法:22x11x3.6㎜
  • 入力:2.5V~5V
  • 出力:4モード固定,5V Max.1200mA,8V Max.700mA,9V Max.600mA,12V Max.500mA
  • 出力電圧の設定:基板ジャンパーAとB(はんだで繋ぐ)
  • 動作周波数:1.2MHz(固定)
  • 価格:¥749/8個

電池ボックスは単4×2用を基板の裏に設置(ジョイスティックのネジ位置と同じだったので簡単に付いた)

IMG_20260527_143712.jpg

出力電圧を確認

IMG_20260525_145738.jpg

しかし単4充電池×2では電力不足なのか動作が安定しないので充電池×3に変更

IMG_20260527_143650.jpg

裏に基板を追加して充電池ボックスを設置(底の電池が掌に合っている)

スケッチ

ESP32C3のdeep_sleep登録関数は,時間復帰はESP8266やESP32一般と同じだが,GPIO復帰の場合は,

esp_deep_sleep_enable_gpio_wakeup()

を,使用することになる

リモコンスケッチ(SJIS,TAB4)

追加として方向スティックではDeepSleep復帰させていないので内蔵LEDでDeepSleep状態を確認できるようにしている

最終形状

IMG_20260527_143552.jpg

  • LEDが光りっぱなしになるので電源SWを付けた
  • 省電力を意識するならスイッチをプルダウンにするべきだが修正していない
  • ESP32C3は新しく購入した物を使用

(電力確認)

IMG_20260530_092036.jpgIMG_20260530_092048.jpg

ケース作製

持った時薄い方が良いと思っていたら,厚めの方が手にすっぽり入り(2つのボタンしかないためだけど)ボタン操作し易いようだ

この形のままケースを作ろうと,良さそうなサイズのタッパーを見つけて加工したが穴あけなどが難しく失敗したので3Dプリンタで作製予定

(追加:2026.5.31)

ABSで箱状のケースを作り,半透明アクリルでカバーした

IMG_20260531_171524.jpg

ジョイスティックを使った赤外線リモコンを作る

いまさらの赤外線リモコンかもしれないが,理由はGoogleTVのリモコンボタンの使い勝手が良くないので何とかしようという試みである

IMG_20260509_105130.jpg

使いにくいのは赤の部分の移動キーと中央のOKキーで,特にOKキーが押しにくい

当初はBuletoothで接続されているので改良は困難かなと思っていたら,Buletoothを利用しているのは音声検索で他のボタンは赤外線であることが判ったので,一部のボタンを別リモコンとしてみることにした

尚,別リモコンにするのは矢印キーとOKキー,戻るキー(←)で,全てのボタンを作る訳ではない

赤外線受信

赤外線コードの解析のため,先ずはESP32を使用して受信機能を作る

IMG_20260505_092552.jpgIMG_20260505_092453.jpg

昔,秋月で購入しておいた安価な赤外線モジュール(SPS-442-1)→ 今でも在庫があるようだ

IMG_20260505_101245.jpg

ソフトウェアは「IRremoteESP8266」ライブラリの,スケッチ例 > IRremoteESP8266 > IRrecvDumpV3 を利用すれば簡単に解析できると思っていた

しかし,動作させてみるとリモコンのボタンを押さなくても,解析データが止まらず出力されてしまう

SPS-442-1の仕様書には誤動作を避けるために電源のリップルノイズをRCフィルター(R=100Ω,C=22μF)を付けて減らせとあるので設置したが変わらなかった

出力をオシロスコープで確認してみると,無信号時はHIGHレベル出力になっているはずなのだがパルスとなっている

IMG_20260505_174629.jpg

不良品かと変更してみたが同じだったので,これが仕様なのかとIRrecvDumpV3での解析を諦め,無信号パルスを避けるスケッチを作り解析

この件だが後で受信モジュールを基板化すると改善され無信号時はHIGHレベル出力となりIRrecvDumpV3で解析できるようになる

ブレッドボードだと何らかのノイズなどで受信している(つまりキャリアがある)とみなし復調していたのではないだろうか

解析用スケッチ(SJIS,TAB4):NEC,AEHAのみでSONYは未完成

フォーマット:NEC
ベンダーコード:0x4040
ボタンコード
0x21:電源
0x15:上
0x18:右
0x16:下
0x17:左
0x48:戻る
0x47:ホーム
0x19:OK(中ボタン)

(参考)

https://elm-chan.org/docs/ir_format.html

https://www.asahi-net.or.jp/~gt3n-tnk/IR_TX1.html

再利用することもありそうなので基板化

IMG_20260506_170301.jpg

電源が5Vなので3.3V出力にするため分圧する必要がある

このモジュールはオープンコレクタ部に抵抗を設けているので抵抗値を確認

IMG_20260505_172221_1.jpg

46kΩであった(モジュールごとで異なるようだ)

F20260511_01.png

R4=100Ω,C1=22μF

赤外線送信

コードが判ったので送信機を作る

矢印キーとOKボタンはジョイスティックを使う(戻るボタンはモーメンタリSW)

IMG_20260509_105155.jpg

ジョイスティックの解析は「よみやさん」のYoutube動画を参考にした

電源は5Vとあるが3.3Vでも問題なし

赤外線LEDは50~100mA必要なのでトランジスタでドライブする

IMG_20260509_165458.jpg

2N7000と2SC1815を利用する回路を検討(どちらも動作した)

F20260511_02.pngF20260511_03.png

  • Vf1.35V,50mAで算出
  • 50mAで出力が弱い場合はR1=47Ωにすると良い
  • 赤外線LEDを3.3V動作にするなら同じR1を並列に繋げば良い値になる

スケッチは「IRremoteESP8266」ライブラリで,RAW出力(sendRaw)にしたら受信が安定しないので最終的にコード出力(sendNEC)にした

IMG_20260510_104515.jpg

ESP-WROOM-32で動作確認後,基板化ではサイズ的にESP32C3に移植

リモコンスケッチ(SJIS,TAB4) → 修正版はこちら

赤外線コード(SJIS,TAB4)

IMG_20260510_204322.jpg

ESP32C3のPWMピン(6個あるはず)が解らず,手探りで探しGPIO6で動作

まだ実験用になるので電源はUSBで供給

IMG_20260510_212126.jpg

ケースに入れてないので使い勝手は良くないが動作は良好

改良点としては

  • DeepSleepで省電力化
  • ESP32C3をATtiny85に変更(コンパクト化)
  • 電源を設ける(単4×2位か)
  • ケース作製

この試用ボードには受信機能も追加しておくと良さそうではある

ESP32で音出しとMP3を再生したまとめ

ESP32ではメモリ不足で「ESP32-audioI2S」ライブラリは動作不可であったが「ESP8266Audio」というライブラリがありESP32でも使えることが判ったので音出しを実験

まずはネットで情報収集した結果ESP32で音出しする際の構成をまとめてみた

20260412_Fig01.png

ESP32の音出しには2つの方法がある(I2S

①内蔵DACを使って,I2SとDACドライバを経由で音を出力

②内蔵DACを使用しないで直接I2S信号をGPIOで出力させ外付けDACで音を出力

注)②の場合直接I2Sへデーターを送出する方法とライブラリを利用する方法がある

①の方法で出力

サイン波を生成して出力させるスケッチを試したが今一つだったので以下からスケッチを拝借

https://kghr.blog.fc2.com/blog-entry-126.html

I2S_1bit_output.png

注)直接SPを接続すると音量最大時が3.3Vとなるので大電流がGPIOに流れないよう注意

(再生)

②の方法で出力

(テスト用音源の準備)

②の方法で「ESP8266Audio」を使って音を再生するための音源データ(MP3)を準備

当初はWeb経由で行おうとして正常に動作しないので以下を参考にしてESP32のフラッシュに置いた

https://hatakekara.com/spiffs/(SPIFFS)

https://qiita.com/kumakumao/items/be51f174bfeb0e4a6a06 (LittleFS)

音源データが1MB少々でも1.5MBでは不足となるので「NO OTA(2MB APP/2MB SPIFFS)」で対応

■ 簡易的なモノラル出力

「ESP8266Audio」でDACがなくてもDOUTからPWMで再生する方法がある

サンプリング周波数は低いのだろうが,1bitのパルス波形の密度(ON/OFF)で表現するDSDってことかな

I2S_1bit_output.png

スケッチ(音源はSPIFFS)

#define NODAC 1

#include <Arduino.h>
#include "AudioFileSourceSPIFFS.h"
#include "AudioGeneratorMP3.h"
#ifdef NODAC
#include "AudioOutputI2SNoDAC.h"
#else
#include "AudioOutputI2S.h"
#endif

AudioGeneratorMP3 *mp3;
AudioFileSourceSPIFFS *file;
#ifdef NODAC
AudioOutputI2SNoDAC *out;
#else
AudioOutputI2S *out;
#endif

void setup() {
Serial.begin(115200);
delay(1000);
Serial.printf("MP3 Play Start\n");
SPIFFS.begin();
file = new AudioFileSourceSPIFFS("/hoshi45s.mp3");
#ifdef NODAC
out = new AudioOutputI2SNoDAC();
#else
out = new AudioOutputI2S();
#endif
out->SetPinout(26, 25, 22); //BCK=26, WCLK=25, DOUT=22
out->SetGain((float)30/100.0); //音量
mp3 = new AudioGeneratorMP3();
mp3->begin(file, out);
}

void loop() {
if(mp3->isRunning()) {
if(!mp3->loop()) mp3->stop();
} else {
Serial.printf("MP3 done\n");
delay(10000);
}
}

(再生)

■ MAX98357Aで出力

I2S_output.png

スケッチ(音源はSPIFFS)

//#define NODAC 1    ← コメントアウト

以下,上記のスケッチと同じ

(再生)

ESP32C3 super miniでMP3を再生

ESP32で音出しが出来たので,低価格でコンパクトなESP32C3 Super miniでのMP3再生を実験smc3-k2-pin-2.jpg

(相違や懸案点)

  • 使用したのは「ESP32 C3 Super Mini(K2)」((K1)以外はPIN互換だったかな)
  • ESP32C3 Super miniは内蔵DACが省かれているので出力は②の方法のみとなる
  • PIN数が異なるのでGPIOを1~5へ変更
  • SPIFFSを作成してファイルを設置できるのだが何故か読めないのでLittleFSを使用
  • arduinoIDE V1ではビルドできても動作が不安定で動作しないためV2でビルド
  • デバッグで利用するSerial出力がIDEの設定で出力PINが変わるので注意(USB CDC On Boot)
■ 簡易的なモノラル出力

IMG_20260412_164740.jpg

アンプ付きスピーカーとの接続はGPIO1

スケッチ(音源はLittleFS)

#define NODAC 1

#include <Arduino.h>
#include "AudioFileSourceLittleFS.h"
#include "AudioGeneratorMP3.h"
#ifdef NODAC
#include "AudioOutputI2SNoDAC.h"
#else
#include "AudioOutputI2S.h"
#endif

AudioGeneratorMP3 *mp3;
AudioFileSourceLittleFS *file;
#ifdef NODAC
AudioOutputI2SNoDAC *out;
#else
AudioOutputI2S *out;
#endif

void setup() {
Serial.begin(115200);
delay(1000);
Serial.printf("MP3 Play Start\n");
LittleFS.begin();
file = new AudioFileSourceLittleFS("/hoshi45s.mp3");
#ifdef NODAC
out = new AudioOutputI2SNoDAC();
#else
out = new AudioOutputI2S();
#endif
out->SetPinout(3, 2, 1); //BCK=3, WCLK=2, DOUT=1
out->SetGain((float)30/100.0); //音量
mp3 = new AudioGeneratorMP3();
mp3->begin(file, out);
}

void loop() {
if(mp3->isRunning()) {
if(!mp3->loop()) mp3->stop();
} else {
Serial.printf("MP3 done\n");
delay(10000);
}
}

(再生)

■ MAX98357Aで出力

esp32c3_output.png

スケッチ(音源はLittleFS)

//#define NODAC 1 ← コメントアウト

以下,上記のスケッチと同じ

(再生)

  • 電源の問題なのかフェージングが発生

ページ移動

  • ページ
  • 1
  • 2

ユーティリティ

検索

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

過去ログ

Feed