Быстрый старт с Arducam Mega в Arduino IDE
Оборудование

Программное обеспечение
Настройка среды и работа в Arduino IDE.
Шаг 1. Скачайте библиотеку
git clone https://github.com/ArduCAM/Arducam_Mega.git
Шаг 2. Загрузите прошивку на устройство
ПримечаниеПример приведён для отладочной платы Arduino UNO.
Скопируйте скачанную библиотеку в папку libraries.

Как это работает
ПримечаниеArducam выпустила полнофункциональный скрипт, с помощью которого можно проверить все функции Arducam Mega. Ниже описан порядок его работы на платформе Arduino UNO.
setup()
myUart.arducamUartBegin(921600);
myCAM.begin();
myCAM.registerCallBack(readBuffer,200);
Инициализация последовательного порта
Сначала инициализируется последовательный порт — через него скрипт связывается с программой Arducam Mega.
Инициализация камеры
Функция begin() инициализирует настройки камеры. После её выполнения камера выдаёт данные в формате JPEG с максимальным разрешением.
Прототип функции:
CamStatus begin(ArducamCamera* camera);
Регистрация функции обратного вызова
Затем регистрируется функция обратного вызова — она вызывается в потоковом режиме.
Прототип функции:
void registerCallback(ArducamCamera* camera, BUFFER_CALLBACK function, uint8_t blockSize);
ВниманиеДлина передачи должна быть меньше 255.
loop()
В цикле скрипт по протоколу, определённому Arducam, разбирает команды от хост-программы Arducam Mega и в ответ на каждую команду выполняет нужное действие. Подробный код:
Приём данных по последовательному порту
if (myUart.arducamUartAvailable())
{
temp = myUart.arducamUartRead();
arducamDelayMs(5);
if (temp == 0x55)
{
while (myUart.arducamUartAvailable())
{
commandBuff[commandLength] = myUart.arducamUartRead();
if (commandBuff[commandLength] == 0xAA)
{
break;
}
commandLength++;
}
myUart.uartCommandProcessing(&(myCAM.cameraInfo),commandBuff,commandLength);
commandLength = 0;
}
}
Разбор протокола
uint8_t ArducamLink::uartCommandProcessing(Arducam* myCAM,uint8_t* commandBuff)
{
ArducamCamera* cameraInstance = myCAM->getCameraInstance();
CamStatus state;
uint16_t gainValue = 0;
uint32_t exposureValue = 0;
uint32_t exposureLen1 = 0;
uint32_t exposureLen2 = 0;
uint32_t exposureLen3 = 0;
uint8_t cameraResolution = cameraInstance->currentPictureMode;
uint8_t cameraFarmat = cameraInstance->currentPixelFormat;
switch (commandBuff[0])
{
case SET_PICTURE_RESOLUTION: //Set Camera Resolution
cameraResolution = commandBuff[1] & 0x0f;
cameraFarmat = (commandBuff[1] & 0x70) >> 4;
myCAM->takePicture((CAM_IMAGE_MODE)cameraResolution,(CAM_IMAGE_PIX_FMT)cameraFarmat);
break;
case SET_VIDEO_RESOLUTION: //Set Video Resolution
cameraResolution = commandBuff[1] & 0x0f;
state = myCAM->startPreview((CAM_VIDEO_MODE)cameraResolution);
if (state == CAM_ERR_NO_CALLBACK)
{
Serial.println("callback function is not registered");
}
break;
case SET_BRIGHTNESS: //Set brightness
myCAM->setBrightness((CAM_BRIGHTNESS_LEVEL)commandBuff[1]);
break;
case SET_CONTRAST: //Set Contrast
myCAM->setContrast((CAM_CONTRAST_LEVEL)commandBuff[1]);
break;
Блок-схемы
Съёмка фото

Потоковый режим
