美文网首页
树莓派开发记录(一期)

树莓派开发记录(一期)

作者: 玩具熊 | 来源:发表于2020-10-20 13:27 被阅读0次

1.目标:

实现一个智能小车,包含感应,语音,运动等功能。

2.物料:

树莓派4,L298n模块,HC-SR501红外人体感应模块,摄像头模块,usb麦克风,蓝牙音箱,小车底板(包含四个电机)。

3.过程:

    3.1 树莓派4烧录注意点:

        多试几个镜像,镜像不对会启动失败,可以去清华大学镜像站下img。

    3.2.人体感应模块接线

        hc-sr501插线,三个跳线面对自己,从左到右,5V,GND,GPIO,我接的是5v,gnd,gpio18引脚。

    3.3语音合成

        调用百度智能平台语音api

    3.4小车

        3.4.1  用3.5V锂电池。

        3.4.2  2个马达分别接上L298n左右两边的out1,2和out3,4(没有红黑区别,)

3.4.2 小车没有舵机,所以依靠左右轮子前进和后退实现转弯

3.4.3 L298n 的电源地,树莓派的 GND 引脚也要接到这里(用公-母线),即 L298N 和 树莓派需要共地。

3.4.4 GPIO端口分别接 树莓派 19 16 26 20 (倒数第二、三排)接口

3.4.5  播放声音文件  omxplayer  -o alsa t.wav

4.代码

东拼西凑了网上一些代码 车子跑起来了

#!/usr/bin/env python3

from bottle import get,post,run,request,template

import RPi.GPIO as GPIO

import time

# L298N引脚接GPIO

IN1 = 19

IN2 = 16

IN3 = 26

IN4 = 20

Trig_Pin = 6

Echo_Pin = 13

def checkdist():

  #发出触发信号

  GPIO.output(Trig_Pin,GPIO.HIGH)

  #保持10us以上(我选择15us)

  time.sleep(0.000015)

  GPIO.output(Trig_Pin,GPIO.LOW)

  while GPIO.input(Echo_Pin) == 0:

    pass

  #发现高电平时开时计时

  t1 = time.time()

  while GPIO.input(Echo_Pin) == 1:

    pass

  #高电平结束停止计时

  t2 = time.time()

  #返回距离,单位为米

  return (t2-t1)*340*100/2

def init():

    GPIO.setmode(GPIO.BCM)

    GPIO.setup(IN1,GPIO.OUT)

    GPIO.setup(IN2,GPIO.OUT)

    GPIO.setup(IN3,GPIO.OUT)

    GPIO.setup(IN4,GPIO.OUT)

    #GPIO13

    GPIO.setup(Trig_Pin,GPIO.OUT,initial=GPIO.LOW)

    #GPIO19

    GPIO.setup(Echo_Pin,GPIO.IN)

# 前进

def forward(tf):

    GPIO.output(IN1,GPIO.HIGH)

    GPIO.output(IN2,GPIO.LOW)

    GPIO.output(IN3,GPIO.HIGH)

    GPIO.output(IN4,GPIO.LOW)

    time.sleep(tf)

    GPIO.cleanup()

# 后退

def down(tf):

    GPIO.output(IN1,GPIO.LOW)

    GPIO.output(IN2,GPIO.HIGH)

    GPIO.output(IN3,GPIO.LOW)

    GPIO.output(IN4,GPIO.HIGH)

    time.sleep(tf)

    GPIO.cleanup()

# 左转弯

def left(tf):

    GPIO.output(IN1,GPIO.LOW)

    GPIO.output(IN2,GPIO.HIGH)

    GPIO.output(IN3,GPIO.HIGH)

    GPIO.output(IN4,GPIO.LOW)

    time.sleep(tf)

    GPIO.cleanup()

# 右转弯

def right(tf):

    GPIO.output(IN1,GPIO.HIGH)

    GPIO.output(IN2,GPIO.LOW)

    GPIO.output(IN3,GPIO.LOW)

    GPIO.output(IN4,GPIO.HIGH)

    time.sleep(tf)

    GPIO.cleanup()

# 停止

def stop():

    GPIO.output(IN1,False)

    GPIO.output(IN2,False)

    GPIO.output(IN3,False)

    GPIO.output(IN4,False)

    GPIO.cleanup()

@get("/")

def index():

    return template("index")

@post("/cmd")

def cmd():

    print("按下了按钮 : "+request.body.read().decode())

    init()

    sleep_time = 0.2

    arg = request.body.read().decode()

    if(arg=='up'):

        forward(sleep_time)

    elif(arg=='down'):

        down(sleep_time)

    elif(arg=='left'):

        left(sleep_time)

    elif(arg=='right'):

        right(sleep_time)

    elif(arg=='stop'):

        stop() 

    else:

        return False

    #return "OK"

@post("/goto")

def goto():

    print("按下了按钮 : "+request.body.read().decode())

    init()

    sleep_time = 1

    arg = request.body.read().decode()

    if(arg=='go_1'):

        forward(sleep_time)

        init()

        left(sleep_time)

        init()

        forward(sleep_time)

    elif(arg=='go_2'):

        forward(sleep_time)

        init()

        right(sleep_time)

        init()

        forward(sleep_time)

    elif(arg=='go_3'):

        forward(sleep_time*2)

        init()

        left(sleep_time)

        init()

        forward(sleep_time)

    else:

        return False

@post("/starthy")

def starthy():

    print("按下了红外按钮 : ")

    global open

    open = True

    init()

    detct()

@post("/closehy")

def closehy():

    print("close : ")

    global open

    open = False

@post("/dist")

def dist():

    init()

    try:

        for num in range(10,20):

            a = checkdist();

            print(str(a)+"cm")

            time.sleep(1)

            if(a>20):

                forward(0.1)

                init()

    except KeyboardInterrupt:

        GPIO.cleanup()

run(host="0.0.0.0",port="8089")


5.问题汇总

    5.1  vnc viewer上显示黑屏“cannot currently show the desktop”

        sudo raspi-config ->  Advanced Options -> A5 Resolution --> 1280x720

    5.2  碰到一个很奇怪的坑:python文件不要取名dis.py 这是个系统库,叫这个名字会有问题

相关文章

网友评论

      本文标题:树莓派开发记录(一期)

      本文链接:https://www.haomeiwen.com/subject/qvrkmktx.html