目录
一. 开发板简单介绍
镜像系统默认登录密码
二. 修改操作系统配置
2.1 修改登录密码
sudo passwd orangepi
2.2 网络配置
nmcli dev wifi 扫描附近wifi(按q退出)
nmcli dev wifi connect <用户名> password <密码> 命令接入网络
ifconfig 或者 ip addr show wlan0 查看IP地址
2.3 ssh远程登陆开发板
前提: 首先通过串口进行连接
a. 成功连接网络(一定要先连接网络),最好连接手机热点
b. 获得IP地址
c. 系统做了SSH的服务器,sudo service sshd status查看ssh状态
Vscode 通过ssh远程连接开发板:
a. 下载相关的插件
b. 选择将当前窗口连接到主机,输入ssh <用户名>@<IP地址>,按回车键。然后点击左下角的打开远程窗口,选择连接到主机,选择对应的IP地址。
2.4 修改开发板内核启动日志级别
a. sudo vi /boot/orangepiEnv.txt
b. 修改内核输出启动的权限 verbosity=7 (等于1时被屏蔽掉了)
修改为通过串口输出信息 console=serial
c. 保存后进行重启即可 sudo reboot
2.5 修改MobaXterm缩进问题
sudo vi /etc/vim/vimrc
添加下面内容
set tabstop=4
set shiftwidth=4
set nu
三.基于官方外设开发
3.1 wiringPi外设SDK安装
a. 通过windows浏览器打开https://github.com/orangepi-xunlong/wiringOP下载压缩包保存在桌面
b. 新建文件夹 mkdir wringpifromwin
c. 进入文件夹中 cd wringpifromwin
d. 把压缩包通过MobaXterm传到wringpifromwin文件夹中
输入ls , 显示出wiringOP-next.zip
e. 解压 unzip wiringOP-next.zip
d. 输入ls ,显示出wiringOP-next 和 wiringOP-next.zip
f. 进入到wiringOP-next中 cd wiringOP-next
输入ls会显示出build,update等等
进行安装 sudo ./build
g. 验证指令: gpio readall
3.2 蜂鸣器开发
a. 在蜂鸣器源程序的共同文件夹下,创建文件名为build.sh的文件夹用于存放编译脚本。
b. 进入到wringPi外设库中找到编译脚本并复制
vi ../wringpifromwin/wringOP-master/examples/Makefile
c. 将刚才复制的脚本粘贴到build.sh文件中
gcc $1 -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt -o $2
d. 授予 build.sh
文件执行权限:
chmod +x build.sh
e. 进行编译
./build.sh A.c -o A.out
f. 调用超级用户去运行
sudo ./A.out
#include <stdio.h>
#include <unistd.h>
#include <wiringPi.h>
#define BEEP 0
int main(){
wiringPiSetup(); //初始化wiringPi库
pinMode(BEEP,OUTPUT); //设置IO口的输入输出,输出
digitalWrite(BEEP,LOW); //设置IO口输出低电平,蜂鸣器响
sleep(2);
digitalWrite(BEEP,HIGH); //设置IO口输出高电平,蜂鸣器不响
return 0;
}
3.3 超声波开发
利用函数 gettimeofday() 实现计时。
//触发: 给Trig端口至少10us的高电平
//开始发送波: Echo由低电平跳转到高电平
//接收了返回波: Echo由高电平跳转回低电平
//怎么算时间: Echo引脚维持高电平的时间
//怎么算距离: 距离=速度(340m/s)*时间/2
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <stdlib.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);
//1.触发
digitalWrite(Trig,LOW);
usleep(5);
digitalWrite(Trig,HIGH);
usleep(10);
digitalWrite(Trig,LOW);
while(!digitalRead(Echo));
//2.开始发送波
gettimeofday(&start,NULL);
while(digitalRead(Echo));
//3.Echo变为低电平表示接受到波,不满足循环退出
gettimeofday(&stop,NULL);
//4.计算来回时间
long diffTime = 1000000*(stop.tv_sec-start.tv_sec)+(stop.tv_usec-start.tv_usec);
printf("diffTime = %ld us\n",diffTime);
//5.计算距离
dis=((double)diffTime/2000000)*34000;
return dis;
}
int main(){
double dis;
if(wiringPiSetup()==-1){
fprintf(stderr,"%s","initWringPi error");
exit(-1);
}
while(1){
dis = getDistance();
printf("dis=%.3lf cm\n",dis);
sleep(2);
}
return 0;
}
3.4 舵机开发
setitimer(ITIMER_REAL,&itv,NULL) 函数实现定时。
signal(SIGALRM,signal_handler) 函数捕捉到中断信号后调用中断信号。
/**SG90舵机开发*/
/**向黄色信号线灌入PWM信号来控制舵机角度
PWM波频率50HZ,周期0.02s=20ms
角度0: 高电平持续0.5ms,低电平持续19.5ms
角度45: 高电平持续1ms,低电平持续19ms
角度90: 高电平持续1.5ms,低电平持续18.5ms
角度135:高电平持续2.0ms,低电平持续18ms
角度180:高电平持续2.5ms,低电平持续17.5ms
定时器定时0.5ms,爆表40次,为20ms
*/
#include <stdio.h>
#include <sys/time.h>
#include <signal.h>
#include <stdlib.h>
#include <wiringPi.h>
#define SG90Pin 5
int jd;
static int i = 0;
//每经过0.5us爆表1次,调用中断函数
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; //500us = 0.5ms
//设定多久启动定时器
itv.it_value.tv_sec=1;
itv.it_value.tv_usec=0;
//设定定时方式
setitimer(ITIMER_REAL,&itv,NULL);
//信号处理
signal(SIGALRM,signal_handler);
while(1){
printf("input jd: 1-0度 2-45度 3-90度 4-135度\n");
scanf("%d",&jd);
}
return 0;
}
3.5 oled屏开发 - IIC协议
a. Orange Pi下可用的i2c为i2c3 , 启动linux系统后,先确认下/dev下是否存在i2c-3的设备节点。
b. 如果使用的为 Linux5.16 内核的系统,i2c3 默认是关闭的,需要手动打开才能使用。
sudo vim /boot/orangepiEnv.txt,添加 overlays=uart5 i2c3,然后重启 Linux 系统就可以看到i2c3。
c. 安装i2c-tools,sudo apt-get install i2c-tools
e. 扫描I2C总线的设备,sudo i2cdetect -y 3
f. cd /wiringPiFromWindows/wiringOP-next/examples 找到oled_demo.c测试源代码进入后复制源程序,在/Desktop/Class下新建文件oled.c然后粘贴刚才的源代码。
e. ./build.sh oled.c oled.out 进行编译
sudo ./oled.out /dev/i2c-3 进行运行
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdint.h>
#include "oled.h"
#include "font.h"
//在 OLED 显示器上展示一个演示内容
int oled_demo(struct display_info *disp) {
//显示欢迎信息 "Welcome to"
oled_putstrto(disp, 0,0, "Welcome to MyOrangerPi");
disp->font = font1;
//将显示缓冲区内容发送到OLED显示器进行渲染
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;
//A. 判断命令行参数<2时,终端打印错误信息
if (argc < 2) {
show_usage(argv[0]);
return -1;
}
//B. 将存储在 disp 变量中的所有数据清零
memset(&disp, 0, sizeof(disp));
//sudo ./a.out /dev/i2c-3
// argv[0] argv[1]
//C. 传递指定程序使用的 I2C 设备节点给filename
sprintf(filename, "%s", argv[1]);
//D. #define OLED_I2C_ADDR 0x3c
// oled屏幕的地址
disp.address = OLED_I2C_ADDR;
disp.font = font2;
e = oled_open(&disp, filename);
e = oled_init(&disp);
//在 OLED 显示器上展示一个演示内容
printf("---------start--------\n");
oled_demo(&disp);
printf("----------end---------\n");
return 0;
}
3.6 串口开发
1.首先进入到wiringPiFromWindows/wiringOP-next/examples
2.找到串口开发测试文件serialTest.c文件并复制代码
3.粘贴后,修改刚才的测试代码
serialtest.c
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include "uartTool.h"
#include <unistd.h>
#include <pthread.h>
int fd;
void *Sendhandler(){
char sendBuf[32];
while(1){
memset(sendBuf,'\0',32);
scanf("%s",sendBuf);
serialSendstring (fd,sendBuf);
}
}
void *Readhandler(){
char readBuf[32];
while(1){
memset(readBuf,'\0',32);
serialGetstring(fd,readBuf);
printf("%s\n",readBuf);
}
}
int main (int argc,char **argv)
{
char deviceName[32] = {'\0'};
strcpy(deviceName,argv[1]);
//A. 打开串口并配置波特率为115200
fd = myserialOpen (deviceName, 115200);
//C. 创建线程,用于发送数据
pthread_t idSend;
pthread_t idRead;
pthread_create(&idSend,NULL,Sendhandler,NULL);
pthread_create(&idRead,NULL,Readhandler,NULL);
//D. 循环检测数据,接收数据
while(1){
sleep(10);
}
return 0 ;
}
uartTool.c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
//打开串口并配置串口属性
int myserialOpen (const char *device, const int baud)
{
struct termios options ;
speed_t myBaud ;
int status, fd ;
switch (baud)
{
case 9600: myBaud = B9600 ; break ;
case 115200: myBaud = B115200 ; break ;
}
//=======================================1. 打开串口=======================================
fd = open (device, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK);
//将fd 的状态标记设置为可读写模式,确保文件描述符可以被读取和写入
fcntl (fd, F_SETFL, O_RDWR) ;
//=======================================2. 配置串口属性=======================================
//获取当前串口的属性配置,并将其保存在 options 结构体中
tcgetattr (fd, &options) ;
//设置串口为原始模式
cfmakeraw (&options) ;
cfsetispeed (&options, myBaud) ;
cfsetospeed (&options, myBaud) ;
//配置串口
options.c_cflag |= (CLOCAL | CREAD) ;
options.c_cflag &= ~PARENB ;
options.c_cflag &= ~CSTOPB ;
options.c_cflag &= ~CSIZE ;
options.c_cflag |= CS8 ;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG) ;
options.c_oflag &= ~OPOST ;
options.c_cc [VMIN] = 0 ;
options.c_cc [VTIME] = 100 ;
//=======================================3. 将修改后的串口属性立即应用到串口=======================================
//将修改后的串口属性应用到串口
tcsetattr (fd, TCSANOW, &options) ;
//=======================================4. 设置串口为已经准备好发送和接受数据=======================================
//获取当前串口控制信号的状态,并将状态值保存在变量 status 中
ioctl (fd, TIOCMGET, &status);
//控制信号设置为高电平状态,表示串口已经准备好发送和接收数据
status |= TIOCM_DTR ;
status |= TIOCM_RTS ;
//将修改后的控制信号状态应用到串口,确保设备正确配置和准备好进行数据的发送和接收操作。
ioctl (fd, TIOCMSET, &status);
//=======================================5. 延时一段时间确保串口配置成功=======================================
usleep (10000) ;// 10mS
return fd ;
}
//关闭串口
void myserialClose (const int fd)
{
close (fd) ;
}
//发送字符串
void serialSendstring (const int fd, const char *s)
{
write (fd, s, strlen (s));
}
//接受字符串
int serialGetstring (const int fd,char *buffer)
{
int n_read;
n_read = read (fd, buffer, 32);
return n_read;
}
uartTool.h
int myserialOpen (const char *device, const int baud);
void myserialClose (const int fd);
void serialSendstring (const int fd, const char *s);
int serialGetstring (const int fd,char *buffer);
编译 gcc serialtest.c uartTool.c -lpthread
运行 ./a.out /dev/ttyS5
四.下载Source insight代码查看工具
利用Source insight代码查看工具查看wiringPi库的各个源程序
a. 下载wiringpi库源文件并在同目录下新建文件夹si用于方便存放工程文件
b. 打开Source insight软件,新建工程保存在si文件夹当中
c. 选择wiringOP-master,点击Add all,然后关闭就可以看到wiringPI库的各个源程序
】
d. Source insight软件的英文乱码解决方法
Preferences-> Syntax Formatting ->Use only color formatting前面的钩选上
e. 同步所有源代码
Project->Synchronize Files,然后点击OK即可