树莓派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\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;
}

  

  

原文地址:https://www.cnblogs.com/winhaus/p/12236076.html

时间: 2024-10-11 14:02:12

树莓派3b+ 舵机驱动开发的相关文章

python代码实现树莓派3b+驱动步进电机

python代码实现树莓派3b+驱动步进电机 之前买了个树莓派,刚买回来那会儿热情高涨,折腾了一段时间,然后就放哪吃灰了.前几天忽然想起来这个东西了,决定再玩玩儿,于是就从某宝上购买了一套步进电机.驱动板.东西收到后就开始折腾研究,下边来总结下折腾的结果吧. 先来说下都需要什么吧,树莓派的这一套都少不了,树莓派3b+主板.TF卡.树莓派电源.步进电机以及对应的驱动板.杜邦线6根(母对母),差不多就这么多吧. 引脚 首先,我们先看下树莓派的40个Pin都是什么功能吧!可以通过过树莓派的命令行窗口来

《Linux设备驱动开发具体解释(第3版)》(即《Linux设备驱动开发具体解释:基于最新的Linux 4.0内核》)网购链接

<Linux设备驱动开发具体解释:基于最新的Linux 4.0内核> china-pub   spm=a1z10.3-b.w4011-10017777404.30.kvceXB&id=521111707813&rn=4cf013961288ab7c4dfd2016aeb21fa8&abbucket=5">天猫     dangdang   京东 China-pub 8月新书销售榜 推荐序一 技术日新月异,产业斗转星移,滚滚红尘,消逝的事物太多,新事物的诞

树莓派3B+上运行.Net Core项目

最近买了个树莓派3B+,准备把自己写的一个.Net Core爬虫挂在上面跑 买之前没有想到树莓派因为是今年新出的,导致驱动以及系统啥的都不是很完善,导致走了很多弯路,早知道买树莓派3就不用那么多折腾了 首先买来之后安装了树莓派的官方系统,跑了下数据库emmm 左边是树莓派上进行的数据库增删改减的计时,单位是毫秒,右边是台式机上面跑的速度,可以说性能还是相当不满意的(其中相当大的消耗是在创建数据库上) 然后我当然不能忍,于是就准备换一个我熟悉的Ubuntu系统试试会不会是系统原因造成的这种情况 换

第一次接触树莓派——树莓派3B+开箱以及刷写系统

作为一个自动化学生,接触单片机比较多,比如最早接触的STC89CRC,到现在爱不释手的STM32F4系列.不过单片机永远也是单片机,为了满足低功耗,廉价的设计需求,性能上必须有所牺牲和妥协. 不过,前一阵子在某网站申请试用了一块树莓派3B+,树莓派虽然叫做单板机(单板计算机)但是由于它拥有大量的IO资源,在使用的时候也可以当作一个功耗大,性能强的单片机来使用. 首先是开箱环节: 树莓派的包装很简约,就一个纸盒子,里面装着树莓派主板和一本多国语言的说明书.将主板拿近观看,可以看到树莓派上惊人的资源

intel Z8300 2G 32G小主机跟树莓派3B的功耗/性能对比

具体硬件平台就不详细说了,浪费时间码字,贴一个淘宝上的配置: 有点广告的既视感,哈哈,不过我200块咸鱼收的2手,配置比这个稍低,比如CPU是Z8300,网卡是百兆的,WIFI可能也不是双频的(这个不确定. 因为linux下这玩意没驱动起来)不过我买回来不是做NAS,只是想搞个7*24在线的小服务器,映射到外网做一点小服务.所以配置差点也无所谓的样子 先来个待机功耗图: 待机2.0瓦.不过这个是算上这个220V/5V 3A的效率的,因为电源的总功率是15W(5V/3A)而目标功率小于3W,所以也

Windows驱动开发基础(八)内存管理

Windows驱动开发基础系列,转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/38826159 就32位的计算机来说,他有4G的真实的物理内存.但是这样是不够的,于是引入了虚拟内存的概念.使得每一个进程都有4G的虚拟内存. 虚拟内存实际上就是采用了一种映射的方式.4G的内存实际上被分页.一般来说一个页的大小是4K.也是说它被分为了1M个页.在这么多的页里面,有一部分是对应于物理内存的(可以是多对一的):有一部分是对应于磁盘上的空间,但

如何使用windows远程桌面控制树莓派3B

文章开头先来吐槽一下网上的免费教程.虽然现在是信息时代,我们可以在网上学习各种各样的知识.但是网上的教程鱼龙混杂,缺少时间有效性.甚至有些纯粹是误导,只看到结果,根本不披露实现过程.这一点要鄙视一下.       在实际操作过程中,你会遇到很多问题,这些问题对于还是小白的你来说,如果百度查不到,那就会打击你对树莓派的信心,加速树莓派吃灰的进程.所以,我会不定期的更新树莓派3b 的教程,教你一步一步的玩转树莓派!每一篇文章我都会注明更新日期,方便大家查阅.好,闲言少叙,开始今天的正题:树莓派3B(

如何成为优秀的驱动开发工程师

或许这样的标题,应该是由像Linus或Greg KH这样的大师级的高手才有资格写的吧.但是作为我来说,也许我更想把这个标题作为一个疑问句来使用,整理一下自己的认识,用来勉励自己,和大家一起努力实现这个目标.认识肤浅的地方,还请大家见谅. 何谓优秀的驱动开发工程师 首先要定义,我所认为的一个优秀的驱动开发工程师,应该具备什么样的能力,这里列一下按照从易到难的顺序,个人认为应该会有几个方面的要求吧: 能够独立完成驱动的功能开发任务 能够分析和优化驱动的性能,针对特定硬件扬长避短 能够充分了解模块相关

TDD测试驱动开发

TDD测试驱动开发 一.概念 TDD故名思意就是用测试的方法驱动开发,简单说就是先写测试代码,再写开发代码.传统的方式是先写代码,再测试,它的开发方式与之正好相反. TDD是极限编程的一个最重要的设计工具之一,使得我们编码的目的更加明确.而极限编程的另一个最重要的工具—重构.重构改变的是代码的内部结构,而不会改变外部接口功能.一整套完备的测试用例可以保证我们的程序更加健壮,功能更加完善. 二.作用 站在用户使用的角度去思考如何完成产品设计,强迫开发人员事先思考完善的测试用例并提供不考虑细节的外部