3d6

Лазерная платформа

Dec 02, 2012 20:51

Уже где-то с год мне не давала покоя идея поставить лазер на платформу, которая могла бы направлять его куда захочется, и контролировалась с компа. Наконец-то дошли руки этим заняться (сделать ее до неприличия просто, на основную часть ушло часа 4, и еще 6 на полезные доработки).
Собственно, получилось примерно такая штука:



Устроена она так: на большой подставке стоит крупная сервомашинка, она крутит маленькую подставку. На маленькой подставке стоит сервомашинка поменьше, которая крутит сам лазер.
Итого, угол по горизонтали определяется нижней машинкой, угол по вертикали - верхней, и вся конструкция целиком позволяет направлять луч почти в любую точку (у сервомашинок "угол обзора" 180 градусов).

Управляется все это дело с помощью Arduino. В том числе микроконтроллер управляет и включением лазерного диода - поэтому можно светить как постоянным лучом, так и мерцающим - мерцание соответственно приводит к рисованию пунктирных линий.
Связка с компом была сделана так:небольшая прграммка на компе превращает текущее положение мышки в углы поворота и наклона, нажатие мыши включает сам луч, и полученный пакет в несколько байт отправляется в контроллер через серийный порт (под линуксом это равносильно записи нескольких байт в файл - достаточно указать имя порта в качестве имени файла при открытии, и все). На ардуинке каждые 20 миллисекунд считывалось состояние серийного порта, и если пришел пакет - лазер перенаправлялся соответственно.



Правда тут было тонкое место - сначала я управлял сервами и лучом, прописывая в коде ардуино включение/выключение напряжения на разных ножках, и ставя между этими моментами паузы в некоторое число миллисекунд (сервомашинки управляются импульсами в 0.5-2.5 миллисекунды). Но оказалось что это очень ненадежный метод, если параллельно держать соединение с компом: обработка ввода/вывода занимает много миллисекунд, на это время машинки и луч останавливаются, и это раздражает. Поэтому пришлось заменить прописанные в коде интервалы сигналом с встроенного в ардуино генератора (PWM). Это штука, которая позволяет генерировать серию импульсов с заданной частотой и длительностью, полностью независимо от основного кода. В результате движения приобрели плавность.

Ну и небольшим довеском стала возможность загружать в ардуино последовательность точек, которые должен пройти луч, и режим луча в процессе прохода - за счет этого стало возможным рисовать разные картинки на потолке, стенах, и даже на соседнем доме:


- выдержка 1 секунда, за это время луч примерно полтора раза нарисовал повернутую на бок восьмерку, для разнообразия - пунктирной линией :)

Впрочем, это еще не все. Сервомашинки не очень подходят для таких задач, но если их чуть разобрать, и управлять встроенным мотором напрямую - можно будет делать куда более аккуратные и плавные фигуры, что я надеюсь сделать в скором будущем. Еще в планах закрепить вместе с лазером маленькую камеру - чтобы заранее знать куда пойдет луч, если его сейчас включить. А еще я понемногу обдумываю синхронизацию двух и более лучей, чтобы автоматически наводить их в одну точку... Но это потом :)

arduino

Previous post
Up