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は手動で入れました。

DSD TECH SH-U11L USB-RS485 RS422ケーブル

このケーブルのTX+をHATのAにTX-をHATのBにつなぎGND同士も接続します。そして、修正したmain.c をコンパイルして実行させてから、接続したPCのターミナルでUSBポートから文字を打ち込むと、ラズパイのコンソールに文字が現れます。