|
这两天没事,根据论坛里Randy同学发的一个帖子,自己也DIY了一个小车。小车很简单,就是希望能做到简单的避障。
这个小车的程序和创意都是Randy同学的帖子里的,我只是修改了一下他的程序。
这是我做的小车:
小车的材料有:
1.一个arduino uno的板子;
2.一个L298N电机模块的板子;
3.小车底盘直接在淘宝上买的;
4.超声波测距模块一个。
这是小车的程序。因为我是第一次做,所以小车功能简单,只是想要做一个能够简单避障和转向的小车。
- const int EchoPin = 2; //超声波信号输入
- const int TrigPin = 3; //超声波控制信号输出
- const int leftmotorpin1 = 7; // 直流电机信号输出
- const int leftmotorpin2 = 6;
- const int rightmotorpin1 = 5;
- const int rightmotorpin2 = 4;
- int currDist = 0; // 距离
- void setup() {
- pinMode(EchoPin, INPUT);
- for (int pinindex = 3; pinindex < 8; pinindex++) {
- pinMode(pinindex, OUTPUT); // set pins 3 to 10 as outputs
- }
- }
- void loop() {
- currDist = MeasuringDistance(); //读取前端距离
- if(currDist > 20) {
- nodanger();
- }
- else if(currDist < 15){
- backup();
- randTrun();
- }
- else {
- //whichway();
- randTrun();
- }
- }
- //测量距离 单位厘米
- long MeasuringDistance() {
- long duration;
- //pinMode(TrigPin, OUTPUT);
- digitalWrite(TrigPin, LOW);
- delayMicroseconds(2);
- digitalWrite(TrigPin, HIGH);
- delayMicroseconds(10);
- digitalWrite(TrigPin, LOW);
- //pinMode(EchoPin, INPUT);
- duration = pulseIn(EchoPin, HIGH);
- return duration / 29 / 2;
- }
- // 前进
- void nodanger() {
- digitalWrite(leftmotorpin1, HIGH);
- digitalWrite(leftmotorpin2, LOW);
- digitalWrite(rightmotorpin1, HIGH);
- digitalWrite(rightmotorpin2, LOW);
- return;
- }
- //后退
- void backup() {
- digitalWrite(leftmotorpin1, LOW);
- digitalWrite(leftmotorpin2, HIGH);
- digitalWrite(rightmotorpin1, LOW);
- digitalWrite(rightmotorpin2, HIGH);
- delay(1000);
- }
- void totalhalt() {
- digitalWrite(leftmotorpin1, HIGH);
- digitalWrite(leftmotorpin2, HIGH);
- digitalWrite(rightmotorpin1, HIGH);
- digitalWrite(rightmotorpin2, HIGH);
- return;
- delay(500);
- }
- //左转
- void body_lturn() {
- digitalWrite(leftmotorpin1, LOW);
- digitalWrite(leftmotorpin2, HIGH);
- digitalWrite(rightmotorpin1, HIGH);
- digitalWrite(rightmotorpin2, LOW);
- delay(500);
- totalhalt();
- }
- //右转
- void body_rturn() {
- digitalWrite(leftmotorpin1, HIGH);
- digitalWrite(leftmotorpin2, LOW);
- digitalWrite(rightmotorpin1, LOW);
- digitalWrite(rightmotorpin2, HIGH);
- delay(500);
- totalhalt();
- }
- void randTrun(){
- long randNumber;
- randomSeed(analogRead(0));
- randNumber = random(0, 10);
- if(randNumber > 5) {
- body_rturn();
- }
- else
- {
- body_lturn();
- }
- }
复制代码
花了一天时间组装和调试了程序后出现一些问题。
1.我修改后的这个auduino(就是上面这个程序)原意是,小车超声波模块测距前方15厘米以内有障碍物,则后退1秒然后随机左转或者右转,若前方没有障碍物或者障碍物距离大于20厘米,则继续前进。不过我发现小车并没有按照我想的那样,经常会无故的后退或者转向。这个问题在室内尤为明显,在空旷的地方会好一点。不明白是什么原因,是测距模块不够准确还是我改的这个程序有问题呢?
2.超声波模块里有个测算前方距离的公式:US/58,不明白这个公式是什么意思。不知道有没有谁懂的能解释一下呢。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|