本帖最后由 小志 于 2017-11-4 15:56 编辑
我看到网上有很多小伙伴做的超声波壁障小车都是用减速电机来作为动力输出,我觉得自己再做一个这样的意义也不怎么大,正好手头也没有电机驱动板。于是我就想能不能用连续旋转舵机舵机来作为动力输出,实验室也有很多这样的的舵机,我就不用在某宝上花钱买了O(∩_∩)O~,利用一周多的课余时间终于把这个小玩意儿搞好了,本着开源共享的理念,下面就让我细细道来:
材料:小车底盘、履带、
两个连续旋转舵机、一个标准小舵机(用来旋转超声波模块)
一个HC-SR04超声波模块、一个超声波模块旋转云台(支架)、
Arduino UNO、Arduino V5 拓展板(这个很好用)、
一个4.8V电池盒【舵机需要单独供电】、一块12V电池【主板】、
杜邦线若干、小螺钉螺母若干。
1.首先得把小车的底盘部分给搞好,在这里我得感谢一位我们机器人团队里的一位大神和我在实验室里拼了几个小时的底盘部分,我们装了拆,拆了装,直到诞生了我们都比较满意的这个底盘O(∩_∩)O~ 因为这些零件都是我从学院库房的某个角落里翻出来,东拼西凑的。
2.接下来,就是接线,接电池啥的。在这里我再次强调一下【舵机必须得单独供电】,在这里,我向大家推介一本书《Arduino机器人制作指南》,我从本书中获得了很大的帮助。也可以仿照我画的这张图接线(画的不是很好,大家能看懂就行O(∩_∩)O~):
3.安装好控制超声波模块的舵机。
4.安装好的整体效果图,简单的固定好,不是很美观 O(∩_∩)O~ 对于大神搞这些来说这都是小意思
5.上程序,经过我不断的调试,终于搞定了(这个程序也是参考了很多人的,在此表示感谢),有不足之处,望共同探讨,以求进步。 - /*
- Date:2016-03-21
- Name:超声波避障小车
- Writer: mengzhe
- Arduino IDE 1.5.6
- */
- #include <Servo.h> //调用舵机库
- Servo left;
- Servo right;
- Servo head; //定义左右和头部舵机名称
- const int TrigPin = 3;
- const int EchoPin = 2; //定义HC-SR04引脚
- float da;
- float dl;
- float dr; //将距离存储为单精度浮点数 前左右三组数据
- void setup()
- {
- Serial.begin(9600);// 初始化串口通信及连接SR04的引脚
- left.attach(10);
- right.attach(11);
- head.attach(12);
- pinMode(TrigPin, OUTPUT);
- pinMode(EchoPin, INPUT); // 要检测引脚上输入的脉冲宽度,需要先设置为输入状态
- Serial.println("Ultrasonic Car By Mengzhe");
- left.write(90);
- right.write(90);
- head.write(105); //小车初始化 停止 头朝前看
- Serial.println("System start complete");
- delay(1000);
- }
- void loop()
- {
- digitalWrite(TrigPin, LOW);
- delayMicroseconds(2);
- digitalWrite(TrigPin, HIGH);
- delayMicroseconds(10);
- digitalWrite(TrigPin, LOW);//产生一个10us的高脉冲触发TrigPin
- da = pulseIn(EchoPin, HIGH) / 58.00;//读取接收到反射时长 计算出距离并换算成cm
- if (da >= 20)
- {
- left.write(45);
- right.write(111);
- Serial.print("Distance = ");
- Serial.print(da);
- Serial.print("cm");
- Serial.print(" ");
- Serial.println("Moving advance");
- delay(500); //如果距离大于20cm则前进并输出"正在前进"
- }
- else if (da <= 20)
- {
- left.write(90);
- right.write(90);
- Serial.print("Distance = ");
- Serial.print(da);
- Serial.print(" ");
- Serial.println("Stopped"); //如果距离小于20cm则小车停止并输出"停止"
- head.write(180);
- delay(1000);
- digitalWrite(TrigPin, LOW);
- delayMicroseconds(2);
- digitalWrite(TrigPin, HIGH);
- delayMicroseconds(10);
- digitalWrite(TrigPin, LOW);
- dl = pulseIn(EchoPin, HIGH) / 58.00;
- Serial.print("Left distance = ");
- Serial.print(dl);
- Serial.print(" ");//头部舵机左转测量左边距离并输出
- head.write(25);
- delay(1000);
- digitalWrite(TrigPin, LOW);
- delayMicroseconds(2);
- digitalWrite(TrigPin, HIGH);
- delayMicroseconds(10);
- digitalWrite(TrigPin, LOW);
- dr = pulseIn(EchoPin, HIGH) / 58.00;
- Serial.print("Right distance = ");
- Serial.print(dr);
- Serial.print(" ");
- Serial.println();//头部舵机右转测量右边距离并输出
- head.write(105); //头部舵机回中
- if (dl >= 20 && dl <= 1000 && dl > dr)
- {
- left.write(180);
- right.write(180);
- Serial.println("Turning left");
- delay(900); //判断左右距离 若左边大则左转
- }
- else if (dl >= 1000)
- {
- left.write(0);
- right.write(0);
- Serial.println("Turning right");
- delay(900);
- //特殊情况 若左边返回距离大于1000则说明探头被遮挡 此时右转
- }
- else if (dr >= 20 && dr <= 1000 && dr > dl)
- {
- left.write(0);
- right.write(0);
- Serial.println("Turning right");
- delay(900); //判断左右距离 若右边大则右转
- }
- else if (dr >= 1000)
- {
- left.write(180);
- right.write(180);
- Serial.println("Turning left");
- delay(900);
- //特殊情况 若右边返回距离大于1000则说明探头被遮挡 此时左转
- }
- else if (dr <= 20 && dl <= 20)
- {
- left.write(180);
- right.write(180);
- Serial.println("Turning around");//若左右两边距离均小于20cm 则掉头
- delay(1500);
- }
- }
- }
复制代码
总:经过运行,小车的效果还是嘿棒滴,履带的可玩性也比较大。后期我会不断地往上加新的功能,欢迎共同探讨O(∩_∩)O~
PS:最近又重新搭了一次,运行不顺畅,感觉是出了bug
更多资讯信息可关注我的公众号:ChinanewsTT
|