找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11820|回复: 1
打印 上一主题 下一主题
收起左侧

我对一个四驱四路循迹小车的arduino源程序的详细注释

[复制链接]
跳转到指定楼层
楼主
ID:320288 发表于 2018-8-17 15:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是我对搜集到的资料进行的分析,和我自己的想法在里面,欢迎大家讨论指正

arduino单片机源程序如下:
  1. #include <Servo.h>  
  2. 函数调用说明:调用servo.h里的库函数
  3. 类似stdio.h是标准输入输出,常用的 printf scanf 这些输入输出函数 以及fopen fclose一系列的文件操作函数都是在这个头文件里面的,所以这个最常见

  4. #define STOP      0
  5. #define FORWARD   1
  6. #define BACKWARD  2
  7. #define TURNLEFT  3
  8. #define TURNRIGHT 4

  9. int leftMotor1 = 16;       定义16引脚为“leftmotor”
  10. int leftMotor2 = 17;      
  11. int rightMotor1 = 18;
  12. int rightMotor2 = 19;

  13. int trac1 = 10; //从车头方向的最右边开始排序 (传感器)
  14. int trac2 = 11;
  15. int trac3 = 12;
  16. int trac4 = 13;

  17. int leftPWM = 5;     不是很懂
  18. int rightPWM = 6;

  19. Servo myServo;  //舵机 应该和循迹没什么关系

  20. int inputPin=7;   // 定义超声波信号接收接口
  21. int outputPin=8;  // 定义超声波信号发出接口

  22. void setup() {
  23.   // put your setup code here, to run once:
  24.   //串口初始化
  25.   Serial.begin(9600);
  26.   //舵机引脚初始化
  27.   myServo.attach(9);
  28.   //测速引脚初始化   非必须作用
  29. 我的理解:Mode为OUTPUT的都是需要单片机自己输出信号控制的pin引脚,INPUT的都是类似于传感器收集信息的
  30.   pinMode(leftMotor1, OUTPUT);
  31. 配置引脚为输出或输出模式,它是一个无返回值函数,函数有两个参数pin和mode,pin参数表示所要配置的引脚,mode参数表示设置的模式—INPUT(输入)或OUTPUT(输出)。
  32.   pinMode(leftMotor2, OUTPUT);
  33.   pinMode(rightMotor1, OUTPUT);
  34.   pinMode(rightMotor2, OUTPUT);
  35.   pinMode(leftPWM, OUTPUT);
  36.   pinMode(rightPWM, OUTPUT);
  37.   //寻迹模块D0引脚初始化
  38.   pinMode(trac1, INPUT);
  39.   pinMode(trac2, INPUT);
  40.   pinMode(trac3, INPUT);
  41.   pinMode(trac4, INPUT);
  42. }

  43. void loop()
  44. {
  45.   // put your main code here, to run repeatedly:

  46.   tracing();   
  47. 是一个函数,在下面有对这个函数的定义
  48. }
  49. void motorRun(int cmd,int value)
  50.        应该是在定义一个函数motorRun()
  51. {
  52.   analogWrite(leftPWM, value);  
  53. // 设置P WM输出,即设置速度 analogWrite(pin, value) 通过PWM的方式在引脚上输出一个模拟量,较多的应用在LED亮度控制、电机转速控制等方面。该函数支持以下引脚:3、5、6、9、10、11。在Arduino控制板上引脚号旁边标注~的就是可用作PWM的引脚,analogWrite函数为无返回值函数,有两个参数pin和value,参数pin表示所要设置的引脚,只能选择函数支持的引脚;参数value表示PWM输出的占空比,范围在0~255的区间,对应的占空比为0%~100%
  54.   analogWrite(rightPWM, value);
  55.   switch(cmd)
  56. {
  57. 判断cmd的状态:
  58. 如果cmd==FOTWARD,输出“FORWARD/r/n”的状态,为LEFTMotor1设置为高电平,为leftMotor2设置为低电平,为RightMotor1设置为高电平,为RightMotor2设置为低电平
  59.     case FORWARD:
  60.       Serial.println("FORWARD"); //输出状态
  61. Arduino 的输出基本就用两个函数 print 和 println,区别在于后者比前者多了回车换行,Serial.println(data)
  62. 从串行端口输出数据,跟随一个回车('r')和一个换行符('n')。这个函数所取得的值与 Serial.print()一样。
  63.       digitalWrite(leftMotor1, HIGH);
  64. 其作用为设置引脚的输出电压为高\低电平。该函数无返回值,有两个参数pin和value,pin参数表示所要设置的引脚,value参数表示输出的电压,HIGH为高电平,LOW为低电平。
  65. 在使用digitalWrite(pin, value)函数之前要将引脚设置为OUTPUT模式。
  66. 例:pinMode(x, OUTPUT);
  67. 其中x为引脚编号。pinMode函数用于设置引脚模式。

  68.       digitalWrite(leftMotor2, LOW);
  69.       digitalWrite(rightMotor1, HIGH);
  70.       digitalWrite(rightMotor2, LOW);
  71.       break;完成以上一系列函数后结束这个函数
  72.      case BACKWARD:
  73.       Serial.println("BACKWARD"); //输出状态
  74.       digitalWrite(leftMotor1, LOW);
  75.       digitalWrite(leftMotor2, HIGH);
  76.       digitalWrite(rightMotor1, LOW);
  77.       digitalWrite(rightMotor2, HIGH);
  78.       break;
  79.      case TURNLEFT:
  80.       Serial.println("TURN  LEFT"); //输出状态
  81.       digitalWrite(leftMotor1, HIGH);
  82.       digitalWrite(leftMotor2, LOW);
  83.       digitalWrite(rightMotor1, LOW);
  84.       digitalWrite(rightMotor2, HIGH);
  85.       break;
  86.      case TURNRIGHT:
  87.       Serial.println("TURN  RIGHT"); //输出状态
  88.       digitalWrite(leftMotor1, LOW);
  89.       digitalWrite(leftMotor2, HIGH);
  90.       digitalWrite(rightMotor1, HIGH);
  91.       digitalWrite(rightMotor2, LOW);
  92.       break;
  93.      default:
  94. 如果以上情况都不是,输出STOP,所有电机输出为低电平
  95.       Serial.println("STOP"); //输出状态
  96.       digitalWrite(leftMotor1, LOW);
  97.       digitalWrite(leftMotor2, LOW);
  98.       digitalWrite(rightMotor1, LOW);
  99.       digitalWrite(rightMotor2, LOW);
  100.   }
  101. }
  102. void tracing()            tracing()函数定义:上面void loop里面只有tracing这一个函数,arduino标准程序必须包含setup函数和loop函数,loop函数其实是一个循环,因为这个程序很简单没循环做的事情,所以循环函数为空,但必须要保留,这是arduino的语法规范。
  103. {
  104.   int data[4];               
  105. 定义一个数组data[]包含四个数据,读取来自10.11.12.13引脚的信号存储到这个数组中,而10.11.12.13引脚连接的就是四个传感器,因此这个数组的功能就是记录四个传感器的信号,由下面的程序可以知道,通过对这几个传感器信号的判断,并根据这几个不同的情况作出不同的反应
  106.   data[0] = digitalRead(10);
  107.   data[1] = digitalRead(11);
  108.   data[2] = digitalRead(12);
  109.   data[3] = digitalRead(13);

  110.   if(!data[0] && !data[1] && !data[2] && !data[3])  //左右都没有检测到黑线
  111.   {
  112.     motorRun(FORWARD, 200);
  113.   }

  114.   if(data[0] || data[1])  //右边检测到黑线
  115.   {
  116.     motorRun(TURNRIGHT, 150);
  117.   }

  118.   if(data[2] || data[3])  //左边检测到黑线
  119.   {
  120.     motorRun(TURNLEFT, 150);
  121.   }

  122.   if(data[0] && data[3])  //左右都检测到黑线是停止
  123.   {
  124.     motorRun(STOP, 0);
  125.     while(1);
  126.   }

  127.   Serial.print(data[0]);
  128.   Serial.print("---");
  129.   Serial.print(data[1]);
  130.   Serial.print("---");
  131.   Serial.print(data[2]);
  132.   Serial.print("---");
  133.   Serial.println(data[3]);
  134. }
复制代码

所有资料51hei提供下载:
程序注释.docx (25.6 KB, 下载次数: 42)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:457332 发表于 2019-3-23 21:46 | 只看该作者
Arduino的16 17口在哪
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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