元高専生のロボット作り

元高専生のロボット作り

主にプログラミング, 電子系について書きます。たまに機械系もやります。メモ代わりの記事ばっか書きます

Bluetooth角度センサーWT901CLをpythonで受信する

前回のJY901が楽しかったので、bluetoothモジュールのものも買ってみました。BWT901CLって名前らしいです。

加速度、ジャイロ、磁気の9軸センサーです。 勝手に角度とかも計算して出力してくれます。

充電してから使用するので、コードレスで角度などを取得することができます。

値の取得にはBluetoothを使用します。

Bluetooth 2.0 BWT901CL センサー 3 軸角度 + 加速度 + ジャイロ + 電子コンパス MPU9250 モジュール傾斜計 Pc/ アンドロイド - AliExpress | Alibaba グループ上の 家電製品 からの スマート アクティビティー トラッカー の中

amazonでも売ってた

届いたものがこれです。センサ本体と充電用ケーブル、あとUSB-TTLですね。

f:id:sgrsn1711:20180214201954j:plain

使用する前にPCとペアリングをします。

設定→Bluetoothとその他のデバイスBluetoothまたはその他のデバイスを追加する から

バイスの種類はBluetoothを選択してください。

センサの電源が入っていれば、HC-06というデバイスが選択肢にあるはずなので、クリックしてください。

PINコードは1234です。

ペアリングが完了したらCOMポートを確認しましょう。

Bluetoothとその他のデバイス→その他のBluetoothオプションをクリックし、COMポートのタブで確認できます。

発信と受信で2つありますが発信の方のCOMポートを使用すれば大丈夫です。

これでセンサから受信できます。受信プログラムはpythonで書きました。

コード(COMポートは使用しているものに編集してください。私はCOM5でした)

from serial import Serial

class BWT901(Serial):
    def __init__(self, Port):
        self.myserial = super().__init__(Port, baudrate = 9600, timeout = 1)
        while True:
            data = super(BWT901, self).read(size=1)
            if data == b'\x55':
                print("success!")
                super(BWT901, self).read(size=10)
                break
            print("trying", data)

    def readData(self):
        try:
            for i in range(6):
                data = super(BWT901, self).read(size=11)

                if not len(data) == 11:
                    print('byte error:', len(data))

                #Time
                if data[1] == 0x50:
                    self.YY = data[2]
                    self.MM = data[3]
                    self.DD = data[4]
                    self.hh = data[5]
                    self.mm = data[6]
                    self.ss = data[7]
                    self.ms = int.from_bytes(data[8:10], byteorder='little')
        
                #Acceleration
                if data[1] == 0x51:
                    self.accel_x = int.from_bytes(data[2:4], byteorder='little')/32768.0*16
                    self.accel_y = int.from_bytes(data[4:6], byteorder='little')/32768.0*16
                    self.accel_z = int.from_bytes(data[6:8], byteorder='little')/32768.0*16
                    self.Temp = int.from_bytes(data[8:10], byteorder='little')/340.0+36.25

                #Angular velocity
                elif data[1] == 0x52:
                    self.angular_velocity_x = int.from_bytes(data[2:4], byteorder='little')/32768*2000
                    self.angular_velocity_y = int.from_bytes(data[4:6], byteorder='little')/32768*2000
                    self.angular_velocity_z = int.from_bytes(data[6:8], byteorder='little')/32768*2000
                    self.Temp = int.from_bytes(data[8:10], byteorder='little')/340.0+36.25

                #Angle
                elif data[1] == 0x53:
                    self.angle_x = int.from_bytes(data[2:4], byteorder='little')/32768*180
                    self.angle_y = int.from_bytes(data[4:6], byteorder='little')/32768*180
                    self.angle_z = int.from_bytes(data[6:8], byteorder='little')/32768*180

                #Magnetic
                elif data[1] == 0x54:
                    self.magnetic_x = int.from_bytes(data[2:4], byteorder='little')
                    self.magnetic_y = int.from_bytes(data[4:6], byteorder='little')
                    self.magnetic_z = int.from_bytes(data[6:8], byteorder='little')

                #Data output port status
                elif data[1] == 0x55:
                    self.D0 = int.from_bytes(data[2:4], byteorder='little')
                    self.D1 = int.from_bytes(data[4:6], byteorder='little')
                    self.D2 = int.from_bytes(data[6:8], byteorder='little')
                    self.D3 = int.from_bytes(data[8:10], byteorder='little')

        except KeyboardInterrupt:
            super(BWT901, self).close()

    def getAngle(self):
        self.readData()
        return (self.angle_x, self.angle_y, self.angle_z)

if __name__ == "__main__":

    jy_sensor =  BWT901("COM5")
    while True:
        print(jy_sensor.getAngle())

センサーの電源を入れた後(要充電)、プログラムを実行すればロール、ピッチ、ヨーの角度が表示されたと思います。(実行してから数秒待ってください)