标题:
python 智能小车源码
[打印本页]
作者:
的为、ff
时间:
2018-11-13 14:43
标题:
python 智能小车源码
#coding:utf-8 #设置中文编码
import
RPi.GPIO
as
GPIO
#导入树莓派GPIO模块
import
sys,time
#导入时间模块
from
threading
import
*
#导入thread模块所有函数
dc
=
0
#速度
mmd
=
'r'
#上一次的行驶状态
num
=
1
#寻迹状态标志
thread_num
=
0
#寻迹线程个数
thread_bi
=
0
#避障线程个数
num_bi
=
1
#避障状态标志
#定义控制马达的两个引脚
m1
=
23
m2
=
22
m3
=
24
m4
=
27
m5
=
19
m6
=
13
m7
=
20
m8
=
16
GPIO.setwarnings(
False
)
#设置屏蔽警告信息
GPIO.setmode(GPIO.BCM)
#设置引脚为BCM编码模式
GPIO.setup(m1,GPIO.OUT)
#设置m1方向为输出
GPIO.setup(m2,GPIO.OUT)
#设置m2方向为输出
GPIO.setup(m3,GPIO.OUT)
GPIO.setup(m4,GPIO.OUT)
GPIO.setup(m5,GPIO.OUT)
GPIO.setup(m6,GPIO.OUT)
GPIO.setup(m7,GPIO.OUT)
GPIO.setup(m8,GPIO.OUT)
'''
#定义灯的引脚
g1 = 5
g2 = 6
g3 = 21
g4 = 12
#左边
GPIO.setup(g1,GPIO.OUT) #红色
GPIO.setup(g2,GPIO.OUT) #绿色
#右边
GPIO.setup(g3,GPIO.OUT) #红色
GPIO.setup(g4,GPIO.OUT) #绿色
'''
#定义寻迹引脚
LineR
=
26
LineL
=
17
LineM1
=
25
LineM2
=
18
GPIO.setup(LineR,GPIO.IN,GPIO.PUD_UP)
#设置引脚为输入
GPIO.setup(LineL,GPIO.IN,GPIO.PUD_UP)
#设置引脚为输入
GPIO.setup(LineM1,GPIO.IN,GPIO.PUD_UP)
#设置引脚为输入
GPIO.setup(LineM2,GPIO.IN,GPIO.PUD_UP)
#设置引脚为输入
#加减速
PW1
=
GPIO.PWM(m1,
500
)
#设置PWM脉冲频率
PW2
=
GPIO.PWM(m2,
500
)
PW3
=
GPIO.PWM(m3,
500
)
PW4
=
GPIO.PWM(m4,
500
)
PW5
=
GPIO.PWM(m5,
500
)
PW6
=
GPIO.PWM(m6,
500
)
PW7
=
GPIO.PWM(m7,
500
)
PW8
=
GPIO.PWM(m8,
500
)
PW1.start(
0
)
PW2.start(
0
)
PW3.start(
0
)
PW4.start(
0
)
PW5.start(
0
)
PW6.start(
0
)
PW7.start(
0
)
PW8.start(
0
)
PW1.ChangeDutyCycle(dc)
#设置PW1停止
PW2.ChangeDutyCycle(dc)
PW3.ChangeDutyCycle(dc)
PW4.ChangeDutyCycle(dc)
PW5.ChangeDutyCycle(dc)
PW6.ChangeDutyCycle(dc)
PW7.ChangeDutyCycle(dc)
PW8.ChangeDutyCycle(dc)
def
thread_xunji
():
#子线程实现函数
sum
=
0
global
num
#声明全局变量
global
thread_num
#声明全局变量
while
num:
if
(GPIO.input(LineL)
==
0
and
GPIO.input(LineR)
==
0
and
GPIO.input(LineM1)
==
0
and
GPIO.input(LineM2)
==
0
):
sum
=
sum
+
1
print
"地板"
if
(
sum
>
100
):
PW1.ChangeDutyCycle(
0
)
PW2.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW5.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW7.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
elif
(GPIO.input(LineL)
==
1
and
GPIO.input(LineR)
==
1
and
GPIO.input(LineM1)
==
1
and
GPIO.input(LineM2)
==
1
):
print
"悬空"
PW1.ChangeDutyCycle(
0
)
PW2.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW5.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW7.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
#左边碰到黑带左转
elif
(GPIO.input(LineL)
==
1
and
GPIO.input(LineR)
==
0
and
GPIO.input(LineM1)
==
0
and
GPIO.input(LineM2)
==
0
):
print
"左转"
sum
=
0
PW1.ChangeDutyCycle(
0
)
PW2.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW5.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW7.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
60
)
PW7.ChangeDutyCycle(
60
)
elif
(GPIO.input(LineL)
==
0
and
GPIO.input(LineR)
==
1
and
GPIO.input(LineM1)
==
0
and
GPIO.input(LineM2)
==
0
):
print
"右转"
sum
=
0
PW1.ChangeDutyCycle(
0
)
PW2.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW5.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW7.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
PW1.ChangeDutyCycle(
60
)
PW5.ChangeDutyCycle(
60
)
elif
(GPIO.input(LineL)
==
0
and
GPIO.input(LineR)
==
0
and
GPIO.input(LineM1)
==
1
or
GPIO.input(LineM2)
==
1
):
print
"前进"
sum
=
0
PW1.ChangeDutyCycle(
0
)
PW2.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW5.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW7.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
#前进全绿
PW1.ChangeDutyCycle(
60
)
#加速
PW3.ChangeDutyCycle(
60
)
#加速
PW5.ChangeDutyCycle(
60
)
#加速
PW7.ChangeDutyCycle(
60
)
#加速
time.sleep(
0.01
)
print
"children I daied!"
num
=
1
thread_num
=
0
print
'thread_num = '
,thread_num
from
socket
import
*
#导入模块中所有函数,可以直接使用函数名,不需要带模块名
#第一步:创建套接字
server
=
socket()
#创建一个套接字 TCP,IPV4
print
server
#第二步:绑定IP地址和端口号
server.bind((
'172.27.35.3'
,
9996
))
#绑定本地IP地址,端口号为8989
#第三步:监听
server.listen(
5
)
#监听客户端链接,队列长度为5
#第四步:接收客户端链接
try
:
#捕捉while中是否有ctrl + C按下
while
1
:
print
'accept...'
client,addr
=
server.accept()
#接受链接到服务器的客户端,得到客户端元组
print
client,addr
client.send(
'welcome...'
)
while
1
:
cmd
=
client.recv(
100
)
#从客户端接收100个数据存放到服务器buff
print
'客户端发来消息:'
,cmd
print
"正在运行"
#前进
if
cmd
==
'w'
:
print
"mmd = "
,mmd
if
mmd
==
'w'
:
#维持现状
pass
elif
mmd
==
'r'
:
#设置PW脚脉冲为0
PW2.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
#dc = 60
#启动时60码
for
dc
in
range
(
0
,
100
,
50
):
PW1.ChangeDutyCycle(dc)
#加速
PW3.ChangeDutyCycle(dc)
#加速
PW5.ChangeDutyCycle(dc)
#加速
PW7.ChangeDutyCycle(dc)
#加速
time.sleep(
1
)
elif
mmd
==
's'
:
#先减速
#设置PW脚脉冲为0
PW1.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
0
)
PW5.ChangeDutyCycle(
0
)
PW7.ChangeDutyCycle(
0
)
for
ac
in
range
(dc,
0
,
-
50
):
PW2.ChangeDutyCycle(ac)
#减速
PW4.ChangeDutyCycle(ac)
#减速
PW6.ChangeDutyCycle(ac)
#减速
PW8.ChangeDutyCycle(ac)
#减速
time.sleep(
1
)
#再加速
#设置PW脚脉冲为0
PW2.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
#dc = 60
#启动时60码
for
dc
in
range
(
0
,
100
,
50
):
PW1.ChangeDutyCycle(dc)
#加速
PW3.ChangeDutyCycle(dc)
#加速
PW5.ChangeDutyCycle(dc)
#加速
PW7.ChangeDutyCycle(dc)
#加速
time.sleep(
1
)
else
:
#先暂停
PW1.ChangeDutyCycle(
0
)
PW2.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW5.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW7.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
#设置PW脚脉冲为0
PW2.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
#dc = 60
#启动时60码
for
dc
in
range
(
0
,
100
,
50
):
PW1.ChangeDutyCycle(dc)
#加速
PW3.ChangeDutyCycle(dc)
#加速
PW5.ChangeDutyCycle(dc)
#加速
PW7.ChangeDutyCycle(dc)
#加速
time.sleep(
0.5
)
#记录状态
mmd
=
'w'
#后退
elif
cmd
==
's'
:
print
"mmd = "
,mmd
if
mmd
==
's'
:
#维持现状
pass
elif
mmd
==
'w'
:
#先减速
#设置PW脚脉冲为0
PW2.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
for
ac
in
range
(dc,
0
,
-
50
):
PW1.ChangeDutyCycle(ac)
#减速
PW3.ChangeDutyCycle(ac)
#减速
PW5.ChangeDutyCycle(ac)
#减速
PW7.ChangeDutyCycle(ac)
#减速
time.sleep(
1
)
#再加速
#设置PW脚脉冲为0
PW1.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
0
)
PW5.ChangeDutyCycle(
0
)
PW7.ChangeDutyCycle(
0
)
#dc = 60
#启动时60码
for
dc
in
range
(
0
,
100
,
50
):
PW2.ChangeDutyCycle(dc)
#加速
PW4.ChangeDutyCycle(dc)
#加速
PW6.ChangeDutyCycle(dc)
#加速
PW8.ChangeDutyCycle(dc)
#加速
time.sleep(
1
)
elif
mmd
==
'r'
:
#加速
#设置PW脚脉冲为0
PW1.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
0
)
PW5.ChangeDutyCycle(
0
)
PW7.ChangeDutyCycle(
0
)
#启动时60码
for
dc
in
range
(
0
,
100
,
50
):
PW2.ChangeDutyCycle(dc)
#加速
PW4.ChangeDutyCycle(dc)
#加速
PW6.ChangeDutyCycle(dc)
#加速
PW8.ChangeDutyCycle(dc)
#加速
time.sleep(
1
)
else
:
PW1.ChangeDutyCycle(
0
)
PW2.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW5.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW7.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
#加速
#设置PW脚脉冲为0
PW1.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
0
)
PW5.ChangeDutyCycle(
0
)
PW7.ChangeDutyCycle(
0
)
#dc = 60
#启动时60码
for
dc
in
range
(
0
,
100
,
50
):
PW2.ChangeDutyCycle(dc)
#加速
PW4.ChangeDutyCycle(dc)
#加速
PW6.ChangeDutyCycle(dc)
#加速
PW8.ChangeDutyCycle(dc)
#加速
time.sleep(
1
)
#记录状态:后退
mmd
=
's'
#停止
elif
cmd
==
'r'
:
mmd
=
'r'
num
=
0
PW1.ChangeDutyCycle(
0
)
PW2.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW5.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW7.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
#右转
elif
cmd
==
'e'
:
print
"mmd = "
,mmd
if
mmd
==
'w'
:
mmd
=
'd'
#前进右转右绿
PW2.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW7.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
elif
mmd
==
's'
:
mmd
=
'c'
#后退右转右红
PW1.ChangeDutyCycle(
0
)
PW2.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
0
)
PW5.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW7.ChangeDutyCycle(
0
)
elif
mmd
==
'r'
:
mmd
=
'd'
#停车右转右绿
PW2.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW7.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
for
dc
in
range
(
0
,
100
,
50
):
PW1.ChangeDutyCycle(dc)
#加速
PW5.ChangeDutyCycle(dc)
#加速
time.sleep(
1
)
elif
mmd
==
'd'
:
pass
elif
mmd
==
'c'
:
pass
elif
mmd
==
'a'
:
mmd
=
'd'
#停止
PW1.ChangeDutyCycle(
0
)
PW2.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW5.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW7.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
#前进右转右绿
for
dc
in
range
(
0
,
100
,
50
):
PW1.ChangeDutyCycle(dc)
#加速
PW5.ChangeDutyCycle(dc)
#加速
time.sleep(
1
)
elif
mmd
==
'z'
:
mmd
=
'c'
#停止
PW1.ChangeDutyCycle(
0
)
PW2.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW5.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW7.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
#后退右转右红
for
dc
in
range
(
0
,
100
,
50
):
PW4.ChangeDutyCycle(dc)
#加速
PW8.ChangeDutyCycle(dc)
#加速
time.sleep(
1
)
#左转
elif
cmd
==
'q'
:
print
"mmd = "
,mmd
if
mmd
==
'w'
:
mmd
=
'a'
#前进左转左绿
PW1.ChangeDutyCycle(
0
)
PW2.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW5.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
elif
mmd
==
's'
:
mmd
=
'z'
#后退左转左红
PW1.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW5.ChangeDutyCycle(
0
)
PW7.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
elif
mmd
==
'r'
:
mmd
=
'a'
#前进左转左绿
PW1.ChangeDutyCycle(
0
)
PW2.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW5.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
for
dc
in
range
(
0
,
100
,
50
):
PW3.ChangeDutyCycle(dc)
#加速
PW7.ChangeDutyCycle(dc)
#加速
time.sleep(
1
)
elif
mmd
==
'a'
:
pass
elif
mmd
==
'z'
:
pass
elif
mmd
==
'd'
:
mmd
=
'a'
#停止
PW1.ChangeDutyCycle(
0
)
PW2.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW5.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW7.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
#前进左转左绿
for
dc
in
range
(
0
,
100
,
50
):
PW3.ChangeDutyCycle(dc)
#加速
PW7.ChangeDutyCycle(dc)
#加速
time.sleep(
1
)
elif
mmd
==
'c'
:
mmd
=
'z'
#停止
PW1.ChangeDutyCycle(
0
)
PW2.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW5.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW7.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
#后退左转左红
for
dc
in
range
(
0
,
100
,
50
):
PW2.ChangeDutyCycle(dc)
#加速
PW6.ChangeDutyCycle(dc)
#加速
time.sleep(
1
)
#寻迹
elif
cmd
==
'xun'
:
print
"xun"
if
(thread_num
==
0
):
t
=
Thread(
target
=
thread_xunji)
t.start()
thread_num
=
1
else
:
print
"thread"
client.send(
'Thread is working...'
)
#t.join()
#避障
elif
cmd
==
'bi'
:
print
"bi"
if
(thread_bi
==
0
):
t
=
Thread(
target
=
thread_bizhang)
t.start()
thread_bi
=
1
else
:
num_bi
=
0
elif
cmd
==
'end'
:
break
client.close()
#关闭对应客户端
#捕捉到ctrl + c后停止电机
except
KeyboardInterrupt
:
PW1.ChangeDutyCycle(
0
)
PW2.ChangeDutyCycle(
0
)
PW3.ChangeDutyCycle(
0
)
PW4.ChangeDutyCycle(
0
)
PW5.ChangeDutyCycle(
0
)
PW6.ChangeDutyCycle(
0
)
PW7.ChangeDutyCycle(
0
)
PW8.ChangeDutyCycle(
0
)
作者:
roottan
时间:
2018-11-18 02:27
喜欢,我机会我也搞台来试试
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1