本文内容为【玄铁杯第二届RISC-V应用创新大赛】作业
作者:智航追迹队
原文链接:https://occ.t-head.cn/community/post/detail?spm=a2cl5.14300636.0.0.429d180fr0b8Om&id=4094245965412765696
一、项目背景
随着我国人工智能技术的进一步发展,自动驾驶汽车吸引了越来越多的目光,巡线是其行走控制方法之一,人们对智能循迹小车适应各种复杂路况的性能、安全平稳性等的要求越来越高,所以我们小组想要做一个智能寻路+避障小车。
##二、Demo的整体框架
三、具体实施方案
①首先,根据哪吒开发板的原理框图了解开发板的工作原理,不同类型的引脚能实行怎样的功能,怎么使各引脚工作起来。
②在电脑上安装Ubuntu环境,进行编译环境配置,源码下载,编译和烧写。
③成功尝试了使用哪吒开发板运行的第一个HelloWorld程序和USB拍照程序。
④上网购买智能小车的所有部件:1个亚克力双层智能小车套件;2个L298N电机驱动模块;三种类型的杜邦线各一排;1个四路红外探测循迹光电传感器模块;4节5号电池。
⑤安装、连接、测试小车的行走功能。
⑥编写代码,调节红外探测的灵敏度使小车能够较为准确的感知周围环境并且运行测试成功。
⑦调试代码,完善小车的功能。
四、软件、硬件介绍
- 软件: Oracle VM VirtualBox Ubuntu 14.04虚拟机系统、全志USB烧录驱动、AllwinnertechPhoeniSuitRelease工具。
- 硬件:哪吒开发板、USB数据传输、USB供电、海康威视摄像机、组装好的智能小车。
五、作品源码
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include <unistd.h>
#define EXPORT_GPIO1 "echo 2027 > /sys/class/gpio/export"
#define EXPORT_GPIO2 "echo 2020 > /sys/class/gpio/export"
#define EXPORT_GPIO3 "echo 2021 > /sys/class/gpio/export"
#define EXPORT_GPIO4 "echo 2022 > /sys/class/gpio/export"
#define UEXPORT_GPIO1 "echo 2027 > /sys/class/gpio/unexport"
#define UEXPORT_GPIO2 "echo 2020 > /sys/class/gpio/unexport"
#define UEXPORT_GPIO3 "echo 2021 > /sys/class/gpio/unexport"
#define UEXPORT_GPIO4 "echo 2022 > /sys/class/gpio/unexport"
#define GPIO1_OUTPUT "echo out > /sys/class/gpio/gpio2027/direction"
#define GPIO2_OUTPUT "echo out > /sys/class/gpio/gpio2020/direction"
#define GPIO3_OUTPUT "echo out > /sys/class/gpio/gpio2021/direction"
#define GPIO4_OUTPUT "echo out > /sys/class/gpio/gpio2022/direction"
#define LOWGPIO1 "echo 0 > /sys/class/gpio/gpio2027/value"
#define LOWGPIO2 "echo 0 > /sys/class/gpio/gpio2020/value"
#define LOWGPIO3 "echo 0 > /sys/class/gpio/gpio2021/value"
#define LOWGPIO4 "echo 0 > /sys/class/gpio/gpio2022/value"
#define HIGHGPIO1 "echo 1 > /sys/class/gpio/gpio2027/value"
#define HIGHGPIO2 "echo 1 > /sys/class/gpio/gpio2020/value"
#define HIGHGPIO3 "echo 1 > /sys/class/gpio/gpio2021/value"
#define HIGHGPIO4 "echo 1 > /sys/class/gpio/gpio2022/value"
#define EXPORT_HW1 "echo 2023 > /sys/class/gpio/export"
#define EXPORT_HW2 "echo 2024 > /sys/class/gpio/export"
#define EXPORT_HW3 "echo 2025 > /sys/class/gpio/export"
#define EXPORT_HW4 "echo 2026 > /sys/class/gpio/export"
#define HW1_INPUT "echo in > /sys/class/gpio/gpio2023/direction"
#define HW2_INPUT "echo in > /sys/class/gpio/gpio2024/direction"
#define HW3_INPUT "echo in > /sys/class/gpio/gpio2025/direction"
#define HW4_INPUT "echo in > /sys/class/gpio/gpio2026/direction"
#define UNEXPORT_HW1 "echo 2023 > /sys/class/gpio/unexport"
#define UNEXPORT_HW2 "echo 2024 > /sys/class/gpio/unexport"
#define UNEXPORT_HW3 "echo 2025 > /sys/class/gpio/unexport"
#define UNEXPORT_HW4 "echo 2026 > /sys/class/gpio/unexport"
#define run 1
#define left 3
#define right 4
#define back 2
#define stop 5
void INIT()
{
system(EXPORT_GPIO1);
system(EXPORT_GPIO2);
system(EXPORT_GPIO3);
system(EXPORT_GPIO4);
system(EXPORT_HW1);
system(EXPORT_HW2);
system(EXPORT_HW3);
system(EXPORT_HW4);
system(GPIO1_OUTPUT);
system(GPIO2_OUTPUT);
system(GPIO3_OUTPUT);
system(GPIO4_OUTPUT);
system(HW1_INPUT);
system(HW2_INPUT);
system(HW3_INPUT);
system(HW4_INPUT);
}
void RUN()
{
system(LOWGPIO1);
system(HIGHGPIO2);
system(HIGHGPIO3);
system(LOWGPIO4);
}
void STOP()
{
system(LOWGPIO1);
system(LOWGPIO2);
system(LOWGPIO3);
system(LOWGPIO4);
}
void LEFT()
{
system(LOWGPIO1);
system(HIGHGPIO2);
system(HIGHGPIO3);
system(HIGHGPIO4);
}
void RIGHT()
{
system(HIGHGPIO1);
system(HIGHGPIO2);
system(HIGHGPIO3);
system(LOWGPIO4);
}
void BACK()
{
system(HIGHGPIO1);
system(LOWGPIO2);
system(LOWGPIO3);
system(HIGHGPIO4);
}
void MOTORRUN(int cmd)
{
switch(cmd)
{
case 1:
RUN();
break;
case 2:
BACK();
break;
case 3:
LEFT();
break;
case 4:
RIGHT();
break;
case 5:
STOP();
break;
}
}
int GETHW(int gpio)
{
char path[64];
char value_str[3];
int fd;
snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", gpio);
fd = open(path, O_RDONLY);
if (fd < 0) {
perror("Failed to open gpio value for reading!");
return -1;
}
if (read(fd, value_str, 3) < 0) {
perror("Failed to read value!");
return -1;
}
close(fd);
return (atoi(value_str));
}
void TRACE()
{
int l1=GETHW(2023);
int l2=GETHW(2024);
int r1=GETHW(2025);
int r2=GETHW(2026);
if(l1&&l2&&r1&&r2){
MOTORRUN(run);
printf("直走\n");
}
else if(l1+l2<r1+r2){
printf("右转\n");
sleep(0.5);
MOTORRUN(right);
}
else if(l1+l2>r1+r2){
printf("左转\n");
sleep(0.5);
MOTORRUN(left);
}
else if(!r1&&!r2&&!l1&&!l2){
printf("停止\n");
MOTORRUN(stop);
}
}
int main(void)
{
INIT();
while(1)
{
TRACE();
sleep(0.5);
}return 0;
}
六、视频演示