Orangepi 全志H616开发

目录

一. 开发板简单介绍

二. 修改操作系统配置

2.1 修改登录密码

2.2 网络配置

2.3 ssh远程登陆开发板

2.4 修改开发板内核启动日志级别

2.5 修改MobaXterm缩进问题

三.基于官方外设开发

3.1 wiringPi外设SDK安装

3.2 蜂鸣器开发

3.3 超声波开发

3.4 舵机开发

3.5 oled屏开发 - IIC协议

3.6 串口开发

四.下载Source insight代码查看工具


一. 开发板简单介绍

5eff71f3dda84821b47e1def1848621e.png

 2f7041d357474b90a49440f3b4d8be59.png

9a87a1b91efb4f4bb7dbe4b27ee8f54f.png

       镜像系统默认登录密码

  737b80b7dd2646158a0564999360c23d.png

二. 修改操作系统配置

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. 下载相关的插件f5fd923e8d8740698d985dd4ff94041f.png

        b. 选择将当前窗口连接到主机,输入ssh <用户名>@<IP地址>,按回车键。然后点击左下角的打开远程窗口,选择连接到主机,选择对应的IP地址。

d46ccb9a34694ad7b695f6435baea461.png

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即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@尘音

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值