机器谱 发表于 2023-4-11 10:18:07

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

本帖最后由 机器谱 于 2023-4-11 10:18 编辑

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

https://28846868.s21i.faiusr.com/3/ABUIABADGAAgvdyToQYokYLjngYwsAQ4uwI.gif.webp
2. 电子硬件
       在这个示例中,采用了以下硬件,请大家参考:


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


3. 功能实现
       绘制正弦曲线同样采用建立坐标系,确定特殊点坐标,利用插补法来完成坐标路径绘制。
正弦曲线:https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgmLqUoQYo9Nv_VTCWATgb.png.webp

https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgp7qUoQYoiPD_iwYwoQU4sAM!400x400.png.webp
3.1硬件连接
   按下图所示,在双轴XY平台的①和②位置安装两个触碰传感器,用作开关限位器:

https://28846868.s21i.faiusr.com/4/ABUIABAEGAAg7rqUoQYouN2OvQUw4gY4wAM!600x600.png.webp
电路连接说明:
      ① 步进电机:
          X轴黑绿红蓝   Y轴黑绿红蓝
      ② 触碰传感器3个↓
         X方向复位传感器引脚:A4
         y方向复位传感器引脚:A0
         电机运动的触发传感器引脚:A2

3.2 示例程序
编程环境:Arduino 1.8.19
下面提供一个正弦函数为https://28846868.s21i.faiusr.com/4/ABUIABAEGAAgrNOUoQYoqJjClQMwugE4Gw.png.webp的参考例程(_3_sin.ino),尝试读懂程序,绘制不同参数的正弦曲线:

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

版权说明: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-27 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 = 0.8;   //定义丝杠导程,即步进电机转动一圈,丝杠前进8cm


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

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

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


float Xmin = 0;

float Ymin = 0;



float Xpos = Xmin;

float Ypos = Ymin;



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);

         

      Xpos = 0;

      Ypos = 0;

         

      step(Y_DIR,Y_STP,-40000);

      //step(X_DIR, X_STP, 28000);

      

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

      {

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

          drawLine(x,y);

      }

      

      step(X_DIR, X_STP, 8000);

      

      resetStepper();

}


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

void drawLine(float x1, float y1)

{

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

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

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

float x0 = Xpos;

float y0 = Ypos;



Serial.println(Xpos);

Serial.println(Ypos);



dx = abs(x1-x0);

dy = abs(y1-y0);

n = abs(dx+dy);

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

{

    stepper_delay = 40;

    stepInc = 10;

}

else

{

    stepper_delay = 200;

    stepInc = 100;

}



if(x1 >= x0)

{

    k = y1 >= y0 ? 1:4;

}

else

{

    k = y1 >= y0 ? 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;

      }

    }

}

Xpos = x1;

Ypos = y1;

}


/*

//函数: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);

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

想了解更多机器人开源项目资料请关注 机器谱网站 https://www.robotway.com
页: [1]
查看完整版本: 如何使用双轴XY平台绘制正弦曲线