Orangepi Zero2使用外设驱动库wiringOP配合定时器驱动SG90舵机

目录

一、舵机的基本认知和硬件接线

1.1 舵机的基本认知:

1.2 硬件接线:

1.3 怎么控制舵机旋转不同的角度:

二、Linux定时器

2.1 定时器setitimer()函数原型和头文件:

2.2 信号处理函数signal()原型和头文件:

2.3 定时器setitimer()函数应用实例:

2.4 使用wiringOP库配合定时器驱动舵机旋转0-180°:


一、舵机的基本认知和硬件接线

1.1 舵机的基本认知:

如下图所示:是一个SG90舵机,常用三根或者四根接线,红色为电源VCC棕色为电源GND黄色为PWM信号

控制用处:垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等常见的有0-90°、0-180°、0-360°

1.2 硬件接线:

1.3 怎么控制舵机旋转不同的角度:

  • 向黄色信号线“灌入”PWM信号PWM波的频率不能太高,50hz,即周期=1/频率=1/50=0.02s20ms左右数据:不同的PWM波形对应不同的旋转角度,以20ms为周期,50hz为频率的PWM波

定时器需要定时20ms,关心的单位0.5ms, 20ms = 0.5ms * 40

二、Linux定时器

2.1 定时器setitimer()函数原型和头文件:

/*	setitimer 是一个UNIX系统上的系统调用函数,用于设置和管理定时器。它通常用于定期触发信号或执行某些操作	*/
#include <sys/time.h>int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);int 		函数返回值,成功执行时返回0,失败返回-1int whic	指定要设置的定时器类型,可以是 ITIMER_REAL、ITIMER_VIRTUAL 或 ITIMER_PROF 中的一个
1. ITIMER_REAL 		//数值为0,计时器的值实时递减,发送的信号是SIGALRM。
2. ITIMER_VIRTUAL 	//数值为1,进程执行时递减计时器的值,发送的信号是SIGVTALRM。
3. ITIMER_PROF 		//数值为2,进程和系统执行时都递减计时器的值,发送的信号是SIGPROF。struct itimerval *new_value		一个struct itimerval结构,用于指定新的定时器值。struct itimerval 结构定义如下:struct itimerval {struct timeval it_interval;  // 定时器重复的间隔时间struct timeval it_value;     // 定时器的初始值
};it_interval		计时器的初始值,一般基于这个初始值来加或者来减,看控制函数的参数配置
it_value		程序跑到这之后,多久启动定时器struct timeval {  __time_t      tv_sec;   /* 秒 */  __suseconds_t tv_usec;  /* 微秒 */  
};struct itimerval *old_value		一个struct itimerval 结构,用于存储旧的定时器值(可选参数)/*
函数说明:
实现定时器,通过itimerval结构体以及函数setitimer产生的信号,系统随之使用signal信号处理函数来处理产生的定时信号。从而实现定时器。
*/

2.2 信号处理函数signal()原型和头文件:

/*Linux下 man 2 signal查看手册
*/
#include <signal.h>typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);sighandler_t			函数返回值,返回信号处理程序的前一个值,或者在错误时SIG ERR。如果发生错误,则设置errno来指示原因。int signum				指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号sighandler_t handler	描述了与信号关联的动作,它可以取以下三种值:  1. 一个无返回值的函数地址
此函数必须在signal()被调用前声明,handler中为这个函数的名字。当接收到一个类型为signum的信号时,就执行handler 所指定的函数。这个函数应有如下形式的定义:
void handler(int signum);2. SIG_IGN
这个符号表示忽略该信号,执行了相应的signal()调用后,进程会忽略类型为sig的信号。3. SIG_DFL
这个符号表示恢复系统对信号的默认处理。

2.3 定时器setitimer()函数应用实例:

实现的功能是:1秒后打开定时器,然后每隔一秒打印一次Hello

#include <stdio.h>          // 包含标准输入输出库,用于输入输出操作
#include <sys/time.h>       // 包含时间处理库,用于获取系统时间
#include <stdlib.h>         // 包含标准库,用于内存分配和程序终止等操作
#include <signal.h>         // 包含信号处理库,用于处理系统信号static int i = 0;                                                                               //全局变量i void signal_handler(int signum)                                                             //信号处理函数
{i++;if(i == 2000){                                                                             //每2000次触发一次printf("Hello\n");i = 0;}
}int main()
{struct itimerval itv;                                               		//定义一个itimerval结构体变量//设定定时时间itv.it_interval.tv_sec = 0;itv.it_interval.tv_usec = 500;                                                     //每隔0.5毫秒触发一次 //设定启动定时器时间itv.it_value.tv_sec = 1;                                                             //启动定时器1秒后触发    itv.it_value.tv_usec = 0;               //设定定时方式//int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);if(setitimer(ITIMER_REAL, &itv, NULL) == -1){                                        //设置定时器  perror("setitimer");exit(-1);}//信号处理signal( SIGALRM, signal_handler);                                                     //设置信号处理函数while(1);return 0;
}

2.4 使用wiringOP库配合定时器驱动舵机旋转0-180°:

#include <stdio.h>          // 包含标准输入输出库,用于输入输出操作
#include <sys/time.h>       // 包含时间处理库,用于获取系统时间
#include <stdlib.h>         // 包含标准库,用于内存分配和程序终止等操作
#include <signal.h>         // 包含信号处理库,用于处理系统信号
#include <wiringPi.h>       // 包含WiringPi库,用于控制GPIO#define SG90Pin 5           // 定义SG90的引脚号static int i = 0;                                                        	//全局变量i 
int jd;                                                                   	//全局变量jd void signal_handler(int signum)                                            	//信号处理函数
{if(i <= jd){digitalWrite(SG90Pin, HIGH);                        				//设置SG90引脚为高电平}else{digitalWrite(SG90Pin, LOW);                          				//设置SG90引脚为低电平}if(i == 40){                                                    //每40次信号处理函数被调用一次,输出一次当前时间i = 0;                                              				//i归零}i++;
}int main()
{struct itimerval itv;                                                  	//定义一个itimerval结构体变量jd = 0;                                                                 //初始化jd为0    wiringPiSetup();                                                     	//初始化WiringPi库pinMode(SG90Pin, OUTPUT);                                             	//设置SG90引脚为输出模式//设定定时时间itv.it_interval.tv_sec = 0;itv.it_interval.tv_usec = 500;                                         	//每隔0.5毫秒触发一次 //设定启动定时器时间itv.it_value.tv_sec = 1;                                          		//启动定时器1秒后触发    itv.it_value.tv_usec = 0;               //设定定时方式//int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);if(setitimer(ITIMER_REAL, &itv, NULL) == -1){                      		//设置定时器  perror("setitimer");exit(-1);}//信号处理signal( SIGALRM, signal_handler);                                      	//设置信号处理函数while(1){printf("请输入你想要的角度: 1-0 2-45 3-90 4-135 5-180\n");scanf("%d",&jd);                                                 	 //输入角度   }return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/863879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

<电力行业> - 《第10课:变电》

1 变电 变电环节&#xff0c;顾名思义就是改变电压的环节&#xff0c;主要是在变电站和变电所完成的。变电站和变电所主要区别在于&#xff1a;变电站比变电所更大。 发电厂的变压器和配电变压器也属于“变电”&#xff0c;但我们在说电网环节时&#xff0c;变电特指电网公司…

【STM32嵌入式系统设计与开发---传感器拓展】——1_4_标准库FreeRTOS移植实验

目录 雅俗理解源码下载链接知识拓展步骤1&#xff1a;stm32f103vet6移植freeRTOS步骤:&#xff08;1&#xff09;准备开发环境&#xff08;2&#xff09;添加FreeRTOS移植 致谢 雅俗理解 雅&#xff1a;FreeRTOS是一个开源的实时操作系统&#xff08;RTOS&#xff09;&#xf…

RabbitMQ-交换机的类型以及流程图练习-01

自己的飞书文档:‌‍‬‍‬‍​‍‬​⁠‍​​​‌⁠​​‬‍​​​‬‬‌​‌‌​​&#xfeff;​​​​&#xfeff;‍​‍​‌&#xfeff;⁠‬&#xfeff;&#xfeff;&#xfeff;​RabbitMQ的流程图和作业 - 飞书云文档 (feishu.cn) 作业 图片一张 画rabbit-mq 消息发…

测试开发工程师需要掌握什么技能?

测试开发工程师是软件开发中至关重要的角色之一。他们负责编写、维护和执行自动化测试脚本、开发测试工具和框架&#xff0c;以确保软件的质量和稳定性。为了成为一名优秀的测试开发工程师&#xff0c;你需要掌握以下技能&#xff1a; 1. 编程技能&#xff1a; 作为测试开发工…

LabVIEW程序员应该怎么提高自己的工作能力?

作为一名LabVIEW程序员&#xff0c;提升工作能力可以从以下几个方面入手&#xff1a; 1. 深入理解LabVIEW基础 掌握LabVIEW编程语言&#xff1a;熟悉LabVIEW的图形化编程方式&#xff0c;理解其数据流编程模型。熟悉常用的VI&#xff08;虚拟仪器&#xff09;和函数&#xff1…

计算机网络原理及应用

第一章 计算机网络概述 【1】局域网 局域网是指在某一区域内由多台计算机互联而成的计算机通信网络。 【1】互通 两个网络之间可以交换数据。 第二章 计算机网络的体系结构 【1】语义 何时发出何种控制信息&#xff0c;完成何种动作以及做出何种响应。 【2】简述网络协…

有没有比较好用的网页3D应用程序在线编辑器?

问&#xff1a;three.js是当前主流的网页3d开发框架&#xff0c;但three.js的editor功能比较粗糙。国内有没有比较容易上手功能类似Unity3D的网页3D编辑软件&#xff0c;可以通过实体组件系统来完成程序扩展&#xff0c;简单拖拉拽完成3D场景、常用特效和用户交互的构建&#x…

大模型压缩-LoRAP

这里写目录标题 1.多头注意力和FFN的权重分布2 多头矩阵的低秩分解FFN无梯度通道剪枝 这篇文章 1期望找到一个“剪枝&#xff0b;低秩分解”的路子&#xff0c;使结构化剪枝达到非结构化剪枝的性能。 1.多头注意力和FFN的权重分布 Fig. 1.1 多头注意力权重矩阵 从Fig.1.1可以看…

清华大学世界排名:2025QS世界大学排名第20名

近日&#xff0c;国际高等教育研究机构QS Quacquarelli Symonds正式发布了2025QS世界大学排名&#xff0c;其中麻省理工学院连续第13年蝉联榜首&#xff0c;北京大学排名由去年的全球第17上升至全球第14名&#xff0c;清华大学位列2025QS世界大学排名第20名&#xff0c;以下是查…

2024.6.30周报

目录 摘要 ABSTRACT 一、文献阅读 一、题目 二、摘要 三、模型架构 四、文章解读 一、Introduction 二、创新点 三、RBM 四、贪心算法 五、实验 六、结论 二、代码复现 总结 摘要 本周我阅读了一篇题目为Generative Pre-Trained Physics-Informed Neural Netwo…

ThreadPoolExecutor 线程回收时机详解

个人博客 ThreadPoolExecutor 线程回收时机详解 | iwts’s blog 总集 想要完整了解下ThreadPoolExecutor&#xff1f;可以参考&#xff1a; 基于源码详解ThreadPoolExecutor实现原理 | iwts’s blog Worker-工作线程管理 线程池设计了内部类Worker&#xff0c;主要是用来…

点餐|外卖订餐小程序|基于微信小程序的外卖订餐系统设计与实现(源码+数据库+文档)

点餐|外卖订餐小程序目录 目录 基于微信小程序的外卖订餐系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户微信端功能模块 2、管理员服务端功能模块 3、商家务端功能模块 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设…

重生奇迹MU 正确获取金币的方式

在游戏中&#xff0c;需要消耗大量的金币来购买红药等物品。因此&#xff0c;如何快速赚取金币也成为玩家关注的问题。您知道有哪些方法可以快速地获得金币吗&#xff1f; 一、哪个地图上是最适合打金币的很关键 在选择打钱的地方时&#xff0c;不能盲目行动&#xff0c;需要…

【C++开发必备工具】Dependency Walker与Dependencies

Dependency Walker 与 Dependencies 1. Dependency Walker1.1 功能特点1.2 使用方法1.3 注意事项 2. Dependencies2.1 功能特点2.2 使用方法2.3 注意事项 3. 总结 1. Dependency Walker Dependency Walker 是一个免费软件工具&#xff0c;用于查看 Windows 应用程序的模块&…

[数据集][目标检测]婴儿状态睡觉哭泣检测数据集VOC+YOLO格式7109张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;7109 标注数量(xml文件个数)&#xff1a;7109 标注数量(txt文件个数)&#xff1a;7109 标注…

leetCode.96. 不同的二叉搜索树

leetCode.96. 不同的二叉搜索树 题目思路 代码 // 方法一&#xff1a;直接用卡特兰数就行 // 方法二&#xff1a;递归方法 class Solution { public:int numTrees(int n) {// 这里把 i当成整个结点&#xff0c;j当成左子树最左侧结点,并一次当根节点尝试// f[ i ] f[ j - 1…

基于Java的会员制医疗预约服务管理信息系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java技术ssm框架&#xff0c;结合JSPM工作流引擎 工具&#xff1a;IDEA/Eclipse、Navicat、Maven …

10大内网安全管理系统!企业内网安全必备系统

内网安全管理系统对于维护企业网络安全至关重要&#xff0c;它们帮助监控、管理内部网络资源&#xff0c;防止数据泄露和安全威胁。以下是十款知名的内网安全管理系统。 1. 安企神终端安全管理系统 详细介绍&#xff1a; 安企神是针对企业内网安全需求设计的一款综合管理系统&…

记一次windows 资源管理器 explorer.exe无限重启(桌面2秒一直刷新)问题的排查

一. 现象 进入锁屏界面一切正常&#xff0c;输入密码进入桌面后&#xff0c;开始无限刷新&#xff0c;无法正常操作&#xff0c;任务栏也不显示。CtrlAltDel 打开任务管理器&#xff0c;可见windows资源管理器进程时而出现&#xff0c;时而消失。进入安全模式一切正常。window…

kubernetes中使用Helm搭建Redis集群

1. 环境要求 首先需要有kubernetes集群环境&#xff0c;搭建kubernetes集群可以使用kubeSphere、kubespray等工具安装集群。其次要安装helm&#xff0c;并且添加了可用的Chart仓库 2. 确认合适的Chart包 helm官网上搜索redis 找到Star数多的Chart包&#xff0c;一类是redis包…