LTC485CN8を使用したRS485通信ESP32+micropython版

 

ARDUINO版の記事を先に参照してください。
 https://ameblo.jp/fc2miha/entry-12833773099.html

 

この記事のESP32+micropython版です

 

マスター側をESP32に置き換えて、スレーブ側をArduinoを使う場合です。

 

LTC485CN8を使うわけですが、
データシート 
 https://www.mouser.jp/datasheet/2/609/485fm-2955265.pdf
 電源電圧は5Vで動く。

 

前にも書きましたが、ARDUINOの5V版で作るのが簡単そうだったので、
前の記事はARDUINOで作りました。

でも、やっぱり、3.3Vから制御したい!!というわけで、
色々調べました。

 

変換アダプタ使うのが簡単ですが、なんかつまらないじゃないですか?
 という訳で、UARTの5Vと3.3Vを接続できる回路を間にかましてみました。
参考
 https://www.cepstrum.co.jp/hobby/5v33v/5v33v.html

 

写真

 


左下がESP32ーDEVKITで、これがマスターです。
左上がUNO互換機で、これがスレーブです。
赤で書いたブレッドボードが3.3Vと5Vの変換です。

UARTの5Vと3.3Vを接続できる回路は上の写真の「これ」の部分です。
間にあるLAN線の長さが7メートルになっております。

 

■回路図

 

 

上の回路はESP32で作ったマスター側です。

スレーブ側は前の記事と同じです。
 https://ameblo.jp/fc2miha/entry-12833773099.html

 

間の接続はAはAにBはBに接続します。

 

今回のポイントはESP32のRX端子に4.7KΩの抵抗を付けている所です。
これがあると、単純に5V→3.3Vの信号が正常に受けられるって事ですね。
TX端子は電圧がかかる事は想定していないので、問題あるかもですが、
 ま、大丈夫って事で、こんな回路になりました。


詳しくは上の参考のURLを参照でおねがいしたい。


■プログラム


□マスター側プログラム

 

import time
from machine import UART, Pin

print("start")

txden = Pin(13,Pin.OUT)

uart2 = UART(2, 9600, rx=18, tx=19)
uart2.init(9600, bits=8, parity=None, stop=1, timeout = 10, timeout_char =5)
count = 0
while True:
    print("point "+str(count))
    txden.value(1)
    #
    uart2.write("write"+str(count)+'¥r¥n')
    time.sleep_ms(20)
    txden.value(0)
    count=count+1
    #
    #
    #
    print("point : 200")
    #
    time.sleep_ms(50)
    for i in range(10):
      buf = uart2.read()
      if buf is None :
        #size =uart2.any()
        #print("none")
        time.sleep_ms(10)
        continue
      else:
        break
    #
    try :
      buf = buf.decode('utf-8')
    except :
      print("")
    print(buf)
    
    time.sleep_ms(10)


□スレーブ側プログラム

 

前の記事と同じです
 https://ameblo.jp/fc2miha/entry-12833773099.html

 

■実験結果

 

スレーブは前の記事のままでプログラムもそのまま。

ESP32のマスター側は上記通りで、安定して通信できているようです。

間の回線はLAN線のツイストペア7メートルです。

終端抵抗は無し。

 

通信速度ですが、
電文が100回往復する時間を測定したところ、15秒かかっておりますので、
1回あたりだと、0.15秒です。

 

タイミングによってはマスター側への到着が遅れる場合があるみたいで、
次のReadで2回分読み込む事が有ったので、uart2.read()の中身がNoneの場合に
リトライする様にしました。