Arduino论坛
直播中

王刚

12年用户 136经验值
擅长:接口/总线/驱动 控制/MCU
私信 关注
[经验]

【Landzo C1试用体验】基于Landzo C1的智能拖地机器人模型-结项报告

本帖最后由 liuxing4585 于 2016-8-4 00:56 编辑

前言:
之所以选择这个题材,是因为在试用Landzo C1两个月后,刚子对Landzo C1的基本模块都进行了了解,在这期间正好试用了一款智能拖地机器人,突然想到Landzo C1智能小车所配的模块,不就是智能拖地机上应该有的模块吗?因此萌生了这个实验的念头。

原理:
拖地机器人在原理上讲并不复杂,说白了就是一个带拖布的智能小车,在屋子里行驶时能够自动判断路况,进行避障行走。那我们需要用到Landzo C1的哪些模块呢?
需要用到的模块:
1.电机驱动模块。有了它才能实现行走。通过两轮的转速和方向改变实现前进、转向、后退。
2.红外遥控模块,可实现遥控。
3.超声波模块,实现前方避障。
4.红外避障模块(水平),检测后方障碍实现避障。
5.红外避障模块(垂直),检测地板有无,实现跌落检测。
6.按键模块,实现状态设定。
7.LED模块,实现状态显示。

接线:
1.电机驱动模块-D6 D9 GND VBAT D3 D5。
2.红外遥控模块- GND 5V D11。
3.超声波模块-GND D8 D7 5V。
4.红外避障模块(水平),- A4 A5。
5.红外避障模块(垂直),-D4 D2 5V GND。
6.按键模块,-GND 5V A0。
7.LED模块,-GND 5V D13。
8.舵机 -GND 5V D10
红外遥控器使用华为iptv机顶盒的遥控器,先测定键值:开机: 1303526340
前:1303532460
后:1303530420
左:1303550310
右;1303544700
音量+ 1303511550
音量-  1303544190
1    1303529910
2     1303562550
3    1303524300

程序:
  1. #define DEBUG 0    // set to 1 to print to serial monitor, 0 to disable
  2. #include
  3. #include
  4. Servo servo_pin_10;
  5. int findsomebodyL ;
  6. int findsomebodyR ;
  7. int findsomebodyVL ;
  8. int findsomebodyVR ;
  9. // Constants
  10. const int EchoPin = 8; //超声波信号输入
  11. const int TrigPin = 7; //超声波控制信号输出
  12. int maxspeed = 255;

  13. const int leftmotorpin1 = 3; // 直流电机信号输出
  14. const int leftmotorpin2 = 5;
  15. const int rightmotorpin1 = 6;
  16. const int rightmotorpin2 = 9;

  17. const int HeadServopin = 10; // 舵机信号输出 只有9或10接口可利用
  18. const int IRLpin = 18; // 红外输入
  19. const int IRRpin = 19; // 红外输入
  20. const int IRVRpin = 4; // 红外输入
  21. const int IRVLpin = 2; // 红外输入
  22. const int keypin = 14; // 按键输入
  23. const int remotepin = 11; // 按键输入
  24. int pos = 0;    // 该变量用与存储舵机角度位置

  25. int Status;
  26. // Variables
  27. long currDist = 0;    // 距离
  28. IRrecv irrecv(11);
  29. decode_results results;
  30. long unsigned int ReceiveCode;
  31. long unsigned int return_decode()
  32. {
  33.   if (irrecv.decode(&results)) {
  34.     irrecv.resume(); // 接收下一个值
  35.     return results.value;
  36.   }
  37.   else
  38.   {
  39.     return 0;
  40.     irrecv.resume(); // 接收下一个值
  41.   }
  42. }

  43. void servopulse(int val1)//定义一个脉冲函数
  44. { int myangle1 = map(val1, 0, 180, 500, 2480);
  45.   digitalWrite(HeadServopin, HIGH); //将舵机接口电平至高
  46.   delayMicroseconds(myangle1);//延时脉宽值的微秒数
  47.   digitalWrite(HeadServopin, LOW); //将舵机接口电平至低
  48.   delay(20 - val1 / 1000);
  49. }
  50. void setup() {

  51.   Serial.begin(9600); // 开始串行监测

  52.   //信号输入接口

  53.   pinMode(keypin, INPUT);

  54.   pinMode(IRLpin, INPUT);
  55.   pinMode(IRRpin, INPUT);
  56.   pinMode(IRVRpin, INPUT);
  57.   pinMode(IRVLpin, INPUT);
  58.   pinMode( leftmotorpin1, OUTPUT);
  59.   pinMode( leftmotorpin2, OUTPUT);
  60.   pinMode( rightmotorpin1 , OUTPUT);
  61.   pinMode( rightmotorpin2 , OUTPUT);
  62.   pinMode(HeadServopin , OUTPUT); //设定舵机接口为输出接口
  63.   pinMode(TrigPin, OUTPUT);
  64.   pinMode(EchoPin, INPUT);
  65.   pinMode(11, INPUT); //设置红外接收引脚为输入
  66.   irrecv.enableIRIn(); //初始化红外遥控
  67.   // servo_pin_10.write(10);delay(1000);
  68.   //  servo_pin_10.write( 90);delay(1000);
  69.   // servo_pin_10.write( 170);delay(1000);
  70.   totalhalt();    // stop!
  71.   Status = 0;
  72. }

  73. void loop() {
  74.   ReceiveCode = 0;
  75.   ReceiveCode = return_decode();
  76.   //  if ( ReceiveCode>0)
  77.   //  {
  78.   //    Serial.print("message");
  79.   //    Serial.print(" ");
  80.   //    Serial.print( ReceiveCode );
  81.   //    Serial.print(" ");
  82.   //    Serial.println();
  83.   //    delay( 500 );
  84.   //  }
  85.   currDist = MeasuringDistance(); //读取前端距离
  86.   findsomebodyL = digitalRead(IRLpin);
  87.   findsomebodyR = digitalRead(IRRpin);
  88.   findsomebodyVL = digitalRead(IRVLpin);
  89.   findsomebodyVR = digitalRead(IRVRpin);
  90.   //  if (DEBUG) {
  91.   //    Serial.print("Current Distance: ");
  92.   //    Serial.println(currDist);
  93.   //    Serial.print("findsomebodyL:");
  94.   //    Serial.println(findsomebodyL);
  95.   //    Serial.print("findsomebodyR:");
  96.   //    Serial.println(findsomebodyR);
  97.   //    Serial.print("findsomebodyVL:");
  98.   //    Serial.println(findsomebodyVL);
  99.   //    Serial.print("findsomebodyVR:");
  100.   //    Serial.println(findsomebodyVR);
  101.   //    Serial.print("Status:");
  102.   //    Serial.println(Status);
  103.   //  }

  104.   if (Status == 0)
  105.   {
  106.     totalhalt();    // stop!
  107.     if ( ReceiveCode == 1303526340)
  108.     {
  109.       Status = 1;
  110.     }
  111.    else  if ( ReceiveCode == 1303532460 )
  112.     {
  113.        nodanger();
  114.     }
  115.     else if ( ReceiveCode == 1303530420 )
  116.     {
  117.       backup();
  118.     }
  119.     else if ( ReceiveCode ==1303550310 )
  120.     {
  121.        body_lturn();
  122.     }
  123.     else if ( ReceiveCode == 1303544700)
  124.     {
  125.       body_rturn();
  126.     }
  127.   }
  128.   else  if (Status == 1)
  129.   {
  130.     if ( ReceiveCode == 1303529910)
  131.     {
  132.       Status = 0;

  133.     }
  134.     if (currDist >= 7000 && findsomebodyVR == 1 && findsomebodyVL == 1 ) {
  135.       nodanger();
  136.     }
  137.     else if (currDist < 7000 ||  findsomebodyVR == 0 || findsomebodyVL == 0 ) {
  138.       backup();
  139.      totalhalt();    // stop!
  140.     body_lturn();
  141.        totalhalt();    // stop!
  142.     nodanger();
  143.        totalhalt();    // stop!
  144.     body_lturn();
  145.        totalhalt();    // stop!
  146.     }

  147.   }

  148. }

  149. //测量距离 单位厘米
  150. long MeasuringDistance() {

  151.   digitalWrite(TrigPin, LOW);
  152.   delayMicroseconds(2);
  153.   digitalWrite(TrigPin, HIGH);
  154.   delayMicroseconds(5);
  155.   digitalWrite(TrigPin, LOW);
  156.   long duration = pulseIn(EchoPin, HIGH);
  157.   return duration * 17;
  158. }

  159. // 前进
  160. void nodanger() {

  161.   analogWrite(leftmotorpin1, 0);
  162.   analogWrite(leftmotorpin2, maxspeed);
  163.   analogWrite(rightmotorpin2, 0);
  164.   analogWrite(rightmotorpin1, maxspeed);
  165.   delay(100);
  166. // totalhalt();    // first stop!
  167.   return;
  168. }

  169. //后退
  170. void backup() {

  171.   analogWrite(leftmotorpin1, maxspeed);
  172.   analogWrite(leftmotorpin2, 0);
  173.   analogWrite(rightmotorpin2, maxspeed);
  174.   analogWrite(rightmotorpin1, 0);
  175.   delay(200);
  176. // totalhalt();    // first stop!
  177.   return;
  178. }

  179. //选择路线
  180. void whichway() {

  181.   totalhalt();    // first stop!
  182.   servo_pin_10.write(60);
  183.   delay(500);
  184.   int lDist = MeasuringDistance();   // check left distance
  185.   totalhalt();      // 恢复探测头
  186.   servo_pin_10.write(120);
  187.   delay(500);
  188.   int rDist = MeasuringDistance();   // check right distance

  189.   totalhalt();      // 恢复探测头

  190.   if (lDist >= 7000 && rDist < 7000)
  191.   {
  192.     body_lturn();
  193.   }
  194.   else if ( lDist < 7000 && rDist >= 7000)
  195.   {
  196.     body_rturn();
  197.   }
  198.   else if ( lDist < 7000 && rDist <= 7000)
  199.   {
  200.     if (lDist < rDist) {
  201.       body_lturn();
  202.     }
  203.     else {
  204.       body_rturn();
  205.     }
  206.   }



  207.   return;
  208. }

  209. //重新机械调整到初始状态
  210. void totalhalt() {
  211.   analogWrite(leftmotorpin1, 255);
  212.   analogWrite(leftmotorpin2, 255);
  213.   analogWrite(rightmotorpin1, 255);
  214.   analogWrite(rightmotorpin2, 255);
  215.   servo_pin_10.write( 90);
  216.   delay(100);


  217. }

  218. //左转
  219. void body_lturn() {

  220.   analogWrite(leftmotorpin1, 0);
  221.   analogWrite(leftmotorpin2, maxspeed);
  222.   analogWrite(rightmotorpin2, maxspeed);
  223.   analogWrite(rightmotorpin1, 0);
  224.   delay(100);
  225. // totalhalt();
  226. }

  227. //右转
  228. void body_rturn() {

  229.   analogWrite(leftmotorpin1, maxspeed);
  230.   analogWrite(leftmotorpin2,0);
  231.   analogWrite(rightmotorpin2, 0);
  232.   analogWrite(rightmotorpin1, maxspeed);
  233.   delay(100);
  234. // totalhalt();
  235. }

  236. void randTrun() {
  237.   long randNumber;
  238.   randomSeed(analogRead(0));
  239.   randNumber = random(0, 10);
  240.   if (randNumber > 5) {
  241.     body_rturn();
  242.   }
  243.   else
  244.   {
  245.     body_lturn();
  246.   }
  247. }


视频:

[media]http://player.youku.com/player.php/sid/XMTY3MDIyMDM3Ng==/v.swf[/media]


回帖(1)

王刚

2016-8-4 08:24:35
总结:经过两个月的试用,刚子对ArduinoLandzo C1有了基本的了解和认识,也能进行简单的开发应用了。总结一下经验教训吧。
1.由于Arduino不能进行在线调试,无法打断点查看状态,因此调试时最好把串口通信调通,用串口输出执行信息,方便掌握程序的运行状态,盲调的话太费力。
2.Landzo C1的接口设置有些不合理,很多接口引脚重复,使用时要注意不要冲突。
3.也许是加了减速机的原因,电机的调速不太好调整,占空比小了电机嗡嗡叫不转,占空比稍微一大速度又慢不下来。
4.做拖地机的话,需要加上陀螺仪或者码盘进行速度测量,更准确的检测运动状态,否则的话速度和电池电压有关系,导致调试时不太方便。


举报

更多回帖

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