北の国から

忘れたことを思い出す為の記録

Hiwonderのシリアルサーボを動かす

自分用まとめ

データシート読んで思ったけどFUTABAのサーボとほとんど同じだった

使うサーボ

LX-224

参考資料

Hiwonder公式のgoogleDriveページ

DC6-7.4V動作だけど手元に6Vの用意がないのでひとまず5V電源で試す
無理なら電源装置使う

ピン配置はコネクタを対面に見たとき左から GND / VIN / SIG で,どの面のコネクタも同じ
データ読み込む予定はなく,ひとまず動かせればいいのでTXのみをSIGにつなぐ
読み込みもするときはTriStateBufferでRXとTXを一本にまとめる/それぞれのEN用にGPIOを最低一つ用意する必要あり(どっちかをNOTする)

プロトコル

ヘッダ1 : 0x55
ヘッダ2 : 0x55
ID : 0x00~0xFD(デフォルトは1)
データ長 : ヘッダ~チェックサムまでの長さ コマンド : 下記参照 パラメータ : 下記参照 チェックサム : ID~最後のパラメータまでの加算のNOT

コマンド

角度と到達時間指定(非同期) : 0x01
P1 : 目標角度の下位8bit
P2 : 目標角度の上位8bit
P3 : 動作時間の下位8bit
P4 : 動作時間の上位8bit

目標角度は0.24deg単位で指定可能。int(P2<<8 | P1)が0~1000で指定可能
目標時間は0~30000msで指定可能
たぶん0にしたら最大角速度で動いてくれる

コマンドが届いたらすぐに動き出す。


角度と到達時間指定(同期) : 0x07
P1 : 目標角度の下位8bit
P2 : 目標角度の上位8bit
P3 : 動作時間の下位8bit
P4 : 動作時間の上位8bit

基本上と同じ。これで角度と時間を各サーボに指定した後で0x11を送ると同期して動き出すっぽい。


送信関数のイメージ

void Move(uint16_t ID, int16_t Angle, int16_t Speed){
    unit8_t TxData[10];
    checksum = 0;
    TxData[0]=0x55;
    TxData[1]=0x55;
    TxData[2]=ID;
    TxData[3]=0x08;
    TxData[4]=0x01;
    TxData[5]=(0x00FF &  Angle);
    TxData[6]=(0x00FF & (Angle>>8));
    TxData[7]=(0x00FF &  Speed);
    TxData[8]=(0x00FF& (Speed>>8));
    for(i=2;i<9;i++){
        checksum = checksum+TxData[i];
    }
    TxData[9] = !checksum;
    EN.set();
    for(i=0; i<10; i++){
        usart.send(TxData[i]);
    }
    EN.reset();
}