daigouin
@daigouin

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Raspberry Piと無線IMUをシリアル通信で接続させたいです

Raspberry Piと無線IMUをシリアル通信で接続させたいです

質問を見てくださりありがとうございます。
お力添えいただけますと幸いです。

Bluetoothで接続する無線IMUで測定した角速度をシリアル通信でラズベリーパイに送信し、
その角速度をもとにモータを回転させる機械を開発したいと考えています。
windosPCではシリアル通信ができたのですが、
LINUXのラズベリーパイではシリアル通信ができず、研究が行き詰まっている状態です。

発生している問題・エラー

例外が発生しました: SerialException
device reports readiness to read but returned no data (device disconnected or multiple access on port?)
  File "/home/osumi/Desktop/program09_2024/AMWS.py", line 43, in <module>
    ser.read(1000)
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)

上記のエラーコードが以下のプログラムで実行した際に発生してしまいます。
エラーの内容を調べたところ、シリアルポートデバイスが通信可能な状態であるにもかかわらず、
IMUからデータが送られてきていないことを示しているようです。
プログラムコードを最後に記載しますので、解決の参考にしていただければと思います。

該当するソースコード

ser.read(1000)

自分で試したこと

まず、rfcommのバインドの確認を行いました。
rfcommコマンドを用いて、Bluetoothデバイスの仮想的なシリアルポートとしてシステムにバウンドし、
バインドが成功したか確認すると、

rfcomm0: C9:0B:89:87:CC:4C channel 1 closed [tty-attached]

と表示されました。
このclosedは、バインドが成功していてもBluetooth接続ができていないことから、
通信が開始されていない状態を示しているようです。

先程のエラーから、IMUのBluetooth通信の確認を行いました。
Bluetoothctlより確認すると、正常にペアリングし、接続されていることが確認できました。
このように、Bluetoothの接続がされていないと表示される場合と、
接続がされているという矛盾した結果が出ており、
調べても解決方法が出てこないことから、皆様のお力添えをいただきたいです。

一応、タイムアウト時間を延長しましたが、変わらず通信はできませんでした。

また、試しにワイヤレスイヤホンBluetooth接続させたところ、正常に音声が聞こえたため、
ラズベリーパイのBluetoothが使用できないというわけではないようです。

プログラムコード

import os
import sys
import serial
import time
import struct
import binascii
import ctypes

if __name__ == '__main__':

        # Serial port 
        ser = serial.Serial()
        ser.port = "/dev/rfcomm0"  # 
        ser.timeout=9.0                                
        ser.baudrate = 115200                          

        # Serial port Open
        ser.open() 
        
        #加/角速度計測設定
        header = 0x9A
        cmd = 0x16              #加/角速度計測設定コマンド
        data = 0x01             #計測周期 1ms
        data1 = 0x0A            #計測データ送信の平均回数 10回
        data2 = 0x00            #計測データ記録の平均回数
        
        check = header ^ cmd
        check = check ^ data
        check = check ^ data1
        check = check ^ data2

        print(ser)
	
        list = bytearray([header,  cmd,  data,  data1, data2 , check])

        ser.read(1000)
        ser.write(list)

        str = ser.readline()

        print('CmdRes:' + repr(str))
	
        # 計測開始/計測予約
        header = 0x9A
        cmd    = 0x13           #計測開始/計測予約コマンド
        smode  = 0x00           #計測時刻の設定状態(0:未設定,1:設定あり)
        syear  = 0x00           #開始年
        smonth = 0x01           #開始月
        sday   = 0x01           #開始日
        shour  = 0x00           #開始時
        smin   = 0x00           #開始分
        ssec   = 0x00           #開始秒
        emode  = 0x00
        eyear  = 0x00           #終了年
        emonth = 0x01           #終了月
        eday   = 0x01           #終了日        
        ehour  = 0x00           #終了時
        emin   = 0x00           #終了分
        esec   = 0x00           #終了秒

        #チェックサム
        check = header ^ cmd
        check = check ^ smode
        check = check ^ syear
        check = check ^ smonth
        check = check ^ sday
        check = check ^ shour
        check = check ^ smin
        check = check ^ ssec
        check = check ^ emode
        check = check ^ eyear
        check = check ^ emonth
        check = check ^ eday
        check = check ^ ehour
        check = check ^ emin
        check = check ^ esec
	
        list = bytearray([header,  cmd, smode, syear, smonth, sday, shour, smin, ssec, emode, eyear, emonth, eday, ehour, emin, esec, check])
  
        ser.read(100)
        ser.write(list)
	
        str = ser.readline()
	
        str =ser.read(1)
	
        while ord(str) != 0x9A:
                str = ser.read(1)

        str = ser.read(1)
	
        if ord(str) == 0x80:            #加速度角速度計測データ通知
                
                str = ser.read(4)
                
                data1 = ser.read(1)
                data2 = ser.read(1)
                data3 = ser.read(1)

                if ord(data3) & 0x80:   #加速度角速度計測データ通知
                        data4 = b'\xFF'
                else:
                        data4 = b'\x00'
		
                print(binascii.b2a_hex(data1))
                print(binascii.b2a_hex(data2))
                print(binascii.b2a_hex(data3))
                print(binascii.b2a_hex(data4))
		
                accx = ord(data1)
                accx += ord(data2)<<8
                accx += ord(data3)<<16
                accx += ord(data4)<<24

                print("accx = %d" % (ctypes.c_int(accx).value))
	
        ser.close();

以上、よろしくお願いいたします。

0

2Answer

windosPCではシリアル通信ができたのですが、
LINUXのラズベリーパイではシリアル通信ができず

↑ 全く同じPythonコードを試された結果でしょうか?
 

rfcommコマンドを用いて、Bluetoothデバイスの仮想的なシリアルポートとしてシステムにバウンドし、・・・

バインドは、次のコマンドでしょうか?
sudo rfcomm bind 0 C9:0B:89:87:CC:4C


以下のコマンドの結果から何かわかりませんか?

sudo hciconfig

sudo l2ping -c 3 C9:0B:89:87:CC:4C

sudo hcitool info C9:0B:89:87:CC:4C

sudo sdptool browse

sudo sdptool records C9:0B:89:87:CC:4C

sudo rfcomm -a

sudo cat /dev/rfcomm0

なお、接続や確認のために投入したコマンドは、省略せずにすべて掲示してもらえると切り分けしやすいです。

1Like

Comments

  1. @daigouin

    Questioner

    コメントありがとうございます。

    ・全く同じPythonコードを試された結果でしょうか?

    ser.port = "/dev/rfcomm0"
    

    上記のコードはwindowsとLINUXとで割り振るポートが異なるため、
    変更していますが、それ以外は変更しておりません。

    ・バインドは、次のコマンドでしょうか?
    sudo rfcomm bind 0 C9:0B:89:87:CC:4C
    →以下のコマンドを用いて行いました。

    sudo rfcomm bind /dev/rfcomm0 C9:0B:89:87:CC:4C 1
    

    ・以下のコマンドの結果から何かわかりませんか?
    コマンドを教えていただきありがとうございます。
    私が勉強不足であるため、教えていただいたコマンドについて勉強した上で、
    コマンドの結果を考察したいと考えております。
    一応、以下に出力結果を記載しますので、何かお気づきになったことがありましたら、
    再度コメントいただけますと幸いです。

    osumi@raspberrypi:~ $ sudo hciconfig
    hci0:	Type: Primary  Bus: UART
    	BD Address: D8:3A:DD:0F:81:66  ACL MTU: 1021:8  SCO MTU: 64:1
    	UP RUNNING PSCAN 
    	RX bytes:9620 acl:84 sco:0 events:528 errors:0
    	TX bytes:390511 acl:704 sco:0 commands:136 errors:0
    
    osumi@raspberrypi:~ $ sudo l2ping -c 3 C9:0B:89:87:CC:4C
    Ping: C9:0B:89:87:CC:4C from D8:3A:DD:0F:81:66 (data size 44) ...
    0 bytes from C9:0B:89:87:CC:4C id 0 time 8.90ms
    0 bytes from C9:0B:89:87:CC:4C id 1 time 26.72ms
    0 bytes from C9:0B:89:87:CC:4C id 2 time 4.83ms
    3 sent, 3 received, 0% loss
    osumi@raspberrypi:~ $ sudo hcitool info C9:0B:89:87:CC:4C
    Requesting information ...
    	BD Address:  C9:0B:89:87:CC:4C
    	Device Name: AMWS020_RP1B002597
    	LMP Version: 4.2 (0x8) LMP Subversion: 0x220b
    	Manufacturer: Cypress Semiconductor (305)
    	Features page 0: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87
    		<3-slot packets> <5-slot packets> <encryption> <slot offset> 
    		<timing accuracy> <role switch> <sniff mode> <RSSI> 
    		<channel quality> <SCO link> <HV2 packets> <HV3 packets> 
    		<u-law log> <A-law log> <CVSD> <paging scheme> <power control> 
    		<transparent SCO> <broadcast encrypt> <EDR ACL 2 Mbps> 
    		<EDR ACL 3 Mbps> <enhanced iscan> <interlaced iscan> 
    		<interlaced pscan> <inquiry with RSSI> <extended SCO> 
    		<EV4 packets> <EV5 packets> <AFH cap. slave> 
    		<AFH class. slave> <LE support> <3-slot EDR ACL> 
    		<5-slot EDR ACL> <sniff subrating> <pause encryption> 
    		<AFH cap. master> <AFH class. master> <EDR eSCO 2 Mbps> 
    		<EDR eSCO 3 Mbps> <3-slot EDR eSCO> <extended inquiry> 
    		<LE and BR/EDR> <simple pairing> <encapsulated PDU> 
    		<err. data report> <non-flush flag> <LSTO> <inquiry TX power> 
    		<EPC> <extended features> 
    	Features page 1: 0x0f 0x00 0x00 0x00 0x00 0x00 0x00 0x00
    	Features page 2: 0x30 0x0b 0x00 0x00 0x00 0x00 0x00 0x00
    osumi@raspberrypi:~ $ sudo sdptool browse
    Inquiring ...
    Failed to connect to SDP server on 38:FC:98:46:9C:D5: Host is down
    Failed to connect to SDP server on 10:F6:0A:82:CF:A2: Host is down
    Browsing C9:0B:89:87:CC:4C ...
    Service Name: Device Identification
    Service RecHandle: 0x10001
    Service Class ID List:
      "PnP Information" (0x1200)
    
    Browsing C9:0B:89:87:CC:4C ...
    Service Search failed: Invalid argument
    Service Name: SPP SERVER
    Service RecHandle: 0x10002
    Service Class ID List:
      "Serial Port" (0x1101)
    Protocol Descriptor List:
      "L2CAP" (0x0100)
      "RFCOMM" (0x0003)
        Channel: 2
    Profile Descriptor List:
      "Serial Port" (0x1101)
        Version: 0x0102
    
    Service Name: A2DP Sink
    Service RecHandle: 0x10006
    Service Class ID List:
      "Audio Sink" (0x110b)
    
    Service Name: AVRCP Controller
    Service RecHandle: 0x10007
    Service Class ID List:
      "AV Remote" (0x110e)
      "AV Remote Controller" (0x110f)
    
    Service Name: Human Interface Device
    Service RecHandle: 0x10008
    Service Class ID List:
      "Human Interface Device" (0x1124)
    
    osumi@raspberrypi:~ $ sudo sdptool records C9:0B:89:87:CC:4C
    Service Name: Device Identification
    Service RecHandle: 0x10001
    Service Class ID List:
      "PnP Information" (0x1200)
    
    Service Name: SPP SERVER
    Service RecHandle: 0x10002
    Service Class ID List:
      "Serial Port" (0x1101)
    Protocol Descriptor List:
      "L2CAP" (0x0100)
      "RFCOMM" (0x0003)
        Channel: 2
    Profile Descriptor List:
      "Serial Port" (0x1101)
        Version: 0x0102
    
    Service Name: A2DP Sink
    Service RecHandle: 0x10006
    Service Class ID List:
      "Audio Sink" (0x110b)
    
    Service Name: AVRCP Controller
    Service RecHandle: 0x10007
    Service Class ID List:
      "AV Remote" (0x110e)
      "AV Remote Controller" (0x110f)
    
    Service Name: Human Interface Device
    Service RecHandle: 0x10008
    Service Class ID List:
      "Human Interface Device" (0x1124)
    
    osumi@raspberrypi:~ $ sudo rfcomm -a
    rfcomm0: C9:0B:89:87:CC:4C channel 1 closed 
    osumi@raspberrypi:~ $ sudo cat /dev/rfcomm0
    
  2. bluetoothd-Cオプションが必要という記事があったので、試しに以下のコマンドを試してもらえないでしょうか?

    sudo rfcomm release all
    sudo systemctl stop bluetooth
    sudo bluetoothd -C & #for background
    sudo hciconfig hci0 up
    sudo sdptool add SP
    sudo rfcomm bind 0 C9:0B:89:87:CC:4C
    sudo rfcomm -a
    sudo cat /dev/rfcomm0
    
  3. @daigouin

    Questioner

    コメントありがとうございます。

    コメントに頂いたコマンドを試したですが、
    sudo rfcomm -a の結果は変わらず、closedとなっていました。
    以下にコマンドの結果を添付いたしますので、ご確認いただけますと幸いです。

    osumi@raspberrypi:~ $ sudo rfcomm release all
    osumi@raspberrypi:~ $ sudo systemctl stop bluetooth
    osumi@raspberrypi:~ $ sudo bluetoothd -C &
    [1] 2216
    osumi@raspberrypi:~ $ sudo hciconfig hci0 up
    osumi@raspberrypi:~ $ sudo sdptool add SP
    Serial Port service registered
    osumi@raspberrypi:~ $ sudo rfcomm bind 0 C9:0B:89:87:CC:4C
    osumi@raspberrypi:~ $ sudo rfcomm -a
    rfcomm0: C9:0B:89:87:CC:4C channel 1 closed 
    osumi@raspberrypi:~ $ sudo cat /dev/rfcomm0
    
  4. そもそもですが、無線IMUとRaspberry Piはペアリングできているのですよね?
    ペアリングさせた時のコマンド、ペアリングを確認したコマンドと、その結果を貼ってください。

  5. @daigouin

    Questioner

    コメントありがとうございます。
    ペアリングを行うまでのコマンドと出力結果を以下に記載しました。
    出力の中に、不要な情報が非常に多く表示されていたため、
    今回の件に必要と思われる結果だけ、抽出して記載しております。
    もし、省略しない結果が必要な場合は、もう一度送りますので、
    お気兼ねなくおっしゃってください。

    osumi@raspberrypi:~ $ bluetoothctl
    Agent registered
    [bluetooth]# scan on
    〜
    [NEW] Device C9:0B:89:87:CC:4C AMWS020_RP1B002597
    〜
    [bluetooth]# pair C9:0B:89:87:CC:4C
    Attempting to pair with C9:0B:89:87:CC:4C
    Pairing successful
    [bluetooth]# connect C9:0B:89:87:CC:4C
    Attempting to connect to C9:0B:89:87:CC:4C
    [CHG] Device C9:0B:89:87:CC:4C Connected: yes
    Connection successful
    [CHG] Device C9:0B:89:87:CC:4C ServicesResolved: yes
    

    接続する際は、Bluetoothctlを用いて接続しており、
    Connection successful と表示されていることから、
    接続されていると認識しております。
    もし、BluetoothがIMUと接続されていない場合は、
    IMUの電源が一定の時間で切れるように設定されているのですが、
    その時間を過ぎても、電源は入ったままであることから接続されているものと
    考えられます。

    また、デスクトップのBluetoothアイコンを確認すると、
    赤いバツマークではなく、緑のチェックマークであることから、
    正常に接続されているものと考えています。

    また、何か気になることがございましたら、
    お気軽にコメントしていただけますと幸いです。

  6. [bluetooth]# connect C9:0B:89:87:CC:4C

    connectは必要でしょうか?


    無線IMU(AMWS020)を持ち合わせていないので、代わりに Raspberry Pi Pico W に Bluetooth Serial のプログラムを入れて、Raspberry Pi 4B と接続してみました。結果、問題なく送受信できました。以下に Raspberry Pi 4B でのコマンド履歴を示しますので、参考にしてください。不要な情報はカットしています。
    (connectは使用していません)

    ~ $ ssh pi4user@raspberrypi4.local
    pi4user@raspberrypi4.local's password: 
    Last login: Sat Oct  5 20:30:59 2024 from 240f:38:e307:1:64fa:8c0:243:9f13
    
    pi4user@raspberrypi4:~ $ lsb_release -a
    No LSB modules are available.
    Distributor ID:	Debian
    Description:	Debian GNU/Linux 11 (bullseye)
    Release:	11
    Codename:	bullseye
    
    pi4user@raspberrypi4:~ $ uname -a
    Linux raspberrypi4 6.6.40-v8+ #1784 SMP PREEMPT Tue Jul 16 13:53:31 BST 2024 aarch64 GNU/Linux
    
    pi4user@raspberrypi4:~ $ sudo bluetoothctl
    Agent registered
    [CHG] Controller E4:5F:01:AF:B5:2B Pairable: yes
    
    [bluetooth]# scan on
    Discovery started
    [CHG] Controller E4:5F:01:AF:B5:2B Discovering: yes
    [NEW] Device 28:CD:C1:0B:60:7F PicoW Serial 28:CD:C1:0B:60:7F
    
    [bluetooth]# scan off
    Discovery stopped
    [CHG] Device 28:CD:C1:0B:60:7F RSSI is nil
    [CHG] Controller E4:5F:01:AF:B5:2B Discovering: no
    
    [bluetooth]# pair 28:CD:C1:0B:60:7F
    Attempting to pair with 28:CD:C1:0B:60:7F
    [CHG] Device 28:CD:C1:0B:60:7F Connected: yes
    Request confirmation
    [agent] Confirm passkey 565500 (yes/no): yes
    [CHG] Device 28:CD:C1:0B:60:7F Connected: no
    [CHG] Device 28:CD:C1:0B:60:7F Paired: yes
    Pairing successful
    
    [bluetooth]# exit
    
    pi4user@raspberrypi4:~ $ sudo rfcomm -r -M -L 0 bind 0 28:CD:C1:0B:60:7F
    pi4user@raspberrypi4:~ $ sudo rfcomm -a
    rfcomm0: 28:CD:C1:0B:60:7F channel 1 clean 
    
    pi4user@raspberrypi4:~ $ sudo apt install -y screen
    pi4user@raspberrypi4:~ $ screen /dev/rfcomm0 115200
    〜送受信〜
    [screen is terminating]
    
    pi4user@raspberrypi4:~ $ sudo rfcomm release 0
    pi4user@raspberrypi4:~ $ sudo rfcomm bind 0 28:CD:C1:0B:60:7F
    pi4user@raspberrypi4:~ $ sudo rfcomm -a
    rfcomm0: 28:CD:C1:0B:60:7F channel 1 clean 
    
    pi4user@raspberrypi4:~ $ cat /dev/rfcomm0 #受信のみ
    BBBBB^C
    
    pi4user@raspberrypi4:~ $ sudo bluetoothctl
    Agent registered
    [CHG] Controller E4:5F:01:AF:B5:2B Pairable: yes
    
    [bluetooth]# paired-devices
    Device 28:CD:C1:0B:60:7F PicoW Serial 28:CD:C1:0B:60:7F
    
    [bluetooth]# info 28:CD:C1:0B:60:7F
    Device 28:CD:C1:0B:60:7F (public)
    	Name: PicoW Serial 28:CD:C1:0B:60:7F
    	Alias: PicoW Serial 28:CD:C1:0B:60:7F
    	Class: 0x007a020c
    	Icon: phone
    	Paired: yes
    	Trusted: no
    	Blocked: no
    	Connected: no
    	LegacyPairing: no
    
    [bluetooth]# exit
    pi4user@raspberrypi4:~ $ 
    
  7. @daigouin

    Questioner

    いつもコメントしていただき、誠にありがとうございます。
    いただいたコメントをもとに調査しましたので、ご確認お願いいたします。

    ・connectは必要でしょうか?
    →調べたところ、connectを実行することによって、Bluetoothデバイスと接続されます。
    確かに、一度接続されれば毎回connectを行わずとも自動で接続されるものもあるようですが、
    私が使用しているものは、自動で接続するためにはそのための設定を行う必要があると考えられます。
    また、connectを実行することによって、Bluetoothデバイスとのシリアル通信ができなくなることは考えにくく、
    むしろ、接続状態にするために必要なステップであるようです。

    コメントにいただいた、コマンドを参考にconnectを実行せずに行いましたが、
    catコマンドで止まってしまったため、デバイスとの接続が上手くいっていないと考えられます。
    Bluetoothctlのinfoから、シリアル通信プロファイル(SPP)が使用可能かも確認しましたが、

    UUID: Serial Port               (00001101-0000-1000-8000-00805f9b34fb)
    

    があることから、デバイスがSPPをサポートしていることが確認できています。

    また、connectを実行した後に、もう一度コマンドを実行してみましたが、
    先程と同様にcatコマンドで停止してしまいました。
    以下に、コマンドの出力結果を記載しますので、何かお気づきになったことがあれば、
    コメントいただけますと幸いです。

    家庭の都合により、10/10まで研究室に向かうことができないため、
    11日まで返信することができかねることをご了承ください。
    以上、よろしくお願いいたします。

    osumi@raspberrypi:~ $ lsb_release -a
    No LSB modules are available.
    Distributor ID:	Raspbian
    Description:	Raspbian GNU/Linux 11 (bullseye)
    Release:	11
    Codename:	bullseye
    osumi@raspberrypi:~ $ uname -a
    Linux raspberrypi 6.1.21-v7l+ #1642 SMP Mon Apr  3 17:22:30 BST 2023 armv7l GNU/Linux
    osumi@raspberrypi:~ $ sudo bluetoothctl
    Agent registered
    [AMWS020_RP1B002597]# paired-devices
    Device 5C:56:A4:93:58:BA Soundcore Life P2 Mini
    Device C9:0B:89:87:CC:4C AMWS020_RP1B002597
    [AMWS020_RP1B002597]# exit
    osumi@raspberrypi:~ $ sudo rfcomm -r -M -L 0 bind C9:0B:89:87:CC:4C 
    osumi@raspberrypi:~ $ sudo rfcomm -r -M -L 0 bind 0 C9:0B:89:87:CC:4C
    osumi@raspberrypi:~ $ sudo rfcomm -a                                 
    rfcomm0: C9:0B:89:87:CC:4C channel 1 clean 
    osumi@raspberrypi:~ $ cat /dev/rfcomm0
    
    #デバイスの情報
    [AMWS020_RP1B002597]# info C9:0B:89:87:CC:4C
    Device C9:0B:89:87:CC:4C (public)
    	Name: AMWS020_RP1B002597
    	Alias: AMWS020_RP1B002597
    	Class: 0x00001f00
    	Paired: yes
    	Trusted: yes
    	Blocked: no
    	Connected: yes
    	WakeAllowed: no
    	LegacyPairing: no
    	UUID: Serial Port               (00001101-0000-1000-8000-00805f9b34fb)
    	UUID: Audio Sink                (0000110b-0000-1000-8000-00805f9b34fb)
    	UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
    	UUID: Human Interface Device... (00001124-0000-1000-8000-00805f9b34fb)
    	UUID: PnP Information           (00001200-0000-1000-8000-00805f9b34fb)
    	Modalias: bluetooth:v0131pFFFFdFFFF
    
    #connect実行後の結果
    osumi@raspberrypi:~ $ bluetoothctl
    Agent registered
    [bluetooth]# connect C9:0B:89:87:CC:4C
    Attempting to connect to C9:0B:89:87:CC:4C
    [CHG] Device C9:0B:89:87:CC:4C Connected: yes
    Connection successful
    [CHG] Device C9:0B:89:87:CC:4C ServicesResolved: yes
    [AMWS020_RP1B002597]# exit
    osumi@raspberrypi:~ $ lsb_release -a
    No LSB modules are available.
    Distributor ID:	Raspbian
    Description:	Raspbian GNU/Linux 11 (bullseye)
    Release:	11
    Codename:	bullseye
    osumi@raspberrypi:~ $ uname -a
    Linux raspberrypi 6.1.21-v7l+ #1642 SMP Mon Apr  3 17:22:30 BST 2023 armv7l GNU/Linux
    osumi@raspberrypi:~ $ sudo rfcomm -r -M -L 0 bind 0 C9:0B:89:87:CC:4C
    osumi@raspberrypi:~ $ sudo rfcomm -a
    rfcomm0: C9:0B:89:87:CC:4C channel 1 clean 
    osumi@raspberrypi:~ $ cat /dev/rfcomm0
    
    
  8. catコマンドで止まってしまったため、デバイスとの接続が上手くいっていないと考えられます。

    catで停止するのは、問題では無い気がします。
    (catする直前の状態)その状態で、冒頭のPythonコードを実行すると、当初と同じエラーなのでしょうか?

  9. @daigouin

    Questioner

    只今、検証してみたところ、同様に以下のようなエラーコードが出てしまいます。

    例外が発生しました: SerialException
    device reports readiness to read but returned no data (device disconnected or multiple access on port?)
      File "/home/osumi/Desktop/program09_2024/AMWS.py", line 46, in <module>
        ser.read(1000)
    serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
    
  10. osumi@raspberrypi:~ $ sudo rfcomm -a
    rfcomm0: C9:0B:89:87:CC:4C channel 1 clean

    以前のように closed では無いので、
    試しに、connect せずに Pythonコードを実行することはできないでしょうか?

  11. @daigouin

    Questioner

    コメントありがとうございます。

    以前の出力結果から、connectを実行しない場合とする場合どちらにおいても、

    osumi@raspberrypi:~ $ sudo rfcomm -a
    rfcomm0: C9:0B:89:87:CC:4C channel 1 clean
    

    となっていることから、シリアル通信ができそうではあるのですが、
    やはりプログラムを実行すると、先ほどと同様のエラーが出てしまいました。

  12. device reports readiness to read but returned no data (device disconnected or multiple access on port?)

    これ以上は実機(AMWS020)が無いと調べようが無いです。
    お役に立てずすみません。

  13. @daigouin

    Questioner

    nak435様
    問題解決のため、何度も解決策を提案していただき誠にありがとうございました。
    一人で悩んでいたので、一緒に考えていただいて非常に嬉しかったです。

    もし、よろしければnak435様にお聞きしたいのですが、
    ラズベリーパイなどの実機を用いた、
    プログラムスキルはどの様にして培われたのでしょうか?
    私は研究のために必要なのですが、周りにそういったスキルを持つ人がおらず、
    独学でなんとかしようとしている状態なので、
    もし、学ぶにあたって参考にした書物やサイト、動画などがありましたら
    ご教示いただけますと幸いです。

    以上、よろしくお願いいたします。

  14. ごめんなさい。余りにも年代が掛け離れているので、それには答え難いです。
    具体的な疑問・質問には、答えられる範囲でご協力します。

  15. @daigouin

    Questioner

    そうだったのですね。
    では、少し気になったことがあるのでお伺いしたいです。

    実機がないとこれ以上調べようがないと仰っていましたが、実機がもし手元にあった場合、nak435様であればどういったことを調べるか教えていただきたいです。

  16. 実機がもし手元にあった場合、nak435様であればどういったことを調べるか教えていただきたいです。

    Windowsで通信できて、Linux(Debian)で通信できない理由を究明するために、
    AMWS020の仕様を理解した上でWindowsで通信してみて、実際の動作を確かめたいですね(Pythonコードに問題がないかも検証)。

    ペアリングできている段階で、最初の通信はできているはずなので・・・

  17. @daigouin

    Questioner

    コメントありがとうございます。

    Windowsでは、自分がやりたいと考えている、加速度と角速度に関する数値が得られるんですが、Linuxだとどうしてもシリアル通信の段階で止まってしまいます。
    本当にシリアル通信さえできてしまえば、研究は可能であると思っています。

    販売元に問い合わせしても、Linuxでのシリアル通信は可能であるが、やり方について説明することはできかねるとのことで行き詰まっている状態です。

  18. よくみると、冒頭のPythonコードは、メーカーが公開しているサンプルコードだったんですね。

    それのser.portで指定するポート(デバイス)以外は、まったく改変せずそのまま用いて実行して発生した例外を、メーカーに問い合わせることはしたのでしょうか?
    「使い方」を問い合わせるのではなく、「サンプルコードで障害が起きること」を問い合わせる。サンプル提供なので、問い合わせても、それ以上のサポートはしてもらえないかも知れませんが。

    残るは、有償のサポートサービスを契約してサポートを得るぐらいですが、そういった有償サポートサービスをメーカーが提供していないなら、それ以上は難しいですね。


    逆の発想で、Windowsでは研究ができない理由はなんでしょうか?

  19. @daigouin

    Questioner

    コメントありがとうございます。

    メーカーには、冒頭の質問と同じことを問い合わせたのですが、
    メーカーのサンプルコードはWindowsでは成功しているため、
    デバイスには問題はなく、プログラムについては問い合わせの対象外とのことです。

    Windowsで研究を進めることが不可能というわけではないのですが、
    もし、Windowsで研究を進める場合、WindowsPCに指令を送信するための端子を発注して、
    PCに取り付けて、その端子に合ったプログラムを作成する必要があると考えています。
    今からでも簡単に進めることがであれば、Windowsで進めたいのですが、
    Windowsの端子を利用した機構の開発については私含め教授や周りの生徒も含めても、
    わかる者がいないため、費用と時間を大幅に割いたうえで、できない可能性があります。

    今まで作成してきたモータを制御するプログラムは、
    ラズベリーパイのピンを用いてデジタル信号を送信して指令を出すものであり、
    ラズベリーパイの中だけで完結するのであれば、時間もコストもかからないため、
    今年までに研究を実現させるため、極力ラズベリーパイで行いたいと考えています。

    nak435様はPCとデバイスをケーブル接続させて、
    デバイスに指令を与えて動作させるといったご経験はありますでしょうか?
    もし、ご経験がありましたら、習得にどれくらいの期間を要するか、
    ご教示いただけますと幸いです。

  20. PCとデバイスをケーブル接続させて、
    デバイスに指令を与えて動作させるといったご経験はありますでしょうか?

    近い経験はあります。
    例えば、以下の記事が参考になります。

    Pythonが読み書きできるなら、それほど難易度は高くないのではと思います。

  21. @daigouin

    Questioner

    コメントありがとうございます。

    記事を紹介していただき、誠にありがとうございます。
    添付していただいた記事を拝見しましたが、
    現在のプログラムのピンの指定の仕方などを修正すれば、
    そこまで難易度は高くないように思えます。

    私が研究で使用しているラズパイは、
    Raspberry Pi4 model Bなのですが、USB-C to USB-Aケーブルを用いて、
    接続すれば記事のような制御が可能になるのでしょうか?
    nak435様は、どのデバイスとPCを用いて、
    どのようなケーブルを用いて行ったかご教示いただけますと幸いです。

  22. 紹介した記事のデバイスは、パソコン(PC)にGPIOの機能を持たせるデバイスですので、
    Adafruit FT232H であれば、デバイス側はUSB-C、PC側は、PCの事情でUSB-AかUSB-Cになるので、USB-C=USB-Cケーブルか、USB-C=USB-AケーブルのどちらかでPCと接続します。

  23. @daigouin

    Questioner

    コメントありがとうございます。
    ラズベリーパイを用いた場合でも可能であると勘違いをしていました。

    私がラズベリーパイを使用している別の理由の一つとして、
    モータの状態をエンコーダからラズベリーパイに取り付けたカウンタ回路に送り、
    パルスカウントで回転情報を把握することで回転制御を行っている
    という理由もあります。

    ご紹介いただいたデバイスにエンコーダを接続することで、
    WindowsPC内でパルスをカウントが可能であるのかが判断できないため、
    WindowsPCでの制御で進めていいのか迷っています。
    モータのエンコーダのようなパルスカウントをPCで行った経験はお持ちですか?
    もし、ご経験がありましたらご教示いただけますと幸いです。

  24. ラズベリーパイを用いた場合でも可能であると勘違いをしていました。

    もちろん、Raspberry Pi 4B に接続して使うこともできます。ただし、Raspberry Pi 4B には GPIO があるので、わざわざこのデバイスを使うメリットが無いと思います。

    ご紹介いただいたデバイスにエンコーダを接続することで、
    WindowsPC内でパルスをカウントが可能であるのかが判断できない

    パルスをカウントを受け取る方法は、GPIOのデジタル入力かアナログ入力でしょうか?
    SPIとか他の方法だとしても、Raspberry Pi 4B の GPIO でできることは同様にこのデバイスでできるはずです。

    モータのエンコーダのようなパルスカウントをPCで行った経験はお持ちですか?

    エンコーダ付きのモータを扱った経験はありませんが、ジャイロセンサーやモータドライバは扱ったことがあります。GPIOによる入出力(デジタル、アナログ、SPI、I2C、UART)は一通り扱えます。

コメントありがとうございます。
WindowsPCでもできる可能性があることを教えていただきありがとうございます。

Raspberry Pi 4B に接続して使うことも可能とのことですが、
それはSSH接続によるものでしょうか?
以前、SSH接続を行おうとした際に、調べた手順の通りに行ったのですが、
結局接続することができなかったため、SSH接続をしない状態で使用しています。
もし、Adafruit FT232H のような方法でできるのであれば試したいのですが、
調べたところ、SSH接続かリモートデスクトップのやり方しか検索にかからないため、
もし、Adafruit FT232H のような方法で可能であるのかご存じでしたら、
ご教示いただけますと幸いです。

・パルスをカウントを受け取る方法は、GPIOのデジタル入力かアナログ入力でしょうか?
→デジタル入力で行っています。
現在使用しているものは、通常のラズベリーパイの上にCPI-CNT-3201I
というカウンタボードを取付け、このカウンタボードにエンコーダを接続することで、
パルスをカウントしています。

0Like

Comments

  1. Raspberry Pi 4B に接続して使うことも可能とのことですが、
    それはSSH接続によるものでしょうか?

    この質問は、Adafruit FT232H を Raspberry Pi 4B に接続して使うときの、Adafruit FT232H と Raspberry Pi 4B との接続のことを指しているのでしょうか?
    それは、以前の質問で回答した通り、「USB-C=USB-Aケーブル」になります。

    SSH接続は、Raspberry Pi 4B と PCを接続して、コマンドを入力したり、プログラムを実行したりするときに使います。
     

    SSH接続かリモートデスクトップのやり方しか検索にかからないため、
    もし、Adafruit FT232H のような方法で可能であるのかご存じでしたら

    これは、Raspberry Pi 4B と PC を接続する場合のことでしょうか?
    (質問が噛み合っていない感じがします。)
    Raspberry Pi 4B と PC を接続する場合は、SSH か VNC(リモートデスクトップ)だと思います。
     

    通常のラズベリーパイの上にCPI-CNT-3201I
    というカウンタボードを取付け、このカウンタボードにエンコーダを接続することで、
    パルスをカウントしています。

    URLを参照しました。CPI-CNT-3201I は、Raspberry Pi 4B に重ねて使うように基板が設計されており、これを Raspberry Pi 4B 以外で使うことは、ハードルが高いです(使えない可能もある)。
    これは、 Raspberry Pi 4B で使うことを前提とした方がいいと思います。


    質問者さんの根本の問題は解決していないことは承知していますが、
    質問の内容が、当初Q&Aの内容から外れてきているので、一旦、当Q&Aをクローズして、改めて直近のQ&Aをアップするのがよいと思います。
    または、自分のプロフィールに公開している、こちらのメアドqiita@nak435.comに直接連絡をいただければ、これまでの続きでお答えいたします。

  2. @daigouin

    Questioner

    コメントありがとうございます。
    Raspberry Pi 4B と WindowsPC を接続する場合についての質問でした。
    Adafruit FT232HとWindowsPCを接続させるように、PCとRaspberry Pi 4Bを
    ケーブルで接続してライブラリを準備すれば、SSH接続を行わずとも、
    GPIOとカウンタボードを使用することが可能であれば、
    その手法で行いたいと考えていました。

    ご助言ありがとうございます。
    もう一度Q&Aでアップしようと思います。

  3. Adafruit FT232HとWindowsPCを接続させるように、PCとRaspberry Pi 4Bを
    ケーブルで接続して

    そういう構成でしたか。読解力が弱くてすみません。

    PCとRaspberry Pi 4Bをなんらかの方法で接続して、Raspberry Pi 4Bの先にあるカウンタボードを、PCから制御したいということですね。

    無線IMU=(Bluetooth)=WindowsPC=(X)=RaspberryPi4B =(GPIO)=カウンタボード

    PCとRaspberry Pi 4Bの接続(X)には、いくつか方法がありますが、どの方法も、PCとRaspberry Pi 4Bの双方にプログラムの作り込みが必要です。

    (X)例えば、Bluetooth、 無線LAN(WiFi)、有線LAN、USB直接(ほぼ無理)、UART(適当なUSB-Serial変換が必要)

    UARTの場合、
    無線IMU=(Bluetooth)=WindowsPC={ (USB)=USB-Serial変換 }=(GPIO)=RaspberryPi4B =(GPIO)=カウンタボード

    なお、経由装置が多いので、エンドーエンド間の遅延時間がそれなりに発生します。
    (WindowsPC=RaspberryPi4B 間の情報量(秒あたりの通信量)はどれほどか?)

    当Q&Aの回答は、以上とします。

Your answer might help someone💌