[Перевод] Фотограмма без фотобумаги

gn66txouuabz7ovdztolvjzi6ac.jpeg

Фотограмма — очень интересное искусство, в своё время его даже пропагандировали в телепередачах. Вы помещаете предметы на фотобумагу, экспонируете с направления, при котором получается наиболее интересный силуэт, проявляете, фиксируете — и готово произведение. Но теперь фотобумагу на каждом шагу не купить. А что если и фотограмму вслед за фотографией сделать цифровой?

Для этого подойдёт давно известный сканер с бегущим лучом, только сегодня вместо ЭЛТ в нём будет удобнее применить светодиодную матрицу. Она даже лучше: у трубки небольшое послесвечение есть, у светодиодов — нет. Датчиком послужит фототранзистор TIL78, внешне неотличимый от светодиода (вывод базы наружу не выведен, но он и не нужен). Этот фототранзистор снят с производства, он может быть заменён многими аналогичными.

Фототранзистор необходимо подключить эмиттером к общему проводу, коллектором к входу A5 Arduino UNO, затем залить и запустить небольшой отладочный скетч:

#define SENSOR A5
void setup() {
  Serial.begin(9600);
  pinMode(SENSOR, INPUT_PULLUP);
}
void loop() {
  // Read analog value continuously and print it
  Serial.println(analogRead(SENSOR));
}


Программа, в частности, активирует встроенный в Arduino подтягивающий резистор, поэтому внешний не понадобится. В меню Arduino IDE выбираем Tools — Serial Plotter, и наблюдаем график освещённости. Поскольку цоколёвка фототранзистора на нём не обозначена, полярность его подключения определяем экспериментально.

Светодиодную матрицу 32×32 со встроенным устройством управления подключаем так:

1sqvybfcpaxxnbv_xv6nrplsuw8.jpeg

Питаться от Arduino матрица не может, ей нужен внешний источник на 5 В, 4 А. Подключаем его так:

gsy0nblk7oiclpnpi3ehxgipqps.jpeg

Всегда подаём питание сначала на матрицу, потом на Arduino, снимаем питание в обратном порядке. «Прокачиваем» Arduino IDE необходимыми библиотеками и проверяем матрицу как описано здесь. Когда всё заработает, заливаем скетч для получения фотограмм.

В нём можно попробовать варьировать параметры:

static constexpr uint8_t  READINGS_PER_PIXELS = 1;
static constexpr uint8_t  THRESHOLD           = 15;
static constexpr bool     INVERT              = false;
static constexpr bool     CLEAR               = true;


Первыми двумя параметрами можно регулировать чувствительность, третьим — переключаться между позитивом и негативом, четвёртым — включить наложение каждого последующего снимка на предыдущий. Смотрим большой анимированный GIF.

Наилучшим способом определения попадания на фототранзистор света именно от матрицы оказался такой: сравнивать результаты при отключённом и включённом светодиоде. Если светодиод над точкой объекта, считываемой в данный момент, перекрыт, они будут одинаковыми, если не перекрыт — разными. Светодиод включается и выключается несколько раз переключением линии OE (output enable), результаты считывания суммируются в двух аккумуляторах: в одном — при выключенном светодиоде, в другом — при включённом. Результат вычитания этих сумм сравнивается с пороговым значением.

Матрица содержит шесть сдвиговых регистров, соответствующих целым строкам красных, зелёных и синих светодиодов в верхней и нижней половинах. Линия LAT (latch) управляет буфером, переносящим значения из сдвиговых регистров в драйверы светодиодов. Четыре адресные линии A, B, C, D позволяют выбрать активную строку в верхней и нижней половинах, а линия OE даёт возможность отключать и включать драйверы.

Обычно предыдущие данные хранятся в буфере и поступают на драйверы светодиодов, а новые в это время записываются в сдвиговые регистры. После полной записи строки они переносятся в буфер, и процесс повторяется для следующей строки. Даже если надо поменять состояние всего одного пикселя, перезаписать придётся всю строку.

Здесь же матрица используется не по назначению — для сканирования, поэтому сдвиговыми регистрами автор в этом режиме воспользовался, а буфером — нет. На линию LAT подаём единицу, и содержимое сдвигового регистра переносится в буфер сразу же при каждом импульсе на линии CLK. И после каждой перезаписи несколько раз мигаем светодиодом через OE, чтобы прочитать результаты фототранзистором и просуммировать двумя аккумуляторами, как описано выше. Наконец, определив, перекрыт ли светодиод, записываем результат в предусмотренный в библиотеке фреймбуфер.

Когда будет отсканированна вся фотограмма, окажется достаточным снова включить прерывания — и картинка из фреймбуфера стандартным способом запишется в матрицу и отобразится, после чего останется там до начала следующего сканирования.

Видеоролик:

© Habrahabr.ru