KeiganMotorを複数接続する場合の注意点
2020年3月17日現在、以下条件においてKeiganPiが起動しない問題を確認しています。
KeiganPiが起動しない
以下●を満たした状態でKeiganPiを起動しようとすると起動しません。
●KeiganPiのUSBポート4ヶ所の内、2ヶ所以上にKeiganMotorを接続している。
●接続したKeiganMotorに電源を供給し起動しておく。
また、RaspberryPiを起動後にKeiganMotorを接続する場合は問題ございません。
【その他の対策】
また、以下のようにUSBハブを経由しUSBポートの接続を1ヶ所のみにすると、上記問題は発生しなくなります。
こちらのチラシもご確認ください。
原因
複数のKeiganMotorを制御し、エンコーダーの値も取得する方法を解説します。
Windowsフォームアプリケーションによる複数同期制御につきまして、下記を参照ください。
https://docs.keigan-motor.com/software_dev/windows-c/windows-c-multi-control
基本的にKeiganMotor_USB のインスタンスを作成するためには、USBシリアルポート=COMポートを指定することになっております。
従いまして複数のKeiganMotor を扱う際には、インスタンスを複数作成する必要があります。
WindowsPC等の場合は、COMポートは一度接続されれば変更されないはずですので、COMポート指定にて、以下のように初期化してインスタンスを作成すれば目的の制御は可能と存じます。
その上で、それらを一括制御するような関数を作成下さい。
motor1 = new KeiganMotor_USB("COM1");
motor2 = new KeiganMotor_USB("COM2");
motor3 = new KeiganMotor_USB("COM3");
void moveTo(float pos1, float pos2, float pos3){
motor1.MoveToPosition(pos1);
motor2.MoveToPosition(pos2);
motor3.MoveToPosition(pos3);
}
Q
4個のKeiganMotorに個別にスレーブアドレスを設定したいと考えております。
0xB0にアドレスを変える場合は、
motor.i2cSlaveAddress(0x30);
motor.saveAllRegisters();
delay(2000);
motor.reboot()
との認識ですが、例えば0x50にアドレスを変える場合は、
motor.i2cSlaveAddress(0x10);
motor.saveAllRegisters();
delay(2000);
motor.reboot();
という0x10を左に2つシフトした形でよろしいでしょうか。
また、設定できるスレーブアドレスは0x04 ~ 0xFCでよろしいでしょうか。
(設定値を左に2シフトして選択できる範囲)
回答
仕様上は、i2cSlaveAddressの引数(0x00~0xFF)と実際に設定されるアドレスは一致することになっております。(KeiganMotor は 8bit仕様)
Arduino含む多くの機器は、I2Cライブラリのアドレスは7bitのみしか対応しておらず0x00~0x7F(127)となります。
すなわち、Arduino側では8bit目は無視されますのでKeiganMotor に 0xA0 を設定しても8bit目が桁落ちしてArduino から見ると、0x20 となります。
ですので、
motor.i2cSlaveAddress(0xB0);
motor.i2cSlaveAddress(0x30);
のいずれを行って頂いても、Arduino側では 0x30=0xB0 となります。
プログラム上は問題なく動作します。
お手数すみませんが、
motor.i2cSlaveAddress(0x20);
motor.saveAllRegisters();
delay(2000);
motor.reboot();
等のコードを一旦走らせていただき以下のページの手順にて、KeiganMotorのI2Cアドレスをご確認頂けないでしょうか。
https://docs.keigan-motor.com/advanced-usage/readallinfo
複数のKeiganMotorを接続される場合は、マスター側がArduinoであってもSDA, SCLラインにプルアップ抵抗を入れた方が良い場合があります。(例:1kΩ)
ESP32等のマイコンですとプルアップは必須です。