找回密码
 立即注册

QQ登录

只需一步,快速开始

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

Arduino红外避障

[复制链接]
跳转到指定楼层
楼主
ID:672963 发表于 2019-12-29 10:23 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
  1. #include <LiquidCrystal.h>
  2. // initialize the library by associatingany needed LCD interface pin
  3. // with the arduino pin number it isconnected to
  4. const int rs = 53, en = 49, d4 = 47, d5 =45, d6 = 43, d7 = 41.;
  5. LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

  6. #define INA1 22  //TB6612FNG驱动模块控制信号 共6个
  7. #define INA2 26
  8. #define INB1 24
  9. #define INB2 28
  10. #define INC1 30  //TB6612FNG驱动模块控制信号 共6个
  11. #define INC2 34
  12. #define IND1 32
  13. #define IND2 36

  14. #define PWMA 8  //OC4C
  15. #define PWMB 7  //OC4B
  16. #define PWMC 6 //OC4C
  17. #define PWMD 5  //OC4B


  18. float Kp = 15, Ki = 0 , Kd = 0;
  19. static float error = 0, P = 0, I = 0, D =0, PID_value = 0;
  20. float previous_error = 0, previous_I = 0;
  21. static int initial_motor_speed = 140; //期望速度
  22. int left_motor_speed = 0;
  23. int right_motor_speed = 0;
  24. uint8_t irs = 0;
  25. static int a = 9 , b = 6, c = 5, d;

  26. static int key = 0;
  27. static int MERIDIAN = 0;
  28. static int WEFT = 0;
  29. static int meridian = 0;
  30. static int weft = 0;
  31. static int flag1 = 0;
  32. static int flag2  = 0;
  33. unsigned int aa;

  34. const int IR_PIN[] = {A0, A1, A2, A3, A4};//红外对管引脚定义
  35. void read_ir_values(void);
  36. void calculate_pid(void);
  37. void motor_control(void);
  38. void LCD_PRINT(void);
  39. void ISRR1();
  40. void ISRL1();
  41. void STEP_FRONT(void);
  42. void STEP_RIGHT(void);
  43. void STEP_LEFT(void);
  44. void STEP_TOUCH(void);
  45. void Set_Pwm(int left_motor_speed, intright_motor_speed);

  46. void setup()
  47. {
  48. lcd.begin(16, 2);
  49. meridian = 0;
  50. weft = 0;
  51.   key= 0;
  52. pinMode(INA1, OUTPUT);        //TB6612控制引脚,控制电机1的方向,01为正转,10为反转
  53. pinMode(INA2, OUTPUT);         //TB6612控制引脚,
  54. pinMode(INB1, OUTPUT);       //TB6612控制引脚,控制电机1的方向,01为正转,10为反转
  55. pinMode(INB2, OUTPUT);         //TB6612控制引脚,
  56. pinMode(PWMA, OUTPUT);        //TB6612控制引脚,电机PWM
  57. pinMode(PWMB, OUTPUT);        //TB6612控制引脚,电机PWM
  58. pinMode(INC1, OUTPUT);       //TB6612控制引脚,控制电机1的方向,01为正转,10为反转
  59. pinMode(INC2, OUTPUT);         //TB6612控制引脚,
  60. pinMode(IND1, OUTPUT);       //TB6612控制引脚,控制电机1的方向,01为正转,10为反转
  61. pinMode(IND2, OUTPUT);         //TB6612控制引脚,
  62. pinMode(PWMC, OUTPUT);        //TB6612控制引脚,电机PWM
  63. pinMode(PWMD, OUTPUT);        //TB6612控制引脚,电机PWM
  64. pinMode(A0, 0);         //TB6612控制引脚,电机PWM
  65. pinMode(A1, 0);
  66. pinMode(A5, 0);         //TB6612控制引脚,电机PWM
  67. pinMode(A6, 0);
  68. pinMode(A8, 0);
  69. digitalWrite(14, 0);         //TB6612控制引脚拉低
  70. digitalWrite(15, 0);         //TB6612控制引脚拉低
  71. analogWrite(PWMA, 0);         //TB6612控制引脚拉低
  72. analogWrite(PWMB, 0);         //TB6612控制引脚拉低
  73. analogWrite(PWMC, 0);         //TB6612控制引脚拉低
  74. analogWrite(PWMD, 0);         //TB6612控制引脚拉低
  75.   for(int i = 0; i < 4; i++)
  76. {
  77. pinMode(IR_PIN[i], INPUT);
  78.   }
  79. Serial2.begin(9600);
  80. attachInterrupt(3, ISRL1, CHANGE); //开启外部中断2
  81. attachInterrupt(2, ISRR1, CHANGE); //开启外部中断3
  82. attachInterrupt(4, XIAN1, CHANGE); //开启外部中断2
  83. //attachInterrupt(5, XIAN2, CHANGE); //开启外部中断3
  84.   Kp= 20 , Ki = 0, Kd = 0, a = 9 , c = 5, initial_motor_speed = 60; //期望速度;
  85. }

  86. void loop()
  87. {
  88.   if((digitalRead(A0)==0)&&(digitalRead(A1)==0))//右
  89. {
  90.   Set_Pwm(-100,-100);
  91.   delay(500);
  92. }
  93. else if( digitalRead(A0)==0)//右
  94. {
  95.   Set_Pwm(-100, 100);
  96.   delay(500);
  97. }
  98.    else if( digitalRead(A1)==0)//右
  99. {
  100.   Set_Pwm(100, -100);
  101.   delay(500);
  102. }
  103. else
  104.   {
  105.   Set_Pwm(100, 100);
  106. }

  107. }
  108. void Set_Pwm(int motoA, int motoB)
  109. {
  110.   if(motoA > 0)
  111.   {
  112.    digitalWrite(INA1, HIGH),     digitalWrite(INA2, LOW);  //TB6612的电平控制
  113.    digitalWrite(INC1, HIGH),     digitalWrite(INC2, LOW);  //TB6612的电平控制
  114.   }
  115. else
  116.   {
  117.    digitalWrite(INA1, LOW),      digitalWrite(INA2, HIGH); //TB6612的电平控制
  118.    digitalWrite(INC1, LOW),      digitalWrite(INC2, HIGH); //TB6612的电平控制
  119.   }

  120.   if(motoB > 0)
  121.   {
  122.    digitalWrite(INB1, HIGH),     digitalWrite(INB2, LOW);  //TB6612的电平控制
  123.    digitalWrite(IND1, HIGH),     digitalWrite(IND2, LOW);  //TB6612的电平控制
  124.   }
  125. else
  126.   {
  127.    digitalWrite(INB1, LOW),      digitalWrite(INB2, HIGH); //TB6612的电平控制
  128.    digitalWrite(IND1, LOW),       digitalWrite(IND2, HIGH); //TB6612的电平控制
  129.   }

  130.   {
  131.    analogWrite(PWMA, abs(motoA)); //赋值给PWM寄存器
  132.    analogWrite(PWMB, abs(motoB)); //赋值给PWM寄存器
  133.     analogWrite(PWMC, abs(motoA)); //赋值给PWM寄存器
  134.    analogWrite(PWMD, abs(motoB)); //赋值给PWM寄存器
  135.   }
  136. }

  137. void ISRL1()//外部中断2
  138. {
  139. flag1 = 1;
  140. }

  141. void ISRR1()//外部中断3
  142. {
  143. flag1 = 1;
  144. }

  145. void XIAN1()//外部中断2
  146. {
  147. flag1 = 2;
  148. }

  149. void XIAN2()//外部中断3
  150. {
  151. flag1 = 2;
  152. }
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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