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;变电特指电网公司…

嵌入式软件常用测试工具

嵌入式软件常用的测试工具和方法可以总结如下&#xff1a; 测试工具 GDB&#xff1a; 描述&#xff1a;GDB是一个开源的调试工具&#xff0c;常用于GNU编译器集合中&#xff0c;支持多种编程语言&#xff0c;如C、C、Java等。功能&#xff1a;通过命令行与目标应用程序进行交…

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

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

支持向量机(SVM)在机器学习中的简单示例

目录 工作原理 核函数 SVM用于分类 结果分析 结论 ❤❤❤动动发财的小手点点赞点点关注哦~~~❤❤❤ 支持向量机是一种强大的监督学习模型&#xff0c;用于分类和回归任务。它通过找到数据点之间的最优边界来区分不同的类别。SVM特别适用于那些具有清晰边界但线性不可分的…

Codeforces Beta Round 7 C. Line 题解 数论 扩展欧几里得

Line 题目描述 A line on the plane is described by an equation A x B y C 0 AxByC0 AxByC0 . You are to find any point on this line, whose coordinates are integer numbers from − 5 ⋅ 1 0 18 -510^{18} −5⋅1018 to 5 ⋅ 1 0 18 510^{18} 5⋅1018 inclusiv…

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】简述网络协…

redis删除通配的keys

删除通配kubiex:market:history_data_swap_的所有key 注&#xff1a;如果有很多键&#xff0c;手动删除会比较麻烦&#xff0c;可以使用 Lua 脚本来批量删除&#xff1a; ~# redis-cli -h ip -a 127.0.0.1:6379> EVAL "return redis.call(del, unpack(redis.call(keys…

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

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

【PYG】使用datalist定义数据集,创建一个包含多个Data对象的列表并使用DataLoader来加载这些数据

为了使用你提到的封装方式来创建一个包含多个 Data 对象的列表并使用 DataLoader 来加载这些数据&#xff0c;我们可以按照以下步骤进行&#xff1a; 创建数据&#xff1a;生成节点特征矩阵、边索引矩阵和标签。封装数据&#xff1a;使用 Data 对象将这些数据封装起来。使用 D…

PyQt5之理解和使用Python中的qasync:连接Qt和asyncio的桥梁

理解和使用Python中的qasync&#xff1a;连接Qt和asyncio的桥梁 在Python编程世界中&#xff0c;将图形用户界面&#xff08;GUI&#xff09;与异步编程结合起来可能是一项具有挑战性的任务。这就是qasync发挥作用的地方&#xff0c;它是一个Python库&#xff0c;用于桥接Qt&am…

如何坚持做自己?

现在是23:15分&#xff0c;对很多人来说&#xff0c;夜生活才刚刚开始。但对于我来说&#xff0c;往往早已入眠。为何到这个点还没睡&#xff0c;敲下一个又一个文字。因为我相信若要有所成长&#xff0c;必定要对自己有所挑战。而每一个应该做而又没有做的事情&#xff0c;不管…

大模型压缩-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图 五、核心代码 六、论文参考 七、最新计算机毕设…

Kafka~高吞吐量设计

Kafka 之所以能够实现高性能和高速度&#xff0c;主要归因于以下几个关键因素&#xff1a; 分布式架构&#xff1a;Kafka 采用分布式架构&#xff0c;可以水平扩展&#xff0c;通过增加服务器节点来处理更多的流量和数据存储。顺序写入磁盘&#xff1a;Kafka 将消息顺序地写入…