树莓派3b+ 舵机驱动开发
Posted winhaus
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树莓派3b+ 舵机驱动开发相关的知识,希望对你有一定的参考价值。
设备:树莓派 3b+
操作系统:Raspbian
远程访问:SSH
舵机型号:MG90S
使用语言:C,使用wiringPi库。
遇到的难点:
1. PWM频率计算
2. 命令行参数传入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 ", 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 != ‘ ‘) { a++; cnt++; } //printf("%d ",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; }
以上是关于树莓派3b+ 舵机驱动开发的主要内容,如果未能解决你的问题,请参考以下文章
《树莓派项目实战》第十二节 使用PCA9685驱动板控制多个舵机