Механический дисплей из лего и Arduino

Если верить учебникам, то первые «телевизоры» были с механической развёрткой на диске Нипкова. Понятное дело, определение телевизора у каждого своё и для бытового применения механика малопригодна, однако решил и я попробовать сделать механический дисплей. К счастью в семье обнаружился восьмилетний специалист по моторчикам, он и смастерил «хардверную» часть установки. Lego Power Functions Medium Motor, питаясь от девяти вольт, способен при помощи кривошипно-шатунного механизма раскачивать планку на 15 отверстий с частотой в несколько Герц.

Механическая развёртка

Следующим шагом была установка светодиодов. К счастью, диаметр отверстий Lego ровно 5мм, так что диоды идеально входят с большим усилием и не расшатываются в время работы. Катоды соединил вместе, а аноды вывел по отдельности наружу мягким проводом на 0.05. Получилось девять проводников, но силы мотора хватает с избытком.

Светодиоды

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

Фотоэлемент

Фоторезистор закрепил просто зажав его между двумя кубиками лего.

Фотоэлемент

Теперь осталось подсоединить конструкцию к Arduino. Светодиоды подключил к цифровым выходам через ограничительные резисторы на 150 Ом, фоторезистор — к входу АЦП.

Принципиальная схема

В результате, мой «телевизор» стал выглядеть вот так:

Механический дисплей

Заливаем простенькую программу, которая ждёт затемнения фоторезистора, а потом выстреливает с заданным интервалом на цифровые выходы (2..9) нужные данные. Горизонтальный размер одного пикселя определяется подбираемой вручную задержкой, для моей установки оптимальное значение составило 2,3 миллисекунды.

/*  
  Shows a picture on mechanical desply connected to Arduino 
  Display's LED connected to digital pins 2..9 via 150 Ohm resisitors
  Photoresistor connected to analog pin 0 and GND. It is also connected to 5V using 10 kOhm resistor.
*/  

void setup()
{
  for (int i = 2; i <= 9; i++)
  {
    pinMode(i, OUTPUT);
  }
}

// Bit map of the picture (right to left) that we are going to show
unsigned char Pivo[] = {
  B01111100,
  B10000010,
  B10000010,
  B10000010,
  B10000010,
  B01111100,
  B00000000,
  B00000000,  
  B01101100,
  B10010010, 
  B10010010,
  B11111110,
  B00000000,  
  B00000000,
  B11111110,
  B01000000,
  B00111000,
  B00000100,
  B11111110,
  B00000000,
  B00000000,
  B11111110,
  B10000000,
  B10000000,
  B10000000,
  B11111110 };


void loop()
{
  // Wait for the synchronization (photoresistor covered by the motor bar)
  waitForBegin();
  
  // Do not start from the imidiatelly as the LED beam is moving too slow in the first milliseconds
  delay(20);

  int del = 2300;  // pixel "length" in microseconds
  for(int i = 0; i < 26; i++)
  {
    showByte(Pivo[i], del);
  }
}

void waitForBegin()
{
  while (analogRead(0) > 650) 
  {
    delayMicroseconds(200);
  }
}  

void showByte(int info, long del)
{
  // Light LEDs if necessary
  for (int i = 2; i <= 9; i++)
  {
    digitalWrite(i, (info & 0x01) ? HIGH : LOW);          
    info >>= 1;
  }
  
  // Wait a little
  if (del < 30000)
  {
    delayMicroseconds(del);
  }
  else
  {  
    delay (del/1000);
  }
  
  // Turn LEDs off
  for (int i = 2; i <= 9; i++)
  {
    digitalWrite(i, LOW);          
  }
}
 

Теперь, затаив дыхание, включаем, и вот оно, чудесное мгновенье!

Устройство в работе

Разрешение порядка 30 пикселей по горизонатали на 8 по вертикали, при меньших задержках пиксели получаются слишком сжатыми. Частота кадров — около пяти в секунду.

Что дальше?

  • Можно подключить светодиоды не непосредственно к цифровым выходам, а через восьмибитный расширитель шины PCF 8574, который смонтировать непосредственно на качающейся планке. Тогда хватит четырёх проводов вместо восьми (питание и два для I2C).
  • Можно попробовать вставить RGB светодиоды вместо монохромных и сделать цветной «телевизор».
  • В Arduino UNO USB-разъём подключён к конвертеру Atmel ATmega8U2. По-умолчанию он видится компьютером как последовательный порт, но его можно перепрограммировать чтоб он представлялся мышью или, например, джойстиком. Интересно, можно ли сделать чтоб он распознался как внешний монитор?

Ссылки

Идея использовать лего позаимстована из книги Михаэля Гаспери "Extreme NXT". К счастью, покупать Mindstorms NXT за три сотни евро не нужно, и можно обойтись на порядок более дешёвым Arduino.
Поделиться публикацией
Ой, у вас баннер убежал!

Ну. И что?
Реклама
Комментарии 35
    0
    Rulezzzzzzz!!! Олдскул рулит :)
      +1
      олдскул — это на логике.
        –1
        олдскул — это на самом LEGO.
          0
          олдсукл это на рассыпухе =)
        +3
        Про механическое телевидение опочитать было очень интересно. Ролики на ютубе забавляют.
        Оно было очень неплохо! Спасибо за то что дали это знание.
          +1
          Напомнило… habrahabr.ru/blogs/DIY/87034/
            0
            Тот же POV эффект.
          • НЛО прилетело и опубликовало эту надпись здесь
              0
              Спасибо!
              Если получится сделать этот дисплей как монитор, тогда классно будет показывать нашим детям старые советские мультики на нем…
                0
                сделать круглым, побольше пикселей, и rgb.
                0
                Очень клево. Но я б задержку между импульсами не вручную подбирал а мерял бы время между импульсами фоторезистора и делил на количество пикселей по горизонтали. Тогда можно было бы и не ждать перед стартом.
                  0
                  Механизм раскачивания планки со светодиодами сделан по принципу «как проще», так что скорость движения неравномерна. Ближайшую к мотору точку проходит медленно, а от противоположной стороны практически отскакивает, мгновенно изменяя направление. Просто разделить время не получится, нужно вспоминать геометрию. «Дисплей» собирали с сыном за один вечер, так что есть ещё огромный потенциал для улучшений.
                    0
                    Да, с такой штукай еще играться и играться. Я уже второй месяц заказ ардуинки откладываю, но POV у меня на первом месте в «списке на консотруирование».
                      0
                      Кстати, если вывести «настроечную сетку» пиксель на пиксель, можно без геометрии отрегулировать поправочные коэффициенты.
                    +13
                    image
                    :)
                      0
                      Всё в порядке, так и должно быть, насколько я понимаю. Плохо, что только 4 символа влезает :)
                      +4
                      Ожидал увидеть видео.
                        +2
                        Очень много видео с POV дисплеями тут.
                          0
                          Такие, кстати, где-то на харе были. Тоже на Ардуино.
                          0
                          Да, интересно, на таком механизме хватит частоты, чтобы глаз видел?.. Или только на фотоаппарате с нормальной выдержкой можно увидеть?..
                            +1
                            На глаз видится отлично, даже лучше чем на фотографии. Чтоб размыть качающийся рычаг, фотографировал с выдержкой в одну секунду, так что на фото четыре-пять наложенных друг на друга циклов. Так-как вся пластиковая конструкция получилась лёгкой и заметно раскачивается, то на фотографии пиксели получились размытыми по горизонтали. Глазами картинка воспринимается чётче.
                              +1
                              Класс) Не думал что у такой штучки хватит прочности такую частоту поддерживать)
                          0
                          Прикольно. Стильно выглядит. Так сразу в мозгу и возник образ набора лего, в котором есть такая штука, рисующая слово Пиво по умолчанию)))
                              +2
                              Ожидал увидеть
                              unsigned char Habr[] = {
                                B11111010,
                                B00000000,
                                B01100010,
                                B10010100,
                                B10011000,
                                B11111110,
                                B00000000,
                                B00000000,  
                                B01101100,
                                B10010010, 
                                B10010010,
                                B11111110,
                                B00000000,  
                                B00000000,
                                B00111110,
                                B11001000,
                                B10001000,
                                B11001000,
                                B00111110,
                                B00000000,
                                B00000000,
                                B11111110,
                                B00010000,
                                B00010000,
                                B00010000,
                                B11111110 };
                                +2
                                пару недель назад что-то похожее делал, только сам дисплей был неподвижным, нужно было двигать фотоаппаратом (или дисплеем возле объектива)
                                Здесь фотки
                                image

                                image

                                image
                                  +1
                                  Витая пара? :)
                                    0
                                    да, очень удобно, и всегда под рукой)
                                      +1
                                      В моём случае — на руке ;)
                                        0
                                        люблю такие фенечки. Картинку в студию)
                                          0
                                          Фотоаппарат сдох. Позже поставлю дрова на вебку, сфоткаю с неё :)
                                            0
                                            как успехи с драйверами? уже не терпится увидеть:)
                                              0
                                              Фиговые с неё результаты. Завтра заберу фотоаппарат из ремонта, тогда и сделаю :)
                                +2
                                А дисплей-то не механический, а светодиодный.

                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                  Самое читаемое