shiro

SG90的调试和HC-SR04的配置
源代码#include <wiringPi.h> //树莓派的调用的头文件 #include &...
扫描右侧二维码阅读全文
13
2018/07

SG90的调试和HC-SR04的配置

源代码

#include <wiringPi.h>   //树莓派的调用的头文件
#include <stdio.h>
#include <sys/time.h>
#include <stdlib.h>

#define TRIG 0  //HC-SR04的发送接口
#define ECHO 2  //HC-SR04的接收端口
#define PWMPIN 1    //SG90的数据控制端口
#define VALUE 500   //SG90的起始宽度
#define STEP 167    //SG90的步长

int val = VALUE;
int step = STEP;


void setup();   //初始化
float disMeasure(); //距离计算函数
void servo();   //舵机的运行函数

//模块化设计每一块功能,必要时可以使用
int main(int argc, char *argv[])
{
    float dis; 
    setup();

    while(1){
        dis = disMeasure();
        printf("distance = %0.2f cm\n",dis);    //debug
        servo();
    }

    return 0;
}


/*
//struct timeval的数据结构
struct timeval  {  
__time_t tv_sec;        /* Seconds. */  
__suseconds_t tv_usec;  /* Microseconds. */  
};
*/

float disMeasure()  
{
    struct timeval tv1;
    struct timeval tv2;
    long start, stop;
    float dis;

    digitalWrite(TRIG, LOW);
    delayMicroseconds(2);   //微秒延迟

    digitalWrite(TRIG, HIGH);
    delayMicroseconds(10);

    digitalWrite(TRIG, LOW);

    while(!(digitalRead(ECHO) == 1));
    gettimeofday(&tv1, NULL);           //获取当前时间

    while(!(digitalRead(ECHO) == 0));
    gettimeofday(&tv2, NULL);           //获取当前时间

    start = tv1.tv_sec * 1000000 + tv1.tv_usec;   //微秒级的时间
    stop  = tv2.tv_sec * 1000000 + tv2.tv_usec;

    dis = (float)(stop - start) / 1000000 * 34000 / 2;  //求出距离,详细请看HC-SR04原理

    return dis;
}

void setup()
{
    //初始化
    if(wiringPiSetup() == -1){
        printf("setup wiringPi failed!\n");
        exit(1);
    }
    //端口设置
    pinMode(ECHO, INPUT);
    pinMode(TRIG, OUTPUT);
    pinMode (PWMPIN, OUTPUT);
}

void servo(){
    if(val > 2500 || val < 500)
        step =- step;
    val += step;

    digitalWrite(PWMPIN, HIGH); //这里详细,请看舵机原理
    delayMicroseconds(val);

    digitalWrite(PWMPIN,LOW);
    delayMicroseconds(20000 - val);

    delay(30);  //防止舵机旋转不到位,舵机旋转需要一定的时间

}


SG90 舵机

舵机的任务就是将HC-SR04旋转,是之能够将小车前的180°的障碍物信息充分收集,发送给树莓派,使之调整动力和方向信息。

我这里采用的舵机参数:

舵机是一种位置伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。其工作原理是:控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。

舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:

0.5ms-----------0°

1.0ms-----------45°

1.5ms-----------90°

2.0ms-----------135°

2.5ms-----------180°

我这里代码里是使用数字针脚,模拟PWM进行操作,对于这个舵机来说,只需要高电平和低电平,并不需要其中的其他参数,所以可以直接用数字阵脚模拟的PWM。
这个舵机的周期时间是20ms,就是意味着该舵机20ms完成一个任务,按照上面的对应关系,只要高电平与低电平时间之和为20ms即可。高电平部分按照上面的对应关系来,这其实是一个连续的线性函数之间的关系,你可以通过计算得到其他特殊角度的关系。对于我这个舵机来说,HC-SR04最小可识别的角度小于等于15°。那么我以15°为步长单位,即0.167ms作为一个测量单位可以将180°分为12个块,细节可以自己观察代码。舵机的任务已经完成。

HC-SR04 超声波接收和发送器

HC-SR04对于我们这辆小车来说,相当于眼睛,这是在预算有限下的选择,有预算的同学可以选择声纳,激光雷达等。

参数信息:

主要原理是通过发送的超声波在空气中传播,遇到障碍物反弹回来,再通过传感器接收。
距离的计算方法是通过s = vt;
v:声速。t需要经过计算,因为t为为两倍的时间,之后要除以二
在代码中,我是通过检测数字信号,结合电脑的时钟信息得到的最终信息,可能会有点误差。

Last modification:August 27th, 2018 at 02:38 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment