標題: arduino智能紅外避障小車原理圖與源碼 [打印本頁]

作者: xina2030    時間: 2018-4-16 15:46
標題: arduino智能紅外避障小車原理圖與源碼



單片機源程序如下:
  1. //============================智宇科技===========================
  2. //  智能小車紅外避障實驗1(基礎(chǔ)避障)
  3. //===============================================================
  4. //#include <Servo.h>
  5. int Left_motor_go=8;     //左電機前進(IN1)
  6. int Left_motor_back=9;     //左電機后退(IN2)

  7. int Right_motor_go=10;    // 右電機前進(IN3)
  8. int Right_motor_back=11;    // 右電機后退(IN4)

  9. int key=7;//定義按鍵 數(shù)字7 接口
  10. int beep=12;//定義蜂鳴器 數(shù)字12 接口

  11. const int SensorRight = 3;           //右循跡紅外傳感器(P3.2 OUT1)
  12. const int SensorLeft = 4;             //左循跡紅外傳感器(P3.3 OUT2)

  13. const int SensorRight_2 = 5;           //右紅外傳感器(P3.4 OUT3)
  14. const int SensorLeft_2 = 6;     //左紅外傳感器(P3.5 OUT4)

  15. int SL;    //左循跡紅外傳感器狀態(tài)
  16. int SR;    //右循跡紅外傳感器狀態(tài)
  17. int SL_2;    //左紅外傳感器狀態(tài)
  18. int SR_2;    //右紅外傳感器狀態(tài)

  19. void setup()
  20. {
  21.   //初始化電機驅(qū)動IO為輸出方式
  22.   pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM)
  23.   pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)
  24.   pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM)
  25.   pinMode(Right_motor_back,OUTPUT);// PIN 11 (PWM)
  26.   pinMode(key,INPUT);//定義按鍵接口為輸入接口
  27.   pinMode(beep,OUTPUT);
  28.   pinMode(SensorRight, INPUT); //定義右循跡紅外傳感器為輸入
  29.   pinMode(SensorLeft, INPUT); //定義左循跡紅外傳感器為輸入
  30.   pinMode(SensorRight_2, INPUT); //定義右紅外傳感器為輸入
  31.   pinMode(SensorLeft_2, INPUT); //定義左紅外傳感器為輸入
  32. }
  33. //=======================智能小車的基本動作=========================
  34. //void run(int time)     // 前進
  35. void run()     // 前進
  36. {
  37.   digitalWrite(Right_motor_go,HIGH);  // 右電機前進
  38.   digitalWrite(Right_motor_back,LOW);     
  39.   analogWrite(Right_motor_go,200);//PWM比例0~255調(diào)速,左右輪差異略增減
  40.   analogWrite(Right_motor_back,0);
  41.   digitalWrite(Left_motor_go,LOW);  // 左電機前進
  42.   digitalWrite(Left_motor_back,HIGH);
  43.   analogWrite(Left_motor_go,0);//PWM比例0~255調(diào)速,左右輪差異略增減
  44.   analogWrite(Left_motor_back,200);
  45.   //delay(time * 100);   //執(zhí)行時間,可以調(diào)整  
  46. }

  47. void brake(int time)  //剎車,停車
  48. {
  49.   digitalWrite(Right_motor_go,LOW);
  50.   digitalWrite(Right_motor_back,LOW);
  51.   digitalWrite(Left_motor_go,LOW);
  52.   digitalWrite(Left_motor_back,LOW);
  53.   delay(time * 100);//執(zhí)行時間,可以調(diào)整  
  54. }

  55. //void left(int time)         //左轉(zhuǎn)(左輪不動,右輪前進)
  56. void left()         //左轉(zhuǎn)(左輪不動,右輪前進)
  57. {
  58.   digitalWrite(Right_motor_go,HIGH);        // 右電機前進
  59.   digitalWrite(Right_motor_back,LOW);
  60.   analogWrite(Right_motor_go,200);
  61.   analogWrite(Right_motor_back,0);//PWM比例0~255調(diào)速
  62.   digitalWrite(Left_motor_go,LOW);   //左輪后退
  63.   digitalWrite(Left_motor_back,LOW);
  64.   analogWrite(Left_motor_go,0);
  65.   analogWrite(Left_motor_back,0);//PWM比例0~255調(diào)速
  66.   //delay(time * 100);        //執(zhí)行時間,可以調(diào)整  
  67. }

  68. void spin_left(int time)         //左轉(zhuǎn)(左輪后退,右輪前進)
  69. {
  70.   digitalWrite(Right_motor_go,HIGH);        // 右電機前進
  71.   digitalWrite(Right_motor_back,LOW);
  72.   analogWrite(Right_motor_go,200);
  73.   analogWrite(Right_motor_back,0);//PWM比例0~255調(diào)速
  74.   digitalWrite(Left_motor_go,HIGH);   //左輪后退
  75.   digitalWrite(Left_motor_back,LOW);
  76.   analogWrite(Left_motor_go,200);
  77.   analogWrite(Left_motor_back,0);//PWM比例0~255調(diào)速
  78.   delay(time * 100);        //執(zhí)行時間,可以調(diào)整   
  79. }

  80. //void right(int time)
  81. void right()        //右轉(zhuǎn)(右輪不動,左輪前進)
  82. {
  83.   digitalWrite(Right_motor_go,LOW);   //右電機后退
  84.   digitalWrite(Right_motor_back,LOW);
  85.   analogWrite(Right_motor_go,0);
  86.   analogWrite(Right_motor_back,0);//PWM比例0~255調(diào)速
  87.   digitalWrite(Left_motor_go,LOW);//左電機前進
  88.   digitalWrite(Left_motor_back,HIGH);
  89.   analogWrite(Left_motor_go,0);
  90.   analogWrite(Left_motor_back,200);//PWM比例0~255調(diào)速
  91.   //delay(time * 100);        //執(zhí)行時間,可以調(diào)整  
  92. }

  93. void spin_right(int time)        //右轉(zhuǎn)(右輪后退,左輪前進)
  94. {
  95.   digitalWrite(Right_motor_go,LOW);   //右電機后退
  96.   digitalWrite(Right_motor_back,HIGH);
  97.   analogWrite(Right_motor_go,0);
  98.   analogWrite(Right_motor_back,200);//PWM比例0~255調(diào)速
  99.   digitalWrite(Left_motor_go,LOW);//左電機前進
  100.   digitalWrite(Left_motor_back,HIGH);
  101.   analogWrite(Left_motor_go,0);
  102.   analogWrite(Left_motor_back,200);//PWM比例0~255調(diào)速
  103.   delay(time * 100);        //執(zhí)行時間,可以調(diào)整   
  104. }

  105. void back(int time)          //后退
  106. {
  107.   digitalWrite(Right_motor_go,LOW);  //右輪后退
  108.   digitalWrite(Right_motor_back,HIGH);
  109.   analogWrite(Right_motor_go,0);
  110.   analogWrite(Right_motor_back,150);//PWM比例0~255調(diào)速
  111.   digitalWrite(Left_motor_go,HIGH);  //左輪后退
  112.   digitalWrite(Left_motor_back,LOW);
  113.   analogWrite(Left_motor_go,150);
  114.   analogWrite(Left_motor_back,0);//PWM比例0~255調(diào)速
  115.   delay(time * 100);     //執(zhí)行時間,可以調(diào)整
  116. }
  117. //==========================================================

  118. void keysacn()//按鍵掃描
  119. {
  120.   int val;
  121.   val=digitalRead(key);//讀取數(shù)字7 口電平值賦給val
  122.   while(!digitalRead(key))//當按鍵沒被按下時,一直循環(huán)
  123.   {
  124.     val=digitalRead(key);//此句可省略,可讓循環(huán)跑空
  125.   }
  126.   while(digitalRead(key))//當按鍵被按下時
  127.   {
  128.     delay(10);        //延時10ms
  129.     val=digitalRead(key);//讀取數(shù)字7 口電平值賦給val
  130.     if(val==HIGH)  //第二次判斷按鍵是否被按下
  131.     {
  132.       digitalWrite(beep,HIGH);                //蜂鳴器響
  133.       while(!digitalRead(key))        //判斷按鍵是否被松開
  134.         digitalWrite(beep,LOW);                //蜂鳴器停止
  135.     }
  136.     else
  137.       digitalWrite(beep,LOW);//蜂鳴器停止
  138.   }
  139. }

  140. void loop()
  141. {
  142.   keysacn();           //調(diào)用按鍵掃描函數(shù)
  143.   while(1)
  144.   {
  145.     //有信號為LOW  沒有信號為HIGH
  146.     SR_2 = digitalRead(SensorRight_2);
  147.     SL_2 = digitalRead(SensorLeft_2);
  148.     if (SL_2 == HIGH&&SR_2==HIGH)//前面沒有障礙物
  149.       run();   //調(diào)用前進函數(shù)
  150.     else if (SL_2 == HIGH & SR_2 == LOW)// 右邊探測到有障礙物,有信號返回,向左轉(zhuǎn)
  151.         left();//調(diào)用左轉(zhuǎn)函數(shù)
  152.     else if (SR_2 == HIGH & SL_2 == LOW) //左邊探測到有障礙物,有信號返回,向右轉(zhuǎn)  
  153.       right();//調(diào)用右轉(zhuǎn)函數(shù)
  154.     else // 都是有障礙物, 后退

  155.      {
  156.        back(3);//后退300MS
  157.        left();//調(diào)用左轉(zhuǎn)函數(shù)
  158.        delay(500);        //延時500ms
  159.      }

  160.   }
  161. }
復(fù)制代碼


作者: 了凡命館    時間: 2018-5-29 11:49
很好,學(xué)習(xí)了
作者: soulmatekk    時間: 2018-12-20 11:55
這個能用嗎
作者: RIAN5    時間: 2018-12-20 15:33
學(xué)習(xí)了
作者: 15277506085    時間: 2018-12-24 15:09
謝謝大佬分享!
作者: zrm111    時間: 2019-6-30 18:58
有電路圖嗎,大佬


作者: 長愛愛設(shè)計    時間: 2019-12-11 21:43
3路怎么設(shè)計???
作者: panlongdian    時間: 2020-2-1 10:09
受教了,謝謝樓主
作者: LYZ321520    時間: 2020-3-4 09:25
畫上面那個圖的軟件是啥?

作者: JTR單片機愛好    時間: 2020-4-22 22:47
LYZ321520 發(fā)表于 2020-3-4 09:25
畫上面那個圖的軟件是啥?

AD Altium Designer
作者: ddold    時間: 2021-6-24 14:03
可不可以給下源文件啊,大佬
作者: glinfei    時間: 2021-6-24 20:24
ddold 發(fā)表于 2021-6-24 14:03
可不可以給下源文件啊,大佬

本來四個紅外,只用了兩個,程序也過于簡單,所以車速不能快,也不適合走急彎。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1