カエデ自動機械

ちょっとしたものづくりや電子工作のメモなど。技術開発とは今は呼べないかな。

近藤科学のRS485USB/シリアル変換アダプターをPCが認識しなくなった話

以前から、近藤科学の汎用(?)サーボモータのラインアップであるB3Mシリーズについて、ROSメッセージで動かせるようなパッケージを作って公開していました。
ktd-prototype.hatenablog.com
github.com

これについて、少々アップデートをしようと久々に動かしてみた所、なぜかまともに動かなくなってしまったので、その対処方法をメモします。

何が起こったのか

上記記事でも触れたように、launchファイルで気軽に位置制御、速度制御、トルク制御をジョイスティックで試せるようにしてありますが、こちらを起動すると以下のようなエラーが出てしまい、PC⇔近藤科学バイス群の通信ができない事象が発生しました。

File "/home/USER_NAME/catkin_ws/src/kondo_b3mservo_rosdriver/scripts/position_control.py", line 12, in <module>
    import drive_function as Drive
  File "/home/USER_NAME/catkin_ws/src/kondo_b3mservo_rosdriver/scripts/drive_function.py", line 13, in <module>
    ser = serial.Serial('/dev/Kondo_USB-RS485_converter', 1500000)
  File "/usr/lib/python2.7/dist-packages/serial/serialutil.py", line 180, in __init__
    self.open()
  File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 298, in open
    self._reconfigure_port(force_update=True)
  File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 330, in _reconfigure_port
    raise SerialException("Could not configure port: %s" % msg)
serial.serialutil.SerialException: Could not configure port: (25, 'Inappropriate ioctl for device')

とりあえず調べてみたこと

大抵このようなエラーが出た時は、一番下から順にエラーの根本部分だったりすると思うので、今回もエラーメッセージをGoogle検索してみたりしたのですが、どうも要領を得ない。

とりあえず、lsusb のコマンドで調べてみると、デバイス自体は間違いなく正しく認識しているようです。

上記ブログでも軽く触れていますが、pythonのコード中でシリアル通信を開始する際、そのポートを /dev/ttyUSB0 のように指定するわけですが、それだと挿し直すたびにデバイス名が変わってしまうため、シンボリックリンクを貼って、このデバイスが接続された時は常にKondo_USB-RS485_converter というラベルが貼られるようにしているのですが、それも有効になっています。
ls /dev/K* と入力したらちゃんと出てきたので)

バイスのUSBケーブルをPCから抜けば、それらの認識はされなくなりますし、launchファイルを起動した際のメッセージも、そのようなデバイスは存在しません、というような内容に正しく変化します。


新たに気づいたこと

そういえば、デバイスにアクセスする権限が無いというエラーもあったなと思い、改めて以下のサイト等を参考にしながら権限を付与し直しました。
qiita.com

結果的には、権限は元々正しく付与されていたのですが、その権限付与状況を再確認した際に、ちょっと原因(の一端)がわかりました。

$ ls -l /dev/K*
lrwxrwxrwx 1 root root 15 12月 24 23:32 /dev/Kondo_USB-RS485_converter -> bus/usb/001/024

と、シンボリックリンクが貼られているデバイス名が、大抵は/dev/ttyUSB0とかなのに、bus/usb/001/024という怪しいものに変わっていました。

これが原因だろうとあたりがつきました。


解決策

バイス名の違いが何を意味するのか、調べてもいまいちピンと来ませんでした。
どうやら本質的には同じで、/dev/USB* という名前の方が、複雑な諸々を抽象的にラッピングされたものらしいのですが・・・

なんとなく、スマホをPCにつなぐと「充電のみ」と「充電と通信」の2種類の接続モードがあるような感じで、今回は前者になってしまったのではと勝手に予想していました。

これをなんとかする方法は、どうやって調べれば良いのか、何を検索キーワードにすれば良いのか検討もつかなかったのですが・・・


「ttyUSB 認識しない」みたいな漠然としたキーワードで検索し、検索結果画面を漠然と眺めていた所、奇跡的に近藤科学のwebサイトで、Ubuntuにいきなりデバイスを繋いでも上手く行かず、デバイスとして認識させる操作が必要みたいなことが書いてあったのを思い出しました。
kondo-robot.com

このページの「FTDIのカーネルと弊社USBアダプタを関連付ける」の部分の操作をもう一度実施してみた所、今度は正しく認識され、ROSパッケージも正常に動きました!

考察というか

考察でもなんでもないですが、結局なぜこうなってしまったのかはわかりません。

webページの記載に従って、この操作が毎回自動で実施されるよう、/etc/rc.local のファイルも書き換えていたはずなのですが。

何にせよ、再び動くようになってよかったです。

現在当該パッケージのアップデートとして、全てのサーボモータを同じ制御モードで動かすのではなく、サーボモータのIDごとに位置制御、速度制御等を個別に指定できるバージョンを準備しています。