プチロボ用シリアル通信のC言語コードのサンプルを見直しましたので、ご一報まで。


はじめに

2020年末の連休中にROS1melodic)の開発環境をwsl(1)VS Codeに整理しました。開発環境の利用テストを兼ねて、昨年作成したプチロボ用ダミーコードの修正作業を実施しましたので、コミュニティーの皆様への新年のご挨拶(!?)もかねてアップデート版のコードを忘備録としてアップします。

・当初の制作記事、共立エレショップのプチロボサポートサイトのリンク
https://qiita.com/ivvakanni/items/8b5c00b37abe983d9ac1

利用環境

・Windows 10 Home
・Wsl1/ubuntu18.04
・WondeRoid Motion Maker Ver3.1.1
・WR-2R4 USBアダプタ X 2 (Buffalo:USBハブ経由)

Windows PCにUSBハブを経由してWR-2R4 USBアダプタ 2 個をプチロボの付属ケーブル(4線)で接続し、一つのアダプタは Wondows 10 の通信COMポートをMotion Makerソフトから、もう一つのアダプタを wsl 上の ubuntu で tty(ttyS3)を使用して接続して、このプログラムの動作を半二重通信でテストしています。

この方法の良いところは、デバイスの抜き差しが一つのポートで済むことです。また、二つのアダプタが散逸するのも防止できるので一石二鳥です。ちなみに、私は、WR-2R4用の無線モジュールも持っているので、将来的には、無線使用時のコマンドにも対応させてみたいです。

もちろん、Windows PC 側でデバイスを認識させれば、市販の安いUSB/シリアル変換アダプタでも動きます。ただし、wsl2 だとCOMポートがつながらないというような記事が散見されたので、真偽は確認していませんが、一応、wsl1を使用しています。

Windows PowerShellからのコマンドは以下の通り。

C:\> wsl --set-version Ubuntu-18.04 1

主な変更点

・後からのメンテナンスの利便性のためにコメントを随所に入れた。
・コマンド5以外の返信に対応した。

mytty-wr-xx-0.2.1.c
/***********************************************************************************************************
 * WR-XX Dummy for Linux ver. 0.2.2
 * Author : Lian Ivvakanni (01-03-2021)
 * License: Dual BSD/GPL (with absolutely no warranty.)
 * Purpose: send return message to Wonder Roid Motion Maker V3.1.1
***********************************************************************************************************/
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

/* change this definition for the correct port */
#define MODEM_DEVICE "/dev/ttyS3"
#define BAUD_RATE   B38400
/* command item number  */
#define M 8
/* buffer size  */
#define N 32

#define HEADER 0xFFFFFFFD
#define FOOTER 0xFFFFFFFE  

int main(int argc, char *argv[])
{
    int  fd, i, j, k, len;
    struct termios tio;
    char s[N], sprn[N], buf[N], ret[M][N];
/*  Command 5: A/D status dummy data  */
    char dum_5[] = {0xFD,0x0F,0x15,0x46,0x46,0x46,0x46,0x46,\
                    0x46,0x46,0x46,0x46,0x46,0x00,0xFE};
/*  set return data  */
    for (i = 0; i <= 7; i++)
        ret[i][2] = i + 0x10;
/*  clear structure for port settings  */
    memset(&tio, 0, sizeof(tio));
/* 
    BAUDRATE: 38400 bps
    CS8     : 8bit,no parity,1 stopbit (8n1)
    CLOCAL  : local connection, no modem contol
    CREAD   : enable receiving characters
*/
    tio.c_cflag = BAUD_RATE | CS8 | CLOCAL | CREAD;
/*  Open modem device for reading and writing */
    fd = open(MODEM_DEVICE, O_RDWR);
    if (fd < 0) {perror(MODEM_DEVICE); exit(-1);}
    printf("Device Opened...\n");
/*  clean the modem line and activate the settings for the port  */
    tcflush(fd, TCIFLUSH);
    ioctl(fd, TCSETS, &tio);

    while(1){
    /*  clear buffer memory  */
        memset(buf, '\0', N);
    /*  open device to read  */
        len = read(fd,buf, sizeof(buf));
        if(len < 0) printf("Device Read Error...\n");
    /*  find header  */
        if(buf[0] != HEADER) 
            continue;
    /*  check command data size  */ 
        if(buf[buf[1] - 1] != FOOTER) 
            continue;
    /*  optional: set buffer to string  */ 
        for (i = 0; i < buf[1]; i++){
            sprintf(s, "%02X ", buf[i]);
            strcat(sprn,s);
        }
        printf("Rec: %s: %d\r\n", sprn, i);
        memset(sprn, '\0', sizeof(sprn));
    /*  find command and send its return, if any */
        if(buf[2] == 0x00) 
            write(fd, ret[0], 4); 
        if(buf[2] == 0x02) 
            write(fd, ret[2], 4); 
        if(buf[2] == 0x03)
            write(fd, ret[3], 4); 
        if(buf[2] == 0x05) 
            write(fd, dum_5, 15);
        len = 0;
    }
    close(fd);
    return 0;
}

おわりに

2020年は、ARM11上での動作環境にこだわりすぎて実質的なROSの学習が思うように進みませんでした。そこで、そうした反省を踏まえ、ROSのGUI環境がwslで動くことを知ったこともあり今年前半はROS1に関しては、開発学習環境をwsl1 (ubuntu 18.04) 上のMelodicに固定してみます。そして、少し落ち着いたら、夏前までにはROS2にもチャレンジしてみたいですね。

ちなみに、wsl を使用することで、旧型の ubuntu 搭載PC は奥にしまい机が広く使えるようになったのがうれしいです。ROS専用サーバもRaspberry pi 2 にubuntu18.04を入れて導入しましたので、非常に簡単にできました。

それでは、改めまして、コミュニティーのみなさまの興味深く役立つ記事を楽しみにしておりますので、本年もどうぞよろしくお願いいたします。