1、简单易用,可快速上手
2、流畅支持300个器件或1000个焊盘以下的设计规模
3、支持简单的电路仿真
4、面向学生、老师、创客
1、全新的交互和界面
2、流畅支持超过3w器件或10w焊盘的设计规模,支持面板和外壳设计
3、更严谨的设计约束,更规范的流程
4、面向企业、更专业的用户
开源协议,项目属性
本项目为首次公开,为本人原创项目。只开源在OSHWHUB.COM,项目未曾在别的比赛中获奖。
项目进度
23年7尾月竞标拿下这任务,这是最初的想法,想把树莓派游戏机也做进来,然后画板投板。
8月中板子SMT回来,开始调试硬件,补焊直插件,蛮快的。
嘉立创EDA,SMT现在越用越来顺手,公司的板子也画了好几款,新换的电脑都懒得装AD了。
9月初因为树莓派ZERO播放音频卡,跑python openCV 内存CPU占满,而e络盟一年前付款的ZERO 2W左等右等又被推迟了。
只能淘宝上重新买一块,哎,当时树莓价格还没有回落。学习的成本高啊。
11月1日0点,用openCV特征匹配进行拼接,策略是当某张图特征匹配失败时则用自己的算法拼接,两者结合提高了拼接质量、识别准确率
12月11日,上面特征匹配最终因为功底不够,转换速度奇慢,就算用PC端做运算也比树懒慢。
终于有了进展,之前的识别率一直上不去,甚至连图片拼接都有一半以上失败
新方案,抛弃编码轮,抛弃间隔抓图,改成128帧录像的方式,
把视频传送到PC端,再从视频中拆解图片,拼接图片,
提交给百度API进行图片OCR。最后把文字,及翻译结果返回到扫描笔。
接下来不断优化测试再优化。
春节放假也耗在扫描笔上了,经过了这半年时间,倒是让我这硬件工程师更加熟练python了,都玩上图片识别了。
元宵节继续整合,整理代码,开始编辑文档,也感谢阿创的通融给我延期。
2月29日0点看了又看,改了又改,终于编辑完文档了。夜猫烟鬼叩求大家多多多包含,点赞。
设计原理
1.硬件部分
1.1电源部分 USB TYPE-C接口输入,IP5306做电池充电,升压成5V供给整机
1.2树莓派zero 2w 外接,
1.2.1 USB2.0 Hub 控制芯片FE1.1s,扩展三路USB接口,
挂接USB声卡用于录音,外放
挂接摄像头在OCR扫描的时候录像保存成avi文件
外置USB口(可接U盘,SD读卡器,键盘鼠标等)
1.2.2 I2C总线接磁编码传感器MT6701,用于检测滑动距离,这个删除了,
1.2.3 SPI总线接 ST7789驱动的LCD
1.2.4 GPIO接了6个按键,LCD背光控制
1.2.5 部分关键硬件,
除了下面这几个在某宝搜图买,其余的零件都是JLC贴,或者立创商城买的
摄像头 GC0380 30W 黑白 128帧 镜头选80度的
2.4寸LCD显示屏 240x320高清IPS显示屏ST7789
3.7V锂电池,603450-1200毫安[带板带端子]
ZERO 2W主板
先在SD卡上新键wifi.conf文件,写入(字符不用引号)
SSID=你的WIFISSDI
Password=你的密码
SD插入读卡器
插到扫描笔USB2.0外扩接口
if keyVal[0] == 1: # 在树莓派启动程序后,判断按下左键则调用
def checkMedia()
读取SD读卡器中的wifi.conf文件
去更新/etc/wpa_supplicant/wpa_supplicant.conf # 注意权限问题
树莓派 VNC Viewer 远程桌面配置教程 | 树莓派实验室 (nxez.com)
https://shumeipai.nxez.com/2018/08/31/raspberry-pi-vnc-viewer-configuration-tutorial.html
使用VNC,
FinalShell工具
Windows X64版,下载地址:
http://www.hostbuf.com/downloads/finalshell_windows_x64.exe
使用方法
https://blog.csdn.net/muriyue6/article/details/117520456 # 详细的使用方法参考
名称: 自定义
主机: 填写你树莓排的IP,可以到路由器里查看
端口: 默认22就可以了,无需修改
备注: 自定义
方法: 密码
用户名:默认账户pi和默认密码raspberry
密码: 填写服务器的登录密码
因为OCR扫描,视频转成文字是在PC自建的服务器上转换,利用zerotier做内网穿透,(我有外网IP服务器也可以不用内网穿透)
我在树莓派,以及自己的PC电脑都添加了zerotier穿透
树莓派安装软件
在树莓派上开一个命令窗口,运行下述命令:
curl -s https://install.zerotier.com | sudo bash
添加网络
下载安装完成后,通过下边连接服务器,将“#”换成Network ID:
sudo zerotier-cli join ################
sudo zerotier-cli join 1c33c1ced########5
通过下边这个命令可以查看连接网络:
sudo zerotier-cli listnetworks
配置自启动
sudo systemctl start zerotier-one
#启动
sudo systemctl stop zerotier-one
#停止
systemctl enable zerotier-one
#打开开机自启
systemctl disable zerotier-one
#关闭开机自启
https://blog.csdn.net/Bing_Lee/article/details/107171675 # 这里面讲得详细点
https://zhuanlan.zhihu.com/p/488143997 # 换源方法,我也是从这学的,里面讲得详细点
pip install smbus2 # IIC库,最新程序用不到
pip install spidev # SPI总线驱动LCD
pip install numpy # 功能需求搬迁到PC端了
pip install requests # 百度API中用到
pip install json # 百度API中用到
pip install socket #
pip install logging # 日志
pip3 install python-vlc # 播放WAV音频
pip install alsaaudio # 播放WAV音频
pip install wave # 播放WAV音频
pip install pyaudio # 播放WAV音频
pip install pygame #播放WAV音频
安装cv2库的时候蛮折腾的,不过现在把拆图识图拼图放到了PC端,PC端相对好安装点, PC端直接CMD里
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
成功将树莓派切换到清华大学镜像站后,安装openCV变得十分简单。
在命令行窗口输入一句指令即可从清华大学镜像站安装openCV到树莓派上:
sudo apt-get install python3-opencv
先下载.whl文件
opencv_python-4.5.5.62-cp39-cp39-linux_armv7l.whl
numpy-1.22.3-cp39-cp39-linux_armv7l.whl
pip3 install XXX.whl
安装依赖库
sudo apt-get update #安装依赖库
sudo apt-get install libhdf5-dev
sudo apt-get install libatlas-base-dev
sudo apt-get install libjasper-dev
sudo apt-get install libqt4-test
sudo apt-get install libqtgui4
https://cloud.baidu.com/?from=console
https://blog.csdn.net/qq_38113006/article/details/105742296
TOKEN = '24.d2ebdc4ac09d*****************92000.1704816738.282335-36477719' # 存到常量constant.py
def ocr(path):
"""
向百度提交图片,返回文字
:param path: 图片
:return: OCR识别的文字
"""
--------------------------------------------------------------------------------------
def tts(text):
"""
TTS转换,百度API转换效果很好,声音好听,读音准确
:param text: 文字
:return: wav(单声道,16000采样率)
"""
--------------------------------------------------------------------------------------
def vop(path):
"""
SST转换,上传WAV文件把语音转成文字
:param path: wav文件路径,单声道,16000采样率
:return: 文字
"""
--------------------------------------------------------------------------------------
def fanyi(query, from_lang, to_lang):
"""
翻译
:param query: 原文
:param from_lang: 'en'
:param to_lang: 'zh'
:return: 翻译结果
"""
--------------------------------------------------------------------------------------
2.6.2 讯飞星火GPT
星火认知大模型Web API文档
https://www.xfyun.cn/doc/spark/Web.html#_1-%E6%8E%A5%E5%8F%A3%E8%AF%B4%E6%98%8E
--------------------------------------------------------------------------------------
定义全局变量 global text # 用来接收GPT返回的答复
def getGpt(_input): # 把问题提交给讯飞星火GPT
"""
把问题写入_input, 讯飞星火GPT返回答复
:param _input: 提出问题
:return: 返回答复
"""
SparkApi.main(id,key,,,_input) # 在SparkApi.py中
getText() # 更新答复到 global text
方法是修改 .bashrc 文件。
sudo nano /home/fengyifan/.bashrc
在 /home/pi/.bashrc 文件的末尾添加启动命令文本。
echo Running at boot
sudo python /home/pi/sample.py # 这里改成自己的.py文件路径
上面的 echo 命令用于显示 .bashrc 文件中的脚本已经开始运行。
Python Flask Web
Flask 是一个轻量级的基于 Python 的 Web 框架
sudo pip3 install Flask
--------------------------------------------------------------------------------------
@app.route('/api/get')
def api_get():
"""
实现HPPT中的GET应答
在浏览器中输入 http://192.168.192.168:5555/api/get?data={"user":"admin","pwd":"123456","id":"A7890"} 可返回OCR拼图,识别状态
http://192.168.192.168:5555/api/get?data={"user":"admin","pwd":"123456","type":"GPT","id":"A7890"}
:return: jsonify(reply) # 返回JSON数据{"mes":"请求的数据,转换状态"}
"""
if g_ocr_sta == 5: # 5代表转换并识别完成
reply['sta'] = "ok"
reply['mes'] = g_ocr_txt
else:
reply['sta'] = str(g_ocr_sta) # "ok"
reply['mes'] = "转换中,请等待"
--------------------------------------------------------------------------------------
@app.route('/receive-jpg', methods=['POST'])
def receive_file():
"""
实现HPPT中的POST,接受AVI视频的上传文件
获取文件名称及后缀名
:return:
"""
video_to_frames(avi_path + '/' + 'output.avi') # 把视频逐帧拆解成JPG图片
立标志 g_ocr_t = 1 # 然后t1 = threading.Thread(target=myMain) 线程中查询到标记则开始把JPG图片拼接起来.....
--------------------------------------------------------------------------------------
t1 线程中上循环大法while True:
if g_ocr_t == 1:
myF.rotateJPG(img_src, img_rot) # 旋转图片
myF.cutImg(img_rot, img_cut) # 裁剪图片 (沿着挂在中轴线上的字符,文字最外框 裁剪)
lis = myF.imgsToList(img_cut) # 图片集转拼接list,list里保存的是帧与帧之间的像素位移,位移计算请看下一段
myF.collage_img(lis, img_cut) # 拼接图像保存到img
txt = baidu.ocr(img) # 把imgt图片提交给 百度OCR识别
baidu.fanyi(txt, from_lang, to_lang) # 百度翻译
g_ocr_sta = 5
# 完成标记
--------------------------------------------------------------------------------------
def myF.imgsToList(img_cut):
"""
核心就是轮廓识别,比对前后两帧图的像素位移,然后拼图。
下面讲讲怎么识图,计算出前后两帧图片的像素位移
"""
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转灰度
binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU) # 二值化,在这选cv2.THRESH_OTSU=自动阈值
contours, h = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 检测轮廓 RETR_EXTERNAL=只检测最外层轮廓for contour in contours: # 遍历轮廓
去除小面积的轮廓
判断字符、文字是否在中轴线上,只关心落在中轴线上的文字,字符
画轮廓,画中心点
——————————————————————————————————————
好了经过上面的处理,有了有效的字符坐标
看下图,X的0点在左边,
图片的位移 _ind = A图第一个框X0(字母T) 减 B图第一个框X0(字母T)
在图片C中,绿框触0边了,过滤掉左边的第一个框(C图字母T),那么C图字母e就变成了第一个框
套用上面公式的话 _ind = B图字母T 减 C图字母e,会出现负位移, 判断出现负值则改用用B图第二个框(B图字母e) 减 去 C图字母e
_ind = A图第一个框X0(字母T) 减 B图第一个框X0(字母T)
if _ind < 0: # 负位移
# 改成用B图第二个框(B图字母e) 减 去 C图字母e
_ind = B图字母e 减 C图字母e
拼接效果,放大看,可以看到纵向的条纹,这就是帧与帧像素位移拼接的痕迹
ls -l /dev/video*
--------------------------------------------------------------------------------------
在立创面板,选亚克力
1. 实物照片:初代作品,不够精致,希望后面我做二版时,能做得漂亮点,更完善一点,也把树莓派游戏机实现。
2.单词OCR扫描识别演示视频在附件中 # WeChat_20240228225520.mp4
(真实一镜过无修剪,转换过程确实比商用的慢很多,请大家见谅,也请大虾勿喷,或者帮提出优化的思路,我改进)
3.下图也算实物展示一部分吧,此图片是在比较理想状态下,匀速移动扫描,等待漫长的转换返回的结果。
4.中文扫描演示视频在附件中 # WeChat_20240229001727.mp4
5.语音交互(GPT接入的是讯飞星火)演示视频在附件中 # WeChat_20240228234526.mp4
复刻注意:
0>扫描的时候,请拿把厚点的尺子做靠山,可以让扫描笔移动得笔直一些,还有按R键后请等待半秒再移动扫描笔,谢谢
1>按键正确的型号是 编号:C318884 再加个7*3.5mm按键帽
2>去除编码器小板
3>树莓派USB D+ D- 的与底板之间的顶针对偏了
要改善的地方:
4>增加单键开关机电路,比IP5603关断得彻底一点,断电待机更久, 还有就是电池检测
5>声音喇叭选大一点,壳也大一点,现在的声音差强人意
附件文件说明:
PC端PY工程.part1.rar 拆解成part1,part2,part3,三个压缩包<50M, 密码是:oshwhub.com 密码是:oshwhub.com
真不是我想加密码,我试过改文件名,改压缩方式,试了N遍都是上传失败,估计触发了敏感词语了,加了密码才能上传成功。
树莓派程序工程New0911,解压后请放在/home/pi/Desktop/New0911路径
加载中...
是否需要添加此工程到专辑?