• Система автоматизации с открытым исходным кодом на базе 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 МГц может дать, тогда частоту тактов можно делать максимальной
 
Сверху Снизу