![wKgZomcI0SCAbJ-TAAdslccJvTs662.png](https://file1.elecfans.com/web2/M00/09/45/wKgZomcI0SCAbJ-TAAdslccJvTs662.png)
“智慧光伏”項目能夠智能追蹤陽光的移動軌跡。通過內置的光敏傳感器和智能控制系統,實時感知周圍光源的變化,并驅動太陽能板精準調整角度,確保每一縷陽光都能被最大化地捕捉和利用。下面就和各位小伙伴詳細介紹一下這一開源項目是怎樣實現的。
環境說明
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、四路光敏傳感器與板卡的連接
![wKgZomcI0UqAXRd7AAD4mKU6LRo152.png](https://file1.elecfans.com/web2/M00/09/45/wKgZomcI0UqAXRd7AAD4mKU6LRo152.png)
2、舵機與板卡的連接
![wKgZomcI0VaAfi_8AADSnETwRV8438.png](https://file1.elecfans.com/web2/M00/09/45/wKgZomcI0VaAfi_8AADSnETwRV8438.png)
二、內核適配
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
![wKgaoWcI1D2AUGqCAAD0VIgFxl8762.png](https://file1.elecfans.com/web1/M00/F2/B6/wKgaoWcI1D2AUGqCAAD0VIgFxl8762.png)
(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"; };
![wKgaomcI1eaAZjfMAACciSNZrIg420.png](https://file1.elecfans.com/web2/M00/0A/30/wKgaomcI1eaAZjfMAACciSNZrIg420.png)
在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 >; };
![wKgZomcI1f-AaDdtAAC12TTTM_I189.png](https://file1.elecfans.com/web2/M00/09/46/wKgZomcI1f-AaDdtAAC12TTTM_I189.png)
取消其它用到csi功能的地方
![wKgZomcI1iCALz2RAAC47pQs0MY660.png](https://file1.elecfans.com/web2/M00/09/46/wKgZomcI1iCALz2RAAC47pQs0MY660.png)
![wKgZomcI1iuAfdX6AADa0ymii6w527.png](https://file1.elecfans.com/web2/M00/09/46/wKgZomcI1iuAfdX6AADa0ymii6w527.png)
至此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 >; };
![wKgaomcI1miAOh9QAADCVdnkq5M265.png](https://file1.elecfans.com/web2/M00/0A/30/wKgaomcI1miAOh9QAADCVdnkq5M265.png)
注釋掉其它用到GPIO1_IO01、GPIO1_IO02、GPIO1_IO03、GPIO1_IO04功能的地方
![wKgaoWcI11CAFTjcAADonpe1QCg130.png](https://file1.elecfans.com/web1/M00/F2/B6/wKgaoWcI11CAFTjcAADonpe1QCg130.png)
至此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
(3)將arch/arm/boot/dts/路徑下的imx6ull-elf1-emmc.dtb放到U盤,通過U盤拷貝到開發板
root@ELF1:~# cp /run/media/sda1/imx6ull-elf1-emmc.dtb /run/media/mmcblk1p1/
(4)保存并重啟開發板
root@ELF1:~# sync root@ELF1:~# reboot
三、數據采集和設備控制
1、程序設計
![wKgZoWcI2ASABFvUAABY1jE3f8E038.png](https://file1.elecfans.com/web1/M00/F2/B7/wKgZoWcI2ASABFvUAABY1jE3f8E038.png)
主函數的實現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
此時可以打開手電筒模擬太陽光,調整太陽能板的角度
對于初涉嵌入式開發領域的小伙伴來說,“智慧光伏”無疑是一個兼具趣味與實踐的開源項目。通過親身參與這一開源項目的組裝與調試過程,可以直接接觸到真實的開發環境、工具鏈和代碼庫,從而解決實際問題,幫助初學者更快地成長為合格的嵌入式開發工程師
-
單片機
+關注
關注
6043文章
44622瀏覽量
638523 -
嵌入式
+關注
關注
5092文章
19177瀏覽量
307650 -
開發板
+關注
關注
25文章
5121瀏覽量
98191 -
Linux開發
+關注
關注
0文章
34瀏覽量
6940 -
開源代碼
+關注
關注
0文章
36瀏覽量
3007
發布評論請先 登錄
相關推薦
開源鴻蒙榮獲開放原子“2024年度操作系統領域國內活躍開源項目”
開放原子開源基金會與三個開源項目舉行捐贈簽約儀式
ElfBoard開源項目|車牌識別項目技術文檔
![<b class='flag-5'>ElfBoard</b><b class='flag-5'>開源</b><b class='flag-5'>項目</b>|車牌識別<b class='flag-5'>項目</b><b class='flag-5'>技術</b><b class='flag-5'>文檔</b>](https://file1.elecfans.com/web3/M00/01/4C/wKgZO2dSYb6AHeioAAA8Nv-vcX4641.png)
無人機AI智慧光伏巡檢系統的技術實現與運維革新
凌蒙派OpenHarmony開源項目榮獲本期Gitee官方推薦
![凌蒙派OpenHarmony<b class='flag-5'>開源</b><b class='flag-5'>項目</b>榮獲本期Gitee官方推薦](https://file.elecfans.com/web2/M00/26/21/pYYBAGG5jjSALfrEAAAwAa9Oig8799.png)
真格基金宣布捐贈開源AI項目vLLM
ElfBoard開源項目|“智慧教室”開源項目技術文檔
![<b class='flag-5'>ElfBoard</b><b class='flag-5'>開源</b><b class='flag-5'>項目</b>|“<b class='flag-5'>智慧</b>教室”<b class='flag-5'>開源</b><b class='flag-5'>項目</b><b class='flag-5'>技術</b><b class='flag-5'>文檔</b>](https://file1.elecfans.com/web2/M00/06/E9/wKgaombhBYqAJRiHAAAsr4-LMrw816.png)
Matepad pro12.2 已上市半個月,但是還沒有在開源網站看到該項目的開源信息,違背開源精神
智慧光伏運維管理系統引領光伏電站管理新時代
![<b class='flag-5'>智慧光</b><b class='flag-5'>伏</b>運維管理系統引領光<b class='flag-5'>伏</b>電站管理新時代](https://file1.elecfans.com/web2/M00/F3/13/wKgZomZ7zZmAaOF_AAIWESybF_g809.png)
嵌入式學習-飛凌嵌入式ElfBoard-項目分享|基于ELF 1S開發板完成的物聯網開源項目
飛凌嵌入式-ElfBoard-項目分享|基于ELF 1S開發板完成的物聯網開源項目
項目分享|基于ELF 1S開發板完成的物聯網開源項目
![<b class='flag-5'>項目</b>分享|基于ELF 1S開發板完成的物聯網<b class='flag-5'>開源</b><b class='flag-5'>項目</b>](https://file1.elecfans.com/web2/M00/E6/2A/wKgaomZCuEyALx2RAAAyjXiLOHA083.png)
評論