当前位置: 首页 > news >正文

软件外包app网站seo在线诊断分析

软件外包app,网站seo在线诊断分析,网页建站如何保存分享,seo研究协会网前言 今年的电赛(2025),很多题都与云台相关,因此为备战电赛,博主这边也是准备了一个由两个42步进电机驱动的云台并提前进行调试,避免赛题出来之后手忙脚乱的,这边的两个42步进电机采用同一个驱…

前言

今年的电赛(2025),很多题都与云台相关,因此为备战电赛,博主这边也是准备了一个由两个42步进电机驱动的云台并提前进行调试,避免赛题出来之后手忙脚乱的,这边的两个42步进电机采用同一个驱动模块进行驱动(D36A),主控肯定采用MSPM0G3507。然后3D打印了一个二维云台的结构并进行组装。本章博客主要是讲这个云台进行绘图的思路以及代码。激光还没有安装上去,目前只是云台的循迹代码


如果无法很好的复现博客里的代码,可以私信作者博取源代码,电赛期间都在线

一、硬件选择

主控:MSPM0G3507
驱动:D36A双路步进电机驱动
电机:42步进电机*2

二、硬件连线

硬件连线部分在上一篇博客里面已经说过了,可以直接去上一篇里面看,这边附上链接
MSPM0开发学习笔记:D36A驱动的42步进电机二维云台(2025电赛 附源代码及引脚配置)

三、软件代码

软件部分采用C语言实现,IDE采用keil,基于逐飞库进行编写
这边先进行一下简单的参数说明,便于理解后面的思路

参数含义以及作用
current_x目前的X坐标
current_y目前的Y坐标
target_x需要移动到的X坐标
target_y需要移动到的Y坐标
move_x需要移动的X距离
move_y需要移动的Y距离
point_count绘制圆形时候的点数

驱动—电机

代码实现如下:

函数一:限幅函数

#define MAX_ANGLE_X  1000.0f   
#define MIN_ANGLE_X -1000.0f   
#define MAX_ANGLE_Y  1000.0f  
#define MIN_ANGLE_Y -1000.0f  float limit_angle(float angle, float min, float max) {if (angle < min) return min;if (angle > max) return max;return angle;
}

函数二:激光云台绘制正方形

// Function to draw a square trajectory
// Parameters:
//   x_len - length of the square's X-axis dimension
//   y_len - length of the square's Y-axis dimension
//   MOVE_SPEED - speed of movement between points
void draw_square(int x_len, int y_len, int MOVE_SPEED) {// Structure to store X and Y angle coordinatestypedef struct {float x_angle;  // X-axis angle positionfloat y_angle;  // Y-axis angle position} Point;// Invert Y-axis length (likely for coordinate system adjustment)y_len = y_len * -1;// Calculate half-lengths for easier coordinate calculationfloat x_len_2 = x_len / 2;float y_len_2 = y_len / 2;// Define square vertices relative to origin (0,0)// Coordinates form a square shape when connected sequentiallyPoint square_points[] = {{-1 * x_len_2, y_len_2},    // Top-left corner{x_len_2, y_len_2},         // Top-right corner{x_len_2, -1 * y_len_2},    // Bottom-right corner{-1 * x_len_2, -1 * y_len_2},// Bottom-left corner{-1 * x_len_2, y_len_2},    // Back to top-left to close the square{0.0f, 0.0f}                // Final point: return to origin};// Calculate total number of points in the square trajectoryuint8 point_count = sizeof(square_points) / sizeof(Point);  // Initialize current position at origin (0,0)float current_x = 0;float current_y = 0;// Move to each defined point in sequencefor (uint8 i = 0; i < point_count; i++) {// Ensure target angles stay within allowed rangefloat target_x = limit_angle(square_points[i].x_angle, MIN_ANGLE_X, MAX_ANGLE_X);float target_y = limit_angle(square_points[i].y_angle, MIN_ANGLE_Y, MAX_ANGLE_Y);// Calculate relative movement from current position to targetfloat move_x = target_x - current_x;float move_y = target_y - current_y;// Update current position to target coordinatescurrent_x = target_x;current_y = target_y;// Send movement command to both axesd36a_set_angle_both(move_x, move_y, MOVE_SPEED);// Pause 300ms after reaching each pointsystem_delay_ms(300);}// Pause 2 seconds after completing the squaresystem_delay_ms(2000);
}

一、函数定义:draw_square函数接收三个参数,分别是正方形的 X 轴长度(x_len)、Y 轴长度(y_len)和移动速度(MOVE_SPEED)。
二、数据结构:定义了Point结构体用于存储坐标点的 X 和 Y 角度值。
三、坐标处理:
1、将 Y 轴长度取负值(为了调整坐标系方向)
2、计算半长(x_len_2, y_len_2),用于确定正方形顶点坐标
3、坐标定义:定义了正方形的 4 个顶点坐标和原点(0,0)坐标以中心点为原点,通过半长计算得出四个顶点位置
4、最后回到一个点 (0,0) 用于回到起点
四、绘制逻辑:
1、遍历所有定义的坐标点
2、对每个目标点进行角度限制(通过limit_angle函数确保在有效范围内)
3、计算当前位置到目标点的移动量
4、调用d36a_set_angle_both函数移动到目标点(同时设置 X 和 Y 方向角度)
5、每个点移动后延迟 300 毫秒,绘制完成后延迟 2000 毫秒

函数三:激光云台绘制圆形

// Function to draw a circle trajectory
// Parameters:
//   r - radius of the circle
//   MOVE_SPEED - speed of movement between points
//   point_count - number of points to use for drawing the circle (more = smoother)
void draw_circle(int r, int MOVE_SPEED, const uint8 point_count) {// Structure to store X and Y angle coordinatestypedef struct {float x_angle;  // X-axis angle positionfloat y_angle;  // Y-axis angle position} Point;// Array to store circle points (extra element to close the loop)Point circle_points[point_count + 1];  // Calculate coordinates for each point on the circlefor (uint8 i = 0; i < point_count; i++) {// Convert angle from degrees to radians (full circle = 2π radians)float rad = 2 * 3.1415926f * i / point_count;// Calculate X and Y positions using trigonometric functions// cosine for X-axis, sine for Y-axis to form circular pathcircle_points[i].x_angle = r * cosf(rad); circle_points[i].y_angle = r * sinf(rad);  }// Close the circle by duplicating the first point as the last pointcircle_points[point_count] = circle_points[0];// Initialize current position at origin (0,0)float current_x = 0.0f;  float current_y = 0.0f; // Move to each calculated point in sequencefor (uint8 i = 0; i <= point_count; i++) {// Ensure target angles stay within allowed rangefloat target_x = limit_angle(circle_points[i].x_angle, MIN_ANGLE_X, MAX_ANGLE_X);float target_y = limit_angle(circle_points[i].y_angle, MIN_ANGLE_Y, MAX_ANGLE_Y);// Calculate relative movement from current position to targetfloat move_x = target_x - current_x;float move_y = target_y - current_y;// Update current position to targetcurrent_x = target_x;current_y = target_y;// Send movement command to both axesd36a_set_angle_both(move_x, move_y, MOVE_SPEED);// Optional delay between point movements// system_delay_ms(10);}// Return to origin (0,0) after completing the circlefloat target_x = 0;float target_y = 0;// Calculate movement from last circle point to originfloat move_x = target_x - current_x;float move_y = target_y - current_y;// Update current position to origincurrent_x = target_x;current_y = target_y;// Send final movement command to return to origind36a_set_angle_both(move_x, move_y, MOVE_SPEED);// Pause for 2 seconds after completing the circlesystem_delay_ms(2000);  
}

通过三角函数(X 轴用余弦、Y 轴用正弦)计算圆周上指定数量的点的坐标,这些点基于圆周的等角度增量分布。函数会按顺序在这些点之间移动(带速度控制),同时确保角度在有效范围内;通过回到第一个点来闭合圆形轨迹,最后返回原点,结束时短暂暂停。点的数量越多,绘制的圆越平滑。
以下是函数中涉及的公式:

  1. 弧度计算(将圆周等分为指定数量的点)
    rad=2×π×ipoint_count\text{rad} = 2 \times \pi \times \frac{i}{\text{point\_count}} rad=2×π×point_counti
    其中,iii 为当前点的索引(0 到 point_count-1),point_count\text{point\_count}point_count 为圆周上的总点数,rad\text{rad}rad 为对应角度的弧度值。
  2. X轴坐标计算
    x_angle=r×cos⁡(rad)x\_angle = r \times \cos(\text{rad}) x_angle=r×cos(rad)
    其中,rrr 为圆的半径,cos⁡(rad)\cos(\text{rad})cos(rad) 为弧度对应的余弦值。
  3. Y轴坐标计算
    y_angle=r×sin⁡(rad)y\_angle = r \times \sin(\text{rad}) y_angle=r×sin(rad)
    其中,sin⁡(rad)\sin(\text{rad})sin(rad) 为弧度对应的正弦值。

四、总结

这边给的都是一些简单图形的绘制代码,但是思路都是通用的,复杂图形也可以复用这一套逻辑。大家参考参考就好

如果无法很好的复现博客里的代码,可以私信作者博取源代码,电赛期间都在线

http://www.dtcms.com/a/506284.html

相关文章:

  • 做网站怎样设置搜索引擎上市公司网站推广方案
  • 佛山网站制作外包上城网站建设
  • 用php做的网站有哪些如何从网站获取图片做全景图
  • 实用设计网站推荐昆明网站建设加q.479185700
  • 免费商城版网站idc网站模板
  • 爱站网 关键词挖掘工具站长工具网站建设+荆州
  • 做二手房比较好的网站有哪些赤水市住房和城乡建设局网站
  • 做网站推广的技巧西安网站建站品牌
  • 做网站推广销售怎么样桃城网站建设代理
  • html5手机网站织梦模板wordpress 首页慢
  • c 网站开发入门视频网站空间控制面板
  • 手机网站开发计划佛山高端网站制作
  • 网站制作职业wordpress商城教程
  • 上海买二手房做哪个网站好浏览器推广怎么做
  • 公司做的网站计入什么前端网站做中 英文怎么说
  • 路由器带u盘接口的做网站成都旅游必去的地方
  • 特色的佛山网站建设青岛外贸网站建站
  • 炫酷响应式网站设计wordpress百度推送插件
  • 北京网站提升排名wordpress 招聘模块
  • 成都网站建设电话买个域名
  • iis7.5 网站打不开请小组讨论一个完整的网页设计流程
  • 怎么查网站域名中国建筑工程网施工资料
  • 百度做网站效果怎么样金华建设局网站
  • 蓝天网站建设加盟型网站建设
  • 网站的管理维护徐州 商城网站设计
  • 如何建立网站建设单位做网站图片素材
  • 淄博网站制作公司推广赶集网免费发布信息网
  • 网站做rss+wordpress中国网络科技公司排名
  • 深圳设计功能网站WordPress开发微信支付
  • 大型网站响应式济宁创企网络技术有限公司