树莓派示例代码 点亮led灯 跑马灯 开关控制led 红外感应灯 超声波测距

树莓派示例代码

gpio代码

gpio介绍

GPIO(英语:General-purpose input/output),通用型之输入输出的简称,功能类似8051的P0—P3,其接脚可以供使用者由程控自由使用,PIN脚依现实考量可作为通用输入(GPI)或通用输出(GPO)或通用输入与输出(GPIO),如当clk generator, chip select等。

既然一个引脚可以用于输入、输出或其他特殊功能,那么一定有寄存器用来选择这些功能。对于输入,一定可以通过读取某个寄存器来确定引脚电位的高低;对于输出,一定可以通过写入某个寄存器来让这个引脚输出高电位或者低电位;对于其他特殊功能,则有另外的寄存器来控制它们。

使用RPI.GPIO库

1. 点亮led灯

# -*- coding:UTF-8 -*-
"""
点亮单个led
"""
import RPi.GPIO as GPIO
import time# 设置编码模式
GPIO.setmode(GPIO.BCM)
# 设置警告
GPIO.setwarnings(False)# 定义使用16号引脚控制led
led_bcm16=16# 程序初始化
def init():# 将引脚初始默认状态GPIO.cleanup()# 初始化16引脚模式GPIO.setup(led_bcm16,GPIO.OUT,initial=GPIO.LOW)print("程序已经启动啦!")# 程序运行函数
def run():init()# 2.5s之后点亮ledprint("2.5s之后点亮led")time.sleep(2.5)GPIO.output(led_bcm16,GPIO.HIGH);# 让程序始终处于运行的状态while True:pass# 将程序跑起来
run()

2. 跑马灯

-*- coding:UTF-8 -*-"""
跑马灯教程
"""
import RPi.GPIO as GPIO
import time# 设置端口编码模式
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)# 定义端口
ledlist=[16,20,21]# 初始化函数
def led_init():GPIO.cleanup()for num in ledlist:GPIO.setup(num, GPIO.OUT, initial=GPIO.LOW);print("led初始化完成:",num)led_init()def run():count=0# 程序始终运行while True:# 先将所有的灯都熄灭for index in ledlist:print(index)GPIO.output(index, GPIO.LOW)# 按照计数索引点灯curr_index = ledlist[count%len(ledlist)]GPIO.output(curr_index, GPIO.HIGH)# 计数要累加count = count+1time.sleep(0.5)run()GPIO.cleanup()

3. 开关控制led


#-*- coding:UTF-8 -*-
"""
开关的使用
"""
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)bcm16 = 16
bcm21 = 21def btn_init():GPIO.cleanup()GPIO.setup(bcm16,GPIO.OUT,initial=GPIO.LOW);# 按钮连接的GPIO针脚的模式设置为信号输入模式,同时默认拉高GPIO口电平,# 当GND没有被接通时,GPIO口处于高电平状态,取的的值为1# 注意到这是一个可选项,如果不在程序里面设置,通常的做法是通过一个上拉电阻连接到VCC上使之默认保持高电平GPIO.setup(bcm21, GPIO.IN, pull_up_down=GPIO.PUD_UP)def run():btn_init()while True:if GPIO.input(bcm21) ==0 :GPIO.output(bcm16,GPIO.HIGH);print("低电平")time.sleep(1)else:GPIO.output(bcm16,GPIO.LOW);print("高电平")time.sleep(1)try:run()
finally:GPIO.cleanup()

4. 红外感应灯

#-*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import time
"""
演示红外传感器的使用
"""# 设置GPIO口为BCM编码方式
GPIO.setmode(GPIO.BCM)# 忽略警告信息
GPIO.setwarnings(False)# 定义红外数据接收引脚
# 输出端:控制led亮灭
bcm16 = 16
# 输入端:读取人体感应传感器状态
bcm21 = 21def infrared_init():GPIO.cleanup()# 初始化引脚GPIO.setup(bcm21,GPIO.IN,pull_up_down=GPIO.PUD_DOWN);GPIO.setup(bcm16,GPIO.OUT,initial=GPIO.LOW);print("人体感应灯已经启动起来...")def run():while True:if GPIO.input(bcm21) == 1:curtime = time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time()))print(curtime)GPIO.output(bcm16,GPIO.HIGH)time.sleep(3)GPIO.output(bcm16,GPIO.LOW)else:passtry:infrared_init()run()
finally:# 引脚清理GPIO.cleanup()print("程序执行完成")

5. 超声波测距


#-*- coding:UTF-8 -*-"""
超声波传感器的使用
"""
import RPi.GPIO as GPIO
import time# 信号发出引脚
bcm16_tri = 16
# 信号接收引脚
bcm20_echo = 20
# 开关引脚
bcm21 = 21# 超声波测距函数
def get_distance():GPIO.output(bcm16_tri, GPIO.HIGH)time.sleep(0.000015)GPIO.output(bcm16_tri, GPIO.LOW)print("发送已经完成")while not GPIO.input(bcm20_echo):passt1 = time.time()while GPIO.input(bcm20_echo):passt2 = time.time()print("distance is %d cm" % (((t2 - t1) * 340 / 2) * 100))time.sleep(0.01)return ((t2 - t1) * 340 / 2) * 100GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)def init():GPIO.cleanup()# 按钮连接的GPIO针脚的模式设置为信号输入模式,同时默认拉高GPIO口电平,# 当GND没有被接通时,GPIO口处于高电平状态,取的的值为1# 注意到这是一个可选项,如果不在程序里面设置,通常的做法是通过一个上拉电阻连接到VCC上使之默认保持高电平GPIO.setup(bcm21, GPIO.IN, pull_up_down=GPIO.PUD_UP)GPIO.setup(bcm16_tri, GPIO.OUT,initial=GPIO.LOW);GPIO.setup(bcm20_echo, GPIO.IN)# 运行
def run():while True:# 监听开关的状态if GPIO.input(bcm21) ==0 :get_distance();print("低电平")time.sleep(1)else:print("高电平")time.sleep(1)# 程序启动
try:init();run();
finally:GPIO.cleanup()

PWM介绍

脉冲宽度调制是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。

呼吸灯案例

# -*- coding:utf-8 -*-
"""
呼吸灯案例
"""
import RPi.GPIO as GPIO
import time
# 定义控制引脚
bcm21_led = 21;
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)pwm_led=Nonedef init():global pwm_ledGPIO.cleanup()GPIO.setup(bcm21_led,GPIO.OUT,initial=GPIO.LOW)pwm_led = GPIO.PWM(bcm21_led, 50);def run():init()# 设置初始占空比count=1;# 设置每次变化的步长step=2;while True:count += step# 修改占空比pwm_led.start(count)# 到达边界之后,数值改变方向要取反if count >= 99 or count <=1:step = -1*step# 让程序运行稍微慢一点time.sleep(0.03)# 将程序跑起来
try:run()
finally:GPIO.cleanup()

电机驱动

# -*- coding:utf-8 -*-
"""
电机驱动的案例
注意:开发板需要与驱动板共地,否则会有问题
"""
import RPi.GPIO as GPIO
import time# 定义引脚
bcm20_motor = 20
bcm21_motor = 21
bcm16_ena = 16GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)# pwm
pwm_motor = Nonedef init():GPIO.cleanup()GPIO.setup(bcm20_motor,GPIO.OUT,initial=GPIO.HIGH);GPIO.setup(bcm21_motor,GPIO.OUT,initial=GPIO.LOW);GPIO.setup(bcm16_ena,GPIO.OUT,initial=GPIO.HIGH);global pwm_motorpwm_motor = GPIO.PWM(bcm16_ena,1000)def run():# 设置电机转动占空比pwm_motor.start(5)GPIO.output(bcm20_motor,GPIO.HIGH)GPIO.output(bcm21_motor,GPIO.LOW)while True:pass# 将程序跑起来
try:init()run()
finally:GPIO.cleanup()

综合 四轮小车案例

功能实现¶
通讯¶ socket网络通讯
前进¶
后退¶
左转¶
右转¶

下位机代码


#-*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import socket
import time
import string
import threading#小车状态值定义
enSTOP = 0
enRUN =1
enBACK = 2
enLEFT = 3
enRIGHT = 4
enTLEFT =5
enTRIGHT = 6#小车电机引脚定义
IN1 = 20
IN2 = 21
IN3 = 19
IN4 = 26
ENA = 16
ENB = 13#小车和舵机状态变量
g_CarState = 0#小车速度变量
CarSpeedControl = 35# 小车转向速度变量
CarDirectSpeedControl=80#设置GPIO口为BCM编码方式
GPIO.setmode(GPIO.BCM)#忽略警告信息
GPIO.setwarnings(False)#电机引脚初始化为输出模式
def init():global pwm_ENAglobal pwm_ENBGPIO.setup(ENA,GPIO.OUT,initial=GPIO.HIGH)GPIO.setup(IN1,GPIO.OUT,initial=GPIO.LOW)GPIO.setup(IN2,GPIO.OUT,initial=GPIO.LOW)GPIO.setup(ENB,GPIO.OUT,initial=GPIO.HIGH)GPIO.setup(IN3,GPIO.OUT,initial=GPIO.LOW)GPIO.setup(IN4,GPIO.OUT,initial=GPIO.LOW)#设置pwm引脚和频率为2000hzpwm_ENA = GPIO.PWM(ENA, 2000)pwm_ENB = GPIO.PWM(ENB, 2000)pwm_ENA.start(0)pwm_ENB.start(0)#小车前进   
def run():GPIO.output(IN1, GPIO.HIGH)GPIO.output(IN2, GPIO.LOW)GPIO.output(IN3, GPIO.LOW)GPIO.output(IN4, GPIO.LOW)pwm_ENA.ChangeDutyCycle(CarSpeedControl)pwm_ENB.ChangeDutyCycle(CarDirectSpeedControl)#小车后退
def back():GPIO.output(IN1, GPIO.LOW)GPIO.output(IN2, GPIO.HIGH)GPIO.output(IN3, GPIO.LOW)GPIO.output(IN4, GPIO.LOW)pwm_ENA.ChangeDutyCycle(CarSpeedControl)pwm_ENB.ChangeDutyCycle(CarDirectSpeedControl)#小车左转   
def left():GPIO.output(IN1, GPIO.LOW)GPIO.output(IN2, GPIO.LOW)GPIO.output(IN3, GPIO.HIGH)GPIO.output(IN4, GPIO.LOW)pwm_ENA.ChangeDutyCycle(CarSpeedControl)pwm_ENB.ChangeDutyCycle(CarDirectSpeedControl)#小车右转
def right():GPIO.output(IN1, GPIO.LOW)GPIO.output(IN2, GPIO.LOW)GPIO.output(IN3, GPIO.LOW)GPIO.output(IN4, GPIO.HIGH)pwm_ENA.ChangeDutyCycle(CarSpeedControl)pwm_ENB.ChangeDutyCycle(CarDirectSpeedControl)#小车原地左转
def spin_left():GPIO.output(IN1, GPIO.HIGH)GPIO.output(IN2, GPIO.LOW)GPIO.output(IN3, GPIO.HIGH)GPIO.output(IN4, GPIO.LOW)pwm_ENA.ChangeDutyCycle(CarSpeedControl)pwm_ENB.ChangeDutyCycle(CarSpeedControl)#小车原地右转
def spin_right():GPIO.output(IN1, GPIO.LOW)GPIO.output(IN2, GPIO.LOW)GPIO.output(IN3, GPIO.LOW)GPIO.output(IN4, GPIO.HIGH)pwm_ENA.ChangeDutyCycle(CarSpeedControl)pwm_ENB.ChangeDutyCycle(CarSpeedControl)#小车停止   
def brake():GPIO.output(IN1, GPIO.LOW)GPIO.output(IN2, GPIO.LOW)GPIO.output(IN3, GPIO.LOW)GPIO.output(IN4, GPIO.LOW)try:init()global connectflag connectflag = 0count = 50# 通过socket创建监听套接字并设置为非阻塞模式tcpservicesock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)tcpservicesock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)tcpservicesock.setblocking(0)# 填充绑定服务器的ip地址和端口号# 注意:这里一定要根据自己的树莓派的ip地址来填tcpservicesock.bind(('192.168.12.1', 8888))# 监听客户端的连接tcpservicesock.listen(5)print("waiting for connection....")# 创建监听列表clientAddrList = []print("服务器已经开启啦!")while True:try:#准备接受客户端的连接并返回连接套接字tcpclientsock,addr = tcpservicesock.accept()if  tcpclientsock:connectflag = 1print("连接成功啦!")except:pass else:print("new user :%s " % str(addr))#设置连接套接字为非阻塞的模式并将连接的套接字放入到监听列表中tcpclientsock.setblocking(0)clientAddrList.append((tcpclientsock,addr))for tcpclientsock,addr in clientAddrList:try:global recvbufglobal sendbufrecvbuf = ''#TCP接受数据# print("Start recv!",addr)recvbuf = tcpclientsock.recv(128)print("Start recv over!")except:passelse:if len(recvbuf) > 0:print("recvbuf",recvbuf)g_CarState = int(recvbuf);# 根据解析的数据让小车做出相应的运动if g_CarState == enSTOP:brake()elif g_CarState == enRUN:run()elif g_CarState == enLEFT:print("左转")left()elif g_CarState == enRIGHT:right()elif g_CarState == enBACK:back()elif g_CarState == enTLEFT:spin_left()elif g_CarState == enTRIGHT:spin_right()else:brake()else:tcpclientsock.close()clientAddrList.remove((tcpclientsock,addr))except KeyboardInterrupt:pass
tcpclientsock.close()
tcpservicesock.close()
pwm_ENA.stop()
pwm_ENB.stop()GPIO.cleanup()  

上位机代码 遥控端

from PyQt5.QtWidgets import QApplication,QWidget,QPushButton,QVBoxLayout,QHBoxLayout
import sys
from socket import *
import threadingaddress = "192.168.12.1"
port = 8888;
server_socket="";def connectCar():global server_socket;server_socket = socket(AF_INET, SOCK_STREAM)server_socket.connect((address, port))print("连接成功!")#小车状态值定义
enSTOP = 0
enRUN =1
enBACK = 2
enLEFT = 3
enRIGHT = 4
enTLEFT =5
enTRIGHT = 6def controlCallback(val):print("发送数据",val)server_socket.send(str(val).encode())if __name__ == '__main__':# 创建核心类app = QApplication(sys.argv)# 创建窗口widget = QWidget();widget.resize(200,400)# 创建水平布局vbox = QVBoxLayout(widget)leftBtn = QPushButton("连接");vbox.addWidget(leftBtn)leftBtn.clicked.connect(lambda : connectCar())# 创建按钮leftBtn = QPushButton("左转");vbox.addWidget(leftBtn)leftBtn.clicked.connect(lambda :controlCallback(enLEFT))# 创建按钮rightBtn = QPushButton("右转");vbox.addWidget(rightBtn)rightBtn.clicked.connect(lambda :controlCallback(enRIGHT))# 创建按钮forwordBtn = QPushButton("前进");vbox.addWidget(forwordBtn)forwordBtn.clicked.connect(lambda :controlCallback(enRUN))# 创建按钮backBtn = QPushButton("后退");vbox.addWidget(backBtn)backBtn.clicked.connect(lambda :controlCallback(enBACK))# 创建按钮stopBtn = QPushButton("停止");vbox.addWidget(stopBtn)stopBtn.clicked.connect(lambda :controlCallback(enSTOP))widget.show()app.exec()

综合 麦克纳姆轮小车案例

http://robot.czxy.com/docs/raspberry/03_quickstart/

下位机代码

# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import socket
import time
# import string
# import threading# 小车状态值定义
STATE_STOP = 0;STATE_FORWORD = 1;
STATE_BACK = 2;STATE_LEFT = 3;
STATE_RIGHT = 4;STATE_LEFT_FRONT = 5;
STATE_RIGHT_FRONT = 6;STATE_LEFT_BACK = 7;
STATE_RIGHT_BACK = 8;STATE_CLOCKWISE = 9;
STATE_COUNTERCLOCKWISE = 10;STATE_TEST = 11;# 小车点击引脚定义; 小车电机按照顺时针方向 1,2,3,4 排列
# 左前方 白紫蓝
MOTOR_LEFT_FRONT_A = 22
MOTOR_LEFT_FRONT_B = 27
MOTOR_LEFT_FRONT_PWM = 17# 右前方 绿黄橙
MOTOR_RIGHT_FRONT_A =  5
MOTOR_RIGHT_FRONT_B = 6
MOTOR_RIGHT_FRONT_PWM = 13# 右后方 绿黄橙
MOTOR_RIGHT_BACK_A =  12
MOTOR_RIGHT_BACK_B = 16
MOTOR_RIGHT_BACK_PWM = 20# 左后方 白紫蓝
MOTOR_LEFT_BACK_A = 19
MOTOR_LEFT_BACK_B = 26
MOTOR_LEFT_BACK_PWM = 21# 设置GPIO口为BCM编码方式
GPIO.setmode(GPIO.BCM)# 忽略警告信息
GPIO.setwarnings(False)class Motor:"""电机对象"""def __init__(self,motorA,motorB,motorPwm):self.motorA = motorA;self.motorB = motorB;self.motorPwm = motorPwm;self.pwm = None;self.init_motor()# 小车速度变量self.carSpeed = 50def init_motor(self):GPIO.setup(self.motorA, GPIO.OUT, initial=GPIO.LOW)GPIO.setup(self.motorB, GPIO.OUT, initial=GPIO.LOW)GPIO.setup(self.motorPwm, GPIO.OUT, initial=GPIO.HIGH)self.pwm = GPIO.PWM(self.motorPwm, 2000)self.pwm.start(0)def forward(self,value=0):GPIO.setup(self.motorA, GPIO.OUT, initial=GPIO.HIGH)GPIO.setup(self.motorB, GPIO.OUT, initial=GPIO.LOW)self.pwm.ChangeDutyCycle(self.carSpeed)def back(self,value=0):GPIO.setup(self.motorA, GPIO.OUT, initial=GPIO.LOW)GPIO.setup(self.motorB, GPIO.OUT, initial=GPIO.HIGH)self.pwm.ChangeDutyCycle(self.carSpeed)def stop(self):GPIO.setup(self.motorA, GPIO.OUT, initial=GPIO.LOW)GPIO.setup(self.motorB, GPIO.OUT, initial=GPIO.LOW)self.pwm.ChangeDutyCycle(0)class HeiCar:def __init__(self):self.currentState = 0;# 按照顺时针的方向# 左前方self.motor1 = Motor(MOTOR_LEFT_FRONT_A, MOTOR_LEFT_FRONT_B, MOTOR_LEFT_FRONT_PWM)# 右前方self.motor2 = Motor(MOTOR_RIGHT_FRONT_A, MOTOR_RIGHT_FRONT_B, MOTOR_RIGHT_FRONT_PWM)# 右后方self.motor3 = Motor(MOTOR_RIGHT_BACK_A, MOTOR_RIGHT_BACK_B, MOTOR_RIGHT_BACK_PWM);# 左后方self.motor4 = Motor(MOTOR_LEFT_BACK_A, MOTOR_LEFT_BACK_B, MOTOR_LEFT_BACK_PWM);self.motors = [self.motor1,self.motor2,self.motor3,self.motor4];def forword(self):""" 小车前进"""for motor in self.motors:motor.forward();def back(self):"""小车后退"""for motor in self.motors:motor.back();def stop(self):"""停止"""for motor in self.motors:motor.stop();def left(self):"""小车向左边 横着走"""self.motor1.back()self.motor4.forward();self.motor2.forward()self.motor3.back()def right(self):""" 小车向右边 横着走"""self.motor1.forward()self.motor4.back()self.motor2.back()self.motor3.forward()def left_front(self):""" 向左前方 45度 """self.motor1.stop()self.motor4.forward()self.motor2.forward()self.motor3.stop()def right_front(self):""" 向右前方 45度 """self.motor1.forward()self.motor4.stop()self.motor2.stop()self.motor3.forward()def left_back(self):""" 向左后45 度"""self.motor1.back()self.motor4.stop()self.motor2.stop()self.motor3.back()def right_back(self):""" 右后 45 度"""self.motor1.stop()self.motor4.back()self.motor2.back()self.motor3.stop()def clockwise(self):""" 顺时针"""self.motor1.forward()self.motor4.forward()self.motor2.back()self.motor3.back()def counterclockwise(self):""" 逆时针 """self.motor1.back()self.motor4.back()self.motor2.forward()self.motor3.forward()try:car = HeiCar();global connectflagconnectflag = 0count = 50# 通过socket创建监听套接字并设置为非阻塞模式tcpservicesock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)tcpservicesock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)tcpservicesock.setblocking(0)# 填充绑定服务器的ip地址和端口号# 注意:这里一定要根据自己的树莓派的ip地址来填tcpservicesock.bind(('192.168.12.1', 8888))# 监听客户端的连接tcpservicesock.listen(5)print("waiting for connection....")# 创建监听列表clientAddrList = []print("服务器已经开启啦!")while True:try:# 准备接受客户端的连接并返回连接套接字tcpclientsock, addr = tcpservicesock.accept()if tcpclientsock:connectflag = 1print("连接客户端成功啦!")except:passelse:# print("new user :%s " % str(addr))# 设置连接套接字为非阻塞的模式并将连接的套接字放入到监听列表中tcpclientsock.setblocking(0)clientAddrList.append((tcpclientsock, addr))for tcpclientsock, addr in clientAddrList:try:global recvbufglobal sendbufrecvbuf = ''# TCP接受数据# print("Start recv!",addr)recvbuf = tcpclientsock.recv(128)# print("Start recv over!")except:passelse:if len(recvbuf) > 0:# print("recvbuf", recvbuf)state = int(recvbuf);car.currentState = state;# 根据解析的数据让小车做出相应的运动if state == STATE_STOP:print("=====停止1=====")car.stop()elif state == STATE_FORWORD:print("=====前进=====")car.forword()elif state == STATE_BACK:print("=====后退=====")car.back()elif state == STATE_LEFT:print("=====左移=====")car.left()elif state == STATE_RIGHT:print("=====右移=====")car.right()elif state == STATE_LEFT_FRONT:print("=====左前方=====")car.left_front()elif state == STATE_RIGHT_FRONT:print("=====右前方=====")car.right_front()elif state == STATE_LEFT_BACK:print("=====左后方=====")car.left_back()elif state == STATE_RIGHT_BACK:print("=====右后方=====")car.right_back()elif state == STATE_CLOCKWISE:print("=====顺时针=====")car.clockwise()elif state == STATE_COUNTERCLOCKWISE:print("=====逆时针=====")car.counterclockwise()elif state == STATE_TEST:car.forword()time.sleep(0.5)car.stop()time.sleep(0.5)car.back()time.sleep(0.5)car.stop()car.left()time.sleep(0.5)car.stop()time.sleep(0.5)car.right()time.sleep(0.5)car.stop()time.sleep(0.5)car.left_front()time.sleep(0.5)car.stop()time.sleep(0.5)car.right_back()time.sleep(0.5)car.stop()time.sleep(0.5)car.right_front()time.sleep(0.5)car.stop()time.sleep(0.5)car.left_back()time.sleep(0.5)car.stop()time.sleep(0.5)car.clockwise()time.sleep(0.5)car.stop()time.sleep(0.5)car.counterclockwise()time.sleep(0.5)else:print("=====停止2=====")car.stop()# 让小车运动0.5s 即停止time.sleep(0.5)car.stop()time.sleep(0.5)else:tcpclientsock.close()clientAddrList.remove((tcpclientsock, addr))car.stop()except KeyboardInterrupt:pass
tcpclientsock.close()
tcpservicesock.close()
GPIO.cleanup()

上位机代码

from PyQt5.QtWidgets import QApplication,QWidget,QPushButton,QVBoxLayout,QHBoxLayout
import sys
from socket import *
# import threadingaddress = "192.168.12.1"
port = 8888
server_socket=""def connectCar():global server_socketserver_socket = socket(AF_INET, SOCK_STREAM)server_socket.connect((address, port))print("连接服务端成功啦!")#小车状态值定义
STATE_STOP = 0;STATE_FORWORD = 1;
STATE_BACK = 2;STATE_LEFT = 3;
STATE_RIGHT = 4;STATE_LEFT_FRONT = 5;
STATE_RIGHT_FRONT = 6;STATE_LEFT_BACK = 7;
STATE_RIGHT_BACK = 8;STATE_CLOCKWISE = 9;
STATE_COUNTERCLOCKWISE = 10;
STATE_TEST = 11def controlCallback(val):print("发送数据",val)server_socket.send(str(val).encode())print("发送成功!")if __name__ == '__main__':# 创建核心类app = QApplication(sys.argv)# 创建窗口widget = QWidget()widget.resize(200,400)# 创建垂直布局vbox = QVBoxLayout(widget)# 创建水平布局hbox0 = QHBoxLayout()hbox1 = QHBoxLayout()hbox2 = QHBoxLayout()hbox3 = QHBoxLayout()hbox4 = QHBoxLayout()hbox5 = QHBoxLayout()hbox6 = QHBoxLayout()hbox7 = QHBoxLayout()hbox8 = QHBoxLayout()hbox9 = QHBoxLayout()vbox.addLayout(hbox0)vbox.addLayout(hbox1)vbox.addLayout(hbox2)vbox.addLayout(hbox3)vbox.addLayout(hbox4)vbox.addLayout(hbox5)vbox.addLayout(hbox6)vbox.addLayout(hbox7)vbox.addLayout(hbox8)vbox.addLayout(hbox9)# --------------------------------------------------------------------------------leftBtn = QPushButton("必须要先连接服务端")hbox0.addWidget(leftBtn)leftBtn.clicked.connect(lambda : connectCar())# --------------------------------------------------------------------------------# 创建按钮leftForwardBtn = QPushButton("左前")hbox1.addWidget(leftForwardBtn)leftForwardBtn.clicked.connect(lambda :controlCallback(STATE_LEFT_FRONT))# 创建按钮forwordBtn = QPushButton("前进")hbox1.addWidget(forwordBtn)forwordBtn.clicked.connect(lambda :controlCallback(STATE_FORWORD))# 创建按钮rightForwardBtn = QPushButton("右前")hbox1.addWidget(rightForwardBtn)rightForwardBtn.clicked.connect(lambda :controlCallback(STATE_RIGHT_FRONT))# --------------------------------------------------------------------------------# 创建按钮leftBtn = QPushButton("左移")hbox2.addWidget(leftBtn)leftBtn.clicked.connect(lambda :controlCallback(STATE_LEFT))# 创建按钮stopBtn = QPushButton("停止")hbox2.addWidget(stopBtn)stopBtn.clicked.connect(lambda :controlCallback(STATE_STOP))# 创建按钮rightBtn = QPushButton("右移")hbox2.addWidget(rightBtn)rightBtn.clicked.connect(lambda :controlCallback(STATE_RIGHT))# --------------------------------------------------------------------------------# 创建按钮leftBackBtn = QPushButton("左后")hbox3.addWidget(leftBackBtn)leftBackBtn.clicked.connect(lambda :controlCallback(STATE_LEFT_BACK))# 创建按钮backBtn = QPushButton("后退")hbox3.addWidget(backBtn)backBtn.clicked.connect(lambda :controlCallback(STATE_BACK))# 创建按钮rightBackBtn = QPushButton("右后")hbox3.addWidget(rightBackBtn)rightBackBtn.clicked.connect(lambda :controlCallback(STATE_RIGHT_BACK))#--------------------------------------------------------------------------------# 创建按钮counterclockwiseBtn = QPushButton("逆时针旋转")hbox4.addWidget(counterclockwiseBtn)counterclockwiseBtn.clicked.connect(lambda :controlCallback(STATE_COUNTERCLOCKWISE))# 创建按钮clockwiseBtn = QPushButton("顺时针旋转")hbox4.addWidget(clockwiseBtn)clockwiseBtn.clicked.connect(lambda :controlCallback(STATE_CLOCKWISE))#--------------------------------------------------------------------------------# 创建按钮FRBLBtn = QPushButton("测试")hbox5.addWidget(FRBLBtn)FRBLBtn.clicked.connect(lambda :controlCallback(STATE_TEST))widget.show()app.exec()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/56646.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习11:Transformer

目录 什么是 Transformer&#xff1f; Encoder Decoder Attention Self-Attention Context-Attention 什么是 Transformer&#xff08;微软研究院笨笨&#xff09; RNN和Transformer区别 Universal Transformer和Transformer 区别 什么是 Transformer&#xff1f; ​ …

tomcat版本升级

一、升级原由 因漏洞扫描发现生产环境中所使用的tomcat版本有高风险漏洞&#xff0c;评估后决定将其升级至当前系统最新版本 tomcat8.5.32升级至apache-tomcat-8.5.81.tar.gz&#xff0c;可到官网下载&#xff1a;https://archive.apache.org/dist/tomcat/tomcat-8/ 二、升级步…

习题练习 C语言(暑期第二弹)

编程能力小提升&#xff01; 前言一、表达式判断二、Assii码的理解应用三、循环跳出判断四、数字在升序数组中出现的次数五、整数转换六、循环语句的应用七、函数调用八、两个数组的交集九、C语言基础十、图片整理十一、数组的引用十二、数组的引用十三、字符个数统计十四、多数…

【考研数学】矩阵、向量与线性方程组解的关系梳理与讨论

文章目录 引言一、回顾二、梳理齐次线性方程组非齐次线性方程组 写在最后 引言 两个原因让我想写这篇文章&#xff0c;一是做矩阵题目的时候就发现这三货经常绑在一起&#xff0c;让人想去探寻其中奥秘&#xff1b;另一就是今天学了向量组的秩&#xff0c;让我想起来了之前遗留…

初阶数据结构(六)队列的介绍与实现

&#x1f493;博主csdn个人主页&#xff1a;小小unicorn&#x1f493; ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的学习足迹&#x1f69a; &#x1f339;&#x1f339;&#x1f339;关注我带你学习编程知识 栈 队列的介绍队列的概念&#xff1a;队…

H5商城公众号商城系统源码 积分兑换商城系统独立后台

网购商城系统源码 积分兑换商城系统源码 独立后台附教程 测试环境&#xff1a;NginxPHP7.0MySQL5.6thinkphp伪静态

剑指 Offer 43. 1~n 整数中 1 出现的次数

目录 ​编辑 一&#xff0c;问题描述 二&#xff0c;例子 三&#xff0c;题目接口 四&#xff0c;题目解答 1&#xff0c;暴力解法 2.规律解法 总结&#xff1a; 代码&#xff1a; 一&#xff0c;问题描述 输入一个整数 n &#xff0c;求1&#xff5e;n这n个整数的十进…

2023高教社杯数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 描述 …

异侠的CSDN笔记目录

文章目录 B站雷神B站黑马其他零散记录MyBatis 及其 Plus常用工具类线程 & 网络编程过滤器监听器Listener会话Session异步请求 AJAX B站雷神 基础知识 如何创建项目 快速创建项目 自动配置原理 容器功能 小技巧 yaml用法 web开发简单功能 数据响应与内容协商模板引擎 …

1. 卷积原理

① 卷积核不停的在原图上进行滑动&#xff0c;对应元素相乘再相加。 ② 下图为每次滑动移动1格&#xff0c;然后再利用原图与卷积核上的数值进行计算得到缩略图矩阵的数据&#xff0c;如下图右所示。 import torch import torch.nn.functional as Finput torch.tensor([[1, 2…

mysql并行效率提升

下面是一个并行读取mysql数据库表的测试程序&#xff0c;测试结果发现&#xff0c;读取10个表&#xff0c;1个个读取&#xff0c;和并行读取10个&#xff0c;效率一样&#xff0c;甚至并行读取还慢很多&#xff0c;这是为什么&#xff1f; con get_db_conn() results {} poo…

2023.8 - java - 数组

声明数组变量 首先必须声明数组变量&#xff0c;才能在程序中使用数组。下面是声明数组变量的语法&#xff1a; dataType[] arrayRefVar; // 首选的方法或dataType arrayRefVar[]; // 效果相同&#xff0c;但不是首选方法int[] a {1,2,3};int b[] new int[10];TS:let a:…

布隆过滤器

目录 初识布隆过滤器使用布隆过滤器布隆过滤器如何实现布隆过滤器使用场景布隆过滤器存在问题解决策略 初识布隆过滤器 布隆过滤器&#xff08;Bloom Filter&#xff09;是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一…

【排序】快排的优化(三数取中)

三数取中 就是将整个数组分为两半&#xff0c;三个数&#xff08;头、尾、中间&#xff09;的第二大的数字和 left 位置的数字相交换&#xff0c;可以避免排一个有序的数组从而出现单分支树的情况。 如果每次都找了一个最小的值作为基准值&#xff0c;那就会导致这个结点没有左…

具有优异导电性能且抑制了准饱和效应的1200V 4H-SiC沟槽MOSFET

标题&#xff1a;1200V 4H-SiC trench MOSFET with superior figure of merit and suppressed quasi-saturation effect 摘要 本文提出一种具有部分被埋层n区包围的p屏蔽区的优异性能(FoM)1200V 4H-SiC沟槽MOSFET。在准饱和(QS)状态下&#xff0c;埋层n区抑制由p屏蔽区形成的耗…

IPD流程中,TR2评审的内容、评审标准和评审要素

在IPD&#xff08;Integrated Product Development&#xff09;流程中&#xff0c;TR2&#xff08;Technical Review 2&#xff09;评审是项目开发过程中的一个重要里程碑评审&#xff0c;通常在项目的中期进行。TR2评审的目的是对项目的技术进展和实施情况进行评估和审查&…

异地访问Oracle数据库的解决方案:利用内网穿透实现PL/SQL远程连接的建议与步骤

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle ​ 小月糖糖主页 在强者的眼中&#xff0c;没有最…

【C++】特殊类的设计

特殊类的设计 前言正式开始设计一个类&#xff0c;不能被拷贝设计一个类&#xff0c;只能在堆上创建对象设计一个类&#xff0c;只能在栈上创建对象设计一个类&#xff0c;不能被继承设计一个类&#xff0c;只能创建一个对象(单例模式)饿汉模式懒汉模式总结 前言 点进来的同学…

c++ 学习之函数的默认参数

当在C中使用默认参数时&#xff0c;你可以在函数声明中为一个或多个参数指定默认值。这允许你在调用函数时&#xff0c;如果没有为这些参数提供实际值&#xff0c;编译器会使用你提供的默认值。这样可以在不同的情况下使用同一个函数&#xff0c;避免编写多个函数重载。 以下是…

第十一章 CUDA的NMS算子实战篇(上篇)

cuda教程目录 第一章 指针篇 第二章 CUDA原理篇 第三章 CUDA编译器环境配置篇 第四章 kernel函数基础篇 第五章 kernel索引(index)篇 第六章 kenel矩阵计算实战篇 第七章 kenel实战强化篇 第八章 CUDA内存应用与性能优化篇 第九章 CUDA原子(atomic)实战篇 第十章 CUDA流(strea…