204.md 4.0 KB
Newer Older
W
init  
wizardforcel 已提交
1 2 3 4
# Raspberry Pi 控制电机速度

> 原文: [https://javatutorial.net/raspberry-pi-control-motor-speed](https://javatutorial.net/raspberry-pi-control-motor-speed)

W
wizardforcel 已提交
5
在本教程中,我将向您展示如何使用 Raspberry Pi 控制直流电机的速度。
W
init  
wizardforcel 已提交
6

W
wizardforcel 已提交
7
如果您正在寻找有关如何同时控制电机的速度和方向的教程,请查看我关于该主题的最新教程。 [Raspberry Pi 用 Java 控制直流电机的速度和方向](https://javatutorial.net/raspberry-pi-control-dc-motor-speed-and-direction-java)
W
init  
wizardforcel 已提交
8

W
wizardforcel 已提交
9
控制电机是使用 Raspberry Pi 可以做的最令人兴奋的事情之一。 电机是耗电的组件。 它们通常需要比 Raspberry 提供的 3V3 更高的功率。 这就是我们将电机连接到外部电源(电池)的原因。 您可以使用本教程中描述的相同技术来处理需要外部电源的任何组件。
W
init  
wizardforcel 已提交
10

W
wizardforcel 已提交
11
## 构建电路
W
init  
wizardforcel 已提交
12 13 14

在做任何事情之前,我们都必须将它们挂钩。 对于本教程,您将需要

W
wizardforcel 已提交
15 16 17
*   直流电机
*   外部电源(电池)–您可能需要根据电机使用不同的电压
*   达灵顿数组芯片(ULN2003)–在本教程的后面,我将为您提供更多详细信息
W
init  
wizardforcel 已提交
18 19 20 21 22 23 24 25 26 27
*   几根电线

看下图。 它显示了如何构建电路。

![raspberry-pi-connect-motor-board](img/92b2b4855e3671d8a4e8fcaa0c3a356a.jpg)

这是我们的电路原理图

![raspberry-pi-connect-motor-schematic](img/fa3b7efc82ddc6c9d30af96a303e693e.jpg)

W
wizardforcel 已提交
28
## 达灵顿数组芯片
W
init  
wizardforcel 已提交
29 30 31

ULN2003 是七对晶体管,可让我们以安全的方式通过 GPIO 端口使用 3V3 切换更高的电压。 我们可以改用标准晶体管,但为什么可以订购价格低于 0.20 美元的 ULN2003 并可以同时控制 7 台电机,为什么还要打扰呢。

W
wizardforcel 已提交
32
ULN2003 的另一重要之处在于,它可以保护您的 Raspberry GPIO 端口免受电感负载(继电器,螺线管,电机等)关闭时可能出现的电压尖峰的影响。
W
init  
wizardforcel 已提交
33 34 35

## 控制马达

W
wizardforcel 已提交
36
我们将使用软件 PWM 来控制电机速度。 如果您想了解更多有关 PWM 的信息,请阅读我以前的教程[具有 PWM 和 Java 的 Raspberry Pi 调光 LED](http://javatutorial.net/raspberry-pi-dim-led-pwm-java "Raspberry Pi Dim LED with PWM and Java") 。 我们将使用 [Pi4j](http://pi4j.com/) API 用 Java 编写速度控制程序。 如果您想知道如何使用 Pi4j 安装,配置和运行项目,请参阅本教程的[](http://javatutorial.net/raspberry-pi-java-tutorial "Raspberry Pi Java Tutorial")
W
init  
wizardforcel 已提交
37

W
wizardforcel 已提交
38
在 Pi4j 中,PWM 值从 0 到 100.在以下示例程序中,我们将利用此值并首先以 25% 的速度旋转电机,然后将其旋转至半速(50% ),然后转至全速(100% ),然后 终于把它拒绝了。
W
init  
wizardforcel 已提交
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89

```java
import com.pi4j.wiringpi.Gpio;
import com.pi4j.wiringpi.SoftPwm;

public class MotorPWM {

	private static int PIN_NUMBER = 1;

	public static void main(String[] args) throws InterruptedException {

		System.out.println("Started");

		// initialize wiringPi library, this is needed for PWM
		Gpio.wiringPiSetup();

		// softPwmCreate(int pin, int value, int range)
		// the range is set like (min=0 ; max=100)
		SoftPwm.softPwmCreate(PIN_NUMBER, 0, 100);

		setSpeed(25);
		setSpeed(50);
		setSpeed(100);
		setSpeed(0);

		System.out.println("Finished");
	}

	private static void setSpeed(int speed) throws InterruptedException {
		System.out.println("Speed is set to " + speed + "%");
		// softPwmWrite(int pin, int value)
		// This updates the PWM value on the given pin. The value is checked to
		// be in-range and pins that haven't previously been initialized via 
		// softPwmCreate will be silently ignored.
		SoftPwm.softPwmWrite(PIN_NUMBER, speed);
		// wait 3 seconds
		Thread.sleep(3000);
	}
}

```

您可以使用以下命令在 Raspberry 上运行该程序:

```java
sudo java -classpath .:classes:/opt/pi4j/lib/'*' MotorPWM
```

观看视频以查看最终结果

<iframe allowfullscreen="" frameborder="0" height="428" src="https://www.youtube.com/embed/OqBoNk0HCY8?feature=oembed" width="760"></iframe>