From d972f96a84edbbb611a6e79ab893bb10290ff4af Mon Sep 17 00:00:00 2001 From: me Date: Mon, 22 Jun 2026 12:34:58 -0700 Subject: [PATCH 01/51] Add isJapanMode() frequency detection for ARIB STD-T108 Add getCodingRate() and getFreqMHz() virtual methods to RadioLibWrapper base class, enabling subclasses to report their operating frequency. isJapanMode() detects JP 920MHz band (CH25-27) for ARIB STD-T108 compliance. getMaxTextLen() and getMaxGroupTextLen() enforce 4-second airtime limits per SF12/BW125 measurements. --- src/helpers/radiolib/RadioLibWrappers.h | 28 +++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/helpers/radiolib/RadioLibWrappers.h b/src/helpers/radiolib/RadioLibWrappers.h index 9943bcab77..c3619a1649 100644 --- a/src/helpers/radiolib/RadioLibWrappers.h +++ b/src/helpers/radiolib/RadioLibWrappers.h @@ -47,6 +47,34 @@ class RadioLibWrapper : public mesh::Radio { virtual uint8_t getSpreadingFactor() const { return LORA_SF; } static uint16_t preambleLengthForSF(uint8_t sf) { return sf <= 8 ? 32 : 16; } void updatePreamble(uint8_t sf) { _preamble_sf = sf; _radio->setPreambleLength(preambleLengthForSF(sf)); } + virtual uint8_t getCodingRate() const { return 8; } // default CR4/8, override in subclass + virtual float getFreqMHz() const { return 0.0f; } // default unknown, override in subclass + + bool isJapanMode() const { + float freq = getFreqMHz(); + return (fabsf(freq - 920.800f) < 0.05f || + fabsf(freq - 921.000f) < 0.05f || + fabsf(freq - 921.200f) < 0.05f); + } + + int getMaxTextLen() const { + if (!isJapanMode()) return 10 * 16; // default 160 bytes + uint8_t cr = getCodingRate(); + if (cr <= 5) return 64; // 3874ms @ SF12/BW125/CR4-5 + if (cr == 6) return 48; // 3874ms @ SF12/BW125/CR4-6 + if (cr == 7) return 32; // 3678ms @ SF12/BW125/CR4-7 + return 24; // 3547ms @ SF12/BW125/CR4-8 + } + + int getMaxGroupTextLen() const { + if (!isJapanMode()) return 10 * 16; // default 160 bytes + uint8_t cr = getCodingRate(); + if (cr <= 5) return 64; // 3710ms @ SF12/BW125/CR4-5 + if (cr == 6) return 48; // 3678ms @ SF12/BW125/CR4-6 + if (cr == 7) return 39; // 3907ms @ SF12/BW125/CR4-7 + return 29; // 3809ms @ SF12/BW125/CR4-8 + } + virtual int16_t performChannelScan(); int getNoiseFloor() const override { return _noise_floor; } From 2eed72d8f3e600b4117c30d58f748273497b8913 Mon Sep 17 00:00:00 2001 From: me Date: Mon, 22 Jun 2026 12:46:23 -0700 Subject: [PATCH 02/51] Add ARIB STD-T108 LBT path to isChannelActive() In JP 920MHz band (CH25-27): 5ms continuous RSSI sensing at -80dBm absolute threshold, exponential backoff (2000-16000ms) on busy, jitter (0-500ms) on free, then falls through to CAD if enabled. Non-JP path: existing relative-RSSI threshold + CAD unchanged. Add YIELD_TASK() macro and _busy_count field for backoff tracking. --- src/helpers/radiolib/RadioLibWrappers.cpp | 36 +++++++++++++++++++++-- src/helpers/radiolib/RadioLibWrappers.h | 3 +- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/helpers/radiolib/RadioLibWrappers.cpp b/src/helpers/radiolib/RadioLibWrappers.cpp index 5e72336c05..8362fb478f 100644 --- a/src/helpers/radiolib/RadioLibWrappers.cpp +++ b/src/helpers/radiolib/RadioLibWrappers.cpp @@ -2,6 +2,12 @@ #define RADIOLIB_STATIC_ONLY 1 #include "RadioLibWrappers.h" +#ifdef NRF52_PLATFORM + #define YIELD_TASK() vTaskDelay(1) +#else + #define YIELD_TASK() delay(1) +#endif + #define STATE_IDLE 0 #define STATE_RX 1 #define STATE_TX_WAIT 3 @@ -184,10 +190,34 @@ int16_t RadioLibWrapper::performChannelScan() { } bool RadioLibWrapper::isChannelActive() { - // int.thresh: RSSI-based interference detection (relative to noise floor) - if (_threshold != 0 && getCurrentRSSI() > _noise_floor + _threshold) return true; + if (isJapanMode()) { + // ARIB STD-T108: 5ms continuous RSSI sensing, -80dBm absolute threshold + uint32_t sense_start = millis(); + while (millis() - sense_start < 5) { + if (getCurrentRSSI() > -80.0f) { + _busy_count++; + uint32_t base_ms = 2000; + uint32_t max_backoff = min(base_ms * (1u << _busy_count), (uint32_t)16000); + uint32_t backoff_until = millis() + random(max_backoff / 2, max_backoff); + while (millis() < backoff_until) { + YIELD_TASK(); + } + return true; + } + YIELD_TASK(); + } + _busy_count = 0; + uint32_t jitter_until = millis() + random(0, 500); + while (millis() < jitter_until) { + YIELD_TASK(); + } + // JP RSSI sensing passed; fall through to CAD if enabled + } else { + // Non-JP: RSSI-based interference detection (relative to noise floor) + if (_threshold != 0 && getCurrentRSSI() > _noise_floor + _threshold) return true; + } - // cad: hardware channel activity detection + // hardware channel activity detection (JP and non-JP) if (_cad_enabled) { int16_t result = performChannelScan(); // scanChannel() triggers DIO interrupt (CAD done) which sets STATE_INT_READY diff --git a/src/helpers/radiolib/RadioLibWrappers.h b/src/helpers/radiolib/RadioLibWrappers.h index c3619a1649..7d1e20788f 100644 --- a/src/helpers/radiolib/RadioLibWrappers.h +++ b/src/helpers/radiolib/RadioLibWrappers.h @@ -10,6 +10,7 @@ class RadioLibWrapper : public mesh::Radio { uint32_t n_recv, n_sent, n_recv_errors; int16_t _noise_floor, _threshold; bool _cad_enabled; + uint8_t _busy_count; uint16_t _num_floor_samples; int32_t _floor_sample_sum; uint8_t _preamble_sf; @@ -21,7 +22,7 @@ class RadioLibWrapper : public mesh::Radio { virtual void doResetAGC(); public: - RadioLibWrapper(PhysicalLayer& radio, mesh::MainBoard& board) : _radio(&radio), _board(&board), _preamble_sf(0) { n_recv = n_sent = 0; } + RadioLibWrapper(PhysicalLayer& radio, mesh::MainBoard& board) : _radio(&radio), _board(&board), _busy_count(0), _preamble_sf(0) { n_recv = n_sent = 0; } void begin() override; virtual void powerOff() { _radio->sleep(); } From 653b4d305ce3b41af23c2c2589ad020884acd4d4 Mon Sep 17 00:00:00 2001 From: me Date: Mon, 22 Jun 2026 12:58:44 -0700 Subject: [PATCH 03/51] Prevent forced TX during JP LBT backoff via getCADFailMaxDuration() Add isJapanMode() virtual to mesh::Radio (default false) so Dispatcher can query frequency context without depending on RadioLibWrapper. Dispatcher::getCADFailMaxDuration() returns UINT32_MAX for JP nodes, eliminating the 4-second forced-TX that would violate ARIB STD-T108. Non-JP nodes retain the original 4-second safety timeout unchanged. --- src/Dispatcher.cpp | 1 + src/Dispatcher.h | 2 ++ src/helpers/radiolib/RadioLibWrappers.h | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Dispatcher.cpp b/src/Dispatcher.cpp index c0610b7f8a..d0cfc39660 100644 --- a/src/Dispatcher.cpp +++ b/src/Dispatcher.cpp @@ -60,6 +60,7 @@ uint32_t Dispatcher::getCADFailRetryDelay() const { return 200; } uint32_t Dispatcher::getCADFailMaxDuration() const { + if (_radio->isJapanMode()) return UINT32_MAX; // ARIB STD-T108: never force TX during LBT return 4000; // 4 seconds } diff --git a/src/Dispatcher.h b/src/Dispatcher.h index aad6cba3ec..e53b75aa01 100644 --- a/src/Dispatcher.h +++ b/src/Dispatcher.h @@ -78,6 +78,8 @@ class Radio { virtual float getLastRSSI() const { return 0; } virtual float getLastSNR() const { return 0; } + + virtual bool isJapanMode() const { return false; } }; /** diff --git a/src/helpers/radiolib/RadioLibWrappers.h b/src/helpers/radiolib/RadioLibWrappers.h index 7d1e20788f..4e683a1cf7 100644 --- a/src/helpers/radiolib/RadioLibWrappers.h +++ b/src/helpers/radiolib/RadioLibWrappers.h @@ -51,7 +51,7 @@ class RadioLibWrapper : public mesh::Radio { virtual uint8_t getCodingRate() const { return 8; } // default CR4/8, override in subclass virtual float getFreqMHz() const { return 0.0f; } // default unknown, override in subclass - bool isJapanMode() const { + bool isJapanMode() const override { float freq = getFreqMHz(); return (fabsf(freq - 920.800f) < 0.05f || fabsf(freq - 921.000f) < 0.05f || From 12e825bd25259b5e54b1b1661ac0425d74db5172 Mon Sep 17 00:00:00 2001 From: me Date: Mon, 22 Jun 2026 13:07:18 -0700 Subject: [PATCH 04/51] Add getCodingRate() and getFreqMHz() to CustomLR1110/Wrapper getCodingRate() returns codingRate+4 (RadioLib stores 1-4 internally, expose as CR4/5-8 matching the rest of the codebase). CustomLR1110Wrapper overrides both getCodingRate() and getFreqMHz() so isJapanMode() and getMaxTextLen() work correctly on T1000-E. --- src/helpers/radiolib/CustomLR1110.h | 1 + src/helpers/radiolib/CustomLR1110Wrapper.h | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/helpers/radiolib/CustomLR1110.h b/src/helpers/radiolib/CustomLR1110.h index 4061c6b1a6..a11dbdc687 100644 --- a/src/helpers/radiolib/CustomLR1110.h +++ b/src/helpers/radiolib/CustomLR1110.h @@ -38,4 +38,5 @@ class CustomLR1110 : public LR1110 { } uint8_t getSpreadingFactor() const { return spreadingFactor; } + uint8_t getCodingRate() const { return this->codingRate + 4; } // RadioLib stores 1-4, return 5-8 }; \ No newline at end of file diff --git a/src/helpers/radiolib/CustomLR1110Wrapper.h b/src/helpers/radiolib/CustomLR1110Wrapper.h index 13efd25b57..603472d718 100644 --- a/src/helpers/radiolib/CustomLR1110Wrapper.h +++ b/src/helpers/radiolib/CustomLR1110Wrapper.h @@ -35,6 +35,8 @@ class CustomLR1110Wrapper : public RadioLibWrapper { float getLastSNR() const override { return ((CustomLR1110 *)_radio)->getSNR(); } uint8_t getSpreadingFactor() const override { return ((CustomLR1110 *)_radio)->getSpreadingFactor(); } + uint8_t getCodingRate() const override { return ((CustomLR1110 *)_radio)->getCodingRate(); } + float getFreqMHz() const override { return ((CustomLR1110 *)_radio)->getFreqMHz(); } void setRxBoostedGainMode(bool en) override { ((CustomLR1110 *)_radio)->setRxBoostedGainMode(en); From 7a9915d412fb5ee387f8754b5e0e852b90fc4edc Mon Sep 17 00:00:00 2001 From: me Date: Mon, 22 Jun 2026 13:12:55 -0700 Subject: [PATCH 05/51] Add getCodingRate() and getFreqMHz() to CustomSX1262Wrapper Enables isJapanMode() and getMaxTextLen() to work on SX1262-based targets (WisMesh Tag, T-Echo Lite, T114, XIAO nRF52, etc.). codingRate accessed as SX1262 base class member +4 (same pattern as LR1110). --- src/helpers/radiolib/CustomSX1262Wrapper.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/helpers/radiolib/CustomSX1262Wrapper.h b/src/helpers/radiolib/CustomSX1262Wrapper.h index cc7bb2238b..567722a8d1 100644 --- a/src/helpers/radiolib/CustomSX1262Wrapper.h +++ b/src/helpers/radiolib/CustomSX1262Wrapper.h @@ -34,6 +34,8 @@ class CustomSX1262Wrapper : public RadioLibWrapper { return packetScoreInt(snr, sf, packet_len); } uint8_t getSpreadingFactor() const override { return ((CustomSX1262 *)_radio)->spreadingFactor; } + uint8_t getCodingRate() const override { return ((CustomSX1262 *)_radio)->codingRate + 4; } // RadioLib stores 1-4, return 5-8 + float getFreqMHz() const override { return ((CustomSX1262 *)_radio)->freqMHz; } virtual void powerOff() override { ((CustomSX1262 *)_radio)->sleep(false); } From ebc0b151553fdc1f9e37176f2332e4aac3339683 Mon Sep 17 00:00:00 2001 From: me Date: Mon, 22 Jun 2026 13:17:59 -0700 Subject: [PATCH 06/51] =?UTF-8?q?Add=20ARIB=20STD-T108=20=C2=A73.4.1=20pos?= =?UTF-8?q?t-TX=2050ms=20wait=20to=20onSendFinished()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/helpers/radiolib/RadioLibWrappers.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/helpers/radiolib/RadioLibWrappers.cpp b/src/helpers/radiolib/RadioLibWrappers.cpp index 8362fb478f..da95f10ae2 100644 --- a/src/helpers/radiolib/RadioLibWrappers.cpp +++ b/src/helpers/radiolib/RadioLibWrappers.cpp @@ -182,6 +182,9 @@ bool RadioLibWrapper::isSendComplete() { void RadioLibWrapper::onSendFinished() { _radio->finishTransmit(); _board->onAfterTransmit(); + if (isJapanMode()) { + delay(50); // ARIB STD-T108 §3.4.1: >= 50ms between transmissions + } state = STATE_IDLE; } From 519b5fee981d7a142ac66f9319100251d06d13fb Mon Sep 17 00:00:00 2001 From: me Date: Mon, 22 Jun 2026 13:33:04 -0700 Subject: [PATCH 07/51] Rename isJapanMode() to isAS923_1_JP() for clarity --- src/Dispatcher.cpp | 2 +- src/Dispatcher.h | 2 +- src/helpers/radiolib/RadioLibWrappers.cpp | 4 ++-- src/helpers/radiolib/RadioLibWrappers.h | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Dispatcher.cpp b/src/Dispatcher.cpp index d0cfc39660..4ac78a1f5c 100644 --- a/src/Dispatcher.cpp +++ b/src/Dispatcher.cpp @@ -60,7 +60,7 @@ uint32_t Dispatcher::getCADFailRetryDelay() const { return 200; } uint32_t Dispatcher::getCADFailMaxDuration() const { - if (_radio->isJapanMode()) return UINT32_MAX; // ARIB STD-T108: never force TX during LBT + if (_radio->isAS923_1_JP()) return UINT32_MAX; // ARIB STD-T108: never force TX during LBT return 4000; // 4 seconds } diff --git a/src/Dispatcher.h b/src/Dispatcher.h index e53b75aa01..b64909fb1c 100644 --- a/src/Dispatcher.h +++ b/src/Dispatcher.h @@ -79,7 +79,7 @@ class Radio { virtual float getLastRSSI() const { return 0; } virtual float getLastSNR() const { return 0; } - virtual bool isJapanMode() const { return false; } + virtual bool isAS923_1_JP() const { return false; } }; /** diff --git a/src/helpers/radiolib/RadioLibWrappers.cpp b/src/helpers/radiolib/RadioLibWrappers.cpp index da95f10ae2..2b851da352 100644 --- a/src/helpers/radiolib/RadioLibWrappers.cpp +++ b/src/helpers/radiolib/RadioLibWrappers.cpp @@ -182,7 +182,7 @@ bool RadioLibWrapper::isSendComplete() { void RadioLibWrapper::onSendFinished() { _radio->finishTransmit(); _board->onAfterTransmit(); - if (isJapanMode()) { + if (isAS923_1_JP()) { delay(50); // ARIB STD-T108 §3.4.1: >= 50ms between transmissions } state = STATE_IDLE; @@ -193,7 +193,7 @@ int16_t RadioLibWrapper::performChannelScan() { } bool RadioLibWrapper::isChannelActive() { - if (isJapanMode()) { + if (isAS923_1_JP()) { // ARIB STD-T108: 5ms continuous RSSI sensing, -80dBm absolute threshold uint32_t sense_start = millis(); while (millis() - sense_start < 5) { diff --git a/src/helpers/radiolib/RadioLibWrappers.h b/src/helpers/radiolib/RadioLibWrappers.h index 4e683a1cf7..89c7839e6c 100644 --- a/src/helpers/radiolib/RadioLibWrappers.h +++ b/src/helpers/radiolib/RadioLibWrappers.h @@ -51,7 +51,7 @@ class RadioLibWrapper : public mesh::Radio { virtual uint8_t getCodingRate() const { return 8; } // default CR4/8, override in subclass virtual float getFreqMHz() const { return 0.0f; } // default unknown, override in subclass - bool isJapanMode() const override { + bool isAS923_1_JP() const override { float freq = getFreqMHz(); return (fabsf(freq - 920.800f) < 0.05f || fabsf(freq - 921.000f) < 0.05f || @@ -59,7 +59,7 @@ class RadioLibWrapper : public mesh::Radio { } int getMaxTextLen() const { - if (!isJapanMode()) return 10 * 16; // default 160 bytes + if (!isAS923_1_JP()) return 10 * 16; // default 160 bytes uint8_t cr = getCodingRate(); if (cr <= 5) return 64; // 3874ms @ SF12/BW125/CR4-5 if (cr == 6) return 48; // 3874ms @ SF12/BW125/CR4-6 @@ -68,7 +68,7 @@ class RadioLibWrapper : public mesh::Radio { } int getMaxGroupTextLen() const { - if (!isJapanMode()) return 10 * 16; // default 160 bytes + if (!isAS923_1_JP()) return 10 * 16; // default 160 bytes uint8_t cr = getCodingRate(); if (cr <= 5) return 64; // 3710ms @ SF12/BW125/CR4-5 if (cr == 6) return 48; // 3678ms @ SF12/BW125/CR4-6 From 6b3c7a9e592e4ac53ff6d2a12d570e1949d92aba Mon Sep 17 00:00:00 2001 From: me Date: Mon, 22 Jun 2026 14:11:40 -0700 Subject: [PATCH 08/51] Enforce JP airtime limits via getMaxTextLen()/getMaxGroupTextLen() Add getMaxTextLen() and getMaxGroupTextLen() virtual to mesh::Radio (default 160 bytes). BaseChatMesh uses these instead of the hardcoded MAX_TEXT_LEN macro for limit checks in composeMsgPacket(), sendCommandData(), and sendGroupMessage(). Stack buffers remain sized to MAX_TEXT_LEN as a safe upper bound. --- src/Dispatcher.h | 3 +++ src/helpers/BaseChatMesh.cpp | 11 +++++++---- src/helpers/radiolib/RadioLibWrappers.h | 4 ++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/Dispatcher.h b/src/Dispatcher.h index b64909fb1c..e4f2d4a537 100644 --- a/src/Dispatcher.h +++ b/src/Dispatcher.h @@ -80,6 +80,9 @@ class Radio { virtual float getLastSNR() const { return 0; } virtual bool isAS923_1_JP() const { return false; } + + virtual int getMaxTextLen() const { return 10 * 16; } // default 160 bytes + virtual int getMaxGroupTextLen() const { return 10 * 16; } // default 160 bytes }; /** diff --git a/src/helpers/BaseChatMesh.cpp b/src/helpers/BaseChatMesh.cpp index 972a97e9e6..75d27464ba 100644 --- a/src/helpers/BaseChatMesh.cpp +++ b/src/helpers/BaseChatMesh.cpp @@ -419,8 +419,9 @@ void BaseChatMesh::onGroupDataRecv(mesh::Packet* packet, uint8_t type, const mes mesh::Packet* BaseChatMesh::composeMsgPacket(const ContactInfo& recipient, uint32_t timestamp, uint8_t attempt, const char *text, uint32_t& expected_ack) { int text_len = strlen(text); - if (text_len > MAX_TEXT_LEN) return NULL; - if (attempt > 3 && text_len > MAX_TEXT_LEN-2) return NULL; + int max_len = _radio->getMaxTextLen(); + if (text_len > max_len) return NULL; + if (attempt > 3 && text_len > max_len - 2) return NULL; uint8_t temp[5+MAX_TEXT_LEN+1]; memcpy(temp, ×tamp, 4); // mostly an extra blob to help make packet_hash unique @@ -460,7 +461,8 @@ int BaseChatMesh::sendMessage(const ContactInfo& recipient, uint32_t timestamp, int BaseChatMesh::sendCommandData(const ContactInfo& recipient, uint32_t timestamp, uint8_t attempt, const char* text, uint32_t& est_timeout) { int text_len = strlen(text); - if (text_len > MAX_TEXT_LEN) return MSG_SEND_FAILED; + int max_len = _radio->getMaxTextLen(); + if (text_len > max_len) return MSG_SEND_FAILED; uint8_t temp[5+MAX_TEXT_LEN+1]; memcpy(temp, ×tamp, 4); // mostly an extra blob to help make packet_hash unique @@ -493,7 +495,8 @@ bool BaseChatMesh::sendGroupMessage(uint32_t timestamp, mesh::GroupChannel& chan char *ep = strchr((char *) &temp[5], 0); int prefix_len = ep - (char *) &temp[5]; - if (text_len + prefix_len > MAX_TEXT_LEN) text_len = MAX_TEXT_LEN - prefix_len; + int max_len = _radio->getMaxGroupTextLen(); + if (text_len + prefix_len > max_len) text_len = max_len - prefix_len; memcpy(ep, text, text_len); ep[text_len] = 0; // null terminator diff --git a/src/helpers/radiolib/RadioLibWrappers.h b/src/helpers/radiolib/RadioLibWrappers.h index 89c7839e6c..131a84fd40 100644 --- a/src/helpers/radiolib/RadioLibWrappers.h +++ b/src/helpers/radiolib/RadioLibWrappers.h @@ -58,7 +58,7 @@ class RadioLibWrapper : public mesh::Radio { fabsf(freq - 921.200f) < 0.05f); } - int getMaxTextLen() const { + int getMaxTextLen() const override { if (!isAS923_1_JP()) return 10 * 16; // default 160 bytes uint8_t cr = getCodingRate(); if (cr <= 5) return 64; // 3874ms @ SF12/BW125/CR4-5 @@ -67,7 +67,7 @@ class RadioLibWrapper : public mesh::Radio { return 24; // 3547ms @ SF12/BW125/CR4-8 } - int getMaxGroupTextLen() const { + int getMaxGroupTextLen() const override { if (!isAS923_1_JP()) return 10 * 16; // default 160 bytes uint8_t cr = getCodingRate(); if (cr <= 5) return 64; // 3710ms @ SF12/BW125/CR4-5 From 247b894f8960e48fe4ccc8f9b76c3d5cc2d4f9d6 Mon Sep 17 00:00:00 2001 From: me Date: Tue, 23 Jun 2026 00:17:45 -0700 Subject: [PATCH 09/51] JP LBT: suppress txdelay to jitter-scale at SF12/BW125 --- examples/simple_repeater/MyMesh.cpp | 12 ++++++++++++ examples/simple_room_server/MyMesh.cpp | 12 ++++++++++++ examples/simple_sensor/SensorMesh.cpp | 16 ++++++++++++++-- src/helpers/radiolib/RadioLibWrappers.cpp | 8 +++++++- src/helpers/radiolib/RadioLibWrappers.h | 2 ++ 5 files changed, 47 insertions(+), 3 deletions(-) diff --git a/examples/simple_repeater/MyMesh.cpp b/examples/simple_repeater/MyMesh.cpp index 5cc3a9a11e..9a76742959 100644 --- a/examples/simple_repeater/MyMesh.cpp +++ b/examples/simple_repeater/MyMesh.cpp @@ -541,10 +541,22 @@ int MyMesh::calcRxDelay(float score, uint32_t air_time) const { } uint32_t MyMesh::getRetransmitDelay(const mesh::Packet *packet) { + if (_radio->isAS923_1_JP()) { + // JP LBT: suppress txdelay to jitter-scale to avoid adding unnecessary + // latency on top of LBT backoff. A window equal to jitter_max gives + // ~33% collision reduction vs zero, scales naturally with airtime as + // CR changes, and keeps average added delay to ~56ms at SF12/BW125. + uint32_t jitter_max = _radio->getEstAirtimeFor(MAX_TRANS_UNIT) / RadioLibWrapper::JP_LBT_JITTER_DIVISOR; + return getRNG()->nextInt(0, jitter_max + 1); + } uint32_t t = (_radio->getEstAirtimeFor(packet->getPathByteLen() + packet->payload_len + 2) * _prefs.tx_delay_factor); return getRNG()->nextInt(0, 5*t + 1); } uint32_t MyMesh::getDirectRetransmitDelay(const mesh::Packet *packet) { + if (_radio->isAS923_1_JP()) { + uint32_t jitter_max = _radio->getEstAirtimeFor(MAX_TRANS_UNIT) / RadioLibWrapper::JP_LBT_JITTER_DIVISOR; + return getRNG()->nextInt(0, jitter_max + 1); + } uint32_t t = (_radio->getEstAirtimeFor(packet->getPathByteLen() + packet->payload_len + 2) * _prefs.direct_tx_delay_factor); return getRNG()->nextInt(0, 5*t + 1); } diff --git a/examples/simple_room_server/MyMesh.cpp b/examples/simple_room_server/MyMesh.cpp index 12d0b0c318..e3cbaf3095 100644 --- a/examples/simple_room_server/MyMesh.cpp +++ b/examples/simple_room_server/MyMesh.cpp @@ -272,10 +272,22 @@ const char *MyMesh::getLogDateTime() { } uint32_t MyMesh::getRetransmitDelay(const mesh::Packet *packet) { + if (_radio->isAS923_1_JP()) { + // JP LBT: suppress txdelay to jitter-scale to avoid adding unnecessary + // latency on top of LBT backoff. A window equal to jitter_max gives + // ~33% collision reduction vs zero, scales naturally with airtime as + // CR changes, and keeps average added delay to ~56ms at SF12/BW125. + uint32_t jitter_max = _radio->getEstAirtimeFor(MAX_TRANS_UNIT) / RadioLibWrapper::JP_LBT_JITTER_DIVISOR; + return getRNG()->nextInt(0, jitter_max + 1); + } uint32_t t = (_radio->getEstAirtimeFor(packet->getPathByteLen() + packet->payload_len + 2) * _prefs.tx_delay_factor); return getRNG()->nextInt(0, 5*t + 1); } uint32_t MyMesh::getDirectRetransmitDelay(const mesh::Packet *packet) { + if (_radio->isAS923_1_JP()) { + uint32_t jitter_max = _radio->getEstAirtimeFor(MAX_TRANS_UNIT) / RadioLibWrapper::JP_LBT_JITTER_DIVISOR; + return getRNG()->nextInt(0, jitter_max + 1); + } uint32_t t = (_radio->getEstAirtimeFor(packet->getPathByteLen() + packet->payload_len + 2) * _prefs.direct_tx_delay_factor); return getRNG()->nextInt(0, 5*t + 1); } diff --git a/examples/simple_sensor/SensorMesh.cpp b/examples/simple_sensor/SensorMesh.cpp index 59c9aa0900..066b2e0544 100644 --- a/examples/simple_sensor/SensorMesh.cpp +++ b/examples/simple_sensor/SensorMesh.cpp @@ -313,12 +313,24 @@ int SensorMesh::calcRxDelay(float score, uint32_t air_time) const { } uint32_t SensorMesh::getRetransmitDelay(const mesh::Packet* packet) { + if (_radio->isAS923_1_JP()) { + // JP LBT: suppress txdelay to jitter-scale to avoid adding unnecessary + // latency on top of LBT backoff. A window equal to jitter_max gives + // ~33% collision reduction vs zero, scales naturally with airtime as + // CR changes, and keeps average added delay to ~56ms at SF12/BW125. + uint32_t jitter_max = _radio->getEstAirtimeFor(MAX_TRANS_UNIT) / RadioLibWrapper::JP_LBT_JITTER_DIVISOR; + return getRNG()->nextInt(0, jitter_max + 1); + } uint32_t t = (_radio->getEstAirtimeFor(packet->getPathByteLen() + packet->payload_len + 2) * _prefs.tx_delay_factor); - return getRNG()->nextInt(0, 6)*t; + return getRNG()->nextInt(0, 5*t + 1); } uint32_t SensorMesh::getDirectRetransmitDelay(const mesh::Packet* packet) { + if (_radio->isAS923_1_JP()) { + uint32_t jitter_max = _radio->getEstAirtimeFor(MAX_TRANS_UNIT) / RadioLibWrapper::JP_LBT_JITTER_DIVISOR; + return getRNG()->nextInt(0, jitter_max + 1); + } uint32_t t = (_radio->getEstAirtimeFor(packet->getPathByteLen() + packet->payload_len + 2) * _prefs.direct_tx_delay_factor); - return getRNG()->nextInt(0, 6)*t; + return getRNG()->nextInt(0, 5*t + 1); } int SensorMesh::getInterferenceThreshold() const { return _prefs.interference_threshold; diff --git a/src/helpers/radiolib/RadioLibWrappers.cpp b/src/helpers/radiolib/RadioLibWrappers.cpp index 2b851da352..9bc5d29439 100644 --- a/src/helpers/radiolib/RadioLibWrappers.cpp +++ b/src/helpers/radiolib/RadioLibWrappers.cpp @@ -209,8 +209,14 @@ bool RadioLibWrapper::isChannelActive() { } YIELD_TASK(); } + // Channel free: reset busy counter and add airtime-scaled jitter. + // JP_LBT_JITTER_DIVISOR controls jitter upper bound: + // /8 -> SF12/BW125 ~975ms, SF7/BW62.5 ~50ms + // /16 -> SF12/BW125 ~490ms, SF7/BW62.5 ~25ms + // /32 -> SF12/BW125 ~245ms, SF7/BW62.5 ~12ms (default) _busy_count = 0; - uint32_t jitter_until = millis() + random(0, 500); + uint32_t airtime_ms = getEstAirtimeFor(MAX_TRANS_UNIT); + uint32_t jitter_until = millis() + random(0, airtime_ms / JP_LBT_JITTER_DIVISOR); while (millis() < jitter_until) { YIELD_TASK(); } diff --git a/src/helpers/radiolib/RadioLibWrappers.h b/src/helpers/radiolib/RadioLibWrappers.h index 131a84fd40..f89c58e428 100644 --- a/src/helpers/radiolib/RadioLibWrappers.h +++ b/src/helpers/radiolib/RadioLibWrappers.h @@ -51,6 +51,8 @@ class RadioLibWrapper : public mesh::Radio { virtual uint8_t getCodingRate() const { return 8; } // default CR4/8, override in subclass virtual float getFreqMHz() const { return 0.0f; } // default unknown, override in subclass + static constexpr uint8_t JP_LBT_JITTER_DIVISOR = 32; + bool isAS923_1_JP() const override { float freq = getFreqMHz(); return (fabsf(freq - 920.800f) < 0.05f || From 384538e22eb85542e644e417248c9955c9d17d4d Mon Sep 17 00:00:00 2001 From: me Date: Tue, 23 Jun 2026 01:15:25 -0700 Subject: [PATCH 10/51] Add JP firmware release workflow --- .../setup-build-environment/action.yml | 6 +- .github/workflows/jp-release.yml | 144 ++++++++++++++++++ 2 files changed, 147 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/jp-release.yml diff --git a/.github/actions/setup-build-environment/action.yml b/.github/actions/setup-build-environment/action.yml index 02aaf4249b..2ba7617e9f 100644 --- a/.github/actions/setup-build-environment/action.yml +++ b/.github/actions/setup-build-environment/action.yml @@ -4,7 +4,7 @@ runs: steps: - name: Init Cache - uses: actions/cache@v5 + uses: actions/cache@v4 with: path: | ~/.cache/pip @@ -12,9 +12,9 @@ runs: key: ${{ runner.os }}-pio - name: Install Python - uses: actions/setup-python@v6 + uses: actions/setup-python@v5 with: - python-version: '3.13' + python-version: '3.11' - name: Install PlatformIO shell: bash diff --git a/.github/workflows/jp-release.yml b/.github/workflows/jp-release.yml new file mode 100644 index 0000000000..9d93828153 --- /dev/null +++ b/.github/workflows/jp-release.yml @@ -0,0 +1,144 @@ +name: Build JP Firmwares + +permissions: + contents: write + +on: + workflow_dispatch: + push: + tags: + - 'jp-v*' + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Clone Repo + uses: actions/checkout@v4 + + - name: Setup Build Environment + uses: ./.github/actions/setup-build-environment + + - name: Build JP Firmwares + env: + FIRMWARE_VERSION: ${{ env.GIT_TAG_VERSION || 'dev' }} + + PLATFORMIO_BUILD_FLAGS: >- + -w -DNDEBUG -DRADIOLIB_STATIC_ONLY=1 -DRADIOLIB_GODMODE=1 + -D LORA_FREQ=920.800 + -D LORA_BW=125.0 + -D LORA_SF=12 + -D LORA_CR=8 + -D ENABLE_ADVERT_ON_BOOT=1 + -D ENABLE_PRIVATE_KEY_IMPORT=1 + -D ENABLE_PRIVATE_KEY_EXPORT=1 + -D RADIOLIB_EXCLUDE_CC1101=1 + -D RADIOLIB_EXCLUDE_RF69=1 + -D RADIOLIB_EXCLUDE_SX1231=1 + -D RADIOLIB_EXCLUDE_SI443X=1 + -D RADIOLIB_EXCLUDE_RFM2X=1 + -D RADIOLIB_EXCLUDE_SX128X=1 + -D RADIOLIB_EXCLUDE_AFSK=1 + -D RADIOLIB_EXCLUDE_AX25=1 + -D RADIOLIB_EXCLUDE_HELLSCHREIBER=1 + -D RADIOLIB_EXCLUDE_MORSE=1 + -D RADIOLIB_EXCLUDE_APRS=1 + -D RADIOLIB_EXCLUDE_BELL=1 + -D RADIOLIB_EXCLUDE_RTTY=1 + -D RADIOLIB_EXCLUDE_SSTV=1 + + run: | + mkdir -p out_jp + # JP TX power制限 (13dBm) + sed -i 's/-D LORA_TX_POWER=22/-D LORA_TX_POWER=13/g' \ + variants/rak_wismesh_tag/platformio.ini \ + variants/t1000-e/platformio.ini \ + variants/lilygo_techo_lite/platformio.ini \ + variants/xiao_nrf52/platformio.ini \ + variants/xiao_s3_wio/platformio.ini \ + variants/heltec_t114/platformio.ini + bash build.sh build-firmware RAK_WisMesh_Tag_companion_radio_ble + bash build.sh build-firmware RAK_WisMesh_Tag_companion_radio_usb + bash build.sh build-firmware RAK_WisMesh_Tag_repeater + bash build.sh build-firmware RAK_WisMesh_Tag_room_server + bash build.sh build-firmware t1000e_companion_radio_ble + bash build.sh build-firmware t1000e_companion_radio_usb + bash build.sh build-firmware t1000e_repeater + bash build.sh build-firmware t1000e_room_server + bash build.sh build-firmware LilyGo_T-Echo-Lite_companion_radio_ble + bash build.sh build-firmware LilyGo_T-Echo-Lite_repeater + bash build.sh build-firmware LilyGo_T-Echo-Lite_room_server + bash build.sh build-firmware Xiao_nrf52_companion_radio_ble + bash build.sh build-firmware Xiao_nrf52_companion_radio_usb + bash build.sh build-firmware Xiao_nrf52_repeater + bash build.sh build-firmware Xiao_nrf52_room_server + bash build.sh build-firmware Xiao_S3_WIO_companion_radio_ble + bash build.sh build-firmware Xiao_S3_WIO_companion_radio_usb + bash build.sh build-firmware Xiao_S3_WIO_repeater + bash build.sh build-firmware Xiao_S3_WIO_room_server + bash build.sh build-firmware Heltec_t114_without_display_companion_radio_ble + bash build.sh build-firmware Heltec_t114_without_display_companion_radio_usb + bash build.sh build-firmware Heltec_t114_without_display_repeater + bash build.sh build-firmware Heltec_t114_without_display_room_server + bash build.sh build-firmware Heltec_t114_companion_radio_ble + bash build.sh build-firmware Heltec_t114_companion_radio_usb + bash build.sh build-firmware Heltec_t114_repeater + bash build.sh build-firmware Heltec_t114_room_server + + - name: Copy artifacts to out/ + run: | + ls -la .pio/build/*/firmware.uf2 2>/dev/null || echo "no uf2 found" + mkdir -p out_jp + HASH=$(git rev-parse --short HEAD) + TAG=$(git describe --tags --exact-match 2>/dev/null || echo "dev") + for ENV in RAK_WisMesh_Tag_companion_radio_ble RAK_WisMesh_Tag_companion_radio_usb RAK_WisMesh_Tag_repeater RAK_WisMesh_Tag_room_server t1000e_companion_radio_ble t1000e_companion_radio_usb t1000e_repeater t1000e_room_server LilyGo_T-Echo-Lite_companion_radio_ble LilyGo_T-Echo-Lite_repeater LilyGo_T-Echo-Lite_room_server Xiao_nrf52_companion_radio_ble Xiao_nrf52_companion_radio_usb Xiao_nrf52_repeater Xiao_nrf52_room_server Heltec_t114_without_display_companion_radio_ble Heltec_t114_without_display_companion_radio_usb Heltec_t114_without_display_repeater Heltec_t114_without_display_room_server Heltec_t114_companion_radio_ble Heltec_t114_companion_radio_usb Heltec_t114_repeater Heltec_t114_room_server; do + + NAME="${ENV}-${TAG}-${HASH}" + cp ".pio/build/${ENV}/firmware.uf2" "out_jp/${NAME}.uf2" 2>/dev/null || true + cp ".pio/build/${ENV}/firmware.zip" "out_jp/${NAME}_dfu.zip" 2>/dev/null || true + done + # ESP32系は.binと-merged.binをコピー + for ENV in Xiao_S3_WIO_companion_radio_ble Xiao_S3_WIO_companion_radio_usb Xiao_S3_WIO_repeater Xiao_S3_WIO_room_server; do + NAME="${ENV}-${TAG}-${HASH}" + cp ".pio/build/${ENV}/firmware.bin" "out_jp/${NAME}.bin" 2>/dev/null || true + cp ".pio/build/${ENV}/firmware-merged.bin" "out_jp/${NAME}-merged.bin" 2>/dev/null || true + done + ls -la out_jp/ + + - name: Upload Workflow Artifacts + uses: actions/upload-artifact@v4 + + with: + name: jp-firmwares + path: out_jp + + - name: Create Release + uses: softprops/action-gh-release@v2 + if: startsWith(github.ref, 'refs/tags/') + with: + name: JP Firmware ${{ env.GIT_TAG_VERSION }} + body: | + ## 日本向け MeshCore ファームウェア + + ### 対応デバイス + | デバイス | ファイル | 書き込み方法 | + |---|---|---| + | WisMesh Tag | `RAK_WisMesh_Tag_companion_radio_ble-*.uf2` | UF2ドラッグ&ドロップ | + | T1000-E | `t1000e_companion_radio_ble-*.uf2` | UF2ドラッグ&ドロップ | + | T-Echo Lite | `LilyGo_T-Echo-Lite_companion_radio_ble-*.uf2` | UF2ドラッグ&ドロップ | + | XIAO nRF52840 | `Xiao_nrf52_companion_radio_ble-*.uf2` | UF2ドラッグ&ドロップ | + | Heltec T114 (ディスプレイなし) | `Heltec_t114_without_display_companion_radio_ble-*.uf2` | UF2ドラッグ&ドロップ | + | Heltec T114 (ディスプレイあり) | `Heltec_t114_companion_radio_ble-*.uf2` | UF2ドラッグ&ドロップ | + + 以上の表に載っていないデバイスや、リピーター、ルームサーバーもリリースしていますが、実験的です。 + + ### 日本での運用設定 + フラッシュ後、スマホアプリで以下を確認してください: + - 周波数: `920.8 MHz` + - TX出力: `13 dBm以下` + - BW: `125 kHz` / SF: `12` / CR: `4/8`(都市部推奨) + + ### 技適について + カスタムファームウェア書き込み後は技適の対象外です。詳細は [README_JP.md](https://github.com/jirogit/MeshCore/blob/dev/README_JP.md) を参照してください。 + draft: true + files: out_jp/* From 3134c7af661b20aa756ac3c0370132f5f1ef5fd5 Mon Sep 17 00:00:00 2001 From: me Date: Tue, 23 Jun 2026 01:20:38 -0700 Subject: [PATCH 11/51] docs: restore README_JP.md --- README_JP.md | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 README_JP.md diff --git a/README_JP.md b/README_JP.md new file mode 100644 index 0000000000..4dbe74f37a --- /dev/null +++ b/README_JP.md @@ -0,0 +1,163 @@ +# MeshCore JP ファームウェア + +> **jirogit/MeshCore** の日本向けビルドです。 +> ARIB STD-T108(920MHz帯)準拠の **LBT(Listen Before Talk)実装** を含みます。 + +本家 [meshcore-dev/MeshCore](https://github.com/meshcore-dev/MeshCore) へのPR #2218 がマージされるまでの、日本ユーザー向け暫定ビルドです。 + +--- + +## 📥 ファームウェアのダウンロードと書き込み + +### 最新リリース → [Releases ページ](https://github.com/jirogit/MeshCore/releases/latest) + +| デバイス | MCU | Radio | ファイル | 書き込み方法 | +|---|---|---|---|---| +| WisMesh Tag | nRF52840 | SX1262 | `RAK_WisMesh_Tag_companion_radio_ble-jp-v*.uf2` | ✅ UF2ドラッグ&ドロップ | +| T1000-E | nRF52840 | LR1110 | `t1000e_companion_radio_ble-jp-v*.uf2` | ✅ UF2ドラッグ&ドロップ | +| T-Echo Lite | nRF52840 | SX1262 | `LilyGo_T-Echo-Lite_companion_radio_ble-jp-v*.uf2` | ✅ UF2ドラッグ&ドロップ | +| XIAO nRF52840 | nRF52840 | SX1262 | `Xiao_nrf52_companion_radio_ble-jp-v*.uf2` | ✅ UF2ドラッグ&ドロップ | + +> 両デバイスとも MCU は nRF52840 のため、どちらのフォーマットでも書き込めます。 +> 初心者には `.uf2`(ドラッグ&ドロップ)を推奨します。 + +--- + +### ⚠️ 送信できる文字数について + +本ファームウェアはARIB STD-T108準拠のLBT実装により、**送信できるメッセージ長が本家より短くなります**。 + +チャットアプリ側は本家の上限(DM: 150バイト、グループチャット: 139バイト)を表示しますが、**実際に送信できる上限は設定(コーディングレート)によって異なります**。 + +| コーディングレート | DM上限 | グループチャット上限 | 日本語の目安(約3バイト/文字) | +|---|---|---|---| +| CR4/5 | 64バイト | 64バイト | 約21文字 | +| CR4/6 | 48バイト | 48バイト | 約16文字 | +| CR4/7 | 32バイト | 39バイト | 約10〜13文字 | +| CR4/8 | 24バイト | 29バイト | 約8〜9文字 | + +コーディングレートは**自分のデバイスだけで設定するもの**で、CRの情報はパケットのヘッダーに含まれるため、ネットワーク内の他のデバイスの設定を変える必要はありません。 + +電波ノイズが多い環境(秋葉原など都市部)では **CR4/8 を推奨**します。電波環境が良い場所では CR4/7、CR4/6 なども使えます。数字が小さいほど送れる文字数が増えます。 + +**DMとグループチャットで挙動が異なります:** + +- **DM** — 上限を超えると**エラーになり送信されません**。アプリ側にエラーが表示されます。 +- **グループチャット** — 上限を超えると**超えた部分がサイレントに切り落とされて送信されます**。送信者には通知されません。 + +**グループチャットの追加注意:** ペイロードにはデバイス名が `デバイス名: メッセージ` の形式で含まれます。**デバイス名が長いほど、本文として送れる文字数が少なくなります**。デバイス名は短めに設定することを推奨します。 + +--- + +## WisMesh Tag (RAKwireless+MOKOSMART / MCU: nRF52840 / Radio: SX1262) の書き込み手順 + +### 必要なもの +- WisMesh Tag本体 +- USB-Cケーブル(データ転送対応のもの) +- PC(Windows / Mac / Linux) + +### 手順(UF2 — 推奨) + +**1. ファームウェアをダウンロード** +[Releasesページ](https://github.com/jirogit/MeshCore/releases/latest)から `RAK_WisMesh_Tag_companion_radio_ble-jp-v*.uf2` をダウンロード。 + +**2. ブートローダーモードに入る** +WisMesh Tagのリセットボタンをすばやく2回押す(ダブルクリック)。 +PCにUSBドライブとして表示されればOK(ドライブ名は環境により異なります)。 + +**3. ファームウェアを書き込む** +ダウンロードした `.uf2` ファイルをそのドライブにドラッグ&ドロップする。 +自動的に再起動して完了。 + +--- + +## T1000-E (MCU: nRF52840 / Radio: LR1110) の書き込み手順 + +### 必要なもの +- T1000-E本体 +- USB-Cケーブル(データ転送対応のもの) +- PC + +### 手順(UF2 — 推奨) + +**1. ファームウェアをダウンロード** +[Releasesページ](https://github.com/jirogit/MeshCore/releases/latest)から `t1000e_companion_radio_ble-jp-v*.uf2` をダウンロード。 + +**2. ブートローダーモードに入る** +ボタンを押し続けながら、磁石式充電ケーブルをすばやく2回、接続・切断する(磁石をくっつけて、はなす、をすばやく2回繰り返す)。 +緑色LEDが点灯し続け、PCに **`T1000-E`** という名前のUSBドライブが表示されればOK。 +※ この操作はすばやく行う必要があります。何度か試す必要がある場合があります。 + +**3. ファームウェアを書き込む** +ダウンロードした `.uf2` ファイルをドライブにドラッグ&ドロップする。 +自動的に再起動して完了。 + + + +--- + +## ⚠️ 日本での法的地位について + +### T1000-E (Seeed Studio) + +T1000-E は **工事設計認証(技適)を取得しています**(認証番号:217-252754、Seeed Technology Co., Ltd.、2026年1月7日)。ただし認証の対象は以下の純正ファームウェアに限られます: + +- SenseCAP Card Tracker(LoRaWAN版) +- **SenseCAP Card Tracker T1000-E for Meshtastic** + +本リポジトリのMeshCoreカスタムファームウェアを書き込んだ場合、**工事設計が変わるため技適の対象外となります**。電波法上、免許不要で使用できる根拠を失います。 + +### WisMesh Tag (RAKwireless+MOKOSMART) + +WisMesh Tagの日本向け技適取得状況は現時点で確認できていません。 + +--- + +### カスタムファームウェアを日本で使うには + +技適対象外の機器を日本国内で電波を発射して使用するには、**実験試験局の免許**(電波法第4条第3号)が現実的な選択肢です。総務省の電波利用ポータルから申請できます。 + +このファームウェアは **技術検証・実験用途を主な想定** としています。実際に電波を発射して使用する場合は、利用者自身が電波法を確認し、適切な手続きを行ってください。このリポジトリの作者は、利用者による電波法上の違反について責任を負いません。 + +--- + +## 📻 日本向け無線設定 + +現時点では本家MeshCoreに日本向けプリセットは存在しません([Issue #460](https://github.com/meshcore-dev/MeshCore/issues/460) で提案・議論中)。チャットアプリから以下の値を**手動で設定**してください。 + +| パラメータ | 推奨値 | 備考 | +|---|---|---| +| 周波数 | 920.8 MHz | ARIB STD-T108 CH25 | +| 帯域幅(BW) | 125 kHz | | +| スプレッディングファクター(SF) | 12 | | +| コーディングレート(CR) | 4/8 | 都市部・ノイズ環境向け推奨 | +| 送信出力 | ≤ 13 dBm | ARIB STD-T108 上限 | + +> 電波環境が良好な場所では CR4/7 や CR4/6 も使用できます(送れる文字数が増えます)。 +> 周波数を 920.8 / 921.0 / 921.2 MHz のいずれかに設定すると、このファームウェアが自動的に日本モードになります。 + +--- + +## JP LBT実装の概要 + +| 項目 | 設定値 | 根拠 | +|---|---|---| +| センシング方式 | RSSI連続測定(5ms) | ARIB STD-T108 エネルギー検出 | +| 閾値 | −80 dBm | 同上 | +| バックオフ | 指数(base 2000ms、最大16000ms) | 衝突回避 | +| ジッター | 0〜500ms | チャネル空き時 | +| 送信後待機 | 50ms | キャリアリリース | +| Japan mode判定 | 920.8 / 921.0 / 921.2 MHz | 周波数で自動検出 | + +詳細は [Issue #2079](https://github.com/meshcore-dev/MeshCore/issues/2079) および [PR #2218](https://github.com/meshcore-dev/MeshCore/pull/2218) を参照。 + +> **📡 注意:** 本実装はチャネルが空いていることを確認してから送信します(Listen Before Talk)。 +> 周囲に強い電波干渉がある環境では、送信の遅延や困難が生じる場合があります。 +> これは仕様であり、ARIB STD-T108への準拠によるものです。詳しくは [Issue #2079](https://github.com/meshcore-dev/MeshCore/issues/2079) を参照してください。 + +--- + +## ライセンス + +本リポジトリは [meshcore-dev/MeshCore](https://github.com/meshcore-dev/MeshCore) のフォークです。 +ライセンスは upstream と同じ **MIT License** です。 From aa87bd91ab3deb1012588f781e9da05f2cc520e6 Mon Sep 17 00:00:00 2001 From: jirogit Date: Thu, 9 Jul 2026 16:14:53 -0700 Subject: [PATCH 12/51] =?UTF-8?q?docs:=20=E3=83=AA=E3=83=94=E3=83=BC?= =?UTF-8?q?=E3=82=BF=E3=83=BC/=E3=83=AB=E3=83=BC=E3=83=A0=E3=82=B5?= =?UTF-8?q?=E3=83=BC=E3=83=90=E3=83=BC=E5=88=9D=E6=9C=9F=E8=A8=AD=E5=AE=9A?= =?UTF-8?q?=E3=82=AC=E3=82=A4=E3=83=89=E3=82=92=E5=BE=A9=E5=85=83=EF=BC=88?= =?UTF-8?q?config.meshcore.io=20=E3=83=AA=E3=83=B3=E3=82=AF=E3=81=AB?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README_JP.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README_JP.md b/README_JP.md index 4dbe74f37a..b58476be0b 100644 --- a/README_JP.md +++ b/README_JP.md @@ -92,7 +92,29 @@ PCにUSBドライブとして表示されればOK(ドライブ名は環境に ダウンロードした `.uf2` ファイルをドライブにドラッグ&ドロップする。 自動的に再起動して完了。 +--- + +## リピーター / ルームサーバーの初期設定 + +### CR4/8(デフォルト)でのリモート管理について + +日本向け設定(SF12/BW125/CR4/8)では、コンパニオンアプリからLoRa無線経由でリピーターを設定・管理するのは、通信時間が長くなるため、かなり困難です。 +**初期設定は USB 接続を推奨します。** + +以下のウェブ設定ツールにUSBで接続して設定してください: +👉 https://config.meshcore.io + +### CRの設定について + +クライアント・リピーター両方を **CR4/5** に設定することで、LoRa経由のリモート管理が実用的になります。CR4/8のままでは応答が遅くタイムアウトしやすいです。 + +### 初期パスワード + +リピーター・ルームサーバーの管理者パスワードのデフォルトは `password` です。必ず変更してください。 + +### リピーターの発見 +リピーター側からadvertを送信していなくても、コンパニオンアプリの **Tools → Discover Nearby Nodes** から検出できます。 --- From c3769634eef8b210204b29da0b09ffb4d253a953 Mon Sep 17 00:00:00 2001 From: jirogit Date: Thu, 9 Jul 2026 16:27:03 -0700 Subject: [PATCH 13/51] =?UTF-8?q?ci:=20jp-release.yml=E3=81=ABWio=20Tracke?= =?UTF-8?q?r=20L1=20Pro=20/=20M5Stack=20Unit=20C6L=20/=20T-DECK=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/jp-release.yml | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/.github/workflows/jp-release.yml b/.github/workflows/jp-release.yml index 9d93828153..c06742dec5 100644 --- a/.github/workflows/jp-release.yml +++ b/.github/workflows/jp-release.yml @@ -56,7 +56,10 @@ jobs: variants/lilygo_techo_lite/platformio.ini \ variants/xiao_nrf52/platformio.ini \ variants/xiao_s3_wio/platformio.ini \ - variants/heltec_t114/platformio.ini + variants/heltec_t114/platformio.ini \ + variants/wio-tracker-l1/platformio.ini \ + variants/m5stack_unit_c6l/platformio.ini \ + variants/lilygo_tdeck/platformio.ini bash build.sh build-firmware RAK_WisMesh_Tag_companion_radio_ble bash build.sh build-firmware RAK_WisMesh_Tag_companion_radio_usb bash build.sh build-firmware RAK_WisMesh_Tag_repeater @@ -84,6 +87,17 @@ jobs: bash build.sh build-firmware Heltec_t114_companion_radio_usb bash build.sh build-firmware Heltec_t114_repeater bash build.sh build-firmware Heltec_t114_room_server + bash build.sh build-firmware WioTrackerL1_companion_radio_ble + bash build.sh build-firmware WioTrackerL1_companion_radio_usb + bash build.sh build-firmware WioTrackerL1_repeater + bash build.sh build-firmware WioTrackerL1_room_server + bash build.sh build-firmware M5Stack_Unit_C6L_companion_radio_ble + bash build.sh build-firmware M5Stack_Unit_C6L_companion_radio_usb + bash build.sh build-firmware M5Stack_Unit_C6L_repeater + bash build.sh build-firmware M5Stack_Unit_C6L_room_server + bash build.sh build-firmware LilyGo_TDeck_companion_radio_ble + bash build.sh build-firmware LilyGo_TDeck_companion_radio_usb + bash build.sh build-firmware LilyGo_TDeck_repeater - name: Copy artifacts to out/ run: | @@ -91,14 +105,14 @@ jobs: mkdir -p out_jp HASH=$(git rev-parse --short HEAD) TAG=$(git describe --tags --exact-match 2>/dev/null || echo "dev") - for ENV in RAK_WisMesh_Tag_companion_radio_ble RAK_WisMesh_Tag_companion_radio_usb RAK_WisMesh_Tag_repeater RAK_WisMesh_Tag_room_server t1000e_companion_radio_ble t1000e_companion_radio_usb t1000e_repeater t1000e_room_server LilyGo_T-Echo-Lite_companion_radio_ble LilyGo_T-Echo-Lite_repeater LilyGo_T-Echo-Lite_room_server Xiao_nrf52_companion_radio_ble Xiao_nrf52_companion_radio_usb Xiao_nrf52_repeater Xiao_nrf52_room_server Heltec_t114_without_display_companion_radio_ble Heltec_t114_without_display_companion_radio_usb Heltec_t114_without_display_repeater Heltec_t114_without_display_room_server Heltec_t114_companion_radio_ble Heltec_t114_companion_radio_usb Heltec_t114_repeater Heltec_t114_room_server; do + for ENV in RAK_WisMesh_Tag_companion_radio_ble RAK_WisMesh_Tag_companion_radio_usb RAK_WisMesh_Tag_repeater RAK_WisMesh_Tag_room_server t1000e_companion_radio_ble t1000e_companion_radio_usb t1000e_repeater t1000e_room_server LilyGo_T-Echo-Lite_companion_radio_ble LilyGo_T-Echo-Lite_repeater LilyGo_T-Echo-Lite_room_server Xiao_nrf52_companion_radio_ble Xiao_nrf52_companion_radio_usb Xiao_nrf52_repeater Xiao_nrf52_room_server Heltec_t114_without_display_companion_radio_ble Heltec_t114_without_display_companion_radio_usb Heltec_t114_without_display_repeater Heltec_t114_without_display_room_server Heltec_t114_companion_radio_ble Heltec_t114_companion_radio_usb Heltec_t114_repeater Heltec_t114_room_server WioTrackerL1_companion_radio_ble WioTrackerL1_companion_radio_usb WioTrackerL1_repeater WioTrackerL1_room_server; do NAME="${ENV}-${TAG}-${HASH}" cp ".pio/build/${ENV}/firmware.uf2" "out_jp/${NAME}.uf2" 2>/dev/null || true cp ".pio/build/${ENV}/firmware.zip" "out_jp/${NAME}_dfu.zip" 2>/dev/null || true done # ESP32系は.binと-merged.binをコピー - for ENV in Xiao_S3_WIO_companion_radio_ble Xiao_S3_WIO_companion_radio_usb Xiao_S3_WIO_repeater Xiao_S3_WIO_room_server; do + for ENV in Xiao_S3_WIO_companion_radio_ble Xiao_S3_WIO_companion_radio_usb Xiao_S3_WIO_repeater Xiao_S3_WIO_room_server M5Stack_Unit_C6L_companion_radio_ble M5Stack_Unit_C6L_companion_radio_usb M5Stack_Unit_C6L_repeater M5Stack_Unit_C6L_room_server LilyGo_TDeck_companion_radio_ble LilyGo_TDeck_companion_radio_usb LilyGo_TDeck_repeater; do NAME="${ENV}-${TAG}-${HASH}" cp ".pio/build/${ENV}/firmware.bin" "out_jp/${NAME}.bin" 2>/dev/null || true cp ".pio/build/${ENV}/firmware-merged.bin" "out_jp/${NAME}-merged.bin" 2>/dev/null || true @@ -129,6 +143,9 @@ jobs: | XIAO nRF52840 | `Xiao_nrf52_companion_radio_ble-*.uf2` | UF2ドラッグ&ドロップ | | Heltec T114 (ディスプレイなし) | `Heltec_t114_without_display_companion_radio_ble-*.uf2` | UF2ドラッグ&ドロップ | | Heltec T114 (ディスプレイあり) | `Heltec_t114_companion_radio_ble-*.uf2` | UF2ドラッグ&ドロップ | + | Wio Tracker L1 Pro | `WioTrackerL1_companion_radio_ble-*.uf2` | UF2ドラッグ&ドロップ | + | M5Stack Unit C6L | `M5Stack_Unit_C6L_companion_radio_ble-*-merged.bin` | esptool書き込み | + | T-DECK | `LilyGo_TDeck_companion_radio_ble-*-merged.bin` | esptool書き込み | 以上の表に載っていないデバイスや、リピーター、ルームサーバーもリリースしていますが、実験的です。 From eb90823a5cc815ca4f6c9e84bfd74888f2982544 Mon Sep 17 00:00:00 2001 From: jirogit Date: Thu, 9 Jul 2026 18:51:48 -0700 Subject: [PATCH 14/51] =?UTF-8?q?docs:=20=E6=96=B0=E8=A6=8F3=E6=A9=9F?= =?UTF-8?q?=E7=A8=AE=E3=81=AB=E5=AE=9F=E6=A9=9F=E6=9C=AA=E6=A4=9C=E8=A8=BC?= =?UTF-8?q?=E3=81=AE=E6=B3=A8=E8=A8=98=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/jp-release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/jp-release.yml b/.github/workflows/jp-release.yml index c06742dec5..25d353a963 100644 --- a/.github/workflows/jp-release.yml +++ b/.github/workflows/jp-release.yml @@ -147,6 +147,8 @@ jobs: | M5Stack Unit C6L | `M5Stack_Unit_C6L_companion_radio_ble-*-merged.bin` | esptool書き込み | | T-DECK | `LilyGo_TDeck_companion_radio_ble-*-merged.bin` | esptool書き込み | + > ⚠️ Wio Tracker L1 Pro / M5Stack Unit C6L / T-DECK はCIビルド確認のみで、実機での動作検証はまだです。特にM5Stack Unit C6Lは既知の不具合報告(upstream #2229)が未解決の可能性があります。動作報告歓迎します。 + 以上の表に載っていないデバイスや、リピーター、ルームサーバーもリリースしていますが、実験的です。 ### 日本での運用設定 From 6bee95e05e756eda2309e9399c4a85d6ef25543b Mon Sep 17 00:00:00 2001 From: me Date: Sun, 19 Jul 2026 14:43:13 -0700 Subject: [PATCH 15/51] docs: add experimental station / notification system license guide MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds comparison table for 実験試験局 (5-year experimental station license) vs 特例制度 (180-day notification-based exemption), notes that 920MHz is not covered by the simplified 特定実験試験局 gazette frequencies, and clarifies no MeshCore devices currently hold 技適 certification (some Meshtastic devices do). --- README_JP.md | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/README_JP.md b/README_JP.md index 4dbe74f37a..4cb9f4a4fd 100644 --- a/README_JP.md +++ b/README_JP.md @@ -115,9 +115,35 @@ WisMesh Tagの日本向け技適取得状況は現時点で確認できていま ### カスタムファームウェアを日本で使うには -技適対象外の機器を日本国内で電波を発射して使用するには、**実験試験局の免許**(電波法第4条第3号)が現実的な選択肢です。総務省の電波利用ポータルから申請できます。 +#### 技適対象外:実験試験局 or 特例制度 -このファームウェアは **技術検証・実験用途を主な想定** としています。実際に電波を発射して使用する場合は、利用者自身が電波法を確認し、適切な手続きを行ってください。このリポジトリの作者は、利用者による電波法上の違反について責任を負いません。 +本ファームウェアで使われる無線機は、2026年7月時点で、Meshtasticで技適を通っている機種はありますが、どれもMeshCoreでは技適を通っていません。日本国内で電波を発射して使用する場合は、次のいずれかの手続きが必要だと思われます(開発は米国で行っているので、ちょっと自信がないです、すいません)。 + +参考:本ファームウェアの無線仕様 + +| 項目 | 値 | +|------|-----| +| 送信出力 | 13dBm以下 | +| 周波数 | 920.8 / 921.0 / 921.2 MHz | +| LBT | RSSI −80dBm、5ms連続センシング | +| バックオフ | 指数、base 2000ms、最大16000ms | +| TX後待機 | 50ms | + +| | 実験試験局免許 | 特例制度(届出) | +|---|---|---| +| 向いている用途 | 長期・継続運用(リピーター常設など) | 短期の動作確認・検証 | +| 期間 | 免許ごとに設定(**通常5年**) | 届出から**180日限定**(再届出可) | +| 必要書類 | 無線局事項書・工事設計書・試験計画書 | 届出のみ(オンライン) | +| 機器の条件 | 特になし(審査で個別判断) | 外国認証(FCC/CE等)**または**無線従事者による技術基準確認 | +| 手続き先 | [総務省:実験試験局](https://www.tele.soumu.go.jp/j/sys/exp/index.htm) | [総務省:特例制度](https://www.tele.soumu.go.jp/j/sys/others/exp-sp/) | + +> **注:** 実験試験局には審査が簡略化・2週間程度で開設できる「特定実験試験局」もありますが、総務省告示の対象周波数を確認したところ920MHz帯は含まれていません。そのため本ファームウェアで実験試験局を申請する場合は、通常の実験試験局(個別審査)ルートになります。 + +特例制度は本来、短期間の実験・検証を想定した仕組みです。防災用リピーターのように地域に根ざして長く動き続けてほしいノードには、実験試験局免許の方が制度としての相性が良く、審査を経た分、災害時に胸を張って運用できる安心材料にもなります。まずは特例制度で素早く実地検証を始めて、運用が固まってきたら実験試験局へ移行する、という段階的なアプローチもおすすめです。 + +#### 免責事項 + +このファームウェアは技術検証・実験用途を主な想定としています。実際に電波を発射して使用する場合は、利用者自身が電波法を確認し、適切な手続きを行ってください。このリポジトリの作者は、利用者による電波法上の違反について責任を負いません。 --- From 46f8474d088e701061fbbae972567945ae5a4951 Mon Sep 17 00:00:00 2001 From: me Date: Sun, 19 Jul 2026 20:02:43 -0700 Subject: [PATCH 16/51] docs: simplify license guide, add ARIB STD-T108 path for tokurei MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Community feedback (だてさま) confirmed 特例制度's technical conformity condition includes conformance to ARIB-designated standards (令和元年 総務省告示第263号 五号3), which explicitly lists ARIB STD-T108. Since this firmware targets ARIB STD-T108 compliance, this is a more direct path than foreign certification or radio engineer confirmation. Also flags a concern with 実験試験局: 電波法施行規則第6条 restricts use to the license holder only, which fits poorly with mesh networking's arbitrary-peer communication model. Removed the radio spec table — it duplicated the existing '日本向け無線設定' section below, which already covers frequency/power/etc in more detail. --- README_JP.md | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/README_JP.md b/README_JP.md index 4cb9f4a4fd..3c4bcb1074 100644 --- a/README_JP.md +++ b/README_JP.md @@ -113,35 +113,24 @@ WisMesh Tagの日本向け技適取得状況は現時点で確認できていま --- -### カスタムファームウェアを日本で使うには +## カスタムファームウェアを日本で使うには -#### 技適対象外:実験試験局 or 特例制度 +### 技適対象外:実験試験局 or 特例制度 -本ファームウェアで使われる無線機は、2026年7月時点で、Meshtasticで技適を通っている機種はありますが、どれもMeshCoreでは技適を通っていません。日本国内で電波を発射して使用する場合は、次のいずれかの手続きが必要だと思われます(開発は米国で行っているので、ちょっと自信がないです、すいません)。 +本ファームウェアで使われる無線機は、2026年7月時点でどれも技適を通っていません(Meshtasticには技適済み機種がありますが別物です)。日本国内で電波を発射する場合は、次のいずれかの手続きが必要だと思われます(開発は米国で行っているので、ちょっと自信がないです、すいません)。 -参考:本ファームウェアの無線仕様 +**おすすめ:特例制度(届出のみ・180日)** -| 項目 | 値 | -|------|-----| -| 送信出力 | 13dBm以下 | -| 周波数 | 920.8 / 921.0 / 921.2 MHz | -| LBT | RSSI −80dBm、5ms連続センシング | -| バックオフ | 指数、base 2000ms、最大16000ms | -| TX後待機 | 50ms | +外国認証や無線従事者確認がなくても、**ARIB STD-T108への適合**を根拠に届出できます(令和元年総務省告示第263号 五号3)。本ファームウェアはARIB STD-T108準拠を目的に設計されているため、これが一番現実的なルートです。 +👉 [総務省:特例制度](https://www.tele.soumu.go.jp/j/sys/others/exp-sp/) -| | 実験試験局免許 | 特例制度(届出) | -|---|---|---| -| 向いている用途 | 長期・継続運用(リピーター常設など) | 短期の動作確認・検証 | -| 期間 | 免許ごとに設定(**通常5年**) | 届出から**180日限定**(再届出可) | -| 必要書類 | 無線局事項書・工事設計書・試験計画書 | 届出のみ(オンライン) | -| 機器の条件 | 特になし(審査で個別判断) | 外国認証(FCC/CE等)**または**無線従事者による技術基準確認 | -| 手続き先 | [総務省:実験試験局](https://www.tele.soumu.go.jp/j/sys/exp/index.htm) | [総務省:特例制度](https://www.tele.soumu.go.jp/j/sys/others/exp-sp/) | +**実験試験局免許は非推奨** -> **注:** 実験試験局には審査が簡略化・2週間程度で開設できる「特定実験試験局」もありますが、総務省告示の対象周波数を確認したところ920MHz帯は含まれていません。そのため本ファームウェアで実験試験局を申請する場合は、通常の実験試験局(個別審査)ルートになります。 +常設運用に向いていそうに見えますが、免許人以外の使用を認めない条件(電波法施行規則第6条)があり、不特定多数と通信するメッシュ用途とは相性が悪いです。加えて920MHz帯は簡易審査の「特定実験試験局」の対象外で、通常審査(無線従事者資格者の選任も必要)になります。 -特例制度は本来、短期間の実験・検証を想定した仕組みです。防災用リピーターのように地域に根ざして長く動き続けてほしいノードには、実験試験局免許の方が制度としての相性が良く、審査を経た分、災害時に胸を張って運用できる安心材料にもなります。まずは特例制度で素早く実地検証を始めて、運用が固まってきたら実験試験局へ移行する、という段階的なアプローチもおすすめです。 +**まとめ**:特例制度で実地検証を重ね、運用が固まったら技適取得済みハードウェアへ移行していくのが現実的です。 -#### 免責事項 +### 免責事項 このファームウェアは技術検証・実験用途を主な想定としています。実際に電波を発射して使用する場合は、利用者自身が電波法を確認し、適切な手続きを行ってください。このリポジトリの作者は、利用者による電波法上の違反について責任を負いません。 From 8dfefe0181773c5b633feaf0d0a6a25ca96e5bb3 Mon Sep 17 00:00:00 2001 From: me Date: Tue, 21 Jul 2026 14:36:50 -0700 Subject: [PATCH 17/51] feat: limit TX power to 10dBm for Wio-SX1262 devices MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wio-SX1262 module (Seeed Technology, 201-250230) holds standalone technical conformity certification (技適) in Japan with a certified output of 10dBm, independent of host firmware. Seeed confirmed in writing (2026-07-20) that custom/third-party host firmware and RadioLib usage do not affect the certification, provided hardware, antenna, and RF parameters stay within the certified scope. Devices affected (10dBm, was 13dBm): - XIAO nRF52840 + Wio-SX1262 - XIAO ESP32S3 + Wio-SX1262 - Wio Tracker L1 Pro All other JP devices remain at 13dBm (ARIB STD-T108 limit). Build verified: WioTrackerL1_companion_radio_ble compiles with LORA_TX_POWER=10. --- .github/workflows/jp-release.yml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/.github/workflows/jp-release.yml b/.github/workflows/jp-release.yml index 25d353a963..8678cf4227 100644 --- a/.github/workflows/jp-release.yml +++ b/.github/workflows/jp-release.yml @@ -49,15 +49,18 @@ jobs: run: | mkdir -p out_jp - # JP TX power制限 (13dBm) + # JP TX power制限 + # Wio-SX1262搭載機(工事設計認証201-250230、証明出力10dBm)は10dBmに制限 + sed -i 's/-D LORA_TX_POWER=22/-D LORA_TX_POWER=10/g' \ + variants/xiao_nrf52/platformio.ini \ + variants/xiao_s3_wio/platformio.ini \ + variants/wio-tracker-l1/platformio.ini + # それ以外はARIB STD-T108上限の13dBmのまま sed -i 's/-D LORA_TX_POWER=22/-D LORA_TX_POWER=13/g' \ variants/rak_wismesh_tag/platformio.ini \ variants/t1000-e/platformio.ini \ variants/lilygo_techo_lite/platformio.ini \ - variants/xiao_nrf52/platformio.ini \ - variants/xiao_s3_wio/platformio.ini \ variants/heltec_t114/platformio.ini \ - variants/wio-tracker-l1/platformio.ini \ variants/m5stack_unit_c6l/platformio.ini \ variants/lilygo_tdeck/platformio.ini bash build.sh build-firmware RAK_WisMesh_Tag_companion_radio_ble @@ -154,9 +157,11 @@ jobs: ### 日本での運用設定 フラッシュ後、スマホアプリで以下を確認してください: - 周波数: `920.8 MHz` - - TX出力: `13 dBm以下` + - TX出力: `13 dBm以下`(XIAO nRF52840/XIAO ESP32S3+Wio-SX1262/Wio Tracker L1 Proは`10 dBm以下`) - BW: `125 kHz` / SF: `12` / CR: `4/8`(都市部推奨) + > ℹ️ Wio-SX1262搭載機(XIAO nRF52840/ESP32S3+Wio-SX1262、Wio Tracker L1 Pro)はモジュール単体で技適取得済み(工事設計認証201-250230、Seeed社確認済み・書面回答2026/7/20)。ただし証明出力は10dBmのみのため、本ビルドは当該機種のTX出力を10dBmに制限しています。 + ### 技適について カスタムファームウェア書き込み後は技適の対象外です。詳細は [README_JP.md](https://github.com/jirogit/MeshCore/blob/dev/README_JP.md) を参照してください。 draft: true From d9b9644d2f87b1d6b55f0b88114c93b7f7a2cebc Mon Sep 17 00:00:00 2001 From: me Date: Tue, 21 Jul 2026 14:55:34 -0700 Subject: [PATCH 18/51] docs: add Wio-SX1262 certification note to README_JP.md Seeed confirmed in writing (2026-07-20) that Wio-SX1262's standalone technical conformity certification (201-250230) remains valid under custom host firmware, provided hardware/antenna/RF parameters stay within the certified scope. Certified output is 10dBm. Updates both TX power reference tables to reflect the 10dBm limit for Wio-SX1262 devices (XIAO nRF52840/ESP32S3+Wio-SX1262, Wio Tracker L1 Pro), matching the jp-release.yml change in #4. --- README_JP.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/README_JP.md b/README_JP.md index dcbdb0dd6e..3574295a12 100644 --- a/README_JP.md +++ b/README_JP.md @@ -129,6 +129,20 @@ T1000-E は **工事設計認証(技適)を取得しています**(認証 本リポジトリのMeshCoreカスタムファームウェアを書き込んだ場合、**工事設計が変わるため技適の対象外となります**。電波法上、免許不要で使用できる根拠を失います。 +### Wio-SX1262搭載機(XIAO nRF52840/ESP32S3+Wio-SX1262、Wio Tracker L1 Pro) + +Wio-SX1262モジュール単体で工事設計認証(技適)を取得しています(認証番号:**201-250230**、Seeed Technology Co., Ltd.、2026年4月30日)。証明された出力は **10.000mW(10dBm)** のみです。 + +T1000-Eと異なり、Seeed社に正式問い合わせたところ(2026年7月20日付、書面回答)、以下の3条件を満たせば **ホスト側ファームウェアの変更(本リポジトリのカスタムファームウェア含む)は技適の有効性に影響しない** との回答を得ています: + +- Wio-SX1262モジュールのハードウェアを無改造であること +- アンテナ構成が証明範囲内であること +- 動作周波数・RFパラメータ(送信出力含む)が証明範囲内であること + +これを受けて、本ファームウェアはWio-SX1262搭載機(XIAO nRF52840+Wio-SX1262、XIAO ESP32S3+Wio-SX1262、Wio Tracker L1 Pro)の送信出力を **10dBm** に制限しています(他の対応機種は13dBm)。 + +> **注:** ホスト側ファームウェアがSPI経由でRFパラメータを直接制御する構造(本ファームウェアも含む)が、法的に「工事設計」の同一性を保つかどうかは、Seeed社の回答で一定の裏付けは得られたものの、完全に確立した論点ではありません。運用にあたっては自己責任での最終確認をおすすめします。 + ### WisMesh Tag (RAKwireless+MOKOSMART) WisMesh Tagの日本向け技適取得状況は現時点で確認できていません。 @@ -145,7 +159,7 @@ WisMesh Tagの日本向け技適取得状況は現時点で確認できていま | 項目 | 値 | |------|-----| -| 送信出力 | 13dBm以下 | +| 送信出力 | 13dBm以下(Wio-SX1262搭載機は10dBm以下) | | 周波数 | 920.8 / 921.0 / 921.2 MHz | | LBT | RSSI −80dBm、5ms連続センシング | | バックオフ | 指数、base 2000ms、最大16000ms | @@ -179,7 +193,7 @@ WisMesh Tagの日本向け技適取得状況は現時点で確認できていま | 帯域幅(BW) | 125 kHz | | | スプレッディングファクター(SF) | 12 | | | コーディングレート(CR) | 4/8 | 都市部・ノイズ環境向け推奨 | -| 送信出力 | ≤ 13 dBm | ARIB STD-T108 上限 | +| 送信出力 | ≤ 13 dBm(Wio-SX1262搭載機は ≤ 10 dBm) | ARIB STD-T108 上限/Wio-SX1262は工事設計認証201-250230の証明出力 | > 電波環境が良好な場所では CR4/7 や CR4/6 も使用できます(送れる文字数が増えます)。 > 周波数を 920.8 / 921.0 / 921.2 MHz のいずれかに設定すると、このファームウェアが自動的に日本モードになります。 From 7b6431a8ea83b322b3ee568cffcfb7b48cb207c3 Mon Sep 17 00:00:00 2001 From: me Date: Tue, 21 Jul 2026 15:16:35 -0700 Subject: [PATCH 19/51] docs: remove T1000-E comparison in Wio-SX1262 README section The T1000-E vs Wio-SX1262 comparison implied Seeed was asked about both devices under the same terms. Only Wio-SX1262 was formally inquired about; T1000-E's certification scope is inferred from the technical conformity database listing, not a direct Seeed response. --- README_JP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_JP.md b/README_JP.md index 3574295a12..1426327014 100644 --- a/README_JP.md +++ b/README_JP.md @@ -133,7 +133,7 @@ T1000-E は **工事設計認証(技適)を取得しています**(認証 Wio-SX1262モジュール単体で工事設計認証(技適)を取得しています(認証番号:**201-250230**、Seeed Technology Co., Ltd.、2026年4月30日)。証明された出力は **10.000mW(10dBm)** のみです。 -T1000-Eと異なり、Seeed社に正式問い合わせたところ(2026年7月20日付、書面回答)、以下の3条件を満たせば **ホスト側ファームウェアの変更(本リポジトリのカスタムファームウェア含む)は技適の有効性に影響しない** との回答を得ています: +Seeed社に正式問い合わせたところ(2026年7月20日付、書面回答)、以下の3条件を満たせば **ホスト側ファームウェアの変更(本リポジトリのカスタムファームウェア含む)は技適の有効性に影響しない** との回答を得ています: - Wio-SX1262モジュールのハードウェアを無改造であること - アンテナ構成が証明範囲内であること From dd629ac86229289389da94259f01473cae677f72 Mon Sep 17 00:00:00 2001 From: me Date: Tue, 21 Jul 2026 15:37:15 -0700 Subject: [PATCH 20/51] =?UTF-8?q?docs:=20fix=20stale=20'=E6=8A=80=E9=81=A9?= =?UTF-8?q?=E3=82=92=E9=80=9A=E3=81=A3=E3=81=A6=E3=81=84=E3=81=BE=E3=81=9B?= =?UTF-8?q?=E3=82=93'=20wording=20for=20Wio-SX1262=20devices?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The blanket statement contradicted the Wio-SX1262 certification section added earlier. Now scopes the statement to non-Wio-SX1262 devices. --- README_JP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_JP.md b/README_JP.md index 2e7f722de4..2aeaecd36b 100644 --- a/README_JP.md +++ b/README_JP.md @@ -153,7 +153,7 @@ WisMesh Tagの日本向け技適取得状況は現時点で確認できていま ### 技適対象外:実験試験局 or 特例制度 -本ファームウェアで使われる無線機は、2026年7月時点でどれも技適を通っていません(Meshtasticには技適済み機種がありますが別物です)。日本国内で電波を発射する場合は、次のいずれかの手続きが必要だと思われます(開発は米国で行っているので、ちょっと自信がないです、すいません)。 +本ファームウェアで使われる無線機のうち、Wio-SX1262搭載機は使用するモジュールが単体で技適を取得済みです(送信出力10dBm厳守が条件。詳細は上記「Wio-SX1262搭載機」の項を参照)。それ以外の無線機は、2026年7月時点でどれも技適を通っていません(Meshtasticには技適済み機種がありますが別物です)。技適の対象外となる機種で日本国内で電波を発射する場合は、次のいずれかの手続きが必要だと思われます(開発は米国で行っているので、ちょっと自信がないです、すいません)。 **おすすめ:特例制度(届出のみ・180日)** From ab468a5409f06cc4d3bb26b432b874b7ecaac40b Mon Sep 17 00:00:00 2001 From: me Date: Tue, 21 Jul 2026 16:31:51 -0700 Subject: [PATCH 21/51] docs: fix stale technical conformity wording in release notes template MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The blanket '技適の対象外' statement contradicted the Wio-SX1262 certification documented in README_JP.md (#4, #5, #6). Scopes the statement to non-Wio-SX1262 devices so future jp-v* releases carry accurate notes. jp-v1.7.1's published release notes were already corrected manually via the GitHub UI; this brings the template in sync for future tags. --- .github/workflows/jp-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/jp-release.yml b/.github/workflows/jp-release.yml index 8678cf4227..8984eb7067 100644 --- a/.github/workflows/jp-release.yml +++ b/.github/workflows/jp-release.yml @@ -163,6 +163,6 @@ jobs: > ℹ️ Wio-SX1262搭載機(XIAO nRF52840/ESP32S3+Wio-SX1262、Wio Tracker L1 Pro)はモジュール単体で技適取得済み(工事設計認証201-250230、Seeed社確認済み・書面回答2026/7/20)。ただし証明出力は10dBmのみのため、本ビルドは当該機種のTX出力を10dBmに制限しています。 ### 技適について - カスタムファームウェア書き込み後は技適の対象外です。詳細は [README_JP.md](https://github.com/jirogit/MeshCore/blob/dev/README_JP.md) を参照してください。 + カスタムファームウェア書き込み後、Wio-SX1262搭載機(XIAO nRF52840/ESP32S3+Wio-SX1262、Wio Tracker L1 Pro)は技適の範囲内(送信出力10dBm厳守)、それ以外の機種は技適の対象外です。詳細は [README_JP.md](https://github.com/jirogit/MeshCore/blob/dev/README_JP.md) を参照してください。 draft: true files: out_jp/* From edebf07f36fa540c920d0d8a20d2017c557c24b6 Mon Sep 17 00:00:00 2001 From: me Date: Sun, 26 Jul 2026 14:36:54 -0700 Subject: [PATCH 22/51] jp-release: T1000-E TX power to 12dBm (Seeed-confirmed 19mW cert limit) --- .github/workflows/jp-release.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/jp-release.yml b/.github/workflows/jp-release.yml index 8984eb7067..7a7e396a0d 100644 --- a/.github/workflows/jp-release.yml +++ b/.github/workflows/jp-release.yml @@ -55,10 +55,12 @@ jobs: variants/xiao_nrf52/platformio.ini \ variants/xiao_s3_wio/platformio.ini \ variants/wio-tracker-l1/platformio.ini + # T1000-E: Seeed確認済み証明上限19mW(≈12.79dBm)のため12dBmに制限 + sed -i 's/-D LORA_TX_POWER=22/-D LORA_TX_POWER=12/g' \ + variants/t1000-e/platformio.ini # それ以外はARIB STD-T108上限の13dBmのまま sed -i 's/-D LORA_TX_POWER=22/-D LORA_TX_POWER=13/g' \ variants/rak_wismesh_tag/platformio.ini \ - variants/t1000-e/platformio.ini \ variants/lilygo_techo_lite/platformio.ini \ variants/heltec_t114/platformio.ini \ variants/m5stack_unit_c6l/platformio.ini \ From e158122070a4ce4411cfb18718a0e96c3f30d5dd Mon Sep 17 00:00:00 2001 From: me Date: Sun, 26 Jul 2026 17:47:49 -0700 Subject: [PATCH 23/51] =?UTF-8?q?docs:=20T1000-E=E6=8A=80=E9=81=A9?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E4=BB=98=E3=81=8D=E6=9C=89=E5=8A=B9=E3=83=BB?= =?UTF-8?q?=E3=82=A2=E3=83=B3=E3=83=86=E3=83=8A=E6=A7=8B=E6=88=90=E3=82=92?= =?UTF-8?q?README=5FJP=E3=81=A8=E3=83=AA=E3=83=AA=E3=83=BC=E3=82=B9?= =?UTF-8?q?=E3=83=8E=E3=83=BC=E3=83=88=E3=81=AB=E5=8F=8D=E6=98=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/jp-release.yml | 8 +++--- README_JP.md | 43 ++++++++++++++++++++++++++++---- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/.github/workflows/jp-release.yml b/.github/workflows/jp-release.yml index 7a7e396a0d..a58fdf6547 100644 --- a/.github/workflows/jp-release.yml +++ b/.github/workflows/jp-release.yml @@ -159,12 +159,14 @@ jobs: ### 日本での運用設定 フラッシュ後、スマホアプリで以下を確認してください: - 周波数: `920.8 MHz` - - TX出力: `13 dBm以下`(XIAO nRF52840/XIAO ESP32S3+Wio-SX1262/Wio Tracker L1 Proは`10 dBm以下`) + - TX出力: `13 dBm以下`(XIAO nRF52840/XIAO ESP32S3+Wio-SX1262/Wio Tracker L1 Proは`10 dBm以下`、T1000-Eは`12 dBm以下`) - BW: `125 kHz` / SF: `12` / CR: `4/8`(都市部推奨) - > ℹ️ Wio-SX1262搭載機(XIAO nRF52840/ESP32S3+Wio-SX1262、Wio Tracker L1 Pro)はモジュール単体で技適取得済み(工事設計認証201-250230、Seeed社確認済み・書面回答2026/7/20)。ただし証明出力は10dBmのみのため、本ビルドは当該機種のTX出力を10dBmに制限しています。 + > ℹ️ Wio-SX1262搭載機(XIAO nRF52840/ESP32S3+Wio-SX1262、Wio Tracker L1 Pro)はモジュール単体で技適取得済み(工事設計認証201-250230、Seeed社確認済み・書面回答2026/7/20)。ただし証明出力は10dBmのみのため、本ビルドは当該機種のTX出力を10dBmに制限しています。アンテナは付属の低利得アンテナ(FPCまたはSpring)を使用してください。ダイポール型は10dBm設定ではEIRP超過のため使用不可です。 + > + > ℹ️ T1000-Eも工事設計認証を取得済み(217-252754、Seeed社確認済み・書面回答2026/7/22)。証明出力は19mW(≈12.79dBm)が上限のため、本ビルドは当該機種のTX出力を12dBmに制限しています。アンテナは内蔵PCBアンテナのみで交換不可です。 ### 技適について - カスタムファームウェア書き込み後、Wio-SX1262搭載機(XIAO nRF52840/ESP32S3+Wio-SX1262、Wio Tracker L1 Pro)は技適の範囲内(送信出力10dBm厳守)、それ以外の機種は技適の対象外です。詳細は [README_JP.md](https://github.com/jirogit/MeshCore/blob/dev/README_JP.md) を参照してください。 + カスタムファームウェア書き込み後、Wio-SX1262搭載機(XIAO nRF52840/ESP32S3+Wio-SX1262、Wio Tracker L1 Pro)とT1000-Eは技適の範囲内(それぞれ送信出力・アンテナ構成の条件あり)、それ以外の機種は技適の対象外です。詳細は [README_JP.md](https://github.com/jirogit/MeshCore/blob/dev/README_JP.md) を参照してください。 draft: true files: out_jp/* diff --git a/README_JP.md b/README_JP.md index 2aeaecd36b..1044cd22fa 100644 --- a/README_JP.md +++ b/README_JP.md @@ -122,12 +122,16 @@ PCにUSBドライブとして表示されればOK(ドライブ名は環境に ### T1000-E (Seeed Studio) -T1000-E は **工事設計認証(技適)を取得しています**(認証番号:217-252754、Seeed Technology Co., Ltd.、2026年1月7日)。ただし認証の対象は以下の純正ファームウェアに限られます: +T1000-E は **工事設計認証(技適)を取得しています**(認証番号:217-252754、Seeed Technology Co., Ltd.、2026年1月7日)。証明書上の型式名は以下の純正ファームウェア向けです: - SenseCAP Card Tracker(LoRaWAN版) -- **SenseCAP Card Tracker T1000-E for Meshtastic** +- SenseCAP Card Tracker T1000-E for Meshtastic -本リポジトリのMeshCoreカスタムファームウェアを書き込んだ場合、**工事設計が変わるため技適の対象外となります**。電波法上、免許不要で使用できる根拠を失います。 +Seeed社に正式問い合わせたところ(2026年7月22日付、書面回答)、**証明はT1000-E完成品としての構成に基づくが、送信出力・周波数などRFパラメータが証明範囲内である限り、ファームウェアの変更は証明の有効性に影響しない**との回答を得ています。証明書の「for Meshtastic」という表記は、厳密な法的制約ではなかった可能性が高いです。 + +証明された920MHz帯の出力上限は **19mW(≈12.79dBm)** で、これは厳格な上限(丸め誤差の余地なし)とのことです。本ファームウェアはこれを踏まえ、T1000-Eの送信出力を **12dBm**(≈15.85mW)に制限しています。 + +アンテナは内蔵PCBアンテナ(利得 −0.45dBi)のみが証明対象で、物理的に交換できません。付属のまま使用してください。 ### Wio-SX1262搭載機(XIAO nRF52840/ESP32S3+Wio-SX1262、Wio Tracker L1 Pro) @@ -143,17 +147,46 @@ Seeed社に正式問い合わせたところ(2026年7月20日付、書面回 > **注:** ホスト側ファームウェアがSPI経由でRFパラメータを直接制御する構造(本ファームウェアも含む)が、法的に「工事設計」の同一性を保つかどうかは、Seeed社の回答で一定の裏付けは得られたものの、完全に確立した論点ではありません。運用にあたっては自己責任での最終確認をおすすめします。 +**アンテナについて:** 証明対象のアンテナは3種類です(試験報告書 BL-SZ2531376-601 より)。 + +| アンテナ | 利得 | 本ファームウェア(10dBm設定)での使用 | +|---|---|---| +| Seeed FPC Antenna (M01-0401030R0A) | 2.36 dBi | ✅ 使用可 | +| Seeed Spring Antenna (M04-0101870R0A) | 3.11 dBi | ✅ 使用可 | +| VLG Dipole Antenna (V1194-145-A-01) | 8.00 dBi | ❌ **使用不可** | + +ダイポールアンテナ(8.0dBi)は証明対象ではありますが、10dBmの出力設定と組み合わせるとEIRPが18dBmとなり、920MHz帯の上限16dBmを超えます(試験時は出力を約7.7dBmまで下げて8.0dBiと組ませることでEIRP15.7〜15.8dBmに収め、合格しています)。**Wio-SX1262搭載機では付属の低利得アンテナ(FPCまたはSpring、概ね3dBi以下)を使用してください。** + ### WisMesh Tag (RAKwireless+MOKOSMART) WisMesh Tagの日本向け技適取得状況は現時点で確認できていません。 +### アンテナ・送信出力について(全機種共通) + +日本の電波法では、次のすべてを同時に満たす必要があります(どれか1つ守ればいい、という関係ではありません)。 + +- **アンテナ利得**:3dBi以下(技適の対象外の機種、および技適済み機種でも証明範囲外のアンテナを使う場合の一般原則) +- **送信出力**:本ファームウェアが各機種に設定した値(10〜13dBm)を越えた値に変更しないでください +- **技適済み機器**:上記の一般原則より優先。認証時の出力・アンテナ構成の範囲内で使用してください(上記のT1000-E・Wio-SX1262搭載機の項を参照。Wio-SX1262は3dBi超のアンテナも条件付きで証明範囲内です) + +高利得アンテナ(八木・指向性・ハイゲインコリニア等)は3dBiを超えるため使用できません。通常のホイップ/チップアンテナ(概ね0〜2dBi)の範囲で使ってください。 + +### 技適(工事設計認証)の確認方法 + +以下のリンクから、各機種の証明内容を直接確認できます。 + +| 機種 | 認証番号 | リンク | +|---|---|---| +| T1000-E | 217-252754 | [Seeed証明書PDF](https://files.seeedstudio.com/Seeed_Certificate/documents_certificate/114993369-TELEC.pdf) | +| Wio-SX1262搭載機 | 201-250230 | [総務省データベース](https://www.tele.soumu.go.jp/giteki/SearchServlet?pageID=jg01_01&PC=201&TC=N&PK=1&FN=250515N201&SN=%E8%AA%8D%E8%A8%BC&LN=34&R1=*****&R2=*****) | + --- ## カスタムファームウェアを日本で使うには ### 技適対象外:実験試験局 or 特例制度 -本ファームウェアで使われる無線機のうち、Wio-SX1262搭載機は使用するモジュールが単体で技適を取得済みです(送信出力10dBm厳守が条件。詳細は上記「Wio-SX1262搭載機」の項を参照)。それ以外の無線機は、2026年7月時点でどれも技適を通っていません(Meshtasticには技適済み機種がありますが別物です)。技適の対象外となる機種で日本国内で電波を発射する場合は、次のいずれかの手続きが必要だと思われます(開発は米国で行っているので、ちょっと自信がないです、すいません)。 +本ファームウェアで使われる無線機のうち、Wio-SX1262搭載機とT1000-Eは、メーカーから条件付きで技適の有効性が確認できています(それぞれ送信出力・アンテナ構成の条件あり。詳細は上記の各機種の項を参照)。それ以外の無線機は、2026年7月時点でどれも技適を通っていません(Meshtasticには技適済み機種がありますが別物です)。技適の対象外となる機種で日本国内で電波を発射する場合は、次のいずれかの手続きが必要だと思われます(開発は米国で行っているので、ちょっと自信がないです、すいません)。 **おすすめ:特例制度(届出のみ・180日)** @@ -182,7 +215,7 @@ WisMesh Tagの日本向け技適取得状況は現時点で確認できていま | 帯域幅(BW) | 125 kHz | | | スプレッディングファクター(SF) | 12 | | | コーディングレート(CR) | 4/8 | 都市部・ノイズ環境向け推奨 | -| 送信出力 | ≤ 13 dBm(Wio-SX1262搭載機は ≤ 10 dBm) | ARIB STD-T108 上限/Wio-SX1262は工事設計認証201-250230の証明出力 | +| 送信出力 | ≤ 13 dBm(Wio-SX1262搭載機は ≤ 10 dBm、T1000-Eは ≤ 12 dBm) | ARIB STD-T108 上限/各機種の証明出力に準拠 | > 電波環境が良好な場所では CR4/7 や CR4/6 も使用できます(送れる文字数が増えます)。 > 周波数を 920.8 / 921.0 / 921.2 MHz のいずれかに設定すると、このファームウェアが自動的に日本モードになります。 From 73787f6bc4c08c9b41b62edb2eda91d8082fb390 Mon Sep 17 00:00:00 2001 From: me Date: Sun, 26 Jul 2026 18:19:17 -0700 Subject: [PATCH 24/51] =?UTF-8?q?docs:=20=E8=A1=A8=E7=8F=BE=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E3=81=A8=E6=8A=80=E9=81=A9=E8=A8=BC=E6=98=8E=E6=9B=B8?= =?UTF-8?q?=E3=81=B8=E3=81=AE=E3=83=AA=E3=83=B3=E3=82=AF=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=EF=BC=88920MHz=E5=B8=AF=E3=81=AF=E7=AC=AC8=E5=8F=B7=E3=81=AE?= =?UTF-8?q?=E8=A1=8C=E3=82=92=E6=98=8E=E7=A4=BA=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/jp-release.yml | 4 ++-- README_JP.md | 28 ++++++++++++++-------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/jp-release.yml b/.github/workflows/jp-release.yml index a58fdf6547..35d99e55e0 100644 --- a/.github/workflows/jp-release.yml +++ b/.github/workflows/jp-release.yml @@ -162,9 +162,9 @@ jobs: - TX出力: `13 dBm以下`(XIAO nRF52840/XIAO ESP32S3+Wio-SX1262/Wio Tracker L1 Proは`10 dBm以下`、T1000-Eは`12 dBm以下`) - BW: `125 kHz` / SF: `12` / CR: `4/8`(都市部推奨) - > ℹ️ Wio-SX1262搭載機(XIAO nRF52840/ESP32S3+Wio-SX1262、Wio Tracker L1 Pro)はモジュール単体で技適取得済み(工事設計認証201-250230、Seeed社確認済み・書面回答2026/7/20)。ただし証明出力は10dBmのみのため、本ビルドは当該機種のTX出力を10dBmに制限しています。アンテナは付属の低利得アンテナ(FPCまたはSpring)を使用してください。ダイポール型は10dBm設定ではEIRP超過のため使用不可です。 + > ℹ️ Wio-SX1262搭載機(XIAO nRF52840/ESP32S3+Wio-SX1262、Wio Tracker L1 Pro)はモジュール単体で技適取得済み(工事設計認証201-250230、Seeed社確認済み・書面回答2026/7/20)。ただし証明出力は10dBmのみのため、本ビルドは当該機種のTX出力のデフォルトを10dBmに設定しています。アンテナは付属の低利得アンテナ(FPCまたはSpring)を使用してください。試験報告書に記載されている8dBiのダイポール型アンテナは、10dBm設定ではEIRP超過のため使用不可です。 > - > ℹ️ T1000-Eも工事設計認証を取得済み(217-252754、Seeed社確認済み・書面回答2026/7/22)。証明出力は19mW(≈12.79dBm)が上限のため、本ビルドは当該機種のTX出力を12dBmに制限しています。アンテナは内蔵PCBアンテナのみで交換不可です。 + > ℹ️ T1000-Eも工事設計認証を取得済み(217-252754、Seeed社確認済み・書面回答2026/7/22)。証明出力は19mW(≈12.79dBm)が上限のため、本ビルドは当該機種のTX出力のデフォルトを12dBmに設定しています。 ### 技適について カスタムファームウェア書き込み後、Wio-SX1262搭載機(XIAO nRF52840/ESP32S3+Wio-SX1262、Wio Tracker L1 Pro)とT1000-Eは技適の範囲内(それぞれ送信出力・アンテナ構成の条件あり)、それ以外の機種は技適の対象外です。詳細は [README_JP.md](https://github.com/jirogit/MeshCore/blob/dev/README_JP.md) を参照してください。 diff --git a/README_JP.md b/README_JP.md index 1044cd22fa..1761d53801 100644 --- a/README_JP.md +++ b/README_JP.md @@ -129,9 +129,14 @@ T1000-E は **工事設計認証(技適)を取得しています**(認証 Seeed社に正式問い合わせたところ(2026年7月22日付、書面回答)、**証明はT1000-E完成品としての構成に基づくが、送信出力・周波数などRFパラメータが証明範囲内である限り、ファームウェアの変更は証明の有効性に影響しない**との回答を得ています。証明書の「for Meshtastic」という表記は、厳密な法的制約ではなかった可能性が高いです。 -証明された920MHz帯の出力上限は **19mW(≈12.79dBm)** で、これは厳格な上限(丸め誤差の余地なし)とのことです。本ファームウェアはこれを踏まえ、T1000-Eの送信出力を **12dBm**(≈15.85mW)に制限しています。 +証明された920MHz帯の出力上限は **19mW(≈12.79dBm)** で、これは厳格な上限(丸め誤差の余地なし)とのことです。本ファームウェアはこれを踏まえ、T1000-Eの送信出力のデフォルトを **12dBm**(≈15.85mW)に設定しています。 -アンテナは内蔵PCBアンテナ(利得 −0.45dBi)のみが証明対象で、物理的に交換できません。付属のまま使用してください。 +**証明内容の確認:** +- [総務省データベース:第8号 920MHz帯(LoRa)](https://www.tele.soumu.go.jp/giteki/SearchServlet?pageID=jg01_01&PC=217&TC=N&PK=1&FN=260303N217&SN=%E8%AA%8D%E8%A8%BC&LN=4&R1=*****&R2=*****) — F1D 920.6〜928MHz(200kHz間隔38波)**19mW**、920.7〜927.9MHz(37波)16mW +- [総務省データベース:第19号 2.4GHz帯(Bluetooth LE)](https://www.tele.soumu.go.jp/giteki/SearchServlet?pageID=jg01_01&PC=217&TC=N&PK=1&FN=260303N217&SN=%E8%AA%8D%E8%A8%BC&LN=3&R1=*****&R2=*****) +- [Seeed証明書PDF](https://files.seeedstudio.com/Seeed_Certificate/documents_certificate/114993369-TELEC.pdf) — 上記2種別をまとめて記載 + +> T1000-Eの技適は、920MHz帯(第8号)と2.4GHz帯(第19号)で総務省データベース上の行が分かれています。LoRaの運用に関係するのは第8号の方です。 ### Wio-SX1262搭載機(XIAO nRF52840/ESP32S3+Wio-SX1262、Wio Tracker L1 Pro) @@ -143,7 +148,11 @@ Seeed社に正式問い合わせたところ(2026年7月20日付、書面回 - アンテナ構成が証明範囲内であること - 動作周波数・RFパラメータ(送信出力含む)が証明範囲内であること -これを受けて、本ファームウェアはWio-SX1262搭載機(XIAO nRF52840+Wio-SX1262、XIAO ESP32S3+Wio-SX1262、Wio Tracker L1 Pro)の送信出力を **10dBm** に制限しています(他の対応機種は13dBm)。 +これを受けて、本ファームウェアはWio-SX1262搭載機(XIAO nRF52840+Wio-SX1262、XIAO ESP32S3+Wio-SX1262、Wio Tracker L1 Pro)の送信出力のデフォルトを **10dBm** に設定しています(他の対応機種は13dBm)。 + +**証明内容の確認:** +- [総務省データベース(認証番号 201-250230)](https://www.tele.soumu.go.jp/giteki/SearchServlet?pageID=jg01_01&PC=201&TC=N&PK=1&FN=250515N201&SN=%E8%AA%8D%E8%A8%BC&LN=34&R1=*****&R2=*****) +- [試験報告書 BL-SZ2531376-601](https://www.tele.soumu.go.jp/giteki/SearchServlet2?PageID=jt01&ATF=185316004)(証明対象アンテナ3種の記載あり) > **注:** ホスト側ファームウェアがSPI経由でRFパラメータを直接制御する構造(本ファームウェアも含む)が、法的に「工事設計」の同一性を保つかどうかは、Seeed社の回答で一定の裏付けは得られたものの、完全に確立した論点ではありません。運用にあたっては自己責任での最終確認をおすすめします。 @@ -155,7 +164,7 @@ Seeed社に正式問い合わせたところ(2026年7月20日付、書面回 | Seeed Spring Antenna (M04-0101870R0A) | 3.11 dBi | ✅ 使用可 | | VLG Dipole Antenna (V1194-145-A-01) | 8.00 dBi | ❌ **使用不可** | -ダイポールアンテナ(8.0dBi)は証明対象ではありますが、10dBmの出力設定と組み合わせるとEIRPが18dBmとなり、920MHz帯の上限16dBmを超えます(試験時は出力を約7.7dBmまで下げて8.0dBiと組ませることでEIRP15.7〜15.8dBmに収め、合格しています)。**Wio-SX1262搭載機では付属の低利得アンテナ(FPCまたはSpring、概ね3dBi以下)を使用してください。** +試験報告書に記載されている8dBiのダイポール型アンテナは、証明対象ではありますが、10dBmの出力設定と組み合わせるとEIRPが18dBmとなり、920MHz帯の上限16dBmを超えます(試験時は出力を約7.7dBmまで下げて8.0dBiと組ませることでEIRP15.7〜15.8dBmに収め、合格しています)。**Wio-SX1262搭載機では付属の低利得アンテナ(FPCまたはSpring、概ね3dBi以下)を使用してください。** ### WisMesh Tag (RAKwireless+MOKOSMART) @@ -167,19 +176,10 @@ WisMesh Tagの日本向け技適取得状況は現時点で確認できていま - **アンテナ利得**:3dBi以下(技適の対象外の機種、および技適済み機種でも証明範囲外のアンテナを使う場合の一般原則) - **送信出力**:本ファームウェアが各機種に設定した値(10〜13dBm)を越えた値に変更しないでください -- **技適済み機器**:上記の一般原則より優先。認証時の出力・アンテナ構成の範囲内で使用してください(上記のT1000-E・Wio-SX1262搭載機の項を参照。Wio-SX1262は3dBi超のアンテナも条件付きで証明範囲内です) +- **技適済み機器**:上記の一般原則より優先。認証時の出力・アンテナ構成の範囲内で使用してください(上記のT1000-E・Wio-SX1262搭載機の項を参照) 高利得アンテナ(八木・指向性・ハイゲインコリニア等)は3dBiを超えるため使用できません。通常のホイップ/チップアンテナ(概ね0〜2dBi)の範囲で使ってください。 -### 技適(工事設計認証)の確認方法 - -以下のリンクから、各機種の証明内容を直接確認できます。 - -| 機種 | 認証番号 | リンク | -|---|---|---| -| T1000-E | 217-252754 | [Seeed証明書PDF](https://files.seeedstudio.com/Seeed_Certificate/documents_certificate/114993369-TELEC.pdf) | -| Wio-SX1262搭載機 | 201-250230 | [総務省データベース](https://www.tele.soumu.go.jp/giteki/SearchServlet?pageID=jg01_01&PC=201&TC=N&PK=1&FN=250515N201&SN=%E8%AA%8D%E8%A8%BC&LN=34&R1=*****&R2=*****) | - --- ## カスタムファームウェアを日本で使うには From 2007a621cfe591b54561d37bb1e86893370949cc Mon Sep 17 00:00:00 2001 From: me Date: Sun, 26 Jul 2026 19:15:44 -0700 Subject: [PATCH 25/51] =?UTF-8?q?docs:=20=E3=83=95=E3=82=A1=E3=83=BC?= =?UTF-8?q?=E3=83=A0=E3=82=A6=E3=82=A7=E3=82=A2=E6=9B=B4=E6=96=B0=E6=99=82?= =?UTF-8?q?=E3=81=AE=E8=A8=AD=E5=AE=9A=E4=BF=9D=E6=8C=81=E3=83=BB=E3=82=A4?= =?UTF-8?q?=E3=83=AC=E3=83=BC=E3=82=B9=E6=89=8B=E9=A0=86=E3=83=BB=E5=85=AC?= =?UTF-8?q?=E9=96=8B=E9=8D=B5=E9=81=8B=E7=94=A8=E3=82=92=E8=BF=BD=E8=A8=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README_JP.md | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/README_JP.md b/README_JP.md index 1761d53801..341176ac29 100644 --- a/README_JP.md +++ b/README_JP.md @@ -222,6 +222,59 @@ WisMesh Tagの日本向け技適取得状況は現時点で確認できていま --- +## ⚠️ ファームウェア更新時の注意:保存済み設定について + +TX出力などの設定値は、書き込み後に内部ファイルシステムへ保存され、次回起動時は +その保存値が使われます。新しいファームウェアでデフォルト値が変更されていても +(例:Wio-SX1262搭載機が13dBm→10dBmに変更)、**上書きインストールしただけでは +古い設定値が残ります。** + +**技適・法令遵守に関わる設定(TX出力等)は、機種を問わず、ファームウェア更新の +度に手動で確認・更新してください。** + +``` +set txpower 10 +``` + +スマホアプリの **Export Config / Import Config** 機能で秘密鍵・連絡先・ +チャンネルをまとめてバックアップ・復元できますが(コンパニオンラジオのみ、 +リピーター/ルームサーバーには非対応)、**Import Configは古いTX出力設定も +そのまま復元してしまう**ため、Import Config後もTX出力の再確認・再設定が +必要です。バックアップ・復元があっても手動確認は省略できません。 + +### イレースについて(任意・通常のアップグレードには不要) + +設定が壊れた場合などにクリーンな状態からやり直したい場合のみ、以下の方法が +使えます。通常のアップグレードでは不要です。 + +**nRF52系のデバイス(WisMesh Tag、T1000-E、T-Echo Lite、Heltec T114、XIAO nRF52840)** + +https://flasher.meshcore.io で対象デバイスを選択 → "Enter DFU Mode" → +デバイス接続を選択 → "Erase Flash"。 + +**ESP32系のデバイス(XIAO ESP32S3+Wio-SX1262、T3S3、Heltec V4、M5Stack Unit C6L、T-DECK、Heltec Wireless Paper)** + +flasher.meshcore.ioでは単体イレースができません("Flash"ボタンの上に +"Erase"チェックボックスがあるのみで、書き込みと同時にイレースする形に +なります)。手動での設定確認・更新(上記)で対応することを推奨します。 + +> ⚠️ **リピーター/ルームサーバーはExport Config相当の機能がないため、 +> イレースするとアイデンティティ(秘密鍵)が失われ、復元できません。** +> 既存のメッシュ参加者からは「別ノード」として認識されます。 + +### 公開鍵とノード名について + +公開鍵の先頭バイトが近隣ノードと衝突した場合は、アイデンティティを +作り直す(公開鍵を変える)のがおすすめです。公開鍵は運用上しょっちゅう +変わりうるものと考えて問題ありません。 + +一方、**ノード名は同じものを使い続けることを推奨します。** 近隣の利用者は +公開鍵ではなくノード名でノードを認識するため、公開鍵を変更した場合でも +`set name <ノード名>` で同じ名前を設定し直せば、周囲からは引き続き +同じノードとして認識されます。 + +--- + ## JP LBT実装の概要 | 項目 | 設定値 | 根拠 | From 70484f035c08975e6c153d1c3758479b6e5e39dc Mon Sep 17 00:00:00 2001 From: jirogit Date: Mon, 27 Jul 2026 02:37:20 +0000 Subject: [PATCH 26/51] =?UTF-8?q?docs:=20=E3=83=AA=E3=83=94=E3=83=BC?= =?UTF-8?q?=E3=82=BF=E3=83=BC/=E3=83=AB=E3=83=BC=E3=83=A0=E3=82=B5?= =?UTF-8?q?=E3=83=BC=E3=83=90=E3=83=BC=E3=81=AE=E8=A8=AD=E5=AE=9A=E3=83=90?= =?UTF-8?q?=E3=83=83=E3=82=AF=E3=82=A2=E3=83=83=E3=83=97=E3=83=BB=E5=85=AC?= =?UTF-8?q?=E9=96=8B=E9=8D=B5seed=E4=BF=9D=E5=AD=98=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E8=A8=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README_JP.md | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/README_JP.md b/README_JP.md index 341176ac29..2467d4f957 100644 --- a/README_JP.md +++ b/README_JP.md @@ -186,7 +186,7 @@ WisMesh Tagの日本向け技適取得状況は現時点で確認できていま ### 技適対象外:実験試験局 or 特例制度 -本ファームウェアで使われる無線機のうち、Wio-SX1262搭載機とT1000-Eは、メーカーから条件付きで技適の有効性が確認できています(それぞれ送信出力・アンテナ構成の条件あり。詳細は上記の各機種の項を参照)。それ以外の無線機は、2026年7月時点でどれも技適を通っていません(Meshtasticには技適済み機種がありますが別物です)。技適の対象外となる機種で日本国内で電波を発射する場合は、次のいずれかの手続きが必要だと思われます(開発は米国で行っているので、ちょっと自信がないです、すいません)。 +本ファームウェアで使われる無線機のうち、Wio-SX1262搭載機とT1000-Eは、メーカーから条件付きで技適の有効性が確認できています(それぞれ送信出力・アンテナ構成の条件あり。詳細は上記の各機種の項を参照)。それ以外の無線機は、2026年7月時点でどれも技適を通っていません。技適の対象外となる機種で日本国内で電波を発射する場合は、次のいずれかの手続きが必要だと思われます(開発は米国で行っているので、ちょっと自信がないです、すいません)。 **おすすめ:特例制度(届出のみ・180日)** @@ -237,11 +237,15 @@ set txpower 10 ``` スマホアプリの **Export Config / Import Config** 機能で秘密鍵・連絡先・ -チャンネルをまとめてバックアップ・復元できますが(コンパニオンラジオのみ、 -リピーター/ルームサーバーには非対応)、**Import Configは古いTX出力設定も +チャンネルをまとめてバックアップ・復元できます。**Import Configは古いTX出力設定も そのまま復元してしまう**ため、Import Config後もTX出力の再確認・再設定が 必要です。バックアップ・復元があっても手動確認は省略できません。 +> 💡 **リピーター/ルームサーバーでもExport Configは使えます。** リピーター/ +> ルームサーバーはコンパニオンラジオチャットクライアントと同じ設定ファイルを +> 使用しているため、コンパニオンラジオチャットクライアントをインストールし、 +> そのクライアントにあるExport Config機能を使ってバックアップを保存できます。 + ### イレースについて(任意・通常のアップグレードには不要) 設定が壊れた場合などにクリーンな状態からやり直したい場合のみ、以下の方法が @@ -258,9 +262,9 @@ flasher.meshcore.ioでは単体イレースができません("Flash"ボタン "Erase"チェックボックスがあるのみで、書き込みと同時にイレースする形に なります)。手動での設定確認・更新(上記)で対応することを推奨します。 -> ⚠️ **リピーター/ルームサーバーはExport Config相当の機能がないため、 -> イレースするとアイデンティティ(秘密鍵)が失われ、復元できません。** -> 既存のメッシュ参加者からは「別ノード」として認識されます。 +> ⚠️ **イレース前に上記のExport Config(コンパニオンラジオチャットクライアント経由)で +> バックアップを取っておかないと、アイデンティティ(秘密鍵)が失われ、復元できません。** +> バックアップなしでイレースすると、既存のメッシュ参加デバイスからは「別ノード」として認識されます。 ### 公開鍵とノード名について @@ -270,8 +274,14 @@ flasher.meshcore.ioでは単体イレースができません("Flash"ボタン 一方、**ノード名は同じものを使い続けることを推奨します。** 近隣の利用者は 公開鍵ではなくノード名でノードを認識するため、公開鍵を変更した場合でも -`set name <ノード名>` で同じ名前を設定し直せば、周囲からは引き続き -同じノードとして認識されます。 +`set name <ノード名>` などで同じ名前を設定し直せば、周囲の利用者からは +引き続き同じノードとして認識されます。 + +リピーター/ルームサーバーには、公開鍵の先頭1バイト(16進数2文字)を +指定して新しいアイデンティティを生成する機能もあります。この際に生成される +**seed** をテキストで保存しておけば、同じseedから同じ公開鍵を何度でも +再生成できます。イレースなどでアイデンティティが失われた場合の復元手段として +活用できます。 --- From 5de8fbc5e347540f058e705b6465c2646db767a6 Mon Sep 17 00:00:00 2001 From: me Date: Sun, 26 Jul 2026 23:43:05 -0700 Subject: [PATCH 27/51] docs: cite ARIB STD-T108 v1.5 and underlying notification for LBT spec table --- README_JP.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README_JP.md b/README_JP.md index 341176ac29..c7fe44334f 100644 --- a/README_JP.md +++ b/README_JP.md @@ -290,8 +290,9 @@ flasher.meshcore.ioでは単体イレースができません("Flash"ボタン > **📡 注意:** 本実装はチャネルが空いていることを確認してから送信します(Listen Before Talk)。 > 周囲に強い電波干渉がある環境では、送信の遅延や困難が生じる場合があります。 -> これは仕様であり、ARIB STD-T108への準拠によるものです。詳しくは [Issue #2079](https://github.com/meshcore-dev/MeshCore/issues/2079) を参照してください。 +> バックオフの長さや、ジッターは私が調整、追加したものですが、それ以外の仕様は、ARIB STD-T108への準拠によるものです。詳しくは [Issue #2079](https://github.com/meshcore-dev/MeshCore/issues/2079) を参照してください。 +> 参考にした物:[ARIB STD-T108 v1.5](https://www.arib.or.jp/english/html/overview/doc/5-STD-T108v1_5-E1.pdf)(英訳、参考資料)。法的根拠としては[平成元年郵政省告示第49号](https://www.tele.soumu.go.jp/horei/law_honbun/72138100.html)(日本語原文)。内容に差がある場合は告示(日本語原文)を優先したつもりです。 --- ## ライセンス From b2dcad2bc292cfbee661e34854338ea512465d42 Mon Sep 17 00:00:00 2001 From: me Date: Mon, 27 Jul 2026 11:34:04 -0700 Subject: [PATCH 28/51] =?UTF-8?q?feat:=20ARIB=20STD-T108=E6=BA=96=E6=8B=A0?= =?UTF-8?q?=E3=80=81=E5=8D=98=E4=B8=80=E9=80=81=E4=BF=A14=E7=A7=92?= =?UTF-8?q?=E8=B6=85=E9=81=8E=E6=99=82=E3=81=ABdrop=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=82=AC=E3=83=BC=E3=83=89=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit isAS923_1_JP()時、checkSend()で送信前にgetEstAirtimeFor()を確認し、 getMaxTxAirtimeMs()(JP=4000ms)を超える場合は送信せずdrop。 n_tx_dropped_airtimeカウンターで追跡。 実機テスト(T1000-E)で確認済み: - 閾値500msでの強制drop連続17回以上でクラッシュ/リーク無し(ACK含む) - 閾値4000msに戻して通常のDM/チャンネルメッセージ送受信・ACK正常動作確認 --- src/Dispatcher.cpp | 17 ++++++++++++++++- src/Dispatcher.h | 5 +++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/Dispatcher.cpp b/src/Dispatcher.cpp index 4ac78a1f5c..d2e6f266c3 100644 --- a/src/Dispatcher.cpp +++ b/src/Dispatcher.cpp @@ -64,6 +64,11 @@ uint32_t Dispatcher::getCADFailMaxDuration() const { return 4000; // 4 seconds } +uint32_t Dispatcher::getMaxTxAirtimeMs() const { + if (_radio->isAS923_1_JP()) return 4000; // ARIB STD-T108: single transmission must be <=4s + return UINT32_MAX; // no limit for other regions +} + void Dispatcher::loop() { if (millisHasNowPassed(next_floor_calib_time)) { _radio->triggerNoiseFloorCalibrate(getInterferenceThreshold()); @@ -325,6 +330,16 @@ void Dispatcher::checkSend() { } else { memcpy(&raw[len], outbound->payload, outbound->payload_len); len += outbound->payload_len; + uint32_t send_airtime = _radio->getEstAirtimeFor(len); + if (send_airtime > getMaxTxAirtimeMs()) { + MESH_DEBUG_PRINTLN("%s Dispatcher::checkSend(): DROPPED, airtime %dms exceeds limit", getLogDateTime(), send_airtime); + n_tx_dropped_airtime++; + logTxFail(outbound, len); + releasePacket(outbound); + outbound = NULL; + return; + } + uint32_t max_airtime = _radio->getEstAirtimeFor(len)*3/2; outbound_start = _ms->getMillis(); bool success = _radio->startSendRaw(raw, len); @@ -388,4 +403,4 @@ unsigned long Dispatcher::futureMillis(int millis_from_now) const { return _ms->getMillis() + millis_from_now; } -} \ No newline at end of file +} diff --git a/src/Dispatcher.h b/src/Dispatcher.h index e4f2d4a537..192f1e3d62 100644 --- a/src/Dispatcher.h +++ b/src/Dispatcher.h @@ -130,6 +130,7 @@ class Dispatcher { bool prev_isrecv_mode; uint32_t n_sent_flood, n_sent_direct; uint32_t n_recv_flood, n_recv_direct; + uint32_t n_tx_dropped_airtime; // packets dropped: would exceed getMaxTxAirtimeMs() unsigned long tx_budget_ms; unsigned long last_budget_update; unsigned long duty_cycle_window_ms; @@ -157,6 +158,7 @@ class Dispatcher { tx_budget_ms = 0; last_budget_update = 0; duty_cycle_window_ms = 3600000; + n_tx_dropped_airtime = 0; } virtual DispatcherAction onRecvPacket(Packet* pkt) = 0; @@ -172,6 +174,7 @@ class Dispatcher { virtual int calcRxDelay(float score, uint32_t air_time) const; virtual uint32_t getCADFailRetryDelay() const; virtual uint32_t getCADFailMaxDuration() const; + virtual uint32_t getMaxTxAirtimeMs() const; // single-transmission airtime cap (JP: 4000ms per ARIB STD-T108) virtual int getInterferenceThreshold() const { return 0; } // disabled by default virtual bool getCADEnabled() const { return false; } // hardware CAD disabled by default virtual int getAGCResetInterval() const { return 0; } // disabled by default @@ -192,8 +195,10 @@ class Dispatcher { uint32_t getNumSentDirect() const { return n_sent_direct; } uint32_t getNumRecvFlood() const { return n_recv_flood; } uint32_t getNumRecvDirect() const { return n_recv_direct; } + uint32_t getNumTxDroppedAirtime() const { return n_tx_dropped_airtime; } void resetStats() { n_sent_flood = n_sent_direct = n_recv_flood = n_recv_direct = 0; + n_tx_dropped_airtime = 0; _err_flags = 0; } From 846b63f78061aafc28a7924c4ebb87a59cb369cf Mon Sep 17 00:00:00 2001 From: me Date: Mon, 27 Jul 2026 21:58:07 -0700 Subject: [PATCH 29/51] =?UTF-8?q?Add=20QUICKSTART=5FJP.md:=204=E6=A9=9F?= =?UTF-8?q?=E7=A8=AE=E9=99=90=E5=AE=9A=E3=81=AE=E6=9C=80=E7=9F=AD=E5=B0=8E?= =?UTF-8?q?=E5=85=A5=E3=82=AC=E3=82=A4=E3=83=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- QUICKSTART_JP.md | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 QUICKSTART_JP.md diff --git a/QUICKSTART_JP.md b/QUICKSTART_JP.md new file mode 100644 index 0000000000..869accb8ad --- /dev/null +++ b/QUICKSTART_JP.md @@ -0,0 +1,58 @@ +# MeshCore JP クイックスタート + +このガイドは、メーカーに「ファームウェアを書き換えても技適の証明範囲内」と +確認が取れている **4機種** に限定して、購入からコンパニオンアプリ接続までを +最短で説明します。技適・電波法の詳しい話は [README_JP.md](./README_JP.md) を参照してください。 + +**アンテナは、本体に最初からついているもの(付属アンテナ)を使います。** +市販の高利得アンテナに交換すると、技適の証明範囲(送信出力の上限)を超えてしまう +可能性があります。付属アンテナのままなら問題ありません。 + +(アンテナを変更したい場合は、メーカーの技適証明書に記載された条件等を自分で確認する必要があります。クイックスタートでは「付属アンテナのみ」とします。) + +## 対応4機種 + +| # | 機種 | 送信出力設定 | +|---|------|------------| +| 1 | Wio Tracker L1 Pro | 10dBm | +| 2 | XIAO nRF52840 + Wio-SX1262 | 10dBm | +| 3 | XIAO ESP32S3 + Wio-SX1262 | 10dBm | +| 4 | T1000-E | 12dBm | + +## 手順 + +### JP版ファームウェアを書き込む + +1. [jirogit/MeshCore Releases](https://github.com/jirogit/MeshCore/releases) から最新の `jp-v*` リリースを開く +2. お使いの機種に対応するファイルをダウンロードする + +WioTrackerL1_companion_radio_ble-*.uf2 +t1000e_companion_radio_ble-*.uf2 +Xiao_nrf52_companion_radio_ble-*.uf2 + + + +3. 機種ごとの書き込み手順: + +**T1000-E** +- ボタンを押しながら磁石ケーブルを素早く2回接続する +- 「T1000-E」という名前のドライブがPCに表示されたら、ダウンロードしたファイルをそこにコピーする + + + +### 3. コンパニオンアプリをインストールする + + + +### 4. 接続する + + + +--- + +もっと詳しい技術的背景(技適の考え方、LBT仕様など)が知りたい方は +[README_JP.md](./README_JP.md) をご覧ください。 + From 89ec259a91a1607bbabb2356deee1fc85abc02ff Mon Sep 17 00:00:00 2001 From: me Date: Mon, 27 Jul 2026 22:00:46 -0700 Subject: [PATCH 30/51] =?UTF-8?q?README=5FJP.md=E5=86=92=E9=A0=AD=E3=81=AB?= =?UTF-8?q?QUICKSTART=5FJP=E3=81=B8=E3=81=AE=E3=83=AA=E3=83=B3=E3=82=AF?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README_JP.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README_JP.md b/README_JP.md index 1740542dac..69524173e6 100644 --- a/README_JP.md +++ b/README_JP.md @@ -7,6 +7,10 @@ --- +👉 まずはこれだけ読めば始められます: [QUICKSTART_JP.md](./QUICKSTART_JP.md) + +--- + ## 📥 ファームウェアのダウンロードと書き込み ### 最新リリース → [Releases ページ](https://github.com/jirogit/MeshCore/releases/latest) From d9542e028fe4843b168445b2788fc0007d2f8c9d Mon Sep 17 00:00:00 2001 From: me Date: Mon, 27 Jul 2026 22:06:22 -0700 Subject: [PATCH 31/51] =?UTF-8?q?QUICKSTART=5FJP.md:=20=E6=A9=9F=E7=A8=AE?= =?UTF-8?q?=E5=88=A5=E6=9B=B8=E3=81=8D=E8=BE=BC=E3=81=BF=E6=89=8B=E9=A0=86?= =?UTF-8?q?=E3=83=BB=E6=8E=A5=E7=B6=9A=E3=83=BBDM=E9=80=81=E4=BF=A1?= =?UTF-8?q?=E3=81=BE=E3=81=A7=E3=82=92=E8=BF=BD=E8=A8=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- QUICKSTART_JP.md | 94 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 78 insertions(+), 16 deletions(-) diff --git a/QUICKSTART_JP.md b/QUICKSTART_JP.md index 869accb8ad..5898d91a81 100644 --- a/QUICKSTART_JP.md +++ b/QUICKSTART_JP.md @@ -26,30 +26,92 @@ 1. [jirogit/MeshCore Releases](https://github.com/jirogit/MeshCore/releases) から最新の `jp-v*` リリースを開く 2. お使いの機種に対応するファイルをダウンロードする +NRF52系 WioTrackerL1_companion_radio_ble-*.uf2 t1000e_companion_radio_ble-*.uf2 Xiao_nrf52_companion_radio_ble-*.uf2 - +ESP32系 +Xiao_S3_WIO_companion_radio_ble-*-merged.bin 3. 機種ごとの書き込み手順: -**T1000-E** -- ボタンを押しながら磁石ケーブルを素早く2回接続する -- 「T1000-E」という名前のドライブがPCに表示されたら、ダウンロードしたファイルをそこにコピーする - - - -### 3. コンパニオンアプリをインストールする +**Wio Tracker L1 Pro** +- ファイル WioTrackerL1_companion_radio_ble-*.uf2 を、PCにダウンロードしておく。 +- USB CケーブルでPCと接続する。 +- USBポートのすぐ横の、本体側面のリセットボタンとスライド電源スイッチが有るのをしっかり確認する。 +- このリセットボタンを2回すばやく押す。 +- 電源スライドスイッチとUSBポートの間にある、オレンジ色のLEDが、約1秒毎にゆっくり点灯したり、消灯したりするのを確認する。 +- 「TRACKER L1」という名前のドライブがPCに表示されたら、ダウンロードしたファイル WioTrackerL1_companion_radio_ble-*.uf2 を、そこへコピーする。 +- コピーが完了すると、自動的に再起動する。インストール終了。 - - -### 4. 接続する - - +**T1000-E** +- ファイル t1000e_companion_radio_ble-*.uf2 を、PCにダウンロードしておく。 +- まず磁石ケーブルを分離する。 +- ボタンを押しながら磁石ケーブルを素早く、接続、分離、接続する。 +- 緑のLEDが点灯したままになるのを確認する。 +- ボタンから指を離す。 +- 「T1000-E」という名前のドライブがPCに表示されたら、ダウンロードしたファイル t1000e_companion_radio_ble-*.uf2 を、そこへコピーする。 +- コピーが完了すると、自動的に再起動する。インストール終了。 + +**XIAO nRF52840+Wio-SX1262** +- ファイル Xiao_nrf52_companion_radio_ble-*.uf2 を、PCにダウンロードしておく。 +- USB CケーブルでPCと接続する。 +- USBポートのすぐ横にある、「RST」とすぐ側に書いてある、とても小さな、まるでハンダ付けのような銀色部分の中央に、直径1ミリくらいの黒い点の有るリセットボタンが有るのをしっかり確認する。USBボートの反対側には「USR」と書いてあるユーザーボタンに見えそうな存在があるが、残念ながらこれはボタンではない。 +- このリセットボタンを2回すばやく押す。 +- 「XIAO-SENSE」という名前のドライブがPCに表示されたら、ダウンロードしたファイル Xiao_nrf52_companion_radio_ble-*.uf2 を、そこへコピーする。 +- コピーが完了すると、自動的に再起動する。インストール終了。 + +**XIAO ESP32S3+Wio-SX1262** +- ファイル Xiao_S3_WIO_companion_radio_ble-*-merged.bin を、PCにダウンロードしておく。 +- モジュールをしっかり観察して、1階と2階が端の部分にある黒い細長い四角い部分でつながっているのを確認する。 +- やさしくじわじわと、前後左右にほんの少しづつ動かして、1階と2階部分を分離する。 +- USB Cケーブルをモジュール側に接続する。PCとはまだ接続しない。 +- USBポートのすぐ横にある、とても小さな、まるでハンダ付けのような銀色部分の中央に、直径1ミリくらいの黒い点の有るボタンが存在するのをまずしっかり確認する。アンテナ側のボタンがUSRユーザーボタンで、アンテナの反対側に有るのがRSTリセットボタン。 +- このリセットボタンを爪で、5秒以上押し下げたままにする練習を、自信がつくまで繰り返す。 +- リセットボタンを押し下げたまま、USBコネクターを、PCのポートに差し込む。 +- Google Chrome系のウェブブラウザを使用して、[https://meshcore.io/flasher](https://meshcore.io/flasher) を開く。 +- ページの一番下の方に「Custom Firmware」というボタンがあるので、それをクリックする。 +- ダウンロードしたファイル Xiao_S3_WIO_companion_radio_ble-*-merged.bin を開く。 +- 「merged.bin」というファイルは設定ファイなどすべて消去してしまいますよというポップアップのOKボタンを押す。 +- さらに「Erase device」のチェックボックスがあるので、チェックを入れてオンにする。 +- 「Flash」ボタンを押す。 +- シリアルポートを選択するポップアップが出てくるので、「USB JTAG/serial debug ynit (*) - Paired」という名前のシリアルポートを選択して、接続する。 +- コピーが完了すると、自動的に再起動する。インストール終了。 + + +### スマホアプリをスマホにインストールする + +- iPhoneならApp Store、AndroidならPlay Storeへ行ってMeshCoreをインストールする。 + +### 接続する + +- アプリを起動すると、右上にConnectボタンがあるので押す。 +- Meshcore-ではじまるデバイスをクリックする +- Wio Tracker L1 Pro だけはスクリーンがあるので、ランダムなBLEのPin番号が表示される。それ以外のデバイスのPin番号は123456. +- ここで止まってしまうデバイスもあるが、スマホのBLEをオフにして10秒待ち、またオンにする。 + +### LoRa確認 + +- 右上の歯車のようなシンボル「設定」をクリックする +- Redio Settingをしっかり確認する + +920.8 MHz +BW 125.0 kHz +SF 12 +CR 8 +Transmit Power: T1000-eが12dBm それ以外のデバイスは10dBm + +### DMの送り方 + +- 右上の歯車の左横にある、けん玉の頭、もしくはリボンのようなシンボルがあるのでクリックする。 +- Advert・Zero Hopをクリックする +- 付近に同様な、スマホに接続したコンパニオンラジオチャットクライアントがあると、Contactsに、Advert広報したデバイスが追加される。 +- コンタクトに設定によっては、自動では追加されないので、その時は、一番右上、縦に3つの点が並んだシンボルをクリックする。 +- 表示されるメニューの中の「Discover Contacts」をクリックする +- Addボタンを押してContactsに追加する。 +- 反対側のデバイスも、同じことをする。 +- 両側が反対側のデバイスをContactsに登録し終わった後にだけ、相手のContactをクリックしてDMが送れるようになる。相手のデバイスのコンタクトを持っていても、相手のデバイスが自分のデバイスを登録していない場合は、DMが送れない。 --- From 95d3c2685e329ca4125e48ec12f975ca303fefc2 Mon Sep 17 00:00:00 2001 From: me Date: Mon, 27 Jul 2026 22:21:22 -0700 Subject: [PATCH 32/51] QUICKSTART_JP.md: better format for device list --- QUICKSTART_JP.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/QUICKSTART_JP.md b/QUICKSTART_JP.md index 5898d91a81..ac0f5b7072 100644 --- a/QUICKSTART_JP.md +++ b/QUICKSTART_JP.md @@ -24,17 +24,16 @@ ### JP版ファームウェアを書き込む 1. [jirogit/MeshCore Releases](https://github.com/jirogit/MeshCore/releases) から最新の `jp-v*` リリースを開く -2. お使いの機種に対応するファイルをダウンロードする -NRF52系 -WioTrackerL1_companion_radio_ble-*.uf2 -t1000e_companion_radio_ble-*.uf2 -Xiao_nrf52_companion_radio_ble-*.uf2 +- NRF52系 +- WioTrackerL1_companion_radio_ble-*.uf2 +- t1000e_companion_radio_ble-*.uf2 +- Xiao_nrf52_companion_radio_ble-*.uf2 -ESP32系 -Xiao_S3_WIO_companion_radio_ble-*-merged.bin +- ESP32系 +- Xiao_S3_WIO_companion_radio_ble-*-merged.bin -3. 機種ごとの書き込み手順: +2. 機種ごとの書き込み手順: **Wio Tracker L1 Pro** - ファイル WioTrackerL1_companion_radio_ble-*.uf2 を、PCにダウンロードしておく。 From ad98d4ad76b7c7409442d97a53761858951f60a6 Mon Sep 17 00:00:00 2001 From: me Date: Mon, 27 Jul 2026 23:01:48 -0700 Subject: [PATCH 33/51] =?UTF-8?q?QUICKSTART=5FJP.md:=20=E3=82=BF=E3=82=A4?= =?UTF-8?q?=E3=83=9D=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- QUICKSTART_JP.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/QUICKSTART_JP.md b/QUICKSTART_JP.md index ac0f5b7072..41c1245115 100644 --- a/QUICKSTART_JP.md +++ b/QUICKSTART_JP.md @@ -75,7 +75,7 @@ - 「merged.bin」というファイルは設定ファイなどすべて消去してしまいますよというポップアップのOKボタンを押す。 - さらに「Erase device」のチェックボックスがあるので、チェックを入れてオンにする。 - 「Flash」ボタンを押す。 -- シリアルポートを選択するポップアップが出てくるので、「USB JTAG/serial debug ynit (*) - Paired」という名前のシリアルポートを選択して、接続する。 +- シリアルポートを選択するポップアップが出てくるので、「USB JTAG/serial debug unit (*) - Paired」という名前のシリアルポートを選択して、接続する。 - コピーが完了すると、自動的に再起動する。インストール終了。 @@ -106,7 +106,7 @@ Transmit Power: T1000-eが12dBm それ以外のデバイスは10dBm - 右上の歯車の左横にある、けん玉の頭、もしくはリボンのようなシンボルがあるのでクリックする。 - Advert・Zero Hopをクリックする - 付近に同様な、スマホに接続したコンパニオンラジオチャットクライアントがあると、Contactsに、Advert広報したデバイスが追加される。 -- コンタクトに設定によっては、自動では追加されないので、その時は、一番右上、縦に3つの点が並んだシンボルをクリックする。 +- コンタクトの設定によっては、自動で追加されないので、その時は、一番右上、縦に3つの点が並んだシンボルをクリックする。 - 表示されるメニューの中の「Discover Contacts」をクリックする - Addボタンを押してContactsに追加する。 - 反対側のデバイスも、同じことをする。 From cc07e2da0f2c2a1dd4db063d0396de7a7de9dec3 Mon Sep 17 00:00:00 2001 From: jirogit Date: Wed, 29 Jul 2026 23:24:18 -0700 Subject: [PATCH 34/51] jp-release: switch default to SF10/CR4:6 (breaking change, v1.8.0) --- .github/workflows/jp-release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/jp-release.yml b/.github/workflows/jp-release.yml index 35d99e55e0..aece1500b3 100644 --- a/.github/workflows/jp-release.yml +++ b/.github/workflows/jp-release.yml @@ -27,8 +27,8 @@ jobs: -w -DNDEBUG -DRADIOLIB_STATIC_ONLY=1 -DRADIOLIB_GODMODE=1 -D LORA_FREQ=920.800 -D LORA_BW=125.0 - -D LORA_SF=12 - -D LORA_CR=8 + -D LORA_SF=10 + -D LORA_CR=6 -D ENABLE_ADVERT_ON_BOOT=1 -D ENABLE_PRIVATE_KEY_IMPORT=1 -D ENABLE_PRIVATE_KEY_EXPORT=1 From f97dcbc462a285eb9299bcf6d5e643ce349e6dcc Mon Sep 17 00:00:00 2001 From: jirogit Date: Wed, 29 Jul 2026 23:41:38 -0700 Subject: [PATCH 35/51] radiolib: remove JP-specific MAX_TEXT_LEN override, use default 160B (SF10/CR6 migration) --- src/helpers/radiolib/RadioLibWrappers.h | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/helpers/radiolib/RadioLibWrappers.h b/src/helpers/radiolib/RadioLibWrappers.h index 1d9a5b94c9..ebd3197a82 100644 --- a/src/helpers/radiolib/RadioLibWrappers.h +++ b/src/helpers/radiolib/RadioLibWrappers.h @@ -65,24 +65,6 @@ class RadioLibWrapper : public mesh::Radio { fabsf(freq - 921.200f) < 0.05f); } - int getMaxTextLen() const override { - if (!isAS923_1_JP()) return 10 * 16; // default 160 bytes - uint8_t cr = getCodingRate(); - if (cr <= 5) return 64; // 3874ms @ SF12/BW125/CR4-5 - if (cr == 6) return 48; // 3874ms @ SF12/BW125/CR4-6 - if (cr == 7) return 32; // 3678ms @ SF12/BW125/CR4-7 - return 24; // 3547ms @ SF12/BW125/CR4-8 - } - - int getMaxGroupTextLen() const override { - if (!isAS923_1_JP()) return 10 * 16; // default 160 bytes - uint8_t cr = getCodingRate(); - if (cr <= 5) return 64; // 3710ms @ SF12/BW125/CR4-5 - if (cr == 6) return 48; // 3678ms @ SF12/BW125/CR4-6 - if (cr == 7) return 39; // 3907ms @ SF12/BW125/CR4-7 - return 29; // 3809ms @ SF12/BW125/CR4-8 - } - PacketMillis calcMaxPacketMillis(uint8_t sf, float bw, uint8_t cr, uint8_t preambleSymbols); virtual int16_t performChannelScan(); From 6f24cd0c45edcac60ec8f9727701f27ee4c218ce Mon Sep 17 00:00:00 2001 From: jirogit Date: Thu, 30 Jul 2026 00:17:28 -0700 Subject: [PATCH 36/51] README_JP: update for SF10/CR4:6 migration (jp-v1.8.0) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 送信文字数セクション: CR依存表を削除、本家準拠(160B)に統一 - リピーター初期設定: CR4/8前提のUSB推奨理由・CR4/5推奨を整理 - 無線設定表: SF12→10, CR4/8→4/6 - set txpower 10 手順削除(意図的) - CR4/7案内の廃止に伴う注記削除 --- README_JP.md | 42 +++++------------------------------------- 1 file changed, 5 insertions(+), 37 deletions(-) diff --git a/README_JP.md b/README_JP.md index 69524173e6..901b4f2acb 100644 --- a/README_JP.md +++ b/README_JP.md @@ -27,30 +27,12 @@ --- -### ⚠️ 送信できる文字数について +### ⚠️ 送信できる文字数について(jp-v1.8.0〜) -本ファームウェアはARIB STD-T108準拠のLBT実装により、**送信できるメッセージ長が本家より短くなります**。 - -チャットアプリ側は本家の上限(DM: 150バイト、グループチャット: 139バイト)を表示しますが、**実際に送信できる上限は設定(コーディングレート)によって異なります**。 - -| コーディングレート | DM上限 | グループチャット上限 | 日本語の目安(約3バイト/文字) | -|---|---|---|---| -| CR4/5 | 64バイト | 64バイト | 約21文字 | -| CR4/6 | 48バイト | 48バイト | 約16文字 | -| CR4/7 | 32バイト | 39バイト | 約10〜13文字 | -| CR4/8 | 24バイト | 29バイト | 約8〜9文字 | +jp-v1.8.0でSF10/CR4/6に移行し、JP専用の文字数切り詰めロジックを廃止しました。**送信できるバイト数は本家と同じ(DM150バイト/チャンネルメッセージ147-デバイスに付けた名前のバイト数)で、コーディングレートに依存しません。** コーディングレートは**自分のデバイスだけで設定するもの**で、CRの情報はパケットのヘッダーに含まれるため、ネットワーク内の他のデバイスの設定を変える必要はありません。 -電波ノイズが多い環境(秋葉原など都市部)では **CR4/8 を推奨**します。電波環境が良い場所では CR4/7、CR4/6 なども使えます。数字が小さいほど送れる文字数が増えます。 - -**DMとグループチャットで挙動が異なります:** - -- **DM** — 上限を超えると**エラーになり送信されません**。アプリ側にエラーが表示されます。 -- **グループチャット** — 上限を超えると**超えた部分がサイレントに切り落とされて送信されます**。送信者には通知されません。 - -**グループチャットの追加注意:** ペイロードにはデバイス名が `デバイス名: メッセージ` の形式で含まれます。**デバイス名が長いほど、本文として送れる文字数が少なくなります**。デバイス名は短めに設定することを推奨します。 - --- ## WisMesh Tag (RAKwireless+MOKOSMART / MCU: nRF52840 / Radio: SX1262) の書き込み手順 @@ -98,20 +80,11 @@ PCにUSBドライブとして表示されればOK(ドライブ名は環境に --- -## リピーター / ルームサーバーの初期設定 - -### CR4/8(デフォルト)でのリモート管理について - -日本向け設定(SF12/BW125/CR4/8)では、コンパニオンアプリからLoRa無線経由でリピーターを設定・管理するのは、通信時間が長くなるため、かなり困難です。 -**初期設定は USB 接続を推奨します。** +## リピーター / ルームサーバーの設定 以下のウェブ設定ツールにUSBで接続して設定してください: 👉 https://config.meshcore.io -### CRの設定について - -クライアント・リピーター両方を **CR4/5** に設定することで、LoRa経由のリモート管理が実用的になります。CR4/8のままでは応答が遅くタイムアウトしやすいです。 - ### 初期パスワード リピーター・ルームサーバーの管理者パスワードのデフォルトは `password` です。必ず変更してください。 @@ -217,11 +190,10 @@ WisMesh Tagの日本向け技適取得状況は現時点で確認できていま |---|---|---| | 周波数 | 920.8 MHz | ARIB STD-T108 CH25 | | 帯域幅(BW) | 125 kHz | | -| スプレッディングファクター(SF) | 12 | | -| コーディングレート(CR) | 4/8 | 都市部・ノイズ環境向け推奨 | +| スプレッディングファクター(SF) | 10 | jp-v1.8.0〜 | +| コーディングレート(CR) | 4/6 | jp-v1.8.0〜 | | 送信出力 | ≤ 13 dBm(Wio-SX1262搭載機は ≤ 10 dBm、T1000-Eは ≤ 12 dBm) | ARIB STD-T108 上限/各機種の証明出力に準拠 | -> 電波環境が良好な場所では CR4/7 や CR4/6 も使用できます(送れる文字数が増えます)。 > 周波数を 920.8 / 921.0 / 921.2 MHz のいずれかに設定すると、このファームウェアが自動的に日本モードになります。 --- @@ -236,10 +208,6 @@ TX出力などの設定値は、書き込み後に内部ファイルシステム **技適・法令遵守に関わる設定(TX出力等)は、機種を問わず、ファームウェア更新の 度に手動で確認・更新してください。** -``` -set txpower 10 -``` - スマホアプリの **Export Config / Import Config** 機能で秘密鍵・連絡先・ チャンネルをまとめてバックアップ・復元できます。**Import Configは古いTX出力設定も そのまま復元してしまう**ため、Import Config後もTX出力の再確認・再設定が From 6dfbdf392912373cee12fb314703f8d0d59d9523 Mon Sep 17 00:00:00 2001 From: jirogit Date: Thu, 30 Jul 2026 00:31:08 -0700 Subject: [PATCH 37/51] =?UTF-8?q?QUICKSTART=5FJP:=20update=20SF12=E2=86=92?= =?UTF-8?q?10,=20CR8=E2=86=926=20(jp-v1.8.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- QUICKSTART_JP.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/QUICKSTART_JP.md b/QUICKSTART_JP.md index 41c1245115..e015ec8cff 100644 --- a/QUICKSTART_JP.md +++ b/QUICKSTART_JP.md @@ -97,8 +97,8 @@ 920.8 MHz BW 125.0 kHz -SF 12 -CR 8 +SF 10 +CR 6 Transmit Power: T1000-eが12dBm それ以外のデバイスは10dBm ### DMの送り方 From 85d34c5d115f8614f3972dde39e30c65156217dc Mon Sep 17 00:00:00 2001 From: me Date: Fri, 31 Jul 2026 22:12:36 -0700 Subject: [PATCH 38/51] fix: M5Stack Unit C6L crash loop on boot - SX126X_DIO3_TCXO_VOLTAGE 1.8 -> 3.0 - I2C pins (PIN_BOARD_SDA/SCL) 16/17 -> 10/8 - Add PI4IO OUT_H_IM register write to release Hi-Z on the LoRa control pins (P5/P6/P7), which upstream left unset - Remove P_LORA_TX_LED=15 (ESP32-C6 strapping pin conflict) The TCXO voltage, I2C pins, and PI4IO initialization sequence are adapted from TheRealHaoLiu/MeshCore (main-m5stack-unit-c6l branch), a working M5Burner distribution for this board. Upstream's PI4IO handling in particular never releases the Hi-Z state on these pins, so writes to OUT_SET had no effect on the physical pins. This combination of changes resolves a repeatable crash where the USB serial port cycled connect/disconnect continuously on boot. Fixes present/absent USB port cycling reported in #2229. --- variants/m5stack_unit_c6l/UnitC6LBoard.h | 86 +++++++++++++++++++++++- variants/m5stack_unit_c6l/platformio.ini | 8 +-- 2 files changed, 89 insertions(+), 5 deletions(-) diff --git a/variants/m5stack_unit_c6l/UnitC6LBoard.h b/variants/m5stack_unit_c6l/UnitC6LBoard.h index a4ea3ee6e5..c710634fea 100644 --- a/variants/m5stack_unit_c6l/UnitC6LBoard.h +++ b/variants/m5stack_unit_c6l/UnitC6LBoard.h @@ -1,12 +1,96 @@ #pragma once #include +#include #include +#define PI4IO_ADDR 0x43 + +// PI4IO registers +#define PI4IO_REG_CHIP_RESET 0x01 +#define PI4IO_REG_IO_DIR 0x03 +#define PI4IO_REG_OUT_SET 0x05 +#define PI4IO_REG_OUT_H_IM 0x07 +#define PI4IO_REG_IN_DEF_STA 0x09 +#define PI4IO_REG_PULL_EN 0x0B +#define PI4IO_REG_PULL_SEL 0x0D +#define PI4IO_REG_IRQ_STA 0x13 +#define PI4IO_REG_INT_MASK 0x11 + class UnitC6LBoard : public ESP32Board { +private: + bool i2c_write_byte(uint8_t addr, uint8_t reg, uint8_t value) { + Wire.beginTransmission(addr); + Wire.write(reg); + Wire.write(value); + return Wire.endTransmission() == 0; + } + + bool i2c_read_byte(uint8_t addr, uint8_t reg, uint8_t *value) { + Wire.beginTransmission(addr); + Wire.write(reg); + if (Wire.endTransmission() != 0) return false; + if (Wire.requestFrom(addr, (uint8_t)1) != 1) return false; + if (!Wire.available()) return false; + *value = Wire.read(); + return true; + } + + // P0=button, P1=unused input, P5=LNA_EN, P6=ANT_SW, P7=NRST(LoRa reset) + void resetLoRaViaPI4IO() { + uint8_t in_data; + + // Reset the I/O expander to a known state + i2c_write_byte(PI4IO_ADDR, PI4IO_REG_CHIP_RESET, 0xFF); + delay(10); + i2c_read_byte(PI4IO_ADDR, PI4IO_REG_CHIP_RESET, &in_data); + delay(10); + + // Set P5, P6, P7 as outputs (0: input, 1: output) + i2c_write_byte(PI4IO_ADDR, PI4IO_REG_IO_DIR, 0b11100000); + delay(10); + + // Disable output high-impedance (i.e. enable the output driver) for + // every pin actually wired on this board: P0, P1, P5, P6, P7. + // Without this, IO_DIR + OUT_SET have no effect on the physical pin — + // it stays in the power-on Hi-Z state, so NRST never actually toggles. + i2c_write_byte(PI4IO_ADDR, PI4IO_REG_OUT_H_IM, 0b00011100); + delay(10); + + // Pull up/down select (0: down, 1: up) + i2c_write_byte(PI4IO_ADDR, PI4IO_REG_PULL_SEL, 0b11100011); + delay(10); + + // Pull up/down enable (0: disable, 1: enable) + i2c_write_byte(PI4IO_ADDR, PI4IO_REG_PULL_EN, 0b11100011); + delay(10); + + // Default input state for P0, P1 (buttons) + i2c_write_byte(PI4IO_ADDR, PI4IO_REG_IN_DEF_STA, 0b00000011); + delay(10); + + // Enable interrupts for P0, P1 (0: enable, 1: disable) + i2c_write_byte(PI4IO_ADDR, PI4IO_REG_INT_MASK, 0b11111100); + delay(10); + + // Set P7 (NRST) high, P5/P6 will be set after + i2c_write_byte(PI4IO_ADDR, PI4IO_REG_OUT_SET, 0b10000000); + delay(10); + + // Clear IRQ status + i2c_read_byte(PI4IO_ADDR, PI4IO_REG_IRQ_STA, &in_data); + + // Enable RF switch (P6 high) and LNA (P5 high) + i2c_read_byte(PI4IO_ADDR, PI4IO_REG_OUT_SET, &in_data); + in_data |= (1 << 6); // P6 = RF Switch = HIGH + in_data |= (1 << 5); // P5 = LNA Enable = HIGH + i2c_write_byte(PI4IO_ADDR, PI4IO_REG_OUT_SET, in_data); + } + public: void begin() { - ESP32Board::begin(); + ESP32Board::begin(); // already calls Wire.begin(PIN_BOARD_SDA, PIN_BOARD_SCL) + resetLoRaViaPI4IO(); } const char* getManufacturerName() const override { diff --git a/variants/m5stack_unit_c6l/platformio.ini b/variants/m5stack_unit_c6l/platformio.ini index 94083eb486..014ab13733 100644 --- a/variants/m5stack_unit_c6l/platformio.ini +++ b/variants/m5stack_unit_c6l/platformio.ini @@ -6,7 +6,7 @@ build_flags = ${esp32c6_base.build_flags} ${sensor_base.build_flags} -I variants/m5stack_unit_c6l - -D P_LORA_TX_LED=15 +; -D P_LORA_TX_LED=15 -D P_LORA_SCLK=20 -D P_LORA_MISO=22 -D P_LORA_MOSI=21 @@ -15,11 +15,11 @@ build_flags = -D P_LORA_BUSY=19 -D P_LORA_RESET=-1 -D PIN_BUZZER=11 - -D PIN_BOARD_SDA=16 - -D PIN_BOARD_SCL=17 + -D PIN_BOARD_SDA=10 + -D PIN_BOARD_SCL=8 -D SX126X_RXEN=5 -D SX126X_DIO2_AS_RF_SWITCH=true - -D SX126X_DIO3_TCXO_VOLTAGE=1.8 + -D SX126X_DIO3_TCXO_VOLTAGE=3.0 -D SX126X_CURRENT_LIMIT=140 -D SX126X_RX_BOOSTED_GAIN=1 -D USE_SX1262 From a7ff15e13a067e0d306af5a9e8b51c16b3d8c252 Mon Sep 17 00:00:00 2001 From: me Date: Fri, 31 Jul 2026 23:24:02 -0700 Subject: [PATCH 39/51] docs(jp-release): update M5Stack Unit C6L release note status C6L's present/absent USB crash loop (upstream #2229) is fixed and hardware-verified as of the PI4IO/TCXO/I2C fix merged in dev. Move it out of the "CI build only, unverified" group in the release notes template; Wio Tracker L1 Pro and T-DECK remain unverified. --- .github/workflows/jp-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/jp-release.yml b/.github/workflows/jp-release.yml index aece1500b3..2d353d3dd0 100644 --- a/.github/workflows/jp-release.yml +++ b/.github/workflows/jp-release.yml @@ -152,7 +152,7 @@ jobs: | M5Stack Unit C6L | `M5Stack_Unit_C6L_companion_radio_ble-*-merged.bin` | esptool書き込み | | T-DECK | `LilyGo_TDeck_companion_radio_ble-*-merged.bin` | esptool書き込み | - > ⚠️ Wio Tracker L1 Pro / M5Stack Unit C6L / T-DECK はCIビルド確認のみで、実機での動作検証はまだです。特にM5Stack Unit C6Lは既知の不具合報告(upstream #2229)が未解決の可能性があります。動作報告歓迎します。 + > ⚠️ Wio Tracker L1 Pro / T-DECK はCIビルド確認のみで、実機での動作検証はまだです。動作報告歓迎します。M5Stack Unit C6Lは起動時クラッシュループ(upstream #2229)を修正し、実機での動作を確認済みです。 以上の表に載っていないデバイスや、リピーター、ルームサーバーもリリースしていますが、実験的です。 From ad6983fab4dbdff994497a46b6822309c51d2ea9 Mon Sep 17 00:00:00 2001 From: me Date: Fri, 31 Jul 2026 23:33:49 -0700 Subject: [PATCH 40/51] docs(jp-release): fix stale SF12/CR8 recommendation in release notes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The "日本での運用設定" section still told users to set SF12/CR8, left over from before the SF10/CR6 migration in jp-v1.8.0 (cc07e2da). QUICKSTART_JP.md already got the equivalent fix in 6dfbdf39; this brings the release notes template in line with it. --- .github/workflows/jp-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/jp-release.yml b/.github/workflows/jp-release.yml index 2d353d3dd0..f4d0cc77e2 100644 --- a/.github/workflows/jp-release.yml +++ b/.github/workflows/jp-release.yml @@ -160,7 +160,7 @@ jobs: フラッシュ後、スマホアプリで以下を確認してください: - 周波数: `920.8 MHz` - TX出力: `13 dBm以下`(XIAO nRF52840/XIAO ESP32S3+Wio-SX1262/Wio Tracker L1 Proは`10 dBm以下`、T1000-Eは`12 dBm以下`) - - BW: `125 kHz` / SF: `12` / CR: `4/8`(都市部推奨) + - BW: `125 kHz` / SF: `10` / CR: `4/6` > ℹ️ Wio-SX1262搭載機(XIAO nRF52840/ESP32S3+Wio-SX1262、Wio Tracker L1 Pro)はモジュール単体で技適取得済み(工事設計認証201-250230、Seeed社確認済み・書面回答2026/7/20)。ただし証明出力は10dBmのみのため、本ビルドは当該機種のTX出力のデフォルトを10dBmに設定しています。アンテナは付属の低利得アンテナ(FPCまたはSpring)を使用してください。試験報告書に記載されている8dBiのダイポール型アンテナは、10dBm設定ではEIRP超過のため使用不可です。 > From f8e2f7589df6d89afee61b1e737d6757d383b08a Mon Sep 17 00:00:00 2001 From: me Date: Sat, 1 Aug 2026 15:17:13 -0700 Subject: [PATCH 41/51] feat(c6l): add companion_radio_wifi env --- variants/m5stack_unit_c6l/platformio.ini | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/variants/m5stack_unit_c6l/platformio.ini b/variants/m5stack_unit_c6l/platformio.ini index 014ab13733..7cc9e792ea 100644 --- a/variants/m5stack_unit_c6l/platformio.ini +++ b/variants/m5stack_unit_c6l/platformio.ini @@ -106,6 +106,24 @@ lib_deps = densaugeo/base64 @ ~1.4.0 end2endzone/NonBlockingRTTTL@^1.3.0 +[env:M5Stack_Unit_C6L_companion_radio_wifi] +extends = M5Stack_Unit_C6L +build_flags = ${M5Stack_Unit_C6L.build_flags} + -D MAX_CONTACTS=350 + -D MAX_GROUP_CHANNELS=40 + -D OFFLINE_QUEUE_SIZE=256 + -D WIFI_SSID='"myssid"' + -D WIFI_PWD='"mypwd"' + -D TCP_PORT=5000 +build_src_filter = ${M5Stack_Unit_C6L.build_src_filter} + + + - + +<../examples/companion_radio/*.cpp> +lib_deps = + ${M5Stack_Unit_C6L.lib_deps} + densaugeo/base64 @ ~1.4.0 + end2endzone/NonBlockingRTTTL@^1.3.0 + [env:M5Stack_Unit_C6L_kiss_modem] extends = M5Stack_Unit_C6L build_src_filter = ${M5Stack_Unit_C6L.build_src_filter} From 8ee08c1209dbefd7f543b9774dcba871a3ee854b Mon Sep 17 00:00:00 2001 From: me Date: Sat, 1 Aug 2026 22:20:20 -0700 Subject: [PATCH 42/51] fix: M5Stack Unit C6L merged.bin fails to boot (flash_mode qio->dio) Board manifest for esp32-c6-devkitm-1 defaults build.flash_mode to qio, which this module's flash chip does not support -- causes a boot crash-loop (repeated USB-Serial-JTAG reconnects) on real hardware. Override with board_build.flash_mode = dio in the common M5Stack_Unit_C6L section so it applies to all envs (ble/usb/repeater/room_server). --- variants/m5stack_unit_c6l/platformio.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/variants/m5stack_unit_c6l/platformio.ini b/variants/m5stack_unit_c6l/platformio.ini index 014ab13733..98bd616e38 100644 --- a/variants/m5stack_unit_c6l/platformio.ini +++ b/variants/m5stack_unit_c6l/platformio.ini @@ -2,6 +2,7 @@ extends = esp32c6_base board = esp32-c6-devkitm-1 board_build.partitions = min_spiffs.csv ; get around 4mb flash limit +board_build.flash_mode = dio ; board manifest defaults to qio, which causes a boot crash-loop on this module build_flags = ${esp32c6_base.build_flags} ${sensor_base.build_flags} From 69b8b524df81837214ac1cd8575da74037c280f7 Mon Sep 17 00:00:00 2001 From: me Date: Sat, 1 Aug 2026 22:28:48 -0700 Subject: [PATCH 43/51] docs(jp-release): correct M5Stack Unit C6L crash-loop root cause note Root cause was flash_mode=QIO (unsupported by this module's flash chip), not the PI4IO/TCXO/TX_LED items from the earlier fix -- update the release note to reflect the actual fix (flash_mode header changed to DIO). --- .github/workflows/jp-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/jp-release.yml b/.github/workflows/jp-release.yml index f4d0cc77e2..42a8f735d8 100644 --- a/.github/workflows/jp-release.yml +++ b/.github/workflows/jp-release.yml @@ -152,7 +152,7 @@ jobs: | M5Stack Unit C6L | `M5Stack_Unit_C6L_companion_radio_ble-*-merged.bin` | esptool書き込み | | T-DECK | `LilyGo_TDeck_companion_radio_ble-*-merged.bin` | esptool書き込み | - > ⚠️ Wio Tracker L1 Pro / T-DECK はCIビルド確認のみで、実機での動作検証はまだです。動作報告歓迎します。M5Stack Unit C6Lは起動時クラッシュループ(upstream #2229)を修正し、実機での動作を確認済みです。 + > ⚠️ Wio Tracker L1 Pro / T-DECK はCIビルド確認のみです。動作報告歓迎します。M5Stack Unit C6Lは起動時クラッシュループの原因を特定・修正しました(実機はflash_mode=QIO非対応、配布バイナリのヘッダをDIOに変更)。実機での動作を確認済みです。 以上の表に載っていないデバイスや、リピーター、ルームサーバーもリリースしていますが、実験的です。 From 3c5aa86dba7621d6a72e9184ba5954eab2589661 Mon Sep 17 00:00:00 2001 From: me Date: Sun, 2 Aug 2026 12:21:53 -0700 Subject: [PATCH 44/51] docs: add Unit C6L flash_mode=qio root cause notes --- docs/notes/unit-c6l-flash-mode.md | 79 +++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 docs/notes/unit-c6l-flash-mode.md diff --git a/docs/notes/unit-c6l-flash-mode.md b/docs/notes/unit-c6l-flash-mode.md new file mode 100644 index 0000000000..65dac77cc6 --- /dev/null +++ b/docs/notes/unit-c6l-flash-mode.md @@ -0,0 +1,79 @@ +# M5Stack Unit C6L 起動不能の真因調査(2026-08) + +> **TL;DR (EN)** — The boot loop on Unit C6L is not a firmware-code problem. +> The board manifest `esp32-c6-devkitm-1.json` sets `flash_mode: qio`, and this +> chip does not boot reliably from a QIO image. `pio run -t upload` hardcodes +> `--flash_mode dio` on a separate code path, so the bug stays invisible during +> development while every distributed `merged.bin` ships broken. +> Fix: one line, `board_build.flash_mode = dio` (PR #3098). + +**結論: 真因はボードマニフェスト `esp32-c6-devkitm-1.json` の `flash_mode: qio`。修正は `variants/m5stack_unit_c6l/platformio.ini` に `board_build.flash_mode = dio` を1行加えるだけ(PR #3098)。** + +**以下は、PI4IO / TCXO電圧 / I2Cピン / TX_LED の4項目を真因と誤認して PR #3088 を出し、再bisectで撤回するまでの経緯。途中まで読むと誤結論を拾うので注意。** + +--- + +## 症状 + +USBシリアルポートが接続/切断を繰り返し、デバイスが起動しない。upstream `meshcore-dev/MeshCore` の dev ブランチ由来ファームで発生。Issue #2229 に複数の報告者(comsorg / vikkut / alestandby / svenrobbie)。 + +一方、M5Burner 経由で配布されている TheRealHaoLiu フォーク版(MeshCore v1.11.0)は正常起動する。 + +## 真因 + +`esp32-c6-devkitm-1.json`(ボードマニフェスト)が `flash_mode: qio` を指定している。ESP32-C6 はQIOイメージから安定して起動しない。 + +**なぜ開発中は見えなかったか** — PlatformIO の書き込み経路は2つあり、挙動が違う。 + +| 経路 | flash_mode | 結果 | +|---|---|---| +| `pio run -t upload` | `--flash_mode dio` をハードコード(マニフェスト無視) | 起動する | +| `mergebin`(= GitHub Releases 配布の merged.bin = Webフラッシャー経路) | マニフェストの `qio` を採用 | **起動しない** | + +つまり開発者は常に dio で書き込んでおり、ユーザーは常に qio を掴まされていた。 + +## 確認方法 + +1. 同一ファームウェアに対し `--flash_mode` だけを変えて書き込み。qio で2回クラッシュループを再現、dio で2回解消 +2. 書き込み後に `esptool image_info` でオンチップのヘッダを読み戻し、実際にどのモードが載ったかを確認 +3. 配布済み merged.bin(jp-v1.8.1 および upstream companion-v1.16.0)のヘッダを確認 → **両方ともQIO**。`--flash_mode` 指定なしで書き込むと同じクラッシュループを再現 + +## 誤認の経緯(PR #3088) + +M5Burner フォークとの差分6項目を洗い出した: + +1. TCXO電圧 1.8V → 3.0V +2. I2Cピン 16/17 → 10/8 +3. PI4IO `OUT_H_IM` レジスタ書き込み +4. TX_LED GPIO15 +5. `SX126X_RXEN` と `GPS_TX` の GPIO5 競合 +6. SSD1306 ディスプレイ対応の欠落 + +このうち1〜4を適用したところクラッシュが解消したように見えたため、PR #3088 を提出し jp-v1.8.1 をリリースした。 + +翌日クリーンな手順で再検証したところ、**upstream素のコード(変更ゼロ)でも dio なら起動する**ことが判明。4項目はいずれも起動可否に無関係だった。PR #3088 はクローズし、PR #3098 を提出。 + +**なぜ誤認したか(2つの汚染源)** + +- **ビルドキャッシュ**: PlatformIO のインクリメンタルビルドがヘッダファイルの変更を拾わず、bisect中に偽の失敗が混入していた +- **書き込み手順**: `esptool.py write_flash 0x0 firmware.bin` を merged / non-merged の区別なく使っていた + +## 教訓 + +- **ESP32系では「コードのbisect」より先に「書き込み条件(オフセット・flash_mode)の固定」を疑う。** 変数が固定されていない状態でのbisectは、結論ではなくノイズを生む +- 検証ビルドの前には必ず `pio run -t clean` + `rm -rf .pio/build/` +- 書き込みは `pio run -t upload` に統一。esptool 直書き・オフセット手動指定はしない +- 「開発環境では動くが配布物では動かない」類のバグは、ビルド成果物そのもの(ヘッダ等)を読み戻して確認する + +## 積み残し(この件とは別テーマ) + +- **PI4IO の LNA(P5) 有効化** — upstream では未初期化のまま。受信感度に影響する可能性があるが、起動問題とは無関係。別途検証の余地あり +- **GPIO5 競合**(`SX126X_RXEN=5` / `GPS_TX=5`)— 別PRとして分離(PR #3089、ブランチ `fix/unit-c6l-gpio5-conflict`) + +## 関連 + +- Issue #2229 — 症状の報告先。訂正コメント投稿済み +- PR #3088 — クローズ(誤った修正) +- PR #3098 — 正しい修正(1行) +- jp-v1.8.1 — Unit C6L 向け merged.bin がQIOヘッダのため実質破損版 +- jp-v1.8.2 — 4つのC6L merged.bin 資産すべてがDIOヘッダであることを確認したうえでリリース From c49d26d482cf77a99363b41b37180fb198338151 Mon Sep 17 00:00:00 2001 From: me Date: Sun, 2 Aug 2026 22:08:25 -0700 Subject: [PATCH 45/51] fix(jp-lbt): reduce backoff parameters for SF10 airtime Same change as meshcore-dev/MeshCore#3103, applied directly to jirogit/dev for jp-release inclusion. base_ms: 2000 -> 500 ms max_backoff: 16000 -> 4000 ms Provisional values; to be refined with traffic statistics from deployed nodes. --- src/helpers/radiolib/RadioLibWrappers.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/helpers/radiolib/RadioLibWrappers.cpp b/src/helpers/radiolib/RadioLibWrappers.cpp index f6afbaaffb..467b2df8cd 100644 --- a/src/helpers/radiolib/RadioLibWrappers.cpp +++ b/src/helpers/radiolib/RadioLibWrappers.cpp @@ -199,8 +199,8 @@ bool RadioLibWrapper::isChannelActive() { while (millis() - sense_start < 5) { if (getCurrentRSSI() > -80.0f) { _busy_count++; - uint32_t base_ms = 2000; - uint32_t max_backoff = min(base_ms * (1u << _busy_count), (uint32_t)16000); + uint32_t base_ms = 500; + uint32_t max_backoff = min(base_ms * (1u << _busy_count), (uint32_t)4000); uint32_t backoff_until = millis() + random(max_backoff / 2, max_backoff); while (millis() < backoff_until) { YIELD_TASK(); From 3eca545b03f70d7c1b727fd2497a8beaefa95c44 Mon Sep 17 00:00:00 2001 From: me Date: Sun, 2 Aug 2026 22:25:49 -0700 Subject: [PATCH 46/51] chore(release): add auto PR notes + pending-notes file for direct pushes - jp-release.yml: generate_release_notes: true (auto-lists merged PRs since last tag) - PENDING_NOTES_JP.md: manual log for direct pushes to dev (not covered by PR-based auto notes) --- .github/workflows/jp-release.yml | 1 + PENDING_NOTES_JP.md | 10 ++++++++++ 2 files changed, 11 insertions(+) create mode 100644 PENDING_NOTES_JP.md diff --git a/.github/workflows/jp-release.yml b/.github/workflows/jp-release.yml index 42a8f735d8..887e6da466 100644 --- a/.github/workflows/jp-release.yml +++ b/.github/workflows/jp-release.yml @@ -136,6 +136,7 @@ jobs: if: startsWith(github.ref, 'refs/tags/') with: name: JP Firmware ${{ env.GIT_TAG_VERSION }} + generate_release_notes: true body: | ## 日本向け MeshCore ファームウェア diff --git a/PENDING_NOTES_JP.md b/PENDING_NOTES_JP.md new file mode 100644 index 0000000000..8946a1cc55 --- /dev/null +++ b/PENDING_NOTES_JP.md @@ -0,0 +1,10 @@ +# 次回リリース向けメモ(直接push分のみ) + +PRを経由した変更は自動生成(generate_release_notes)で拾われるため、ここに書く必要はない。 +jirogit/dev への直接push(fork限定ドキュメント等)だけをここに1行で書き足す。 + +リリース時:この内容をドラフトリリース本文にコピーしてから、このファイルを空にする。 + +--- + +- fix(jp-lbt): reduce backoff parameters for SF10 airtime (base_ms 2000→500, max_backoff 16000→4000) — c49d26d4 From 2a72e6fa8d1e3e7612ca757c11b31e4e4e787284 Mon Sep 17 00:00:00 2001 From: jirogit Date: Fri, 7 Aug 2026 22:55:23 -0700 Subject: [PATCH 47/51] jp-release: restrict Off-Grid Repeat to 921.2MHz (JP LBT range) --- .github/workflows/jp-release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/jp-release.yml b/.github/workflows/jp-release.yml index 887e6da466..5436200814 100644 --- a/.github/workflows/jp-release.yml +++ b/.github/workflows/jp-release.yml @@ -29,6 +29,7 @@ jobs: -D LORA_BW=125.0 -D LORA_SF=10 -D LORA_CR=6 + -D 'ALLOWED_REPEAT_FREQ_RANGE={921200,921200}' -D ENABLE_ADVERT_ON_BOOT=1 -D ENABLE_PRIVATE_KEY_IMPORT=1 -D ENABLE_PRIVATE_KEY_EXPORT=1 From 9b966fd5379373f9208b73c121a9eeff15b50b4b Mon Sep 17 00:00:00 2001 From: jirogit Date: Fri, 7 Aug 2026 22:59:48 -0700 Subject: [PATCH 48/51] PENDING_NOTES_JP: add Off-Grid Repeat 921.2MHz restriction note --- PENDING_NOTES_JP.md | 1 + 1 file changed, 1 insertion(+) diff --git a/PENDING_NOTES_JP.md b/PENDING_NOTES_JP.md index 8946a1cc55..ad38cb59db 100644 --- a/PENDING_NOTES_JP.md +++ b/PENDING_NOTES_JP.md @@ -8,3 +8,4 @@ jirogit/dev への直接push(fork限定ドキュメント等)だけをここ --- - fix(jp-lbt): reduce backoff parameters for SF10 airtime (base_ms 2000→500, max_backoff 16000→4000) — c49d26d4 +- feat(jp-release): restrict Off-Grid Repeat to 921.2MHz only (ARIB STD-T108 JP LBT range) From f2aaafc8520df122c9fd3e03a1a0677ee93f6c0b Mon Sep 17 00:00:00 2001 From: jirogit Date: Sat, 8 Aug 2026 00:13:14 -0700 Subject: [PATCH 49/51] docs(readme-jp): flag Wio-SX1262 5ms LBT route as unverified against test report The Wio-SX1262 test report (BL-SZ2531376-601) only contains test data for the 128us/0.4s/360s duty-cycle route. No test data exists for the 5ms/4s/50ms route this firmware actually implements. Followed up with Seeed (2026-08-07) to confirm whether their 'RF parameters within scope' answer covers this. Section will be updated once they reply. Also softens the T1000-E section with a cross-reference note, since whether it has the same test-route gap is unconfirmed (no test report obtained yet). --- README_JP.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README_JP.md b/README_JP.md index 901b4f2acb..9a7a6943e4 100644 --- a/README_JP.md +++ b/README_JP.md @@ -108,6 +108,8 @@ Seeed社に正式問い合わせたところ(2026年7月22日付、書面回 証明された920MHz帯の出力上限は **19mW(≈12.79dBm)** で、これは厳格な上限(丸め誤差の余地なし)とのことです。本ファームウェアはこれを踏まえ、T1000-Eの送信出力のデフォルトを **12dBm**(≈15.85mW)に設定しています。 +> **注:** Wio-SX1262(後述)については、証明された試験報告書が本ファームウェアの送信時間制御方式(5ms/4秒/50ms)ではなく別方式(128μs/0.4秒)でのみ試験されていたことが判明しています。T1000-Eについても同様の不一致があるかどうかは、該当する試験報告書を未入手のため確認できていません。 + **証明内容の確認:** - [総務省データベース:第8号 920MHz帯(LoRa)](https://www.tele.soumu.go.jp/giteki/SearchServlet?pageID=jg01_01&PC=217&TC=N&PK=1&FN=260303N217&SN=%E8%AA%8D%E8%A8%BC&LN=4&R1=*****&R2=*****) — F1D 920.6〜928MHz(200kHz間隔38波)**19mW**、920.7〜927.9MHz(37波)16mW - [総務省データベース:第19号 2.4GHz帯(Bluetooth LE)](https://www.tele.soumu.go.jp/giteki/SearchServlet?pageID=jg01_01&PC=217&TC=N&PK=1&FN=260303N217&SN=%E8%AA%8D%E8%A8%BC&LN=3&R1=*****&R2=*****) @@ -131,7 +133,11 @@ Seeed社に正式問い合わせたところ(2026年7月20日付、書面回 - [総務省データベース(認証番号 201-250230)](https://www.tele.soumu.go.jp/giteki/SearchServlet?pageID=jg01_01&PC=201&TC=N&PK=1&FN=250515N201&SN=%E8%AA%8D%E8%A8%BC&LN=34&R1=*****&R2=*****) - [試験報告書 BL-SZ2531376-601](https://www.tele.soumu.go.jp/giteki/SearchServlet2?PageID=jt01&ATF=185316004)(証明対象アンテナ3種の記載あり) -> **注:** ホスト側ファームウェアがSPI経由でRFパラメータを直接制御する構造(本ファームウェアも含む)が、法的に「工事設計」の同一性を保つかどうかは、Seeed社の回答で一定の裏付けは得られたものの、完全に確立した論点ではありません。運用にあたっては自己責任での最終確認をおすすめします。 +> **⚠️ 重要な留保(2026年8月追記):** 上記の試験報告書(BL-SZ2531376-601)を直接確認したところ、実際に試験・合格しているのは告示49号の128マイクロ秒キャリアセンス/0.4秒送信/1時間あたり360秒以下という方式のみで、本ファームウェアが実装している5ミリ秒連続キャリアセンス/4秒送信/50ミリ秒休止という方式の試験データは報告書内に見当たりませんでした。 +> +> Seeed社の「RFパラメータが範囲内ならファームウェア変更は証明の有効性に影響しない」という回答が、この送信時間制御方式(ルート)自体の変更まで含むのか、それとも周波数・出力といった物理的なパラメータのみを指すのかは、現時点で確認が取れていません。この点について2026年8月7日付でSeeed社へ追加確認を依頼しており、回答待ちです。 +> +> 結論として、Wio-SX1262搭載機の技適については、本ファームウェアでの動作が法的に問題ないとまだ言い切れる状態ではありません。回答があり次第、このセクションを更新します。それまでの間は、特例制度の届出と併用することを推奨します。 **アンテナについて:** 証明対象のアンテナは3種類です(試験報告書 BL-SZ2531376-601 より)。 @@ -163,7 +169,7 @@ WisMesh Tagの日本向け技適取得状況は現時点で確認できていま ### 技適対象外:実験試験局 or 特例制度 -本ファームウェアで使われる無線機のうち、Wio-SX1262搭載機とT1000-Eは、メーカーから条件付きで技適の有効性が確認できています(それぞれ送信出力・アンテナ構成の条件あり。詳細は上記の各機種の項を参照)。それ以外の無線機は、2026年7月時点でどれも技適を通っていません。技適の対象外となる機種で日本国内で電波を発射する場合は、次のいずれかの手続きが必要だと思われます(開発は米国で行っているので、ちょっと自信がないです、すいません)。 +本ファームウェアで使われる無線機のうち、T1000-Eはメーカーから条件付きで技適の有効性が確認できています(送信出力・アンテナ構成の条件あり)。Wio-SX1262搭載機についても同様の回答を得ていますが、上記の通り試験ルートに関する未解決の論点があり、現時点では「確認済み」と言い切らない扱いにしています。詳細は上記の各機種の項を参照してください。それ以外の無線機は、2026年7月時点でどれも技適を通っていません。技適の対象外となる機種で日本国内で電波を発射する場合は、次のいずれかの手続きが必要だと思われます(開発は米国で行っているので、ちょっと自信がないです、すいません)。 **おすすめ:特例制度(届出のみ・180日)** From b6b2b510945e01bb0234456cb89ee6bea2cc5af9 Mon Sep 17 00:00:00 2001 From: me Date: Sun, 9 Aug 2026 10:05:57 -0700 Subject: [PATCH 50/51] chore(release): clear PENDING_NOTES_JP.md after jp-v1.8.3 --- PENDING_NOTES_JP.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/PENDING_NOTES_JP.md b/PENDING_NOTES_JP.md index ad38cb59db..a53448f91f 100644 --- a/PENDING_NOTES_JP.md +++ b/PENDING_NOTES_JP.md @@ -7,5 +7,3 @@ jirogit/dev への直接push(fork限定ドキュメント等)だけをここ --- -- fix(jp-lbt): reduce backoff parameters for SF10 airtime (base_ms 2000→500, max_backoff 16000→4000) — c49d26d4 -- feat(jp-release): restrict Off-Grid Repeat to 921.2MHz only (ARIB STD-T108 JP LBT range) From 31318570bb2211c59929786f0df2a810114a0670 Mon Sep 17 00:00:00 2001 From: me Date: Sun, 9 Aug 2026 13:21:50 -0700 Subject: [PATCH 51/51] fix(m5stack_unit_c6l): add USB CDC flags to repeater and room_server envs Same issue as PR #3099 (kiss_modem): without ARDUINO_USB_CDC_ON_BOOT=1 and ARDUINO_USB_MODE=1, Serial routes to UART0, which has no physical connector on this board. USB admin console was unreachable on these envs as a result. Tested on real hardware: USB admin console now responds on both repeater and room_server envs, confirmed configurations via serial. --- variants/m5stack_unit_c6l/platformio.ini | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/variants/m5stack_unit_c6l/platformio.ini b/variants/m5stack_unit_c6l/platformio.ini index 1b0e4d2d08..c959deeeeb 100644 --- a/variants/m5stack_unit_c6l/platformio.ini +++ b/variants/m5stack_unit_c6l/platformio.ini @@ -43,6 +43,8 @@ build_src_filter = ${M5Stack_Unit_C6L.build_src_filter} +<../examples/simple_repeater/*.cpp> build_flags = ${M5Stack_Unit_C6L.build_flags} + -D ARDUINO_USB_CDC_ON_BOOT=1 + -D ARDUINO_USB_MODE=1 -D ADVERT_NAME='"Unit C6L Repeater"' -D ADVERT_LAT=0.0 -D ADVERT_LON=0.0 @@ -60,6 +62,8 @@ build_src_filter = ${M5Stack_Unit_C6L.build_src_filter} +<../examples/simple_room_server> build_flags = ${M5Stack_Unit_C6L.build_flags} + -D ARDUINO_USB_CDC_ON_BOOT=1 + -D ARDUINO_USB_MODE=1 -D ADVERT_NAME='"Unit C6L Room"' -D ADVERT_LAT=0.0 -D ADVERT_LON=0.0