> 文章列表 > 如何使用双轴XY平台绘制正弦曲线

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

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

1. 功能说明

本文示例将实现双轴XY平台绘制正弦曲线的功能。

2. 电子硬件

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

主控板

Basra主控板(兼容Arduino Uno)

扩展板

Bigfish2.1扩展板

SH-ST步进电机扩展板

电池 11.1V动力电池
传感器 触碰传感器

其它

笔架×1(自制)

3. 功能实现

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

正弦曲线:Y=Asin(\\omega X+\\phi )

3.1硬件连接

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

电路连接说明:

     ① 步进电机:

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

     ② 触碰传感器3个↓

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

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

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

3.2 示例程序

编程环境:Arduino 1.8.19

      下面提供一个正弦函数为Y=2sinX , X\\in [0,2\\pi ]的参考例程(_3_sin.ino),尝试读懂程序,绘制不同参数的正弦曲线:

/*------------------------------------------------------------------------------------版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.Distributed under MIT license.See file LICENSE for detail or copy athttps://opensource.org/licenses/MITby 机器谱 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;   //定义步进电机每圈转动的步数,细分为16float LEAD = 0.8;   //定义丝杠导程,即步进电机转动一圈,丝杠前进8cmfloat 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);                  //开启串口通信,波特率为9600pinMode(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. 资料内容

绘制正弦曲线-例程源代码

资料详见 双轴XY平台-绘制正弦曲线