本帖最后由 云天 于 2022-1-30 15:47 编辑
想法很简单,用手机控制视频小车,硬件使用ESP32-CAM,手机程序制作软件使用App Inventor2。
【ESP322-CAM简介】
ESP322-CAM是安信可最新推出一款开发板模组,只需要一个ESP32模组和摄像头即可组成一个摄像头系统,ESP32-CAM是一款低成本物联网解决方案的开发板,基于ESP32模块开发的最小系统物联网产品,具有小体积,可板载摄像头的优势,适合快速原型搭建,DIY项目开发,物联网入门学习等。该产品集成了Wi-Fi,支持图片WiFI上传。
【引脚】
下图显示了ESP32-CAM引脚排列(AI-Thinker模块)。
有三个GND引脚和两个引脚用于电源:3.3V或5V。 GPIO 1和GPIO 3是串行引脚。您需要这些引脚才能将代码上传到您的电路板。此外,GPIO 0也起着重要作用,因为它确定ESP32是否处于闪烁模式。当GPIO 0连接到GND时,ESP32处于闪烁模式。
以下引脚内部连接到microSD卡读卡器: - GPIO 14:CLK
- GPIO 15:CMD
- GPIO 2:数据0
- GPIO 4:数据1(也连接到板载LED)
- GPIO 12:数据2
- GPIO 13:数据3
【烧录程序】
我们使用Arduino IDE对ESP32-CAM板进行编程。因此,您需要安装Arduino IDE以及ESP32插件。
1、Arduino IDE配置
Arduino IDE 中,转到文件>首选项
如下图所示,在“Additional Board Manager URLs”字段中输入https://dl.espressif.com/dl/package_esp32_index.json 。然后,单击“确定”按钮:
转到工具>板>板管理器...,搜索“ESP32”并按下“ ESP32 by Espressif Systems ”的安装按钮:
2、CameraWebServer示例代码
在Arduino IDE中,转到文件 > 示例 > ESP32 > 相机,然后打开CameraWebServer示例。
应加载以下代码。
在上载代码之前,您需要在以下变量中插入网络凭据:
- const char* ssid = "********";
- const char* password = "********";
复制代码
然后,确保选择正确的相机模块。在这种情况下,我们使用AI-THINKER模型。
所以,注释掉所有其他模型,AI-THINKER模型取消注释: - // Select camera model
- //#define CAMERA_MODEL_WROVER_KIT // Has PSRAM
- //#define CAMERA_MODEL_ESP_EYE // Has PSRAM
- //#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM
- //#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM
- //#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM
- //#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM
- #define CAMERA_MODEL_AI_THINKER // Has PSRAM
- //#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM
复制代码
定义电机控制引脚,发现GPIO12不能被占用,与FLASH信号有冲突。所以在下载程序时将12引脚拔下,当传好程序,重启后再插上。 - /* Defining motor and servo pins */
- extern int DRV_A = 12;
- extern int DRV_B = 13;
- extern int DIR_A = 14;
- extern int DIR_B = 15;
复制代码
当下载程序时,如不拔下12引脚连接线,会出现如下错误。
void setup()中,进行引脚初始化 - pinMode(DRV_A, OUTPUT);
- pinMode(DRV_B, OUTPUT);
- pinMode(DIR_A, OUTPUT);
- pinMode(DIR_B, OUTPUT);
复制代码
在文件app_httpd.cpp中,初始引脚 - /* Initializing pins */
- extern int DRV_A;
- extern int DRV_B;
- extern int DIR_A;
- extern int DIR_B;
复制代码
在static esp_err_t cmd_handler(httpd_req_t *req)中,接收由手机APP发过来的http请求:/control?var=motor&val=对应数字(1为前进,2为后退,3为向左,4为向左,5为停止) - if(!strcmp(variable, "motor")){
- if(val==1)
- {
- Serial.println("Forward Left");
- digitalWrite(DRV_A, HIGH);
- digitalWrite(DRV_B, LOW);
- digitalWrite(DIR_A, HIGH);
- digitalWrite(DIR_B, LOW);
- //digitalWrite(ledPin, HIGH);
- httpd_resp_set_type(req, "text/html");
- return httpd_resp_send(req, "OK", 2);
-
- }else if(val==2){
- Serial.println("Back");
- digitalWrite(DRV_A, LOW);
- digitalWrite(DRV_B, HIGH);
- digitalWrite(DIR_A, LOW);
- digitalWrite(DIR_B, HIGH);
-
-
- httpd_resp_set_type(req, "text/html");
- return httpd_resp_send(req, "OK", 2);
- }
- else if(val==3){
- Serial.println("Left");
- digitalWrite(DRV_A, LOW);
- digitalWrite(DRV_B, LOW);
- digitalWrite(DIR_A, HIGH);
- digitalWrite(DIR_B, LOW);
-
-
- httpd_resp_set_type(req, "text/html");
- return httpd_resp_send(req, "OK", 2);
- }
- else if(val==4){
- Serial.println("Right");
- digitalWrite(DRV_A, HIGH);
- digitalWrite(DRV_B, LOW);
- digitalWrite(DIR_A, LOW);
- digitalWrite(DIR_B, LOW);
-
-
- httpd_resp_set_type(req, "text/html");
- return httpd_resp_send(req, "OK", 2);
- }
- else if(val==5){
- Serial.println("Stop");
- digitalWrite(DRV_A, LOW);
- digitalWrite(DRV_B, LOW);
- digitalWrite(DIR_A, LOW);
- digitalWrite(DIR_B, LOW);
- httpd_resp_set_type(req, "text/html");
- return httpd_resp_send(req, "OK", 2);
- }
- }
复制代码
现在,代码已准备好
CameraWebServer原例.zip
(21.29 KB, 下载次数: 45)
|