我建造了这个自主机器人来检测和避免障碍。包括代码。

这是一个简单的自主机器人,能够检测并避免障碍物。我使用便宜的4WD机器人平台(您可以使用任何一种 这些平台),一个Arduino UNO($ 18.59 on 亚马孙)和便宜的HC-SR04传感器(2件装,价格$ 2.83起 亚马孙)。

机器人被编程为向前行驶,直到检测到障碍物为止。然后,它左右旋转传感器。比较超声传感器返回的值并做出决定。

这是Arduino代码:

C ++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
/ **
* @文件        Arduino UNO自主机器人
* @作者      卡林·德拉戈斯(Calin Dragos)for inrobotics.com
* @版本      V1.0
* @日期         13.10.2016
* @说明  这是能够检测并避开障碍物的自主机器人的Arduino草图
* /
 
#包括<AFMotor.h>
#包括<Servo.h>
#包括<NewPing.h>
 
伺服 Myservo;
 
整型 ENABLE_A = 6;
整型 PIN_A1 = 3;
整型 PIN_A2 = 2;
 
整型 ENABLE_B = 11;
整型 PIN_B1 = 5;
整型 PIN_B2 = 4;
 
整型 SENSOR_DISTANCE;
整型 LEFT_SENSOR_DISTANCE;
整型 RIGHT_SENSOR_DISTANCE;
整型 SNZ_DISTANCE_L;
整型 SNZ_DISTANCE_R;
整型 LFT_SNZ_DIS;
整型 RGT_SNZ_DIS;
 
#定义TRIG_PIN 7
#定义ECHO_PIN 8
#定义MIN_DISTANCE 40
#定义MAX_DISTANCE 200
#定义间隔200
 
 
新平 声纳(TRIG_PIN, ECHO_PIN, MAX_DISTANCE);
  
虚空 设定() {
  
   序列号.开始(9600);
  
  //直流电动机的引脚模式
   pinMode (ENABLE_A, 输出值);
   pinMode (PIN_A1, 输出值);
   pinMode (PIN_A2, 输出值);
 
   pinMode (ENABLE_B, 输出值);
   pinMode (PIN_B1, 输出值);
   pinMode (PIN_B2, 输出值);
 
   //超声波传感器的引脚模式
   pinMode(TRIG_PIN, 输出值);
   pinMode(ECHO_PIN, 输入);
 
   //用于伺服电机
   Myservo.连接(9);
 
  //将超声波传感器设置为居中  
   传感器中心();
      
  //停止电动机
   stopMotors();  
}
 
 
虚空 循环() {
    
    SENSOR_DISTANCE=sensorDistance();
    序列号.打印(“前传感器距离为:”);
    序列号.打印(SENSOR_DISTANCE);
 
    如果 (SENSOR_DISTANCE >= MIN_DISTANCE || SENSOR_DISTANCE==0)
      {
      前进();
      序列号.打印(“前进”);
        }
      其他 {
        
      //停止电动机
      stopMotors();
 
      LFT_SNZ_DIS=向左转();
      RGT_SNZ_DIS=在右边();
 
          如果 (LFT_SNZ_DIS >= MIN_DISTANCE && LFT_SNZ_DIS >= RGT_SNZ_DIS)
           {
            整型 NEW_SNZ_DIS_LFT;
             //尝试三次以逃脱
             对于(整型 i=1;i<=3;i++){
              往左走();
              序列号.打印(“往左走”);
              延迟(300);
              //停止电动机
              stopMotors();
               NEW_SNZ_DIS_LFT=sensorDistance();
               如果 (NEW_SNZ_DIS_LFT >=MIN_DISTANCE)
                  {
                打破;
                }
              
             }
              传感器中心();
              
          }
            其他 如果 (RGT_SNZ_DIS >= MIN_DISTANCE && RGT_SNZ_DIS >= LFT_SNZ_DIS)
            {
             整型 NEW_SNZ_DIS_RGT;
             //尝试三次以逃脱  
             对于(整型 j=1;j<=3;j++){
              向右走();
              序列号.打印(“向右走”);
              延迟(300);
              //停止电动机
              stopMotors();
              NEW_SNZ_DIS_RGT=sensorDistance();
              如果 (NEW_SNZ_DIS_RGT >=MIN_DISTANCE)
                  {
                打破;
                }
              
             }
              传感器中心();
          }
         其他
            {
              向后走();
              序列号.打印(“后退”);
              延迟(500);      
              //停止电动机
              stopMotors();
              传感器中心();
            }
      }
 
}
 
 
虚空 stopMotors(){
  AnalogWrite (ENABLE_A, 0);
  AnalogWrite (ENABLE_B, 0);
  digitalWrite (PIN_A1, );
  digitalWrite (PIN_A2, );
  digitalWrite (PIN_B1, );
  digitalWrite (PIN_B2, );
  }
整型 sensorDistance(){
  整型 距离;
  整型 我们 = 声纳.ping();
  距离 = 我们 / US_ROUNDTRIP_CM;
  如果 (距离 !=0){
  返回 距离;
  延迟(300);
    }
  }
 
虚空 前进(){
  AnalogWrite (ENABLE_A, 255);
  digitalWrite (PIN_A1, );
  digitalWrite (PIN_A2, );
  AnalogWrite (ENABLE_B, 255);
  digitalWrite (PIN_B1, );
  digitalWrite (PIN_B2, );
  }
 
虚空 向后走(){
  AnalogWrite (ENABLE_A, 180);
  digitalWrite (PIN_A1, );
  digitalWrite (PIN_A2, );
  AnalogWrite (ENABLE_B, 180);
  digitalWrite (PIN_B1, );
  digitalWrite (PIN_B2, );
  }
 
 
虚空 往左走(){
  AnalogWrite (ENABLE_A, 180);
  digitalWrite (PIN_A1, );
  digitalWrite (PIN_A2, );
  AnalogWrite (ENABLE_B, 180);
  digitalWrite (PIN_B1, );
  digitalWrite (PIN_B2, );
}
 
 
虚空 向右走(){
  AnalogWrite (ENABLE_A, 180);
  digitalWrite (PIN_A1, );
  digitalWrite (PIN_A2, );
  AnalogWrite (ENABLE_B, 180);
  digitalWrite (PIN_B1, );
  digitalWrite (PIN_B2, );
}
 
虚空 传感器中心(){
  Myservo.(90);
  延迟(500);
}
虚空 turnSensorLeft(){
  Myservo.(120);
  延迟(500);
}
 
虚空 turnSensorRight(){
  Myservo.(60);
  延迟(500);
}
整型 leftSensorDistance(){
    整型 LEFT_SENSOR_DISTANCE;
    LEFT_SENSOR_DISTANCE=sensorDistance();
    返回 LEFT_SENSOR_DISTANCE;
  }
 
整型 rightSensorDistance(){
    整型 RIGHT_SENSOR_DISTANCE;
    RIGHT_SENSOR_DISTANCE=sensorDistance();
    返回 RIGHT_SENSOR_DISTANCE;
  }
    
整型 向左转(){
    整型 LEFT_SENSOR_DISTANCE;
    turnSensorLeft();
    LEFT_SENSOR_DISTANCE=leftSensorDistance();
    序列号.打印(“左传感器距离为:”);
    序列号.打印(LEFT_SENSOR_DISTANCE);
    返回 LEFT_SENSOR_DISTANCE;
}  
 
整型 在右边(){
    整型 RIGHT_SENSOR_DISTANCE;
    turnSensorRight();
    RIGHT_SENSOR_DISTANCE=rightSensorDistance();
    序列号.打印(“右传感器距离为:”);
    序列号.打印(RIGHT_SENSOR_DISTANCE);
    返回 RIGHT_SENSOR_DISTANCE;
}  

这就是机器人在我的厨房中自主导航的方式:

8条评论 » Write a comment

  1. 出色的工作,我本人和许多其他人只能梦想获得如此出色的成就。

  2. 你好。这次真是万分感谢。您能告诉我您用来左右移动传感器的组件吗?我在网上找到了一些东西,但它们似乎很昂贵?

发表回覆 斯特凡 取消回复

您的电子邮件地址不会被公开。 必需的地方已做标记 *