修改用户密码
配置网络
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 0
int 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 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(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/us
return 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文章来源:https://www.toymoban.com/news/detail-419966.html
根据官方给的oled_demo来编写 文章来源地址https://www.toymoban.com/news/detail-419966.html
#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外设开发笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!