【KittenBot巡线小车试用】固件程序分析及M指令测试-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5675|回复: 1

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

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

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-1 00:00 , Processed in 0.175500 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表