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

Для этого подойдёт давно известный сканер с бегущим лучом, только сегодня вместо ЭЛТ в нём будет удобнее применить светодиодную матрицу. Она даже лучше: у трубки небольшое послесвечение есть, у светодиодов — нет. Датчиком послужит фототранзистор 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 со встроенным устройством управления подключаем так:



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



Всегда подаём питание сначала на матрицу, потом на 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, чтобы прочитать результаты фототранзистором и просуммировать двумя аккумуляторами, как описано выше. Наконец, определив, перекрыт ли светодиод, записываем результат в предусмотренный в библиотеке фреймбуфер.

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

Видеоролик:

Комментарии (8)


  1. VT100
    02.06.2019 18:52
    +2

    В стародавние времена на одном форуме был пост про светодиодные табло. Для втоматической регулировки яркости в зависимости от внешней засветки — использовался один из СИД'ов самой матрицы. Так-что, при достаточной яркости внешнего освещения и достаточном усложнении схемы и программы, — можно отказаться от фотодиода и работать с полным полем матрицы (без оглядки на ДН фотодиода).


  1. AnthonyDS
    03.06.2019 09:31

    Принцип работы как в пистолете от Dendy?


    1. Iv38
      03.06.2019 10:21

      Похоже, но ближе таки к световому перу, особенно в эпизоде с рисованием в видеоролике. В случае с пистолетом не производится сканирование всех точек, а лишь регистрируется факт наведения на одну конкретную.


      1. AnthonyDS
        03.06.2019 11:11

        Там на конкретную, тут на каждую поочерёдно… :-)


      1. AnthonyDS
        03.06.2019 11:13

        Сейчас пересмотрел видео, и видно как перед тем как отреднерить новую картинку, по экрану пробегает снизу вверх полоска.


  1. alklimenko
    03.06.2019 14:40
    +1

    Берёте стеклянную полку, кладёте на неё белый лист бумаги, устанавливаете на неё предмет и направляете свет с направления, дающего наиболее интересную тень на листе бумаги. Фотографируете полученную тень снизу через стекло на цифровой фотоаппарат и получаете цифровую фотограмму. Профит :)


  1. third112
    03.06.2019 15:31
    +1

    Интересно, что возрождаются казалось бы навсегда забытые технологии — я в школьные годы фотограммы делал. Тогда не было цифровых фото. Видимо верно написано в статье:

    Фотограмма — очень интересное искусство

    Именно искусство, а не технология, как я сказал. А искусство — вечно.
    М.б. нужно посмотреть: что еще поторопились забыть, и возродить на новом уровне технических возможностей.


  1. madf
    03.06.2019 16:18
    +1

    Давно забытое старое, но блин, реально можно приспособить для других целей (даже сейчас).
    Супер!