![]() | サーボモータは左の写真のようなもので すでにJ-Botに組み込まれています。 |
| サーボモーターの考え方 | |
|---|---|
|
モーターと言えば大概の人は子供のころに遊んだマブチモーターをイメージします。実はこれが基本です。 乾電池を一個つなげれば、回転します。二個直列につなげれば高速回転します。三個直列につなげると、さらに高速回転しますが、変な臭いがし始めて壊れるかもしれません。 |
![]() |
|
今度は乾電池一個よりも遅く回転させるにはどうしたら良いでしょうか? 例えば半分のスピードにするために半分の電圧にすることを考えます。 電圧を下げるために抵抗を直列につなぐと考える人もいるでしょう。使用条件に依存しますが、0.5A流れるとして半分の電圧がモーターにかかるとすると、 2R = 1.5(V)/0.5(A) = 3、 従ってR=1.5Ω、抵抗で消費される電力 P=IV = 0.5*0.75=0.375、従って1.5Ωで1/2Wの抵抗が必要になります。 1/4のスピードにするには4R=3になり、R=0.75Ωとなります。 では、連続的にスピードを変えるにはどうするかというと、消費電力が大きい可変抵抗が必要になります。さらにこれをコンピュータでコントロールするには? と考えるとだんだんと複雑になります。従って、ここでこの延長を考えるのをやめます。 モーターを乾電池1個つなぐ場合を考えます。
実際には、逆回転ができないと意味が無いので、制御パルス幅のある値より大きい場合と小さい場合で逆回転するように制御します。 | |

| 重要点 |
|---|
| パルス幅はサーボモータをコントロールします。パルス間のlowの時間はサーボモータの機能を損なわないようにするには10msから40msの範囲で使えます。 |
| 右のサーボモータはP12、左のサーボモータはP13となっています。 |
![]() |
| 右図のようにP12、P13は専用のソケットがありますからそこに接続してください。左右を間違えたり、挿入する方向を間違えないようにしましょう。コードの色を確認しながら挿入してください。 | ![]() |
| 高スピードで右のサーボモータを動かす |
|---|
/**
* 高スピードで右のサーボモータを動かす
*/
namespace BoeBotServo1
{
public class Program
{
public static void Main()
{
ServoMotor Rightsv = new ServoMotor(CPU.P12);
Rightsv.update(1100, 20000);
Rightsv.start();
CPU.delay(1000); /* 1秒間走らせる */
Rightsv.stop(); /* 止める */
Rightsv.Dispose();
}
}
}
|
| 両方のサーボを高スピードで動かし、前進させる |
|---|
/**
* 両方のサーボを高スピードで動かし、前進させる
*/
namespace BoeBotServo2
{
public class Program
{
public static void Main()
{
ServoMotor Rightsv = new ServoMotor(CPU.P12);
ServoMotor Leftsv = new ServoMotor(CPU.P13);
Rightsv.update(*** , 20000);
Leftsv.update(*** , 20000);
Rightsv.start();
Leftsv.start();
CPU.delay(5000); /* 5秒間走らせる */
Rightsv.stop(); /* 止める */
Leftsv.stop();
Rightsv.Dispose();
Leftsv.Dispose();
}
}
}
|

![]() | ![]() |
![]() |
| 右側のQTIをチェックする |
|---|
/*
* LEDはP10につなげる
* IRの信号(赤)はP2につなげる
* IRの電源は白
* IRのグラウンドは黒
*/
namespace checkIR
{
public class Program
{
public static void Main()
{
OutputPort led = new OutputPort(CPU.P10, false);
AnalogInput MotorSpin = new AnalogInput(CPU.P2);
while (true)
{
if (MotorSpin.Read() > 1000) led.Write(true);
else led.Write(false);
}
}
}
}
|
| サーボモータの特性を測定する |
|---|
namespace BoeBotServoCalibrate
{
public class Program
{
public static void Main()
{
AnalogInput RightSpin = new AnalogInput(CPU.P2);
ServoMotor Rightsv = new ServoMotor(CPU.P12);
DateTime start = DateTime.Now; // 回転数測定用
DateTime rStart = start; // 回転停止監視用
TimeSpan diff = start - DateTime.Now;
Rightsv.update(1300, 20000);
Rightsv.start();
int sign = 1;
for (uint highTime = 1350; highTime <= 1650; highTime += 10)
{
next:
Rightsv.update(highTime, 20000);
start = DateTime.Now;
Boolean rState = false;
int count = 0;
while (count < 24) // 3回転
{
int rSpin = RightSpin.Read();
if (rSpin < 500 && rState)
{
rStart = DateTime.Now;
rState = !rState;
count++;
}
else if (rSpin >700 && !rState)
{
rState = !rState;
}
diff = DateTime.Now - rStart;
if (diff.Ticks > 100000000L)
{
Debug.Print(highTime + "\t" + 10000000000L);
highTime += 10;
Rightsv.update(highTime, 20000);
rStart = DateTime.Now;
sign = -1;
goto next;
}
}
diff = DateTime.Now - start;
long sa = diff.Ticks*sign;
Debug.Print(highTime+"\t"+sa);
}
Rightsv.stop(); // 止める
Rightsv.Dispose();
}
}
}
|
| 参考:スピードについて |
|---|
|
rpm(アールピーエム、revolutions per minute、回転毎分)は、1分間に何回、同じ事象への回帰を繰り返すかを示す周波数の単位のことです。 この実験で採ったデータは3回転にかかる時間で、単位は0.1μ秒です。 3回転 : x(0.1μs) = n 回転 : 60秒 xは測定したデータ、nは求めるrpm。 この式から、各データからrpmを求め、グラフを描く。 |
| 車輪サーボをコントロールするクラス |
|---|
/**
* 車輪サーボをコントロールするクラス
*
* フリーランニングの車輪サーボに対するPWMサポートを操作する
* start()で動作を開始し、stop()で停止させる
*/
namespace BoeBotLib
{
public class BasicWheelServo
{
public int forward;
public int center;
public int backward;
public int low;
public ServoMotor sv;
/**
* PWMを用いて車輪サーボコントロール・オブジェクト
* を設定する。単位はPWMの時間幅の単位である。
*
*入力:int pin: PWM信号を発生させるピン(例えば CPU.P12)
* int forward: 前進に対するパルス幅
* int center : 停止に対するパルス幅
* int backward:後進に対するパルス幅
*/
public BasicWheelServo(Cpu.Pin pin, int forward, int center, int backward, int low)
{
sv = new ServoMotor(pin);
this.forward = forward - center;
this.center = center;
this.backward = center - backward;
this.low = low;
}
/**
* 前進/後進(+/-)に対する車輪スピードを設定する
*
* 入力:int percent: 相対スピードのパーセント値
*/
public void move(int percent)
{
// sv.move(percent, forward, center, backward);
if (percent == 0)
{
stop();
}
else
{
sv.update((uint)(center + ((((percent > 0) ? forward : backward) * percent) / 100)), (uint)low);
sv.start();
}
}
public void stop()
{
sv.stop();
}
}
}
|
| BasicWheelServoTest1のメインプログラム |
|---|
namespace BasicWheelServoTest1
{
public partial class Program
{
public static void Main()
{
new Program().main();
}
}
}
|
| 車輪サーボをコントロールするクラスのテストプログラム |
|---|
namespace BasicWheelServoTest1
{
/**
* 車輪サーボコントロールクラスのテストプログラム
*
* Boe-Botで自由回転車輪に対するPWMサポートを扱う
* start()で動きを開始し、stop()を用いて停止する。
*/
public partial class Program
{
public void main()
{
BasicWheelServo leftWheel =
new BasicWheelServo(
CPU.P13 // pin
, *** // forward
, *** // center
, *** // backward
, 20000 // low
);
BasicWheelServo rightWheel =
new BasicWheelServo(
CPU.P12 // pin
, *** // forward
, *** // center
, *** // backward
, 20000 // low
);
leftWheel.move(100);
rightWheel.move(100);
CPU.delay(1000); // 1秒間走る
leftWheel.move(-100);
rightWheel.move(-100);
CPU.delay(1000); // 1秒間走る
leftWheel.stop();
rightWheel.stop();
}
}
}
|
| 実際の値 - 予想値 | ||
| 誤差[%]= | ----------------- | ×100% |
| 予想値 |
実験1へ戻る
実験3へ