JAArduinoとRS485RS485と送受信の切り替えRS485通信は半二重通信なので、同じ通信ラインで送信と受信両方を行います。そのため、RS485用のドライバICは送信と受信どちらもできるようになっていて、送信時のみ送信機をオン(受信機をオフ)、送信が終わったらすぐに送信機をオフにして、受信機をオンにする必要があります。この切り替えを、上記の回路図では「TXDEN」ピンが担っています。Arduino上で、1秒に1回、100バイトを送るスケッチを書いて、これにTXDENピンの処理を加えることを考えます。txData[100];Serial.write(txData,100);delay(1000);}上記回路図のICではTXDENをHIGHにすると送信機ON/受信機OFFになりますので、シリアルを送信する前にTXDENピンをHIGHにすることになりますが、送信の完了時が問題になります。LOW);と書いても、スケッチはシリアルの送信をハードウェアに指令するだけですぐに次の行の実行を始めてしまい、送信中にも関わらずTXDENがLOWに戻ってしまいます。これをうまくやるには、シリアルの送信が終わったら割込みを発生させ、その中でTXDENをLOWに戻すようにします。送信完了で割込みを発生させる部分は、MCUの種類によって異なります。(ATmega328)UNO以外でも、ATmega328を使ったボードであれば同じです。0この設定を事前に行っておくことで、シリアルの送信完了時に割込みが発生するようになります。LOW);}ここが実際に割込みが発生した場合に実行される部分(割り込みハンドラ)です。上記のスケッチにこれらの処理を書き加えると以下のようになります。(ATmega32u4)LeonardoではSerialではなくてSerial1を使います。使用するレジスタ名も合わせて少し異なります。(ATMSAD21G18A)SAMDと呼ばれるこれらのボードは構造が結構違い、Serialの割り込みハンドラがArduino本体の方で使われているようで、スケッチの側から呼び出すことができません。SAMDはシリアルポートを複数作ることができるので、Arduino本体で使われていない新しいシリアルポートを作ることによってこの問題を回避します。通常のTX/RXピンとは別のピンを使うことになります。TXDENという設定で考えてみます。ややこしいのですがzeroとM0は、D2ピンとD4ピンが入れ替わっているため、スケッチも異なってきます。zeroなど同じMCUのボードも同様にできると思われますが、ピン配置はそれぞれ異なっているようですので、改変が必要そうです。(SAM3X8E)このMCUはRS485モードというものがあり、割込み処理を行わなくても、送信中の時だけ自動でピンをHIGHにすることが可能です。RTSという機能をピンに割り付けることによって実現します。TXDENという設定のスケッチ例です。delay(1000);}。