Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #95, НОЯБРЬ 2006 г.

Eye of the xakep

Fagot (salieff@mail.ru)

Хакер, номер #095, стр. 095-124-6


if (mouse_grabbed) {

...

releaseMouse();

mouse_grabbed=false; }

else {

...

grabMouse(QCursor(Qt::BlankCursor));

mouse_grabbed=true; }

}

e->accept(); }

При движении мышки в режиме mouse_grabbed, ее смещение записывается в очередь:

КОД

void QCEGLWidget::mouseMoveEvent(QMouseEvent * e) {

if (mouse_grabbed) {

...

if (off_x!=0 || off_y!=0) WriteQueue(off_x, off_y);

... }

e->accept(); }

В другом потоке из очереди смещения читаются, обрабатываются, после чего на вертикальное смещение поворачивается один мотор, а на горизонтальное – другой:

КОД

ReadQueue(x, y);

...

if (step_x>0) mot_a.StepPlus();

else mot_a.StepMinus();

...

if (step_y>0) mot_b.StepPlus();

else mot_b.StepMinus();

Что имеем под конец

Подводя итог, можно сказать, что изначальная идея реализована на 100% и даже с комфортабельными расширениями. Но идеальных решений не бывает. Разберем, что в существующем комплексе можно было бы улучшить:

1. В действительности, интерфейсу мотора со стороны компьютера не нужно целых 4 бита, на набор состояний «шаг вперед/шаг назад/стоять» хватило бы и двух бит. Правда, это бы потребовало усложнения аппаратного контроллера и переноса на него всей логики из класса StepperMotor. Зато на один LPT-порт можно было бы вешать 4 мотора.

2. В LPT-порт можно не только писать, оттуда можно и читать. Так что на шасси можно повесить оптические или контактные датчики для пограничного контроля и передавать их состояние в компьютер, это позволит не мучить моторы, когда они уже уперлись в ограничитель.

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

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

Public-интерфейс класса QCE_SPCA_Camera

class QCE_SPCA_Camera{

public:

QCE_SPCA_Camera(void);

~QCE_SPCA_Camera();

bool init(void);

unsigned char * getFrame(void);

unsigned char * getGLFrame(void);

int getWidth(void);

int getHeight(void);

bool setResolution(int res);

bool setBrightness(unsigned short int i);

bool setHue(unsigned short int i);

bool setColor(unsigned short int i);

bool setContrast(unsigned short int i);

bool setWhiteness(unsigned short int i);

int getResolution(void);

int getBrightness(void);

int getHue(void);

int getColor(void);

int getContrast(void);

int getWhiteness(void);

bool autoBright(void);

bool autoWhite(void);

};

CD

На диске ты найдешь управляющий софт, который собирается через qmake && make.

WWW

http://www.doc.ic.ac.uk/~ih/doc/stepper/ - здесь много информации о шаговых моторах и ссылок на аналогичные проекты.

http://sourceforge.net/projects/spca50x/ - драйвер для моей камеры, в Fedora Core 5 его не было.

INFO

Некоторые камеры поддерживают компрессию, это повышает фпс - echo 1 > /sys/module/spca5xx/parameters/compress.

Если у тебя не получается писать в LPT напрямую, поэкспериментируй с наличием/отсутствием модулей lp, parport, parport_pc.

Назад на стр. 095-124-5  Содержание