Как стать автором
Обновить

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

Время на прочтение 3 мин
Количество просмотров 25K
Если верить учебникам, то первые «телевизоры» были с механической развёрткой на диске Нипкова. Понятное дело, определение телевизора у каждого своё и для бытового применения механика малопригодна, однако решил и я попробовать сделать механический дисплей. К счастью в семье обнаружился восьмилетний специалист по моторчикам, он и смастерил «хардверную» часть установки. 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.
Теги:
Хабы:
+81
Комментарии 35
Комментарии Комментарии 35

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн