OrangePi Zero2 全志H616开发学习文档、基础IO蜂鸣器、超声波测距、舵机PWM基础开发

一.平台介绍

OrangePi开发板不仅仅是一款消费品,同时也是给任何想用技术来进行创作创新的人设计的。它是一款简单、有趣、实用的工具,你可以用它去打造你身边的世界。

在这里插入图片描述

特性

  • CPU 全志H616四核64位1.5GHz高性能Cortex-A53处理器
  • GPU MaliG31MP2 SupportsOpenGLES1.0/2.0/3.2、OpenCL2.0
  • 运行内存 1GBDDR3(与GPU共享)
  • 存储 TF卡插槽_课程配套硬件16G,测试128G可支持、2MBSPIFlash
  • WIFI+蓝牙 AW859A芯片、支持IEEE802.11a/b/g/n/ac、BT5.0
  • 视频输出 MicroHDMI20a
  • 电源 USBTypeC接口输入
  • 外设 带有I2Cx1、SPIx1、UARTx1以及多个GPIO口
  • 电源指示灯和状态指示灯

二.基于官方外设开发

2.1 wiringPi外设SDK安装

git clone https://github.com/orangepi-xunlong/wiringOP //下载源码
cd wiringOP //进入文件夹
sudo ./build clean //清除编译信息
sudo ./build //编译通过windows浏览器打开https://github.com/orangepi-xunlong/wiringOP
下载压缩包
把压缩包通过xterm传到开发板
解压 unzip xxx.zip
cd xxx
sudo ./build
gpio readall

验证指令:gpio readall,结果如下方所示:

在这里插入图片描述

2.2基本IO口应用——蜂鸣器开发

在这里插入图片描述

  • 代码:

    #include <stdio.h>
    #include <wiringPi.h>
    #include <unistd.h>
    #define BEEP 0 //设置针脚0为蜂鸣器的控制引脚
    int main (void)
    {wiringPiSetup () ;//初始化wiringPi库ipinMode (BEEP, OUTPUT) ;//设置IO口的输入输出,输出while(1){//sleep(1);usleep(100000);digitalWrite (BEEP, HIGH) ; //设置IO口输出低电平,蜂鸣器响//sleep(1);usleep(100000);digitalWrite (BEEP, LOW) ; //设置IO口输出低电平,蜂鸣器响}return 0;
    }
    
  • 简单编译shell脚本来gcc编译函数

    ./build beep.c
    gcc $1 -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt
    shell脚本处理参数,可以通过$?来处理,这里的$1是要编译的文件
    

2.3超声波测距

  • 测距原理基本说明

    超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度, 计算出模块到前方障碍物的距离。

    在这里插入图片描述

  • 超声波模块HC-SR04

    !在这里插入图片描述

  • 时序

    在这里插入图片描述

  • 时间函数

    gettimeofday 是一个在 Unix 及类 Unix 系统(如 Linux)中广泛使用的系统调用,它的目的是获取当前系统的日期和时间,精确到微秒级别。这个函数允许程序获取自1970年1月1日以来的秒数(即Unix时间戳)以及额外的微秒部分。这对于需要高精度时间测量的应用特别有用,例如在性能测试、计时、实时系统或是任何需要精确时间管理的场景。

    #include <sys/time.h>int gettimeofday(struct timeval *tv, struct timezone *tz);
    //结构体:
    struct timeval
    {long tv_sec;/*秒*/long tv_usec;/*微妙*/
    };
    struct timezone
    (在某些系统中可能已弃用或不推荐使用)结构包含了时区信息,但在大多数现代应用中,传递 NULL 给 tz 参数是常见的做法,因为时区处理现在更倾向于使用其他方法,如 localtime_r 或 gmtime_r 函数配合 struct tm
  • 测试代码:

    //计算程序在当前环境中数数10万次耗时多少
    #include <sys/time.h>
    #include <stdio.h>
    //int gettimeofday(struct timeval *tv,struct timezone *tz )
    void mydelay()
    {int i,j;for(i=0;i<100;i++){for(j=0;j<1000;j++);}
    }int main()
    {struct timeval startTime;struct timeval stopTime;gettimeofday(&startTime,NULL);mydelay();gettimeofday(&stopTime,NULL);long diffTime = 1000000*(stopTime.tv_sec - startTime.tv_sec) + (stopTime.tv_usec - startTime.tv_usec);printf("全志H6的Linux数100000耗时%ldus\n",diffTime);return 0;
    }
    
  • 超声波测距代码

    #include <stdio.h>
    #include <sys/time.h>
    #include <wiringPi.h>
    #include <stdlib.h>
    #include <unistd.h>
    #define Trig 0
    #define Echo 1
    double getDistance()
    {double dis;struct timeval start;struct timeval stop;pinMode(Trig, OUTPUT);pinMode(Echo, INPUT);digitalWrite(Trig ,LOW);usleep(5);digitalWrite(Trig ,HIGH);usleep(10);digitalWrite(Trig ,LOW);/*above init CSB*/while(!digitalRead(Echo));gettimeofday(&start,NULL);while(digitalRead(Echo));gettimeofday(&stop,NULL);long diffTime = 1000000*(stop.tv_sec-start.tv_sec)+(stop.tv_usec -start.tv_usec);printf("diffTime = %ld\n",diffTime);dis = (double)diffTime/1000000 * 34000 / 2;return dis;
    }int main()
    {double dis;if(wiringPiSetup() == -1){fprintf(stderr,"%s","initWringPi error");exit(-1);}while(1){dis = getDistance();printf("dis = %lf\n",dis);usleep(500000);}return 0;
    }
    

2.4SG90舵机开发

  • 舵机基本介绍

    如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为PWM信号控制用处:垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等常见的有0-90°、0-180°、0-360°。

    在这里插入图片描述

  • 角度控制

    向黄色信号线“灌入”PWM信号。

    PWM波的频率不能太高,50hz,即周期=1/频率=1/50=0.02s,20ms左右数据:不同的PWM波形对应不同的旋转角度,以20ms为周期,50hz为频率的PWM波。

    0.5ms的高电平,19.5ms的低电平,角度为0°;1ms的高电平,19ms的低电平,角度为45°;1.5ms的高电平,18.5ms的低电平,角度为90°;以此类推。

  • Linux定时器

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

    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:程序跑到这之后,多久启动定时器struct timeval
    {__time_t tv_sec; /* Seconds. */__suseconds_t tv_usec; /* Microseconds. */
    };int setitimer (__itimer_which_t __which,const struct itimerval *__restrict __new,struct itimerval *__restrict __old)
    //setitimer:通过传递定时器类型(which)、指向 itimerval 结构体的指针,以及一个之前 itimerval 的地址(可选,用于获取先前的定时器设置)来调用 setitimer。
    

    setitimer 支持三种类型的间隔定时器:

    • ITIMER_REAL:这是最常用的类型,它按照实际流逝的时间来计时,即使进程处于睡眠状态也会继续计时。当定时器到期时,会给进程发送 SIGALRM 信号。
    • ITIMER_VIRTUAL:这种定时器测量的是进程在用户模式下消耗的CPU时间。当进程因为系统调用等原因进入内核模式时,该定时器会暂停计时。到期时发送 SIGVTALRM 信号。
    • ITIMER_PROF:类似于 ITIMER_VIRTUAL,但是它不仅计算用户模式下的时间,也包括内核模式下消耗的时间(即总的CPU时间)。到期时发送 SIGPROF 信号。
  • 定时示例代码

    /*该代码实现的功能是: 1s后开启定时器,然后每隔1s向终端打印hello。*/
    #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){printf("hello\n");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;//设定定时方式if( -1 == setitimer(ITIMER_REAL, &itv, NULL)){perror("error");exit(-1);}//信号处理signal(SIGALRM,signal_handler);while(1);return 0;
    }
    

    这种方法需要注意的是,一个进程只能创建一个定时器。

  • SG90编程实现:键盘输入不同的值,让舵机转动,软件PWM实现

    #include <stdio.h>
    #include <sys/time.h>
    Orangepi Zero2 全志H616开发学习文档 猿学社
    #include <stdlib.h>
    #include <signal.h>
    #include <wiringPi.h>
    #define SG90Pin 5
    int jd;
    static int i = 0;
    void signal_handler(int signum)
    {if(i <= jd){digitalWrite(SG90Pin, HIGH);}else{digitalWrite(SG90Pin, LOW);}if(i == 40){i = 0;}i++;}
    int main()
    {struct itimerval itv;jd = 0;wiringPiSetup();pinMode(SG90Pin, OUTPUT);//设定定时时间itv.it_interval.tv_sec = 0;itv.it_interval.tv_usec = 500;//设定开始生效,启动定时器的时间itv.it_value.tv_sec = 1;itv.it_value.tv_usec = 0;//设定定时方式if( -1 == setitimer(ITIMER_REAL, &itv, NULL)){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;
    }
    

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

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

相关文章

Nginx解决跨域问题

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 W3C标准&#xff1…

PostgreSQL 用户及授权管理 04:授予及回收权限

PostgreSQL 是一个坚如磐石的数据库&#xff0c;它非常注重安全性&#xff0c;提供了非常丰富的基础设施来处理权限、特权和安全策略。在前面的章节中以我们介绍的基本概念为基础&#xff0c;重新审视角色概念&#xff0c;特别关注授予角色的安全性和权限&#xff08;角色可以是…

2024年前一季度,国内医疗器械营收TOP10出炉!

随着国内医疗器械市场的不断发展&#xff0c;各大医疗器械公司的财报数据成为了投资者和行业观察者关注的焦点。近日&#xff0c;根据2024年第一季度财报数据&#xff0c;我们梳理出了中国医疗器械第一财季营收排名前十的械企&#xff0c;为大家带来深入的分析和解读。 一、营…

达梦数据库 报错 数据类型不匹配

达梦数据库 报错 数据类型不匹配 背景描述问题分析问题处理方案1&#xff1a;方案2&#xff1a;TO_CHAR(str)CAST(value AS type)CONVERT(type,value)DBMS_LOB 包TEXT_EQUAL(n1,n2) 写在最后 背景描述 本文写于初接触到达梦(DM)数据库&#xff0c;之前没有用过&#xff0c;因此…

《四》系统模块整体功能关联与实现

在上一篇里&#xff0c;我们完成了动作的创建&#xff0c;那么这一次&#xff0c;我们把它加载到界面上&#xff0c;把需要是实现的动作都加上。 MyWord::MyWord(QWidget *parent): QMainWindow(parent) {mdiAreanew QMdiArea;mdiArea->setHorizontalScrollBarPolicy(Qt::S…

Python爬虫逆向——某公开数据网站实例小记(二)

注意&#xff01;&#xff01;&#xff01;&#xff01;某XX网站逆向实例仅作为学习案例&#xff0c;禁止其他个人以及团体做谋利用途&#xff01;&#xff01;&#xff01; 第一步&#xff1a;分析页面和请求方式 aHR0cHM6Ly95Z3AuZ2R6d2Z3Lmdvdi5jbi8jLzQ0L2p5Z2c 此网站经…

ORACLE ODA一体机存储节点电源故障的分析处理

近期&#xff0c;某用户的ORACLE ODA一体机在例行机房巡检时出现亮黄灯告警&#xff1b;用户反馈次问题后我们立刻通过远程方式&#xff0c;登陆ODA的控制台进行查看&#xff1b; 对于ODA一体机&#xff08;2个计算节点1个存储节点&#xff09;&#xff0c;计算节点可以通过il…

HTTP协议及应用

一.HTTP协议 1.HTTP协议版本 HTTP1.0&#xff1a;服务器处理完成后立即断开TCP连接&#xff08;无连接&#xff09;&#xff0c;服务器不跟踪每个客户端也不记录过去的请求&#xff08;无状态&#xff09;&#xff1b; HTTP1.1&#xff1a;KeepAlived长连接避免了连接建立和…

卷积神经网络CNN的运行过程、常见术语与问题

目录 一、CNN运行过程 1、卷积&#xff08;Convolution&#xff09; 2、激活函数&#xff08;activation function&#xff09; 3、池化&#xff08;pooling&#xff09; 3.1 池化操作 3.2 池化过程 3.3 池化后结果 4、Flatten 5、全连接层 Flatten层的操作 全连接层…

MyBatis常见报错:org.apache.ibatis.binding.BindingException

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 异常现象描述 当开发者在使用MyBatis进行数据库操作时&#xff0c;可能会遇到org.apache.ibatis.binding.BindingException: Parameter appId not found这样的错误提示。这个错误通常会让程序无法正常运行&#xff…

namenode启动失败 org.apache.hadoop.hdfs.server.common.InconsistentFSStateException:

小白的Hadoop学习笔记 2024/5/14 18:26 文章目录 问题解决报错浅浅分析一下core-ste.xml 问题 namenode启动失败 读日志 安装目录下 vim /usr/local/hadoop/logs/hadoop-tangseng-namenode-hadoop102.log2024-05-14 00:22:46,262 ERROR org.apache.hadoop.hdfs.server.namen…

ov通配符证书1590

OV通配符SSL证书也可以称之为OV企业型泛域名SSL证书&#xff0c;指的是专为企事业单位准备的通配符SSL证书&#xff0c;不仅可以用一张SSL证书保护主域名以及主域名下所有的子域名&#xff0c;还可以为多个域名网站进行身份认证服务。今天就随SSL盾小编了解性价比较高的OV通配符…