【学习笔记】ESP32-CAM初体验

能力背景

    在ESP32上移植过Modbus模块,能使用ESP32提供的编译工具编译、查错、烧录,但对编译工具链的原理并不了解。会使用Git,但也只基于简单的拉取,上传的使用。Linux系统之前没怎么用过,不大会操作。本文主要记录了第一次使用ESP32-CAM编译下载官方固件并正常使用的整个过程。

学习目标

  1. 使用已有固件把摄像头用起来。
  2. 下载其他已有代码,编译并下载,以学习相关工具链的知识。

过程

  • 首次上电

    先直接用,看官方文档说的是只要接上5V2A的电源即可,出厂板子里已存在固件。目前这手头上只有一个12V1A的电源,外加一个12转5V的电源转换板,不知道电流够不够,先上电试下。
    直接上电,按官方文档来看,应该是可以直接搜到wifi热点的,但手机找了一圈没找到热点(这出师不大利呀)。也有可能之前板子烧过其他固件了,先接个串口看下打印什么信息。问题串口通信的波特率是多少?算了,先用115200试下,上电,有信息打印出来,但貌似跟出厂的固件打印信息不大一样,不知道烧的是什么固件。
在这里插入图片描述
    看来没办法,只能跳过第一步了,开始第二步,自己下载一个程序,也是先使用官方出厂自带的固件来,试下硬件整体是否有问题。

  • 下载程序

    查了下网上,大部分都是使用ardunio ide下载,但既然是ESP32,那就应该可以使用乐鑫的ESP-IDF集成环境来下载。找了下安信可的官方教程,虽然教程写的是在Linux环境下开发,需要安装虚拟机,但我们可以跳过这些步骤,直接使用教程里的例程。即到github上同步代码。在安装git的基础上,在想要同步代码的地方右键,选择"Git Bash Here"
在这里插入图片描述
    在终端窗口输入以下指令

git clone --recurse-submodules https://github.com/Ai-Thinker-Open/Ai-Thinker-Open_ESP32-CAMERA_LAN.git

在这里插入图片描述

    在安装esp-idf工具链的基础上,使用ESP-IDF命令窗口,使用指令

cd esp_cam\examples\single_chip\camera_web_server

进入路径esp_cam\examples\single_chip\camera_web_server,然后直接输入idf.py build进行编译,结果报了个错。

报错信息
    百度下是什么原因,说是要设置一下再编译,看来不能跳过官方的步骤,但官方使用的是make menuconfig,这边使用不了这个指令,还好刚刚说要设置的那篇博客里用的是idf,把make改成idf.py就可以,顺利进入设置界面。即输入如下指令

idf.py menuconfig

设置界面
跟着官方文档一步步设置,再编译。
以下是官方文档的操作:


进入Serial flasher config设置如下
在这里插入图片描述

进入Camera Web Server —>Camera Pins —> Select Camera Pinout —> 选择ESP32-CAM by AI-Thinker
在这里插入图片描述

设置WIFI模式(station/ AP模式二选一即可)
station模式
进入camera_web> Camera Web Server > WiFi Settings,设置WIFI名字和密码
在这里插入图片描述


    官方文档少了一个,进入Component config->Driver configurations->RTCIO configuration,选择Support array ‘rtc_gpio_desc’ for ESP32,不然就会报上面那个错。
在这里插入图片描述

    然后又报了个xxx/aead_chacha20poly1305.c.obj:No such file or directory。
在这里插入图片描述

    这个查到官方论坛里,有很多人遇到类似的问题,大概就是使用idf.py menuconfig后,编译出错过一次,后面因为cache的原因,会把相关信息保存下来,导致把之前编译错误的信息保留下来。只要把C:\Users\xxxx\AppData\Roaming.ccache里的文件删掉(xxxx是电脑的用户名),再重新编译即可。或者不使用cache进行编译。

idf.py --no-ccache build

    但编译后又出一个错误,说是esp_wpa2.h文件找不到,找了个说要把蓝牙打开(我用个wifi、摄像头关蓝牙什么事),结果开了蓝牙,还是有问题。心理逐渐狂躁。
esp_wpa2.h:no such file or directory
    回头想想,也有可能sdk版本不匹配导致的,毕竟esp32不同版本的sdk接口等可能不兼容,我这边用的是4.3.1,而官方使用的是4.0,所以找个4.0的试下。还是不行(主要是还不懂得怎么切换不同的SDK版本)。看来还是得先完全按官方文档来,熟悉下操作。

  • 虚拟机

    官方使用的是linux环境编译的,于是先下个虚拟机,安装ubuntu系统,进入ubuntu系统后,根据指导文档安装常用软件。打开终端,分别输入下面三行指令

sudo apt-get purge vim-common
sudo apt-get install vim
sudo apt install git

    然后安装一堆依赖环境

sudo apt-get install git wget flex bison gperf python python-pip python-setuptools python-serial python-click python-cryptography python-future python-pyparsing python-pyelftools cmake ninja-build ccache libffi-dev libssl-dev

    安装完后就可以使用官方提供的git克隆代码,但这里很坑,官方把所有东西都打包成一个链接,用过git的小伙伴都知道,克隆的速度那是比那啥还慢,而且时不时还卡住不动,重头再来,没办法,只能网上找国内镜像帮忙加速。

    后面摸索着学会了工程和子模块分开下载的方法,先执行以下指令下载工程代码,注意不要加官方教程里“–recurse-submodules”这两个参数,加了这两个会同时把子模块也更新下来,超级大,会受不了的。用下面这句下载即可。

git clone https://github.com/Ai-Thinker-Open/Ai-Thinker-Open_ESP32-CAMERA_LAN.git

    上面的工程代码也就20M左右,如果通过github连20M都下了很久,那这里可以把上面"github.com"替换成国内一些代理加速网站。
    下载完工程后,进入工程目录,执行以下指令更新子模块。

git submodule update --init --recursive --progress

    当然这里要注意一个点,就是虽然工程使用的是镜像网站下载的,但直接使用上面那个命令更新子模块,还是用的github官网下载,为了加速,这里可以找到工程目录下.gitmodules这个文件。
在这里插入图片描述
    打开这个文件,把里面github.com全部替换成镜像网站。
在这里插入图片描述
    设置环境,使用

export IDF_PATH=~/Ai-Thinker-Open_ESP32-CAMERA_LAN/esp-idf

    然后在/Ai-Thinker-Open_ESP32-CAMERA_LAN/esp-idf路径下输入命令

./install.sh

    然后再输入,注意这里两个点中间有空格

. ./export.sh

    弄完输入"make menuconfig"再进入设置界面,发现报了个错,少了个curses.h的文件,查了下,在linux下缺少ncurses devel,用下面指令安装下ncurses即可。

sudo apt-get install libncurses5-dev

    安装完后又双叒叕报了个错,意思是显示太小,不支持进入设置界面,屏幕小没人权啦。
在这里插入图片描述
    这里把终端拉大就行,报错信息里写了至少是19*80。设置完后make可以正常编译,idf.py还是不行,先不管了,往下一步,make flash继续报错。说是找不到/dev/ttyUSB1。
在这里插入图片描述
    这个可能是虚拟机的问题。查了下,是没连接实际的串口,在虚拟机里配置当前使用的串口就可以了。燃鹅还是识别不到串口,查了一圈,说是CH340或CH210驱动需要单独安装,Linux内核并没有自带这个驱动。

  • 虚拟机里ubuntu系统的CH340驱动安装

    第一步先确认硬件连接没问题,确认Ubuntu对USB转串口设备的支持。打开终端,输入以下指令,如果有usbserial,说明系统支持USB转串口。

lsmod | grep usbserial

    如果没有,先安装ch340驱动。
CH340LINUX驱动下载地址:http://www.wch.cn/download/CH341SER_LINUX_ZIP.html
    可以直接下载到/home/,然后进行解压,得到ch34x.c,makefile,readme三个文件。

    然后查看自己ubuntu的版本,通过下面指令获得自己的版本号。

uname -r

获取版本

    然后去https://elixir.bootlin.com/linux/v5.4.42/source/drivers/usb/serial/ch341.c复制和自己版本对应的文件,我的是5.4.0.124,所以选择5.4.124,将右面的内容全部复制下来完全替换ch34x.c中的内容。

    然后开始进行编译,使用以下指令跳转到CH341SER_LINUX这个文件夹下编译。

cd CH341SER_LINUX

    输入sudo make进行编译,会出现一大堆文件,有.ko,.o等,再输入sudo make load到这里就完成了,然后通过输入lsmod指令可以查看有没有ch34x,如果有基本成功了。
在这里插入图片描述
    接下来查看有没有ttyusb0,这个需要将自己的开发板连接到电脑上,使用ls /dev | grep tty 查看是否有ttyusb0,这里还是没有显示ttyUSB0,然后试着把串口拔掉再接上,重新使用ls /dev | grep tty查就有了ttyUSB1(下面截图是后面才加的,原本只有ttyUSB1一个)。
在这里插入图片描述

    貌似通过将ch34*.ko复制到系统驱动的目录可以下次直接自动驱动,命令如下

sudo cp -v ch34*.ko /lib/modules/5.4.0-42-generic/kernel/drivers/usb/serial/

    最后再运行

sudo depmod -a

    重启一下,应该就好了,如果不行的话就每次使用前sudo make load安装,然后不用就sudo make unload。

  • 连接板子,下载程序

    完成以上步骤后,编译还是报那个错,可能是现在用的是ttyUSB0,而make flash查的是ttyUSB1,现在看下怎么切换。先使用lsusb 查看自己的USB串口ID。我的USB串口是1a86:7523

在这里插入图片描述
     输入以下指令进入myusb.rule文件进行编辑

vim /etc/udev/rules.d/myusb.rule

    按 i 进入插入模式,输入以下内容。其中"KERNEL"的值改成"ttyUSB0","ATTRS{idVendor}“的值改成"1a86”,"ATTRS{idProduct}“的值改成"7523”,"SYMLINK"的值改成ttyUSB0。

KERNEL=="ttyUSB1", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", SYMLINK+="ttyUSB0"

    按Esc退出插入模式,输入:wq!保存退出,然后回到终端执行以下指令。

sudo udevadm trigger

    执行以下指令查看USB的映射关系。

ls -l /dev |grep ttyUSB

    可以通过/dev/myusb打开串口设备

在这里插入图片描述

    终于可以了,串口可以正常识别,但软件还是没烧进去,应该是有个IO口要切一下boot模式,官方文档也不说明一下,估计认为都是老手玩的。这里下载程序IO0口要拉低,正常运行需要悬空IO0,拉低IO0后再试,结果还是报错。
在这里插入图片描述
    退出虚拟机,用串口连下板子看还正不正常,突然发现串口变成COM10了,而虚拟机还在用COM9,换一下试下终于终于终于成功啦!!!!
在这里插入图片描述

结果

    用电脑连上Wifi“ESP-CAM”,登录192.168.4.1,点击“Start Stream”就可以看到摄像头,一开始是花屏的,后来调低了频率和分辨率后就正常了。板子发热有点严重,后面还是得整个2A电流的电源,感觉现在1A的扛不住。
在这里插入图片描述

收获&总结

  1. 前期玩Keil等IDE环境后,再来搞这种编译工具链,很容易心态爆炸。所以在什么都还不懂的情况下,尽量跟着官方操作步骤走(虽然官方的操作也不全),做好过程记录。
  2. Linux编译比window编译快好多!!
  3. git克隆代码下来时,有些代码是关联了子模块的,如果使用官方的克隆指令,会把子模块同时更新下来,但这有个问题,整个代码,包括子模块要1G多,然后想想github那个速度,如果不做一些加速处理,很大概率下载不下来,而使用克隆又不支持断点续传,于是每失败一次都得重新开始克隆。但有另一个方法,就是先克隆主体代码,后面再单独更新子模块。然后子模块是会检查缺哪些才下载的,间接实现了断点续传,同时也保证了主体代码的完整性。
  4. 直接下载github上的代码速度太慢,可以使用一些镜像网站,把git clone后面的github官网替换成镜像网站的网址即可。
  5. 对于子模块下载网站,需要在本地主代码路径下找到.gitmodules,把里面的github.com全替换成镜像网站后保存,再执行下载即可。

猜你喜欢

转载自blog.csdn.net/u012749085/article/details/127066625