基于Nanopi duo2的WiFi智能摄像头

1.固件包烧录

https://wiki.friendlyelec.com/wiki/index.php/NanoPi_Duo2/zh#.E8.BF.9E.E6.8E.A5WiFi
固件包链接以及烧录工具都在上面链接中
在这里插入图片描述
烧录过程
使用读卡器将SD卡插入到电脑,然后打开烧录工具
在这里插入图片描述

在这里插入图片描述

2.通过串口工具连接板子使其连接WiFi

对应的串口工具,就是这个HyperTerminal
在这里插入图片描述
由于是第一次启动板子,板子还没有连接WiFi,所以需要通过该软件来连接
在这里插入图片描述
然后需要连接WiFi(root账号的密码为fa)
在这里插入图片描述
使用ifconfig命令查看给板子分配的IP地址
在这里插入图片描述
然后就不需要串口线,我们只需要对板子供电即可
接着我们直接使用云服务器来访问板子,通过给板子分配的ip地址,用户名为root,密码为fa
在这里插入图片描述
此时我们可以理解该云服务器就是这块Linux板子,也可以直接在这个上面编译,但是不建议
在Nanopi duo2板子会在云服务器上搭建,而确实也可以直接在板子上编译,但是由于Linux板子其CPU,内存等资源相对有限,所以我们会使用交叉编译,在虚拟机中编译好,然后将编译好的程序发送到云服务器上跑。
板子对应的架构是ARM,而虚拟机在电脑上是X86架构,二者对应生成的二进制文件不太一样,就相当于一个是中文版的,一个是英文版的,我们需要在虚拟机中使用交叉编译器将代码编译,然后发送到板子对应的云服务器下,就可以直接在板子上跑了

3.交叉编译器的下载

在这里插入图片描述

在这里插入图片描述
将下载包直接拖动到虚拟机上根目录的opt下
在这里插入图片描述
在这里插入图片描述
使用命令将其解压形成4.9.3

tar -xz arm-cortexa9-linux-gnueabihf-4.9.3-20160512.tar.xz

在/opt/4.9.3/bin/可以找到arm-linux-gcc交叉编译器,但是还是不能之间使用该命令进行编译,需要将该交叉编译器的路径导入到环境变量中就可以了。
使用root账户vim打开文件/root/.bashrc
在这里插入图片描述
退出来记得使用指令让配置文件生效

source /root/.bashrc

随便写一段代码
在这里插入图片描述
然后使用交叉编译器编译

arm-linux-gcc -o tt tt.c

在这里插入图片描述
使用file命令查看tt二进制文件信息
在这里插入图片描述
发现是ARM架构的,现在就可以下载到板子上了,通过下面的指令

在这里插入图片描述

4.mjpg-streamer

在Nanopi duo2上会带mjpg-streamer,摄像头会将采集到的摄像头数据放到/dev/video0文件中去,而mjpg-streamer会将/dev/video通过输入文件读到mjpg-streamer tcp服务器上,然后通过socket输出文件到网页上去,因为板子连接到路由器,我们就可以在浏览器上通过访问分配给板子的ip地址+端口号8080,就可以获得摄像头了,不过需要先编译形成输入库文件和输出库文件
在这里插入图片描述

在这里插入图片描述
如果没有的话需要使用make指令编译makefile,使其产生,然后运行start.sh即可
在这里插入图片描述
在浏览器上输入ip地址+端口号8080
在这里插入图片描述
就可以看到摄像头采集的图像
如果要修改分辨率的话,使视频更流程,我们可以降低分辨率通过设置start.sh文件

 vim start.sh

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.通过板子控制舵机转动

因为要使摄像头转动,我们使用到舵机,我们直接在板子上编译程序实现舵机转动,舵机转动的原理及操作方法在我之前的博客上有用到,通过设置PWM
在这里插入图片描述

首先需要上述操作进行编译安装
在这里插入图片描述
在这里插入图片描述

通过./bulid将二进制文件下载到开发板上

在这里插入图片描述
通过gpio readall指令查看
在这里插入图片描述
找到我们要操作的引脚
在这里插入图片描述
如图是我们接舵机的引脚,GPIOA11对应13号引脚

#include <wiringPi.h>
int main(void)
{wiringPiSetup() ;pinMode (13, OUTPUT) ;for(;;){digitalWrite(13, HIGH) ;delay (1.5) ;digitalWrite(13,  LOW) ;delay (1.5) ;}
}

在这里插入图片描述
高电平为0.5ms为转0°,高电平为1.5ms为转90°,高电平为2.5ms为转180°
编译并运行

gcc  -o pwm pwm.c -lwiringPi -lpthread    
./pwm

在这里插入图片描述

6.代码编写

1.摄像头主程序

使用socket(tcp)
1.摄像头发送请求连接阿里云服务器

2.接收阿里云服务器的端口号信息

{"cmd":"port_info","port":9000} //云服务器返回端口号用于UDP连接接收视频数据

3.云服务器负责转发来自APP的控制到板子

{"cmd":"control","action":"left","appid":"1000","deviceid":"0001"} //服务器收到控制指令,转发给板子通过socket,tcp

4.创建线程完成向服务器发送视频数据

该部分代码在虚拟机中编写,然后交叉编译完,将生成的二进制文件发送到板子上跑
(但是我在虚拟机上写代码太卡了,于是我就在vscode上写好,然后发到虚拟机上去,交叉编译完了,在将二进制文件发到板子上跑)

#include <stdio.h>
#include <json-c/json.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <pthread.h>
uint16_t port=9000;
char* ip="47.121.24.16";int main()
{int sockfd=socket(AF_INET,SOCK_STREAM,0);  //创建套接字
if(sockfd<0)
{printf("socket error");exit(0);}struct sockaddr_in aliserver;socklen_t len=sizeof(aliserver);aliserver.sin_family=AF_INET;aliserver.sin_port=htons(port);aliserver.sin_addr.s_addr=inet_addr(ip);if(connect(sockfd,(const struct sockaddr*)&aliserver,len)<0)   //连接服务器进行三次握手{printf("connect error");exit(1);}//使用json-c序列化请求struct json_object*obj=(struct json_object*)json_object_new_object();//new 一个json_object对象json_object_object_add(obj,"cmd",json_object_new_string("info"));//序列化json_object_object_add(obj,"deviceid",json_object_new_string("0001"));//序列化const char*s =json_object_to_json_string(obj);//将json_object对象转化为字符串if(send(sockfd,s,strlen,0)<0)//将请求发送到阿里云服务器{printf("send error");exit(2);}char buffer[256];if(recv(sockfd,buffer,sizeof

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单片机延时函数怎么写规范?

我们以前在开发产品的时候&#xff0c;肯定会碰到一些延时需求&#xff0c;比如常见的LED闪烁&#xff0c;按键消抖&#xff0c;控制IO口输出时序等等。 别小看延时&#xff0c;这个小问题&#xff0c;想做好&#xff0c;甚至要考虑到程序架构层面。 在开发板上&#xff0c;可能…

Dify私有化部署自己的AI Agent

1、下载Dify git clone gitgithub.com:langgenius/dify.git 2、创建Dify配置 进入dify目录下的docker目录中,复制.env.example为 .env 3、使用Docker命令进行部署Dify docker compose up -d 4、访问Dify http://localhost/install 5、 设置模型供应商 配置环境变量&#xff1…

【Unity】鱼群效果模拟

鱼群效果模拟 文章目录 鱼群效果模拟Boid算法实现方式version1_CPUversion2_GPUversion3_Multilaterationversion4_Bitonic_Sorting &#xff08;GPU友好&#xff09;version5_Skinning &#xff08;TODO&#xff09; 细节项优化项参考链接 Boid算法 Boid算法是一种模拟群体行…

【AI时代】可视化训练模型工具LLaMA-Factory安装与使用

文章目录 安装训练使用 安装 官方地址&#xff1a;https://github.com/hiyouga/LLaMA-Factory 创建虚拟环境 conda create -n llama-factory conda activate llama-factory安装 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip in…

tailwindcss学习03

01 入门 02 vue中接入 03 工具类优先 准备 vue.svg <svg viewBox"0 0 40 40" xmlns"http://www.w3.org/2000/svg"> <defs> <linearGradient x1"50%" y1"0%" x2"50%" y2"100%" id"a"&…

Java 笔记(自用)

Java是一种面向对象(opp)的、解释性的跨平台语言。所谓的跨平台是Java的一个编译好的.class文件可以在多个系统下运行。解释性则是编译后的代码需要解释器来执行&#xff0c;与之相对应的c/c是编译性语言&#xff0c;编译后的代码可以直接被机器执行。 jdkjrejava的开发工具 …

Matlab——图像保存导出成好看的.pdf格式文件

点击图像的右上角&#xff0c;点击第一个保存按钮键。

游戏引擎学习第120天

仓库:https://gitee.com/mrxiao_com/2d_game_3 上次回顾&#xff1a;周期计数代码 我们正在进行一个项目的代码优化工作&#xff0c;目标是提高性能。当前正在优化某个特定的代码片段&#xff0c;已经将其执行周期减少到48个周期。为了实现这一目标&#xff0c;我们设计了一个…

大语言模型微调的公开JSON数据

大语言模型微调的公开JSON数据 以下是一些可用于大语言模型微调的公开JSON数据及地址: EmoLLM数据集 介绍:EmoLLM是一系列能够支持理解用户、帮助用户心理健康辅导链路的心理健康大模型,其开源了数据集、微调方法、训练方法及脚本等。数据集按用处分为general和role-play两种…

20分钟 Bash 上手指南

文章目录 bash 概念与学习目的第一个 bash 脚本bash 语法变量的使用位置参数管道符号&#xff08;过滤条件&#xff09;重定向符号条件测试命令条件语句case 条件分支Arrayfor 循环函数exit 关键字 bash 脚本记录历史命令查询文件分发内容 bash 概念与学习目的 bash&#xff0…

《Python实战进阶》专栏 No.3:Django 项目结构解析与入门DEMO

《Python实战进阶》专栏 第3集&#xff1a;Django 项目结构解析与入门DEMO 在本集中&#xff0c;我们将深入探讨 Django 的项目结构&#xff0c;并实际配置并运行一个入门DEMO博客网站&#xff0c;帮助你在 Web 开发中更高效地使用 Django。Django 是一个功能强大的 Python Web…

Spring Boot 应用(官网文档解读)

Spring Boot 启动方式 SpringApplication.run(MyApplication.class, args); Spring Boot 故障分析器 在Spring Boot 项目启动发生错误的时候&#xff0c;我们通常可以看到上面的内容&#xff0c;即 APPLICATION FAILED TO START&#xff0c;以及后面的错误描述。这个功能是通过…

win32汇编环境,对话框中使用菜单示例三

;运行效果 ;win32汇编环境,对话框中使用菜单示例三 ;鼠标点击右键时&#xff0c;弹出菜单的功能 ;直接抄进RadAsm可编译运行。重要部分加备注。 ;下面为asm文件 ;>>>>>>>>>>>>>>>>>>>>>>>>>>&g…

stm32-电源控制

STM32 的 PWR&#xff08;Power Control&#xff09;外设 是用于管理微控制器电源模式和外设电源控制的模块。通过 PWR 外设&#xff0c;可以实现低功耗模式、电压调节、备份域控制等功能&#xff0c;从而优化系统的功耗和性能。 stm32内部电源框图 电源区域 VDD 供电区&#x…

云计算及其他计算

云计算知识思维导图&#xff1a;https://kdocs.cn/l/cpl2Kizx7IyC 云计算的核心判断标准通常基于美国国家标准与技术研究院&#xff08;NIST&#xff09;的定义&#xff0c;并结合实际应用场景。以下是判断一个服务是否为云计算的关键标准&#xff0c;以及对应的服务类型&#…

mysql之B+ 树索引 (InnoDB 存储引擎)机制

b树索引机制 B 树索引 (InnoDB 存储引擎)机制**引言&#xff1a;****1. 数据页结构与查找**2. 索引的引入**3. InnoDB 的 B 树索引****4. InnoDB B 树索引的注意事项****5. MyISAM 的索引方案 (选读&#xff0c;与 InnoDB 做对比)****6. MySQL 中创建和删除索引的语句** **B 树…

量子计算驱动的金融衍生品定价革命:突破传统蒙特卡洛模拟的性能边界

引言&#xff1a;金融计算的算力困局 某国际投行采用128量子位处理器对亚洲期权组合定价时&#xff0c;其量子振幅估计算法在2.7秒内完成传统GPU集群需要68小时的计算任务。在蒙特卡洛路径模拟实验中&#xff0c;量子随机游走算法将10,000维衍生品的价格收敛速度提升4个数量级…

Web刷题之PolarDN(中等)

1.到底给不给flag呢 代码审计 一道典型的php变量覆盖漏洞 相关知识 什么是变量覆盖漏洞 自定义的参数值替换原有变量值的情况称为变量覆盖漏洞 经常导致变量覆盖漏洞场景有&#xff1a;$$使用不当&#xff0c;extract()函数使用不当&#xff0c;parse_str()函数使用不当&…

ShenNiusModularity项目源码学习(12:ShenNius.Common项目分析)

ShenNius.Common项目中主要定义功能性的辅助函数类及通用类&#xff0c;供MVC模式、前后端分离模式下的后台服务使用&#xff0c;以提高编程效率。   ApiResult文件内的ApiResult和ApiResult类定义了通用的数据返回格式&#xff0c;包括状态码、返回消息、返回数据等&#x…

OkHttp使用和源码分析学习(二)

流程及源码分析 OkHttpClient使用过程主要涉及到OkHttpClient、Request、Response、Call、Interceptor&#xff0c;具体参考OkHttp使用。OkHttp在设计时采用门面模式&#xff0c;将整个系统复杂性隐藏&#xff0c;子系统通过OkHttpClient客户端对外提供。 流程 创建 OkHttp…