ベステクには過電圧で壊れたUSBポートを持ったPCが何台かあったりします・・・。小綺麗にPCを使っている方にはあまり遭遇する事は無い事ですが、USBポートは電気的にブチ壊れる事があります。RS-485及び1ワイヤTTLシリアルドングル
また、開発中のボードを活線状態ICEでつなごうとすると、ぱちっと静電気が飛んでPCがフリーズしたりICEが逝ってしまったり・・。
電位差がある所に電線をつなごうとすれば電流が流れようとしますので、そのときのショックを受け止め切れなければ何か起こるのは避けられず。
そういった場合にUSBポートそのものを絶縁してお茶を濁そうというのがこちらのUSBISOです。
USB 2.0 FSのみに対応してるので、残念ですがそれ以外の規格には使えません。
また、通常のバスパワーよりは目減りしますが、最大2Wまで絶縁型の電源を装備しています。
USBケーブルなしでPC直結して使用するドングル型のがあればRaspberry Piにこぢんまりと収まるというリクエストでできたのがこちらのUSB2RS485 dongleとUSB2TTL dongleです。マルチファンクションI/O
![]()
Dynamixelへの電源の供給方法はユーザにお任せと割り切り、USB-3WAYやDXHUBの各I/F部分だけを切り貼りしただけのものです。と言いたいところですが、いずれもそこそこの耐圧を持った絶縁措置を施しましたので、イザというときでもPCのUSBポートまで壊すことは無いかと。
ディスコンから長らく代替品の用意ができず申し訳ありませんでした。CPUをAtmel社のATmega168からNXP社のLPX824に変更し、必要以上に小さくしたDXMIO(RS485)とDXMIO(TTL)を用意しました。
![]()
小さくしすぎでアクセサリ用の電源容量が小さくなってしまいましたが、全端子が12bitのADコンバータ・汎用GPIOとして使用できます。
現時点ではDynamixelのプロトコルで動作するスレーブ用ファームウェア(若干貧弱ですが)を書き込んだ上で出荷します。
なお、今後GCC Developer Liteによるプログラミング環境を提供しますので、Dynamixelのホストとして機能させたり純粋なマイコンボードとして使用する事ができます。その際にはFreeRTOSをサポートしますので、小さいながらもマルチタスクの恩恵をあずかる事ができます。
いずれの場合でも送受信に使用するGPIOが2本あれば良いのですが、高速な通信となるとソフトウェアシリアルではまかない切れないため、その時だけハードウェアシリアル(ようするにUARTの端子)を使うといった感じになっています。
Arduinoと本シールドさえあればDynamixelを動かす環境が全て整いますし、自信のスケッチで利用できるライブラリと簡単なテストコードも用意しました。
もちろん、ソフトウェアさえがんばれば、同種のI/Fで制御できるサーボモータ全てで利用できます。
で、なぜ今頃昔の話を持ち出したかというと、多少ですが余剰ができたのでDXSHIELDとして製品ラインナップに載せましたという告知でした。
ご興味があれば試食してみて下さい。
技術
#include <SoftwareSerial.h>初期化部ではボーレートと後々受信処理を楽にするためのタイムアウトの設定をしておきます。SoftwareSerialは高いボーレートに対応しないため、今のうちにAX-12Aのボーレートを57143bpsに変更しておきましょう。
SoftwareSerial dxif(8, 9); // pin8 is RX, pin9 is TX
void setup() {これでSoftwareSerialで通信するための下処理は終わりです。
dxif.begin (57143);
dxif.setTimeout (50);
}
bool sendpos(uint8_t id, uint16_t pos) {ハードさえちょっと頑張れば、パケットの生成とその送受信以外に意識するところはありません。いかがだったでしょうか。
uint8_t buf[9] = {
0xff, 0xff, // header
id, // id
5, // inst
3, // size
30, // address
(uint8_t)(pos & 0xff), (uint8_t)(pos >> 8),
0
};
for (int i = 2; i < 8; i++) buf[8] += buf[i]; // calc sum
buf[8] = ~buf[8];
while (dxif.available ()) dxif.read (); // clear buffer
dxif.write (buf, 9); // send inst packet
if (dxif.readBytes (buf, 6) == 6) // read stat packet
return (buf[2] == id) && (buf[3] == 2) &&(buf[4] == 0);
return false;
}
void loop() {
sendpos (1, 0); // Set Goal Position to 0
delay (1000); // Delay 1 sec
sendpos (1, 1023); // Set Goal Position to 1023
delay (1000); // Delay 1 sec
}