• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

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

Tester25

New member
всем привет. прощу помощи в подключении линейного считывателя изображения к esp32. проблема с распиновкой видимо.



моё подключение пинов
питание беру отдельно и даю 5 вольт
GROUND втыкаю в GND на плате
далее

SH (shift gate) - > GPIO 23
ICG (integration clear gate) -> GPIO 22
Φ1 (clock phase 1) -> GPIO 21
Φ2 (clock phase2) -> GPIO 19
OS (output signal) -> GPIO 18
пины брал с офф сайта https://www.alldatasheet.com/datasheet-pdf/view/32192/TOSHIB...

код такой
Код:
#define SH 23 // GPIO 23
#define ICG 22 // GPIO 22
#define PHI_M 21 // GPIO 21
#define PHI_M2 19 // GPIO 19
#define OS 18 // GPIO 18

void setup() {
  Serial.begin(115200);
 
  // Настройка выводов
  pinMode(SH, OUTPUT);
  pinMode(ICG, OUTPUT);
  pinMode(PHI_M, OUTPUT);
  pinMode(OS, INPUT); // OS - это входной сигнал

  // Инициализация
  digitalWrite(ICG, LOW);
  digitalWrite(SH, LOW);
}

void loop() {
  digitalWrite(ICG, HIGH);
  delay(10);
  digitalWrite(ICG, LOW);

  // Считывание данных
  for (int i = 0; i < 64; i++) {
    digitalWrite(SH, HIGH);
    delayMicroseconds(10); 
    digitalWrite(SH, LOW);

    // Чтение выходного сигнала
    int pixelValue = digitalRead(OS);
    Serial.println(pixelValue);
  }

  // Генерация тактового сигнала
  for (int j = 0; j < 64; j++) {
    digitalWrite(PHI_M, HIGH);
    delayMicroseconds(10);
    digitalWrite(PHI_M, LOW);
    
    digitalWrite(PHI_M2, HIGH);
    delayMicroseconds(10);
    digitalWrite(PHI_M2, LOW);
  }

  delay(1000);
}


в результате я получаю 1 при включенном модуле tcd и 0 при выключенном. чтобы я не делал и не ставил перед модулем tcd - значения не меняются.


может кто в теме. возможно проблема с интервалами. копа еще и перебираю. но если кто в теме подсобите пожалуйста :)

заранее спасибо.
 

nikolz

Well-known member
делал лишь на 1304,
для 1205 судя по документации надо ставить преобразователи уровней для всех сигналов с 3.3 на 5 вольт.
1745234477797.png
 

Tester25

New member
делал лишь на 1304,
для 1205 судя по документации надо ставить преобразователи уровней для всех сигналов с 3.3 на 5 вольт.
Посмотреть вложение 14416
спасибо за объяснение. а по коду все ли нормально? то есть получается, что проблема только физическая в подключении?
 

nikolz

Well-known member
Код не смотрел, но по опыту работы с 1304 код должен быть сложнее.
Вы посмотрите сигналы логическим анализатором.
 

pvvx

Активный участник сообщества
DeepSeek - Пример подключения TCD1205D к ESP32



Подключение линейного ПЗС-датчика TCD1205D к ESP32 требует внимания к синхронизации и обработке аналогового сигнала. Ниже приведен пример схемы и кода для считывания данных с датчика.
Схема подключения TCD1205D к ESP32
TCD1205DESP32Описание
VDD3.3VПитание логики (3.3 В)
GNDGNDЗемля
SHGPIO16Строб (запуск интеграции)
CLKGPIO17Тактовый сигнал (до 2 МГц)
RSGPIO18Сброс
OSGPIO36Аналоговый выход (ADC1_CH0)
Примечания:
  • Для CLK лучше использовать аппаратный ШИМ (например, через ledc).
  • OS подключается к аналоговому входу ESP32 (например, ADC1_CH0 на GPIO36).
  • Если нужно высокое напряжение для VDD (например, 5 В), используйте уровень-преобразователь.
Пример кода для ESP32 (Arduino IDE)
Код:
#define PIN_SH 16   // Строб (SH)
#define PIN_CLK 17 // Тактовый сигнал (CLK)
#define PIN_RS 18 // Сброс (RS)
#define PIN_OS 36 // Аналоговый выход (OS)

const int pixels = 3694; // Количество пикселей TCD1205D
uint16_t pixelData[pixels]; // Массив для хранения данных

void setup() {
Serial.begin(115200);
pinMode(PIN_SH, OUTPUT);
pinMode(PIN_CLK, OUTPUT);
pinMode(PIN_RS, OUTPUT);
pinMode(PIN_OS, INPUT);

// Начальное состояние
digitalWrite(PIN_SH, LOW);
digitalWrite(PIN_CLK, LOW);
digitalWrite(PIN_RS, LOW);
}

void loop() {
readTCD1205D();
delay(1000); // Задержка между сканированиями
}

void readTCD1205D() {
// Сброс датчика
digitalWrite(PIN_RS, HIGH);
delayMicroseconds(1);
digitalWrite(PIN_RS, LOW);

// Запуск интегрирования
digitalWrite(PIN_SH, HIGH);
delayMicroseconds(1);
digitalWrite(PIN_SH, LOW);

// Считывание данных
for (int i = 0; i < pixels; i++) {
digitalWrite(PIN_CLK, HIGH);
delayMicroseconds(1);
pixelData[i] = analogRead(PIN_OS); // Чтение аналогового значения
digitalWrite(PIN_CLK, LOW);
delayMicroseconds(1);
}

// Вывод данных в Serial (для отладки)
for (int i = 0; i < pixels; i++) {
Serial.print(pixelData[i]);
Serial.print(" ");
}
Serial.println();
}
Важные замечания
  1. Тактовая частота (CLK):
    TCD1205D поддерживает частоту до 2 МГц, но ESP32 может не успевать обрабатывать данные на такой скорости. В примере используется задержка delayMicroseconds(1), но для оптимизации можно использовать DMA или Fast GPIO.
  2. Аналоговое чтение (ADC):
    ESP32 имеет 12-битный АЦП, но реальная точность может быть ниже. Для улучшения качества сигнала используйте фильтрацию (RC-цепочку на входе).
  3. Питание:
    TCD1205D требует 5 В для аналоговой части (если используется отдельный VDD), но логика (SH, CLK, RS) может работать от 3.3 В.
  4. Оптимизация скорости:
    Для ускорения можно использовать:
    cpp

    Copy

    Download
    ledcSetup(0, 1000000, 1); // ШИМ 1 МГц для CLK
    ledcAttachPin(PIN_CLK, 0);
Если нужна более высокая производительность, рассмотрите использование FPGA или STM32 с аппаратным SPI.
 

nikolz

Well-known member
DeepSeek
Пример подключения TCD1205D к ESP32
-------------------------
Подключение TCD1205D к ESP32
TCD1205D - это линейный ПЗС-датчик изображения, который требует правильного подключения и управления. Вот пример схемы подключения к ESP32:

Необходимые соединения


TCD1205D ESP32
-------------------------
VDD 3.3V
GND GND
SH GPIO12 (или любой другой цифровой вывод)
CP GPIO14
RS GPIO13
φ1 GPIO26 (PWM вывод)
φ2 GPIO25 (PWM вывод)
OS GPIO35 (Аналоговый вход)

Пример кода для ESP32 (Arduino IDE)
// Определение выводов
#define SH_PIN 12 // Загрузка сдвигового регистра
#define CP_PIN 14 // Тактовый импульс сдвигового регистра
#define RS_PIN 13 // Сброс
#define PHI1_PIN 26 // Фаза 1 (PWM)
#define PHI2_PIN 25 // Фаза 2 (PWM)
#define OS_PIN 35 // Аналоговый выход датчика

// Параметры датчика
#define PIXELS 3694 // Количество пикселей в строке

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

// Настройка выводов
pinMode(SH_PIN, OUTPUT);
pinMode(CP_PIN, OUTPUT);
pinMode(RS_PIN, OUTPUT);
pinMode(PHI1_PIN, OUTPUT);
pinMode(PHI2_PIN, OUTPUT);

// Инициализация PWM для фаз
ledcSetup(0, 1000000, 8); // 1 MHz, 8-bit resolution
ledcSetup(1, 1000000, 8);
ledcAttachPin(PHI1_PIN, 0);
ledcAttachPin(PHI2_PIN, 1);

// Начальное состояние
digitalWrite(SH_PIN, LOW);
digitalWrite(CP_PIN, LOW);
digitalWrite(RS_PIN, LOW);
}

void loop() {
// Сброс датчика
digitalWrite(RS_PIN, HIGH);
delayMicroseconds(1);
digitalWrite(RS_PIN, LOW);

// Запуск тактовых импульсов
ledcWrite(0, 128); // 50% заполнение для φ1
ledcWrite(1, 0); // φ2 сначала низкий

// Генерация SH импульса
digitalWrite(SH_PIN, HIGH);
delayMicroseconds(1);
digitalWrite(SH_PIN, LOW);

// Чтение данных с датчика
for (int i = 0; i < PIXELS; i++) {
// Тактовый импульс для сдвига данных
digitalWrite(CP_PIN, HIGH);
delayMicroseconds(1);

// Чтение аналогового значения
int value = analogRead(OS_PIN);
Serial.println(value);

digitalWrite(CP_PIN, LOW);
delayMicroseconds(1);
}

// Пауза между сканированиями
delay(100);
}
Важные замечания
  1. TCD1205D требует тактовых сигналов φ1 и φ2 с частотой около 1 МГц и противофазе.
  2. Напряжение питания должно быть 3.3В для совместимости с ESP32.
  3. Для получения стабильных результатов может потребоваться дополнительная аналоговая обработка сигнала OS.
  4. Время интеграции можно контролировать, изменяя паузу между сканированиями.
Для более точной настройки параметров обратитесь к техническому описанию TCD1205D.
 

Tester25

New member
ребята...большое спасибо. на выходных буду тестировать и отчитаюсь :)
 

Tester25

New member
что-то пошло не так)) значения изменились. вместо 1 теперь выдает от 1968 до 1973.
я взял за основу мнение ИИ от nikolz, так как там был таиминг. однако по докам все же там не 3К+ пикселей, а 2048. что и изменил в коде.
что касается контакта CP GPIO14 ...я его не нашел в доках. поэтому воткнул вместо ICG.
причем отключаю я этот пин или нет. разницы нет никакой.
 

nikolz

Well-known member
Пытался написать PDU кодер/декодер с помощью DeepSeek. Пишет , проверяет, и говорит что ошибок нет. Проверяю получаю ошибки. Но программы написаны красиво с комментарием. С каждым разом все больше и больше. но работающий вариант так и не получился. Причем каждый раз Deepseek улучшает и расширяет.
 

Tester25

New member
Пытался написать PDU кодер/декодер с помощью DeepSeek. Пишет , проверяет, и говорит что ошибок нет. Проверяю получаю ошибки. Но программы написаны красиво с комментарием. С каждым разом все больше и больше. но работающий вариант так и не получился. Причем каждый раз Deepseek улучшает и расширяет.
с этими ИИ плюс минус так и есть. он ведь берет инфо из того что уже сделано. я например под 1200 не смог найти нормальный код )). короче я заказал 1300.жду его и буду на нем собирать :)
 

nikolz

Well-known member
с этими ИИ плюс минус так и есть. он ведь берет инфо из того что уже сделано. я например под 1200 не смог найти нормальный код )). короче я заказал 1300.жду его и буду на нем собирать :)
Надо взять логический анализатор и отлаживать с ним иначе не получится.
 

Вложения

Tester25

New member
я пробовал так))) видимо я все же новичок.и не понимаю до конца логики.
 

Tester25

New member
надо программировать все сигналы как в документации
я получил tcd1304 ap
сделал соединение по совету ИИ.
тут вроде все логично.
Код:
    Master Clock (MCLK): Генерация тактового сигнала.

    Shift Gate (SG): Управляет сдвигом данных.

    Integration Clear Gate (ICG): Очищает интеграцию.

    Output (OUT): Вывод данных.

    GND: Земля.

    VDD: Питание (обычно 3.3V).


Схема подключения

Вот пример подключения TCD1304AP к ESP32:

TCD1304AP    ESP32
--------------------
VDD          -> 3.3V
GND          -> GND
MCLK         -> GPIO 18 (или любой другой доступный пин)
SG           -> GPIO 19 (или любой другой доступный пин)
ICG          -> GPIO 21 (или любой другой доступный пин)
OUT          -> GPIO 22 (или любой другой доступный пин)
а вот код, который ИИ посоветовал странный.

Код:
#define MCLK_PIN 18  // Master Clock
#define SG_PIN 19    // Shift Gate
#define ICG_PIN 21   // Integration Clear Gate
#define OUT_PIN 22   // Output

void setup() {
    Serial.begin(115200);
    
    // Настройка выводов
    pinMode(MCLK_PIN, OUTPUT);
    pinMode(SG_PIN, OUTPUT);
    pinMode(ICG_PIN, OUTPUT);
    pinMode(OUT_PIN, INPUT);

    // Инициализация
    digitalWrite(ICG_PIN, LOW); // Установите ICG в LOW для начала интеграции
    delay(10); // Задержка для стабилизации
}

void loop() {
    // Очищаем интеграцию
    digitalWrite(ICG_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(ICG_PIN, LOW);
    delay(10); // Задержка для завершения очистки

    // Генерация тактового сигнала и считывание данных
    for (int i = 0; i < 128; i++) { // Предполагаем, что у вас 128 пикселей
        digitalWrite(SG_PIN, HIGH); // Активируем сдвиг
        delayMicroseconds(1);
        digitalWrite(SG_PIN, LOW); // Деактивируем сдвиг
        delayMicroseconds(1);
        
        // Чтение данных из вывода OUT
        int pixelValue = digitalRead(OUT_PIN);
        Serial.print(pixelValue);
        Serial.print(" ");
    }
    Serial.println();

    // Генерация тактового сигнала
    for (int j = 0; j < 128; j++) {
        digitalWrite(MCLK_PIN, HIGH);
        delayMicroseconds(1);
        digitalWrite(MCLK_PIN, LOW);
        delayMicroseconds(1);
    }

    delay(1000); // Задержка между считываниями
}
насколько я понимаю там должно быть все же аналоговое чтение запись. но это мелочи. а как таиминги выставить? вот имея документацию

я не понимаю куда именно смотреть и что есть что. можете подсказать?
 

Tester25

New member
я нашел более подробный образ

однако ввиду разных процов ардуино и есп код проблемный выходит :)
потому и прощу помочь с кодом. потому что тут явно проблема в таимингах
 

pvvx

Активный участник сообщества
Беда с Serial.print(pixelValue); Serial.print(" ");

Он выполняется столько по времени, сколько будет происходить вывод в ACII виде в UART.
Там у вас выводится вроде 9..10 символов - это на 115200 будет от 9*10/115200 = 0.00078125 секунды = 781.25 микросекунды
Вот и весь ваш тайминг - клок будет бить в зависимости от числа выводящегося в UART и составит около 1 мс, и того частота выйдет болтающаяся около 1кГц.
Создавайте массив, потом выводите в UART.
 

Tester25

New member
Беда с Serial.print(pixelValue); Serial.print(" ");

Он выполняется столько по времени, сколько будет происходить вывод в ACII виде в UART.
Там у вас выводится вроде 9..10 символов - это на 115200 будет от 9*10/115200 = 0.00078125 секунды = 781.25 микросекунды
Вот и весь ваш тайминг - клок будет бить в зависимости от числа выводящегося в UART и составит около 1 мс, и того частота выйдет болтающаяся около 1кГц.
Создавайте массив, потом выводите в UART.
спасибо за наводку. буду копать в эту сторону
 

Tester25

New member
Что там копать?
В примере из https://davidallmon.com/pages/ccd-transmission-spectrograph так и сделано - набирается массив, а потом, в паузе между снятием кадров передается.
я так и сделал. результат конечно есть. но тут явно нужна настройка. так как значения слишком разнятся.
 
Сверху Снизу