开源项目|“智慧光伏”开源项目技术文档

news2024/10/10 15:47:14

【基于ELF 1开发板完成的“智慧光伏”项目】

“智慧光伏”项目能够智能追踪阳光的移动轨迹。通过内置的光敏传感器和智能控制系统,实时感知周围光源的变化,并驱动太阳能板精准调整角度,确保每一缕阳光都能被最大化地捕捉和利用。下面就和各位小伙伴详细介绍一下这一开源项目是怎样实现的。

环境说明

1.开发环境操作系统:Ubuntu18.04 64位版

2.交叉编译工具链:arm-poky-linux-gnueabi-gcc5.3.0

3.开发板使用Bootloader版本:u-boot-2016.03

4.开发板内核版本:linux-4.1.15

5.开发板移植QT版本:qt5.6.2

一、 硬件连接

1、四路光敏传感器与板卡的连接

2、舵机与板卡的连接

二、内核适配

1、实现舵机转动的功能

MG90S舵机采用pwm的方式来控制,该项目需要用到两个舵机,所以需要在设备树中进行pwm7、pwm8的复用。

(1)拷贝ELF1开发板资料包\02-Linux 源代码\02-0 出厂内核和uboot源码\内核源码\linux-4.1.15-elf1.tar.bz2内核源码到开发环境/home/elf/work/目录下解压

elf@ubuntu:~/work$ tar -xvf linux-4.1.15-elf1.tar.bz2

(2)修改顶层设备树文件arch/arm/boot/dts/imx6ull.dtsi

elf@ubuntu:~/work$ cd linux-4.1.15-elf1/
elf@ubuntu:~/work/linux-4.1.15-elf1$ vi arch/arm/boot/dts/imx6ull.dtsi

(3)修改设备树文件arch/arm/boot/dts/imx6ull-elf1-emmc.dts

elf@ubuntu:~/work/linux-4.1.15-elf1$ vi arch/arm/boot/dts/imx6ull-elf1-emmc.dts

添加pwm7、pwm8设备节点

&pwm7 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_pwm7>;
        status = "okay";
};
​
&pwm8 {
​
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_pwm8>;
        status = "okay";
};


在iomux节点下面添加pwm7、pwm8引脚复用

pinctrl_pwm7: pwm7grp {
       fsl,pins = <
             MX6UL_PAD_CSI_VSYNC__PWM7_OUT     0x110b0
      >;
};
​
pinctrl_pwm8: pwm8grp {
       fsl,pins = <
             MX6UL_PAD_CSI_HSYNC__PWM8_OUT     0x110b0
      >;
};

取消其它用到csi功能的地方

至此pwm7、pwm8已经复用完成

2、实现获取光照值的功能

四路光敏传感器需要四路adc,需要在设备树中进行adc1、adc2、adc3、adc4的复用

(1)修改设备树文件arch/arm/boot/dts/imx6ull-elf1-emmc.dts

elf@ubuntu:~/work$ cd linux-4.1.15-elf1/
elf@ubuntu:~/work/linux-4.1.15-elf1$ vi arch/arm/boot/dts/imx6ull-elf1-emmc.dts

在iomux节点下面添加adc1、adc2、adc3、adc4引脚复用

pinctrl_adc1: adc1grp {
       fsl,pins = <
             MX6UL_PAD_GPIO1_IO05__GPIO1_IO05        0x00b0
             MX6UL_PAD_GPIO1_IO01__GPIO1_IO01        0x00b0
             MX6UL_PAD_GPIO1_IO02__GPIO1_IO02        0x00b0
             MX6UL_PAD_GPIO1_IO03__GPIO1_IO03        0x00b0
             MX6UL_PAD_GPIO1_IO04__GPIO1_IO04        0x00b0
       >;
};

注释掉其它用到GPIO1_IO01、GPIO1_IO02、GPIO1_IO03、GPIO1_IO04功能的地方

至此adc已经复用完成

3、编译并替换设备树

(1)执行环境变量

elf@ubuntu:~/work/linux-4.1.15-elf1$ . /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

(2)编译设备树

elf@ubuntu:~/work/linux-4.1.15-elf1$ make imx6ull_elf1_defconfig
elf@ubuntu:~/work/linux-4.1.15-elf1$ make dtbs

三、数据采集和设备控制

1、程序设计

主函数的实现main.cpp

int main() {
    int up = 0;
    int down = 0;
    int left = 0;
    int right = 0;
    int duty_cycle6 = DUTY_90_DEG;
    int duty_cycle7 = DUTY_90_DEG;
    int adcChannels[] = {1, 2, 3, 4};
    int adcValues[4] = {0}; 
    
    init_pwm();
    write_file(PWM6_DUTY_CYCLE, duty_cycle6);
    write_file(PWM7_DUTY_CYCLE, duty_cycle7);
​
    while (1) {
      for (int i = 0; i < 4; ++i) {
           adcValues[i] = read_adc_value(adcChannels[i]);
         }
      up = (adcValues[3] + adcValues[0]) ;
      down = (adcValues[2] + adcValues[1]) ;
      left = (adcValues[3] + adcValues[2]) ;
      right = (adcValues[0] + adcValues[1]) ;
​
      printf("up: %d\n", up);
      printf("down: %d\n", down);
      printf("left: %d\n", left);
      printf("right: %d\n", right);
​
      if ((down - up >= 200) && (duty_cycle6 >= DUTY_0_DEG)) {
          duty_cycle6 -= 100000;
    write_file(PWM6_DUTY_CYCLE, duty_cycle6);
    usleep(10000);
       }
​
      if ((up - down >= 200) && (duty_cycle6 <= DUTY_180_DEG)) {
          duty_cycle6 += 100000;
          write_file(PWM6_DUTY_CYCLE, duty_cycle6);
          usleep(10000);
       }
​
      if ((right - left >= 200) && (duty_cycle7 >= DUTY_0_DEG)) {
          duty_cycle7 -= 100000;
       write_file(PWM7_DUTY_CYCLE, duty_cycle7);
          usleep(10000);
      }
      if ((left - right >= 200) && (duty_cycle7 <= DUTY_180_DEG)) {
           duty_cycle7 += 100000;
        write_file(PWM7_DUTY_CYCLE, duty_cycle7);
          usleep(10000);
       }
          usleep(100000);
   }
    return 0;
}

配置pwm

int init_pwm()
{
    write_file(PWM6_EXPORT, 0);
    if (-1 == write_file(PWM6_PERIOD, PWM_PERIOD))
        return -1;
    if (-1 == write_file(PWM6_ENABLE, 1))
        return -1;
​
    write_file(PWM7_EXPORT, 0);
    if (-1 == write_file(PWM7_PERIOD, PWM_PERIOD))
        return -1;
    if (-1 == write_file(PWM7_ENABLE, 1))
        return -1;
​
    return 0;
}

设置舵机初始位置

write_file(PWM6_DUTY_CYCLE, duty_cycle6);
write_file(PWM7_DUTY_CYCLE, duty_cycle7);

获取光照值

int read_adc_value(int adcNumber) {
    int adcValue = 0 ;
    FILE* adcFile;
    char adcValueFile[50];
    char adcValueStr[10] = "0";
    snprintf(adcValueFile, sizeof(adcValueFile), "/sys/bus/iio/devices/iio:device0/in_voltage%d_raw", adcNumber);
    adcFile = fopen(adcValueFile, "r");
    if (adcFile) {
            fgets(adcValueStr, sizeof(adcValueStr), adcFile);
            adcValue = atoi(adcValueStr);
            fclose(adcFile);
     }
    else {
            fprintf(stderr, "Error opening ADC value file %s.\n", adcValueFile);
     }
     return adcValue;
}

根据光照值调整舵机位置

if ((down - up >= 200) && (duty_cycle6 >= DUTY_0_DEG)) {
    duty_cycle6 -= 100000;
    write_file(PWM6_DUTY_CYCLE, duty_cycle6);
usleep(10000);
}
if ((up - down >= 200) && (duty_cycle6 <= DUTY_180_DEG)) {
    duty_cycle6 += 100000;
    write_file(PWM6_DUTY_CYCLE, duty_cycle6);
    usleep(10000);
}
if ((right - left >= 200) && (duty_cycle7 >= DUTY_0_DEG)) {
    duty_cycle7 -= 100000;
    write_file(PWM7_DUTY_CYCLE, duty_cycle7);
    usleep(10000);
}
if ((left - right >= 200) && (duty_cycle7 <= DUTY_180_DEG)) {
    duty_cycle7 += 100000;
    write_file(PWM7_DUTY_CYCLE, duty_cycle7);
    usleep(10000);
}

2、应用编译

(1)拷贝sun.tar.bz2到开发环境/home/elf/work目录下解压

elf@ubuntu:~/work$ tar xvf sun.tar.bz2

(2)执行环境变量

elf@ubuntu:~/work$ . /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

(3)编译

elf@ubuntu:~/work$ cd sun/
elf@ubuntu:~/work/sun$ make

(4)拷贝sanapp到开发板/home/root路径下

root@ELF1:~# cp /run/media/sda1/sunapp ./
root@ELF1:~# sync

四、项目测试

1、确保开发板已正确连接四路光敏传感器和舵机

2、执行应用

root@ELF1:~# ./sunapp

此时可以打开手电筒模拟太阳光,调整太阳能板的角度

对于初涉嵌入式开发领域的小伙伴来说,“智慧光伏”无疑是一个兼具趣味与实践的开源项目。通过亲身参与这一开源项目的组装与调试过程,可以直接接触到真实的开发环境、工具链和代码库,从而解决实际问题,帮助初学者更快地成长为合格的嵌入式开发工程师。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2202406.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

爬虫常用正则表达式用法

在网页爬虫中&#xff0c;正则表达式&#xff08;regex&#xff09;是一种非常有用的工具&#xff0c;用于从 HTML、JSON 或其他文本格式中提取特定的数据。下面是一些常见的正则表达式及其在爬虫中的应用场景&#xff1a;

如何利用phpstudy创建mysql数据库

phpStudy诞生于2007年&#xff0c;是一款老牌知名的PHP开发集成环境工具&#xff0c;产品历经多次迭代升级&#xff0c;目前有phpStudy经典版、phpStudy V8&#xff08;2019版&#xff09;等等&#xff0c;利用phpstudy可以快速搭建一个mysql环境&#xff0c;接下来我们就开始吧…

Html 标题加图标

每个网页选项卡都有一个图标&#xff1a; <meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>主页</title><link rel"icon" href"images/记事本.png&…

linux系统不同用户登录vnc

说明&#xff1a;安装oracle时需要用oracle用户登录&#xff0c;配置vnc使用oracle用户登录 1.修改/etc/sysconfig/vncservers&#xff0c;添加oracle用户 VNCSERVERS“1:root 2:oracle” VNCSERVERARGS[1]“-geometry 1024x768” VNCSERVERARGS[2]“-geometry 1024x768” VN…

Scrapy:简单使用、xpath语法

简单使用 简介 Scrapy 是一个为了爬取网站信息&#xff0c;提取结构性数据而编写的应用框架&#xff0c;可以用于数据挖掘、检测和自动化测试。 架构 组件 引擎&#xff0c;指挥其他组件协同工作调度器 &#xff0c;接收引擎发过来的请求&#xff0c;按照先后顺序&#xff0…

APP的命令和monkey压力测试

一、命令的使用&#xff1a; 1.dos下链接&#xff1a;adb connect 127.0.0.1:62001 2.所附设备清单&#xff1a;adb devices device:已识别的设备&#xff0c;表示连接成功 unauthorized:没有授权需要手机授权才能连接 unkown:未识别设备 offline:离线设备 3.版本&#xff1a;…

基于LORA的一主多从监测系统_BMP280气压传感器

关联&#xff1a;LORA 、HAL、气压传感器 这个传感器也是比较常见的&#xff0c;但灵敏度什么的都没啥问题&#xff0c;不过气压传感器不是很好去观察这个变化&#xff0c;毕竟一个地方的大气压基本不会有太大波动&#xff0c;我们可以在百度搜索所在地的平均大气压&#xff0…

bladex漏洞思路总结

Springblade框架介绍&#xff1a; SpringBlade是一个基于Spring Boot和Spring Cloud的微服务架构框架&#xff0c;它是由商业级项目升级优化而来的综合型项目。 0x1 前言 最近跟一些大佬学习了blade的漏洞&#xff0c;所以自己总结了一下&#xff0c;在渗透测试过程中&#x…

frp+windows+宝塔+域名使用

先讲一下frp的相关概念 1. 什么是 FRP&#xff1f; FRP (Fast Reverse Proxy) 是一款开源的反向代理工具&#xff0c;支持多种协议&#xff08;如 TCP、UDP、HTTP 和 HTTPS&#xff09;的内网穿透。它能够帮助你将位于内网或防火墙后面的服务映射到外网&#xff0c;方便外网用…

产品经理想转行做大模型AI产品经理,建议看看这篇文章!(文末福利)

如果你想转行做大模型&#xff0c;作为一名AI产品经理&#xff0c;你可以怎么做呢&#xff1f;或许&#xff0c;你可以先进行自我检测&#xff0c;看看自己是否真的适合转行做大模型。这篇文章里&#xff0c;作者便给想转行做大模型的AI产品经理们提出了一些建议&#xff0c;不…

【进阶版】如何实现一个基于 HTML+CSS+JS 的任务进度条

创建一个动态任务进度条&#xff1a;进阶版实现 在现代网页开发中&#xff0c;任务进度条是用户交互中非常重要的组件&#xff0c;它能够直观地展示任务的进展情况。本文将向你展示如何使用 HTML、CSS 和 JavaScript 创建一个动态的任务进度条。在这个进阶版本中&#xff0c;用…

三网话费折扣api怎么对接合作?如何变现?

三网优惠话费充值接口对接的操作步骤通常包括以下几个阶段&#xff1a; 注册账号&#xff1a;在API服务提供商的控制台注册账号&#xff0c;例如微客云控制台 。添加店铺&#xff1a;在控制台中添加店铺&#xff0c;并保存店铺ID或只勾选CMS 。申请API密钥&#xff1a;联系客服…

临时提高电压的常用方法电荷泵、自举升压电路

一、临时提高电压 爽死*子了&#xff0c;*子也硬玩一把临时重组器……&#xff08;雷总音&#xff09;。临时提高星级或者电压真的是一件很爽的事情&#xff0c;小钱办大事轻松拿捏。常用的临时提高电压的方式主要有两种&#xff0c;电荷泵和自举升压电路&#xff0c;你的某米手…

Nvidia在AI峰会上发布了七项重大技术公告

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

文档大师:打造一站式 Word 报告解决方案

最新技术资源&#xff08;建议收藏&#xff09; https://www.grapecity.com.cn/resources/ 前言 在政府、医院、银行、财务以及销售等领域&#xff0c;常常需要创建各种报告文件来展开工作汇报&#xff0c;譬如季度销售报告、年度总结报告、体检报告和保险合同等。在没有报表工…

一个月学会Java 第7天 字符串与键盘输入

Day7 字符串与键盘输入 字符串作为所有程序都很重要的东西&#xff0c;这个东西必须好好的学习&#xff0c;在Java中String会比较好学习&#xff0c;比起C和C里面会更加的简单&#xff0c; 在Java之中也是很好理解的&#xff0c;因为底层已经封装好了char数组&#xff0c;也就是…

《深入浅出LLM基础篇》(五):Propmt工程优化

&#x1f389;AI学习星球推荐&#xff1a; GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料&#xff0c;配有全面而有深度的专栏内容&#xff0c;包括不限于 前沿论文解读、…

【C++】AVL树(AVLTree)

目录 一、AVL树概念&#xff1a; 二、定义&#xff1a; 三、AVL树的插入&#xff1a; 四、AVL树的旋转&#xff1a; 1、左单旋&#xff1a; 2、右单旋&#xff1a; 3、右左双旋&#xff1a; 4、左右双旋&#xff1a; 五、AVL树的检验&#xff1a; 一、AVL树概念&#x…

重离子+数字化,肿瘤治疗的新路

大国之重器&#xff0c;当为大国之民生。 医用重离子加速器装置&#xff0c;被誉为肿瘤放疗领域的大国重器。在河西走廊东侧的甘肃省武威肿瘤医院(以下简称&#xff1a;武威肿瘤医院)&#xff0c;我国首台拥有自主知识产权的医用重离子加速器装置坐落此。自建成投入使用以来&a…

新手教学系列——爬虫异步并发注意事项

引言 爬虫是网络数据采集中不可或缺的工具,很多程序员在入门时会遇到这样的问题:为什么我的爬虫这么慢?尤其在面对大量数据时,单线程爬虫的速度可能让人捶胸顿足。随着爬虫规模的增大,异步并发成为了提高爬取效率的关键。然而,异步并发并不像表面看起来那么简单,如果没…