1. 全志H616课程概述(456.01)
1.1 为什么学
- 学习目标依然是Linux系统,平台是ARM架构
- 蜂巢快递柜,配送机器人,这些应用场景用 C51、STM32 单片机无法实现
- 第三方介入库的局限性,比如刷脸支付和公交车收费设备需要集成支付宝 SDK,提供的 libalipay.so 是 Linux 的库,设备必须跑 Linux系统
- 图像识别,音频,视频等领域的技术支撑也无法脱离 Linux 系统
- 人工智能型设备通常需要更好的系统和更高的算力,所以 Linux 也是必不可少
- 能跑 Linux 的一般为 X86,ARM,MIPS,PowerPC 等架构,而 ARM 市场占有率最大
- 综上所述就是一句话:嵌入式软件工程师如果技术栈不存在 Linux-ARM 的开发经验,那么面向的工作岗
位就会带很多局限性,天花板有容易来的过早,在技术积累阶段对于这个知识的学习是必不可少的,但
是这个方向水深,需要客观且科学的选择适合的角度学习。
1.2 学什么
- 这个领域的程序员一般分三个方向:
- 应用开发,通过跟产品业务相关,比如智能家居中控板,可以是 C++QT,可以是 C GTK,也可以是 Android 页面,也可以是基于串口屏的UI交互,后台数据交互和系统交互都是基于 Linux 系统的,初级工程师以这个方向入行居多,也容易上手,招聘岗位也很多
- 系统开发,主要任务是为硬件工程师设计的产品板操作系统,比如 uboot,Linux 内核,文件系统等,一般为中高级嵌入式工程师,新手如果以这个方向入行,压力相对更大,一般原厂公司会招聘,岗位相对少
- 算法工程师,此类算法跟数学模型挂钩,比如人脸识别的图像不调库处理,语音识别算法如讯飞语音的工程师,一般博士一大堆,硕士满天飞的现状
- 根据现有就业案例,大专本科生以应用开发入行为主,在工作一两年可能会根据公司安排走系统开发,也可能一直做应用,薪资待遇并不完全由技术方向决定,还是看个人发展和公司的关系,当然还有城市,学校等因素。硕士可根据面试结果选择应用,系统,算法都行
2. H616开发板OrangePizero2介绍(457.02)
- 学习平台至于用树莓派,海思,全志都无所谓,初级工程师掌握的是 Linux-ARM 的软硬件架构开发,主要是Linux系统的学习,只有入职后的中高级工程师才会考虑算法或者协议对底层硬件的差异化,第一版本这部分的内容以树莓派讲解,就业学员入职海康威视,OPPO,全志,移远等公司可以完美过度,所以板材的选择根据教程就行,学的是 Linux 系统
- 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 口
- 电源指示灯和状态指示灯
- 配套操作系统支持
3. 开发板刷机和系统登录(458.03)
- 就像买了电脑,出厂带有 windows 操作系统,才算是正在的电脑,开发板需要烧写对应的系统固件,才能正常发挥作用
- 工具
- Orangepi Zero2 全志H616开发板
- PC机
- TF卡及读卡器
- 操作系统镜像
- SDFormatter TF卡的格式化工具
- Win32Diskimager 刷机工具
- USB转TTL,用于系统烧写后的串口登录开发板
- 工具安装
- SDFormatter傻瓜式安装,Win32Diskimager傻瓜式安装
- 刷机
- Orangepizero2_3.0.6_ubuntu_jammy_desktop_xfce_linux5.16.17.img
登录系统
- 供电
- TypeC 口,需要插到 5V/2A 或者 5V/3A 的电源适配头,特别是开发板有接多个外设模块的时候
- 平常 USB 供电用电脑可以,前提是不接多外设模块
- 后面做小车等项目,用电池供电可以参考如下供电方式
- 登录
- 使用 USB 转 TTL 模块,使用 MobaXterm 免费好用,类似的工具还有 Putty 相对太简陋,SecurityCRT 老牌
工具需要付费或者破解 - USB 转 TTL 模块 GND、TX 和 RX 引脚需要通过杜邦线连接到开发板的调试串口上
a. USB 转 TTL 模块的 GND 接到开发板的 GND 上
b. USB 转 TTL 模块的 RX 接到开发板的 TX 上
c. USB 转 TTL 模块的 TX 接到开发板的 RX 上
- 电脑安装 ch340 驱动
- 使用 mobaXterm 登陆,默认登陆密码:
- 用户:orangepi 密码:orangepi
- 用户:root 密码:orangepi
- 板载 LED 灯测试说明
- 使用 USB 转 TTL 模块,使用 MobaXterm 免费好用,类似的工具还有 Putty 相对太简陋,SecurityCRT 老牌
4. 开发板配置网络SSH登录(459.04)
1. 修改登陆密码
sudo passwd orangepi
2. 网络配置
- 命令扫描周围的WIFI热点:
nmcli dev wifi
- 命令接入网络:
nmcli dev wifi connect Jessie password 1234567890
- 查看IP地址
ip addr show wlan0
ifconfig
也可以
3. SSH登陆开发板
- 这是企业开发调试必用方式,相比串口来说不用接线,前提是接入网络并获得板子 IP 地址,且系统做了 SSH 的服务器,本镜像自带 SSH 服务器,所以通过 mobaXterm 登陆就行
- 若需搭建 SSH 服务器,参考文章
- 复制窗口
4. 命令测试
echo jessieShuai >> file1
:将字符串 “jessieShuai” 追加到名为 “file1” 的文件中。
- 其他命令测试
5. 修改开发板内核启动日志级别(460.05)
- 串口连接开发板到电脑
- 开发板重新上电
- 登陆orangepi
sudo vi /boot/orangepiEnv.txt
:wq
退出sudo reboot
6. 官方外设库SDK安装和验证(461.06)
- 方法一:直接在终端下载
git clone https://github.com/orangepi-xunlong/wiringOP //下载源码
cd wiringOP //进入文件夹
sudo ./build clean //清除编译信息,实测可以不用
sudo ./build //编译
- 方法二:先将压缩包下载至 win 本地
通过 windows 浏览器打开 https://github.com/orangepi-xunlong/wiringOP
下载压缩包至本地
把压缩包通过xterm传到开发板
解压 unzip xxx.zip
cd xxx
sudo ./build
gpio readall
- 验证指令:
gpio readall
- 如下方所示,外设库就完成安装了
7. 老演员蜂鸣器BB响(462.07)
- vim 的设置,修改 /etc/vim/vimrc 文件,需要用超级用户权限
sudo vi /etc/vim/vimrc
set tabstop=4 //设置tab键缩进4个空格(默认是8)
set nu //显示行号
set shiftwidth=4 //设置批量对齐时候的tab键空格数为4(默认是8)
- 简易编译的 shell脚本:
./build.sh
//build.sh
gcc beep.c -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt
- /hardwareSoft/beep.c
#include <stdio.h>
#include <wiringPi.h>
#include <unistd.h>
#define BEEP 0 // 设置针脚0为蜂鸣器的控制引脚
int main(void)
{
wiringPiSetup(); // 初始化wiringPi库
pinMode(BEEP, OUTPUT); // 设置IO口的输入输出,输出
while (1)
{
// sleep(1); // 1s
usleep(100000); // 100ms
digitalWrite(BEEP, LOW); // 设置IO口输出低电平,蜂鸣器响
// sleep(1);
usleep(100000);
digitalWrite(BEEP, HIGH); // 设置IO口输出高电平,蜂鸣器不响
}
return 0;
}
8. 上节课遗留问题(463.08)
- shell脚本小插曲
- ./build beep.c 对应 $0 $1
- shell脚本处理参数:可通过$x来处理,$0是命令,$1是要编译的文件
- build.sh
gcc $1 -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt
9. 超声波测距原理(464.09)
1. 测距原理基本说明
超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离
-
型号:HC-SR04
-
接线参考:模块除了两个电源引脚外,还有TRIG,ECHO引脚
-
怎么让它发送波
- Trig ,给Trig端口至少10us的高电平
-
怎么知道它开始发送了
- Echo信号,由低电平跳转到高电平,表示开始发送波
-
怎么知道接收了返回波
- Echo,由高电平跳转回低电平,表示波回来了
-
怎么算时间
Echo引脚维持高电平的时间!- 波发出去的那一刻,开始启动定时器;
- 波返回来的拿一刻,开始停止定时器;
计算出中间经过多少时间。
-
怎么算距离
- 距离 = 速度 (340m/s)* 时间/2
2. 时序
3. 时间函数
- 函数原型
#include<sys/time.h>
int gettimeofday(struct timeval *tv,struct timezone *tz )
- gettimeofday() 会把目前的时间用 tv 结构体返回,当地时区的信息则放到 tz 所指的结构体中
struct timeval
{
long tv_sec;/*秒*/
long tv_usec;/*微妙*/
};
10. Linux算时差方法-可用于程序运行效率比较(465.10)
- /hardwareSoft/timeCnt10w.c
#include <sys/time.h>
#include <stdio.h>
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数到10w耗时%ldus\n", diffTime);
return 0;
}
11. 超声波测距代码编程实现(466.11)
- /hardwareSoft/csb.c
#include <stdio.h> //printf
#include <sys/time.h> //gettimeofday
#include <wiringPi.h> //gpio
#include <stdlib.h> //exit
#include <unistd.h> //usleep
#define Trig 0
#define Echo 1
double getDistance()
{
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);
double dis = (double)diffTime/1000000 * 340*100 / 2;
return dis;
}
int main()
{
double dis;
if(wiringPiSetup() == -1){
fprintf(stderr,"%s","init wiringPi error");
exit(-1);
}
while(1){
dis = getDistance();
printf("dis = %lf\n\n",dis);
usleep(500000);
}
return 0;
}
- fprintf(stderr, “%s”, “init wiringPi error”); 和 perror(“why”);