![树莓派gpio](https://i-blog.csdnimg.cn/blog_migrate/77aba90cbe8cb217d7378a536230e8c2.png)
树莓派gpio
Android Things GPIO引脚用于与外部设备进行交互。 GPIO代表通用输入输出,它是读取外部设备状态的接口。 在本文中,我们将发现如何使用Android Things GPIO引脚来控制构建遥控车的直流电动机。 在本文的结尾,您将构建一个可以向各个方向移动的Android Things汽车,您可以使用智能手机或浏览器对其进行控制。
Android Things提供了一组API,可用于使用Android Things GPIO与两种状态的设备(如按钮或LED)进行交互。 使用Android Things GPIO API,我们可以简单地读取引脚的状态或设置其值。 在本文中,我们将详细探讨如何使用Android Things GPIO来控制电机。 也许您已经知道,还有其他方法可以用来控制电动机。 使用Android Things GPIO引脚,我们只能将其打开或关闭,但无法控制电机速度。 GPIO引脚只有两种状态:开或高,关或低。 如果我们想对使用比例控制的电动机进行更多控制,可以使用Android Things PWM引脚。
无论如何,在这种情况下,我们只希望控制马达并打开或关闭它们,以便我们可以向各个方向移动Android Things遥控车。 最终结果如下图所示:
Android Things GPIO引脚
在描述如何构建Android Things远程汽车之前,概述一下如何使用GPIO引脚非常有用。 控制Android Things GPIO引脚的第一步是获取对PeripheralManagerService的引用:
PeripheralManagerService service = new PeripheralManagerService();
下一步是打开与引脚的连接:
pin = service.openGpio(pin_name);
要了解哪些引脚是GPIO,请根据您的Android Things开发板,可以引用Android Things引脚排列。 连接打开后,我们可以使用以下命令设置引脚的值:
pin.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
pin.setValue(true); // High
要了解更多如何使用Android Things GPIO引脚的信息,请参阅我的书“ Android Things Projects ”。
在深入研究项目细节之前,您应该阅读我有关Android Things的其他文章:
如何使用Android Things控制电机
通常,我们将设备直接连接到Android Things板上。 无论如何,当我们使用电动机时,这是不可能的,因为电动机可能需要GPIO引脚可提供的更多电流。 在这种情况下,我们必须提供外部电源,并使用Android Things GPIO引脚来控制电机。 此外,我们要控制电动机的旋转方向。 由于这些原因,建议使用简单的电机驱动器来简化我们的工作。
在这个项目中,我们将使用L298N一个简单的驱动器,它可以控制两个电动机及其方向:
该驱动器也可以使用PWM控制电机,无论如何在此项目中我们将不会使用此功能。 每个马达使用两个Android Things GPIO引脚,我们可以控制其旋转方向或停止旋转。
让我们看看如何将此驱动程序连接到Android Things板上。 下图显示了如何将GPIO引脚连接到L298N和电机:
即使架构看起来有些复杂,它也非常简单:该项目使用四个不同的Android Things GPIO引脚:
右马达:
- BCM17
- BCM27
左马达:
- BCM23
- BCM24
如果您使用的板子不同于Raspberry Pi3,则必须更改引脚名称。
此时,我们可以创建一个简单的java类来控制电机:
public class MotorController {
PeripheralManagerService service = new PeripheralManagerService();
private Gpio pin1Motor1;
private Gpio pin2Motor1;
private Gpio pin1Motor2;
private Gpio pin2Motor2;
public MotorController() {
try {
// Right
pin1Motor1 = service.openGpio("BCM17");
pin2Motor1 = service.openGpio("BCM27");
// Left
pin1Motor2 = service.openGpio("BCM23");
pin2Motor2 = service.openGpio("BCM24");
pin1Motor1.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
pin2Motor1.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
pin1Motor2.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
pin2Motor2.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
} catch (IOException e) {
e.printStackTrace();
}
}
public void forward() {
setPinValues(true, false, false, true);
}
public void backward() {
setPinValues(false, true, true, false);
}
public void stop(){
setPinValues(false, false,false,false);
}
public void turnLeft() {
setPinValues(false, false, false, true);
}
public void turnRight() {
setPinValues(true, false, false, false);
}
private void setPinValues(boolean p11, boolean p12,
boolean p21, boolean p22 ) {
try {
pin1Motor1.setValue(p11);
pin2Motor1.setValue(p12);
pin1Motor2.setValue(p21);
pin2Motor2.setValue(p22);
} catch (IOException e) {
e.printStackTrace();
}
}
}
此类完成以下任务:
- 它获得对PeripheralManagerService的引用
- 打开GPIO引脚
- 设定方向和初始值
此外,它定义了四种不同的方法来控制汽车的行驶方式:
- 前锋
- 落后
- 转左
- 右转
所有这些运动都可以通过打开或关闭上面定义的每个销进行控制。
就这样。 现在,是时候实施我们将如何控制汽车了。 我们可以为此目的实现多种选择。 我们可以使用具有HTML界面的简单Web服务器,也可以使用例如Android附近的API甚至是蓝牙连接。
在本教程中,我们将使用一个简单的Web界面。
如何实现Android Things HTTP接口
如前所述,我们将实现HTTP接口,以便我们可以使用它来控制Android Things远程汽车。 要实现一个简单的HTTP Web服务器,我们可以使用NanoHTTPD ,它是一个简单且轻巧的HTTP服务器。 为此,有必要修改build.gradle
文件,添加:
compile 'org.nanohttpd:nanohttpd:2.2.0'
现在让我们创建一个名为RobotHTTPServer
的新类,该类处理传入的HTTP请求:
public class RobotHttpServer extends NanoHTTPD {
public RobotHttpServer(int port,
Context context,
CommandListener listener) {
super(port);
this.context = context;
this.listener = listener;
Log.d(TAG, "Starting Server");
try {
start();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public Response serve(IHTTPSession session) {
Map<String, String> params = session.getParms();
String control = params.get("control");
String action = params.get("btn");
Log.d(TAG, "Serve - Control ["+control+"] - Action ["+action+"]");
if (action != null && !"".equals(action))
listener.onCommand(action);
return newFixedLengthResponse(readHTMLFile().toString());
}
..
}
HTML页面非常简单,它由代表四个方向的5个按钮和停止按钮组成。我们将HTML页面添加到assets/
目录。 最后一部分是定义CommandListener
,它是HTTP服务器每次收到命令时都会调用的回调函数:
public static interface CommandListener { public void onCommand(String command); }
组装应用以控制Android Things遥控车
最后一步是组装所有内容并粘贴这些类,以便我们最终可以构建Android Things遥控车。 为此,必须创建一个MainActivity
:
public class MainActivity extends Activity {
private String TAG = getClass().getName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "OnCreate...");
final MotorController mc = new MotorController();
RobotHttpServer server = new RobotHttpServer(8090, this,
new RobotHttpServer.CommandListener() {
@Override
public void onCommand(String command) {
Log.d(TAG, "Command received ["+command+"]");
if (command.equals("F"))
mc.forward();
else if (command.equals("B"))
mc.backward();
else if (command.equals("S"))
mc.stop();
else if (command.equals("L"))
mc.turnLeft();
else if (command.equals("R"))
mc.turnRight();
}
});
}
}
如您所见,代码非常简单,每次CommandListener收到新命令时,它都会调用处理电动机的类的方法来控制电动机。
这个简单的项目可以进一步扩展。 我们可以添加一组新功能,例如视觉,机器学习等。 因此,我们使用Android Things代替Arduino或ESP8266。
在本文的结尾,您将了解如何与Android Things GPIO引脚进行交互以及如何打开或关闭它们。 此外,您还学习了如何使用电动机。 您已获取的所有这些信息都将用于构建您的第一个Android Things遥控车。现在您可以玩玩具了!
翻译自: https://www.javacodegeeks.com/2017/12/building-remote-controlled-car-using-android-things-gpio.html
树莓派gpio