首页 > 编程语言 >基于全志D1-H哪吒的 自动寻路小车-附源码

基于全志D1-H哪吒的 自动寻路小车-附源码

时间:2022-10-20 15:35:16浏览次数:67  
标签:echo system 全志 sys 源码 gpio D1 class define

本文内容为【玄铁杯第二届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);
	//printf("1\n");

}

void RUN()
{
	system(LOWGPIO1);//0
	system(HIGHGPIO2);//1
	system(HIGHGPIO3);//1
	system(LOWGPIO4);//0
//	printf("2\n");

}
void STOP()
{
	system(LOWGPIO1);
	system(LOWGPIO2);
	system(LOWGPIO3);
	system(LOWGPIO4);
	//printf("3\n");
}
void LEFT()
{
	system(LOWGPIO1);//0
	system(HIGHGPIO2);//1
	system(HIGHGPIO3);//1
	system(HIGHGPIO4);//1
}
void RIGHT()
{
	system(HIGHGPIO1);//1
	system(HIGHGPIO2);//1
	system(HIGHGPIO3);//1
	system(LOWGPIO4);//0
}
void BACK()
{
	system(HIGHGPIO1);//1
	system(LOWGPIO2);//0
	system(LOWGPIO3);//0
	system(HIGHGPIO4);//1
}
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);
	//printf("%d,%d,%d,%d",l1,l2,r1,r2);
	if(l1&&l2&&r1&&r2){
		MOTORRUN(run);
		printf("直走\n");
	}
	else if(l1+l2<r1+r2){
        printf("右转\n");
		//MOTORRUN(back);
		sleep(0.5);
		MOTORRUN(right);
	}

	else if(l1+l2>r1+r2){
	//	MOTORRUN(back);
		printf("左转\n");
		sleep(0.5);
		MOTORRUN(left);
	}
	else if(!r1&&!r2&&!l1&&!l2){
            printf("停止\n");
		MOTORRUN(stop);
	}

}

int main(void)
{
	INIT();
	while(1)
	{
	 TRACE();
	// printf("2022");
	// sleep(1); 
	// RUN();
	 sleep(0.5);
	// STOP();
	 }return 0;

}

六、视频演示

标签:echo,system,全志,sys,源码,gpio,D1,class,define
From: https://blog.51cto.com/u_15380233/5776256

相关文章

  • Eureka 源码之服务端接收注册信息
    Eureka注册中心系列文章汇总:[领导让我研究Eureka源码|启动过程][领导“叕”让我研究Eureka源码:注册过程[值得收藏的Eureka控制台详解]大家好,我是悟空。本篇从......
  • ctfshow web136(无回显命令rce+直接修改php源码?!)
    functioncheck($x){if(preg_match('/\\$|\.|\!|\@|\#|\%|\^|\&|\*|\?|\{|\}|\>|\<|nc|wget|exec|bash|sh|netcat|grep|base64|rev|curl|wget|gcc|php|python|pingtou......
  • JKD1.5之后利用关键字Enum来创建枚举类
    JDK1.5之后使用Enum关键字创建枚举类 变成下面的枚举类 packagecom.msb.enum02;/***开发人:liu*日期:16:01:37*描述:定义枚举类:季节*版本:1.0*/......
  • Eureka 源码之客户端首次获取注册表
    大家好,我是悟空。Eureka注册中心系列文章汇总:[领导让我研究Eureka源码|启动过程][领导“叕”让我研究Eureka源码:注册过程][值得收藏的Eureka控制台详解][原来......
  • Vue—关于插件(源码级别的插件分析+实践)
    在Vue中提供了use方法来安装插件,那么Vue插件的原理是什么呢?一、Vue.useuse方法官方描述如下图:也就是说Vue.use()方法接收一个函数或者提供install方法的对象作为参数(必......
  • android类加载源码分析
    Dex文件加载过程PathClassLoader和DexClassLoader都可以加载dex和apk文件,其对应的基类都是BaseDexClassLoader。在new一个PathClassLoader/DexClassLoader对象时就会调......
  • vue源码解析
           入口   在runtime经过再次扩展  在core下的index再次被扩展   最后是core的instance里是真正的vue构造函数继续扩展vue实......
  • Linux源码编译——添加新模块
    C源码文件(如new_module.c)添加到适当目录在menuconfig中增加新条目:修改C源码文件所在目录下的Kconfig文件,参考该文件中已有的编译选项照猫画虎,添加新的项configNEW_MOD......
  • weblogic洞若观火第3篇之源码安装weblogic
    引言上一篇文章,主要讲解:集群规划设计、主流的规划方案、企业级的集群规划。在本篇文章中,我们接着介绍:weblogic的源码安装。服务器规划本次搭建使用的虚拟机,相信很多兄弟......
  • Java中Excel的irr函数计算(附源码)
    publicstaticdoubleirr(double[]income){returnirr(income,0.1D);}publicstaticdoubleirr(double[]values,doubleguess){......