Vol.880 13.Oct.2023

M5StickC(11)〜esp32RMTで赤外線リモコン サイバーナビ用通信モジュールの期限切れ

M はじめての M5StickC_Plus (11) 〜esp32RMTで赤外線リモコン

by fjk

 M5SticCPlusで赤外線リモコンを使うには、Arduino IDEではIRremoteと便利なライブラリがあるが、UIFLOW(MicroPython)ではabc874で紹介したように、IOdata用のIR出力ができなかった。
 そこで、MicroPythonの赤外線リモコン使用例を探してみると、「esp32.RMT」が見つかった。(以下、参考ページ例)

1.esp32.RMTの動作テスト

EDS32用だが同じMicroPythonの日本語マニュアルの例を参考に、赤外線LEDをG26(内蔵はG9)ピンとし、REPLで下記を入力
import esp32
from machine import Pin
r = esp32.RMT(0, pin=Pin(26), clock_div=80, tx_carrier=(38000,50,1)) ・・・>エラー!
r.write_pulses((1,20,2,40),0)
ところが、3行目のRMTオブジェクト作成時にエラー!
 
そこで、さらに調べて見ると、Qiitaさんの「 M5StickC plus のMicropythonで赤外線リモコン」を見つけ、その記述コードを参考に変更すると
import esp32
from machine import Pin
r = esp32.RMT(0, pin=Pin(26), clock_div=80, carrier_freq=38000) # duty=50%
lst=[560,560, 560,1680, 560,560, 560,1680, 560]   # [0101]stop
r.write_pulses(lst, start=1)
と、エラー無く進み、オシロで出力波形を見てみると、「0101」と信号が出ていることを確認。

IR(pin26)出力波形

左図の一部を拡大(38kHzキャリア確認)

 ※ なお、IR出力はリスト順に0と1を繰り返すが、最初は「carrier出力有」としたいので、start=1とする。
 ※ M5StickC用のesp32.RMTのパラメータは、上記V1.14の英語版の記述が正しい。
   esp32.RMT(channel,・・・,carrier_freq=38000, carrier_duty_percent=50)
   RMT.write_pulses(duration, start=1)
 ※ また、esp32.RMTは送信専用で、受信機能は無い。

2.UIFLOWでpythonスクリプトを使って、NECフォーマットリモコンをテストする
 @ 以下の”sendNEC.py”を、abc879の要領でResouceManagerを使ってM5stickCにダウンロード。


ResourceManager画面
【microPythonスクラッチ】 sendNEC.py(zip)
# *** sendNEC.py ***

import esp32
import time

T = 560               # uSecond
LEADER_HIGH = 8960    # 16T
LEADER_LOW = 4480     #  8T

def bit2time(frame: list, w_code: word) -> list:
    b_mask = 0x0001
    for i in range(16):
        if (w_code & b_mask):
            frame.extend([T, 3 * T])   # bit=1 -> 3T
        else:
            frame.extend([T, T])       # bit=0 -> T
        b_mask <<= 1
    return frame

def gen_frame(customer: word, data: word) -> list:
    p_width = [LEADER_HIGH, LEADER_LOW]
    bit2time(p_width, customer)
    bit2time(p_width, data)
    p_width.extend([T])            # stop
    return p_width

def send_ir(rmt, customer: word, data: word) -> None:
    frame = gen_frame(customer, data)
    rmt.write_pulses(frame, start = 1)
    while not (rmt.wait_done()):
        time.sleep_us(T)

def add_invert(code: byte) -> word:
    return (code + ((0xff^code)<<8))

def send_NEC(rmt, customer: word, code: byte) -> None:
    send_ir(rmt, customer, add_invert(code))
※M5stickCのROMにダウンロードするファイル名は10文字以内にすること!

 A REPLでダウンロードファイル(sendNEC.py)の確認


REPL(テラターム)で確認画面

 B UI-FLOW画面で、「setup」に続けて[コードを実行]で以下を記述

import sys
sys.path.append('/flash/res')
from sendNEC import *
from machine import Pin
ir_led = esp32.RMT(0, pin=Pin(9), clock_div=80, carrier_freq=38000)
変数:c_code、dataをblocklyで作成し、以下の値をセット
   c_code = 0xE880  #・・・2バイトのカスタマコード
   data = 0x84    #・・・1バイトのデータ
「ボタンA wasPressed」に、[コードを実行]で以下を記述。
send_ir(ir_led, c_code, add_invert(data))
または、以下のコードを記述
send_NEC(ir_led, c_code, data)

NEC赤外線コード送信Blockly(sendNEC.m5f

赤外線出力信号波形(pin26出力で確認)

IR送信テスト(abc856IR解読器使用)

受信赤外線データ

★ esp32.RMTが動作中に、UIFLOWで再度「RUN」を実行すると、「エラー」となる。
 この場合、M5StickCの電源を入れ直す必要がある。(esp32のリセット)
 この原因は、以前のesp32RMT設定がクリアされず、再度同じチャンネルのesp32RMTのオブジェクト作成を指示したためと思われる。
 異なるチャンネル(8チャンネル使える)を指定するとエラーとならないので、テスト中はチャンネルを変えてみると良い。

★ M5stickCにダウンロードしたファイルをREPLで削除するには、

  import os
chdirでディレクトリーを移動
  os.chdir('/flash/res')
rmdirを使ってファイルを削除  
  os.rmdir(filename)

REPL(テラターム)画面でファイル削除

★ UIFLOWでPython画面にするとM5stickCのファイル管理(確認、消去)ができる【10/17追加】


Python画面時のFileManager


N サイバーナビ用通信モジュールの期限切れ

by fjk

 車のナビにAVIC-CW-902-Mを使っているが、9月いっぱいで通信モジュールであるND-DC2の契約期間が切れ、通信機能が使えなくなった。前回までは、専用SIM(3G)を購入できたが、このSIMは既に販売を終了しており、入手できない。また、他の通信ユニットも対応していないとのこと。
 サイバーナビはそんなに使いこなしているわけではないが、出来れば通信機能を続けて使いたいと思い、契約期間が過ぎた場合の対応について調べて見ると、以下の3つの方法があることが判った。

@ 新らしいSIMの購入
A Bluetoothによるテザリング接続
B WiFiによる接続

 @は対応SIMが既に入手できないので、AおよびBについて検討する。なお、A,Bでは@に比べて使用できる機能が限られ、特にオンラインマップは利用できない。

  1. Bluetoothによるテザリング・・・A
     手持ちのスマホなどのテザリング機能を使う方法で、費用はスマホの通信料のみとなる。
     なお、Bluetoothプロトコルは PAN-NAPプロファイル対応のスマートフォン
  2. WiFiによる・・・B
     車内にWIFiルータをセットし、ナビやスマホ、パソコンなどもWiFi接続で使うことが出来る。
     今回は、abc879で紹介したモバイルルーターFS030Wがあるので、以下の手順でWiFi接続を行った。
    @ FS030Wの電源をOnにし、LTE受信ができることを確認
    A AVIC-CW902で、HOME画面を表示し、「AV・本体接続」にタッチ
    B「WiFi設定」にタッチ(WiFiがOFFなら「WiFi」をタッチしONにする)
    C「WPS接続」をタッチする
    D WPS接続ボタンを押すよう指示が出るので、FS030WのWPSボタンを押す
    E しばらくすると、登録に成功し、接続端末名と、無線アイコンが表示された
     と、無事接続に成功し(無線アイコン表示)、サイバーナビの通信機能が使えるようになった。
    ・なお、自動接続をONにしておくと、以後は準備が出来ておれば、自動で接続される。
    ・車には専用クレドール(CRDFS030W、4,250円)をダッシュボード上に接着テープで固定し、本体を差し込んだ。


LTEで接続中のFS030W

ネット(LTE)に接続中

※パイオニアDCT-WR100Dによる接続
DCT-WR100Dはパイオニア用なので、接続に安心感があるが、
  @ microSIMは使えないので、別途(nanoUIM)接続料金が発生、
  A 車両が60分以上停止時に接続が切れる(切り忘れ防止出来るが・・)、
とあり、キャンカーでは停止時でもWiFiでタブレットを使いたいので、今回はパス。
しかし、降車時に、電源OFFを忘れそう!!

 ※サイバーナビで通信機器を使うと以下の機能が使用できる


※ 本レポートの参考・利用は、あくまでも自己責任でお願いします。


M5StickC(11)〜esp32RMTで赤外線リモコン サイバーナビ用通信モジュールの期限切れ