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の場合に
リトライする様にしました。