如何使用双轴XY平台绘制斜向多边形

news2025/6/11 12:06:27

1. 功能说明

本文示例将实现双轴XY平台绘制斜向多边形的功能。

 2. 直角坐标机器人的结构设计

      直角坐标机器人各个运动轴通常对应直角坐标系中的X轴、Y轴和Z 轴,其中X 轴和Y 轴是水平面内运动轴,Z轴是上下运动轴。在绝大多数情况下直角坐标机器人的各个直线运动轴间的夹角为直角。

      直角坐标系根据自由度可分为单轴、双轴和三轴直角坐标系机械臂,每个轴互相垂直且单轴沿着直线方向运动。

       直角坐标系机器人的最基础功能模块为直线运动的单轴模块,在单轴机模块中常见的传动方式有两种:一种是丝杆传动,另一种是同步带(同步齿形带)传动。这两种传动方式都是以直线导轨作为导向的,配合伺服电机或步进电机,可实现不同应用领域的定位、移载、搬运等。

      这里主要介绍下丝杠传动机构原理:这是一个将转动转化为平动的机构,丝杠与移动的滑块之间通过螺纹传动;电机的旋转运动通过丝杆传递给滑块,由于滑块被支架限制不能进行旋转运动,所以滑块最终将旋转的运动转换为水平方向的移动。

运动特性:通过上面的分析可以看出,这是一种螺旋机构,具有以下特点

      (1) 回转运动变换为直线运动,运动准确性高,且有很大的降速比;复式螺旋可以获得较大的位移,差动螺旋可以获得微小的位移;

      (2) 结构简单,制造方便;

      (3) 工作平稳,无噪声,可以传递很大的轴向力;

      (4) 传动效率低,有自锁作用,相对运动表面磨损较快;

      (5) 实现往复运动要靠主动件改变转动方向。

      丝杠机构的的稳定性很好,可以承受较大的力,所以如果要设计一些直线运输重物的机构时,可以考虑利用丝杠来实现。

      本实验将利用双轴XY丝杠平台来绘制斜向多边形。

 3. 电子硬件

      在这个示例中,采用了以下硬件,请大家参考:

主控板

Basra主控板(兼容Arduino Uno)

扩展板

Bigfish2.1扩展板

SH-ST步进电机扩展板
电池11.1V动力电池
传感器触碰传感器

其它

笔架×1(自制,可根据文末资料提供的3D文件打印)

4. 功能实现

      在这里我们采用了一种算法,该算法的思路是:先建立一个平面坐标系,将我们所需要画的多边形图形放置在该坐标系中,这样就可以确定该图形每个顶点的坐标,两个相邻的顶点之间确定一条直线,直线上各点坐标通过插补计算得到,然后画笔依次沿着这些坐标进行移动,完成绘制。所以在这个过程中,我们需要知道如何建立一个图形的坐标系,以及什么是插补计算,下面我们通过1个菱形图案进行相关算法讲解。

建立坐标系:

       我们建立一个以A点为原点的直角坐标系,很容易可以得出其顶点坐标:A(0,0),B(X,0),C(X+X1,Y),D(X1,Y);其中菱形的对角线为已知量a,b。

通过勾股定理很容易得出:

       这样菱形的4个顶点坐标就确定了,接下来需要考虑如何控制双轴平台实现在坐标系内的直线运动。双轴平台实现直线的轨迹运动需要X轴和Y轴共同协作,但是X轴和Y轴在运动时始终存在一个时间差,所以在绘制斜向直线时,实际是由无数的折线段组成的,当这些折线无限小时,这些折线看起来就是一条直线了。

      这里我们采用在数控加工中所用的曲线加工方法-插补计算。

插补计算:

      对轮廓线的起点到终点之间再密集的计算出有限个坐标单,执行端沿着这些坐标点移动,用折线逼近所要绘制的曲线。

      这里我们采用逐点比较法插补计算: 绘图笔每走一步都要和给定轨迹上的坐标值进行比较一次,根据这个比较判断偏差方向,决定下一步的进给方向。

插补步骤:

      偏差判别(根据偏差确定下一步走向) > 坐标进给(走一步) > 偏差计算(判断偏差方向) > 终点判断(插补结束判断)。

      所以在这个过程中,我们首先需要知道如何进行偏差方向的判断(偏差判别),知道对应的双轴平台X/Y向如何进给。

      常规的方法是引入一个偏差量Fm,通过判断Fm的值和终点所在象限来判断进给方向,当Fm≥0时且终点在一、四象限时,沿﹢X方向进给,在二、三象限时,沿-X向进给;当Fm<0时且终点在一、二象限时,沿﹢Y方向进给,在三、四象限时,沿-Y向进给。如下表所示:

4.1硬件连接

     按下图所示,在双轴XY平台的①和②位置安装两个触碰传感器,用作开关限位器:

电路连接说明:

① 步进电机:

X轴黑绿红蓝   Y轴黑绿红蓝

② 触碰传感器3个↓

X方向复位传感器引脚:A4

y方向复位传感器引脚:A0

电机运动的触发传感器引脚:A2

4.2 示例程序

编程环境:Arduino 1.8.19

参考下列例程代码(_2_new.ino),输入不同的a,b值,完成菱形的绘制:

/*------------------------------------------------------------------------------------

  版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

           Distributed under MIT license.See file LICENSE for detail or copy at

           https://opensource.org/licenses/MIT

           by 机器谱 2023-03-24 https://www.robotway.com/

  ------------------------------*/

#define EN        8       //步进电机使能端,低电平有效

#define X_DIR     5       //X轴 步进电机方向控制

#define Y_DIR     6       //y轴 步进电机方向控制

#define X_STP     2       //x轴 步进控制

#define Y_STP     3       //y轴 步进控制

boolean DIR;              //boolean类型变量 DIR,控制步进电机方向,true为正向,false为反向,根据接线做调整

int stepper_delay = 40;   //定义步进电机脉冲发送的时间间隔


const int SENSOR_X = 18;     //定义X方向复位传感器引脚

const int SENSOR_Y = 14;     //定义y方向复位传感器引脚

const int SENSOR_TOUCH = 16; //定义电机运动的触发传感器引脚



const int stepsPerRevolution = 3200;   //定义步进电机每圈转动的步数,细分为16



float LEAD = 8.0;   //定义丝杠导程,即步进电机转动一圈,丝杠前进8mm


float DIAGONAL_A = 20;   //定义多边形两条对角线长度

float DIAGONAL_B = 30;


float Xmin = 0;   

float Xmax = sqrt((DIAGONAL_A/2)*(DIAGONAL_A/2)+(DIAGONAL_B/2)*(DIAGONAL_B/2));   //多边形X方向边长

float Ymin = 0;

float Ymax = (2*DIAGONAL_A/2*DIAGONAL_B/2)/Xmax;     //多边形Y方向的高


float x1 = 0;          //多边形四个顶点的坐标

float y1 = 0;

float x2 = Xmax;

float y2 = 0;

float x3 = (2*DIAGONAL_B/2*DIAGONAL_B/2-Xmax*Xmax)/Xmax+Xmax;

float y3 = Ymax;

float x4 = (2*DIAGONAL_B/2*DIAGONAL_B/2-Xmax*Xmax)/Xmax;

float y4 = Ymax;


void setup()

{

Serial.begin(9600);                             //开启串口通信,波特率为9600

  pinMode(X_DIR, OUTPUT); pinMode(X_STP, OUTPUT);

  pinMode(Y_DIR, OUTPUT); pinMode(Y_STP, OUTPUT);

  pinMode(EN, OUTPUT);

  digitalWrite(EN, LOW);       

resetStepper();

}


void loop()

{           

    while(digitalRead(SENSOR_TOUCH))

     delay(10);

     

    step(Y_DIR,Y_STP,-40000);

    step(X_DIR, X_STP, 24000);

   

    runIn(x1, y1, x2, y2);

   

    runIn(x2, y2, x3, y3);

   

    runIn(x3, y3, x4, y4);

   

    runIn(x4, y4, x1, y1);

   

    resetStepper();

}


//四象限直线插补函数,参数为两个点的坐标值

void runIn(float x1, float y1, float x2, float y2)

{

  /*

   dx:X轴两坐标间步数值

   dy:Y轴两坐标间步数值

   n :两坐标X轴和Y轴总步数

   k :象限值

   f :偏差计算值

   stepInc:步进电机转动步数

   */

  int dx, dy, n, k, i, f, stepInc;

  dx = abs((x2-x1)/LEAD*stepsPerRevolution);  

  dy = abs((y2-y1)/LEAD*stepsPerRevolution);

  n = abs(dx+dy);                           

  if(dx==0||dy==0)

  {

    stepper_delay = 40;

    stepInc = 10;

  }

  else

  {

    stepper_delay = 200;

    stepInc = 100;

  }

 

  if(x2 >= x1)

  {

    k = y2 >= y1 ? 1:4;

  }

  else

  {

    k = y2 >= y1 ? 2:3;

  }

 

  for(i=0,f=0;i<n;i+=stepInc)

  {

    if(f>=0)

    {

      switch(k)

      {

         case 1:

         step(X_DIR, X_STP, stepInc);

         f = f - dy;

         //Serial.println("+x");

         break;

         case 2:

         step(X_DIR, X_STP, -stepInc);

         f = f - dy;

         //Serial.println("-x");

         break;

         case 3:

         step(X_DIR, X_STP, -stepInc);

         f = f - dy;

         //Serial.println("-x");

         break;

         case 4:

         step(X_DIR, X_STP, stepInc);

         f = f - dy;

         //Serial.println("+x");

         break;

         default:break;

      }

    }

    else

    {

      switch(k)

      {

        case 1:

        step(Y_DIR, Y_STP, stepInc);

        f = f + dx;

        //Serial.println("+y");

        break;

        case 2:

        step(Y_DIR, Y_STP, stepInc);

        f = f + dx;

        //Serial.println("+y");

        break;

        case 3:

        step(Y_DIR, Y_STP, -stepInc);

        f = f + dx;

        //Serial.println("-y");

        break;

        case 4:

        step(Y_DIR, Y_STP, -stepInc);

        f = f +dx;

        //Serial.println("-y");

        break;

        default:break;

      }

    }

  }

}


/*

//函数:step    功能:控制步进电机方向,步数。

//参数:dirPin对应步进电机的DIR引脚,stepperPin 对应步进电机的step引脚, steps 步进的步数

//无返回值

*/

void step(byte dirPin, byte stepperPin, int steps)

{

  boolean DIR = steps>0 ? true : false;  

  digitalWrite(dirPin,DIR);

  for(int i=0;i<abs(steps); i++)

  {

    digitalWrite(stepperPin, HIGH);

    delayMicroseconds(stepper_delay);

    digitalWrite(stepperPin, LOW);

    delayMicroseconds(stepper_delay);

  }

}


//步进电机复位函数

void resetStepper()

{

        stepper_delay = 40;

while(digitalRead(SENSOR_X))

step(X_DIR,X_STP,-10);

        step(X_DIR,X_STP,15);

while(digitalRead(SENSOR_Y))

step(Y_DIR,Y_STP,-10);

        step(Y_DIR,Y_STP,15);

}

5. 资料内容

①绘制斜向多边形-例程源代码

②绘制斜向多边形-样机3D文件

资料内容详见 双轴XY平台-绘制斜向多边形

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

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

相关文章

SpringBoot集成Easy-Es

文章目录SpringBoot集成Easy-Es一、集成demo二、索引CRUD创建索引查询索引更新索引删除索引三、数据CURD四、参数文档SpringBoot集成Easy-Es Easy-Es&#xff08;简称EE&#xff09;是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架&#xff0c…

C语言—实用调试技巧

实用调试技巧什么是bug&#xff1f;调试是什么&#xff1f;有多重要&#xff1f;什么是调试调试的基本步骤Debug和Release的介绍Windows环境调试介绍调试环境的准备快捷键的使用调试的时候查看程序当前信息查看断点信息查看临时变量的值查看局部变量的值查看内存信息查看汇编信…

PERSIANN 降雨数据使用教程

一、前言PERSIANN&#xff0c;“使用人工神经网络从遥感信息中估算降水”&#xff0c;是一种基于卫星的降水检索算法&#xff0c;可提供近乎实时的降雨信息。该算法使用来自全球地球同步卫星的红外 (IR) 卫星数据作为降水信息的主要来源。 红外图像的降水基于云顶温度和降水率之…

ESP32驱动1.28寸GC9A01播放视频(一、视频分辨率的调整和视频格式的转换)

ESP32驱动1.28寸GC9A01播放视频&#xff08;一、视频分辨率的调整和视频格式的转换&#xff09;播放前准备转换视频分辨率用FFmpeg将.MP4转换为.mjpeg格式FFmpeg的win10环境搭建FFmpeg的下载环境变量的搭建MP4转换成mjpeg格式总结播放前准备 1.28寸GC9A01屏幕的分辨率是240x24…

prometheus标签

004 标签 1. 作用 Prometheus中存储的数据为时间序列&#xff0c;是由Metric的名字和一系列的标签(键值对)唯一标识的, 不同的标签代表不同的时间序列&#xff0c;即 通过指定标签查询指定数据 。 指标标签实现了查询条件的作用&#xff0c;可以指定不同的标签过滤不同的数据…

类ChatGPT产品Claude上线Slack平台,一手实测体验在此

文章目录Claude-in-Slack自我介绍成语接龙数学能力代码能力其他总结Claude-in-Slack Claude是Anthropic推出的类ChatGPT对话机器人。Anthropic是一家由前OpenAI团队成员创立的人工智能初创公司。Claude免费、支持中文、无需注册&#xff0c;好心动&#xff0c;立刻上手测试。 …

第一个禁止ChatGPT的西方国家

意大利成为第一个有效禁止 ChatGPT 的西方国家。 由于可能违反隐私和数据法&#xff0c;该国的数据监管机构已下令开发聊天机器人的 OpenAI 停止运营。 意大利数据保护局 (GPDP) 提到了一些担忧&#xff0c;包括大量收集用户数据和存储以训练 AI 算法。 ChatGPT 是一种大型语…

Eyeshot Ultimate 2023 Crack

Eyeshot Ultimate 2023 Crack 已经引入了文档类。 工作区。文档现在包含绘制场景内容所需的所有数据。 2022版GEntities已被删除。 最后&#xff0c;一个真正的跨平台中立核心产品是可用的。 新功能 曲线、平面、曲面和体积网格。 屏幕空间环境光遮挡。 托管ReadDWG和ReadDXF类…

【SQL】一文带你掌握SQL基础语法

文章目录&#x1f496;1&#xff0c;SQL概述&#x1f388;1.1 SQL简介&#x1f388;1.2 通用语法&#x1f388;1.3 SQL分类&#x1f496;2&#xff0c;DDL:操作数据库&#x1f388;2.1 查询&#x1f388;2.2 创建数据库&#x1f388;2.3 删除数据库&#x1f388;2.4 使用数据库…

哪个品牌的触控笔质量好?ipad好用的触控笔

从这一点就能看出来&#xff0c;苹果原装的这一款电容笔&#xff0c;确实是贵得让人无法入手&#xff0c;一支就要一千多块钱。实际上&#xff0c;平替电容笔对没有太多预算的用户是个不错的选择。就拿正版电容笔来说&#xff0c;一正版的电容笔来说&#xff0c;就是4支平替电容…

Mybatis-Plus——实现公共字段自动填充(瑞吉外卖)

目录 一、公共字段自动填充 1.1 问题分析 1.2 实现思路及代码编写 二、 知识补充&#xff1a; ThreadLocal 2.1 使用背景 2.2 ThreadLocal介绍 2.2.1 设置当前线程的线程局部变量的值 public void set(T value) 2.2.2 返回当前线程所对应的线程 局部变量的值 public T ge…

Linux 下 QT 安卓开发环境搭建

1、采用QT5.14.2&#xff0c;主要是安装1、jdk 2、SDK 3、NDK 三个工具包&#xff0c;版本要匹配上&#xff1b; 备注&#xff1a;配置SDK需要注意&#xff1a; 解压SDK&#xff0c;进入到tools目录下&#xff0c;运行android可执行文件&#xff0c;会打开一个页面&#xff0c…

nvm软件使用-同一个环境下控制多个不同node版本

1.使用场景 nvm是一个用于管理Node.js版本的工具&#xff0c;它可以让你在同一台机器上安装和切换不同的Node.js版本。使用nvm的好处有以下几点&#xff1a; 1.1.nvm可以让你轻松地测试你的代码在不同的Node.js版本下的兼容性和性能&#xff0c;避免因为版本差异导致的问题。…

代码随想录_二叉树_leetcode530 501

leetcode 530 二叉搜索树的最小绝对差 530. 二叉搜索树的最小绝对差 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 示例 1&#xff1a; 输入&#xff1a;root [4,2,6…

ChatGTP如此强大,我们普通人如何利用它来赚钱?

我从效率提升的角度&#xff0c;分享了我这段时间看到的、用到的&#xff0c;以及思考的一些内容。 最近这段时间&#xff0c;我算是密集的学习。不得不说&#xff0c;优质的资料在推特和油管上特别多&#xff0c;看科技大佬的分享真是一种享受。 很多大神也会录制各种详细的…

项目进度把控难题,项目管理系统轻松帮你解决!

项目管理是企业中非常重要的一项工作&#xff0c;无论是新的项目还是旧的项目&#xff0c;都需要对其进行有效的管理&#xff0c;以确保项目顺利完成并达到预期目标。项目管理涉及到很多方面&#xff0c;比如项目交接、实施计划管理、项目功能管理、项目设备管理等等&#xff0…

tcp三次握手与四次分手

一、tcp三次握手 1、TCP建立连接的流程 1&#xff09;client首先给server发送一个SYN报文&#xff0c;表示想要与server建立TCP连接&#xff0c;此时seq序列号为0 2&#xff09;server收到了报文后&#xff0c;向client发送一个SYN和ACK确认报文&#xff0c;将ACK和SYN放到同一…

SpringSecurity之CSRF

前言 前一篇讲解了关于用户注销以及自动登录&#xff08;记住我&#xff09;等功能。今天我们来看一下关于CSRF的使用及避免。 什么是CSRF 跨站请求伪造&#xff08;英语&#xff1a;Cross-site request forgery&#xff09;&#xff0c;也被称为 one-click attack 或者 ses…

74-网络一(基础知识)

网络一一.基础知识1.什么是网络2.互联网3.IP地址(1)什么是IP地址及其作用(2)IP地址的组成(3)IP地址的分类(4)IP地址的查询4.MAC地址5.端口号(1)端口号及其作用(2)怎么实现A主机上的一个进程和B进程上的一个进程实现通讯?网络二见:网络二 一.基础知识 1.什么是网络 网络是由…

亚马逊云科技开启您的云财务管理之旅——成本优化

众所周知&#xff0c;当你想要从头开始建立一个云财务管理计划似乎是稍有难度的。因此&#xff0c;亚马逊云科技解构了4个云财务管理CFM原则——查看、节省、计划和运营——并分享可以实施的操作指南&#xff0c;帮助您在云上取得成功。 云成本管理工具 亚马逊云科技提供一系列…