智能小车

智能小车_第1张图片电机驱动如上图
智能小车_第2张图片
超声波和舵机如上图
智能小车_第3张图片
数码管和树莓派如上图
智能小车_第4张图片
红外线感应如上图

树莓派端代码:

#! /usr/bin/env python
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import socket

import RPi.GPIO as GPIO
import time
import datetime
import traceback

import thread

GPIO.setwarnings(False)

GPIO.setmode(GPIO.BCM)
#电机驱动连接树莓派引脚
enA = 2
enB = 3
in1 = 14
in2 = 15
in3 = 18
in4 = 23

#超声波
echo = 10
trig = 9

#数码管
clk = 25
dio = 8
#舵机连接树莓派引脚
duo = 24
#红外感应连接树莓派引脚
tan1 = 4
tan2 = 17
tan3 = 27
tan4 = 22

GPIO.setup(tan1, GPIO.IN)
GPIO.setup(tan2, GPIO.IN)
GPIO.setup(tan3, GPIO.IN)
GPIO.setup(tan4, GPIO.IN)
GPIO.setup(enA, GPIO.OUT)
GPIO.setup(enB, GPIO.OUT)
GPIO.setup(in1, GPIO.OUT)
GPIO.setup(in2, GPIO.OUT)
GPIO.setup(in3, GPIO.OUT)
GPIO.setup(in4, GPIO.OUT)
GPIO.setup(trig, GPIO.OUT)
GPIO.setup(echo, GPIO.IN)
GPIO.setup(clk, GPIO.OUT)
GPIO.setup(dio, GPIO.OUT)
GPIO.setup(duo, GPIO.OUT, initial = GPIO.LOW)
    
GPIO.output([enA, in1, in2], [1, 0, 0])
GPIO.output([enB, in3, in4], [1, 0, 0])
Duo = GPIO.PWM(24, 50)
Duo.start(7.5)
ena = GPIO.PWM(enA, 50)
ena.start(20)
enb = GPIO.PWM(enB, 50)
enb.start(20)

i = 20#用来加速减速用的全局变量
#QT与客户端的连接
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('192.168.191.2', 9096))
server.listen(5)
conn, addr = server.accept()
eva = 0
print(conn, addr)
#超声波
def getDistance(trig, echo):
    GPIO.output(trig, GPIO.HIGH)
    time.sleep(0.00001)
    GPIO.output(trig, GPIO.LOW)
    while GPIO.input(echo) == GPIO.LOW:
        pass
    start = datetime.datetime.now()
    while GPIO.input(echo) == GPIO.HIGH:
        pass
    end = datetime.datetime.now()
    t = (end - start).microseconds
    return 0.017 * t

#数码管
def start(clk, dio):
    GPIO.output(clk, GPIO.HIGH)
    GPIO.output(dio, GPIO.HIGH)
    GPIO.output(dio, GPIO.LOW)
    GPIO.output(clk, GPIO.LOW)
def stop(clk, dio):
    GPIO.output(clk, GPIO.LOW)
    GPIO.output(dio, GPIO.LOW)
    GPIO.output(clk, GPIO.HIGH)
    GPIO.output(dio, GPIO.HIGH)
def sendData(clk, dio, data):
    for i in range(0, 8):
        GPIO.output(clk, GPIO.LOW)
        if data & 1:
            GPIO.output(dio, GPIO.HIGH)
        else:
            GPIO.output(dio, GPIO.LOW)
        data = data //2
        GPIO.output(clk, GPIO.HIGH)
    GPIO.output(clk, GPIO.LOW)
    GPIO.output(dio, GPIO.HIGH)
    GPIO.output(clk, GPIO.HIGH)
    GPIO.setup(dio, GPIO.IN)
    if GPIO.input(dio) == GPIO.HIGH:
        GPIO.setup(dio, GPIO.OUT)
        return
    GPIO.setup(dio, GPIO.OUT)

#数码管
def setData(clk, dio, data):
    start(clk, dio)
    sendData(clk, dio, 0B01000000)
    stop(clk, dio)

    start(clk, dio)

    sendData(clk, dio, 0B11000000)
    sendData(clk, dio, data[0])
    sendData(clk, dio, data[1])
    sendData(clk, dio, data[2])
    sendData(clk, dio, data[3])
    stop(clk, dio)

    start(clk, dio)
    sendData(clk, dio, 0B10001111)
    stop(clk, dio)

#数码管和超声波的关联
def shuMa_Guan(a):
    aa = 0B00000000
    if(a == 1):
        aa = 0B00000110
    if(a == 2):
        aa = 0B01011011
    if(a == 3):
        aa = 0B01001111
    if(a == 4):
        aa = 0B01100110
    if(a == 5):
        aa = 0B01101101
    if(a == 6):
        aa = 0B01111101
    if(a == 7):
        aa = 0B00000111
    if(a == 8):
        aa = 0B01111111
    if(a == 9):
        aa = 0B01101111
    if(a == 0):
        aa = 0B00111111
    return aa

#数码管
def shuMaGuan(t):
    aa = 0B00000000
    dd = 0B00000000
    cc = 0B00000000
    bb = 0B00000000
    if(t<=9999):
        a = t%10//1
        b = t/10%10//1
        c = t/100%10//1
        d = t/1000%10//1
        aa = shuMa_Guan(a)
        bb = shuMa_Guan(b)
        cc = shuMa_Guan(c)
        dd = shuMa_Guan(d)
    return [dd, cc, bb, aa]

#自动避障
def _evadible():
    GPIO.output([enA, in1, in2], [1, 0, 1])
    GPIO.output([enB, in3, in4], [1, 0, 1])

    ena.ChangeDutyCycle(18)
    enb.ChangeDutyCycle(18)

    GPIO.output([clk, dio], [1, 1])

    left = 0.0
    right = 0.0
    while True:
        t = getDistance(trig, echo)
        data4 = shuMaGuan(t)
        setData(clk, dio, data4)
        if(t <= 20):
            #xiaochitingxia
            GPIO.output([in1, in2, in3, in4], [0,0,0,0])
            Duo.ChangeDutyCycle(11)
            time.sleep(0.5)
            left = getDistance(trig, echo)
            data4 = shuMaGuan(left)
            setData(clk, dio, data4)
            time.sleep(0.5)
            Duo.ChangeDutyCycle(7.5)
            time.sleep(0.5)
            Duo.ChangeDutyCycle(4)
            time.sleep(0.5)
            right = getDistance(trig, echo)
            data4 = shuMaGuan(right)
            setData(clk, dio, data4)
            time.sleep(0.5)
            Duo.ChangeDutyCycle(7.5)
            time.sleep(0.5)
            #xiaochizhuanwan
            if(eva != 1):
                break
            if(left <= right):
                GPIO.output([in1, in2, in3, in4], [1, 0, 0, 1])
                ena.ChangeDutyCycle(30)
                enb.ChangeDutyCycle(30)
                time.sleep(0.7)
            else:
                GPIO.output([in1, in2, in3, in4], [0, 1, 1, 0])
                ena.ChangeDutyCycle(30)
                enb.ChangeDutyCycle(30)
                time.sleep(0.7)
            GPIO.output([in1, in2, in3, in4], [0, 1, 0, 1])
            ena.ChangeDutyCycle(18)
            enb.ChangeDutyCycle(18)
        if(eva != 1):
            break

#自动循迹
def _tracking():
    GPIO.output([enA, in1, in2], [1, 0, 1])
    GPIO.output([enB, in3, in4], [1, 0, 1])

    ena.ChangeDutyCycle(15)
    enb.ChangeDutyCycle(15)

    while True:
        if(eva != 2):
            break
        a = GPIO.input(tan1)
        b = GPIO.input(tan2)
        c = GPIO.input(tan3)
        d = GPIO.input(tan4)
        if((a == 1 and d == 0) or (b == 0 and c == 1)):
            #right
            GPIO.output([in1, in2, in3, in4], [0, 0, 0, 1])
            ena.ChangeDutyCycle(21)
            enb.ChangeDutyCycle(21)
        elif((d == 1 and a == 0) or (b == 1 and c == 0)):
            #left
            GPIO.output([in1, in2, in3, in4], [0, 1, 0, 0])
            ena.ChangeDutyCycle(21)
            enb.ChangeDutyCycle(21)
        else:
            GPIO.output([in1, in2, in3, in4], [0, 1, 0, 1])
            enb.ChangeDutyCycle(15)
            enb.ChangeDutyCycle(15)
            pass

try:
    while True:
        data = conn.recv(1024)
        if(data == 'hand'):#手动
            eva = 0
            GPIO.output([in1, in2, in3, in4], [0, 0, 0, 0])
            enb.ChangeDutyCycle(15)
            enb.ChangeDutyCycle(15)
        elif(data == 'evadible' and eva != 1):#自动避障
            eva = 1
            thread.start_new_thread(_evadible, ())
        elif(data == 'tracking' and eva != 2):#自动循迹
            eva = 2
            thread.start_new_thread(_tracking, ())
        elif(data == 'plus'):#加速
            i = i + 10
            if(i < 20):
                i = 20
            if(i > 100):
                i = 100
            ena.ChangeDutyCycle(i)
            enb.ChangeDutyCycle(i)
        elif(data == 'subtract'):#减速
            i = i - 10
            if(i < 20):
                i = 20
            if(i > 100):
                i = 100
            ena.ChangeDutyCycle(i)
            enb.ChangeDutyCycle(i)
        elif(data == 'up' and eva == 0):#前进
            GPIO.output([in1, in2, in3, in4], [0, 1, 0, 1])
        elif(data == 'down' and eva == 0):#后退
            GPIO.output([in1, in2, in3, in4], [1, 0, 1, 0])
        elif(data == 'left' and eva == 0):#左转
            GPIO.output([in1, in2, in3, in4], [0, 1, 1, 0])
        elif(data == 'right' and eva == 0):#右转
            GPIO.output([in1, in2, in3, in4], [1, 0, 0, 1])
        elif(data == 'shutdown'):#断开连接
            break
        else:
            pass
    GPIO.cleanup()
    conn.close()
except:
    GPIO.cleanup()

QT客户端:

智能小车_第5张图片
智能小车_第6张图片
在lianjie.pro工程文件添加在这里插入图片描述
widget.h的代码:

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_pushButton_clicked();//连接
    void on_left_clicked();//左转
    void on_right_clicked();//右转
    void on_up_clicked();//前进
    void on_down_clicked();//后退
    void on_hand_clicked();//手动
    void on_tracking_clicked();//自动寻迹
    void on_evadible_clicked();   //自动避障
    void on_pushButton_2_clicked();//关机

    void slot_connected();//处理成功连接到服务器的槽
    void slot_disconnect();//取消与服务器连接的槽
    void slot_recvmessage();//接收来自服务器的消息的槽

    void on_plus_clicked();

    void on_subtract_clicked();

private:
    Ui::Widget *ui;

    bool isconnetion;//判断是否连接到服务器的标志位
    QTcpSocket *sock;//套接字
};

#endif // WIDGET_H

widget.cpp的代码:

#include "widget.h"
#include "ui_widget.h"
#include 
#include 
#include 

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    sock =  NULL;

    /*1、初始化 QTcpSocket 对象*/
    sock = new QTcpSocket(this);

    //成功连接服务器的connected()信号连接到slot_connected()(注意:不是connect()信号)
    connect(sock,SIGNAL(connected()),this,SLOT(slot_connected()));
    //与服务器断开连接的disconnected()信号连接到slot_disconnect()
    connect(sock,SIGNAL(disconnected()),this,SLOT(slot_disconnect()));
}

Widget::~Widget()
{
    delete ui;
}

//处理成功连接到服务器的槽
void Widget::slot_connected()
{
    this->isconnetion = true;
    ui->textBrowser->append(tr("与服务器连接成功:") + QDateTime::currentDateTime().toString("yyyy-M-dd hh:mm:ss"));
}

//取消与服务器连接的槽
void Widget::slot_disconnect()
{
    QMessageBox::warning(this,"警告","与服务器的连接中断",QMessageBox::Ok);
    //关闭并随后删除socket
    sock->disconnectFromHost();
    sock->deleteLater();
}

//接收来自服务器的消息的槽
void Widget::slot_recvmessage()
{
    //接收来自服务器的消息
    QByteArray byteArray = this->sock->readAll();
    QString recvMessage = tr("recv from server: ") + byteArray + tr("\n");
    ui->textBrowser->append(recvMessage);
}

void Widget::on_pushButton_clicked()
{
    /*2、QTcpSocket 调用 connectToHost(QHostAddress("IP"), 端口号),连接服务器IP和端口号*/
    qint16 port = 9096;
    sock->connectToHost("192.168.191.2",port);
}

void Widget::on_left_clicked()
{
    /*3、QTcpsocket 对象调用成员函数 write,发送数据给服务器*/
    QString msg = "left";
    sock->write(msg.toUtf8());//转编码
}

void Widget::on_right_clicked()
{
    QString msg = "right";
    sock->write(msg.toUtf8());
}

void Widget::on_up_clicked()
{
    QString msg = "up";
    sock->write(msg.toUtf8());
}

void Widget::on_down_clicked()
{
    QString msg = "down";
    sock->write(msg.toUtf8());
}

void Widget::on_hand_clicked()
{
    QString msg = "hand";
    sock->write(msg.toUtf8());
}

void Widget::on_tracking_clicked()
{
    QString msg = "tracking";
    sock->write(msg.toUtf8());
}

void Widget::on_evadible_clicked()
{
    QString msg = "evadible";
    sock->write(msg.toUtf8());
}

void Widget::on_pushButton_2_clicked()
{
    QString msg = "shutdown";
    sock->write(msg.toUtf8());
}

void Widget::on_plus_clicked()
{
    QString msg = "plus";
    sock->write(msg.toUtf8());
}

void Widget::on_subtract_clicked()
{
    QString msg = "subtract";
    sock->write(msg.toUtf8());
}

你可能感兴趣的:(总结)