[ARM+Linux] 基于全志h616外设开发笔记
修改用户密码
配置网络
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 . zipcd xxxsudo . / buildgpio 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)一般第三个参数设为NULLwhich: 三种类型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;
}
相关文章:

[ARM+Linux] 基于全志h616外设开发笔记
修改用户密码 配置网络 nmcli dev wifi 命令扫描周围WIFI热点 nmcli dev wifi connect xxx password xxx 命令连接WiFi 查看ip地址的指令: ifconfig ip addr show wlan0 SSH登录 这是企业开发调试必用方式,比串口来说不用接线,前提是接入网络…...

如何实现24小时客户服务
许多企业都有着这样的愿望:在不增加客服人员的同时能实现24小时客户服务。 那么有没有什么方法可以实现这一想法呢?在想解决方案之前我们可以先来谈谈客服的作用。 客服的作用主要为以下2点: 帮助用户更快地了解产品(减轻产品的…...
查询数据库空间(mysql和oracle)
Mysql版 1、查看所有数据库容量大小 -- 查看所有数据库容量大小 SELECTtable_schema AS 数据库,sum( table_rows ) AS 记录数,sum(TRUNCATE ( data_length / 1024 / 1024, 2 )) AS 数据容量(MB),sum(TRUNCATE ( index_length / 1024 / 1024, 2 )) AS 索引容量(MB) FROMinfor…...
为什么 SQLite 一定要用 C 语言来开发?
SQLite 是一种专门为在 Unix 和类 Unix 操作系统上运行的 Linux 服务器应用程序而设计的数据库管理系统,是一种轻量级的关系型数据库管理系统,它适用于许多嵌入式设备和物联网设备。它使用 C 语言编写,并且是一个开源项目。 简单易用&#x…...

TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:6~11
原文:Mobile Deep Learning with TensorFlow Lite, ML Kit and Flutter 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的…...

你的GPT跟ChatGPT可能只差了一个DPU
“人类永远不会嫌网络太快,就像永远不会嫌高铁太快,你只会嫌它慢,希望它更快些。” 一个月内,百度、阿里、腾讯、商汤、讯飞、360等国内大厂扎堆发布“中国版 GPT ”,这家的名字还没记清楚,另一家的又蹦了出…...

springboot服务端接口外网远程调试,并实现HTTP服务监听 - 内网穿透
文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…...
NumPy的应用-1
准备工作 在Python中使用NumPy时,需要先安装NumPy。可以使用以下命令来安装NumPy: pip install numpy安装完成后,在Python中引入NumPy: import numpy as np安装完成并引入NumPy后,我们可以开始使用NumPy进行数据分析…...
k8s的yaml文件中kind类型详解
在Kubernetes(k8s)的YAML语法中,kind是一种重要的关键字,它用于指定Kubernetes资源的类型。根据Kubernetes官方文档,以下是kind可能的取值: Deployment:用于定义应用程序的声明式更新。Statefu…...
第三天:C语言控制结构
目录 1. 条件语句 2. 循环语句 3. 实例:计算阶乘 在前两天的学习中,您已经掌握了C语言的基本知识。今天,我们将学习C语言的控制结构,包括条件语句和循环语句。通过控制结构,您可以实现程序的分支和循环,…...

访问若依vue版后端api接口
访问若依vue版后端api接口 如何使用Talend API Tester进行访问若依vue-前后端分离版的后端api接口? 方法一: 写好一个后台api接口,启动项目 直接使用Talend API Tester进行访问后台api出现如下错误,原因是因为若依系统有jwt认证…...

另一种迁移xxl-job任务的方法,适合不满足数据迁移条件
以为多个项目组同时使用一个xxl-job,同时涉及到版本提升,由此不太满足数据库数据迁移,所以这里提供另一种解决办法 使用工具:postman,json转excel,excel 核心:excel拼接: 1.使用f12抓取xxl任务访…...

Redis缓存穿透、击穿、雪崩面试题详解
缓存穿透 问题: 指的是客户端请求的数据在缓存中找不到,数据库中也没有存储,客户端还不断的发起请求。这样每次都无法在数据库查询到,缓存中永远没有这个数据。 这样的话,客户端一直去访问,会给后端数据…...

【网络安全】本地提权漏洞分析
0. 前言 CVE-2023-21752 是 2023 年开年微软第一个有 exploit 的漏洞,原本以为有利用代码会很好分析,但是结果花费了很长时间,难点主要了两个:漏洞点定位和漏洞利用代码分析,欢迎指正。 1. 漏洞简介 根据官方信息&a…...

电脑端(PC)按键精灵——3.其他命令
电脑端(PC)按键精灵——3.其他命令 前两节说了安装、键盘和鼠标命令,这一章说下其他命令 按键精灵小白入门详细教程: 电脑端(PC)按键精灵—小白入门 详细教程 命令介绍 1. Delay 延时 简介 //1秒=1000毫秒, 1分钟=60000毫秒,…...

Hudi集成Flink-写入方式
文章目录 一、CDC 入湖1.1、[开启binlog](https://blog.csdn.net/wuxintdrh/article/details/130142601)1.2、创建测试表1.2.1、创建mysql表1.2.2、将 binlog 日志 写入 kafka1、使用 mysql-cdc 监听 binlog2、kafka 作为 sink表3、写入sink 表 1.2.3、将 kakfa 数据写入hudi1、…...

深度探索list
1.list的基本组成 list是一个双向链表,它的基本组成就是 成员作用prev指针指向上一个元素next指针指向下一个元素data用来保存数据 2.list的迭代器 由于人们一般习惯于:迭代器是找到下一个元素,迭代器–是找到上一个元素。在双向链表list中…...
QQuick-自绘
QQuick提供了丰富的控件,搭配qml很容易就可以搭配出一套丝滑的UI界面。但是在有些场景下无论是出于效率还是现有控件的局限都需要进行自绘才能实现自身的需求。QQuick支持多种自绘: 可以使用的方案: 1. 继承QQuickPaintedItem ,重写 paint …...
【算法】【算法杂谈】已知[1,m]的等概率函数,求[1,n]的等概率函数
目录 前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本 思考感悟写在最后 前言 当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识! 问题介…...

【Python】Python中的列表,元组,字典
文章目录 列表创建列表获取元素修改元素添加元素查找元素删除元素列表拼接遍历列表切片操作 元组创建元组元组中的操作 字典创建字典添加/修改元素删除元素查找字典的遍历合法的key类型 列表 列表是一种批量保存数据的方式,列表使用[]表示 创建列表 创建两个空列…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...

springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

PydanticAI快速入门示例
参考链接:https://ai.pydantic.dev/#why-use-pydanticai 示例代码 from pydantic_ai import Agent from pydantic_ai.models.openai import OpenAIModel from pydantic_ai.providers.openai import OpenAIProvider# 配置使用阿里云通义千问模型 model OpenAIMode…...

【阅读笔记】MemOS: 大语言模型内存增强生成操作系统
核心速览 研究背景 研究问题:这篇文章要解决的问题是当前大型语言模型(LLMs)在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色,但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成(RA…...