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) 
		 | 
	- 
	
- 
       
★ 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では@に比べて使用できる機能が限られ、特にオンラインマップは利用できない。
	- Bluetoothによるテザリング・・・A
	 手持ちのスマホなどのテザリング機能を使う方法で、費用はスマホの通信料のみとなる。
	 なお、Bluetoothプロトコルは PAN-NAPプロファイル対応のスマートフォン
	 - 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を忘れそう!!
 
 ※サイバーナビで通信機器を使うと以下の機能が使用できる
	- スーパールート探索
	
 - 天気情報の取得
	
 - スマートループ渋滞情報の取得
	
 - オンデマンド渋滞情報の取得
	
 - 専用サーバー利用の地点検索(フリーワード検索、フリーワード音声検索、駐車場満空情報、スポット周辺、ガススタ価格情報、テレビdeみ〜た)
	
 - 専用サーバーから取得した情報の表示(ガススタ価格情報、駐車場満空情報)
	
 - スマートループ アイ スポット情報の取得
	
 - 楽曲情報の取得(Gracenoteデータベース)
	
 - MapFan連携機能(スポットフォルダ、スポットリザーブ、ドライブプラン受信、マイカーシーク)
 
※ 本レポートの参考・利用は、あくまでも自己責任でお願いします。