树莓派gpio_使用Android Things GPIO构建遥控车

树莓派gpio

树莓派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();
        }
    }

}

此类完成以下任务:

  1. 它获得对PeripheralManagerService的引用
  2. 打开GPIO引脚
  3. 设定方向和初始值

此外,它定义了四种不同的方法来控制汽车的行驶方式:

  • 前锋
  • 落后
  • 转左
  • 右转

所有这些运动都可以通过打开或关闭上面定义的每个销进行控制。

就这样。 现在,是时候实施我们将如何控制汽车了。 我们可以为此目的实现多种选择。 我们可以使用具有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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值