云天 发表于 2023-1-8 18:16:17

利用旧手机自制OpenBot

本帖最后由 云天 于 2023-1-8 18:34 编辑


OpenBot是什么?OpenBot利用智能手机作为低成本机器人的大脑。intel工程师设计了一款小型电动车,机器人车身的各种配件加一起售价约50美金。 同时开发了Android智能手机软件,支持先进的机器人功能,如人跟踪和实时自主导航。开源:https://github.com/isl-org/OpenBot
【项目设计】
我也有旧手机,当然我不会直接使用开源的代码来实现我的OpenBot,搞清楚它的工作原理后,我准备自制,包括编写手机端程序。
【OTG】
手机与Arduino使用OTG功能连接。
目前市面上的大部分手机都会具备OTG功能。OTG是USB On-The-Go的缩写,是近年发展起来的技术,2001年12月18日由USB Implementers Forum公布,主要应用于各种不同的设备或移动设备间的联接,进行数据交换。手机OTG一般默认是关闭状态。在设置中的更多设置中找到。需要两个硬件:1、OTG转接头2、FT232 USB转TTL 串口线。
【OTG连接测试】
1、连接硬件

L289N外接电源,并与Arduino共地,E1接5(PWM引脚),M1接7,E2接6(PWM引脚),M2接4。
手机插OTG转接口,接USB转TTL 串口线,串口线红线(VCC)接Arduino板VIN引脚(给主板供电),黑线(GND)接GND引脚,绿线(TX)接0引脚(RX),白线接1引脚(TX)。

2、Arduino程序

//定义一个comdata字符串变量,赋初值为空值
    String comdata = "";
    //numdata是分拆之后的数字数组
    int numdata = {0}, PWMPin = { 5, 6, 7, 8}, mark = 0;
    void setup()
    {
    //定义0~6脚是输出
      for(int i = 0; i <4; i++) pinMode(PWMPin, OUTPUT);
      Serial.begin(9600);
    }
   
    void loop()
    {
    //j是分拆之后数字数组的位置记数
      int j = 0;
   
      //不断循环检测串口缓存,一个个读入字符串,
      while (Serial.available() > 0)
      {
      //读入之后将字符串,串接到comdata上面。
      comdata += char(Serial.read());
          //延时一会,让串口缓存准备好下一个数字,不延时会导致数据丢失,
      delay(2);
      //标记串口读过数据,如果没有数据的话,直接不执行这个while了。
      mark = 1;
      }
   
      if(mark == 1)//如果接收到数据则执行comdata分析操作,否则什么都不做。
      {
      //显示刚才输入的字符串(可选语句)
      Serial.println(comdata);
          //显示刚才输入的字符串长度(可选语句)
      Serial.println(comdata.length());
   
    /*******************下面是重点*******************/
    //以串口读取字符串长度循环,
      for(int i = 0; i < comdata.length() ; i++)
      {
      //逐个分析comdata字符串的文字,如果碰到文字是分隔符(这里选择逗号分割)则将结果数组位置下移一位
      //即比如11,22,33,55开始的11记到numdata;碰到逗号就j等于1了,
      //再转换就转换到numdata;再碰到逗号就记到numdata;以此类推,直到字符串结束
          if(comdata == ',')
          {
            j++;
          }
          else
          {
             //如果没有逗号的话,就将读到的数字*10加上以前读入的数字,
             //并且(comdata - '0')就是将字符'0'的ASCII码转换成数字0(下面不再叙述此问题,直接视作数字0)。
             //比如输入数字是12345,有5次没有碰到逗号的机会,就会执行5次此语句。
             //因为左边的数字先获取到,并且numdata等于0,
             //所以第一次循环是numdata = 0*10+1 = 1
             //第二次numdata等于1,循环是numdata = 1*10+2 = 12
             //第三次是numdata等于12,循环是numdata = 12*10+3 = 123
             //第四次是numdata等于123,循环是numdata = 123*10+4 = 1234
             //如此类推,字符串将被变成数字0。
            numdata = numdata * 10 + (comdata - '0');
          }
      }
      //comdata的字符串已经全部转换到numdata了,清空comdata以便下一次使用,
      //如果不请空的话,本次结果极有可能干扰下一次。
      comdata = String("");
   
   
      //循环输出numdata的内容,并且写到PWM引脚
      analogWrite(PWMPin, numdata);
      analogWrite(PWMPin, numdata);
      digitalWrite(PWMPin, numdata);
      digitalWrite(PWMPin, numdata);
      for(int i = 0; i < 4; i++)
      {
          //Serial.print("Pin ");
          //Serial.print(PWMPin);
          //Serial.print(" = ");
          //Serial.println(numdata);
         
          numdata = 0;
      }
      //输出之后必须将读到数据的mark置0,不置0下次循环就不能使用了。
      mark = 0;
      }
    }

串口通信一次性传输四位数字中间用“,”分隔,如“255,255,1,1”,分别为“左轮PWM,右轮PWM,左轮正反转,右轮正反转”。3、App Inventor2程序使用https://app.wxbit.com/平台
源文件:

4、测试演示视频
https://www.bilibili.com/video/BV1kG4y1m7vt/?share_source=copy_web&vd_source=98855d5b99ff76982639c5ca6ff6f528

【OpenBot智能车】

1、使用了DF“履带机器人移动平台”

2、App Inventor2使用扩展


3、App Inventor2编程


【演示视频】
https://www.bilibili.com/video/BV1MP4y1C74q/?share_source=copy_web&vd_source=98855d5b99ff76982639c5ca6ff6f528


三春牛-创客 发表于 2023-1-10 12:35:17

厉害厉害

三春牛-创客 发表于 2023-1-10 12:37:55

{:6_215:}{:6_215:}{:6_215:}

三春牛-创客 发表于 2023-1-12 15:35:18

想用这个软件制作的网站,但是为什么要钱啊?

云天 发表于 2023-1-12 15:44:23

三春牛-创客 发表于 2023-1-12 15:35
想用这个软件制作的网站,但是为什么要钱啊?

不使用它的VIP插件,就都是免费的,功能还是比较多的。
页: [1]
查看完整版本: 利用旧手机自制OpenBot