- 2025-02-22
-
回复了主题帖:
掀桌子了,已提离职。最近求职行情咋样
说不好找的是没什么本事和技术在身的大学生,1100w的“闲杂人员”
技术过硬的话其实猎头都抢着要,就是薪资待遇好坏的问题了
- 2025-02-21
-
回复了主题帖:
【Raspberry Pi 5测评】6.WS2812点灯
freebsder 发表于 2025-2-20 19:17
点灯没有动图就完全不够炫酷了。
加班要累死了,周末统一补上
- 2025-02-20
-
发表了主题帖:
【STM32H7S78-DK测评】4.调节二级页面
本帖最后由 电子烂人 于 2025-2-20 14:15 编辑
1.前言:
之前的帖子成功实现了主菜单转轮效果(【STM32H7S78-DK测评】3.转轮动效菜单的实现 - stm32/stm8 - 电子工程世界-论坛 (eeworld.com.cn))不过当时只做了只有一个按键,跳转的页面也是固定的。并且由于按键的选区有部分位于转轮的控件区域,偶尔会有无法拖动的情况。
如果要实行跳转的话,官方的办法是在来的基础上加入一个过度页面,这样做更麻烦了。
这篇帖子试一下不同二级页面的设置,并优化一下转轮的“死区”。
2.设计思路:
由于转轮特效只提供基础的选择功能,并在转轮停止后返回一个当前选中的值,如果要加入按键的话,单个按键只能对应一个页面跳转功能。
初始的想法是让按键跳转页面,根据滑动的转轮控件,选择所要跳转的页面。但是
3.页面设置:
在原来的工程的基础上,加入6个二级页面
这六个页面分别对应转盘上的六个选项,再把每个页面保留一个返回键这样页面的返回跳转就做好了。
为了让主页面能精准的跳转到二级页面,在转轮右侧原先按键的位置,放着6个重叠的按键,并设置为隐藏:
分别命名好各种功能,并每一个绑定跳转不同的页面。
在代码中修改,让转轮调用到一个的时候,右侧按键使能并显示当前选中的,其他的被不使能:
void mainMenuView::scrollWheel1_ItemSelectedHandler(int16_t itemSelected)
{
presenter->menuSelected(itemSelected);
switch (itemSelected)
{
case 0://Monitor
buttonEnterMonitor.setVisible(true);
buttonEnterMonitor.invalidate();
buttonEnterTemp.setVisible(false);
buttonEnterTemp.invalidate();
buttonEnterAD.setVisible(false);
buttonEnterAD.invalidate();
buttonEnterDetails.setVisible(false);
buttonEnterDetails.invalidate();
buttonEnterMesh.setVisible(false);
buttonEnterMesh.invalidate();
buttonEnterInfo.setVisible(false);
buttonEnterInfo.invalidate();
break;
case 1://Temp
buttonEnterMonitor.setVisible(false);
buttonEnterMonitor.invalidate();
buttonEnterTemp.setVisible(true);
buttonEnterTemp.invalidate();
buttonEnterAD.setVisible(false);
buttonEnterAD.invalidate();
buttonEnterDetails.setVisible(false);
buttonEnterDetails.invalidate();
buttonEnterMesh.setVisible(false);
buttonEnterMesh.invalidate();
buttonEnterInfo.setVisible(false);
buttonEnterInfo.invalidate();
break;
case 2://AD
buttonEnterMonitor.setVisible(false);
buttonEnterMonitor.invalidate();
buttonEnterTemp.setVisible(false);
buttonEnterTemp.invalidate();
buttonEnterAD.setVisible(true);
buttonEnterAD.invalidate();
buttonEnterDetails.setVisible(false);
buttonEnterDetails.invalidate();
buttonEnterMesh.setVisible(false);
buttonEnterMesh.invalidate();
buttonEnterInfo.setVisible(false);
buttonEnterInfo.invalidate();
break;
case 3://Details
buttonEnterMonitor.setVisible(false);
buttonEnterMonitor.invalidate();
buttonEnterTemp.setVisible(false);
buttonEnterTemp.invalidate();
buttonEnterAD.setVisible(false);
buttonEnterAD.invalidate();
buttonEnterDetails.setVisible(true);
buttonEnterDetails.invalidate();
buttonEnterMesh.setVisible(false);
buttonEnterMesh.invalidate();
buttonEnterInfo.setVisible(false);
buttonEnterInfo.invalidate();
break;
case 4://Mesh
buttonEnterMonitor.setVisible(false);
buttonEnterMonitor.invalidate();
buttonEnterTemp.setVisible(false);
buttonEnterTemp.invalidate();
buttonEnterAD.setVisible(false);
buttonEnterAD.invalidate();
buttonEnterDetails.setVisible(false);
buttonEnterDetails.invalidate();
buttonEnterMesh.setVisible(true);
buttonEnterMesh.invalidate();
buttonEnterInfo.setVisible(false);
buttonEnterInfo.invalidate();
break;
case 5://Info
buttonEnterMonitor.setVisible(false);
buttonEnterMonitor.invalidate();
buttonEnterTemp.setVisible(false);
buttonEnterTemp.invalidate();
buttonEnterAD.setVisible(false);
buttonEnterAD.invalidate();
buttonEnterDetails.setVisible(false);
buttonEnterDetails.invalidate();
buttonEnterMesh.setVisible(false);
buttonEnterMesh.invalidate();
buttonEnterInfo.setVisible(true);
buttonEnterInfo.invalidate();
break;
default:
break;
}
}
即可完成二级页面的跳转切换功能。
-
回复了主题帖:
【过年都玩啥】话说探友们过年都玩啥了呢?
腊月25-27:姨家蹭吃喝
腊月28:回家,玩手机
除夕:回老家吃个饭,晚上看会春晚、拜年祭
初一:被催相亲
初二:被催相亲
初三:跟家里吵架,回出租屋
初四:网吧
初五:网吧
初六:网吧
初七:网吧
初八:上班
突然明白了,年轻人成家立业之前别回家,不然是数不完的鸡毛蒜皮
- 2025-02-19
-
发表了主题帖:
【Raspberry Pi 5测评】4.简单的手势识别
本帖最后由 电子烂人 于 2025-2-19 10:48 编辑
0.前言
简单的监视器功能没有问题了,我们再来试试做简单的识别部分。
大学里OPENCV的两个最基本的项目,就是光流和手势识别,光流法类似鼠标,不多讲,手势识别更直观一些
这里主要用到的就是 Mediapipe库,谷歌的框架
1.Mediapipe简单介绍
MediaPipe 是由 Google 开发的一个强大的开源框架,专注于实时流式数据处理,特别适用于计算机视觉任务。
而对应的手势是最简单的一部分,使用预训练好的卷积神经网络模型来定位手掌区域,并提取出手部的关键点坐标信息,识别出21个类似的点位,并基于获取到的2D/3D关键点位置,计算几何参数(如角度、距离等),形成可用于分类器输入的空间向量表示。
2.环境配置
原先装好了OPENCV并预装了python,由于环境会有兼容问题,为了避免包之间的任何冲突建议在虚拟环境下操作
sudo apt install python3-venv
记得安装好依赖文件
sudo apt-get install python3-dev python3-numpy libavcodec-dev libavformat-dev libswscale-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
pip install opencv-contrib-python
安装库文件
(PS:部分教程要求使用树莓派专用的mediapipe-rpi4,但是这个库是给RPI4用的,兼容ARM v8架构,而RPI5是ARM v 76架构,可能会出问题,所以这里直接安装原版即可)
pip install mediapipe
如果安装过程出现问题的话可以参考:pip(3) install,完美解决 externally-managed-environment_pip3 install error: externally-managed-environment-CSDN博客
这里我是用PY虚拟环境,所以没有遇到,直接安装成功。
3.代码展示
新建文件hand_detection.py
import cv2
import mediapipe as mp
# 初始化Mediapipe手部模型
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(
static_image_mode=False,
max_num_hands=2, # 最多检测2只手
min_detection_confidence=0.5, # 检测置信度阈值
min_tracking_confidence=0.5 # 跟踪置信度阈值
)
mp_drawing = mp.solutions.drawing_utils
# 打开摄像头(树莓派专用摄像头用0或指定路径)
cap = cv2.VideoCapture(0)
while cap.isOpened():
success, image = cap.read()
if not success:
print("摄像头读取失败")
break
# 转换为RGB格式(Mediapipe要求)
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = hands.process(image_rgb)
if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
mp_drawing.draw_landmarks(
image,
hand_landmarks,
mp_hands.HAND_CONNECTIONS,
landmark_drawing_spec=mp_drawing.DrawingSpec(color=(0,255,0), thickness=2),
connection_drawing_spec=mp_drawing.DrawingSpec(color=(255,0,0), thickness=2)
cv2.imshow('Hand Detection', cv2.flip(image, 1)) # 镜像翻转
if cv2.waitKey(1) & 0xFF == 27:
break
cap.release()
cv2.destroyAllWindows()
运行hand_detection.py即可
python3 hand_detection.py
- 2025-02-15
-
发表了主题帖:
【Raspberry Pi 5测评】3.硬件产生PWM
本帖最后由 电子烂人 于 2025-2-15 10:36 编辑
0.前言
前面把摄像头成功驱动好了。摄像头有了,还需要一个可动的云台来调整方向,才能是一个完整的监视器;
这一期来尝试用硬件PWM驱动舵机。
1.PWM实现原理
树莓派硬件PWM基于专用时钟电路生成精确脉冲信号
硬件PWM的接口很少,只有两个PWM通道:
PWM0:GPIO12(通道0)或 GPIO18(通道0复用)
PWM1:GPIO13(通道1)或 GPIO19(通道1复用)
注意事项:
硬件PWM需root权限操作
软件PWM频率超过1kHz时可能出现抖动
多核负载下建议使用硬件PWM保证时序精度
驱动感性负载时应添加保护电路
应用场景对比:
类型
精度
频率范围
CPU占用
适用场景
硬件PWM
±5ns
0-12.5MHz
<1%
伺服控制/精密调速
软件PWM
±50μs
1Hz-1kHz
10-30%
LED调光/简单控制
故这里先演示一下硬件PWM,之后也会贴出软件PWM的代码。
2.硬件PWM配置
以配置GPIO12为例,检查下/boot/config.txt这个文件里有没有GPIO12的配置:
# 编辑/boot/config.txt 添加
dtoverlay=pwm-2chan,pin=12,func=4,pin2=13,func2=4
舵机需要的PWM波形比较特殊,在舵机控制中的 PWM 信号的周期=20ms,脉宽(高电平宽度)范围=0.5ms~2.5ms。
以180°的舵机为例,不同占空比的波形控制的角度不同,比如:
0.5ms————0°
1.0ms————45°
1.5ms————90°
2.0ms————135°
2.5ms————180°(有死区无法完全伸展)
图源:网络
典型参数设置流程:
import pigpio
pi = pigpio.pi()
if not pi.connected:
exit()
pi.set_PWM_frequency(12, 50)
pi.set_PWM_range(12, 200)
pi.set_PWM_dutycycle(12, 95) # 1.5ms的脉冲宽度
try:
while True:
pass
except KeyboardInterrupt:
pi.stop()
当硬件资源不足时,可使用RPi.GPIO库的软件实现。软件PWM的代码也贴出,不过推荐在控制舵机的时候还是使用硬件PWM更精准。
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
pwm = GPIO.PWM(17, 50) # 50Hz
pwm.start(25) # 25%占空比
晚点把演示的视频贴上来
- 2025-02-14
-
回复了主题帖:
你参加哪吒2的百亿项目了吗?
没看,今年电影票实在太贵了,更重要的是找不到人看
- 2025-02-09
-
回复了主题帖:
【NUCLEO H533RE测评】通过按键实现键盘单键功能
这样再做一个按键,就可以做成CTRL+CV键盘了,很实用啊
-
发表了主题帖:
【Raspberry Pi 5测评】6.WS2812点灯
本帖最后由 电子烂人 于 2025-2-19 10:09 编辑
0.前言
正月十五到,顺便用树莓派点个花灯试试
1.WS2812简介
WS2812是一款集成了LED驱动器和数字控制器的RGB LED灯珠。它支持通过单线数字信号控制每个LED的颜色和亮度,具有低功耗、高亮度和可编程性的特点。广泛应用于LED灯带、智能照明和动态显示等领域。
多个灯珠串联起来,通过 单线归零码(NZR) 发送数据,每个灯珠接收 24位数据(8位绿 + 8位红 + 8位蓝)。每个灯珠读取自身数据后,将剩余数据转发给下一个灯珠(类似接力)。
2.驱动灯板
我买的是这种小型的灯板,单个灯板上有12个灯珠
3.配置库文件
添加依赖:
git clone https://github.com/jgarff/rpi_ws281x.git
cd rpi_ws281x
mkdir build
cd build
cmake -D BUILD_SHARED=ON -D BUILD_TEST=OFF ..
make
sudo make install
编译WS2812库
git clone https://github.com/jgarff/rpi_ws281x.git
cd rpi_ws281x
mkdir build
cd build
cmake -D BUILD_SHARED=ON -D BUILD_TEST=OFF ..
make
sudo make install
由于要用PWM18,所以要禁用一下音频,
/boot/config.txt 添加以下内容(禁用音频以释放 PWM 通道):
dtparam=audio=off
dtoverlay=spi0-1cs
新建文件led_control.py:
import time
from rpi_ws281x import PixelStrip, Color
# LED 配置
LED_COUNT = 30 # LED数量
LED_PIN = 18 # GPIO 18 (PWM0)
LED_FREQ_HZ = 800000 # 信号频率
LED_DMA = 10 # DMA通道
LED_BRIGHTNESS = 30 # 初始亮度 (0-255)
LED_INVERT = False # 反转信号
LED_CHANNEL = 0 # PWM通道 (0或1)
# 初始化灯带
strip = PixelStrip(
LED_COUNT,
LED_PIN,
LED_FREQ_HZ,
LED_DMA,
LED_INVERT,
LED_BRIGHTNESS,
LED_CHANNEL
)
strip.begin()
def color_all(color):
"""设置所有LED为同一颜色"""
for i in range(strip.numPixels()):
strip.setPixelColor(i, color)
strip.show()
try:
print("按 Ctrl+C 退出")
while True:
# 红色 (注意WS2812使用GRB格式)
color_all(Color(255, 0, 0))
time.sleep(1)
# 绿色
color_all(Color(0, 255, 0))
time.sleep(1)
# 蓝色
color_all(Color(0, 0, 255))
time.sleep(1)
except KeyboardInterrupt:
# 清理并关闭灯带
color_all(Color(0, 0, 0))
print("程序已终止")
-
回复了主题帖:
【deepseek】01预热贴:gpt回帖,得积分小礼
我好像用了假的DEEPSEEK
- 2025-02-08
-
发表了主题帖:
【Raspberry Pi 5测评】2.配置板载摄像头
本帖最后由 电子烂人 于 2025-2-17 10:42 编辑
0.前言
摄像头部分其实是可以直接用免驱的v4l2的,但是由于之前立过了要用CSI摄像头的FLAG,所以要敢于尝试。
V4L2的摄像头和CSI摄像头本质上没有区别,主要在于驱动和接口部分不一样。只需要修改接口对应的驱动即可。
1.硬件细节
把摄像头和排线连接好,再插入PI5的任意一个CSI接口即可。
要注意的是,3、4代树莓派的摄像头接口线是不一样的,PI5的CSI接口是类似PI ZERO 那种间距更细、更小巧的口,购买时候注意买一根FPC转接线。
另外这个转接线不推荐买下图这种的,两边的PI加强部分太硬中间线路太软,很容易弯折导致FPC撕开,可以的话买一根更好的FPC线。
2.驱动修改
摄像头驱动的修改可以简化一下,用raspi-config来直接配置
由于UBT里面没有raspi-config这个工具,我们需要先下载安装好。
下载raspi-config的DEB包:
wget http://mirrors.ustc.edu.cn/archive.raspberrypi.org/debian/pool/main/r/raspi-config/raspi-config_20201108_all.deb
安装依赖:
sudo apt install lua5.1 libatopology2 libfftw3-single3 libsamplerate0 alsa-utils
安装deb包
sudo dpkg -i raspi-config_20201108_all.deb
打开软件:
sudo raspi-config
在图形化界面里,选择INTERFACE选项
再选择CAMERA选项
如果出现我这种提示UPDATE的,需要退出更新后重进。
这样摄像头的驱动就好了,用代码试下能不能实时返回图像
老样子,新建一个.py文件:
import cv2
#这里如果CV2报错就是没有正常安装opencv
cap=cv2.VideoCapture(0)#选择USB摄像头为0,仅运行图像处理要换成路径如"/Desktop/a.jpg"
while(cap .isOpened()):
ret,frame = cap.read()
cv2.imshow("usb camera",frame)
if cv2.waitKey(1) ==32
break
#严格控制各处的缩进,否则会报错
cap.release()
cv2.destroyALLWindows()
#关闭后释放资源,防止卡死
图像正常回传
- 2025-02-05
-
回复了主题帖:
这个春节最火爆的AI大模型deepseek,你玩了吗?
老美发力了,前天还好用今天就卡的不行
-
回复了主题帖:
这个春节最火爆的AI大模型deepseek,你玩了吗?
好用是真的,跟别家的AI对比,有一个深度思考功能,多了很多AI自己思索的流程,能更清楚的知道他是怎么想的
但是感觉联网查找还是不如KIMI,服务器网太卡了
- 2025-01-18
-
回复了主题帖:
H7S-DK使能RTC之后,TOUCHGFX无法正常显示?
lugl4313820 发表于 2025-1-18 12:33
RTC在初始化是要调用获取TICK,来获取系统的滴答时钟,使用了阻塞式的进程,从则引起错误。我记得我在评测文 ...
大概就是RTC在初始化的时候错误使用了计时器,造成FREERTOS的初始化卡死了,万分感谢
-
发表了主题帖:
H7S-DK使能RTC之后,TOUCHGFX无法正常显示?
板卡为H7S78-DK
RTC使能初始化如图:
编译烧录后发现屏幕无法显示,有背光但是无画面。
经DEBUG发现程序移植在RTC里:
想请教下大佬,这个是什么情况,之前做TOUCHGFX没有遇到,是不是H7S的问题?
- 2025-01-17
-
回复了主题帖:
【新年新挑战,任务打卡赢好礼!】第一批获奖名单公布
已确认
- 2025-01-15
-
回复了主题帖:
新年新挑战,任务打卡赢好礼!
完善资料:
回复:
下载: 活动:
学习
-
回复了主题帖:
【Follow me第二季第4期】-任务4:选做任务一(非必做):通过RGB LED不同颜色、亮...
这个滑动平均滤波是选取了多少个数据,会不会对效果有影响?
-
回复了主题帖:
【STM32H7S78-DK测评】3.转轮动效菜单的实现
qzc飘曳 发表于 2025-1-14 22:15
这个生成后能看到才需要的资源是多少吗?
是说占用多少FLASH存储吗?要生成之后编译才能看到
不过我感觉用的不多,图片和视频才是最占存储的,可以看这个TouchGFX_01. 节省Flash存储器内存_哔哩哔哩_bilibili
-
回复了主题帖:
【STM32H7S78-DK测评】2.简单TOUCHGFX点屏
秦天qintian0303 发表于 2025-1-14 21:48
还搞了个阅读权限
不知道怎么设置的,现在应该没有了