爪車

ArduinoでICS2.0制御の実験

Arduinoで近藤科学のICS2.0対応サーボ(KRS-4014)をシリアル制御してみました。

コマンドを送信してひとつのサーボを動かすだけの実験です。
一応うまくいきましたが、ArduinoでのICS2.0制御はあまりお勧めできないので、参考程度にしてください。
実際に実験される際は十分に注意してください。

この実験で使用したArduinoのバージョンはArduino-0016で、ArduinoボードはATMEGA 328を搭載しているArduino Duemilanoveです。
シリアル通信の設定をする際に、ATMEGA 328のレジスタを直接操作しているので、これ以外の環境では動作しないと思います。
Arduinoでは、レジスタの直接の操作は、さまざまな問題を引き起こすので推奨されませんが、通常のArduino言語ではできないことなので仕方なくです。

・Arduinoとサーボの接続
単線双方向シリアルの接続回路はベストテクノロジーさんのブログの
ATmega128マイコンボードとAXモータとの接続#1
ATmega128マイコンボードとAXモータとの接続#2
を参考にしました。

紹介されている回路をまとめるとこんな感じになります。

74HC241
TC74HC241AP
DIR-CTRLは送受信切替です。Hレベルで送信、Lレベルで受信となります。

実際にArduinoと接続するとこんな感じです。
DSCN0936.jpg
今回は信号の送信の実験だけなのでDIR-CTRLはHレベルに固定しています。
送受信の切替をするならばDIR-CTRLをマイコンで制御します。
サーボへの電源は外部の安定化電源を用いています。
Arduino、サーボ、外部電源のグランドは忘れずに接続します。信号線だけサーボに接続しても動きません。

・Arduinoのスケッチ
//Arduino 0016
// ID:0のサーボを20ms周期で制御

// スケッチここから

#define SERVO_MIN 3500 // サーボ最小動作角(-135度)
#define SERVO_CENTER 7500 // サーボ中心角(0度)
#define SERVO_MAX 11500 // サーボ最大動作角(+135度)

float theta = 0.0;

void setup() {
Serial.begin(115200);
// USART動作設定 非同期動作 ビット長8bit ストップ1bit パリティEVEN(偶数)
UCSR0C = (0<<UMSEL00) | (3<<UCSZ00) | (0<<USBS0) | (1<<UPM01) | (0<<UPM00);
}

void ics2_set_pos(unsigned int id, unsigned int position) {
byte cmd, pos_h, pos_l;

// CMD コマンドとID
cmd = (byte)(128 + id);

// POS サーボの設定舵角
pos_h = (byte)(position / 128); // 上位7bit
pos_l = (byte)(position % 128); // 下位7bit

// 1バイトのデータとして送信
Serial.print(cmd, BYTE);
Serial.print(pos_h, BYTE);
Serial.print(pos_l, BYTE);

}

void loop() {
ics2_set_pos(0, SERVO_CENTER + (unsigned int)(1000*sin(theta)));
theta += 0.05;
delay(20); // 20ms一時停止
}

// スケッチここまで

ICS2.0通信するためシリアル通信の設定をします。
ICS2.0の通信条件は
通信速度 115200bps
ビット長 8bit
スタート 1bit
ストップ 1bit
フロー制御 無し
パリティ EVEN(偶数)
です。
これらの設定は通常のArduino言語ではできません。
そこでATmega328のレジスタを直接操作して設定することになります。
// USART動作設定 非同期動作 ビット長8bit ストップ1bit パリティEVEN(偶数)
UCSR0C = (0<<UMSEL00) | (3<<UCSZ00) | (0<<USBS0) | (1<<UPM01) | (0<<UPM00);

このレジスタ操作はArduinoボードに搭載されているマイコンがATMEGA328の場合です。

Arduinoボードへスケッチをアップロードする際は回路を接続しないでください。接続したままだと正しくアップロードされません。

アップロード後に回路を接続して、サーボを動作させてください。
うまくいけばサーボが動作するはずです。
サーボがPWMモードになっていると動かないことがあるので、事前に近藤科学純正のICS USBアダプターを用いてPWMモードをオフにしておいたほうがいいです。

コマンドの送信後に、サーボから返信がありますので、続けてコマンドを送る際は適切なウエイトを入れます。最低でも1msは必要です。

Arduinoでロボットカー

Arduinoで制御するロボットカーを作りました。
ライントレースするわけでもなく、ただ動くだけのロボットです。

DSCN0750.jpg

先日作製した連続回転サーボにタイヤを取り付けます。
雨の中、タイヤを探しに買い物に行ったのですが、適当なものが見つからず、家にあるもので代用することにしました。
やっと見つけた円盤状のものが、MDのディスクです。
タイヤとしての用途には向いていないですが、他に適当なものが見つからなかったので、これを使います。
MDの殻を壊し、中のディスクを取り出します。
音楽の再生はできなくなりますが、MDプレイヤーが壊れてから以来、使わなくなってたので問題ないです。

DSCN0742.jpg

今回の制作に用いたものです。家にあった寄せ集めです。

DSCN0744.jpg

車体として使うアクリルケースに、両面テープでサーボとキャスターを取り付けます。

DSCN0745.jpg

アクリルケースの中にArduinoとブレッドボードを入れて完成です。
アクリルケースにはもともと配線引き出し用の穴が開いていたので、そこからケーブルを引き出しています。

DSCN0747.jpg

ArduinoボードにはUSBだけでなく、外部電源も接続しています。USBによる給電だけだと、サーボの動作による影響を受けて、勝手にArduinoがリセットしてしまい、安定動作しません。
外部電源として9VのACアダプタを接続すると安定動作するようになりました。

Top

HOME

tsumehashi

Author:tsumehashi
FC2ブログへようこそ!

08 | 2017/09 | 10
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30