一、简单认识遥控器
接下来我们要了解的是摇控器,你如果对摇控器有一定了解的话可能听说过“日本手”和“美国手”这两种不同的摇控器。其实它们并没有什么本质差别。假设我们的四轴已经可以成功的飞行,我们需要摇控器上的一个控制杆可以控制四个电机的整体转数,也就是人们常说的“油门”。当然,油门这个词用在四轴上可能不太贴切,它的作用就是控制电机转数,可快,可慢,而所谓的“日本手”摇控器是油门在右侧,“美国手”摇控器的油门则在左侧:
wiringPiSetup();
pinMode(15, INPUT);
void driver_ctl_LR()
{
//高电平开始
struct timeval start;
//高电平结束
struct timeval end;
int s = 0;
int f = 0;
//循环接收信号
while (1)
{
s = 0;
f = 0;
do
{
//读取引脚的值
int lr = digitalRead(15);
//如果是高电平则计时开始
if (lr == 1 && s == 0)
{
gettimeofday(&start, NULL);
s = 1;
}
//如果已经开始计时,并且读到低电平,说明信号读取结束
if (s == 1 && lr == 0)
{
//高电平结束(低电平)
gettimeofday(&end, NULL);
//计算高电平持续时间
long timer = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec);
//得到PWM信号做出相应动作
engine_lr_pwm(timer);
break;
}
//超时检测
if (s == 0 && lr == 0)
{
if (f == 0)
{
gettimeofday(&start, NULL);
f = 1;
}
//如果持续低电平
if (f == 1)
{
//如果低电平持续时间超过1秒,跳出
gettimeofday(&end, NULL);
long timer = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec);
if (timer > 1000000)
{
break;
}
}
}
}
while (1);
}
}
//设置摇控器3个通道到GPIO为输入引脚
pinMode(15, INPUT);
pinMode(16, INPUT);
pinMode(1, INPUT);
//注册摇控器3个通道的引脚变化中断
wiringPiISR(15, INT_EDGE_BOTH, &controller_ctl_pwm_fb);
wiringPiISR(16, INT_EDGE_BOTH, &controller_ctl_pwm_fb);
wiringPiISR(1, INT_EDGE_BOTH, &controller_ctl_pwm_fb);
void controller_ctl_pwm_fb()
{
//处理功能
}
void controller_ctl_pwm_lr()
{
//处理功能
}
void controller_ctl_pwm_pw()
{
//处理功能
}
void controller_ctl_pwm_fb()
{
//读取电平信号
s32 value = digitalRead(15);
//如果是高电平
if (value)
{
//计时开始
gettimeofday(&ctl_pwm->timer_start, NULL);
return;
}
//如果是低电平,计时结束
gettimeofday(&ctl_pwm->timer_end, NULL);
//计算高电平时长,即pwm占空比
timer = (ctl_pwm->timer_end.tv_sec - ctl_pwm->timer_start.tv_sec) * 1000000
+ (ctl_pwm->timer_end.tv_usec - ctl_pwm->timer_start.tv_usec);
}
欢迎关注公众号:编程外星人