STM32
直播中

laisvl

8年用户 1063经验值
私信 关注
[问答]

如何去实现一种基于C语言与Java的WiFi避障小车的设计

Arduino是什么?
如何去实现一种基于C语言与Java的WiFi避障小车的设计?

回帖(1)

刘桂珍

2021-11-10 14:16:58
  一、设计平台介绍
  1.1 Arduino描述
  Arduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(ArduinoIDE)。由一个欧洲开发团队于2005年冬季开发。其成员包括Massimo Banzi、David Cuartielles、Tom Igoe、Gianluca Martino、David Mellis和Nicholas Zambetti等。
  它构建于开放原始码simple I/O介面版,并且具有使用类似Java、C语言的Processing/Wiring开发环境。主要包含两个的部分:硬件部分是可以用来做电路连接的Arduino电路板;另外一个则是Arduino IDE,你的计算机中的程序开发环境。你只要在IDE中编写程序代码,将程序上传到Arduino电路板后,程序便会告诉Arduino电路板要做些什么了。
  Arduino能通过各种各样的传感器来感知环境,通过控制灯光、马达和其他的装置来反馈、影响环境。板子上的微控制器可以通过Arduino的编程语言来编写程序,编译成二进制文件,烧录进微控制器。对Arduino的编程是通过 Arduino编程语言 (基于Wiring)和Arduino开发环境(基于Processing)来实现的。基于Arduino的项目,可以只包含Arduino,也可以包含Arduino和其他一些在PC上运行的软件,它们之间进行通信 (比如 Flash, Processing, MaxMSP)来实现。
  (1)Wemos D1是自带ESP8266 Wifi芯片并兼容Arduino的开发板,可使用Arduino IDE直接进行开发。它有11个 I/O 引脚,1 个 ADC 引脚(输入范围0-3.3V),而且板载5V及1A开关电源(高输入电压24V),在工作中,它和stm32模块开发类似,集成度高,同时也比STM32单片机更经济便宜。Wemos D1开发板实物图如下图所示:
  (2)此开发板芯片为ESP8266(32位),缓存比Arduino Uno大,并且包含11个数字IO引脚以及1个模拟输入引脚,使用Micro-B type USB线进行连接。ESP8266EX 内置超低功耗Tensilica L106 32 位 RISC 处理器,CPU 时钟速度最高可达 160 MHz,工作电压为3.3V,闪存为4Mbytes,支持实时操作系统(RTOS) 和 Wi-Fi 协议栈,可将高达 80% 的处理能力留给应用编程和开发,ESP8266模块可以独立于Arduino等开发板,作为一块独立的开发板使用。它拥有GPIO、I2C、ADC、SPI、PWM等模块,可以用它做大多数MCU能做的工作,且性能甚至远超多数MCU。
  二、设计步骤
  2.1 电机控制前进后退左右转和端口初始化的实现
  本次使用的是L9110s步进电机控制器,该模块供电电压为2.5V-12V,其GND接到开发板上的GND引脚,IA1IB1IA2IB2外接开发板IO口,如下图所示:
  (1)宏定义端口
  在编写控制代码前,我们要先宏定义出电机前进后退和左转右转在开发板上对应的引脚,代码如下:
  #define zhuan1 D6
  #define zhuan2 D7
  #define dong1 D4
  #define dong2 D5
  (2)初始化串口
  首先我们要创建一个无类型串口初始化函数,把宏定义的引脚设置为输出引脚,代码如下:
  void initLs() {
  pinMode(zhuan1, OUTPUT); //设置引脚为输出引脚
  pinMode(zhuan2, OUTPUT);
  pinMode(dong1, OUTPUT);
  pinMode(dong2, OUTPUT);
  }
  (3)前进后退和左转右转
  首先创建出小车前进后退,左转右转和停止的函数,然后再在函数里设置转向的高低电平,比如小车左转向时,对应引脚设置为高电平,相反转向的引脚设置为低电平,同理,小车回正,前进后退,停止也是如此[7]。代码如下:
  void you() { //右转向
  digitalWrite(zhuan1, HIGH);//高电平
  digitalWrite(zhuan2, LOW);
  }
  void zuo() { //左转向
  digitalWrite(zhuan1, LOW);
  digitalWrite(zhuan2, HIGH);
  }
  void zheng() { //回正
  digitalWrite(zhuan1, LOW);
  digitalWrite(zhuan2, LOW);
  }
  void qian() { //小车前进
  digitalWrite(dong1, LOW);
  digitalWrite(dong2, HIGH);
  }
  void hou() { //小车后退
  digitalWrite(dong1, HIGH);
  digitalWrite(dong2, LOW);
  }
  void ting() { //小车停止
  digitalWrite(dong1, LOW);
  digitalWrite(dong2, LOW);
  }
  2.2 WiFi模块的初始化
  (1)定义WIFI库
  在编写WIFI连接的代码前,我们要定义一个特有的WIFI库,从而才能调用相应的函数[8],代码如下:
  #include 《ESP8266WiFi.h》
  (2)初始化WIFI
  ① 定义我们要连接的WIFI帐号密码并且声明端口号,代码如下:
  char* ssid = “chendan520”; //定义WIFI
  char* passwd = “chendan2016”; //输入WIFI密码
  int port = 8888; //设置端口号
  WiFiServer server(port); //端口接入WIFI
  ② 创建一个WIFI连接函数,代码如下:
  void initWifiSta()
  {
  WiFi.mode(WIFI_STA);//设置STA模式
  WiFi.begin(ssid, passwd);//连接网络
  while (WiFi.status() != WL_CONNECTED) { //判断WIFI是否连接成功
  Serial.print(“。”);
  delay(500);
  }
  Serial.println(WiFi.localIP());//通过串口打印wemos的ip地址
  }
  2.3 超声波测距
  (1)超声波测距原理
  ① 超声波传感器先发送一个信号,信号遇到障碍物后就会被反弹回来再被超声波传感器接收,接收到的高电平持续的时间就是超声波从发射到接收到的时间,所以测试的距离=(高电平时间*声速)/2;再将距离单位换算成厘米,所用函数为:distance=pulseIn(接收信号的引脚echo,HIGH)/58,声速为340m/s;
  
  图4 超声波测距原理图 ② 超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收,电路板上有4个引脚:VCC(正极),Trig(触发),Echo(回应),GND(接地)。
  (2)测距编程实现
  超声波测距的主要代码如下。
  #define Echo D2 //宏定义“回应”引脚
  #define Trig D8 //宏定义“触发”引脚
  long getTime() { //超声波测距
  digitalWrite(Trig, HIGH); //接受一个高电平
  delayMicroseconds(10); //持续10秒
  digitalWrite(Trig, LOW); //再变成低电平
  return pulseIn(Echo, HIGH);
  }
  void initChaoshenbo() { //选定超声波管脚
  pinMode(Echo, INPUT);
  pinMode(Trig, OUTPUT);
  }
  2.4 setup函数所需要写的代码
  该函数为初始化执行函数,主要内容是以上提到的各个初始化函数,代码如下:
  void setup() {
  // put your setup code here, to run once:
  initLs(); //初始化电机管脚
  Serial.begin(115200); //设置波特率
  initWifiSta(); //连接WIFI
  initChaoshenbo(); //选定超声波管脚
  server.begin();
  }
  2.5 loop函数所需要写的代码
  该函数是循环执行函数,主要内容如下:
  void loop() {
  // put your main code here, to run repeatedly:
  char cmd;
  long dis;
  int mark = 0;
  WiFiClient client = server.available();//服务器初始化
  while (client.connected()) { //等待客户端连接
  while (client.available() 》 0) { //获取数据
  cmd = client.read(); //读取数据
  Serial.println(cmd); //打印cmd的值,测试cmd输出是否正确
  dis = getTime() / 58; //测试超声波距离
  if (dis 《 10) { //当小车遇到障碍物时,若距离小于10厘米,则执行下一条指令
  hou(); //小车后退
  delay(200); //持续200毫秒
  ting(); //然后小车停止
  } else { //若不满足以上条件执行下一条指令
  mark = 0;
  }
  if (mark == 0) {
  switch (cmd) { //判断小车方向
  case‘q’:
  qian();
  break;
  case‘h’:
  hou();
  break;
  case‘z’:
  zuo();
  break;
  case‘y’:
  you();
  break;
  case‘s’:
  ting();
  break;
  case‘d’:
  zheng();
  break;
  }
  }
  }
  }
  }
  2.6 安卓app模拟器
  (1)Android开发环境搭建
  首先下载编程软件–eclipse ADT,如图6所示,解压。然后再导入程序包,最后在代码中编写我们要连接WIFI的ip地址。
  
  图7 WiFi的IP地址修改
  (2)把程序跑在模拟器上
  安卓app模拟器和小车怎么连接起来的关键是adb软件,打开电脑的命令提示符cmd,需要进到我们存储adb位置上,然后输入adb connect 127.0.0.1:62001(62001是夜神模拟器的端口号,模拟器不一样可能端口号也不一样),这样我们就能把APP跑进去,然后就能控制小车了!如图8,图9所示。
  
  图8 adb连接模拟器
  三、项目演示效果
  我们将所有模块进行代码整合,然后将程序烧写到Wemos D1开发板上,再使用串口助手来调试经改装后的小车前进后退和左转右转是否正常。如果正常,再测试超声波测距,我们将一障碍物放置于小车正前方,然后点击app模拟器前进按钮,当小车与障碍物的距离小于10cm时,如果小车后退然后停止,表示测试成功。
  同时也可以使用12v电池给小车供电,让小车脱掉数据线自己动起来,但是由于小车耗电量大,所以我们尽量使用小型充电宝来给小车供电,从而达到更佳的效果。
  四、结语
  避障小车是一种智能设备,可以自动感知前方的障碍物,并通过朝另一个方向转动来避开障碍物。避障小车的应用不受限制,现在大多数军事组织都使用它,这有助于执行许多士兵无法完成的危险工作。通过本次基于C语言与Java的WiFi避障小车的设计,我们对嵌入式系统设计的整个过程有了初步的了解,我们首先要需求分析,然后分模块设计,再进行代码整合,最后最重要的是对项目进行调试,在调试过程找出错误点,寻求更优的,更符合设计目的方案。这个过程需要自己动手拼装制作,这样完成后会有满满的成就感,小车作为一个基本的开发平台,可以在上面搭建各种传感器,自定义功能,相对于四旋翼等安全系数高,技术能力要求较低,适合初学者,这样为以后做更复杂的嵌入式系统设计项目奠定坚实的基础。与此同时,本次项目多了个WiFi的功能,它要有一定的网络知识储备,需懂得串口通信,网络协议,服务器与客户端的连接等,对于开发其他一些连接家用WiFi的智能家居项目具有很好的帮助。.
举报

更多回帖

发帖
×
20
完善资料,
赚取积分