写此博客的主要目的是为了记录下来调试过程中所遇到的问题,更重要的是记录下来解决遇到的那些问题的方法,以供之后此后遇到问题之参考。

该写字机器人或叫机械臂的主控芯片为STM32F103C8T6,机械臂拥有三个水平自由度,一个竖直自由度,该机械臂的关节处均用的是舵机驱动。

从此出发,我们便需要用STM32的定时器外设产生四路能够准确驱动舵机的PWM波。初始化定时器外设的部分代码如下。

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);// ①使能 tim3时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //①使能 GPIO 外设时钟使能

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM3_CH1

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K

TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为 TIMx 时钟频率除数的预分频值 不分频

TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //②初始化 TIMx

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //脉宽调制模式 2

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

TIM_OCInitStructure.TIM_Pulse=500; //设置待装入捕获比较寄存器的脉冲值

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高

TIM_OC1Init(TIM3, &TIM_OCInitStructure); //③初始化外设 TIMx

TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //CH1预装载使能

TIM_CtrlPWMOutputs(TIM3,ENABLE); //⑤MOE 主输出使能

TIM_ARRPreloadConfig(TIM3, ENABLE); //使能 TIMx 在 ARR 上的预装载寄存器

TIM_Cmd(TIM3, ENABLE); //④使能 TIM3

上面的程序便是产生了可以控制舵机的旋转的四路PWM信号由于篇幅原因只写了一路。舵机的控制周期为20ms,控制高电平的时间便可以让其转动,0.5ms对应-90°,1ms对应-45°…2.5ms对应+90°,最多到+90°。我使其初始化时让三个水平舵机处于-90°,一个竖直舵机处于0°(装配原因要使其水平于桌面)。

舵机设计的机械结构如下

先以舵机2为原点建立一个直角坐标系,现在的目标便是在该平面任意给定的两个点之间如何准确的画出一条直线,出于该机械结构的考虑,由于舵机不论怎样运动画出的均为曲线,所以只能将直线划分为很多小段,在每一小段上舵机运动画出的轨迹确为曲线,但若该小段非常微小,则在大的范围该直线上可以近似看作是一条曲线,若要精确绘制只需减小每一段微元的长度。

设置先初始位置,将舵机二三均设置为-90°,使机械臂伸展开来沿X周正方向,每个关节只能逆时针旋转。那么在所确定的第一象限的任意一个点(在臂展半径范围之内),便可计算出要达到该点俩个舵机应该所处的角度,那么将俩个水平舵机转到计算的应该所处的角度即可到达我们规定要转动到的位置坐标。

第一个函数实现的功能便是给定任意一个合理的目标点,我们便控制俩个水平舵机的角度将机械臂旋转至该点。具体物理量如下图

#define L1 11.2//LI臂长

#define L2 6.5//L2臂长

#define PI 3.1415926//PI

void set_XY(double x_1,double y_1)

{

delay_ms(1);

double m;//到原点长度

double a1;

double a2;

double a3;//其它角度变量

u16 s_1,s_2,s_3;//三个舵机的角度

m=sqrt(x_1* x_1 + y_1 * y_1);

a1= return_angle(L1, m, L2);//余弦定理

a2= atan2(x_1, y_1); //

a3=return_angle(L1, L2, m);

s_2=floor(((a2-a3)/PI)*2000+500);//第二个舵机的角度

s_3=floor(((PI-a1)/PI)*2000+500);//第三个舵机的角度

TIM_SetCompare2(TIM3,s_2);

//********改动*******

TIM_SetCompare3(TIM3,s_3);

delay_ms(200);//******改动*********

}

下面便设计第二个函数,该函数实现的是分很多微元从当前点移动到目标点,会套用之前写的第一个函数以实现。

void movepot(double x,double y,double prex,double prey )

{//prex prey 是当前位置坐标

double dx;double dy;//x,y坐标变化

double distance;

int c;

int i;

dx=x-prex;

dy=y-prey;

distance=sqrt(dx * dx + dy * dy);//两点距离

c=floor(6*distance);//1cm分6步走

if(c<1){c=1;}

for(i=0;i<=c;i++)

{

set_XY(prex + (i * dx / c), prey+ (i * dy / c));

printf("ok");

printf("现在坐标%f",(prex + (i * dx / c)));

printf("\r\n\r\n"); //串口发送数据方便调试

}

prex=prex+dx;

prey=prey+dy;//更新坐标

printf("初始坐标%f%f",prex,prey);

}

第三个函数实现抬笔落笔功能,代码如下

void lift(int sta)//1抬笔0落笔

{int i=0;

if(sta) { TIM_SetCompare4(TIM3,1700);delay_ms(1000); }

else

{for(i=0;i<=10;i++)

{TIM_SetCompare4(TIM3,2000-50*i);delay_ms(500);}}//慢慢落下

}

第四第五个函数便实现了使机械臂先抬笔之后以一个较慢的速度移动到目标点之后再慢慢落下(quikmove函数)

void movepotslow(double x,double y,double prex,double prey )//抬起来较快移动

{

double dx;double dy;//x,y坐标变化

double distance;

int c;

int i;

dx=x-prex;

dy=y-prey;

distance=sqrt(dx * dx + dy * dy);

c=floor(distance);

if(c<1){c=1;}

for(i=0;i<=c;i++)

{

set_XY(prex + (i * dx / c), prey+ (i * dy / c));

}

prex=prex+dx;

prey=prey+dy;//更新坐标

}

void quickmove(double x,double y,double prex,double prey)//快速移动先抬后落

{

lift(1);

delay_ms(500);

movepotslow(x,y,prex,prey);

lift(0);

}

设计了如上的函数之后我们便可以利用上述函数来进行绘制图形或者写字,画三角形的具体步骤举例如下:

quickmove(13,5,0,17.5);

//先调用此函数让笔从起始点快速抬笔移动到画三角形处再落笔

movepot(13,10,13,5);

//再调用此函数让笔从现在点(13,5)画到(13,10)

movepot(9,6,13,10);

//再调用此函数让笔从现在点(13,10)画到(9,6)

movepot(13,6,9,6);

//再调用此函数让笔从现在点(9,6)画到(13,6)三角形画好

本程序在调试过程中也遇到了很多问题,还有待解决的便是坐标定位的准确性问题。但写个正字三角形还是可以的。效果图如下

换根粗笔效果或许更好一点。调试的时候是一个一个函数试其能否完成该函数功能。

c语言写字机器人,写字机器人(基于STM32简易实现)相关推荐

  1. 基于STM32简易DIY智能聊天机器人

    前言 大二忙里偷闲,花了一个月左右自己利用了Python+ESP8266 DIY 了一个智能聊天机器人,调用的是图灵机器人的体验API,现在把DIY过程记录下来,希望能分享给别的对这方面有兴趣的人. ...

  2. 基于stm32简易计算机电路图,基于STM32的简易电子计算器设计与实现(DOC).doc

    嵌入式系统设计实验综合设计报告 PAGE 四川师范大学成都学院通信工程学院 基于STM32的简易电子计算器设计与实现 实验综合设计报告 学生姓名 陶龑 学 号 2016301033 所在学院 通信工程 ...

  3. 毕业设计 : 基于stm32的微信天气机器人 - 天气检测 环境监测 微信机器人

    0 简介 Hi,大家好,这里是三文工作室,今天向大家介绍一个 单片机项目 基于stm32的微信天气机器人 - 天气检测 环境监测 微信机器人 大家可用于 课程设计 或 毕业设计 print(" ...

  4. STM32毕业设计——基于STM32+JAVA+Android的六足机器人控制系统设计与实现(毕业论文+程序源码)——六足机器人控制系统

    基于STM32+JAVA+Android的六足机器人控制系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于STM32+JAVA+Android的六足机器人控制系统设计与实现,文章末尾附有 ...

  5. ros机器人写字,svg图片绘制,二三阶贝塞尔计算公式转代码

    ros机器人写字,svg图片绘制,二三阶贝塞尔 # ------------------------- 绘制二阶贝塞尔 -------------------------#def QuadraticB ...

  6. 基于STM32的四足机器人

    1.前言 因为今年暑假要参加电赛,报上了名,选好了指导老师,但是由于和指导老师不熟,所以此约了一个时间过去聊聊,顺便问问如何准备电赛,去了之后,老师交给我了一个任务,控制这个四足机器人进行运动,先前这 ...

  7. 双足竞走机器人的意义_基于STM32双足竞步机器人的研究与设计

    龙源期刊网 http://www.qikan.com.cn 基于 STM32 双足竞步机器人的研究与设计 作者:卢士林 李彩霞 张奎庆 段忠臣 来源:<智能计算机与应用> 2016 年第 ...

  8. 物联网毕业设计 - 基于STM32的轮足两用可变形环境感知探测机器人

    ⭐️基于STM32的轮足两用可变形环境感知探测机器人⭐️ STM32F405主控芯片 ZMOD4410气体传感器 无线图传模块 安卓手机APP 电机驱动模块 摄像头模块 霍尔传感器 LED模块 蜂鸣器 ...

  9. 基于STM32与PCA9685制作四足机器人(代码开源)

            前言:本文为手把手教学基于STM32的四足机器人项目--JDY-31蓝牙控制,特别地,本次项目采用的是STM32作为MCU.四足机器人的支架为3D打印件,SG90舵机驱动机器人实现姿态 ...

最新文章

  1. FPGA从Xilinx的7系列学起(7)
  2. 数据分析能力到底有多重要
  3. 自动undo管理下如何添加和删除回滚段
  4. Shell编程 ——for循环、if语句、sleep睡眠。——每秒钟生成一个文件,一共生成60个文件
  5. HUST-2015 Multi-University Training Contest 9
  6. JVM 调优 2:GC 如何判断对象是否为垃圾,三色标记算法应用原理及存在的问题?
  7. 17 类的成员 私有
  8. 苹果电脑分屏之后没有声音_MAC录屏没有声音? 如何在苹果电脑MACBOOK上录音录屏...
  9. 解决vue项目背景图片在IE和火狐上不显示的问题
  10. rp导入图片大小_Axure制作图像的放大与缩小效果的四种方式
  11. 【JQuery】两种失焦事件的使用
  12. 查找代码文件中的非 ASCII 字符
  13. mysql服务器相关命令
  14. ckeditor5 添加ckeditor5-line-height-plugin插件
  15. 网易云信携手神州信息,共同打造广东华兴银行线上视频平台
  16. 理解梅尔频谱(mel spectrogram)
  17. 智慧司法微信小程序项目
  18. 尚硅谷--Mysql--高级篇
  19. 视频AVI如何批量快速转换成MP4格式
  20. 总结2012和2013,展望2014

热门文章

  1. 怕扫描王泄露数据?5分钟自建一个文档扫描器。——基于opencv
  2. Android工程师进阶第五课 多线程锁,线程池和DVM/ART优化
  3. 年会特辑丨池龙:上海“一网通办”政务服务模式分享
  4. 开发者工具 箱 编程工具 dns加速器 LingMax https抓包改包劫持
  5. MTK MT6771处理器,helio P60芯片参考资料
  6. 电源输出的Overshoot和Undershoot 测试
  7. 斐波那契数列(入门c语言)
  8. 208计算机领域,中医药大学-计算机基础208版-1-7次作业.doc
  9. 《SysML精粹》学习记录--第十章
  10. Pytorch官方文档个人阅读总结