极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2616|回复: 0

如何使用双轴XY平台绘制正弦曲线

[复制链接]
发表于 2023-4-11 10:18:07 | 显示全部楼层 |阅读模式
本帖最后由 机器谱 于 2023-4-11 10:18 编辑

1. 功能说明
      本文示例将实现R311样机双轴XY平台绘制正弦曲线的功能。


2. 电子硬件

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

主控板
Basra主控板(兼容Arduino Uno)
扩展板
Bigfish2.1扩展板
SH-ST步进电机扩展板
电池11.1V动力电池
传感器触碰传感器
其它
笔架×1(自制)

3. 功能实现

       绘制正弦曲线同样采用建立坐标系,确定特殊点坐标,利用插补法来完成坐标路径绘制。
正弦曲线:


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


电路连接说明:
      ① 步进电机:
          X轴黑绿红蓝   Y轴黑绿红蓝
      ② 触碰传感器3个↓
           X方向复位传感器引脚:A4
           y方向复位传感器引脚:A0
           电机运动的触发传感器引脚:A2

3.2 示例程序

编程环境:Arduino 1.8.19
下面提供一个正弦函数为的参考例程(_3_sin.ino),尝试读懂程序,绘制不同参数的正弦曲线:

  1. /*------------------------------------------------------------------------------------

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

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

  4.            https://opensource.org/licenses/MIT

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

  6.   ------------------------------*/

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

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

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

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

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

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

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


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

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

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


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


  18. float LEAD = 0.8;   //定义丝杠导程,即步进电机转动一圈,丝杠前进8cm


  19. float A = 2.0;     //定义sin函数振幅

  20. float W = 1.0;     //定义sin函数角频率

  21. float P = 0.0;     //定义sin函数初始相位


  22. float Xmin = 0;

  23. float Ymin = 0;



  24. float Xpos = Xmin;

  25. float Ypos = Ymin;



  26. void setup()

  27. {

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

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

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

  31.   pinMode(EN, OUTPUT);

  32.   digitalWrite(EN, LOW);

  33. resetStepper();

  34. }


  35. void loop()

  36. {           

  37.         while(digitalRead(SENSOR_TOUCH))

  38.          delay(10);

  39.          

  40.         Xpos = 0;

  41.         Ypos = 0;

  42.          

  43.         step(Y_DIR,Y_STP,-40000);

  44.         //step(X_DIR, X_STP, 28000);

  45.       

  46.         for(float x=0;x<=2*PI/W;x+=0.1)

  47.         {

  48.           float y = A*sin(W*x+P);

  49.           drawLine(x,y);

  50.         }

  51.       

  52.         step(X_DIR, X_STP, 8000);

  53.       

  54.         resetStepper();

  55. }


  56. //图形绘制函数,参数为点坐标值

  57. void drawLine(float x1, float y1)

  58. {

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

  60.   x1 = (int)(x1/LEAD*stepsPerRevolution);

  61.   y1 = (int)(y1/LEAD*stepsPerRevolution);

  62.   float x0 = Xpos;

  63.   float y0 = Ypos;



  64.   Serial.println(Xpos);

  65.   Serial.println(Ypos);



  66.   dx = abs(x1-x0);

  67.   dy = abs(y1-y0);

  68.   n = abs(dx+dy);

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

  70.   {

  71.     stepper_delay = 40;

  72.     stepInc = 10;

  73.   }

  74.   else

  75.   {

  76.     stepper_delay = 200;

  77.     stepInc = 100;

  78.   }



  79.   if(x1 >= x0)

  80.   {

  81.     k = y1 >= y0 ? 1:4;

  82.   }

  83.   else

  84.   {

  85.     k = y1 >= y0 ? 2:3;

  86.   }



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

  88.   {

  89.     if(f>=0)

  90.     {

  91.       switch(k)

  92.       {

  93.          case 1:

  94.          step(X_DIR, X_STP, stepInc);

  95.          f = f - dy;

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

  97.          break;

  98.          case 2:

  99.          step(X_DIR, X_STP, -stepInc);

  100.          f = f - dy;

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

  102.          break;

  103.          case 3:

  104.          step(X_DIR, X_STP, -stepInc);

  105.          f = f - dy;

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

  107.          break;

  108.          case 4:

  109.          step(X_DIR, X_STP, stepInc);

  110.          f = f - dy;

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

  112.          break;

  113.          default:break;

  114.       }

  115.     }

  116.     else

  117.     {

  118.       switch(k)

  119.       {

  120.         case 1:

  121.         step(Y_DIR, Y_STP, stepInc);

  122.         f = f + dx;

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

  124.         break;

  125.         case 2:

  126.         step(Y_DIR, Y_STP, stepInc);

  127.         f = f + dx;

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

  129.         break;

  130.         case 3:

  131.         step(Y_DIR, Y_STP, -stepInc);

  132.         f = f + dx;

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

  134.         break;

  135.         case 4:

  136.         step(Y_DIR, Y_STP, -stepInc);

  137.         f = f +dx;

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

  139.         break;

  140.         default:break;

  141.       }

  142.     }

  143.   }

  144.   Xpos = x1;

  145.   Ypos = y1;

  146. }


  147. /*

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

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

  150. //无返回值

  151. */

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

  153. {

  154.   boolean DIR = steps>0 ? true : false;  

  155.   digitalWrite(dirPin,DIR);

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

  157.   {

  158.     digitalWrite(stepperPin, HIGH);

  159.     delayMicroseconds(stepper_delay);

  160.     digitalWrite(stepperPin, LOW);

  161.     delayMicroseconds(stepper_delay);

  162.   }

  163. }


  164. //步进电机复位函数

  165. void resetStepper()

  166. {

  167.         stepper_delay = 40;

  168. while(digitalRead(SENSOR_X))

  169. step(X_DIR,X_STP,-10);

  170.         step(X_DIR,X_STP,15);

  171. while(digitalRead(SENSOR_Y))

  172. step(Y_DIR,Y_STP,-10);

  173.         step(Y_DIR,Y_STP,15);

  174. }
复制代码

4. 资料下载

资料内容:绘制正弦曲线-例程源代码
资料下载地址:https://www.robotway.com/h-col-201.html

想了解更多机器人开源项目资料请关注 机器谱网站 https://www.robotway.com

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-28 08:11 , Processed in 0.058015 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表