ロボットに搭載できるウォームギア
前編で手動でのウォームギアを作ってみましたが、今回は、360°回転サーボモータを使って実用的なロボット駆動機構(アクチュエーター)を試作したいと思います。
カーボンフィラメント
ウォームギアの特徴としてセルフロック機能がありますが、重たいものを持ち上げる場合は、造形物にある程度の強度が必要となります。いつも使っているPLA(Poly Lactic Acid-植物由来のポリエステル)は、比較的やわらかく強度が必要なものには向いていません。
そこで候補に挙がってくるのが炭素繊維(Carbon Fiber)になります。炭素繊維は軽くて丈夫な素材です。しかし、単一素材だと高価で、加工も困難なため、家庭用3Dプリンタで使用する場合は、別の素材に組み合わせて使います。
今回は、75%のナイロンと25%炭素繊維を組み合わせたものを使いました。
強度が必要なウォームとウォームホイールを炭素繊維ナイロンフィラメントで印刷しました。
ホットエンド260°、ベッドは80°で印刷しました。ナイロンが入っているためかPLAよりも粘度が高く、少し遠くから見ると非常に滑らかに仕上がっています。近くで見ると少し繊維の筋が見えます。動かしてみないと分からないですが、おそらく動作に支障はないと思います。
360°回転サーボモータ
ウォームギアは、ウォーム側のネジの回転でホイールを回すので、ウォーム側の駆動は、今まで使ってきたサーボモータのように0°~180°といった1回転未満では、しっかりと駆動させることが出来ません。そこで無限回転が出来るサーボモータが必要になります。
サーボモータを開けてストッパーを取り除き、ポテンショメーターを固定値の抵抗に変えて無限回転に改造する方法がありますが、SG90のように改造が簡単なものと、大きめのサーボモータのように改造が難しいものがあります。今回は、最初から無限回転のサーボモータを購入して使用しました。
Model: DS04-NFC データシート
重量 | 38g | |
入力電圧 | 4.8V~6.0V | ※データシートには4.8Vで記載されていました。 |
トルク | 5.5kg/cm (4.8V) | |
スピード | 0.22 s/60° ≒ 45rpm (4.8V) | |
電流 | 1000mA未満 | |
制御タイプ | JR / Futaba | |
周波数 | 50Hz / 20ms | MG90S と同じ |
反時計回り | 0°~90° (1ms~1.5ms) | 値が小さいほど回転速度が上がる |
ストップ角度 | 90°(1.5ms) | |
時計回り | 90°~180° (1.5ms~2ms) | 値が大きいほど回転速度が上がる |
テスト用の回路とプログラムで動かしてみます。
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);
#define SERVO_FRQ 50 // サーボモータの周波数
#define SERVO_MSEC 20000 // サーボモータの回転時間(μs)
#define SERVOMIN 1000 // 最小パルス幅(μs)
#define SERVOMAX 2000 // 最大パルス幅(μs)
#define SERVOSTOP 1500 // 停止パルス幅(μs)
#define PWMMIN 205 // 最小パルス幅÷回転時間×4096
#define PWMMAX 401 // 最大パルス幅÷回転時間×4096
#define ANGLEMIN 0 // 最小角度(固定)
#define ANGLEMAX 180 // 最大角度
// 360度回転サーボの仕様
// 90°が停止、0°から90°が逆時計回り、90°から180°が時計回り
// 1.5msが停止、1ms-1.5msが逆時計回り、1.5ms-2msが時計回り
int Servo_pin = 8;
int Servo_ms;
void setup() {
pwm.begin();
pwm.setPWMFreq(SERVO_FRQ);
Serial.begin(9600);
Serial.println("Start 360 ServoMoter Test");
pwm.writeMicroseconds(Servo_pin, 1500);
delay(1000);
}
void loop() {
// 停止から逆時計回りに早くしていく(約9秒)
for (int i = 90; i >= 0; i--) {
Servo_ms = map(i, ANGLEMIN, ANGLEMAX, SERVOMIN, SERVOMAX);
pwm.writeMicroseconds(Servo_pin, Servo_ms);
delay(100);
}
Serial.println("Counter Clockwise: Max Speed.");
delay(1000);
// 逆時計回りを徐々に遅くして止める(約9秒)
for (int i = 0; i <= 90; i++) {
Servo_ms = map(i, ANGLEMIN, ANGLEMAX, SERVOMIN, SERVOMAX);
pwm.writeMicroseconds(Servo_pin, Servo_ms);
delay(100);
}
Serial.println("Counter Clockwise: Stop.");
delay(1000);
// 停止から時計回りに早くしていく(約9秒)
for (int i = 90; i <= 180; i++) {
Servo_ms = map(i, ANGLEMIN, ANGLEMAX, SERVOMIN, SERVOMAX);
pwm.writeMicroseconds(Servo_pin, Servo_ms);
delay(100);
}
Serial.println("Clockwise: Max Speed.");
delay(1000);
// 時計回りを徐々に遅くして止める(約9秒)
for (int i = 180; i >= 90; i--) {
Servo_ms = map(i, ANGLEMIN, ANGLEMAX, SERVOMIN, SERVOMAX);
pwm.writeMicroseconds(Servo_pin, Servo_ms);
delay(100);
}
Serial.println("Clockwise: stop.");
delay(1000);
exit(0);
}
プログラムは、ストップした状態から反時計回りに徐々に速度を上げていき1秒回転したら、反時計回りのまま徐々に速度を落として回転を停止します。同じ要領で時計回りに回転して終了します。
サーボモーターでウォームギアを動かしてみる
実際に今回揃えた部品を組み立ててウォームギア機構を作っていきたいと思います。
ウォームギアが駆動することを確認出来たので次はロボットの股関節や腰に応用していきたいと思います。
以上
コメント