SpotMicro(mini) その3 ーI2Cはつらいよー [ROBOT]
Robotの動きは複数のサーボで、動きを作るわけど、それらは、勝手に動くわけがないので、制御する必要がある。
SpotMicro(mini) は、12個のサーボ、2個の距離センサ、1つのカメラ、1つの姿勢センサを持たせている。
Raspberry Pi Zero はいささか非力ではあるが、何分サイズ的なものもあり、こいつに頑張ってもらう。
サーボは、CS238MGで、4.6Kのトルクを出すために6Vで、動作させる。Raspberry Pi Zero からの信号は、I2Cバスを介して、ServoDistributer を介してどうさせる。
LCDパネルもI2Cバスでコマンドをやり取りする。
姿勢センサは、MPU9250 という9DOF IMUだが、これもI2Cを介して操作する。
最後に、近接物距離センサを2個頭の左右に乗せていて、これもI2Cで動作させる。
I2Cバスは、それぞれをI2Cアドレスで、分別する。今回の場合、アドレスの衝突が発生した。ジャイロと、AD変換センサがまず衝突。これは、ジャイロのアドレスの下位1ビットを設定することでアドレスが変更できる機能がありこれを用いて回避。
次は、2つの距離センサで、同じものを使っているわけだから当然衝突する。また、アドレス設定はできないみたい。ううんとか 思い、センサのマニュアルを見ていると、”RXDで出力を制御できる。”との記述があり、それをトランジスタ1石で、インバータを作り、それぞれのRXDに接続してある。
I2Cバスを操作するために、バスマスタから見てどのアドレスが使われているかを探知するコマンドがあり、それで確認すると認識しているので、どっちかのセンサが動いていることまでは確認できた。
もう少し、突っ込んだ確認が必要だけど、ここでいったん良しとする。
LCD:AQM1602Yは、これもI2Cで動くわけだけども、バスコントローラの電気的仕様が、Raspberry Pi とは、よろしくないらしく。PCA9515というバスリピータを用いる必要があるらしい。
最初は、Raspberry Pi ⇒Busリピータ→LCD/GYRO・その他 にして回路化した。
LCD単独(ほかのデバイスをつなげない)動かすとちゃんと動くんだけど、ほかのデバイスをつなげると、LCDのデバイスだけ見えなくなる。プルアップ抵抗のサイズをいろいろ変えてみたけど、どうもだめっぽいので、(Busリピータ+LCD)を一つのI2Cデバイスとして接続する(GYRO,PCA9685、IMU、バスリピータ)を同列に接続して、バスリピータから直接LCDに接続することとした。
このあたりは、デジタル回路ではないので、私には理屈が正直よく割らない。
これで動かない場合は、おいらとしてはどうしようもないので、LCDが多分字が出なくなるような気がします。
SpotMicro(mini) は、12個のサーボ、2個の距離センサ、1つのカメラ、1つの姿勢センサを持たせている。
Raspberry Pi Zero はいささか非力ではあるが、何分サイズ的なものもあり、こいつに頑張ってもらう。
サーボは、CS238MGで、4.6Kのトルクを出すために6Vで、動作させる。Raspberry Pi Zero からの信号は、I2Cバスを介して、ServoDistributer を介してどうさせる。
LCDパネルもI2Cバスでコマンドをやり取りする。
姿勢センサは、MPU9250 という9DOF IMUだが、これもI2Cを介して操作する。
最後に、近接物距離センサを2個頭の左右に乗せていて、これもI2Cで動作させる。
I2Cバスは、それぞれをI2Cアドレスで、分別する。今回の場合、アドレスの衝突が発生した。ジャイロと、AD変換センサがまず衝突。これは、ジャイロのアドレスの下位1ビットを設定することでアドレスが変更できる機能がありこれを用いて回避。
次は、2つの距離センサで、同じものを使っているわけだから当然衝突する。また、アドレス設定はできないみたい。ううんとか 思い、センサのマニュアルを見ていると、”RXDで出力を制御できる。”との記述があり、それをトランジスタ1石で、インバータを作り、それぞれのRXDに接続してある。
I2Cバスを操作するために、バスマスタから見てどのアドレスが使われているかを探知するコマンドがあり、それで確認すると認識しているので、どっちかのセンサが動いていることまでは確認できた。
もう少し、突っ込んだ確認が必要だけど、ここでいったん良しとする。
LCD:AQM1602Yは、これもI2Cで動くわけだけども、バスコントローラの電気的仕様が、Raspberry Pi とは、よろしくないらしく。PCA9515というバスリピータを用いる必要があるらしい。
最初は、Raspberry Pi ⇒Busリピータ→LCD/GYRO・その他 にして回路化した。
LCD単独(ほかのデバイスをつなげない)動かすとちゃんと動くんだけど、ほかのデバイスをつなげると、LCDのデバイスだけ見えなくなる。プルアップ抵抗のサイズをいろいろ変えてみたけど、どうもだめっぽいので、(Busリピータ+LCD)を一つのI2Cデバイスとして接続する(GYRO,PCA9685、IMU、バスリピータ)を同列に接続して、バスリピータから直接LCDに接続することとした。
このあたりは、デジタル回路ではないので、私には理屈が正直よく割らない。
これで動かない場合は、おいらとしてはどうしようもないので、LCDが多分字が出なくなるような気がします。
コメント 0