1. 功能说明

本文示例将实现四轮全向底盘绘制正六边形的功能。

2. 结构说明

全向底盘具备结构简单、运动灵活等特点。四轮全向底盘采用全向福来轮作为执行轮,四个轮成正方形分布,且每个轮在斜45°方向安装。全向福来轮由主轮和副轮组成,主轮和副轮成垂直分布。

驱动系统采用精度较高的42步进电机;执行末端为伺服电机。通过四个步进电机运动的相互配合,四个步进电机驱动将圆周转动转化为直线运动。

3. 电子硬件

本实验中采用了以下硬件:

主控板

Basra控制板(兼容Arduino Uno)

扩展板

Bigfish2.1扩展板

SH-ST步进电机扩展板
电池 11.1v动力电池
其它

步进电机、标准舵机、笔架

电路连接:

舵机连接在Bigfish扩展板的D11针脚上;4个步进电机与SH-ST扩展板的连接位置见下图:

4. 功能实现

编程环境:Arduino 1.8.19

① 四轮全向底盘运动算法

全向福来轮底盘的一个特点是可以灵活的全向移动,四轮全向轮的全向移动需要四个轮的相互配合,运动方向和各个轮的转向关系如图所示(箭头方向表示轮或车的运动方向):

多边形绘制算法:

正六边形和其它多边形有一个相同的条件-每个顶角角度一致 ,并且所有的多边形外角=360/n(n为边数),这样的话两条相邻边的角度是一致的,所以在这里我们采用了一种算法,该算法的思路是:

先以多边形的一个顶点A创建直角坐标系,然后确定相邻一条边上另一个顶点B的坐标,利用插补法完成一条边的绘制,然后再以顶点B为原点创建一个直角坐标系,继续绘制下一条边,重复上面的流程,完成多边形绘制,通过这种方法,我们只需要知道多边形的边长和边数就可以完成任意正多边形的绘制。

多边形计算公式:

n——为循环中绘制的第几条边为0~(m-1)变量值

m——总边数

L——边长

备注:坐标系原点为上一笔最终点,坐标系方向不变。

② 示例程序

下面给大家提供一个绘制边长为10cm的正六边形参考例程(stepper_car_write_sexangle.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-09 https://www.robotway.com/------------------------------*/#include <Servo.h>/** en:定义步进电机使能引脚* servo_pin:定义舵机引脚* stepper_count:定义步进电机数量* stepperPulse_delay:定义步进电机脉冲生成间隔* LINE_BUFFER_LENGTH:定义串口接收数据长度*/#define en 8#define servo_pin 11#define stepper_count 4#define stepperPulse_delay 850#define LINE_BUFFER_LENGTH 512/** positive_x:定义正向 X 轴* positive_y:定义正向 Y 轴* negative_x:定义负向 X 轴* negative_y:定义负向 Y 轴*/#define positive_x 0#define positive_y 1#define negative_x 2#define negative_y 3/** stepperDir_pin:定义步进电机方向引脚数组* stepperStp_pin:定义步进电机步进引脚数组* dir: x: 5, y: 6, z: 7, a: 13* stp: x: 2, y: 3, z: 4, a: 12*/int stepperDir_pin[4] = {5, 6, 7, 13};int stepperStp_pin[4] = {2, 3, 4, 12};Servo myServo;const int stepsPerRevolution = 3200;   //定义步进电机每圈转动的步数,此处为16细分,每圈 3200 步int penZup = 145;                      //定义舵机抬起角度int penZdown = 150;                    //定义舵机放下角度float LEAD = sqrt(2) * 58 * PI;        //定义步进电机转动 1 圈,小车前进的距离,单位 mmfloat l = 60;                          //定义六边形边长//定义六边形顶点坐标数组float coords[7][2] = {-l*1/2, -sqrt(3)/2*l,l*1/2, -sqrt(3)/2*l,l,     0,l*1/2, sqrt(3)/2*l,-l*1/2, sqrt(3)/2*l,-l,     0 ,-l*1/2, -sqrt(3)/2*l};float Xmin = -60;                      //定义绘图范围float Xmax = 60;float Ymin = -60;float Ymax = 60;float Xpos = 0;float Ypos = 0;void setup() {Serial.begin(9600);                 //开启串口通信,波特率为 9600myServo.attach(servo_pin);myServo.write(penZup);for(int i=0;i<stepper_count;i++){pinMode(stepperDir_pin[i], OUTPUT);pinMode(stepperStp_pin[i], OUTPUT);  }pinMode(en, OUTPUT);digitalWrite(en, LOW);delay(1000);}void loop(){draw_sexangle();while(1){};}//六边形绘制函数void draw_sexangle(){drawLine(coords[0][0], coords[0][1]);delay(200);for(int i=0;i<sizeof(coords) / sizeof(coords[0]);i++){penDown();delay(200);drawLine(coords[i][0], coords[i][1]);penUp();}}//直线插补函数,参数为点坐标值void drawLine(float x1, float y1){int dx, dy, n, k, i, f, stepInc;if (x1 >= Xmax) {x1 = Xmax;}if (x1 <= Xmin) {x1 = Xmin;}if (y1 >= Ymax) {y1 = Ymax;}if (y1 <= Ymin) {y1 = Ymin;}x1 = (int)(x1/LEAD*stepsPerRevolution);y1 = (int)(y1/LEAD*stepsPerRevolution);float x0 = Xpos;float y0 = Ypos;dx = abs(x1-x0);dy = abs(y1-y0);n = abs(dx+dy);if(x1 >= x0){k = y1 >= y0 ? 1:4;}else{k = y1 >= y0 ? 2:3;}for(i=0,f=0;i<n;i+=1){if(f>=0){switch(k){case 1:stepper_move(positive_x, 1);f = f - dy;//Serial.println("+x");break;case 2:stepper_move(negative_x, 1);f = f - dy;//Serial.println("-x");break;case 3:stepper_move(negative_x, 1);f = f - dy;//Serial.println("-x");break;case 4:stepper_move(positive_x, 1);f = f - dy;//Serial.println("+x");break;default:break;}}else{switch(k){case 1:stepper_move(positive_y, 1);f = f + dx;//Serial.println("+y");break;case 2:stepper_move(positive_y, 1);f = f + dx;//Serial.println("+y");break;case 3:stepper_move(negative_y, 1);f = f + dx;//Serial.println("-y");break;case 4:stepper_move(negative_y, 1);f = f +dx;//Serial.println("-y");break;default:break;}}}Xpos = x1;Ypos = y1;}//小车行进方向控制函数void stepper_dir(int positiveDir_x, int positiveDir_y, int negativeDir_x, int negativeDir_y){int dir_value[] = {positiveDir_x, positiveDir_y, negativeDir_x, negativeDir_y};for(int i=0;i<stepper_count;i++){//Serial.print(dir_value[i]);//Serial.print(",");digitalWrite(stepperDir_pin[i], dir_value[i]);}//Serial.println();for(int j=0;j<stepper_count;j++){digitalWrite(stepperStp_pin[j], HIGH);}  delayMicroseconds(stepperPulse_delay);for(int j=0;j<stepper_count;j++){digitalWrite(stepperStp_pin[j], LOW);}delayMicroseconds(stepperPulse_delay);}//步进电机转动函数,参数 dir_xy:步进电机转动方向,steps:步进电机转动步数void stepper_move(int dir_xy, int steps){for(int i=0;i<abs(steps);i++){switch(dir_xy){case 0:stepper_dir(1, 1, 0, 0);break;case 1:stepper_dir(1, 0, 1, 0);break;case 2:stepper_dir(0, 0, 1, 1);break;case 3:stepper_dir(0, 1, 0, 1);break;default:break;  }  }}//舵机抬笔函数void penUp(){myServo.write(penZup);}//舵机落笔函数void penDown(){myServo.write(penZdown);}

5. 资料内容

​① 画图-例程源代码
​② 画图-样机3D文件
​资料内容详见:四福来轮全向底盘(十字)

四福来轮全向底盘实现画图功能相关推荐

  1. 四福来轮全向底盘实现写字功能

    1. 功能说明 本文示例将实现R310b样机四福来轮全向底盘绘制"探索者"空心字的功能. 2. 电子硬件 本实验中采用了以下硬件: 主控板 Basra主控板(兼容Arduino U ...

  2. 四福来轮全向底盘运动功能的实现

    1. 运动功能说明 本文示例采用R310a样机,是一款十字分布型四福来轮全向底盘.它可以实现各个方向的平移运动以及转向运动. 全向福来轮底盘的一个特点是可以灵活的全向移动,四轮全向轮的全向移动需要四个 ...

  3. 三轮全向底盘实现绘图功能

    1. 功能说明 本文示例将实现R313a样机三轮全向底盘绘图(三角形.矩形.三叶草.正弦曲线)的功能.三轮全向底盘绘制图形有两种模式:第一种是自主选择模式(即通过按下开关进行模式的选项):第二种是上位 ...

  4. SLAM导航机器人零基础实战系列:(四)差分底盘设计——2.stm32主控软件设计

    SLAM导航机器人零基础实战系列:(四)差分底盘设计--2.stm32主控软件设计 摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买 ...

  5. SLAM导航机器人零基础实战系列:(四)差分底盘设计——5.底盘PID控制参数整定

    SLAM导航机器人零基础实战系列:(四)差分底盘设计--5.底盘PID控制参数整定 摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买 ...

  6. 三轮全向底盘实现SLAM导航功能

    1. 功能说明 本文我们将利用键盘控制三轮全向底盘(R313b)小车运动完成slam建图,并能在已建好的地图里进行自主导航.slam导航可以拆分为三步: 第一步:能用键盘控制底盘的运动: 第二步:基于 ...

  7. STM32三轮全向底盘

    STM32三轮全向底盘 最近在实验室培训,玩过麦克纳姆四轮底盘后,玩三轮全向底盘也有一段时间了,于是来分享一下自己的心得. 附图 这是去年参加robocon的底盘,三个大疆3508电机,一个全场定位模 ...

  8. 计算机作品画图板软件四年级,四年级计算机《用画图软件画画》.doc

    四年级计算机<用画图软件画画>.doc (4页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 7.9 积分 用"画图"软件 ...

  9. 计算机画图水印怎么可以消除,win10系统使用画图功能去除图片水印的解决步骤...

    win10系统使用久了,好多网友反馈说关于对win10系统使用画图功能去除图片水印设置的方法,在使用win10系统的过程中经常不知道如何去对win10系统使用画图功能去除图片水印进行设置,有什么好的办 ...

最新文章

  1. grep 正则表达式
  2. 国产数据库年终大盘点
  3. html百度转到顶部 fixed,科技常识:完美解决安卓端百度浏览器屏蔽fixed悬浮元素的问题...
  4. Improved Alpha-Tested Magnification for Vector Textures and Special Effects
  5. 性能测试工具_磁盘性能测试工具fio
  6. ubuntu如何编辑/etc/ld.so.conf
  7. c轴 t轴 l轴_从事数控工作的你知道3轴、3+2轴定位与5轴联动的区别吗?
  8. 2018.11.08 NOIP模拟 景点(倍增+矩阵快速幂优化dp)
  9. 作了一件超人品的事情,看到的各位都有好运
  10. NPOI导出 The maximum column width for an individual cell is 255 characters
  11. Java对象的强引用、软引用、弱引用和虚引用 笔记
  12. 【毕设】requests+bs4+re 爬取知网文献来源的信息
  13. 蝴蝶蓝暂排第一:第四届橙瓜网络文学奖20年十佳游戏大神
  14. CSS3 Shape详解
  15. 税务异常的公司如何办理注销?
  16. 小米路由器LuCI Web服务
  17. UE4之打开虚拟键盘
  18. CSS3 rgb and rgba(透明色)的使用
  19. 谷歌浏览器(Google Chrome)官方下载
  20. Javascript MVC —— View

热门文章

  1. if 条件判断语句的用法
  2. java常量的命名规则_java常量命名规则
  3. uni-app的canvas设置文字居中对齐center
  4. mysql5.7分组排序
  5. 无人机光流定位系列——(一)原理剖析
  6. 在XP下把win7安装到VHD,内存足够大可以RAMOS
  7. 如何获取ipa安装包
  8. java/php/net/python服装销售系统设计
  9. 【律联云知产课堂】商标注册的流程是啥?
  10. 活动回顾丨ALC Beijing 首场 Meetup:《开源到底有多难?》