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

news/2024/2/29 2:09:21

修改用户密码

配置网络

nmcli dev wifi 命令扫描周围WIFI热点

 

nmcli dev wifi connect  xxx password xxx 命令连接WiFi

查看ip地址的指令:

ifconfig

ip addr show wlan0

SSH登录

        这是企业开发调试必用方式,比串口来说不用接线,前提是接入网络并获得板子IP 地址,且系统做了SSH的服务器,本镜像自带 SSH 服务器,所以通过 mobaXterm 登陆就行

基于官方外设开发

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验证

设置tab缩进

⑥、设置tab缩进

sudo vim /etc/vim/vimrc

set tabstop=4 设置tab键缩进4个空格

set shiftwidth=4 设置批量对齐时候的tab键空格数为4

 

通过配置GPIO口,让蜂鸣器响 

#include<wiringPi.h>
#include <stdio.h>
#include <sys/time.h>#define BEEP 0int main()
{wiringPiSetup();//wiringPi库初始化pinMode(BEEP,OUTPUT);//配置GPIO口为输出端口while(1){digitalWrite(BEEP,LOW);//蜂鸣器输出低电平响sleep(1);digitalWrite(BEEP,HIGH);//蜂鸣器输出高电平不响sleep(1);}return 0;
}

 因为编译关于配置gpio口的程序需要连接很多,比如:

-lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt
所以我们可以编写一个简易的shell脚本
gcc $1 -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt 
$1是待编译的文件名

超声波测距

超声波测距的原理就是当Trig发出波后开始计时,Echo会从低电平变为高电平,当接收到返回的波时,Echo会从高电平重新变回低电平,这时停止计时,计算发送和接收到波的时间,用速度x时间=距离来计算,速度= 340m/s(最后的距离单位是cm/s注意换算单位!!!)

(86条消息) [STM32F103C8T6] 超声波测距_TX564的博客-CSDN博客

 在全志h616中怎么获取时间呢?

我们会用到时间函数

#include<sys/time.h>
int gettimeofday(struct timeval *tv,struct timezone *tz )
gettimeofday() 会把目前的时间用 tv 结构体返回,当地时区的信息则放到 tz 所指的结构中
struct timeval
{
long tv_sec ; /* */
long tv_usec ; /* 微妙 */
};
#include <stdio.h>
#include <sys/time.h>
#include <wiringPi.h>#define Trig 0
#define Echo 1double getdistance()
{double dis;struct timeval start;struct timeval stop;pinMode(Trig,OUTPUT);pinMode(Echo,INPUT);digitalWrite(Trig,LOW);usleep(5);digitalWrite(Trig,HIGH);usleep(20);digitalWrite(Trig,LOW);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);//乘以1000000是为了将s换算成us便于与后面相加dis = (double)difftime/1000000 * 34000/2;dis的单位是cm/usreturn dis;
}int main()
{if(wiringPiSetup() == -1){perror("error\n");} while(1){dis = getdistance();printf("dis = %ld\n",dis);sleep(1);}
}

全志h616在linux下的定时器

#include <sys/time.h>

setitimer() value 指向的结构体设为计时器的当前值,如果 ovalue 不是 NULL ,将返回计时器原有值。
int setitimer (__itimer_which_t __which,
const struct itimerval  *__restrict __new,
struct itimerval  *__restrict __old)
一般第三个参数设为NULL
which: 三种类型
ITIMER_REAL // 数值为0(底层吧ITIMER_REAL 宏定义为0),计时器的值实时递减,发送的信号是 SIGALRM 。---->用的最多
ITIMER_VIRTUAL // 数值为 1 ,进程执行时递减计时器的值,发送的信号是 SIGVTALRM
ITIMER_PROF // 数值为 2 ,进程和系统执行时都递减计时器的值,发送的信号是 SIGPROF

struct itimerval {
struct timeval it_interval;
struct timeval it_value;
};

it_interval:定时器初始值
it_value:当定时器被设置OK,延时多久时间去执行定时器计时 //这个值不能设置为0!!

struct timeval {
__time_t tv_sec; /* Seconds. */
__suseconds_t tv_usec; /* Microseconds. */
};

__restrict __old:
可以不设置,用NULL

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

很明显,这边需要捕获对应的信号进行逻辑相关处理 signal(SIGALRM,signal_handler);

一个进程只能创建一个定时器!!!

每隔1s打印一次gogogo 

#include <stdio.h>
#include <sys/time.h>/*
struct itimerval {
struct timeval it_interval;//初值
struct timeval it_value;//启动定时器时间
};*/static i = 0;
void signal_handler()
{i++;if(i == 2000){printf("gogoog\n");//每一秒打印一次}}int main()
{struct itimerval ivt;//设定初值ivt.it_interval.sec = 0;ivt.it_interval.usec = 500;//初值为500us//设定什么时候开启定时器ivt.it_value.sec = 1;//1s后开始启动定时器ivt.it_value.usec = 0;//设定定时方式setitimer(ITIMER_REAL,&ivt,NULL);//信号处理signal(SIGALRM,signal_handler);while(1);
}

 sg90舵机操作

sg90舵机的角度控制主要是pwm控制,pwm说白了就是占空比(高电平所占周期与总周期的比例)

#include <stdio.h>
#include <sys/time.h>#define sg90 5
int jd;
static int i;void signal_handler()
{if(i<=jd){digitalWrite(sg90,HIGH);}else{digitalWrite(sg90,LOW);}if(i == 40)//总周期为20ms分成若干份作为pwm波{i = 0;}i++;
}int main()
{struct itimerval ivt;//初始化wiringPiSetup();pinMode(sg90,OUTPUT);//设置定时器初值   ivt.it_interval.tv_sec = 0;ivt.it_interval.tv_usec = 500;      //设置几秒后启动定时器ivt.it_value.tv_sec = 1;ivt.it_value.tv_usec = 0; //设置定时器模式if(setitimer(ITIMER_REAL,&ivt,NULL) == -1){perror("error");}//信号处理signal(SIGALRM,signal_handler);while(1){printf("choose jd:1-0,2-45,3-90,4-135,5-180");scanf("%d",&jd);}
}

基于iic的oled显示

 

开始测试 i2c , 首先安装 i2c-tools
使用命令:
sudo apt-get install i2c-tools

根据官方给的oled_demo来编写 

#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];disp->font = font1;//选择字体oled_putstrto(disp, 0, 10, "Welcome to my home");disp->font = font1;//选择字体oled_putstrto(disp, 0, 20, "handsome");oled_send_buffer(disp);return 0;
}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;e = oled_open(&disp, filename);e = oled_init(&disp);oled_show(&disp);return 0;
}


http://www.ppmy.cn/news/46471.html

相关文章

TCP/UDP协议 (详解)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

Linux宝塔安装msyql服务,默认密码,允许远程登录问题解决

一、首先我在宝塔安装mysql服务是5.7 1.1MySQL数据库5.6之前&#xff08;不包括&#xff09;默认密码为空&#xff0c;用户不用输入密码&#xff0c;直接回车登陆 mysql -uroot -p password:(空) 1.2.MySQL数据库5.6之后&#xff08;包括&#xff09;默认密码是MySQL数据库随机…

2023年税务师事务所行业研究报告

第一章 行业发展概况 1.1 行业概况 税务师事务所是依法设立并承办法律、法规、规章规定的涉税服务和鉴证业务的社会中介机构。税务师事务所的组织形式为有限责任制税务师事务所和合伙制税务师事务所&#xff0c;以及国家税务总局规定的其他形式。税务师事务所应当依法纳税&am…

一分钟了解美国棒球体系·棒球1号位

美国棒球体系是一个庞大且复杂的体系&#xff0c;涵盖了从青少年到职业的各个层次。下面是美国棒球体系的主要组成部分&#xff1a; 1. 青少年棒球&#xff08;Youth Baseball&#xff09; 美国的青少年棒球体系包括各种地区和全国性的联盟&#xff0c;如Little League、Pony…

7个最新的时间序列分析库介绍和代码示例

时间序列分析包括检查随着时间推移收集的数据点&#xff0c;目的是确定可以为未来预测提供信息的模式和趋势。我们已经介绍过很多个时间序列分析库了&#xff0c;但是随着时间推移&#xff0c;新的库和更新也在不断的出现&#xff0c;所以本文将分享8个目前比较常用的&#xff…

【云原生】Kubernetes 中容器跨主机网络是怎么样的?

文章目录 前言什么是 FlannelFlannel 的后端实现有哪些UDPVXLANHost-gw 基于 Flannel UDP 模式的实现跨主通信UDP 模式案例实现基于 Flannel VXLAN 模式的跨主通信VXLAN 模式案例实现 总结 前言 在云原生领域&#xff0c;Kubernetes 已经成为了最主流的容器管理工具。Kubernet…

本地Pycharm连接远程服务器训练模型教程-yolov5为例

本篇文章解决的问题&#xff1a; 本地pycharm 与云服务器/实验室服务器进行远程连接跑实验训练、同步本地与云服务器的全部或者部分文件。 在这之前需要做的的工作&#xff1a; 1.服务器上已经创建好虚拟环境&#xff08;不会的可以看下篇文章&#xff09;&#xff1a;使用云…

线程池技术

线程池技术是一种典型的生产者-消费者模型。 线程池技术是指能够保证所创建的任一线程都处于繁忙状态&#xff0c;而不需要频繁地为了某一任务而创建和销毁线程&#xff0c;因为系统在创建和销毁线程时所耗费的cpu资源很大。如果任务很多&#xff0c;频率很高&#xff0c;为了…

4月Google Play政策更新,游戏上架需要注意这几点

3月21日&#xff0c;据路透社报道&#xff0c;由于发现国内某知名电商应用存在恶意软件问题&#xff0c;谷歌已暂时将该APP从商店下架&#xff0c;并表示&#xff1a;将该APP下架是一种安全预防措施&#xff0c;已经下载的用户也会收到警告&#xff0c;提示他们进行卸载。 4月…

k8s的yaml文件中kind类型详解

在Kubernetes&#xff08;k8s&#xff09;的YAML语法中&#xff0c;kind是一种重要的关键字&#xff0c;它用于指定Kubernetes资源的类型。根据Kubernetes官方文档&#xff0c;以下是kind可能的取值&#xff1a; Deployment&#xff1a;用于定义应用程序的声明式更新。Statefu…

KD2684S绕组匝间故障检测仪

一、产品简介 KD2684S匝间冲击耐压试验仪适用于电机、变压器、电器线圈等这些由漆包线绕制的产品。因漆包线的绝缘涂敷层本身存在着质量问题&#xff0c;以及在绕线、嵌线、刮线、接头端部整形、绝缘浸漆、装配等工序工艺中不慎而引起绝缘层的损伤等&#xff0c;都会造成线圈层…

【Java|golang】1042. 不邻接植花---邻接表着色

有 n 个花园&#xff0c;按从 1 到 n 标记。另有数组 paths &#xff0c;其中 paths[i] [xi, yi] 描述了花园 xi 到花园 yi 的双向路径。在每个花园中&#xff0c;你打算种下四种花之一。 另外&#xff0c;所有花园 最多 有 3 条路径可以进入或离开. 你需要为每个花园选择一…

图的宽度优先遍历

文章目录 图的宽度优先遍历程序设计程序分析图的宽度优先遍历 【问题描述】根据输入图的邻接矩阵A,给出图的宽度优先遍历序列; 【输入形式】第一行为图的结点个数n,第二行输入顶点的信息,每个顶点用一个字符表示,接下来的n行为图的邻接矩阵A。其中A[i][j]=1表示两个结点邻…

为何巴菲特和马斯克站在了一起?

股神巴菲特虽然非常传奇&#xff0c;但是马斯克对其并不感冒。马斯克曾经在一档电视节目中表示&#xff0c;实业才是王道&#xff0c;埋怨金融业抢走太多人才和精英&#xff0c;暗指巴菲特为年轻人做了错误示范。当然&#xff0c;巴菲特的投资非常厉害&#xff0c;但也有失手的…

Jenkins ssh windows 部署 java程序

版权说明&#xff1a; 本文由博主keep丶原创&#xff0c;转载请保留该段内容在文章头部。 原文地址&#xff1a; https://blog.csdn.net/qq_38688267/article/details/130203785 文章目录 前言实现步骤1. windows下载安装ssh2. windows 安装 winsw2.1 下载 winsw2.2 配置winsw2…

Apollo配置中心2.0版本详解

目的 部署一个单节点的Apollo配置中心,且包含dev和pro环境的配置。 需要部署的服务 Portal Service, Admin Service, Config Service(包含Meta service 和 Eureka) 架构图 部署图 部署过程: 数据库脚本: portaldb: https://github.com/apolloconfig/apollo/blob/mast…

Spring Boot + Spring Security基础入门教程

Spring Security简介 Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架。Spring Security 致力于为 Java 应用程序提供身份验证和授权的能力。 Spring Security 两大重要核心功能&#xff1a;用户认证&#xff08;Authentication&#xff09;和用户授权&am…

Docker常用命令详解,有这些足够了

首先启动类 启动docker&#xff1a;systemctl start docker 停止docker&#xff1a;systemctl stop docker 重启docker&#xff1a;systemctl restart docker 查看docker状态&#xff1a;systemctl status docker 开机自启动&#xff1a;systemctl enable docker 查看docker概要…

Day944.度量指标 -系统重构实战

度量指标 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于度量指标的内容。 很多时候在研发过程中&#xff0c;都习惯性地用“拍脑袋”的方式来看待一个事情。例如这个代码写得不好、这个自动化测试覆盖不充分、版本的发布频率太差了等等。往往只知道哪里有问题&…

Golang每日一练(leetDay0037) 二叉树专题(6)

目录 109. 有序链表转换二叉搜索树 Convert-sorted-list-to-binary-search-tree &#x1f31f;&#x1f31f; 110. 平衡二叉树 Balanced Binary Tree &#x1f31f; 111. 二叉树的最小深度 Minimum Depth of Binary Tree &#x1f31f; &#x1f31f; 每日一练刷题专栏 …
最新文章