From fd36e319ec9b974c1da58e3318cdd7af5209c9b7 Mon Sep 17 00:00:00 2001 From: zyp <1721777650@qq.com> Date: Tue, 29 Oct 2024 10:01:05 +0800 Subject: [PATCH 1/2] update car's control --- carsrun/appCam.py | 17 +++++- carsrun/car.py | 103 +++++---------------------------- carsrun/templates/index-t.html | 24 +++++--- 3 files changed, 46 insertions(+), 98 deletions(-) diff --git a/carsrun/appCam.py b/carsrun/appCam.py index 1568e9e..d35ba90 100644 --- a/carsrun/appCam.py +++ b/carsrun/appCam.py @@ -19,6 +19,8 @@ from car import CAR import threading import cv2 app = Flask(__name__, static_url_path='') +# 照片保存路径 +PHOTO_PATH = "photo.jpg" def gen_frames(): # generate frame by frame from camera picam2 = Picamera2() @@ -42,6 +44,18 @@ def index(): def video_feed(): #Video streaming route. Put this in the src attribute of an img tag return Response(gen_frames(), mimetype='multipart/x-mixed-replace; boundary=frame') +#--------------------------------------------------------------------------------- +@app.route('/take_photo') +def take_photo(): + picam2 = Picamera2() + picam2.configure(picam2.create_video_configuration(main={"format": 'XRGB8888', "size": (640, 480)})) + picam2.start() + frame = picam2.capture_array() # Capture a single frame + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + cv2.imwrite(PHOTO_PATH, frame) # Save the frame as a JPEG file + + return send_file(PHOTO_PATH, as_attachment=True) # Send the file to download +#--------------------------------------------------------------------------------------- # def gen(camera): # """Video streaming generator function.""" @@ -69,9 +83,6 @@ car = CAR() @app.route('/control/') def control_index(): word = """指令:\n - /led: 灯光闪烁\n - /led_light: 打开全部灯光\n - /led_dark: 关闭全部灯光\n /stop(/Q): 小车停止运动\n /forward(/W): 小车开始运动\n /back(/S): 小车向后运动\n diff --git a/carsrun/car.py b/carsrun/car.py index c72f49a..6b9bea3 100644 --- a/carsrun/car.py +++ b/carsrun/car.py @@ -3,11 +3,11 @@ import os import time import RPi.GPIO as GPIO from base_ctrl import BaseController -####################################### -#############信号引脚定义############## -####################################### + + GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) +#底盘连接 def is_raspberry_pi5(): with open('/proc/cpuinfo', 'r') as file: for line in file: @@ -17,75 +17,13 @@ def is_raspberry_pi5(): else: return False +#云台连接 + base = BaseController('/dev/ttyAMA0', 115200) class CAR: - def __init__(self): - self.LED0 = 10 #LED0的IO口定义 - self.LED1 = 9 #LED1的IO口定义 - self.LED2 = 25 #LED2的IO口定义 - self.ENA = 13 #//L298 使能A - self.ENB = 20 #//L298 使能B - self.IN1 = 19 #//电机接口1 - self.IN2 = 16 #//电机接口2 - self.IN3 = 21 #//电机接口3 - self.IN4 = 26 #//电机接口4 - GPIO.setup(self.LED0, GPIO.OUT, initial=GPIO.HIGH) ##led0初始化为高电平 - GPIO.setup(self.LED1, GPIO.OUT, initial=GPIO.HIGH) ##led1初始化为高电平 - GPIO.setup(self.LED2, GPIO.OUT, initial=GPIO.HIGH) ##led2初始化为高电平 - GPIO.setup(self.ENA, GPIO.OUT, initial=GPIO.LOW) ##ENA初始化为低电平 - GPIO.setup(self.ENB, GPIO.OUT, initial=GPIO.LOW) ##ENB初始化为低电平 - GPIO.setup(self.IN1, GPIO.OUT, initial=GPIO.LOW) ##IN1初始化为低电平 - GPIO.setup(self.IN2, GPIO.OUT, initial=GPIO.LOW) ##IN2初始化为低电平 - GPIO.setup(self.IN3, GPIO.OUT, initial=GPIO.LOW) ##IN3初始化为低电平 - GPIO.setup(self.IN4, GPIO.OUT, initial=GPIO.LOW) ##IN4初始化为低电平 - - def led(self): - GPIO.output(self.LED0,False) - GPIO.output(self.LED1,False) - GPIO.output(self.LED2,False)###LED0,LED1,LED2 = 亮 亮 亮 - time.sleep(0.5) - GPIO.output(self.LED0,True) - GPIO.output(self.LED1,False) - GPIO.output(self.LED2,False)###LED0,LED1,LED2 = 灭 亮 亮 - time.sleep(0.5) - GPIO.output(self.LED0,False) - GPIO.output(self.LED1,True) - GPIO.output(self.LED2,False)###LED0,LED1,LED2 = 亮 灭 亮 - time.sleep(0.5) - GPIO.output(self.LED0,False) - GPIO.output(self.LED1,False) - GPIO.output(self.LED2,True)###LED0,LED1,LED2 = 亮 亮 灭 - time.sleep(0.5) - GPIO.output(self.LED0,False) - GPIO.output(self.LED1,False) - GPIO.output(self.LED2,False)###LED0,LED1,LED2 = 亮 亮 亮 - time.sleep(0.5) - GPIO.output(self.LED0,True) - GPIO.output(self.LED1,True) - GPIO.output(self.LED2,True)###LED0,LED1,LED2 = 灭 灭 灭 - time.sleep(0.5) - print("run: led") - - def led_light(self): - GPIO.output(self.LED0,False) - GPIO.output(self.LED1,False) - GPIO.output(self.LED2,False)###LED0,LED1,LED2 = 亮 亮 亮 - print("run: led_light") - - def led_dark(self): - GPIO.output(self.LED0,True) - GPIO.output(self.LED1,True) - GPIO.output(self.LED2,True)###LED0,LED1,LED2 = 灭 灭 灭 - print("run: led_dark") - def stop(self): # 停止运行 - GPIO.output(self.ENA,False) - GPIO.output(self.ENB,False) - GPIO.output(self.IN1,False) - GPIO.output(self.IN2,False) - GPIO.output(self.IN3,False) - GPIO.output(self.IN4,False) + base.send_command({"T":1,"L":0,"R":0}) print("run: stop move") def Q(self): # 停止的快捷键 @@ -95,7 +33,7 @@ class CAR: def forward(self): # 前进 base.send_command({"T":1,"L":0.2,"R":0.2}) - time.sleep(2) + time.sleep(1) base.send_command({"T":1,"L":0,"R":0}) print("run: move !!!!forward") @@ -105,12 +43,9 @@ class CAR: self.forward() def back(self): # 后退 - GPIO.output(self.ENA,True) - GPIO.output(self.ENB,True) - GPIO.output(self.IN1,True) - GPIO.output(self.IN2,False) - GPIO.output(self.IN3,True) - GPIO.output(self.IN4,False) + base.send_command({"T":1,"L":-0.2,"R":-0.2}) + time.sleep(1) + base.send_command({"T":1,"L":0,"R":0}) print("run: move back") def S(self): # 后退的快捷键 @@ -119,12 +54,9 @@ class CAR: self.back() def left(self): # 左转 - GPIO.output(self.ENA,True) - GPIO.output(self.ENB,True) - GPIO.output(self.IN1,False) - GPIO.output(self.IN2,True) - GPIO.output(self.IN3,True) - GPIO.output(self.IN4,False) + base.send_command({"T":1,"L":-0.2,"R":0.2}) + time.sleep(0.5) + base.send_command({"T":1,"L":0,"R":0}) print("run: move left") def A(self): # 左转的快捷键 @@ -133,12 +65,9 @@ class CAR: self.left() def right(self): # 右转 - GPIO.output(self.ENA,True) - GPIO.output(self.ENB,True) - GPIO.output(self.IN1,True) - GPIO.output(self.IN2,False) - GPIO.output(self.IN3,False) - GPIO.output(self.IN4,True) + base.send_command({"T":1,"L":0.2,"R":-0.2}) + time.sleep(0.5) + base.send_command({"T":1,"L":0,"R":0}) print("run: move right") def D(self): # 右转的快捷键 diff --git a/carsrun/templates/index-t.html b/carsrun/templates/index-t.html index b0afa2a..e5626d8 100644 --- a/carsrun/templates/index-t.html +++ b/carsrun/templates/index-t.html @@ -22,6 +22,7 @@ +
实时视频流

小车控制界面

@@ -29,19 +30,21 @@
- +
-
+
- + - + + + +
-
- +
@@ -75,8 +78,13 @@ @@ -168,9 +185,106 @@ }, error : function() { + } + }); + } function up() { + // console.log("132465789891651354684"); + $.ajax({ + + type: "GET", + dataType: "json", + url: "/control/up" , + data: $('#form1').serialize(), //提交的数据 + success: function (result) { + console.log(result); //打印服务端返回的数据(调试用) + if (result.resultCode == 200) { + } + ; + }, + error : function() { + + } + }); + } function yunleft() { + // console.log("132465789891651354684"); + $.ajax({ + + type: "GET", + dataType: "json", + url: "/control/yunleft" , + data: $('#form1').serialize(), //提交的数据 + success: function (result) { + console.log(result); //打印服务端返回的数据(调试用) + if (result.resultCode == 200) { + } + ; + }, + error : function() { + + } + }); + + } + function yunright() { + // console.log("132465789891651354684"); + $.ajax({ + + type: "GET", + dataType: "json", + url: "/control/yunright" , + data: $('#form1').serialize(), //提交的数据 + success: function (result) { + console.log(result); //打印服务端返回的数据(调试用) + if (result.resultCode == 200) { + } + ; + }, + error : function() { + + } + }); + + } + function down() { + // console.log("132465789891651354684"); + $.ajax({ + + type: "GET", + dataType: "json", + url: "/control/down" , + data: $('#form1').serialize(), //提交的数据 + success: function (result) { + console.log(result); //打印服务端返回的数据(调试用) + if (result.resultCode == 200) { + } + ; + }, + error : function() { + + } + }); + + } + function guiwei() { + // console.log("132465789891651354684"); + $.ajax({ + + type: "GET", + dataType: "json", + url: "/control/guiwei" , + data: $('#form1').serialize(), //提交的数据 + success: function (result) { + console.log(result); //打印服务端返回的数据(调试用) + if (result.resultCode == 200) { + } + ; + }, + error : function() { + } }); } +