能力背景
在ESP32上移植过Modbus模块,能使用ESP32提供的编译工具编译、查错、烧录,但对编译工具链的原理并不了解。会使用Git,但也只基于简单的拉取,上传的使用。Linux系统之前没怎么用过,不大会操作。本文主要记录了第一次使用ESP32-CAM编译下载官方固件并正常使用的整个过程。
学习目标
- 使用已有固件把摄像头用起来。
- 下载其他已有代码,编译并下载,以学习相关工具链的知识。
过程
- 首次上电
先直接用,看官方文档说的是只要接上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、摄像头关蓝牙什么事),结果开了蓝牙,还是有问题。心理逐渐狂躁。
回头想想,也有可能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的扛不住。
收获&总结
- 前期玩Keil等IDE环境后,再来搞这种编译工具链,很容易心态爆炸。所以在什么都还不懂的情况下,尽量跟着官方操作步骤走(虽然官方的操作也不全),做好过程记录。
- Linux编译比window编译快好多!!
- git克隆代码下来时,有些代码是关联了子模块的,如果使用官方的克隆指令,会把子模块同时更新下来,但这有个问题,整个代码,包括子模块要1G多,然后想想github那个速度,如果不做一些加速处理,很大概率下载不下来,而使用克隆又不支持断点续传,于是每失败一次都得重新开始克隆。但有另一个方法,就是先克隆主体代码,后面再单独更新子模块。然后子模块是会检查缺哪些才下载的,间接实现了断点续传,同时也保证了主体代码的完整性。
- 直接下载github上的代码速度太慢,可以使用一些镜像网站,把git clone后面的github官网替换成镜像网站的网址即可。
- 对于子模块下载网站,需要在本地主代码路径下找到.gitmodules,把里面的github.com全替换成镜像网站后保存,再执行下载即可。