Report/Docs/2024-10-25
翟帅帅 abdfed5f9a Add Docs/2024-10-25/image/202410280032475.png 2024-10-28 00:32:39 +08:00
..
image Add Docs/2024-10-25/image/202410280032475.png 2024-10-28 00:32:39 +08:00
README.md 更新 Docs/2024-10-25/README.md 2024-10-28 00:05:58 +08:00

README.md

1.使用Visual Studio Code+PlatformIO IDE开发Arduino

Arduino

创建项目:

image-20241019004914430

测试代码:

image-20241019005248711

虽说不用选端口,还是存一下,以免日后要用:

image-20241019005322216

点击这个,下载并编译:

2aaa6101e539345f8b3bb52cc7f991a4

可以看到开发板上指示灯L每隔1秒闪烁1毫秒是代码中

delayMicroseconds(1000);

delay(1000);

控制的时间,而高低电平控制灯是否发光:

digitalWrite(13, HIGH);

digitalWrite(13, LOW);

arduino

在Arduino板子上测试会发现D13引脚指示灯按照程序设定闪烁。

PlatformIO库管理的例子

若我们想要使用TimerOne在调用的时候如果我们没有这个库就会出现无法调用的错误

image-20241023193533347

此时在platformio.ini中加入下面的代码然后点击进行编译就可以在控制台看到结果。

{5AA73C5D-0E01-45d3-8597-174674DD57FE}

然后,发现库可以正常调用了:

{89FCCDBD-97FC-4d14-BBCC-66DF69E3D2AF}

在下面的路径下找到了TimerOne

image-20241023194500197

2.SolidWorks安装与使用

2.1. URDF文件

URDF统一机器人描述格式文件是用于描述机器人的结构和属性的XML格式文件。它包含机器人的关节、链接、传感器和其他组件的信息。基本结构包括

  1. 链接link:定义机器人的每个部件的形状、质量、惯性等属性。
  2. 关节joint:定义链接之间的连接方式,包括类型(如旋转或滑动)和运动限制。
  3. 传感器sensor:描述机器人上安装的传感器,如摄像头或激光雷达。

以上的组件定义名称确定保持唯一。例如:

<robot name="example_robot">
    <link name="base_link">
        <inertial>
            <mass value="1.0"/>
            <inertia ixx="0.1" ixy="0.0" ixz="0.0" iyy="0.1" iyz="0.0" izz="0.1"/>
        </inertial>
        <visual>
            <geometry>
                <box size="1 1 1"/>
            </geometry>
        </visual>
    </link>
    
    <joint name="joint1" type="revolute">
        <parent link="base_link"/>
        <child link="link1"/>
        <axis xyz="0 0 1"/>
        <limit lower="0" upper="1.57" effort="10" velocity="1"/>
    </joint>
    
    <link name="link1">
        <visual>
            <geometry>
                <cylinder radius="0.1" length="1.0"/>
            </geometry>
        </visual>
    </link>
</robot>

2.2. SolidWorks

SolidWorks 是一款强大的 3D 计算机辅助设计CAD软件广泛应用于工程和产品设计。它提供了多种功能包括

  1. 3D建模用户可以创建复杂的3D模型通过拉伸、旋转、切割等操作。

  2. 装配:允许将多个零件组合成一个完整的装配体,并进行运动分析。

  3. 工程图从3D模型生成2D工程图提供详细的尺寸和注释。

  4. 仿真:可以进行结构分析、热分析和流体动力学分析等,验证设计的性能。

  5. 零件库:提供标准零件库,方便快速设计和装配。

    安装:SolidWorks2022 安装教程_solidworks2022安装教程-CSDN博客

如果遇到文章描述的问题,可以参考:[【亲测有效】无法获得下列许可 SOLIDWORKS Standard 无效的(不一致的) 使用许可号码 (-8,544,0)_无法获得下列许可solidworks standard-CSDN博客](https://blog.csdn.net/weixin_41717861/article/details/136000671?ops_request_misc=&request_id=&biz_id=102&utm_term=SolidWorks安装 无效的许可号码-8544&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-136000671.142^v100^pc_search_result_base2&spm=1018.2226.3001.4187)

image-20241024011734839

安装插件URDFexporter

image-20241024104319660

image-20241024104724792

安装成功后,会多出来一个插件:

image-20241024104921939

3.编码器与PID控制

3.1.编码器

编码器是一种传感器,用于测量和获取机器人运动的信息,例如位置、速度或角度等。

码盘:码盘是用于测量角位移的数字编码器。

编码器主要有绝对式编码器和增量式编码器两种类型:

3.1.1 绝对式编码器

通过对码盘的各个位置设计特定的编码,可以输出转动轴的绝对位置信息。

image-20241024145232819

1.每个位置都有唯一的编码值,通常以二进制、十六进制或其他编码方式表示。

2.能够在任何时候提供绝对位置,断电后也不丢失信息。

3.适合需要高精度和可靠性的应用。

3.1.2 增量式编码器

无法直接得到轴的绝对位置信息。对于轴的每一圈转动增量式编码器提供一定数量的脉冲通常编码器参数中用n线/n脉冲来表示。通过测量脉冲的数量可以得到旋转的角度或者测量单位时间内的脉冲数可以得到轴的转速。

脉冲的个数也可以用于表示位移的大小。但是增量式编码器断电后可能会丢失部分信息。

image-20241024152622800

2-相脉冲Two-phase Pulse是一种编码器或传感器的输出信号类型通常用于检测旋转或线性运动的方向和速度。它广泛应用于增量式编码器中。在2-相脉冲信号中,编码器产生两路方波信号,分别称为 A相B相并且这两个信号之间有一个90度的相位差。通过比较A相和B相的脉冲顺序可以确定旋转的方向而通过计算脉冲数可以得到运动的速度。

可以通过相位的关系判断旋转的方向;可以通过比较两个相位的先后顺序判断运动的方向。

可以通过一段时间的脉冲数量计算出运动的速度。

编码器的分辨率越高,每转的脉冲数越多,检测的精度也越高。

image-20241024152635500

3.1.3 4倍频

4倍频指的是控制器在处理编码器信号时,不仅检测每个信号的上升沿或下降沿,而是检测A相和B相的每一个上升沿和下降沿从而将编码器的分辨率提高到4倍。对AB相的上升沿和下降沿均作检测这样在一个周期内有四种状态

image-20241024153348494

在这一个周期中,四个状态按照顺序分别为:

A相上升沿对应B相低电平B相上升沿对应A相高电平A相下降沿对应B相高电平B相下降沿对应A相低电平

此时旋转方向为正向。

相应地:

旋转方向为反向时B相上升沿对应A相低电平 -> A相上升沿对应B相高电平 -> B相下降沿对应A相高电平 -> A 相下降沿对应B相低电平。

3.1.4 测试代码 实现4倍频

#include <Arduino.h> 
#define Phase_A 2   
#define Phase_B 3   

unsigned long time; 
long Position = 0; 

boolean A = false; 
boolean B = false; 
//定义A相引脚 
//定义B相引脚 

void Interrupt_A(){  
    if(A == false){ 
        if( B == false){Position = Position + 1;A = true;} 
        else{Position = Position - 1;A = true;} 
    } 
    else{ 
        if( B == false){Position = Position - 1;A = false;} 
        else{Position = Position + 1;A = false;} 
    } 
} 

void Interrupt_B(){  
    if(B == false){ 
        if( A == false){Position = Position - 1;B = true;} 
        else{Position = Position + 1;A = true;} 
    } 
    else{ 
        if( A == false){Position = Position + 1;B = false;} 
        else{Position = Position - 1;B = false;} 
    } 
} 

void setup() 
{ 
    pinMode(Phase_A, INPUT_PULLUP);//内部上拉,防止信号干扰 
    pinMode(Phase_B, INPUT_PULLUP); 
    attachInterrupt(0, Interrupt_A, CHANGE);//检测上升沿、下降沿 
    attachInterrupt(1, Interrupt_B, CHANGE);//检测上升沿、下降沿 
    Serial.begin(115200); //初始化Arduino串口 
} 

void loop(){ 
    time = millis(); 
    if(time%30 == 0){ 
        Serial.println(Position,DEC); 
    } 
}

与文档中的代码不一样在Interrupt_A()和Interrupt_B()中更新A/B相信号的代码中使用了==实际上应该是赋值语句所以改为了A=true。除此之外将这两个处理信号的函数设置在setup之前保证程序正常编译。

image-20241024181003880