ESP8266 + OV7670

isivasan

New member
Пойти не так ничего не может. Не так идет у SoC c закрытыми исходниками...
Сколько Help не напишут, всё равно изменить общий алгоритм работы не выйдет, без переписывания достаточной части ПО. Одному переписать всю SDK невозможно, тем более заниматься этим на устаревший чип никто не возьмется.
Выходит, что рациональнее прикручивать камерку к ESP-32S. Там возможностей больше, чем у ESP8266, из-за наличия исходников компоновки SDK и RTOS (возможностей влиять на системы приоритетов исполняемых в нужный момент задач и их последовательностей)…
тогда уж сразу лучше сюда камерку прикрутить :)
 

pvvx

Активный участник сообщества
тогда уж сразу лучше сюда камерку прикрутить :)
А там WiFi Очень(!) плохо работает. Замена -> MIFI 3G/4G Router (итого дешевле и всё работает)

Для Arduino ESP есть такое ADNS-3080 Optical Flow Sensor Module APM2.52/2.6 For Flight Controller Arduino. Больший кадр ESP8266 не обработать. Если "Arduino", то всегда дороже :)
 
Последнее редактирование:

isivasan

New member
А там WiFi Очень(!) плохо работает. Замена -> MIFI 3G/4G Router (итого дешевле и всё работает)

Для Arduino ESP есть такое ADNS-3080 Optical Flow Sensor Module APM2.52/2.6 For Flight Controller Arduino. Больший кадр ESP8266 не обработать. Если "Arduino", то всегда дороже :)
А вот за это спасибо! Лично опыта не имею, но были планы пощупать данные платки.
 

isivasan

New member
А как это вообще можно сравнивать? :)

ПРАВОЧКА: не правильно прочитал:). Опять же не знаком с RTL8195 Wireless WIFI Module и как то адекватно сравнить с апельсином не могу.
 
Последнее редактирование:

pvvx

Активный участник сообщества
А как это вообще можно сравнивать? :)

ПРАВОЧКА: не правильно прочитал:). Опять же не знаком с RTL8195 Wireless WIFI Module и как то адекватно сравнить с апельсином не могу.
Отличие простое - это не *nix, а real-time система (RTOS) + готовое Arduino для USB камер. А так-же потребление и пачка Deep-Sleep.
Пока искал ссылки, заодно и заказал это всё барахло. Придет данная камерка - подключу к модулю.
 

isivasan

New member
Отличие простое - это не *nix, а real-time система (RTOS) + готовое Arduino для USB камер. А так-же потребление и пачка Deep-Sleep.
Пока искал ссылки, заодно и заказал это всё барахло. Придет данная камерка - подключу к модулю.
А какой то адекватный инструментарий для этого модуля имеется?
 

pvvx

Активный участник сообщества
А какой то адекватный инструментарий для этого модуля имеется?
Да. SDK с 90% исходников и мой "реверс" cо своими rtlDuino и сборкой SDK. :) Всё там -> Realtek RTL8710, RTL8711, RTL8195
Т.е. уровень "проработки", для меня, там в несколько раз лучше, чем у ESP-32S, как и аппаратных возможностей у RTL8195 (USB и 2.5МБ RAM). Там даже если сравнивать по цене с ESP8266, то количество нужных фич больше, чем соотношение по цене, а потребление практически одинаково, но больше вариантов всяких sleep и просыпаний по событиям... Ну и позиционирование чипов разное - ESP только для DIY, а RTL - рабочие и пром. изделия. :) (это как сравнивать Espressif и Realtek :) Можно и более взять - сравнить мелких производителей Pi выпускающих платки без последующей поддержки и Realtek :) Ну, а народ всё равно выберет что-то самое худшее - таков закон природы - самоуничтожение из-за перенаселенности... :) )
 
Последнее редактирование:

pvvx

Активный участник сообщества
А вот за это спасибо! Лично опыта не имею, но были планы пощупать данные платки.
Уже пришла:
A3080.jpg
Циферки в счетчике:
Снимок1568.gif Снимок1569.gif
Код:
#include <SPI.h>

void UserPreInit(void)
{
  Init_CPU_CLK_UART(0, 38400); // 166.7 MHz
  // 0 - 166666666 Hz, 1 - 83333333 Hz, 2 - 41666666 Hz, 3 - 20833333 Hz, 4 - 10416666 Hz, 5 - 4000000 Hz
  // 6 - 200000000 Hz, 7 - 10000000 Hz, 8 - 50000000 Hz, 9 - 25000000 Hz, 10 - 12500000 Hz, 11 - 4000000 Hz
}

SPISettings spiSettings(2000000, MSBFIRST, SPI_MODE3); // 2 MHz, mode 3

// Register Map for the ADNS3080 Optical OpticalFlow Sensor
#define ADNS3080_PRODUCT_ID            0x00
#define ADNS3080_REVISION_ID           0x01
#define ADNS3080_MOTION                0x02
#define ADNS3080_DELTA_X               0x03
#define ADNS3080_DELTA_Y               0x04
#define ADNS3080_SQUAL                 0x05
#define ADNS3080_CONFIGURATION_BITS    0x0A
#define ADNS3080_MOTION_CLEAR          0x12
#define ADNS3080_FRAME_CAPTURE         0x13
#define ADNS3080_SROM_ID               0x1f
#define ADNS3080_Observation           0x3D
#define ADNS3080_MOTION_BURST          0x50

// ADNS3080 hardware config
#define ADNS3080_PIXELS_X              30
#define ADNS3080_PIXELS_Y              30

// Id returned by ADNS3080_PRODUCT_ID register
#define ADNS3080_PRODUCT_ID_VALUE      0x17

static const uint8_t RESET_PIN = 12; // PC_4
static const uint8_t SS_PIN = 3; // PA_3

static int32_t x, y;

void setup() {
  uint8_t buf[0x40];
  SPI.begin();
  // Set reset pin as output
  pinMode(RESET_PIN, OUTPUT);
  while (1) {
    reset();
    for (uint8_t addr = 0; addr <= 0x40; addr++) buf[addr] = spiRead(addr);
    if (buf[0] == ADNS3080_PRODUCT_ID_VALUE) {
      printf("ADNS-3080 found (id = 0x%02x, rev = 0x%02x, fw = 0x%02x)\n", buf[ADNS3080_PRODUCT_ID], buf[ADNS3080_REVISION_ID], buf[ADNS3080_SROM_ID]);
      break;
    }
    else {
      printf("Could not find ADNS-3080: (id = %02x)\n", buf[ADNS3080_PRODUCT_ID]);
      delay(1500);
    }
  }
  printf("Config reg = 0x%02x\n", buf[ADNS3080_CONFIGURATION_BITS]);
  spiWrite(ADNS3080_CONFIGURATION_BITS, buf[ADNS3080_CONFIGURATION_BITS] | 0x10); // Set resolution to 1600 counts per inch
}

void loop() {
#if 0
  updateSensor();
#else
  printf("image data --------------\n");
  printPixelData();
  printf("-------------------------\n");
  delay(1500);
#endif
}

void printPixelData(void) {
  bool isFirstPixel = true;

  // Write to frame capture register to force capture of frame
  spiWrite(ADNS3080_FRAME_CAPTURE, 0x83);

  // Wait 3 frame periods + 10 nanoseconds for frame to be captured
  delay(5); // Minimum frame speed is 2000 frames/second so 1 frame = 500 nano seconds. So 500 x 3 + 10 = 1510

  // Display the pixel data
  for (uint8_t i = 0; i < ADNS3080_PIXELS_Y; i++) {
    for (uint8_t j = 0; j < ADNS3080_PIXELS_X; j++) {
      uint8_t regValue = spiRead(ADNS3080_FRAME_CAPTURE);
      if (isFirstPixel && !(regValue & 0x40)) {
        printf("Failed to find first pixel\n");
        goto reset;
      }
      isFirstPixel = false;
      uint8_t pixelValue = regValue << 2; // Only lower 6 bits have data
#if 1
      if (j < ADNS3080_PIXELS_X - 1 )  printf("%u,", pixelValue);
      else printf("%u\n", pixelValue);
#else
      if (j < ADNS3080_PIXELS_X - 1 )  printf("%02x,", pixelValue);
      else printf("%02x\n", pixelValue);
#endif
    }
  }
reset:
  reset(); // Hardware reset to restore sensor to normal operation
}

void updateSensor(void) {
  // Read sensor
  uint8_t buf[4];
  spiRead(ADNS3080_MOTION_BURST, buf, 4);
  uint8_t motion = buf[0];
  //Serial.print(motion & 0x01); // Resolution

  if (motion & 0x10) // Check if we've had an overflow
    printf("ADNS-3080 overflow\n");
  else if (motion & 0x80) {
    int8_t dx = buf[1];
    int8_t dy = buf[2];
    uint8_t surfaceQuality = buf[3];
    x += dx;
    y += dy;
    // Print values
    printf("%d, %d\t%d, %d\t%d\n", x, dx, y, dy, surfaceQuality);
  }
#if 0
  else
    printf("0x%02x\n", motion);
#endif
  delay(10);
}

void reset(void) {
  digitalWrite(RESET_PIN, HIGH); // Set high
  delayMicroseconds(10);
  digitalWrite(RESET_PIN, LOW); // Set low
  delay(2); //    delayMicroseconds(1500); // Wait for sensor to get ready
}

// Will cause the Delta_X, Delta_Y, and internal motion registers to be cleared
void clearMotion() {
  spiWrite(ADNS3080_MOTION_CLEAR, 0xFF); // Writing anything to this register will clear the sensor's motion registers
  x = y = 0;
}

void spiWrite(uint8_t reg, uint8_t data) {
  spiWrite(reg, &data, 1);
}

void spiWrite(uint8_t reg, uint8_t *data, uint8_t length) {
  SPI.beginTransaction(SS_PIN, spiSettings);

  SPI.transfer(reg | 0x80, SPI_CONTINUE); // Indicate write operation
  delayMicroseconds(75); // Wait minimum 75 us in case writing to Motion or Motion_Burst registers
  SPI.transfer(data, length); // Write data

  SPI.endTransaction();
}

uint8_t spiRead(uint8_t reg) {
  uint8_t buf;
  spiRead(reg, &buf, 1);
  return buf;
}

void spiRead(uint8_t reg, uint8_t *data, uint8_t length) {
  SPI.beginTransaction(SS_PIN, spiSettings);
  SPI.transfer(reg, SPI_CONTINUE); // Send register address // , SPI_CONTINUE
  delayMicroseconds(75); // Wait minimum 75 us in case writing to Motion or Motion_Burst registers
  memset(data, 0, length); // Make sure data buffer is 0
  SPI.transfer(data, length); // Write data
  SPI.endTransaction();
}
Но как и заведено у китайцев и Arduino - модуль с A3080 не работает без доделок. На микросхему не установлен кварц и места на плате под него нет. Прошивка ROM A3080 при этом подразумевает работу с кварцем по описанию в её PDF... :) Припаял на выводы чипа и заработало...
 
Последнее редактирование:

remrum

Member
Апну тему.
Попалась на выходных статья ESP32 I2S Camera (OV7670).
Камера оказалась в наличии, спаял на макетке - работает.
Если использовать немного оптимизированный код и отключить вывод на дисплей, то в хроме где-то ~10 fps, 160x120.
Для такой цены комплектующих не плохо. Камера используется без FIFO (2-3$).
Цифры со счетчиков вполне читаемы. На семисегментный дисплей пришлось наклеить матовую пленку, иначе отсвечивало.
Если обеспечить хорошее освещение, то картинка выглядит гораздо лучше.
cam.jpg camera.jpg
 

pvvx

Активный участник сообщества
Апну тему.
Попалась на выходных статья ESP32 I2S Camera (OV7670).
Камера оказалась в наличии, спаял на макетке - работает.
Если использовать немного оптимизированный код и отключить вывод на дисплей, то в хроме где-то ~10 fps, 160x120.
Для такой цены комплектующих не плохо. Камера используется без FIFO (2-3$).
Цифры со счетчиков вполне читаемы. На семисегментный дисплей пришлось наклеить матовую пленку, иначе отсвечивало.
Если обеспечить хорошее освещение, то картинка выглядит гораздо лучше.
Посмотреть вложение 5276 Посмотреть вложение 5277
Т.е. дешевле готовой WiFi камеры с нормальным разрешением так и не удалось сделать? Или хотя-бы уложиться в одинаковую цену c готовыми WiFi-cam?
Как-то даже не спортивно :)
Из статьи:
Итого уже > $10
Для этого надо OV7670 прикрутить к ESP8266.
Если она прикручивается к ESP-32S, то без вопросов будет работать и с более дешевыми модулями RTL... Т.е. цена модуля + камера будет около $5
Если брать чуть дороже, то с RTL8195 работает любая дешевая USB2.0 камера с Jpeg сжатием на полную катушку в Amebа Arduino по RTSP.
В итоге ESP8266 выпадает из устройств для обслуживания практически любых камер без собственных FIFO, про что и сказано давно на первой странице темы.
 
Последнее редактирование:

gerkimuyda

New member

remrum

Member
Т.е. дешевле готовой WiFi камеры с нормальным разрешением так и не удалось сделать? Или хотя-бы уложиться в одинаковую цену c готовыми WiFi-cam?
Как-то даже не спортивно :)
Из статьи:
Итого уже > $10
Для этого надо OV7670 прикрутить к ESP8266.
Если она прикручивается к ESP-32S, то без вопросов будет работать и с более дешевыми модулями RTL... Т.е. цена модуля + камера будет около $5
Если брать чуть дороже, то с RTL8195 работает любая дешевая USB2.0 камера с Jpeg сжатием на полную катушку в Amebа Arduino по RTSP.
В итоге ESP8266 выпадает из устройств для обслуживания практически любых камер без собственных FIFO, про что и сказано давно на первой странице темы.
На самом деле можно уложиться в ~5$ без доставки.
Сравнивать с готовыми WiFi камерами не вижу смысла по многим причинам.
RTL это здорово, но не все могут с ними разобраться как Вы.
Я учитывал ваше мнение по поводу ущербности ESP32, но попробовав этот проект,
остался доволен результатом. Прикрутить распознавание 7-сегментных символов
можно прямо на ESP32, а большего мне и не надо.
В серьезном проекте я бы предпочел другое оборудование.
 

pvvx

Активный участник сообщества
На самом деле можно уложиться в ~5$ без доставки.
Сравнивать с готовыми WiFi камерами не вижу смысла по многим причинам.
RTL это здорово, но не все могут с ними разобраться как Вы.
Любое электронное устройство имеет короткий жизненный цикл. Далее оно устаревает. Если вы не успеваете за прогрессом, то при чем тут "не могу разобраться"?
Я учитывал ваше мнение по поводу ущербности ESP32, но попробовав этот проект,
остался доволен результатом. Прикрутить распознавание 7-сегментных символов
можно прямо на ESP32, а большего мне и не надо.
ESP-32S ущерблен по конкретным факторам - я их и описал. Развитие народных движений на нем я не поддерживаю - оставлено другим, т.к. мне интереснее исследовать более лучшие чипы WiFi-SoC. Возьмите и опишите свой опыт с данной камерой в форуме, в теме ESP-32S, а то ESP-32S совсем загибается в русскоговорящей среде...
В серьезном проекте я бы предпочел другое оборудование.
Тут разговор идет о простых детских поделках, для ознакомления, на которые никто не будет закладывать большие суммы и труднодоступные детали. Баланс по двум факторам - цена и доступность.
И как пример - вам проще подключить камеру к ESP-32S, повторяя чужие решения и покупку модулей Arduino. Мне это совсем не интересно. Интереснее изучить что-то и сделать с нуля самому. Если бы мне потребовалось наблюдающая камера за показаниями какого-то прибора, то взял бы готовую WiFi камеру и переписал бы её ПО. Тут бы ещё надо было подумать, что там будет лучше - возможно готовый смарт с камерой будет лучше для одиночной реализации, т.к. имеет на борту АКБ да и старый ничего уже не стоит, а есть в наличии, и может осуществлять непрерывный контроль, в независимости от внешних факторов...

Так-же ещё учтите, что тут форум не про Arduino и поделки на ней - у неё есть свой сайт, а на данном есть выделенный раздел для Arduino поклонников :)

На ESP8266, для получения изображения, пока можно модифицировать программы опроса датчика от мышки, т.к. старая мышка у пользователя тоже ничего не стоит и уже есть.
 
Последнее редактирование:

MihaNN52

New member
Опять недопонимание, уже проходили :)
Счетчики уже есть, часть из них уже недавно менялась. Ни у одного счетчика нет возможности получить абсолютное значение в определенный момент (только в некоторых можно импульсы считать, и иметь относительное изменение от прошлого значения). Каким образом периодически, но постоянно снимать абсолютные значения на счетчике?
В автономном режиме, без стороннего вмешательства.
У меня только одна идея - использовать какой-то фотосенсор и делать периодические снимки счетчиков, затем их распознавать и складывать (плюс фото с датой укладывать в отдельное поле, для визуального контроля).
Идея с мышинным сенсором - отличная, только двигать его вдоль значений как? ведь в разрешении 32х32 можно 1-2 символа в автоматическом режиме распознать, а их там от 5 до 8.
Ставь отдельно еще счетчики в которые ты можешь сам влезать без проблем или покупай уже с выходом. Ставь какую нито STM32:) + eeprom и считай данные и пиши их в память. Как это сделать вариантов масса, типо есть импульсы то считаем пока не закончатся и переводим в литры и пишем в память по кругу, будет потом доступ к каждому открытию крана + инкрементируем общий счетчик и также держи его в епроме. Если надо куда-то передавать то велком ESP + MQTT тот же NOD RED. Чтоб использовать ESP для точных подсчетов тех же импульсов на долгосрочной перспективе нужны стальные яйца. Кстати счетчики можно и не разбирать и подключится так ...снаружи. Обычно что то крутиться на них, можно попробовать снимать импульсы ИК инфракрасный препятствие избежании Сенсор модуль для салона автомобиля Робот 3 провода Светоотражающие фотоэлектрический Новый купить на AliExpress
 

Twistms

New member
Господа. Прочел весь тред, который называется ESP8266 и OV7670, но обсуждают только то, что его невозможно подключить и какие-то счетчики.

У меня вот подлодка, например. Я не хочу закупаться другими компонентами просто потому что идти будут долго, и для управления подлодкой мне будет достаточно 1 кадра в несколько секунд и в чб, в итоге это реально будет реализовать или нет? Может ли кто-то помочь с этим? FIFO на борту нету, конечно же.
Esp версии 201, ног, вроде, достаточно.
 

Radio

New member
Ради подлодки я аж зарегился. Пытался подружить эту камеру с Atmega328P. Но вот проблема, в атмеге совсем негде хранить полученое изображение до его отправки куда надо. Нужно прикручивать SD карту и этим самым занять вообще все пины. И тут подумал, что в esp8266 у меня якобы есть встроеная флеш память. Якобы аж 32Мб. Хотя я ранее экспериментировал и не понял, как оно работает. Тем не менее. Тут уже этот алгоритм описали:
- считывать строки с камеры;
- записывать их в один файл на флешку;
- позже, можно даже попытаться его перевести в нормальный формат, например какой-нибудь gif.
- передать куда нибудь неспеша (например по GPRS или на другой контроллер) и удалить.

И вот примера esp8266 + ov7670 + SD найти не могу.
 

Twistms

New member
И вот примера esp8266 + ov7670 + SD найти не могу.
Вот именно!
Есть модуль для SD, есть даже несколько esp разных.
Насчет GPRS тоже планирую, но подлодка с сетью мобильной у меня будет уже на малинке обустроена, сейчас для тестов хочу запускать её через Wifi, кидаем картинку на сервер раз в секунду и обновляем автоматом на страницу, например.
Но я не программист просто совсем и хотел бы какое-то более менее готовое решение.
Насчет ардуино -
парень на UNO сделал почти риалтайм вывод на дисплей.

Так же из его проекта видим, что весь код для передачи видео по UART есть и работает даже из под ардуины, но вот как считать поток по UART и вывести на смартфон - вот это огромная проблема.
 
Сверху Снизу