查看: 4573|回复: 1

【KittenBot巡线小车试用】固件程序分析及M指令测试

[复制链接]
  • TA的每日心情
    开心
    2020-1-1 21:48
  • 签到天数: 778 天

    [LV.10]以坛为家III

    发表于 2017-11-4 23:58 | 显示全部楼层 |阅读模式
    接上一篇帖子
    【KittenBot巡线小车试用】让小车搭载摄像头-Arduino中文社区 - Powered by Discuz! http://www.arduino.cn/thread-67234-1-1.html

    官网细节问题只字未提,磕磕绊绊总算连上了app,后就看到官网权威发布了这个帖子
    手机APP一键玩转迷你巡线小车-Arduino中文社区 - Powered by Discuz! http://www.arduino.cn/thread-67254-1-1.html
    要是早出来该多好

    Kittenblock\arduino\libraries\MiniLFR\examples下有许多针对巡线小车的测试用例,如下
    31.jpg
    以blink.ino为例
    [mw_shl_code=cpp,true]void setup() {
      pinMode(11,OUTPUT);
      digitalWrite(11,0);
      pinMode(12,OUTPUT);
      digitalWrite(12,0);
    }

    void loop() {
      digitalWrite(11,0);
      digitalWrite(12,0);
      delay(2000);
      for(int i=0;i<3;i++){
        digitalWrite(11,1);
        digitalWrite(12,1);
        delay(300);
        digitalWrite(11,0);
        digitalWrite(12,0);
        delay(300);
      }
    }[/mw_shl_code]
    不同于以往的D13,这次是两个,查看电路图
    32.JPG
    不知道这是什么时候的电路图,我把小车看了个底朝天,也没找见两个LED(后面看程序猜测是那两个眼睛,但是连丝印也没有)及所连接的电阻R16、R19(你找见了吗?在两个LED下面),里面竟然还有Button0、Button1,完全和小车实际的按钮丝印对不上,只能查看程序对应。
    程序默认增加了液晶控制,但是LiquidCrystal_I2C lcd(0x20,16,2);
    地址是0x20,不适用常用的0x27、0x3f,也就是必须使用官方配套的液晶模块或者自己改造吧,怎么改造去问液晶屏卖家
    根据lcd.print("Hello K-Finder");
    所以LCD会显示上面内容


    充电时PWR1重复闪烁4下,表示什么状态?


    TM1637.h数码管模块驱动库,不知道这个是在巡线小车哪里接口连接?

    Kittenblock_V1.29.zip\Kittenblock\plugins\Linefollow\Linefollow.ino
    这个里面
    float Kp = 90; // 80
    float Ki = 0.15; // 0.15
    float Kd = 1200; //1200

    下面是控制左右轮正反转
    [mw_shl_code=bash,true]void updateMotorSpeed() {
      //spdR = -spdR;
      if (spdL < 0) {
        analogWrite(5, 0);
        analogWrite(6, -spdL);
      } else {
        analogWrite(5, spdL);
        analogWrite(6, 0);
      }

      if (spdR < 0) {
        analogWrite(9, 0);
        analogWrite(10, -spdR);
      } else {
        analogWrite(9, spdR);
        analogWrite(10, 0);
      }
    }[/mw_shl_code]


    M0:程序版本
    M1:循迹传感器二进制
    M2:PID
    M4:循迹传感器模拟值
    M6:开灯,小车左边LED亮,见图
    41.JPG 48.JPG
    关灯只能是M999指令吗?为什么只开左边一个灯?

    M7:输出distance,该值由下面算法得出,不知道这个58.2是怎么来的?
    [mw_shl_code=bash,true] temp=pulseIn(EYE_LEFT,HIGH);
      distance=(float)temp/58.2;[/mw_shl_code]
    M8:电池电压,函数是这么定义的,锂电池电压3.7V,为什么要*5.2?而不是3.7V?
    [mw_shl_code=bash,true]void doBattery(){
      int a = analogRead(A7);
      float v = float(a) / 1024.0 * 5.2;
      Serial.print("M8 ");
      Serial.println(v);
    }[/mw_shl_code]
    充电还是挺快的,没1min就增加了0.2V,见下图
    33.JPG
    这个值太不准了,第二次测试一下从2.6跳到3.6了,如下
    42.JPG
    M9、M10:返回button状态,但是代码是错的,两个代码返回同一个按钮
    void doButton1(){
      Serial.print("M9 ");Serial.println(btn1);
    }

    void doButton2(){
      Serial.print("M10 ");Serial.println(btn1);
    }

    试着在查询时,按下button1,返回低电平,
    43.JPG
    M12:红外发射
    M210:DC马达校准
    M214:左转弯,左轮不动,右轮旋转。返回的-17421不知道怎么来的?为什么是负数?测试时小车直接跑了,吓我一跳
    M300:加速度相关,这里返回初始化失败


    [mw_shl_code=bash,true]void parseCode(char * cmd) {
      int code;
      char * tmp;
      code = atoi(cmd);
      cmd = strtok_r(cmd, " ", &tmp);

      switch (code) {
        case 0:
          echoVersion();
          break;
        case 1:
          doGetSensor(tmp);

          break;
        case 2:
          doGetPid();

          break;
        case 3:
          doSetPid(tmp);

          break;
        case 4:
          doGetThreshold(tmp);

          break;
        case 5:
          doSetThreshold(tmp);

          break;
        // peripherals control
        case 6: // front eye command

          doEye(tmp);
          break;
        case 7: // ultrasonci sensor
          doDistance();


          break;
        case 8: // battery
          doBattery();

          break;
        case 9: // button 1 status
          doButton1();


          break;
        case 10: // button 2 status
          doButton2();


          break;
        //case 11: // irvalue
        //  doInfraRead();
        //  break;
        case 12: // ir send
          doInfraSend(tmp);


          break;
        case 13: // hover light
          doHoverLight(tmp);


          break;
        case 15: // lcd
          doLCD(tmp);
          break;
        case 16: // front rgb
          doFrontRGB(tmp);


          break;
        case 18: // buzzer
          doBuzzer(tmp);


          break;
        case 200:
          doDcSpeed(tmp);
          break;
        case 201:
          doCarMove(tmp);
          break;
        case 209:
          doWriteDcAdjust(tmp);
          break;
        case 210:
          doReadDcAdjust();
          break;
        case 214:
          doJoystick(tmp);
          break;
        case 215:
          setScene(tmp);
          break;
        case 216:
          doIREnable();
          break;
        case 217:
          doRingRGB(tmp);


          break;
        case 300:
          gyroCalibrate();

          break;
        case 999:
          asm volatile ("  jmp 0");
          break;
        default:

          break;
      }

    }[/mw_shl_code]

    命令测试图片
    44.JPG 45.JPG 46.JPG 47.JPG
  • TA的每日心情
    开心
    2020-1-1 21:48
  • 签到天数: 778 天

    [LV.10]以坛为家III

     楼主| 发表于 2017-11-5 00:04 | 显示全部楼层
    代码同时参考Kittenblock\plugins\Linefollow\\Linefollow.ino和Kittenblock下的arduino固件
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    新设计的一款遥控播放音乐机器人
    新设计的一款遥控播放音乐
    近期设计的一款遥控播放音乐歌曲的机器人终于完工了,DF mini mp3模块是真的强大。sol
    ESP8266物联网创意点阵时钟,女朋友看了都想要!
    ESP8266物联网创意点阵时
    [md]本文作者:默 & 铁熊 前段时间我在网上看到了一款很有意思的点阵时钟,它可以
    按键中断无法触发
    按键中断无法触发
    如题,按键中断无法触发,设成电平变化触发中断程序,但是flag的状态一直不变 void
    【原创】全球最小口袋3D打印机mini one直播教程贴
    【原创】全球最小口袋3D打
    最近闲得蛋疼,没事搞个掌上3D打印机,先放效果图吧。 搞了半天,终于能正常打印,
    OLED心率示波仪
    OLED心率示波仪
    在ARDUINO UNO开发板上插上一片0.96寸OLED显示屏并上传已下简单的程序就能构成一个OLE
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表