Các thành phần về phần cứng dùng cho lập trình ESP32-CAM
+ Module ESP32-CAM
+ Module giao tiếp nối tiếp PL2303
Cài đặt môi trường, thư viện cho Arduino IDE lập trình ESP32-CAM
+ Các bạn hãy tải Arduino IDE tại trang chủ Arduino, ở đây tôi vẫn đang dùng bản 1.8.8, các bạn có thể tải các phiên bản cũ hơn của Arduino IDE ở đây
+ Khởi động Arduino IDE, và chọn Preferences như hình minh họa dưới đây
Trong mục Additional Boards Manager URLs, các bạn điền dòng sau: https://dl.espressif.com/dl/package_esp32_index.json, http://arduino.esp8266.com/stable/package_esp8266com_index.json
Sử dụng URL như trên giúp chúng ta vừa dùng ESP8266 và ESP32
Tiếp theo các bạn chọn OK, sau đó tìm vào menu Tool-> Boards Manager như hình dưới
Trong ô nhập tìm kiếm, các bạn gõ chữ ESP32, sau đó chọn esp32-> install như hình dưới, của tôi đã được cài sẵn nên chữ install bị mờ đi.
Tiếp theo là kiểm tra xem board đã được cài đặt thành công chưa. Vào Tool->Boards->AI-Thinker ESP32-CAM
Đấu nối, cách nạp chương trình cho ESP32 với Arduino IDE
+ Đấu nối module ESP32-CAM với PL2303. ( Trong một số hướng dẫn khác trên mạng thường yêu cầu module FTDI, nhưng tôi thấy chỉ cần là module USBtoTTL vẫn thực hiện kết nối bình thường, vì vậy ở đây có sẵn PL2303 nên tôi dùng và PL2303 cũng tương đối ổn định)
Sơ đồ đấu nối ( chú ý chân IO0 phải được nối GND khi nạp, sau đó ngắt ra)
Sau khi đấu nối xong, cắm PL2303 vào Laptop, sẽ không thấy đèn báo nào trên Module ESP32 sáng. Ta có thể kiểm tra bằng cách nhấn nut RESET, sẽ thấy đèn Flash phía sau nháy sáng, lúc này cấp nguồn của chúng ta đến ESP32 đã OK.
Tiến hành nạp và chạy thử chương trình:
- Tại cửa sổ của Arduino IDE, chọn File->Example->wifi->wifi scan
- Kiểm tra PL2303 cắm vào PC được nhận là COM số mấy?
Cách nạp chương trình:
Trong các hướng dẫn khác, chỉ ra cách nạp khá nhiều bước, phải chờ xuất hiện kí tự gì gì đó rồi nhấn reset, nhưng về bản chất nó rất đơn giản. ( Khi các bạn cấp nguồn, đồng thời chân IO0 nối GND, nếu nhấn reset sau đó nhả ra, ESP32 hoặc ESP8266 đều rơi vào chế độ Flash, có nghĩa là lúc này chỉ là bắt tay giữa PC với ESP qua UART là tự động nạp chương trình vào bộ nhớ, chúng ta chỉ cần ngồi đợi cho nạp xong, không phải canh thời gian nhấn nút reset làm gì cho mất công!)
Kết quả sau khi nhấn nút reset như mô tả bên trên, đồng thời nhấn nút mũi tên màu vàng như hình dưới.
Sau khi nạp thành công 100%, các bạn hãy ngắt dây nối IO0 và GND ra. sau đó mở Serial Terminal, chọn tốc độ 115200 và quan sát kết quả.
Đến đây chúng ta đã thành công trong bước đầu tiên tiếp cận với ESP32-CAM, bài sau chúng ta sẽ làm một project nhỏ với module này: ” Lập trình ESP32-CAM chụp hình, lưu vào thẻ nhớ”
I am actually happy to glance at this website posts which includes plenty of helpful data, thanks for providing these kinds of statistics.|
Thanks and welcome 🙂
It’s really a great and helpful piece of info.
I’m glad that you shared this helpful info with us.
Please keep us informed like this. Thanks for sharing.
I absolutely love your blog.. Excellent colors & theme.
Did you develop this amazing site yourself? Please reply back as I’m hoping to create
my own site and would love to know where you got this from or what the theme is
called. Appreciate it!
Thank you very much! This theme is Jnews.
thanks for your post it was very helpful.
I am working on a face recognition project using this esp32_cam, but after recognizing it controls relayPin to open the door, the signal it gives after I setup () for it, it can’t output or very weak and short wait. So let me ask how to handle it?
Thank you for your interest.
this is my program
#include “esp_camera.h”
#include “fd_forward.h”
#include “fr_forward.h”
#include “fr_flash.h”
#define CAMERA_MODEL_AI_THINKER
//khái báo kết nối relay và đèn
#define trueled 4
#define relayPin 14
unsigned long currentMillis = 0;
unsigned long openedMillis = 0;
long interval = 5000; // mở khóa trong …..ms
// khái báo chân kết nối với esp32_cam
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
#define ENROLL_CONFIRM_TIMES 5
#define FACE_ID_SAVE_NUMBER 7
// cấu hình của mô hình MTMN (nhận diện khuôn mặt kích thước ngưỡng ứng viên, kim tự tháp
static inline mtmn_config_t app_mtmn_config()
{
mtmn_config_t mtmn_config = {0};
mtmn_config.type = FAST;
mtmn_config.min_face = 80;
mtmn_config.pyramid = 0.707;
mtmn_config.pyramid_times = 4;
mtmn_config.p_threshold.score = 0.6;
mtmn_config.p_threshold.nms = 0.7;
mtmn_config.p_threshold.candidate_number = 20;
mtmn_config.r_threshold.score = 0.7;
mtmn_config.r_threshold.nms = 0.7;
mtmn_config.r_threshold.candidate_number = 10;
mtmn_config.o_threshold.score = 0.7;
mtmn_config.o_threshold.nms = 0.7;
mtmn_config.o_threshold.candidate_number = 1;
return mtmn_config;
}
mtmn_config_t mtmn_config = app_mtmn_config();
// khai báo danh sách các khuôn mặt đc ghi nhớ
static face_id_list id_list = {0};
dl_matrix3du_t *image_matrix = NULL;
camera_fb_t * fb = NULL;
// gắn ảnh mới đc căn chỉnh vào kích thước của face đc cài đặt
dl_matrix3du_t *aligned_face = dl_matrix3du_alloc(1, FACE_WIDTH, FACE_HEIGHT, 3);
//hàm khởi tạo
void setup() {
Serial.begin(115200); //tốc độ boaud
delay(3000);
// đặt chế độ ban đầu vào cho chân relay và led
pinMode(relayPin , OUTPUT);
pinMode(trueled , OUTPUT);
pinMode(33 , OUTPUT) ; // hoạt động ở mức thấp
digitalWrite(relayPin ,LOW);
digitalWrite(trueled , LOW);
digitalWrite(33, HIGH);
// khởi tạo camera và khai báo chân kết nối với esp
camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = Y2_GPIO_NUM;
config.pin_d1 = Y3_GPIO_NUM;
config.pin_d2 = Y4_GPIO_NUM;
config.pin_d3 = Y5_GPIO_NUM;
config.pin_d4 = Y6_GPIO_NUM;
config.pin_d5 = Y7_GPIO_NUM;
config.pin_d6 = Y8_GPIO_NUM;
config.pin_d7 = Y9_GPIO_NUM;
config.pin_xclk = XCLK_GPIO_NUM;
config.pin_pclk = PCLK_GPIO_NUM;
config.pin_vsync = VSYNC_GPIO_NUM;
config.pin_href = HREF_GPIO_NUM;
config.pin_sscb_sda = SIOD_GPIO_NUM;
config.pin_sscb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000; // tần số ban camera sử dụng
config.pixel_format = PIXFORMAT_JPEG; // khai báo chất lượng ảnh
config.frame_size = FRAMESIZE_UXGA; // kích thước khung ảnh
config.jpeg_quality = 10; // khung hình và chất lượng ảnh là jpeg
config.fb_count = 2;
//khởi tạo camera
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf(“Camera init failed with error 0x%x”, err);
return;
}
// giảm kích thước khung hình để có tốc độ cao hơn
sensor_t * s = esp_camera_sensor_get(); // lưu và cài đặt máy ảnh vào bộ nhớ không thay đổi
s->set_framesize(s, FRAMESIZE_QVGA); // kích thước khung
s->set_vflip(s, 1);
face_id_init(&id_list, FACE_ID_SAVE_NUMBER, ENROLL_CONFIRM_TIMES); // khởi tạo danh sách khuôn mặt đc lưu và đăng kí
read_face_id_from_flash(&id_list);// đọc dữ liệu khuôn mặt hiện tại từ flash trên bo mạch
}
// chương trình để mở khóa cửa và bật đèn led
// hàm xác định nhận dạng khuôn mặt
bool run_face_recognition() {
bool faceRecognised = false;
int64_t start_time = esp_timer_get_time();
fb = esp_camera_fb_get();
if (!fb) {
Serial.println(“Camera capture failed”);
return false;
}
int64_t fb_get_time = esp_timer_get_time();
Serial.printf(“Get one frame in %u ms.\n”, (fb_get_time – start_time) / 1000); // đưa Cam vào khuôn mặt muốn nhận diện
image_matrix = dl_matrix3du_alloc(1, fb->width, fb->height, 3); //ma trận khuôn mặt phát hiện so sánh kích thước của ảnh
uint32_t res = fmt2rgb888(fb->buf, fb->len, fb->format, image_matrix->item);
if (!res) {
Serial.println(“to rgb888 failed”);
dl_matrix3du_free(image_matrix);
}
esp_camera_fb_return(fb);
box_array_t *net_boxes = face_detect(image_matrix, &mtmn_config);
if (net_boxes) {
// nếu thiết lập camera ok
if (align_face(net_boxes, image_matrix, aligned_face) == ESP_OK) {
int matched_id = recognize_face(&id_list, aligned_face); // khai báo biến trong list khuôn mặt
if (matched_id >= 0) {
Serial.printf(“Match Face ID: %u\n”, matched_id);
faceRecognised = true; // nhận diện dúng
} else {
Serial.println(“No Match Found”); // khong xác định được khuôn mặt
matched_id = -1;
}
} else {
Serial.println(“Face Not Aligned”); // khuôn mặt chưa đc căn chỉnh
}
free(net_boxes->box);
free(net_boxes->landmark);
free(net_boxes);
}
dl_matrix3du_free(image_matrix);
return faceRecognised;
}
void rzoCheckForFace(){
currentMillis = millis();
if (run_face_recognition()) {
// nó trả về giá trị true
Serial.println(“Face recognised”);
digitalWrite(relayPin , HIGH); //relay hoạt động
digitalWrite(trueled , HIGH); // led mở
digitalWrite(33, LOW );
openedMillis = millis(); //thời gian đóng lại của relay
}
if (currentMillis – interval > openedMillis) {
// thời gian >5s thì đóng cửa
digitalWrite(13 , HIGH); // mở relay
digitalWrite(trueled, LOW); // tắt Flash
digitalWrite(33 , HIGH); // bật led
}
}
void loop() {
rzoCheckForFace();
}
That’s interesting project. Firstly, you need to make sure there is an output signal. It’easy to check, like a led. Then, checking your relay circuit, does it work well when have a trigger signal?