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. |