网上找了一个拍照片之后用UDP传输的程序改的,有些头文件应该没用
做这个的原因是需要一个有无线功能的摄像头用于校准机械臂抓取,淘宝上搜到了ESP32-CAM,但这个东西工作起来发热严重,于是写了深度睡眠和外部唤醒的功能
ESP32-CAM的供电和外部触发都用的机械臂上的复用端口,程序调好之后连三根线就能工作,就是拍出来的图片不太清晰,不知道能不能支持后续的校准
记录一下调试过程
TCP服务端接收的数据转jpg会报“字符串末尾有无法识别字符”的错,百度了一下以为是沾包,于是就加了delay(100),现在想想可能是HEX字符串处理出了问题
板子一直无法访问到TCP服务端,加了5000的延时就好了
上传程序的时候报找不到板子的错,原因是串口助手或者串口监视器开着,关掉就好了
里面的Wifi信息和TCP服务端信息要根据实际情况修改
顺便记录一下调试一个用ESP8266无线通讯的AGV的过程
代码应该不会贴了,控制板用的STM32,我也不太会,刚做嵌入式没几天,一直没空研究这个东西
调试过程中发现TCP怎么都连不上,以为是硬件的问题,从头到尾换了一遍,最后用串口助手调试发现要连接TCP服务端地址跟我设置的不一样,后来发现Keil下程序之前需要编译一下,很低级的错误,只是我好久没做C的东西了,全忘了
1 #include "esp_camera.h" 2 #include <WiFi.h> 3 #include "esp_timer.h" 4 #include "img_converters.h" 5 #include "Arduino.h" 6 #include "fb_gfx.h" 7 #include "soc/soc.h" //disable brownout problems 8 #include "soc/rtc_cntl_reg.h" //disable brownout problems 9 10 const char *ssid = "********"; 11 const char *password = "********"; 12 13 const IPAddress serverIP(192,168,3,252); //欲访问的地址 14 uint16_t serverPort = 8888; //服务器端口号 15 16 WiFiClient client; //声明一个客户端对象,用于与服务器进行连接 17 18 //定义单个数据包最大数据量 19 #define maxcache 1024 20 21 //定义相机类型 22 #define CAMERA_MODEL_AI_THINKER 23 #if defined(CAMERA_MODEL_AI_THINKER) 24 #define PWDN_GPIO_NUM 32 25 #define RESET_GPIO_NUM -1 26 #define XCLK_GPIO_NUM 0 27 #define SIOD_GPIO_NUM 26 28 #define SIOC_GPIO_NUM 27 29 #define Y9_GPIO_NUM 35 30 #define Y8_GPIO_NUM 34 31 #define Y7_GPIO_NUM 39 32 #define Y6_GPIO_NUM 36 33 #define Y5_GPIO_NUM 21 34 #define Y4_GPIO_NUM 19 35 #define Y3_GPIO_NUM 18 36 #define Y2_GPIO_NUM 5 37 #define VSYNC_GPIO_NUM 25 38 #define HREF_GPIO_NUM 23 39 #define PCLK_GPIO_NUM 22 40 #else 41 #error "Camera model not selected" 42 #endif 43 44 void wifi_init(void) 45 { 46 WiFi.mode(WIFI_STA); 47 WiFi.setSleep(false); //关闭STA模式下wifi休眠,提高响应速度 48 WiFi.begin(ssid, password); 49 while (WiFi.status() != WL_CONNECTED) 50 { 51 delay(500); 52 Serial.print("."); 53 } 54 Serial.println("Connected"); 55 Serial.print("IP Address:"); 56 Serial.println(WiFi.localIP()); 57 } 58 59 void tcpclient_init(void) 60 { 61 Serial.println("尝试访问服务器"); 62 int i = 0; 63 while(i<5) 64 { 65 if (client.connect(serverIP, serverPort,5000)) //尝试访问目标地址 66 { 67 Serial.println("访问成功"); 68 client.print("Hello world!"); //向服务器发送数据 69 return; 70 } 71 else 72 { 73 Serial.println("访问失败"); 74 client.stop(); //关闭客户端 75 delay(5000); 76 i++; 77 } 78 } 79 } 80 81 void setup() 82 { 83 WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector 84 85 Serial.begin(115200); 86 Serial.println(); 87 wifi_init(); 88 tcpclient_init(); 89 90 camera_config_t config; 91 config.ledc_channel = LEDC_CHANNEL_0; 92 config.ledc_timer = LEDC_TIMER_0; 93 config.pin_d0 = Y2_GPIO_NUM; 94 config.pin_d1 = Y3_GPIO_NUM; 95 config.pin_d2 = Y4_GPIO_NUM; 96 config.pin_d3 = Y5_GPIO_NUM; 97 config.pin_d4 = Y6_GPIO_NUM; 98 config.pin_d5 = Y7_GPIO_NUM; 99 config.pin_d6 = Y8_GPIO_NUM; 100 config.pin_d7 = Y9_GPIO_NUM; 101 config.pin_xclk = XCLK_GPIO_NUM; 102 config.pin_pclk = PCLK_GPIO_NUM; 103 config.pin_vsync = VSYNC_GPIO_NUM; 104 config.pin_href = HREF_GPIO_NUM; 105 config.pin_sscb_sda = SIOD_GPIO_NUM; 106 config.pin_sscb_scl = SIOC_GPIO_NUM; 107 config.pin_pwdn = PWDN_GPIO_NUM; 108 config.pin_reset = RESET_GPIO_NUM; 109 config.xclk_freq_hz = 20000000; 110 config.pixel_format = PIXFORMAT_JPEG; 111 config.frame_size = FRAMESIZE_XGA; 112 config.jpeg_quality = 12; 113 config.fb_count = 1; 114 if(psramFound()) 115 { 116 config.frame_size = FRAMESIZE_UXGA; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA 117 config.jpeg_quality = 10; 118 config.fb_count = 2; 119 } 120 else 121 { 122 config.frame_size = FRAMESIZE_SVGA; 123 config.jpeg_quality = 12; 124 config.fb_count = 1; 125 } 126 127 esp_sleep_enable_ext0_wakeup(GPIO_NUM_13, 1);//设置IO13端口高电平为睡眠唤醒 128 // Init Camera 129 esp_err_t err = esp_camera_init(&config); 130 if (err != ESP_OK) 131 { 132 Serial.printf("Camera init failed with error 0x%x", err); 133 return; 134 } 135 136 } 137 138 void loop() 139 { 140 if(client.connected() || client.available())//如果已连接或有收到的未读取的数据 141 { 142 if(client.available()) //如果有数据可读取 143 { 144 String line = client.readStringUntil('\n'); //读取数据到换行符 145 Serial.print("读取到数据:"); 146 Serial.println(line); 147 client.write(line.c_str()); //将收到的数据回发 148 149 //收到take,拍一张照片并传送给TCP服务端 150 if(line == "take") 151 { 152 camera_fb_t * fb = esp_camera_fb_get(); 153 uint8_t * temp = fb->buf; 154 if(!fb) 155 { 156 Serial.println("Camera capture failed"); 157 } 158 else 159 { 160 // 将图片数据分段发送 161 int leng = fb->len; 162 int timess = leng/maxcache; 163 int extra = leng%maxcache; 164 for(int j = 0;j< timess;j++) 165 { 166 delay(100); 167 client.write(fb->buf, maxcache); 168 for(int i =0;i< maxcache;i++) 169 { 170 fb->buf++; 171 } 172 //Serial.println("succes to send image for tcp"); 173 } 174 client.write(fb->buf, extra); 175 fb->buf = temp; //将当时保存的指针重新返还 176 esp_camera_fb_return(fb); //这一步在发送完毕后要执行,具体作用还未可知。 177 } 178 } 179 180 //收到stop,进入深度睡眠 181 if(line == "stop") 182 { 183 Serial.println("关闭当前连接"); 184 client.stop(); //关闭客户端 185 esp_sleep_enable_ext0_wakeup(GPIO_NUM_13, 1); 186 int i = 0; 187 while(i<10) 188 { 189 Serial.println("Going to sleep now"+i); 190 delay(100); 191 i++; 192 } 193 esp_deep_sleep_start(); 194 } 195 } 196 197 } 198 else 199 { 200 Serial.println("访问失败"); 201 client.stop(); //关闭客户端 202 } 203 delay(5000); 204 }