3d6

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

Dec 02, 2012 20:51

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


Read more... )

arduino

Leave a comment

3d6 March 17 2013, 18:21:37 UTC
Ну, схемка там простая до неприличия: два PWM выхода идут на управляющие каналы серв, и один PWM выход идет на вход драйвера L293d, а его выход напрямую питает схему лазера. Повозиться пришлось с управлением PWM, в итоге написал вот такие функции:

void setPWM1(int div, int mod9, int mod10)
{ //timer1
TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM12) | _BV(WGM11) | _BV(WGM10);
DDRB = _BV(PORTB1) | _BV(PORTB2);
if(div == 1) TCCR1B = _BV(CS10);
if(div == 8) TCCR1B = _BV(CS11);
if(div == 64) TCCR1B = _BV(CS11) | _BV(CS10);
if(div == 256) TCCR1B = _BV(CS12);
if(div == 1024) TCCR1B = _BV(CS12) | _BV(CS10);
OCR1A = mod9;
OCR1B = mod10;
}
void setPWM2(int div, int mod3, int mod11=128)
{ //timer2
TCCR2A = _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
if(div == 1) TCCR2B = _BV(CS20);
if(div == 8) TCCR2B = _BV(CS21);
if(div == 32) TCCR2B = _BV(CS21) | _BV(CS20);
if(div == 64) TCCR2B = _BV(CS22);
if(div == 128) TCCR2B = _BV(CS22) | _BV(CS20);
if(div == 256) TCCR2B = _BV(CS22) | _BV(CS21);
if(div == 1024) TCCR2B = _BV(CS22) | _BV(CS21) | _BV(CS20);
OCR2B = mod3;
}

первая генерирует сигналы на 9,10 пинах, вторая на 3м (использован для лазера). Функции работают так: за каждые div тактов процессора счетчик увеличивается на 1, при достижении 256 сбрасывается в 0. В нуле вывод устанавливается в 1, при достижении mod - обнуляется. Тактовая частота - 16МГц, серва управляется импульсом уровня 1 длиной от 1 до 2 миллисекунд (1 - крайнее левое положение, 2 - крайнее правое, но на практике дешевые сервы часто бывают сдвинуты, надо проверять самому). Соответственно можно посчитать, какую комбинацию значений div и mod надо выбрать для задания нужной точки.

Reply


Leave a comment

Up