打印
[Beagle Bone]

【Beagle Bone开源设计】超声波避障小车

[复制链接]
3085|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 fjjjnk1234 于 2015-2-27 11:31 编辑

操作系统用的是Debian,程序用Python编写,主要实现电机驱动,舵机控制和超声波测距模块的控制。
         大致思路:通过超声波测距模块不断测量小车距离障碍物的距离,当距离小于20cm时,小车停止前进,超声波测距模块固定在舵机上,此时舵机由中间位置向左转动90度,测量一次距离,再由中间位置向右转动90度,测量一次距离,比较左右两边距离的大小,实现左转、右转或后退。电池用的是玩具车上拆下来的电池


【超声波测距部分】
TRIGGER引脚接P8_12
ECHO引脚接P8_11
程序:
#!/usr/bin/python
import Adafruit_BBIO.GPIO as GPIO
import time
def getDistanceCM():
        GPIO_TRIGGER = 'P8_12';
        GPIO_ECHO = 'P8_11';
        GPIO.setup(GPIO_TRIGGER,GPIO.OUT);
        GPIO.setup(GPIO_ECHO,GPIO.IN);

        GPIO_HIGH = GPIO.HIGH;
        GPIO_LOW = GPIO.LOW;

        GPIO.output(GPIO_TRIGGER, GPIO_LOW);
        time.sleep(0.00001);

        GPIO.output(GPIO_TRIGGER, GPIO_HIGH);
        time.sleep(0.00001);
        GPIO.output(GPIO_TRIGGER, GPIO_LOW);

        while GPIO.input(GPIO_ECHO)==GPIO_LOW:
                pass;
        start = time.time();

        while GPIO.input(GPIO_ECHO)==GPIO_HIGH:
                pass;
        stop = time.time();

        elapsed = stop-start;
        distance = elapsed * 34000;
        distance = distance / 2;
        GPIO.cleanup();
        return distance;

if __name__ == '__main__':
        while True:
                distance = getDistanceCM();
                time.sleep(0.5);
                print 'Distance: %f cm' % distance;
实验结果:
【舵机测试部分】
舵机控制用Python库的PWM实现,控制起来也挺简单的。
       舵机的基准信号都是周期为20ms,宽度为1.5ms。这个基准信号定义的位置为中间位置。舵机有最大转动角度,中间位置的定义就是从这个位置到最大角度与最小角度的量完全一样。
Python库中的PWM函数,一条语句就能控制舵机
PWM.start(channel,duty, freq=2000, polarity=0)
程序:
舵机信号引脚接P8_13
#!/usr/bin/python
import Adafruit_BBIO.PWM as PWM
import time

def servo_middle():
        PWM.start("P8_13", 7.5, 50, 0)

def servo_left():
        PWM.start("P8_13", 10, 50, 0)

def servo_right():
        PWM.start("P8_13", 5, 50, 0)

while True:
        servo_left()
        time.sleep(1)
        servo_right()
        time.sleep(1)
        servo_middle()
        time.sleep(1)
实现舵机左转、右转和处于中间位置
【电机驱动部分】
主要通过1L298N模块驱动4个减速电机,左边两个电机接一起,接L298N模块的OUT3OUT4,右边两个电机接一起,接L298N模块的OUT1OUT2
IN1P8_7
IN2P8_8
IN3P9_11
IN4P9_12
程序:
#!/usr/bin/python
import Adafruit_BBIO.GPIO as GPIO
import time

RIGHT_IN1 = 'P8_7'
RIGHT_IN2 = 'P8_8'
LEFT_IN3 = 'P9_11'
LEFT_IN4 = 'P9_12'

GPIO.setup(RIGHT_IN1, GPIO.OUT)
GPIO.setup(RIGHT_IN2, GPIO.OUT)
GPIO.setup(LEFT_IN3, GPIO.OUT)
GPIO.setup(LEFT_IN4, GPIO.OUT)

def front():
        GPIO.output(RIGHT_IN1, False)
        GPIO.output(RIGHT_IN2, True)
        GPIO.output(LEFT_IN3, False)
        GPIO.output(LEFT_IN4, True)

def back():
        GPIO.output(RIGHT_IN1, True)
        GPIO.output(RIGHT_IN2, False)
        GPIO.output(LEFT_IN3, True)
        GPIO.output(LEFT_IN4, False)

def stop():
        GPIO.output(RIGHT_IN1, False)
        GPIO.output(RIGHT_IN2, False)
        GPIO.output(LEFT_IN3, False)
        GPIO.output(LEFT_IN4, False)

def left():
        GPIO.output(RIGHT_IN1, False)
        GPIO.output(RIGHT_IN2, True)
        GPIO.output(LEFT_IN3, False)
        GPIO.output(LEFT_IN4, False)

def right():
        GPIO.output(RIGHT_IN1, False)
        GPIO.output(RIGHT_IN2, False)
        GPIO.output(LEFT_IN3, False)
        GPIO.output(LEFT_IN4, True)

if __name__ == '__main__':
    while True:
        front()
        time.sleep(5)
        back()
        time.sleep(5)
        left()
        time.sleep(5)
        right()
        time.sleep(5)
        stop()
        time.sleep(5)
实现小车前进、后退、左转弯、右转弯和停止
【综合测试】
程序仍然存在BUG,刚开始正常运行,一段时间后感觉程序就乱了,有待进一步解决,还请各位朋友指点一下。:L:L:L
程序:
#!/usr/bin/python
import Adafruit_BBIO.GPIO as GPIO
import Adafruit_BBIO.PWM as PWM
import time

def front():
        RIGHT_IN1 = 'P8_7'
        RIGHT_IN2 = 'P8_8'
        LEFT_IN3 = 'P9_11'
        LEFT_IN4 = 'P9_12'
        GPIO.setup(RIGHT_IN1, GPIO.OUT)
        GPIO.setup(RIGHT_IN2, GPIO.OUT)
        GPIO.setup(LEFT_IN3, GPIO.OUT)
        GPIO.setup(LEFT_IN4, GPIO.OUT)
        print 'front'
        GPIO.output(RIGHT_IN1, False)
        GPIO.output(RIGHT_IN2, True)
        GPIO.output(LEFT_IN3, False)
        GPIO.output(LEFT_IN4, True)

def back():
        RIGHT_IN1 = 'P8_7'
        RIGHT_IN2 = 'P8_8'
        LEFT_IN3 = 'P9_11'
        LEFT_IN4 = 'P9_12'
        GPIO.setup(RIGHT_IN1, GPIO.OUT)
        GPIO.setup(RIGHT_IN2, GPIO.OUT)
        GPIO.setup(LEFT_IN3, GPIO.OUT)
        GPIO.setup(LEFT_IN4, GPIO.OUT)
        print 'back'
        GPIO.output(RIGHT_IN1, True)
        GPIO.output(RIGHT_IN2, False)
        GPIO.output(LEFT_IN3, True)
        GPIO.output(LEFT_IN4, False)

def stop():
        RIGHT_IN1 = 'P8_7'
        RIGHT_IN2 = 'P8_8'
        LEFT_IN3 = 'P9_11'
        LEFT_IN4 = 'P9_12'
        GPIO.setup(RIGHT_IN1, GPIO.OUT)
        GPIO.setup(RIGHT_IN2, GPIO.OUT)
        GPIO.setup(LEFT_IN3, GPIO.OUT)
        GPIO.setup(LEFT_IN4, GPIO.OUT)
        print 'stop'
        GPIO.output(RIGHT_IN1, False)
        GPIO.output(RIGHT_IN2, False)
        GPIO.output(LEFT_IN3, False)
        GPIO.output(LEFT_IN4, False)

def left():
        RIGHT_IN1 = 'P8_7'
        RIGHT_IN2 = 'P8_8'
        LEFT_IN3 = 'P9_11'
        LEFT_IN4 = 'P9_12'
        GPIO.setup(RIGHT_IN1, GPIO.OUT)
        GPIO.setup(RIGHT_IN2, GPIO.OUT)
        GPIO.setup(LEFT_IN3, GPIO.OUT)
        GPIO.setup(LEFT_IN4, GPIO.OUT)
        print 'left'
        GPIO.output(RIGHT_IN1, False)
        GPIO.output(RIGHT_IN2, True)
        GPIO.output(LEFT_IN3, False)
        GPIO.output(LEFT_IN4, True)

def right():
        RIGHT_IN1 = 'P8_7'
        RIGHT_IN2 = 'P8_8'
        LEFT_IN3 = 'P9_11'
        LEFT_IN4 = 'P9_12'
        GPIO.setup(RIGHT_IN1, GPIO.OUT)
        GPIO.setup(RIGHT_IN2, GPIO.OUT)
        GPIO.setup(LEFT_IN3, GPIO.OUT)
        GPIO.setup(LEFT_IN4, GPIO.OUT)
        print 'right'
        GPIO.output(RIGHT_IN1, False)
        GPIO.output(RIGHT_IN2, False)
        GPIO.output(LEFT_IN3, False)
        GPIO.output(LEFT_IN4, True)

def getDistanceCM():
        GPIO_TRIGGER = 'P8_12';
        GPIO_ECHO = 'P8_11';
        GPIO.setup(GPIO_TRIGGER,GPIO.OUT);
        GPIO.setup(GPIO_ECHO,GPIO.IN);

        GPIO_HIGH = GPIO.HIGH;
        GPIO_LOW = GPIO.LOW;

        GPIO.output(GPIO_TRIGGER, GPIO_LOW);
        time.sleep(0.00001);

        GPIO.output(GPIO_TRIGGER, GPIO_HIGH);
        time.sleep(0.00001);
        GPIO.output(GPIO_TRIGGER, GPIO_LOW);

        while GPIO.input(GPIO_ECHO)==GPIO_LOW:
                pass;
        start = time.time();

        while GPIO.input(GPIO_ECHO)==GPIO_HIGH:
                pass;
        stop = time.time();

        elapsed = stop-start;
        distance = elapsed * 34000;
        distance = distance / 2;
        GPIO.cleanup();
        return distance;

def servo_middle():
        PWM.start("P8_13", 7.5, 50, 0)

def servo_left():
        PWM.start("P8_13", 10, 50, 0)

def servo_right():
        PWM.start("P8_13", 5, 50, 0)

if __name__ == '__main__':
    servo_middle()
    while True:
        distance = getDistanceCM()
        time.sleep(0.5)
        print 'Distance: %f cm' % distance
        if distance > 50:
            front()
            time.sleep(0.5)
            stop()
        elif distance > 20:
            front()
            time.sleep(0.2)
            stop()
        else:
            stop()
            servo_left()
            distance_l = getDistanceCM()
            time.sleep(0.5)
            print 'Distance_l: %f cm' % distance_l

            servo_right()
            distance_r = getDistanceCM()
            time.sleep(0.5)
            print 'Distance_r: %f cm' % distance_r

            servo_middle()

            if distance_l < 15.0 and distance_r < 15.0:
                back()
                time.sleep(0.3)
                stop()
            elif distance_l > distance_r:
                left()
                time.sleep(0.2)
                stop()
            else:
                right()
                time.sleep(0.2)
                stop()
RIGHT_IN1 = 'P8_7'
RIGHT_IN2 = 'P8_8'
LEFT_IN3 = 'P9_11'
LEFT_IN4 = 'P9_12'
GPIO.setup(RIGHT_IN1, GPIO.OUT)
GPIO.setup(RIGHT_IN2, GPIO.OUT)
GPIO.setup(LEFT_IN3, GPIO.OUT)
GPIO.setup(LEFT_IN4, GPIO.OUT)
这几句定义引脚输出的语句,本来是放在程序的开头执行,程序结合起来感觉语句好像“失效”了,电机不转,然后就在front()、back()、left()、right()等函数中都加上了,电机终于能转了,可能是对Python编程不够了解。



相关帖子

沙发
icecut| | 2015-2-28 16:40 | 只看该作者
这超声波避障模块有时候会输出错误脉宽.不知你是不是遇到这种麻烦了?

使用特权

评论回复
板凳
fjjjnk1234|  楼主 | 2015-3-1 10:37 | 只看该作者
icecut 发表于 2015-2-28 16:40
这超声波避障模块有时候会输出错误脉宽.不知你是不是遇到这种麻烦了?

应该是这种情况,程序错乱后,终止程序运行,提示的信息中包含这句while GPIO.input(GPIO_ECHO)==GPIO_HIGH:
        pass;,感觉会不会是模块输出的回响信号出错了

使用特权

评论回复
地板
icecut| | 2015-3-1 14:36 | 只看该作者
淘宝不可信,模块也就是玩具

使用特权

评论回复
5
zhangmangui| | 2015-3-1 22:41 | 只看该作者
楼主可以在增加红外臂章传感器   配合使用

使用特权

评论回复
6
fjjjnk1234|  楼主 | 2015-3-2 13:16 | 只看该作者
zhangmangui 发表于 2015-3-1 22:41
楼主可以在增加红外臂章传感器   配合使用

红外避障模块也有,改天试试。

使用特权

评论回复
7
zhangmangui| | 2015-3-2 21:55 | 只看该作者
fjjjnk1234 发表于 2015-3-2 13:16
红外避障模块也有,改天试试。

持续更新吧   

使用特权

评论回复
8
icecut| | 2015-3-20 12:12 | 只看该作者
用python ,开源色彩太重了...你怎么和opencv连接?

使用特权

评论回复
9
jw346045851| | 2015-8-18 20:18 | 只看该作者
楼主,你现在怎么调试好了吗

使用特权

评论回复
10
fjjjnk1234|  楼主 | 2015-8-18 23:45 | 只看该作者
jw346045851 发表于 2015-8-18 20:18
楼主,你现在怎么调试好了吗

没有时间继续调试了,各个模块分开调试都没问题,结合起来就出现小车不可控情况

使用特权

评论回复
11
Hywel| | 2016-2-23 18:43 | 只看该作者
想问下,你是怎么控制电机反转的,PWM信号只能调节电机的转速吧

使用特权

评论回复
12
fjjjnk1234|  楼主 | 2016-2-24 09:31 | 只看该作者
Hywel 发表于 2016-2-23 18:43
想问下,你是怎么控制电机反转的,PWM信号只能调节电机的转速吧

控制L298N的IN1,IN2为01或10,没有用到PWM,板子的PWM输出是单极性的,要用PWM控制前进后退,得两个控制引脚都具有PWM输出功能。

使用特权

评论回复
13
cnb12345| | 2016-4-26 14:58 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:相由心生,境随心转,一切法从心想生。

46

主题

524

帖子

7

粉丝