RaspberryPi[18] RS485 HAT
ラズパイ用のRS485 HATを付けてみました。色々なところで買えるようですが、スイッチサイエンスさんが一番安いようです。Raspberry Pi用 2チャンネル絶縁 RS485拡張HATです。SC16IS752とSP3485を使い、電源絶縁、ADI磁気アイソレーション、TVSダイオードなどの保護回路を内蔵しています。
Waveshareという香港企業がオリジナルのようです。ラズパイに取り付けるのには悩まないと思いますが、ピンヘッダが付属しているので、ラズパイのピンヘッダに刺した後、HATに刺すとラズパイの他のピンヘッダが使えるようになります。これは特に半田付けは要らない構造のように思えます。HATに穴が4つ開いていますが、スタッドは2本しかなく、ラズパイのピンヘッダ側の穴は使いませんでした。
使い方は本家のページからリンクされている
WIKI: www.waveshare.com/wiki/2-CH_RS485_HAT にあります。
まず、/boot/config.txt を編集します。
dtoverlay=sc16is752-spi1,int_pin=24
これを追記して再起動します。
SPIを使うということだったので、ラズパイの設定でSPI有効にしないといけないかなと思いましたが、特にしなくても動きました。けど、一見動いているようでも、データが欠けます。SPIは有効にしておきましょう。これには悩みました。
再起動すると、/dev/の下に gpiochip3 とttySC0 とttySC1 が出てればOKと書いてありますが、私の場合は、gpiochip0 1 2 しかありませんでした。それでも動きましたが。
あとは、wiringpi、python2 library、python3 library を入れろ書いてありますが、普通、どれも既に入っていると思います。
次にサンプルプログラムを落とします。C言語とPythonの二種類ありますが、Pythonのほうが確認しやすいです。
sudo apt-get install p7zip-full
wget https://www.waveshare.com/w/upload/4/44/2-CH_RS485_HAT_code.7z
7z x 2-CH_RS485_HAT_code.7z
sudo chmod 777 -R 2-CH_RS485_HAT
cd 2-CH_RS485_HAT/
sudo git clone https://github.com/waveshare/2-CH-RS485-HAT
cd 2-CH-RS485-HAT/
cはcフォルダに移動、PythonはPythonフォルダに移動します。cはコンパイルしていないので、make でコンパイルします。
#include <stdio.h> //printf()
#include <stdlib.h> //exit()
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include "DEV_Config.h"
void Handler(int signo)
{
//System Exit
printf("\r\nHandler:Program stop\r\n");
DEV_ModuleExit();
exit(0);
}
void RS485_UART()
{
DEV_UART_Init("/dev/ttySC0");
UBYTE pData[100]={0};
int i=0;
DEV_Digital_Write(RS485EN, 0);
UART_Write_nByte("Waveshare RS485 RS232 HAT\r\n", 27);
DEV_Delay_ms(5);//Waiting to send
DEV_Digital_Write(RS485EN, 1);
while(1){
DEV_Digital_Write(RS485EN, 0);
DEV_Delay_ms(5);//Waiting to send
DEV_Digital_Write(RS485EN, 1);
}
}
void RS232_UART()
{
DEV_UART_Init("/dev/ttySC1");
UBYTE pData[100]={0};
int i=0;
UART_Write_nByte("Waveshare RS485 RS232 HAT\r\n", 27);
DEV_Delay_ms(5);//Waiting to send
while(1){
pData[i] = UART_Read_Byte();
if(pData[i] == '\n')
{
for(int j=0; j<i+1; j++)
printf("%c",pData[j]);
UART_Write_nByte(pData, i+1);
DEV_Delay_ms(5);//Waiting to send
i=0;
}
else if(i>100)
{
i=0;
}
else
{
i++;
}
}
}
int main(int argc, char **argv)
{
// Exception handling:ctrl + c
signal(SIGINT, Handler);
if (DEV_ModuleInit()==1)return 1;
// RS485_UART();
RS232_UART();
DEV_ModuleExit();
return 0;
}
サンプルプログラムですが、なぜ、232と名前が付いているか不明です。main では、
// RS485_UART();
RS232_UART();
のようにコメントで切り替えるように見えます。色々ソースコードを見ながら作った受信確認用です。
void RS485_recieve()
{
DEV_UART_Init("/dev/ttySC1");
while(1){
printf("%c\n",UART_Read_Byte());
}
}
USB-RS422変換器があればそれを使って確認できますが、チャンネル0とチャンネル1間で双方向するプログラムがPythonにはあるのでそれで確認するのが良いでしょう。チャンネル0と1を平行につなぎます。クロス接続する必要はありません。
私は受信を先に作りたかったので、DSD TECH SH-U11L USB-RS485 RS422ケーブル FTDI FT232チップ付き 1.5M / 5FTを購入しました。このチップのドライバーはデフォルトで入っているPCと入っていないものがあるようです。私の場合、Windows11は入っていましたが、Windows10は手動で入れました。
このケーブルのTX+をHATのAにTX-をHATのBにつなぎGND同士も接続します。そして、修正したmain.c をコンパイルして実行させてから、接続したPCのターミナルでUSBポートから文字を打ち込むと、ラズパイのコンソールに文字が現れます。