![]() | サーボモータは左の写真のようなもので すでにJ-Botに組み込まれています。 |

| 重要点 |
|---|
| パルス幅はサーボモータをコントロールします。パルス間のlowの時間はサーボモータの機能を損なわないようにするには10msから40msの範囲で使えます。 |
| 右のサーボモータはP12、左のサーボモータはP13となっています。 |
![]() |
| 右図のようにP12、P13は専用のソケットがありますからそこに接続してください。左右を間違えたり、挿入する方向を間違えないようにしましょう。コードの色を確認しながら挿入してください。 | ![]() |
| 高スピードで右のサーボモータを動かす |
|---|
import stamp.core.*;
/**
* 高スピードで右のサーボモータを動かす
*/
public class JBotServo1 {
static PWM pwmR = new PWM(CPU.pin12); // 右のサーボを作る
public static void main() {
pwmR.update ( 110, 2000 ) ;
pwmR.start () ;
CPU.delay(10000); // 1秒間走らせる
pwmR.stop () ; // 止める
}
}
|
| 高スピードで右のサーボモータを動かす |
|---|
import stamp.core.*;
/**
* 高スピードで右のサーボモータを動かす
*/
public class JBotServo2 {
static PWM pwmR = new PWM(CPU.pin12); // 右のサーボを作る
public static void main() {
pwmR.update ( ***,2000 ) ;
pwmR.start () ;
CPU.delay(10000); // 1秒間走らせる
pwmR.stop () ; // 止める
}
}
|
| 高スピードで左のサーボモータを動かす |
|---|
import stamp.core.*;
/**
* 高スピードで左のサーボモータを動かす
*/
public class JBotServo3 {
static PWM pwmL = new PWM(CPU.pin13); // 左のサーボを作る
public static void main() {
pwmL.update ( ***,2000 ) ;
pwmL.start () ;
CPU.delay(10000); // 1秒間走らせる
pwmL.stop () ; // 止める
}
}
|
| 両方のサーボを高スピードで動かす |
|---|
import stamp.core.*;
/**
* 両方のサーボを高スピードで動かす
*/
public class JBotServo4 {
static PWM pwmR = new PWM(CPU.pin12); // 右のサーボを作る
static PWM pwmL = new PWM(CPU.pin13); // 左のサーボを作る
public static void main() {
pwmR.update ( ***,2000 ) ;
pwmL.update ( ***,2000 ) ;
pwmR.start () ;
pwmL.start () ;
CPU.delay(10000); // 1秒間走らせる
pwmR.stop () ; // 止める
pwmL.stop () ; // 止める
}
}
|
| サーボの中心を補正する |
|---|
import stamp.core.*;
/**
* サーボの中心を補正する
*/
public class JBotServoCalibrate1 {
static PWM pwmR = new PWM(CPU.pin12); // 右のサーボを作る
public static void main() {
// 前の実験で求めた値を入れる。
int i = *** ;
System.out.println ( "Servo calibration" ) ;
pwmR.update ( i, 2000 ) ;
pwmR.start() ; // サーボをスタート
mainloop: while ( true ) {
System.out.print ( "Servo value is " ) ;
System.out.println ( i ) ;
pwmR.update ( i, 2000 ) ;
switch ( Terminal.getChar ()) {
case '+':
i ++ ;
break ;
case '-':
i -- ;
break ;
case 'Q':
case 'q':
break mainloop;
default:
continue mainloop;
}
}
pwmR.stop () ;
}
}
|
| 車輪サーボをコントロールするクラス |
|---|
package JBot;
import stamp.core.*;
/**
* 車輪サーボをコントロールするクラス
*
* フリーランニングの車輪サーボに対するPWMサポートを操作する
* start()で動作を開始し、stop()で停止させる
*/
public class BasicWheelServo extends PWM {
public int forward;
public int center;
public int backward;
public int low;
public int pin;
/**
* 動作に対するPWMを用いて車輪サーボコントロール・オブジェクト
* を設定する。単位はPWMの単位である。
*
*入力:int pin: PWM信号を発生させるピン(例えば CPU.pin0)
* int forward: 前進に対するパルス幅
* int center : 停止に対するパルス幅
* int backward:後進に対するパルス幅
* int low : パルスに続くlowのパルス幅
*/
public BasicWheelServo ( int pin, int forward, int center, int backward, int low ) {
super ( pin ) ;
this.forward = forward-center ;
this.center = center ;
this.backward = center-backward ;
this.low = low ;
}
/**
* 前進/後進(+/-)に対する車輪スピードを設定する
*
* 入力:int percent: 相対スピードのパーセント値
*/
public void move ( int percent ) {
if ( percent == 0 ) {
stop() ;
} else {
update(center+((((percent>0)?forward:backward)*percent)/100)
,low ) ;
start () ;
}
}
}
|
| 車輪サーボをコントロールするクラスのテストプログラム |
|---|
import stamp.core.*;
import JBot.* ;
/**
* 車輪サーボコントロールクラスのテストプログラム
*
* JBotで自由回転車輪に対するPWMサポートを扱う
* start()で動きを開始し、stop()を用いて停止する。
*/
public class BasicWheelServoTest1 {
public static void main () {
BasicWheelServo leftWheel =
new BasicWheelServo (
CPU.pin13 // pin
, *** // forward
, *** // center
, *** // backward
, 2000 // low
) ;
BasicWheelServo rightWheel =
new BasicWheelServo (
CPU.pin12 // pin
, *** // forward
, *** // center
, *** // backward
, 2000 // low
) ;
leftWheel.move ( 100 ) ;
rightWheel.move ( 100 ) ;
CPU.delay(10000); // 1秒間走る
leftWheel.move ( -100 ) ;
rightWheel.move ( -100 ) ;
CPU.delay(10000); // 1秒間走る
leftWheel.stop () ;
rightWheel.stop () ;
}
}
|
| 車輪サーボをコントロールするクラスを補正するプログラム |
|---|
import stamp.core.*;
import JBot.* ;
/**
* 車輪サーボをコントロールするクラスを補正するプログラム
*
* JBotで自由回転車輪に対するPWMサポートを扱う
* start()で動きを開始し、stop()を用いて停止する。
*/
public class BasicWheelServoCalibrate1 {
public static void main () {
BasicWheelServo leftWheel =
new BasicWheelServo (
CPU.pin13 // pin
, *** // forward
, *** // center
, *** // backward
, 2000 // low
) ;
BasicWheelServo rightWheel =
new BasicWheelServo (
CPU.pin12 // pin
, *** // forward
, *** // center
, *** // backward
, 2000 // low
) ;
mainloop: while ( true ) {
System.out.println( "Enter key" ) ;
switch ( Terminal.getChar ()) {
case ' ':
break ;
case '+':
leftWheel.forward ++ ;
break ;
case '-':
if (( leftWheel.forward + leftWheel.center ) > 1 ) {
leftWheel.forward -- ;
}
break ;
case 'Q':
case 'q':
break mainloop;
default:
continue mainloop;
}
System.out.print ( "Left forward value is " ) ;
System.out.println ( leftWheel.forward + leftWheel.center ) ;
leftWheel.move ( 100 ) ;
CPU.delay ( 2000 ) ;
leftWheel.stop () ;
}
}
}
|
| 左 | 右 | |
|---|---|---|
| 前進 | ||
| 停止 | ||
| 後進 |

| CdS(photoresistor) |
|---|
| CdSセルは、硫化カドミウムを主成分とした光導電素子で、一般にCdSeセルを含めてCdSセルと総称されています。 特徴は、可視光線に対して高感度で小型で軽量、しかも比較的安価に作れます。また、電気伝導度と光量の直線性の範囲が狭く、応答性があまり良くありません。そのため、ゆるやかな照度変化の検出に限定されてしまいます。 CdSセルは光導電面の製作方法から大別して単結晶形、焼結形、蒸着形などありますが、現在は高感度で大面積のものが得られやすい焼結形のものが最も多く使用されています。 |
| Basic Photoresistorクラス |
|---|
package JBot ;
import stamp.core.*;
/**
* Basic Photoresistor Class
*
* CPU.rcTimeを用いてphotoresistor回路をテストする
*/
public class Photoresistor {
public int pin ;
public int timeout ;
public int chargeTime ;
public int bias ;
public boolean state ;
/**
* 8.68μs単位でRCの時間の値を得る
*
* 入力:int pin: 用いるCPU.pin
* 入力:boolean state: 初期のRCの状態
* 入力:int timeout: rcTimeの最大の戻り値
* 入力:int chargeTime: RC回路の充電/放電時間 ミリ秒
* 入力:int bias:
*/
public Photoresistor ( int pin, boolean state, int timeout, int chargeTime, int bias ) {
this.pin = pin ;
this.timeout = timeout ;
this.chargeTime = chargeTime ;
this.state = state ;
this.bias = bias ;
}
/**
* 8.68μs単位でRCの時間の値を得る
*
* @returns RC time
*/
public int rcTime() {
// Measure RC time for photoresistor.
CPU.setOutput ( pin ) ;
CPU.writePin ( pin, state ) ; // 充電回路を設定する
CPU.delay ( chargeTime * 10 ) ; // 回路を充電する
int result = CPU.rcTime ( timeout, pin, ! state ) ;
return ( result > 0 ) ? ( result - bias ) : bias ;
}
}
|
![]() |
![]() |
| コンデンサの表面には3桁の数字が書いてあります。例えば471と書いてあった場合は471pFとか471μFではありません。これは47×101pFです。従って、ここで使うコンデンサは104と印字してあるものを用います。 ★コンデンサの読み方 |
| CdSの光の量を計測するプログラム |
|---|
import stamp.core.*;
import JBot.* ;
/**
* CdSの光の量を計測するプログラム
*
* CPU.rcTimeを用いてphotoresistor回路をテストする
*/
public class CdS_check {
public static void main() {
Photoresistor Photo = new Photoresistor ( CPU.pin3, true, 250, 2, 0 ) ;
while ( true ) {;
System.out.print (Photo.rcTime()) ;
System.out.print("\n");
}
}
}
|
| 車輪サーボのスピードを計測する |
|---|
import stamp.core.*;
import JBot.* ;
/**
* サーボの数字とスピードとの関係を計測する。
* 計測は車輪にCdSを一周ごとに覆うようにして行なう
* 時間計測はtimerHiとtimerLoを8ビット右シフトして用いる
* 一周の時間は10回計測し平均する
*/
public class JBotServoCalibrate3 {
static PWM pwm = new PWM(CPU.pin12); // サーボを作る
final static int th = ***; // CdS の閾値
final static int begin = ***; // 始点
final static int end = ***; // 終点
final static int stop = ***; // 停止の値
final static int N = 10; // 平均する回数
public static void main() {
int i=begin ;
boolean state=false;
int wheel;
int T=0, timeLo=0, timeHi;
int count, sum;
int t=0;
Photoresistor Photo = new Photoresistor ( CPU.pin3, true, 250, 2, 0 ) ;
pwm.update ( i, 2000 ) ;
pwm.start() ; // サーボをスタート
System.out.println ( "Servo speed check" ) ;
Timer timer = new Timer(); // タイマースタート
timer.mark();
for(i=begin; i<=end; i++) {
if(i==stop) i++; // 停止点は飛ばす
pwm.update ( i, 2000 ) ;
count=0;
sum = 0;
do {
wheel = Photo.rcTime(); // CdS の値を読む
if(state) {
if(wheel < th) {
state = false;
timeHi = timer.tickHi(); // タイマーは32bitで
timeLo = timer.tickLo(); // 16bit*2
T = (timeHi<<8) + (timeLo>>>8); // そのままでは
sum += (T-t)/N; // 精度が良すぎるので
t = T; // 8bit右シフトして使う
count++; // N 回平均する
}
}
else {
if(wheel > th) state = true;
}
} while(count<N);
System.out.print(i);
System.out.print(" ");
if(i < stop) System.out.print("-");
System.out.println(sum);
}
pwm.stop () ;
}
}
|
| 実際の値 - 予想値 | ||
| 誤差[%]= | ----------------- | ×100% |
| 予想値 |