1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

###はじめに

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を入れて導入しましたので、非常に簡単にできました。

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?