• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Подключение TCD1205D к ESP32

pvvx

Активный участник сообщества
я так и сделал. результат конечно есть. но тут явно нужна настройка. так как значения слишком разнятся.
На Arduino скоростной работы на ESP не получить. Там всё тормозное с кучами проверок на ошибки пользователя и тем более C++ с запретами всех прерываний на время запроса (поиска и выделения в HEAP) памяти для string и прочих плюснутых инструкций...
GPIO в Arduino работают особенно тормознуто. Путем digitalWrite(ICG_PIN, HIGH); digitalWrite(ICG_PIN, LOW); получите уже частоту менее требуемой... и с диким джиттером.
Arduino рассчитано на мигание раз в несколько секунд светодиодом.... А скоростные операции в ESP32 возможны только с использованием аппаратных фич. И то инициализация их обычно долгая...
 

Tester25

New member
На Arduino скоростной работы на ESP не получить. Там всё тормозное с кучами проверок на ошибки пользователя и тем более C++ с запретами всех прерываний на время запроса (поиска и выделения в HEAP) памяти для string и прочих плюснутых инструкций...
GPIO в Arduino работают особенно тормознуто. Путем digitalWrite(ICG_PIN, HIGH); digitalWrite(ICG_PIN, LOW); получите уже частоту менее требуемой... и с диким джиттером.
Arduino рассчитано на мигание раз в несколько секунд светодиодом.... А скоростные операции в ESP32 возможны только с использованием аппаратных фич. И то инициализация их обычно долгая...
как бы там не было я переписал код под esp32. вот такой код..

Код:
#include <Arduino.h>

#define LAMP 23   // Укажите ваши пины
#define SH 22
#define ICG 21
#define MCLK 19

#define MIN_SIGNAL 10

uint16_t buffer[800];
uint16_t avg = 0;
char cmdBuffer[16];
int cmdIndex;
int exposureTime = 20;

void setup() {
    // Инициализация пинов
    pinMode(LAMP, OUTPUT);
    pinMode(SH, OUTPUT);
    pinMode(ICG, OUTPUT);
    pinMode(MCLK, OUTPUT);
    
    digitalWrite(ICG, HIGH); // Установить ICG в высокий уровень

    // Включение последовательного порта
    Serial.begin(115200);
}

void readCCD(void) {
    int x;
    uint16_t result;

    digitalWrite(ICG, LOW);
    delayMicroseconds(12);
    digitalWrite(SH, HIGH);
    delayMicroseconds(5);
    digitalWrite(SH, LOW);
    delayMicroseconds(15);
    digitalWrite(ICG, HIGH);
    delayMicroseconds(1);

    for (x = 0; x < 800; x++) {
        digitalWrite(SH, HIGH);

        if (x == 0) {
            result = (uint16_t)(1023 - analogRead(34)); // Используйте ваш пин для аналогового ввода
            avg = (result > MIN_SIGNAL) ? (result - MIN_SIGNAL) : result;
        } else {
            result = (uint16_t)(1023 - analogRead(34)); // Используйте ваш пин для аналогового ввода
        }
        digitalWrite(SH, LOW);
        buffer[x] = (result < avg) ? 0 : (result - avg);
        delayMicroseconds(20);
    }
}

void sendData(void) {
    for (int x = 0; x < 800; ++x) {
        Serial.println(buffer[x]);
    }
}

void loop() {
    while (Serial.available()) {
        cmdBuffer[cmdIndex++] = Serial.read();
    }
    
    if (cmdBuffer[0] == 'r') {
        sendData();
    } else if (cmdBuffer[0] == 'l') {
        digitalWrite(LAMP, LOW);
    } else if (cmdBuffer[0] == 'L') {
        digitalWrite(LAMP, HIGH);
    } else if (cmdBuffer[0] == 'e') {
        exposureTime = atoi((char *)&cmdBuffer[1]);
        if (exposureTime > 1000) exposureTime = 1000;
        else if (exposureTime < 0) exposureTime = 0;
        Serial.println(exposureTime);
    }

    memset(cmdBuffer, 0, sizeof(cmdBuffer));
    cmdIndex = 0;
    readCCD();
    delay(exposureTime);
}
на питоне написал обработчик. но результат пока странный. экспериментирую :)
 

pvvx

Активный участник сообщества
Если хотите получить качественные данные с этого датчика, тогда:

  • Я бы не стал ставить на одно питание датчик и ESP32. ESP32 жрет немерено и шумит в питание. Т.е. потребуется источник более 5V от которого через собственные LDO будут запитаны датчик и ESP.
  • Использовать ужасный кривой ADC в ESP32 для таких измерений нет смысла.
  • Обработку требуется писать минимум на ESP-IDF, без всяких включений C++, тем более WiFi. Если не освоите ESP-IDF, тогда ждите, когда вам кто напишет оптимизированную библиотеку для работы с этими датчиками.
Такие датчики продают с доп. модулем с STM32 подобными чипами, а не с дешевыми ESP. Всем лень заморачиваться в оптимизации этого дела для ESP. Так как всё равно качественных данных от его ADC не получить.
 

Tester25

New member
Если хотите получить качественные данные с этого датчика, тогда:

  • Я бы не стал ставить на одно питание датчик и ESP32. ESP32 жрет немерено и шумит в питание. Т.е. потребуется источник более 5V от которого через собственные LDO будут запитаны датчик и ESP.
  • Использовать ужасный кривой ADC в ESP32 для таких измерений нет смысла.
  • Обработку требуется писать минимум на ESP-IDF, без всяких включений C++, тем более WiFi. Если не освоите ESP-IDF, тогда ждите, когда вам кто напишет оптимизированную библиотеку для работы с этими датчиками.
Такие датчики продают с доп. модулем с STM32 подобными чипами, а не с дешевыми ESP. Всем лень заморачиваться в оптимизации этого дела для ESP. Так как всё равно качественных данных от его ADC не получить.
ну чтож..теперь буду в эту сторону копать значит)
спасибо
 

nikolz

Well-known member
я нашел более подробный образ

однако ввиду разных процов ардуино и есп код проблемный выходит :)
потому и прощу помочь с кодом. потому что тут явно проблема в таимингах
У меня программа написана на СИ и вставками asm. для ESP8266
Последний раз делал ее для измерения нити 3D принтера.
Не в обиду, но я не выкладываю исходники в интернет,
так как не делаю документацию и пишу для своих поделок.
-----------------------
Основное, что надо понять, что есть два основных цикла.
Установка выдержки - т е времени засветки и считывание значений из регистра.
Использовал АЦП ESP8266, поэтому никаких дополнительных элементов для подключения нет.
Скорость АЦП примерно 500 000 выборок в секунду.
Делал уже давно.
 

Tester25

New member
У меня программа написана на СИ и вставками asm. для ESP8266
Последний раз делал ее для измерения нити 3D принтера.
Не в обиду, но я не выкладываю исходники в интернет,
так как не делаю документацию и пишу для своих поделок.
-----------------------
Основное, что надо понять, что есть два основных цикла.
Установка выдержки - т е времени засветки и считывание значений из регистра.
Использовал АЦП ESP8266, поэтому никаких дополнительных элементов для подключения нет.
Скорость АЦП примерно 500 000 выборок в секунду.
Делал уже давно.
спасибо за информацию
 

nikolz

Well-known member
спасибо за информацию
и еще...
АЦП надо запускать на каждый 4-ый тактовый импульс
У меня на ESP8266 частота тактов 2 МГц, АЦП работает с частотой 500 К отчетов в секунду.
У ESP32 АЦП вроде бы 2 МГц может дать, тогда частоту тактов можно делать максимальной
 
Сверху Снизу