wiringpi库的应用 -- sg90 定时器 oled

香橙派配合IIC驱动OLED & 使用SourceInsight解读源码 再次回顾香橙派硬件接线:根据之前的学习了解到,,在学习C52时我使用了代码模拟IIC协议,在学习STM32时我使用CubeMX直接可以配置IIC协议,,具体可以查看Linux系统的dev路径下的文件:可见,Linux系统自动封装了如GPIO,tty,i2c,等等重要的协议。且关于i2c有两个文件,i2c-3和i2c-5,根据引脚图,香橙派的SCL和SDA都是.3结尾,所以适用i2c-3:根据上图, 阅读详情

sg 90舵机:  

接线: 
VCC  --    红
GND --    地
信号线  -- 黄 -- pwm

定时器: 

 
 先玩定时器: sg90 需要的pwm波需要定时器输出,so我们得先来玩一下定时器

分析:实现定时器,通过itimerval结构体以及函数setitimer产生的信号,系统随之使用signal信号处理函数来处理产生的定时信号。从而实现定时器。


先看itimerval的结构体


setitimer()将value指向的结构体设为计时器的当前值,如果ovalue不是NULL,将返回计时器原有值。

struct itimerval
{
/* Value to put into `it_value' when the timer expires. */
struct timeval it_interval;
/* Time to the next timer expiration. */
struct timeval it_value;
};
 
it_interval:计时器的初始值,一般基于这个初始值来加或者来减,看控制函数的参数配置
it_value:程序跑到这之后,多久启动定时器

setitimer()

int setitimer (__itimer_which_t __which,
const struct itimerval *__restrict __new,
struct itimerval *__restrict __old)
setitimer()将value指向的结构体设为计时器的当前值,如果ovalue不是NULL,将返回计时器原有值。
which:三种类型
ITIMER_REAL //数值为0,计时器的值实时递减,发送的信号是SIGALRM。
ITIMER_VIRTUAL //数值为1,进程执行时递减计时器的值,发送的信号是SIGVTALRM。
ITIMER_PROF //数值为2,进程和系统执行时都递减计时器的值,发送的信号是SIGPROF。
很明显,这边需要捕获对应的信号进行逻辑相关处理 signal(SIGALRM,signal_handler);

返回说明:
成功执行时,返回0。失败返回-1

//perror 在stdlib.h中

=============================================


case: 实现定时器每隔一秒打印字符串


#include<stdio.h>
#include<sys/time.h>
#include<stdlib.h>
#include<signal.h>

static int i;
void signal_handler(int signum)
{
    i++;
    if(i==2000){//0.5ms *2000=1000ms =1s
        puts("mxjun");
        i=0;
    }

}


int main()
{
    struct itimerval itv;


    //设定定时器时间
    itv.it_interval.tv_sec=0;
    itv.it_interval.tv_usec=500;

    //设定开始生效时间,启动定时器的时间
    itv.it_value.tv_sec=1;
    itv.it_value.tv_usec=0;// 500us = 0.5ms

    //设定定时的方式 -- 一般ITIMER_REAL --数值为0,计时器的值实时递减,发送的信号是SIGALRM
    if(-1 ==setitimer(ITIMER_REAL,&itv,NULL)){
        perror("error");
        exit(-1);
    }

    //信号处理 -- 收到上面发的SIGALRM信号,用signal_handler去处理

    signal(SIGALRM,signal_handler);
    while(1);

    return 0;
}

============================================

 学会定时器的是使用后就能很快实现sg90了

 


sg90 实例:  输入一个数,让舵机旋转指定角度


#include<stdio.h>
#include<sys/time.h>
#include<stdlib.h>
#include<signal.h>
#include<wiringPi.h>

#define SG90 0  
int jd;

static int i;

// 在单片机中我们使用定时器中断来,处理,这里我们信号处理, 来绘制PWM波形
void signal_handler(int signum)
{

    if(i<=jd)
        digitalWrite(SG90,HIGH);
    else
        digitalWrite(SG90,LOW);
    if(i==40){//  20 ms
        i=0;
    }
    i++;

}


int main()
{
    struct itimerval itv;
    wiringPiSetup(); 
    pinMode(SG90,OUTPUT);
    jd=0;
    //设定定时时间
    itv.it_interval.tv_sec=0;
    itv.it_interval.tv_usec=500;

    //设定开始生效时间,启动定时器时间
    itv.it_value.tv_sec=1;
    itv.it_value.tv_usec=0;// 500us = 0.5ms

    //设定定时方式
    if(-1 ==setitimer(ITIMER_REAL,&itv,NULL)){// 这个递减宏对应返回的信号就是SIGALRM
        perror("error");
        exit(-1);
    }

    //信号处理

    signal(SIGALRM,signal_handler);
    while(1)
    {
      printf("input jd:1-0  2-45 3-90 4-135\n");
      scanf("%d",&jd);
    
    }

    return 0;
}

olde 

不了解诶olde的朋友请跳转:IIC协议--OLED-优快云博客

/*
 * Copyright (c) 2015, Vladimir Komendantskiy
 * MIT License
 *
 * SSD1306 demo of block and font drawing.
 */

//
// fixed for OrangePiZero by HypHop
//

#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdint.h>

#include "oled.h"
#include "font.h"

int oled_show(struct display_info *disp) {
    int i;
    char buf[100];

    oled_putstrto(disp, 0, 9+1, "Welcome to My HomeAssitant");
    disp->font = font1;

    oled_putstrto(disp, 0, 20, "  ---Mr.MXJ Handsome--");
    disp->font = font1;

    oled_send_buffer(disp);


return 0;
}

void show_error(int err, int add) {
    //const gchar* errmsg;
    //errmsg = g_strerror(errno);
    printf("\nERROR: %i, %i\n\n", err, add);
    //printf("\nERROR\n");
}

void show_usage(char *progname) {
    printf("\nUsage:\n%s <I2C bus device node >\n", progname);
}

int main(int argc, char **argv) {
    int e;
    char filename[32];
    struct display_info disp;

    if (argc < 2) {
        show_usage(argv[0]);
        
        return -1;
    }

    memset(&disp, 0, sizeof(disp));
    sprintf(filename, "%s", argv[1]);
    disp.address = OLED_I2C_ADDR;
    disp.font = font2;

    e = oled_open(&disp, filename);
    e = oled_init(&disp);
    oled_show(&disp);


    return 0;
}
 

香橙派使用外设驱动库wiringOP 配合定时器来驱动舵机 同时再次回顾香橙派的物理引脚对应:所以舵机的此处写的是物理引脚编号由于香橙派跑的系统就是Linux,所以其实就是使用Linux来实现定时器,根据舵机的原理,一般使用50Hz频率(周期为20ms)的PWM波来控制,而角度的大小就取决于高电平的占比,20ms中有0.5ms,1.0ms,1.5ms,2.0ms,2.5ms的高电平就分别对应舵机转0度,45度,90度,135度,180度。所以本质上,只要能实现出一个定时0.5ms(500us)的定时器,并让他定时1次,2次,3次,4次,5次就可以实现所有的角度。 阅读详情

相关推荐

[ARM+Linux] 基于全志h616外设开发笔记

修改用户密码配置网络命令扫描周围WIFI热点xxxpassword xxx 命令连接WiFi查看ip地址的指令:ifconfigSSH登录这是企业开发调试必用方式,比串口来说不用接线,前提是接入网络并获得板子IP地址,且系统做了SSH的服务器,本镜像自带SSH服务器,所以通过mobaXterm登陆就行基于官方外设开发1.wiringPi库SDK安装下载源码//进入文件夹sudo//清除编译信息sudobuild//编译通过windows。

weixin_63303786的博客 1681

【SSD1306 OLED屏幕测试程序 (开源)orangepi zero2 全志H616 】.md updata: 23/11/07

orangepi zero2 配置wiringpi 库后,突想构建一个测试oled屏幕的程序,放一蜗牛每次移动一个像素点,实时显示蜗牛的步数,后面要显示其他内容在此代码上修改即可,好好好 好得很!! 测试效果展示:(狂飙蜗牛128)

Wdf_123654的博客 825

行空板K10驱动舵机与OLED屏幕:嵌入式系统集成实战指南

PWM(脉冲宽度调制)和I2C(集成电路总线)是嵌入式开发中两种基础且关键的通信协议。PWM通过调节脉冲宽度来控制模拟量,广泛应用于舵机、电机调速等领域;I2C则是一种简洁的双线串行总线,常用于连接传感器、存储器与显示设备等外围器件。理解其原理,对于实现精准的硬件控制与高效的数据交换至关重要。在物联网、机器人等项目中,将PWM与I2C协同使用,能构建出兼具动态控制与状态反馈的智能节点,这正是嵌入式系统集成的核心价值。本文以行空板(K10)为平台,深入探讨如何利用Python同时驱动舵机与OLED屏幕,涵盖从

weixin_30875157的博客 336

香橙派外设开发,时间函数、超声波、sg90、OLED(i2c)、Linux定时器

安装i2c-tools 指令:sudo apt-get install i2c-tools。从命令运行结果能观察到系统支持I2C-3和I2C-5的驱动,而H616的外设我们看到只有一个IIC接。由 26pin 的原理图可知, Orange Pi Zero 2 可用的 i2c 为 i2c3。:当定时器被设置OK,延时多久时间去执行定时器计时 ,值不能为0!参数1:which指定定时器的定时方式。确认/dev下存在i2c-3的设备节点。一个进程只能创建一个定时器!口,用的是IIC-3。

番茄的博客 1134

LVGL v8.3 图片显示与解码缓存实战:PNG 上屏、C 数组与文件双方案

LVGL v8.3 图片两种存储方式、PNG/JPG 上屏解码器挂载、LV_IMG_CACHE_DEF_SIZE 缓存调优、手动预解码头像有效性判断,及"缓存被动画清空"真实踩坑。

汪同学的博客 437

树莓派3B使用WiringPi的IIC驱动0.96寸的oled.zip

树莓派开发+WiringPi,采用的是gcc编译,移植网上的oled驱动代码,自己写的makefile文件进行编译,仅供参考、学习

Orangepi Zero2 基于官方外设开发(二)

橘子派,OLED,串口

qq_52902991的博客 450

开源代码分享(29)-基于拉丁超立方抽样的风光场景生成和削减

作为分层抽样方法的一 种,拉丁超立方抽样具有良好的抽样精度和效率[14]。本文使用多场景方法来描述可再生能源(风电、光伏)的不确定性。以风电功率为例,首先假定风电功率服从正态分布 N(μ, δ 2 ),μ 为预测值的期望值,δ 为其波动的百分比。接着,采用拉丁超立方抽样[21]生成大量服从概率分布约束的风电出力场景,并采用考虑 Kantorovich 距离[22]的场景削减技术处理该场景,进行场景削减。最后,导出具有相应概率的削减之后的场景。

配电网和matlab的博客 923

【ARM-Linux篇】基于官方外设开发

基于官方外设开发

m0_66492811的博客 429

《涨知识啦29》-DBR的工作原理及其在VCSEL中的作用

分布式布拉格(Distributed Bragg Reflection,简称DBR)反射镜是垂直腔面发射激光器(Vertical-Cavity Surface-Emitting Laser,简称VCSEL)的重要组成部分。典型的DBR反射镜是由1/4ni波长厚度的高折射率和低折射率材料交替组成(ni是该层的折射率)。其反射率取决于组成对数、边界条件以及折射率差。 图1 布拉格反射镜的工作原理 DBR反射镜的工作原理如图1所示。根据反射原理,当光从光疏介质n1射向光密介质n2(折射率n2>n1)时,反

simucal的博客 7983

workbench拓扑优化教程_拓扑优化实例-轮毂的优化

拓扑优化实例-轮毂的优化ANSYS Workbench的新版本集成了topology optimization模块,为用户的拓扑优化提供的很好的应用。通过拓扑优化topology optimization模块的使用可以对拓扑有较好的理解,该模块拓扑优化可以简单概括为一句话:如何在合适的位置去除确定的材料使用量,而相应的刚度变化影响最小。本例以汽车轮毂为例,来确定轮毂的辐条形状。1.建立模型DM中可...

weixin_39581739的博客 3043

基于wiringPi库写的一些代码(一)

•步骤• 如图,出现了这个,就说明安装成功。

luoyanglook的博客 426

SQL注入:联合查询的三个绕过技巧

在SQL注入中,可以利用科学计数法来绕过对输入的限制。例如,可以使用科学计数法来绕过对字符串长度的限制,通过将字符串拆分成多个部分并使用科学计数法来表示。此外,还可以利用数据库的特定特性或语法来替代原始的查询语句,从而执行联合查询或其他恶意操作。另外,还可以尝试利用无列名注入的技巧,通过在原始查询中使用通配符或其他方式来绕过对列名的限制,从而执行恶意操作。

qq_68163788的博客 3794

【嵌入式Linux】基于OrangePi的官方外设开发

如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为PWM信号控制。用处垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等常见的有0-90°、0-180°、0-360°怎么控制舵机向黄色信号线“灌入”PWM信号。PWM波的频率不能太高,大约50HZ,即周期=1/频率=1/50=0.02s,20ms左右数据1.0ms------------45度;5.0%对应函数中占空比为5001.5ms------------90度;7.5%对应函数中占空比为750。...

qq_62361050的博客 819

大连理工大学中文情感词汇本体库(含情绪分析代码)

中文文本数据的情绪计算昨天如何对微博推文进行情绪分析(细粒度情感分析)介绍了英文的NRC情绪词典。虽然支持中文,但由于制作问题,导致并不完全适应中文场景。今天介绍大连理工大学中文情感...

大邓和他的Python 4万+

内窥镜胶囊(胶囊内镜)硬件方案

内窥镜胶囊(胶囊内镜)硬件方案 前言 说明:该方案为作者2018年上半年完成的第一版,后来搁置了一段时间,才重启这个项目。目前(2020.07)第二版已经快要完成。[联系v:1#7#6#3#3#3#5#0#8#7#0]先给一下第一版和第二版的基本参数。 第一版: 续航时间:3h 帧率:0.5fps 尺寸:12mm * 25mm 角度:45° 第二版: 续航时间:12h 帧率:2-6fps 尺寸:9.8mm * 25mm 角度:130° 第一版属于尝试版,整体方案不是很成熟。第二版这个数据就非常优秀了。我拿了

CrekerLi的博客 4780

全志H616——基于oled_demo修改发送的数据

【代码】全志H616——基于oled_demo修改发送的数据。

weixin_59622415的博客 276

【零基础入门unity游戏开发——3D篇】3D物理关节 —— Joint相关组件

【零基础入门unity游戏开发——3D篇】3D物理关节 —— Joint相关组件

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1202

【Linux开发】Orange Pi上WiringPi的使用

参考一篇我之前写的文章:https://blog.youkuaiyun.com/tq384998430/article/details/53161192,这篇文章是通过操作/dev/mem内存映射的方式操作GPIO的寄存器以达到控制GPIO的功能,这篇文章没有问题,但是官方其实有一个更好的操作GPIO的库叫做WiringPi,参考官方的介绍:http://www.orangepi.org/Docs/Wirin...

欢迎光临 4100

复现报告:《多回路人机控制系统仿真及II型PIO分析》方法复现与代码实现

本文复现了谭文倩硕士论文《多回路人机控制系统仿真及II型PIO分析》中的关键方法,重点实现了频域驾驶员模型辨识和参数灵敏度分析。通过数字化提取论文图表数据,构建了结构驾驶员模型传递函数,并验证了参数变化对系统特性的影响。采用MATLAB实现了描述函数计算、模型参数辨识和灵敏度分析算法,为后续神经网络模型辨识和II型PIO研究奠定了基础。由于缺乏原始实验数据,部分结果通过数值模拟获得,但仍有效重现了论文的核心分析方法。~~~~~

huanghm88的专栏 175

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Linux学习之悟空派上实现OLED的无线网IP及CPU温度显示【守护进程】

守护进程是运行在后台的一种特殊进程,它独立于控制终端并且周期性地执行某种任务或循环等待处理某些事件的发生;它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机才随之一起停止运行;守护进程一般都以root用户权限运行,因为要使用某些特殊的端口(1-1024)或者资源;

ASWaterbenben的博客 1266

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

树莓派学习:wiringPi+硬件pwm+舵机

让sg90舵机转动,就需要一个20ms的周期pwm,其中高电平在0.5-2.5ms之间。

weixin_59669309的博客 1047

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

2024年最全webstorm的安装及基本配置,2024最新物联网嵌入式开发高频精选面试题分享

择“License server”,然后在输入框中输入 License server address 为:http://hb5.s.osidea.cc:1017(有可能不能用,自己可以百度搜一下最新的)点击”Activate”按钮。人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**各种配置 可以根据自己的需求自行配置。7、开始基本配置 主要在。

2401_85015025的博客 776

OrangePi ZERO 2 外设应用程序开发之基于 wiringOP 库的 OLED 二次开发

上篇文章我们用 wiringOP 库的 demo 代码,成功地驱动了 OLED 屏幕,本篇就基于 wiringOP 库所提供的 API 进行二次开发,便于实现更多的显示效果。先模仿 demo 代码写一段程序,显示内容部分在函数里完成。 显示的字体,我个人比较喜欢,这个字体每行可以显示 21 个字符,字体间隔没那么紧凑,看着页舒服。和每行都可以显示 25 个字符,都是比较紧凑。另外就是的字体太小,也不方便阅读。函数是按页寻址模式填充 OLED 的,不过只能填充一页,第三个参数是需要显示在 OLED 上的字符串

Grayson Blog 1597

树莓派-分析wiringPi 实现iic连续读写功能

1.分析iic传输原理 树莓派的wiringPi 包含了一个 I2C 库,能够更轻松的使用树莓派的板上I2C接口、 而wiringPi只给我们提供了单个寄存器读写功能的函数.比如: int wiringPiI2CWriteReg16 (int fd, int reg, int data) ; //写数据到16位寄存器,fd为I2C设备的文件描述符,reg寄存器地址,data要写入的数据 int wiringPiI2CReadReg16 (int fd, int reg) ; //从寄存器读取16位.

抵抗时间扭曲,坚持做一件有意义的事 2572

香橙派(全志H6)SG90舵机运行代码不转的问题

解决问题如红字,必须要把连接SG90的针脚给一个输出电平才能使得舵机通电。

m0_52883102的博客 574
上一篇: wiringpi 库的应用 -- 超声波测距HC-SR04
下一篇: C语音关键字大全
mx_jun
博客等级 码龄5年 1605粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值