openpnp - 自动换刀的设置
文章目录
- openpnp - 自动换刀的设置
- 概述
- 笔记
- 采用的openpnp版本
- 自动换刀库的类型选择
- 自动换刀设置前的注意事项
- 先卸掉吸嘴座上所有的吸嘴
- 删掉所有的吸嘴
- 设置自动换刀的视觉识别
- 设置吸嘴座为自动换刀 - 以N1为例
- 备注
- 补充 - 吸嘴轴差个0.3mm, 就有可能怼坏吸嘴
- END
openpnp - 自动换刀的设置
概述
自动换刀的吸嘴库(openpnp - 吸嘴站(Nozzle Tip Changer)的选择)已经做好了.
试了一下, 自动换刀好使. 记录一下自动换刀的设置.
笔记
采用的openpnp版本
经过权衡(openpnp具体版本是否有不可接受的bug? 哪个版本最稳定可以用于生产?) 最终采用2022/8/1的开发版.
自动换刀库的类型选择
为了安全, 吸嘴库中的吸嘴数量最大化, 我采用了 带抱轴的吸嘴库
现在发现抱手层固定吸嘴轴的效果不是很好, 已经改进了抱手层, 送去打样了, 回来再试试.

自动换刀设置前的注意事项
设置自动换刀前, 要保持用手操作openpnp按钮的清醒思路(做每一步之前, 都要想一下, 这么做是否正确), 万一处于迷茫的状态, 很容易发生打刀或者吸嘴电机或者Z轴电机被怼在机械结构上, 出现事故时, 注意及时按下设备急停按钮来止损.
先卸掉吸嘴座上所有的吸嘴


删掉所有的吸嘴

此时, 吸嘴座上没有吸嘴, openpnp定义中也没有任何吸嘴. 这时, 就可以开始设置自动换刀了.

根据自己自动换刀库的实际情况 在openpnp中添加对应的吸嘴, 和吸嘴站上的吸嘴一一对应.

同一个吸嘴只能分配给N1或者N2, 不能同时分配给N1和N2, 因为每一个吸嘴设置时, 都是由实际的吸嘴座完成的吸取吸嘴并记录坐标完成的. 同一个吸嘴不可能由2个吸嘴座来分别完成吸取, openpnp不支持
对于我自己的吸嘴库, 分为2排, 一边各6个吸嘴. 分别插入的是502~507, 绿色和黑色的juki吸嘴都行.

下面一排给N1用, 上面一排给N2用.
在openpp中添加这12个吸嘴, 分别为NT1_502 ~ NT1_507, NT2_502 ~ NT2_507, 都用默认设置就行, 不用改.



将吸嘴分配给吸嘴座, N1_502 ~ N1_507给N1, N2_502 ~ N2_507给N2.


设备归零!

用手触摸试探吸嘴库中的所有吸嘴, 确认吸嘴都在物理停靠位置.
设置吸嘴的自动换刀坐标, 以N1_502为例.
打开N1_502的设置界面

在JOG面板中, 将顶部相机移动到N1_502的正上方, 将顶部相机十字对准吸嘴轴的中心. 坐标越准确越好(偏差应该在0.1mm之内), 可以将图像放大, 结合标尺的格子微调一下.

捕获吸嘴第一步的位置.

将第一步的相机十字换为吸嘴中心, 这时, 吸嘴座子就在吸嘴正上方.


用JOG面板, 将吸嘴座下落, 将吸嘴座和吸嘴扣合. 具体是否扣合, 可以在做这个实验前, 手工上吸嘴, 看看合理扣合时, 具体是个啥深度, 然后心里做个标记.
我这里, 只要吸嘴座下落到吸嘴上的螺丝孔上缘, 就扣合好了.


用1mm将吸嘴座向下落, 接近扣合位置时, 采用0.1mm往下落, 扣合时, 可以听到扣合的声音(再往下落不到0.5mm, 就扣合到位了). 当听到声音后, 再结合是否和自己先前手工装吸嘴时观察到的扣合位置接近, 作为扣合结束的时机.

我这里, N1的Z轴坐标在-34.7mm处, 基本到达扣合位置.
在第2步, 捕获当前Z坐标.

根据自己吸嘴库的吸嘴可以平移出吸嘴停靠位置到不剐蹭其他物体为准, 用JOG面板将吸嘴平移出来.

在第3步中捕获当前坐标.

在JOG面板中Z轴归零
然后在第4步捕获当前位置.

将取吸嘴动作的速度改为0.1, 这样安全一些.

分别点击吸嘴的回收按钮, 要倒着逐个点击, 是吸嘴从吸嘴座上回到吸嘴库中.
当前, 如果按钮点错了, 直接就撞刀了…

设置自动换刀的视觉识别
这步通过吸嘴物理停靠位置的图像判断, 来判断吸嘴库位置是否有吸嘴, 防止发生事故(只有吸嘴库位置为空, 才允许卸掉吸嘴, 将吸嘴自动插入吸嘴库, 只有吸嘴库不为空, 才允许自动将吸嘴载入到吸嘴座)
将视觉定位由默认的None改为第一步的位置

用第一步位置的按钮, 将相机十字自动对准吸嘴轴中心

当前, 吸嘴在吸嘴库停靠位置, 对有吸嘴的模板进行拍照.

如果拍照的图像没有完全容纳下吸嘴轴, 将模板宽度和高度适当调大, 知道拍照的图像可以容纳下吸嘴轴的完整图像. 然后应用.
然后用手(镊子比较方便)将吸嘴取出来, 使吸嘴停靠位置为空.
当前, 吸嘴库停靠位置为空, 对没有吸嘴的模板进行拍照.

将识别精度改精确一些.

现在测试一下, 是否可以自动判断吸嘴停靠位置为空还是有吸嘴.

可以看出, 判断好使. 提示说, 现在吸嘴座为空, 需要去吸取吸嘴, 但是吸嘴停靠位置为空, 没有吸嘴. 这样就很安全.
将吸嘴用镊子和手, 将吸嘴装入吸嘴库的停靠位置. 然后再测试.

当操作安全时, 没有任何提示, 只是图像在变化(顶部相机在突出显示吸嘴), 这说明, 当前可以操作吸嘴.
此时, 需要重新弄确认一下吸嘴位置是否对?(因为用手取出, 插入了吸嘴), 如果位置不对, 重新确认一下坐标, 否则将吸嘴座子落下时, 会直接将吸嘴砸坏(吸嘴坏了还有, 如果将吸嘴电机或Z电机整坏, 就划不来了).
这时, 就可以看出, 抱手层固定吸嘴轴效果是否好的重要性.
此时, 吸嘴已经回到了吸嘴库中的物理停靠位置. N1_502吸嘴的自动换吸嘴的参数已经设置完成.
同理, 将剩下的11个吸嘴坐标都设置好.
最后吸嘴都设置完了, 归零后, 将所有吸嘴的第一位置重新验证一下(如果不对, 将吸嘴位置都调整对), 防止杯具发生.
设置吸嘴座为自动换刀 - 以N1为例
设备刚标定好时, 是手工换刀.

现在点击选项 - 使能自动换刀, 手工换刀改变.

这样我们通过软件手工换吸嘴或者贴不同料时, 就可以来吸嘴站自动换成料指定的吸嘴.
以后归零后, 第一件事情, 先将顶部相机十字落在吸嘴上的第一位置, 看看位置正确(强迫症犯了, 还是担心坐标变了). 然后再干别的事情.
当前, 吸嘴座上没有吸嘴, 现在通过软件换吸嘴, 看看能不能自动换嘴.

现在勾选最后NT1_502吸嘴的载入选项框, 如果正常的话, 就会将NT1_502载入到N1吸嘴座.
正常
前面设置了换嘴时的操作速度为0.1, 如果位置稍有差异, 也会很安全. 换嘴的动作慢的很.

现在先归零, 让吸嘴离吸嘴库远点.
现在N1上载入了N1_502, 现在点击N1的载入框, 使勾消失, 让吸嘴N1_502回到吸嘴库.


现在吸嘴的自动换刀的载入/卸载都成功了.
备注
感觉有以下点比较重要, 可以防止在换刀时出现意外.
- 机械归零的低速距离都设置成5mm, 防止机械归零有时坐标不全为(0,0,0)的状况.
- 一定要开启视觉归零, 防止机械归零出现0.xmm的偏差.
- 视觉归零后, 先去吸嘴库上任意一个吸嘴轴第一位置, 看看坐标是否正确(如果超过0.1mm, 需要调整, 如果吸嘴轴的停靠不稳固/用手动过吸嘴/设备震动厉害, 有可能出现这种问题).
- 设备不用时, 将吸嘴都用openpnp软件放在吸嘴库中, 然后再关闭openpnp软件. 保证任何时候, 运行openpnp软件时, 吸嘴座上都没有吸嘴.
- 吸嘴和N1, N2的高度参数都不同, 设置参数时, 吸嘴座落下来时, 用人工判断扣合的高度值, 不要一股脑都设置成一样, 防止意外.
- 每个吸嘴换嘴时的速度, 还是设置成比较低的速度靠谱(e.g. 0.1), 如果差个0.2mm, 也可以正常换刀, 不至于将吸嘴怼坏.
- 买来的吸嘴, 可能有制造时的突起或毛边, 用砂纸打一下, 光滑了, 再放入吸嘴库.
补充 - 吸嘴轴差个0.3mm, 就有可能怼坏吸嘴
中间不知道哪里整错了(有可能是拍空吸嘴库位置的照片时, 用收拿出/插入了吸嘴), 归零后, 再看吸嘴轴第一位置偏了0.3mm左右, 用手工来测试4个位置是否正确.
手工测试时, 是不会按照设定的换嘴低速走的, 还是正常速度
直接将黑色的NT1_502怼碎了…, 还好吸嘴电机和Z电机都没问题.
看来归零后, 先看看吸嘴库中的吸嘴坐标变了没有很重要.
不过, 只要设置好了吸嘴库上的所有吸嘴, 设备本身没震动, 没有用手拔出/插入过吸嘴, 问题不大.
END
相关文章:
openpnp - 自动换刀的设置
文章目录 openpnp - 自动换刀的设置概述笔记采用的openpnp版本自动换刀库的类型选择自动换刀设置前的注意事项先卸掉吸嘴座上所有的吸嘴删掉所有的吸嘴设置自动换刀的视觉识别设置吸嘴座为自动换刀 - 以N1为例备注补充 - 吸嘴轴差个0.3mm, 就有可能怼坏吸嘴END openpnp - 自动换…...
《HeadFirst设计模式(第二版)》第十章代码——状态模式
如下图所示,这是一个糖果机的状态机图,要求使用代码实现: 初始版本: package Chapter10_StatePattern.Origin;/*** Author 竹心* Date 2023/8/19**/public class GumballMachine {final static int SOLD_OUT 0;final static int…...
day-25 代码随想录算法训练营(19)回溯part02
216.组合总和||| 思路:和上题一样,差别在于多了总和,但是数字局限在1-9 17.电话号码的字母组合 思路:先纵向遍历第i位电话号码对于的字符串,再横向递归遍历下一位电话号码 93.复原IP地址 画图分析: 思…...
PG逻辑备份与恢复
文章目录 创建测试数据pg_dump 备份pg_restore 恢复pg_restore 恢复并行备份的文件PG 只导出指定函数 创建测试数据 drop database if exists test; create database test ; \c test create table t1(id int primary key); create table t2(id serial primary key, name varch…...
图数据库_Neo4j和SpringBoot整合使用_实战创建明星关系图谱---Neo4j图数据库工作笔记0010
然后我们再来看一下这个明星关系图谱 可以看到这里 这个是原来的startRelation 我们可以写CQL去查询对应的关系 可以看到,首先查询出来以后,然后就可以去创建 我们可以把写的创建明星关系的CQL,拿到 springboot中去执行 可以看到,这里我们先写一个StarRelationRepository,然…...
Linux网络编程:Socket套接字编程(Server服务器 Client客户端)
文章目录: 一:定义和流程分析 1.定义 2.流程分析 3.网络字节序 二:相关函数 IP地址转换函数inet_pton inet_ntop(本地字节序 网络字节序) socket函数(创建一个套接字) bind函数(给socket绑定一个服务器地址结…...
Mac OS下应用Python+Selenium实现web自动化测试
在Mac环境下应用PythonSelenium实现web自动化测试 在这个过程中要注意两点: 1.在终端联网执行命令“sudo pip install –U selenium”如果失败了的话,可以尝试用命令“sudo easy_install selenium”来安装selenium; 2.安装好PyCharm后新建project&…...
每天一道leetcode:934. 最短的桥(图论中等广度优先遍历)
今日份题目: 给你一个大小为 n x n 的二元矩阵 grid ,其中 1 表示陆地,0 表示水域。 岛 是由四面相连的 1 形成的一个最大组,即不会与非组内的任何其他 1 相连。grid 中 恰好存在两座岛 。 你可以将任意数量的 0 变为 1 &#…...
【学习日记】【FreeRTOS】FreeRTOS 移植到 STM32F103C8
前言 本文基于野火 FreeRTOS 教程,内容是关于 FreeRTOS 官方代码的移植的注意事项,并将野火例程中 STM32F103RC 代码移植到 STM32F103C8。 一、FreeRTOS V9.0.0 源码的获取 两个下载链接: 官 网 代码托管 二、源码文件夹内容简介 Source…...
Qt 屏幕偶发性失灵
项目场景: 基于NXP i.mx7的Qt应用层项目开发,通过goodix使用触摸屏,走i2c协议。 问题描述 触摸屏使用过程中意外卡死,现场分为多种: i2c总线传输错误,直观表现为触摸屏无效,任何与触摸屏挂接在同一总线上的i2c设备,均受到干扰,并且在传输过程中内核报错以下代码: G…...
如何在pycharm中指定GPU
如何在pycharm中指定GPU 作者:安静到无声 个人主页 目录 如何在pycharm中指定GPU打开编辑配置点击环境变量添加GPU配置信息推荐专栏在Pycharm运行程序的时候,有时候需要指定GPU,我们可以采用以下方式进行设置: 打开编辑配置 点击环境变量 添加GPU配置信息 添加名称:CU…...
C#判断字符串中有没有字母,正则表达式、IsLetter
要判断字符串中是否包含字母,可以使用正则表达式或者循环遍历字符串的方式。 方法一:使用正则表达式 using System.Text.RegularExpressions;string input "Hello123"; bool containsLetter Regex.IsMatch(input, "[a-zA-Z]");上…...
Jtti:Ubuntu怎么限制指定端口和IP访问
在 Ubuntu 系统中,可以使用防火墙规则来限制特定的端口和IP访问。常用的防火墙管理工具是 iptables,以下是使用 iptables 来限制指定端口和IP访问的步骤: 安装 iptables: 如果系统中没有安装 iptables,可以使用以下命…...
机器学习/深度学习需要掌握的linux基础命令
很多深度学习/机器学习/数据分析等领域(或者说大多数在Python环境下进行操作的领域)的初学者入门时是在Windows上进行学习,也得益于如Anaconda等工具把环境管理做的如此友善 但如果想在该领域继续深耕,一定会与Linux操作系统打交…...
C++11 std::async推荐使用 std::launch::async 模式
async真假多线程 std::launch::async真多线程 std::launch::async | std::launch::deferred可能多线程 std::launch::deferred假多线程 枚举变量说明 枚举定义 enum class launch {async 1, // 0b1deferred 2, // 0b10any async | def…...
没有使用springboot 单独使用spring-boot-starter-logging
如果您不使用Spring Boot框架,但想单独使用Spring Boot Starter Logging,您可以按照以下步骤进行: 1. 添加Maven依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boo…...
创建Azure资源锁
锁的介绍 在Azure中,资源锁是一种用于保护订阅、资源组或者单个资源的机制。它可以防止对受锁定的资源进行删除或修改操作,帮助确保资源的连续可用性和安全性。 Azure中的资源锁可以分为两种类型: 删除锁(CanNotDelete…...
卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器
在这篇博客中,让我们讨论什么是卷积神经网络 (CNN) 以及 卷积神经网络背后的架构——旨在解决 图像识别系统和分类问题。 卷积神经网络在图像和视频识别、推荐系统和自然语言处理方面有着广泛的应用。 目录 计算机如何读取图像? 为什么不是全连接网络?...
MyBatis XML映射处理CLOB和BLOB类型
Mybatis的MapperXML映射文件应该处理数据库字段类型为CLOB和BLOB类型的数据呢?首先我们先看下CLOB和BLOB这两种数据类型的介绍。 介绍 使用Mybatis时涉及到两种特殊类型的处理,分别是Blob(Binary Large Object)和Clob࿰…...
FPGA_学习_14_第一个自写模块的感悟和ila在线调试教程与技巧(寻找APD的击穿偏压)
前一篇博客我们提到了,如果要使用算法找到Vbr,通过寻找APD采集信号的噪声方差的剧变点去寻找Vbr是一个不错的方式。此功能的第一步是在FPGA中实现方差的计算,这个我们已经在上一篇博客中实现了。 继上一篇博客之后,感觉过了很久了…...
资源占用优化:OpenClaw在RTX4090D上并发控制策略
资源占用优化:OpenClaw在RTX4090D上并发控制策略 1. 为什么需要关注OpenClaw的资源占用? 去年冬天,当我第一次在RTX4090D上部署OpenClaw对接Qwen3-32B模型时,系统频繁崩溃的场景至今记忆犹新。原本以为24GB显存足以应对常规任务…...
数据库课程设计案例:基于深度感知的智能仓储管理系统
数据库课程设计案例:基于深度感知的智能仓储管理系统 每次路过大型物流仓库,看到那些高耸的货架和穿梭的叉车,我总会想,他们是怎么知道哪个货位是满的,哪个是空的?靠人工盘点?那得累死。靠传统…...
双模型对比:OpenClaw同时接入nanobot与云端API的性能测试
双模型对比:OpenClaw同时接入nanobot与云端API的性能测试 1. 测试背景与目标 最近在尝试用OpenClaw搭建一个能同时处理本地轻量任务和复杂云端任务的智能助手系统。核心需求是:日常简单查询走本地部署的轻量模型(nanobot)&#…...
vLLM与SGLang多模型统一API部署实战指南
1. 为什么需要多模型统一API部署 在实际生产环境中,我们经常会遇到需要同时部署多个AI模型的场景。比如一个智能客服系统可能需要同时支持问答、情感分析和文本摘要等多个功能,每个功能背后可能对应不同的模型。如果每个模型都单独部署一套服务ÿ…...
如何利用Blender MMD Tools实现跨平台3D模型与动画工作流
如何利用Blender MMD Tools实现跨平台3D模型与动画工作流 【免费下载链接】blender_mmd_tools MMD Tools is a blender addon for importing/exporting Models and Motions of MikuMikuDance. 项目地址: https://gitcode.com/gh_mirrors/bl/blender_mmd_tools 副标题&am…...
从逻辑门到CPU:计算机工作原理详解
戏说CPU的工作原理:从逻辑门到计算系统1. 计算系统的基本构建单元1.1 逻辑门的物理实现计算系统最基本的构建单元是逻辑门,它们可以通过简单的物理实体来演示。以三名士兵为例,我们可以构建最基本的逻辑运算单元:输入单元…...
stm32开发新手福音:告别复杂安装,用快马ai生成带详解的hal库基础代码
作为一名刚接触STM32开发的新手,我最近在尝试用HAL库控制GPIO时遇到了不少麻烦。从下载安装STM32CubeMX到配置工程,每一步都让我这个小白手忙脚乱。直到发现了InsCode(快马)平台,整个过程变得简单多了——不需要自己搭建环境,AI就…...
G5080 G6080 G7080 G1810 G2810 ,MG3680,ts3380最新清零软件5B00,5B01,5B02,1700,1701,1702,1704,P07,E08废墨收集器已满
下载地址:链接:https://pan.baidu.com/s/1j7Nwv715wX1JL3qidnGyXA?pwd0000 提取码:0000 常见 佳能打印机 型号: G5080 G6080 G7080 G1810 G2810 G3810 G4810 G1800 G2800 G3800 G4800 G5010 G6010 G7010 G1010 G2010 G3010 G4010 G1000 G2000 G3000 G40…...
debian 更新内核后,nvidia 驱动突然不见了,处理
nvidia 驱动通常由 dkms 来构建 安装新内核后, 对应 linux-headers-amd64 没有安装到,导致 dkms 不为新内核 构建驱动 解决办法: apt update apt install linux-headers-amd64 它会自动为已有的内核安装 linux 头文件 然后 用命令 dpkg-recon…...
嵌入式OLED UI组件库:轻量级C++组件化设计
1. 项目概述 OLED UI Components 是一个面向嵌入式平台的轻量级、组件化 OLED 用户界面开发库,专为基于 SSD1306 驱动芯片的单色 OLED 显示屏(典型分辨率为 12864)设计。该库不直接操作硬件寄存器,而是构建在 Adafruit_SSD1306 库…...
