Funpack第二季第三期 基于FireBeetle的手机遥控小车
手机APP与FireBeetle连接同一个MQTT服务器,实现收发对接完成遥控
标签
嵌入式系统
Funpack活动
玩具
voncg
更新2023-01-06
安徽师范大学
404

一.项目描述

FireBeetle ESP32-E深度支持ArduinoIDE,还可以使用MicroPython、Mind+图形化等编程环境来操控板载硬件资源。DFRobot公司提供上千种免焊接的Gravity接口传感器与执行器。

特性:

· 拥有更丰富的软硬件资源

· 体积小巧,仅25.4 × 60 mm

· ESP32双核低功耗主控,WiFi+BT4.0二合一

· GDI显示接口,可以单线连接显示屏

· 板载充电电路以及PH2.0锂电池接口

引脚排列:

FireBeetle ESP32-E 最多有 22 个物理 GPIO,其中 34-39 号管脚仅作为输入管脚,其他的可以作为输入和输出管脚。所有逻辑电压均为 3.3V。

二.设计思路

因为以前做过类似的遥控小车的小玩具,所以当时看到有这个题目便很快决定做这个题目,在一起买的模块里我买了屏幕和一个手势感应,但是我选择使用手机遥控后,手势感应貌似就用不上了,原本是想用其感应手势控制小车的。

(1)硬件部分

当然,主控采用的是本次活动的核心FireBeetle 2 ESP32-E IoT。

驱动方面,采用了很便宜很实惠的L298N驱动,其驱动方法是使用两个io控制方向,一个pwm输出控制转速,并且使用5v以上电源时,还能输出一个5v供电给单片机(虽然是被淘汰的东西,但是便宜啊!)。

车模方面采用淘宝爆款双电机三轮车。

显示屏采用DFR0847,用自带的排线很方便。

供电方面,使用两节18650串联7.4v供电,没有多余的降压电路。

(2)软件部分

软件部分分为两个部分,第一个是Android studio上关于app开发的部分,第二个是关于单片机的部分。

1.首先配置AS的环境,使用java编程语言,导入MQTT的jar包,再导入提前收集好的素材,同时在AndroidManifest.xml文件下开发网络权限。在activity_main.xml中进行操作界面设计,因为功能不多,仅设计了六个按键,控制方向,控制PWM的增加与减少。在MainActivity.java中进行连接服务器与功能的相关配置。

2.使用Arduino进行单片机开发,因为使用esp32,所以以前的一些可以直接套用,安装好相应的库之后就可以直接进行开发,直接驱动屏幕,连接wifi与mqtt服务器。

主要实现:连接MQTT服务器,屏幕控制,对pwm和输出数字电平引脚的控制。

三.部分代码讲解

(1)安卓部分

图层部分,部分界面代码

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="70dp">
                <ImageView
                    android:layout_height="80dp"
                    android:layout_width="match_parent"
                    android:id="@+id/image_left"
                    android:layout_weight="1"
                    android:src="@drawable/left">
                </ImageView>
                <ImageView
                    android:layout_height="80dp"
                    android:layout_width="match_parent"
                    android:id="@+id/image_mid"
                    android:layout_weight="1"
                    android:src="@drawable/mid">
                </ImageView>
                <ImageView
                    android:layout_height="80dp"
                    android:layout_width="match_parent"
                    android:id="@+id/image_right"
                    android:layout_weight="1"
                    android:src="@drawable/right">
                </ImageView>
            </LinearLayout>

MQTT服务器配置部分

    private String host = "tcp://api.easylink.io:1883";
    private String userName = "android";
    private String passWord = "";
    private String mqtt_id = "386426616";
    private String mqtt_sub_topic = "386426616";
    private String mqtt_pub_topic = "386426616_ESP";

功能设置部分

        image_up =findViewById(R.id.image_up);
        image_up.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                publishmessageplus(mqtt_pub_topic,"{\"set\":1}");
            }
        });

(2)Arduino部分

这里是信息接受判断代码

void callback(char* topic, byte* payload, unsigned int length) {
  String msg="";
  String str = "";
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    msg+= (char)payload[i];
  }
  Serial.println(msg);
  //////////////////////下面进行自定义开关
  if(msg.indexOf("led"))  //判断是否是要设置LED灯
  {
    //取出LED_set数据 并执行
    str = msg.substring(msg.indexOf("set\":")+5,msg.indexOf("}")); 
    if(str.toInt()==1)
    {
      goAhead();
    }
    else if(str.toInt()==2)
    {
      goLeft();
    }
    else if(str.toInt()==3)
    {
      goRight();
    }
    else if(str.toInt()==4)
    {
      goBack();
    }
    else if(str.toInt()==5)
    {
      if(speedCar>50)
        speedCar-=50;
    }
    else if(str.toInt()==6)
    {
      if(speedCar<1000)
        speedCar+=50;
    }
    else if(str.toInt()==7)
    {
        stop();
    }
  }
}

主循环函数

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  long now = millis();
  if (now - lastMsg > 2000) {
    lastMsg = now;
    String json = "{\"speedCar\":"+String(speedCar)+"}";
    client.publish(Mqtt_pub_topic,json.c_str());
  }
 
}

更详细的见代码文件

四.总结

       本次funpack最大的收获应该是驱动自己去学习手机app的开发制作,算是弥补了电赛的遗憾。每次项目不能总是重复过去的东西,总要学习一些新知识,于是我便借此次funpack学习了简单的物联网手机app制作,课程来自学习平台bilibili,感谢大佬们的指点。

       很感谢硬禾学堂,提供一个平台,能够在空余时间提高自己开发的能力,学习到了更多的知识。同时我也期待未来还能够通过电子森林的funpack等活动学习更多的内容。感谢电子森林能够提供这个平台。希望未来电子森林能够有更多好玩有趣的项目。白嫖更多的板子。

附件下载
CAR_P.apk
手机软件
combine.ino
软件代码
团队介绍
myself
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号