2
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RaspBerryPi3でサーボモータ制御 (Pi4j)

Last updated at Posted at 2017-09-18
\def\textlarge#1{%
  {\rm\Large #1}
}
\def\textsmall#1{%
  {\rm\scriptsize #1}
}

#1、サーボモータ制御!
 前回の「RaspBerryPi3でLEDをPWMで光らせる (Pi4j)」でPWMを操れましたので、ついにモータの制御です。
 入門キット※1についているSG90をPWM制御で制御します。この制御をすることで任意の角度を保つことができます。
 image.png

 注意
 ・私は電子機器については電圧=抵抗×電流がわかる程度の全くの素人です。

$\textsmall{  ※1「Kuman 35個 Raspberry Piに適用 初心者 電子工作 1602液晶ディスプレイ+温度/湿度センサ+BMP180デジタル気圧センサー}$
$\textsmall{   +HC-SR501赤外線モーションセンサモジュール 子供遊び Raspberry Pi 3 2 model B A A+ + に対応 電子工作入門キット ラズベリーパイ K71」}$
#2、本題
## (1)接続
 サーボモーターを接続しています。
 ①全体画像
image.png

 ②詳細
 image.png

## (2)Raspberry piの設定
 シリアルを有効にすることで、ピンを制御できるようになります。
image.png
## (3)実行プログラム
 180度、1秒待つ、90度、1秒待つ、0度、1秒待つを繰り返します。

TestPwmServoMotor.java
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!
 image.png

## (4)実行結果
 3段階の角度を制御できています。
15054437161wEtQ9snzA3SxmI1505443699.gif

#3、おわりに
 モータが制御できればいろいろできそうで夢が広がります!
 いつかやってみたいと思っていたロボット作りができるかも。

 今回のテストで二つ課題があります。
 1つは指定できるデューティー比が0~100であるため微妙な角度を表現できません。
 2つ目、本当はハードウェアのPWMを使用したかったのですが、どうしてもうまくいきませんでした。
 ハードウェアなら指定できるデューティー比が0~1024なのに!
 javaから制御ができていないように思います。権限の問題でしょうか・・・。

参考
モータ制御に欠かせない技術“PWM”って何?
 PWM制御がすごくわかりやすく解説されていました。

2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?