设备:树莓派 3b+
操作系统:Raspbian
远程访问:SSH
舵机型号:MG90S
使用语言:C,使用wiringPi库。
遇到的难点:
- PWM频率计算
- 命令行参数传入C代码时,char向int转换
舵机控制主要用到的函数介绍:
wiringPiSetup();
pinMode(1,PWM_OUTPUT); //only wiringPi pin 1 (BCM_GPIO 18) supports PWM
pwmSetMode(PWM_MODE_MS); // Set to mode: mark:space
pwmSetClock(192); //PWM clock: 19.2MHz, divisor 192:100KHz
pwmSetRange(2000); //period 20ms
pwmWrite(1,100);//go default position
舵机控制原理:
周期为20ms,占空比:1ms高电平(最小角度) - 2ms高电平(最大角度)。
从命令行传入的参数为字符串,需转为int类型,才能设置PWM。网上没有找到方便合适的转换函数,故自己编写int char2int(char *argv)。
本程序支持舵机从0 - 90度循环转动。(bash:sudo ./pwm)
本程序支持舵机设置固定角度。(bash:sudo ./pwm ##)
如: sudo ./pwm 90
#include "wiringPi.h"
#include "stdio.h"
void pwm_init();
int char2int(char *argv);
int main(int argc, char * argv[])
{
int i;
int Mode_inc;
pwm_init();
delay(1000);
i = 100;
Mode_inc = 1;
if(argc == 1)
{
while(1)
{
if((i < 200) && (Mode_inc == 1))
{
pwmWrite(1,i);
delay(50);
i = i+1;
}
else
{
Mode_inc = 0;
}
if(Mode_inc == 0)
{
pwmWrite(1,i);
delay(50);
i = i-1;
if(i < 101)
{
Mode_inc = 1;
}
}
}
}
if(argc == 2)
{
i = char2int(argv[1]);
printf("%d\n", i);
pwmWrite(1,i);
}
}
void pwm_init()
{
wiringPiSetup();
pinMode(1,PWM_OUTPUT); //only wiringPi pin 1 (BCM_GPIO 18) supports PWM
pwmSetMode(PWM_MODE_MS); // Set to mode: mark:space
pwmSetClock(192); //PWM clock: 19.2MHz, divisor 192:100KHz
pwmSetRange(2000); //period 20ms
pwmWrite(1,100);//go default position
}
int char2int(char *argv)
{
char * a;
char * b;
int cnt, cnt_tmp, i;
a = argv;
b = argv;
cnt = 0;
i = 0;
while(*a != '\0')
{
a++;
cnt++;
}
//printf("%d\n",cnt);
for(int j = cnt; j > 0; j--)
{
cnt_tmp = 1;
for(int k = 0;k < (j-1); k++)
{
cnt_tmp = 10 * cnt_tmp;
}
i = i + (*b - '0') * cnt_tmp;
b++;
}
return i;
}
来源:CSDN
作者:winhaus
链接:https://blog.csdn.net/weixin_46092768/article/details/104088960