PART 6 树莓派小车+QT (TCP控制)

news2025/6/7 13:33:34

1. 树莓派作为服务器的程序

(1)服务器tcp_server_socket程序

可以实现小车前进、后退、左转、右转、加减速(可能不行)

carMoveControl.py

import  RPi.GPIO as GPIO
import time
import tty,sys,select,termios
import socket
import string
import threading
import carMove

run_car  = '1'  #鎸夐敭鍓?back_car = '2'  #鎸夐敭鍚?left_car = '3'  #鎸夐敭宸?right_car = '4' #鎸夐敭鍙?stop_car = '0'  #鎸夐敭鍋?#灏忚溅鐘舵€佸€煎畾涔?enSTOP = 0
enRUN =1
enBACK = 2
enLEFT = 3
enRIGHT = 4
enTLEFT =5
enTRIGHT = 6

 #灏忚溅鍜岃埖鏈虹姸鎬佸彉閲?g_CarState = 0
g_ServoState = 0
#灏忚溅閫熷害鍙橀噺


recvbuf = ""


        
try:
   
    #閫氳繃socket鍒涘缓鐩戝惉濂楁帴瀛楀苟璁剧疆涓洪潪闃诲妯″紡
    tcp_server_socket= socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #濉厖缁戝畾鏈嶅姟鍣ㄧ殑ip鍦板潃鍜岀鍙e彿
    #娉ㄦ剰锛氳繖閲屼竴瀹氳鏍规嵁鑷繁鐨勬爲鑾撴淳鐨刬p鍦板潃鏉ュ~port
    tcp_server_socket.bind(("", 6002))
    tcp_server_socket.listen(128)  
    #tcp_server_socket.setblocking(0)  

    #鐩戝惉瀹㈡埛绔殑杩炴帴
    while True:  
        print ("waiting for connection....")     
        tcp_client_socket,tcp_client_addr = tcp_server_socket.accept()
        print ("Start recv!")
        
        if tcp_server_socket:
            connectflag = 1
            print ("new user :%s " % str(tcp_client_addr))
                #璁剧疆杩炴帴濂楁帴瀛椾负闈為樆濉炵殑妯″紡骞跺皢杩炴帴鐨勫鎺ュ瓧鏀惧叆鍒扮洃鍚垪琛ㄤ腑

            #TCP鎺ュ彈鏁版嵁
        while True:
            recvbuf = tcp_client_socket.recv(128)
            print(recvbuf)
            
            global speed
            speed = 30

             #TCP鎺ュ彈鏁版嵁
            if recvbuf == b"$0,0,0,0,0,0,1,0,0,0#": # speed up
                speed += 5
                print ("Car Speed is : %d", speed)
                if speed > 100:
                    speed = 100 #灏忚溅鍔犻€?            elif recvbuf == b"$0,0,0,0,0,0,2,0,0,0#": # speed down
                speed -= 5
                if speed < 10:  #灏忚溅鍑忛€?                    speed= 10  
                print ("Car Speed is : %d", speed)

            elif recvbuf == b"$1,0,0,0,0,0,0,0,0,0#":
                carMove.goForward()
            elif recvbuf == b"$2,0,0,0,0,0,0,0,0,0#":
                carMove.goBackward()
            elif recvbuf == b"$3,0,0,0,0,0,0,0,0,0#":
                carMove.turnLeft()
            elif recvbuf == b"$4,0,0,0,0,0,0,0,0,0#":
                carMove.turnRight()            
            elif recvbuf == b"$0,0,0,0,0,0,0,0,0,0#":                    
                carMove.motorStop()  
                
           
            else:
                break
        tcp_client_socket.close()
        print ("Start recv over!")
       
    tcp_client_socket.close()
except KeyboardInterrupt:
    pass

GPIO.cleanup()

调用的小车程序 carMove.py

import  RPi.GPIO as GPIO
import time
import tty,sys,select,termios


run_car  = '1'  #鎸夐敭鍓?back_car = '2'  #鎸夐敭鍚?left_car = '3'  #鎸夐敭宸?right_car = '4' #鎸夐敭鍙?stop_car = '0'  #鎸夐敭鍋? 

speed = 20

#璁剧疆GPIO鍙d负BCM缂栫爜鏂瑰紡
GPIO.setmode(GPIO.BCM)

#蹇界暐璀﹀憡淇℃伅
GPIO.setwarnings(False)

# AIN涓哄乏鍓嶈疆
P1_PWMA, P1_AIN1, P1_AIN2 = 26, 13,19
# AIN涓哄乏鍚庤疆
P1_PWMA1, P1_AIN11, P1_AIN22 = 17, 22, 27

# BIN涓哄彸鍓嶈疆
P2_PWMB, P2_BIN1, P2_BIN2 = 25, 24, 23
# BIN涓哄彸鍚庤疆
P2_PWMB1, P2_BIN11, P2_BIN22 = 16, 21, 20

#宸︿晶杞瓙

P1 = [P1_PWMA, P1_AIN1, P1_AIN2,
      P1_PWMA1, P1_AIN11, P1_AIN22]

#鍙充晶杞瓙
P2 = [P2_PWMB, P2_BIN1, P2_BIN2,
      P2_PWMB1, P2_BIN11, P2_BIN22]

#PWM浣跨敤10000Hz鐨勯鐜囨晥鏋滆緝濂斤紝杈撳叆鐨勮皟閫熷尯闂翠负0锝?00,浣嗚皟閫熶负5宸﹀彸鏃朵篃鏄彲浠ョЩ鍔↙_Up_Motor= GPIO.PWM(P1_PWMA,10000)
         
GPIO.setup(P1,GPIO.OUT)
GPIO.setup(P2,GPIO.OUT)
L_Up_Motor = GPIO.PWM(P1_PWMA,10000)
L_Up_Motor.start(0)
L_Down_Motor = GPIO.PWM(P1_PWMA1,10000)
L_Down_Motor.start(0)
R_Up_Motor= GPIO.PWM(P2_PWMB,10000)
 
R_Up_Motor.start(0) 

R_Down_Motor = GPIO.PWM(P2_PWMB1,10000)
R_Down_Motor.start(0)

      
# A 0 1 姝?   A1 1 0 姝?      B 0  1 姝?  B1  1  0姝? 
#宸﹁浆 A 0 0 鍙? A1 0 1 鍙?        B 0  1    B1   0    0    zuozhuan:zuocez fanzhuan, youce zhengzhuan
Diretion = [
    [0,0, 0,0, 0,0, 0,0],
    [0,1, 1,0, 0,1, 1,0],
    [1,0, 0,1, 1,0, 0,1],
    [1,0, 0,1, 0,1, 1,0],  
    [0,1, 1,0, 1,0, 0,1]  
    ]
#瀹氫箟鏂瑰悜  
      



def DIRETION(diretion):
        GPIO.output(P1_AIN1,diretion[0]) #AIN1
        GPIO.output(P1_AIN2,diretion[1]) #AIN2   P1_AIN2涓哄乏鍓嶈疆
        

        GPIO.output(P1_AIN11,diretion[2]) #AIN2   P1_AIN2涓哄乏鍚庤疆
        GPIO.output(P1_AIN22,diretion[3]) #AIN1
            
        GPIO.output(P2_BIN1,diretion[4]) #BIN2  BIN涓哄彸鍓嶈疆 
        GPIO.output(P2_BIN2,diretion[5]) #BIN1
            
        GPIO.output(P2_BIN11,diretion[6]) #BIN1     
        GPIO.output(P2_BIN22,diretion[7]) #BIN2  BIN涓哄彸鍚庤疆 
   

def reset():

        GPIO.output(13, GPIO.LOW)
        GPIO.output(19, GPIO.LOW)
        GPIO.output(22, GPIO.LOW)
        GPIO.output(27, GPIO.LOW)
        GPIO.output(24, GPIO.LOW)
        GPIO.output(23, GPIO.LOW)
        GPIO.output(21, GPIO.LOW)
        GPIO.output(20, GPIO.LOW)

#     A = {'s': 0, 'w':1, 'b':2, 'l':3,'r':4}


def goForward( ):
           
        DIRETION(Diretion[1])
        L_Up_Motor.ChangeDutyCycle(speed)
        L_Down_Motor.ChangeDutyCycle(speed)
        R_Up_Motor.ChangeDutyCycle(speed)
        R_Down_Motor.ChangeDutyCycle(speed)



def goBackward( ):
            
        DIRETION(Diretion[2])
        L_Up_Motor.ChangeDutyCycle(speed)
        L_Down_Motor.ChangeDutyCycle(speed)
        R_Up_Motor.ChangeDutyCycle(speed)
        R_Down_Motor.ChangeDutyCycle(speed)
        
def turnLeft( ):
        
    
        DIRETION(Diretion[3])
        L_Up_Motor.ChangeDutyCycle(speed)
        L_Down_Motor.ChangeDutyCycle(speed)
        R_Up_Motor.ChangeDutyCycle(speed)
        R_Down_Motor.ChangeDutyCycle(speed)

def turnRight( ):
           
        DIRETION(Diretion[4])
        L_Up_Motor.ChangeDutyCycle(speed)
        L_Down_Motor.ChangeDutyCycle(speed)
        R_Up_Motor.ChangeDutyCycle(speed)
        R_Down_Motor.ChangeDutyCycle(speed)
        
def motorStop( ):
    
        DIRETION(Diretion[0])
        L_Up_Motor.ChangeDutyCycle(0)
        L_Down_Motor.ChangeDutyCycle(0)
        R_Up_Motor.ChangeDutyCycle(0)
        R_Down_Motor.ChangeDutyCycle(0)

    
''' 
try:
    
    goForward()
    time.sleep(2)
    goBackward()
    time.sleep(2)
    turnLeft()
    time.sleep(2)
    turnRight()
    time.sleep(2)
    time.sleep(1)
       
    reset()
    GPIO.cleanup()


except KeyboardInterrupt:
    pass
'''

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

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

相关文章

Cilium动手实验室: 精通之旅---4.Cilium Gateway API - Lab

Cilium动手实验室: 精通之旅---4.Cilium Gateway API - Lab 1. 环境准备2. API 网关--HTTP2.1 部署应用2.2 部署网关2.3 HTTP路径匹配2.4 HTTP头匹配 3. API网关--HTTPS3.1 创建TLS证书和私钥3.2 部署HTTPS网关3.3 HTTPS请求测试 4. API网关--TLS 路由4.1 部署应用4.2 部署网关…

Java转Go日记(六十):gin其他常用知识

1. 日志文件 package mainimport ("io""os""github.com/gin-gonic/gin" )func main() {gin.DisableConsoleColor()// Logging to a file.f, _ : os.Create("gin.log")gin.DefaultWriter io.MultiWriter(f)// 如果需要同时将日志写入…

89.实现添加收藏的功能的后端实现

实现完查看收藏列表之后&#xff0c;实现的是添加收藏的功能 我的设想是&#xff1a;在对话界面中&#xff0c;如果用户认为AI的回答非常好&#xff0c;可以通过点击该回答对应的气泡中的图标&#xff0c;对该内容进行添加 所以后端实现为&#xff1a; service类中添加&…

v1.0.1版本更新·2025年5月22日发布-优雅草星云物联网AI智控系统

v1.0.1版本更新2025年5月22日发布-优雅草星云物联网AI智控系统 开源地址 星云智控官网&#xff1a; 优雅草星云物联网AI智控软件-移动端vue: 优雅草星云物联网AI智控软件-移动端vue 星云智控PC端开源&#xff1a; 优雅草星云物联网AI智控软件-PC端vue: 优雅草星云物联网AI…

如何创造出一种不同于程序语言的人与机器自然交互语言?

人机交互自然语言通过模拟人类日常交流方式&#xff0c;使机器能够理解并响应人类的自然表达&#xff0c;从而打破编程语言的复杂性壁垒&#xff0c;极大地提升人机协同的效率和自然性&#xff0c;让机器更好地融入人类的工作与生活场景。创造一种通用的人与机器自然交互语言是…

宝塔think PHP8 安装使用FFmpeg 视频上传

宝塔think PHP8 安装使用FFmpeg 一、 安装think PHP8二、安装 FFmpeg1&#xff0c;登录到宝塔面板。2&#xff0c;进入“软件商店”。3&#xff0c;搜索“FFmpeg”。4&#xff0c;选择版本点击安装。5&#xff0c;检查 FFmpeg 是否安装成功6&#xff0c; 在 ThinkPHP 8 中使用 …

26.【新型数据架构】-零ETL架构

26.【新型数据架构】-零ETL架构:减少数据移动,原系统直接分析;典型实现(AWS Zero-ETL) 一、零ETL的本质:从“数据搬运工”到“数据翻译官” 传统ETL(Extract-Transform-Load)需要将数据从源系统抽取、清洗、转换后加载到目标系统,这一过程往往耗时费力,且面临数据延…

静态相机中的 CCD和CMOS的区别

文章目录 CCD处理方式CMOS处理方式两者区别 首先根据 成像原理&#xff0c;CCD和CMOS的作用是一致的&#xff0c;都是为了将光子转化为数字图像&#xff0c;只是 转换的方式出现差异。 CCD处理方式 获取光子&#xff1a; 在电荷耦合器件&#xff08;CCD&#xff09;传感器中…

bug:undefined is not iterable (cannot read property Symbol(Symbol.iterator))

1.如图 2.分析 关键报错提示&#xff1a; undefined is not iterable (cannot read property Symbol(Symbol.iterator)) 直译&#xff1a; undefined是不可迭代的&#xff08;不能读取属性Symbol(Symbol.iterator)&#xff09; 理解&#xff1a; 有一个值、不存在&#x…

机器学习:支持向量机(SVM)原理解析及垃圾邮件过滤实战

一、什么是支持向量机&#xff08;SVM&#xff09; 1. 基本概念 1.1 二分类问题的本质 在机器学习中&#xff0c;分类问题是最常见的任务之一。最简单的情况就是二分类&#xff1a;比如一封邮件是“垃圾邮件”还是“正常邮件”&#xff1f;一个病人是“患病”还是“健康”&a…

LLM Agent 如何颠覆股价预测的传统范式

写在前面 股价预测,金融领域的“圣杯”之一,吸引了无数研究者和投资者。传统方法从技术指标到复杂的计量经济模型,再到机器学习,不断演进,但市场的高度复杂性、非线性和充斥噪声的特性,使得精准预测依然是巨大的挑战。大型语言模型(LLM)的崛起,特别是LLM Agent这一新…

【案例分享】如何借助JS UI组件库DHTMLX Suite构建高效物联网IIoT平台

随着工业领域数字化进程的持续加快&#xff0c;Web 技术在实现实时监控、数据可视化与控制系统等方面正扮演着越来越核心的角色。来自智利的科技企业 Wise Data Global 就是这一趋势中的积极践行者。他们借助慧都科技代理的 DHTMLX Suite JavaScript UI 控件库&#xff0c;为遥…

Skia如何绘制几何图形

应用程序&#xff08;网页、桌面应用或移动应用&#xff09;大多数都是由基本的几何图形构成的。那我们该如何使用 Skia 绘制基本的几何图形。 画矩形 void drawRect(SkCanvas* canvas) {SkPaint paint;paint.setColor(SK_ColorRED);paint.setStroke(true);paint.setStrokeWid…

spring:实例化类过程中方法执行顺序。

如题。在实例化Bean时&#xff0c;会根据配置依次调用方法。在此测试代码如下&#xff1a; 在测试类中继承接口InitializingBean&#xff0c;接口InterfaceUserService&#xff08;该接口为自定义&#xff0c;只是定义set方法&#xff09;。 InterfaceUserService&#xff0c…

设置应用程序图标

(1)找一张图片 (2)然后转ico图片 在线生成透明ICO图标——ICO图标制作 验证16x16就可以 降低exe大小 (3) 在xxx.pro修改 添加 &#xff08;4&#xff09; 删除 build 和 xxxpro_user文件 (5)编译project 和运行xx.exe (6)右键 设置快捷方式

「基于连续小波变换(CWT)和卷积神经网络(CNN)的心律失常分类算法——ECG信号处理-第十五课」2025年6月6日

一、引言 心律失常是心血管疾病的重要表现形式&#xff0c;其准确分类对临床诊断具有关键意义。传统的心律失常分类方法主要依赖于人工特征提取和经典机器学习算法&#xff0c;但这些方法往往受限于特征选择的主观性和模型的泛化能力。 随着深度学习技术的发展&#xff0c;基于…

用go从零构建写一个RPC(4)--gonet网络框架重构+聚集发包

在追求高性能的分布式系统中&#xff0c;RPC 框架的底层网络能力和数据传输效率起着决定性作用。经过几轮迭代优化&#xff0c;我完成了第四版本的 RPC 框架。相比以往版本&#xff0c;这一版本的最大亮点在于 重写了底层网络框架 和 实现了发送端的数据聚集机制&#xff0c;这…

OpenBayes 一周速览|TransPixeler 实现透明化文本到视频生成;统一图像定制框架 DreamO 上线,一键处理多种图像生成任务

公共资源速递 2 个公共数据集&#xff1a; * s1K-1.1 数学推理数据集 * HPA 人类蛋白质图谱数据集 3 个公共模型&#xff1a; * MedGemma-4B-IT * Devstral-Small-2505 * DeepSeek-Prover-V2-7B 12 个公共教程&#xff1a; 视频生成 * 2 语音交互 * 3 代码生成 * 3 …

4D毫米波雷达产品推荐

供应商链接 &#xff1a;https://mp.weixin.qq.com/s/GYarrc9VEZS0FafxRUeG9w 大陆 ARS548 采埃孚 博世 安波福 -------- Waymo MobileEye 华为&#xff08;未找到官网资料&#xff09; ------- 森思泰克 http://www.whst.com/contact.html 芜湖经济技术开发区东区…

yolo 训练 中间可视化

yolo训练前几个batch&#xff0c;会可视化target: if plots and ni < 33:f save_dir / ftrain_batch{ni}.jpg # filenameplot_images(imgs, targets, paths, f, kpt_labelkpt_label)