电机驱动如上图
超声波和舵机如上图
数码管和树莓派如上图
红外线感应如上图
#! /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()
在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());
}