Перевод статьи ESP32-CAM QR Code Reader/Scanner (Arduino IDE)Rui Santos & Sara Santos, Random Nerd Tutorials.

Из этого руководства вы узнаете, как собрать сканер (или, если угодно, считыватель) QR-кодов на плате ESP32-CAM и запрограммировать его из Arduino IDE. ESP32-CAM непрерывно использует камеру, чтобы искать новые QR-коды: за это отвечает библиотека ESP32QRCodeReader и доработанная версия библиотеки quirc. Как только плата находит корректный QR-код, она выводит его содержимое в монитор порта.

Обзор проекта#

Коротко о том, как всё работает.

Схема работы сканера QR-кодов на ESP32-CAM

ESP32-CAM постоянно сканирует новые QR-коды и выводит их данные в монитор порта.

  • ESP32-CAM постоянно сканирует новые QR-коды.
  • Обнаружив корректный QR-код, плата выводит его содержимое в монитор порта Arduino IDE.

Такой проект пригодится для системы контроля посещаемости по билетам, для отслеживания товаров, в роли системы доступа (проверять QR-коды, чтобы открывать двери или ячейки шкафчиков) и для множества других задач.

Что понадобится#

Мы возьмём плату ESP32-CAM в исполнении модуля AI-Thinker, но подойдут и другие модули — достаточно правильно назначить пины в коде. Ещё один пример — плата Freenove ESP32-Wrover CAM.

Плата ESP32-CAM — это устройство за $9 (или дешевле), в котором объединены чип ESP32-S, камера OV2640, слот для карты microSD и несколько выводов GPIO.

Плата ESP32-CAM с камерой OV2640 и слотом microSD

ESP32-CAM за $9: чип ESP32-S, камера OV2640, слот microSD и несколько GPIO.

Чтобы повторить проект, вам нужны следующие компоненты:

Для знакомства с ESP32-CAM пригодятся отдельные руководства:

Подготовка Arduino IDE#

Программировать плату ESP32 мы будем из Arduino IDE. Значит, у вас должна быть установлена сама Arduino IDE, а к ней — дополнение для ESP32. Если ещё не ставили, начните с этого руководства:

Установка библиотеки ESP32QRCodeReader#

В этом руководстве мы используем библиотеку ESP32QRCodeReader от Alvarowolfx — с ней читать QR-коды на ESP32-CAM совсем просто.

Затем в Arduino IDE зайдите в Sketch > Include Library > Add .ZIP library и установите библиотеку, которую только что скачали.

Установка .ZIP-библиотеки в Arduino IDE

Sketch > Include Library > Add .ZIP library.

Код: сканер QR-кодов на ESP32-CAM#

Скопируйте код сканера QR-кодов в Arduino IDE.

/*********
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/esp32-cam-qr-code-reader-scanner-arduino/
*********/

#include <Arduino.h>
#include <ESP32QRCodeReader.h>

// FOR THIS PROJECT, YOUR ESP32-CAM NEEDS TO HAVE PSRAM.
// Some of the compatible boards: CAMERA_MODEL_AI_THINKER | CAMERA_MODEL_WROVER_KIT | CAMERA_MODEL_ESP_EYE
// CAMERA_MODEL_M5STACK_PSRAM | CAMERA_MODEL_M5STACK_V2_PSRAM | CAMERA_MODEL_M5STACK_WIDE  
ESP32QRCodeReader reader(CAMERA_MODEL_AI_THINKER);

void onQrCodeTask(void *pvParameters) {
  struct QRCodeData qrCodeData;

  while (true) {
    if (reader.receiveQrCode(&qrCodeData, 100)) {
      Serial.println("Scanned new QRCode");
      if (qrCodeData.valid) {
        Serial.print("Valid payload: ");
        Serial.println((const char *)qrCodeData.payload);
      }
      else {
        Serial.print("Invalid payload: ");
        Serial.println((const char *)qrCodeData.payload);
      }
    }
    vTaskDelay(100 / portTICK_PERIOD_MS);
  }
}

void setup() {
  Serial.begin(115200);
  Serial.println();

  reader.setup();
  Serial.println("Setup QRCode Reader");

  reader.beginOnCore(1);
  Serial.println("Begin on Core 1");

  xTaskCreate(onQrCodeTask, "onQrCode", 4 * 1024, NULL, 4, NULL);
}

void loop() {
  delay(100);
}

Исходник скетча на GitHub.

Как работает код#

Начинается всё с подключения библиотек, необходимых для сканирования QR-кодов на ESP32-CAM:

#include <Arduino.h>
#include <ESP32QRCodeReader.h>

Затем создаём объект reader для сканера QR-кодов. В этом руководстве мы используем модель AI-Thinker ESP32-CAM.

// FOR THIS PROJECT, YOUR ESP32-CAM NEEDS TO HAVE PSRAM.
// Some of the compatible boards: CAMERA_MODEL_AI_THINKER | CAMERA_MODEL_WROVER_KIT | CAMERA_MODEL_ESP_EYE
// CAMERA_MODEL_M5STACK_PSRAM | CAMERA_MODEL_M5STACK_V2_PSRAM | CAMERA_MODEL_M5STACK_WIDE

ESP32QRCodeReader reader(CAMERA_MODEL_AI_THINKER);

Обратите внимание: плата обязательно должна иметь PSRAM. Код проверялся и должен работать со следующими версиями плат ESP32-CAM:

  • CAMERA_MODEL_AI_THINKER
  • CAMERA_MODEL_WROVER_KIT
  • CAMERA_MODEL_ESP_EYE
  • CAMERA_MODEL_M5STACK_PSRAM
  • CAMERA_MODEL_M5STACK_V2_PSRAM
  • CAMERA_MODEL_M5STACK_WIDE

setup()#

В функции setup() сначала инициализируем последовательную связь на скорости 115200 бод — она нужна для отладки.

void setup() {
  Serial.begin(115200);
  Serial.println();

Вызов reader.setup() запускает камеру, используя настройки библиотеки по умолчанию для платы AI-Thinker (или той, что вы выбрали).

reader.setup();
Serial.println("Setup QRCode Reader");

Считыватель камеры мы запускаем на ядре 1 процессора (у чипа ESP32 два ядра).

reader.beginOnCore(1);
Serial.println("Begin on Core 1");

Наконец, создаём задачу FreeRTOS для функции onQrCodeTask. Так сканер QR-кодов сможет работать в фоне.

xTaskCreate(onQrCodeTask, "onQrCode", 4 * 1024, NULL, 4, NULL);

onQrCodeTask()#

Функция onQrCodeTask в цикле while (true) постоянно ищет новые QR-коды, и, обнаружив корректный код, выводит его данные в монитор порта.

void onQrCodeTask(void *pvParameters) {
  struct QRCodeData qrCodeData;

  while (true) {
    if (reader.receiveQrCode(&qrCodeData, 100)) {
      Serial.println("Scanned new QRCode");
      if (qrCodeData.valid) {
        Serial.print("Valid payload: ");
        Serial.println((const char *)qrCodeData.payload);
      }
      else {
        Serial.print("Invalid payload: ");
        Serial.println((const char *)qrCodeData.payload);
      }
    }
    vTaskDelay(100 / portTICK_PERIOD_MS);
  }
}

Вызов reader.receiveQrCode() пытается получить QR-код. Если код распознан, его данные попадают в структуру qrCodeData. Поле qrCodeData.valid говорит, корректен ли код: при true в монитор порта выводится строка Valid payload: и само содержимое, иначе — Invalid payload:. Полезная нагрузка (payload) — это те данные, что зашиты в QR-коде (например, ссылка или текст).

Заливка кода на ESP32-CAM AI-Thinker через программатор ESP32-CAM-MB#

Чтобы залить код, подключите к плате программатор ESP32-CAM-MB на micro-USB (как он устроен, можно прочитать в этом руководстве).

Программатор ESP32-CAM-MB с чипом CH340G и камера OV2640

Программатор ESP32-CAM-MB на micro-USB.

Затем подключите плату к компьютеру по USB-кабелю.

После этого в Arduino IDE зайдите в Tools > Board и выберите AI-Thinker ESP32-CAM (либо найдите плату через строку поиска сверху). У вас должно быть установлено дополнение ESP32, иначе этой платы в меню не будет.

Выбор платы AI-Thinker ESP32-CAM в Arduino IDE

Tools > Board > AI-Thinker ESP32-CAM.

Зайдите в Tools > Port и выберите COM-порт, к которому подключена ESP32-CAM.

Обратите внимание: если плата не появляется, значит, скорее всего, у вас не установлены драйверы CH340C. Наберите в поиске «CH340C drivers» с названием вашей операционной системы и поставьте драйверы.

Наконец, нажмите в Arduino IDE кнопку Upload.

Вот и всё! Код сканера QR-кодов должен заработать на вашей ESP32-CAM.

Демонстрация#

После заливки откройте монитор порта на скорости 115200 бод. Нажмите на плате кнопку сброса — должен запуститься сканер QR-кодов. Проверьте окно монитора порта Arduino IDE: всё ли работает как надо.

Запуск сканера QR-кодов в мониторе порта Arduino IDE

Сканер инициализировался — видно в мониторе порта.

Наведите ESP32-CAM на QR-код. Вот пример кода с данными https://randomnerdtutorials.com/.

Пример QR-кода со ссылкой на RandomNerdTutorials.com

Тестовый QR-код.

ESP32-CAM наведена на QR-код при тестировании

Наводим камеру на QR-код.

Содержимое кода должно вывестись в мониторе порта Arduino IDE:

Данные QR-кода в мониторе порта Arduino IDE

Распознанная полезная нагрузка в мониторе порта.

Если в мониторе порта у вас постоянно появляется такое сообщение:

Invalid payload: ECC failure

то, возможно, стоит взять QR-код поменьше, стабильнее держать камеру и наводить её точно на код при хорошем освещении.

У ESP32-CAM есть ограничения по разрешению, и с движением она справляется плохо, поэтому камеру нужно наводить на QR-код ровно и без дрожания. Кроме того, распознавать QR-коды сложно при плохом освещении — как слишком ярком, так и слишком тусклом.

Диагностика и советы#

Как уже говорилось, этот сканер QR-кодов расходует много памяти, поэтому ваша ESP32-CAM обязательно должна иметь PSRAM. Вот платы, которые проверялись и должны работать с этим примером:

  • CAMERA_MODEL_AI_THINKER
  • CAMERA_MODEL_WROVER_KIT
  • CAMERA_MODEL_ESP_EYE
  • CAMERA_MODEL_M5STACK_PSRAM
  • CAMERA_MODEL_M5STACK_V2_PSRAM
  • CAMERA_MODEL_M5STACK_WIDE

Если вы сталкиваетесь с любой из следующих ошибок, загляните в наше руководство ESP32-CAM Troubleshooting Guide: Most Common Problems Fixed:

  • Failed to connect to ESP32: Timed out waiting for packet header
  • Camera init failed with error 0x20001 или похожая;
  • ошибка Brownout detector или Guru meditation error;
  • Sketch too big — выбрана неверная схема разделов (partition scheme);
  • Board at COMX is not available — не выбран COM-порт;
  • Psram error: GPIO isr service is not installed.

Итого#

Надеемся, руководство оказалось полезным и пригодится вам в проектах. Похожие проекты с ESP32-CAM, которые могут понравиться: