\def\textlarge#1{%
{\rm\Large #1}
}
\def\textsmall#1{%
{\rm\scriptsize #1}
}
#1、サーボモータ制御!
前回の「RaspBerryPi3でLEDをPWMで光らせる (Pi4j)」でPWMを操れましたので、ついにモータの制御です。
入門キット※1についているSG90をPWM制御で制御します。この制御をすることで任意の角度を保つことができます。
注意
・私は電子機器については電圧=抵抗×電流がわかる程度の全くの素人です。
$\textsmall{ ※1「Kuman 35個 Raspberry Piに適用 初心者 電子工作 1602液晶ディスプレイ+温度/湿度センサ+BMP180デジタル気圧センサー}$
$\textsmall{ +HC-SR501赤外線モーションセンサモジュール 子供遊び Raspberry Pi 3 2 model B A A+ + に対応 電子工作入門キット ラズベリーパイ K71」}$
#2、本題
## (1)接続
サーボモーターを接続しています。
①全体画像
## (2)Raspberry piの設定
シリアルを有効にすることで、ピンを制御できるようになります。
## (3)実行プログラム
180度、1秒待つ、90度、1秒待つ、0度、1秒待つを繰り返します。
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinPwmOutput;
import com.pi4j.io.gpio.Pin;
import com.pi4j.io.gpio.RaspiPin;
import com.pi4j.util.CommandArgumentParser;
public class TestPwmServoMotor {
public static void main(String[] args) throws InterruptedException {
pwm(args);
}
/**
* 100Hzで出力
* @param args
* @throws InterruptedException
*/
public static void pwm(String[] args) throws InterruptedException{
final GpioController gpio = GpioFactory.getInstance();
Pin pin = CommandArgumentParser.getPin(
RaspiPin.class,
RaspiPin.GPIO_00,
args);
GpioPinPwmOutput pwm = gpio.provisionSoftPwmOutputPin(pin);
pwm.setPwmRange(100);//出力時間を100分割
int sleep = 1000;
for(int i = 0 ;i<10;i++){
//180度
pwm.setPwm(25);//デューティー比25
System.out.println("PWM rate is: " + pwm.getPwm());
Thread.sleep(sleep);
//90度
pwm.setPwm(15);//デューティー比15
System.out.println("PWM rate is: " + pwm.getPwm());
Thread.sleep(sleep);
//0度
pwm.setPwm(6);//デューティー比6
System.out.println("PWM rate is: " + pwm.getPwm());
Thread.sleep(sleep);
}
gpio.shutdown();
System.out.println("pwm end");
}
}
javaDocの説明を見るとどうやら100Hzの信号を出している様です。
測ってみたら確かにほぼ100Hz!
#3、おわりに
モータが制御できればいろいろできそうで夢が広がります!
いつかやってみたいと思っていたロボット作りができるかも。
今回のテストで二つ課題があります。
1つは指定できるデューティー比が0~100であるため微妙な角度を表現できません。
2つ目、本当はハードウェアのPWMを使用したかったのですが、どうしてもうまくいきませんでした。
ハードウェアなら指定できるデューティー比が0~1024なのに!
javaから制御ができていないように思います。権限の問題でしょうか・・・。
参考
モータ制御に欠かせない技術“PWM”って何?
PWM制御がすごくわかりやすく解説されていました。