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

Дешевый планарный датчик положения на основе PS/2 Mouse, MatLab + MBED + PS/2 Mouse

DIY или Сделай сам
Ну что же, попытка номер два.

В данном посте я попытаюсь рассказать об одной из частей моего дипломного проекта.
Использование контроллера типа Мышь, в качестве планарного датчика положения.

В чем же плюс Мышки?


Постановка задачи.


  • Получение координат с контроллера типа мышь в программном комплексе MatLab

Для начала немного теории.
Работа с мышью в MatLab будет реализована посредством работы с rs232 (по другому com портом), контроллер MBED будет общаться с мышью и выдавать на ком порт по запросу пакеты по 3 байта. В MatLab с помощью несложной блоксхемы будет происходить анализ пакетов с последующим разбором на управляющие сигналы и сигналы данных.

Почему был выбран метод общения через rs232? Потому что этот путь позволяет реализовать работу с мышью через стандартные блоки MatLab'а, тем самым оставляя возможность использования во всех режимах (Simulink, RTW, xPC).

Давайте взглянем теперь на MBED
image

Как мы видим контроллер обладает просто сумасшедшим количеством портов, из этого многообразия нам понадобится всего 4, причем 2 из них будут питанием :)

Вот как это выглядит в прототипной плате
image

Мышь работает с конечным устройством посредством 2х портов DATA и CLOCK, по названиям я думаю не сложно догадаться что есть что ;)
В нашем случае мы подключаем CLOCK на 28 ножку контроллера, а DATA на 26.
Питание берем с ног GND и VU.

Программа для контроллера крайне простая

////////////////////////////////////////////////
main.cpp
////////////////////////////////////////////////
#include "mbed.h"
#include "PS2Mse.h"
 
PS2Mse mse(p28,p26);
Serial pc(USBTX, USBRX);
 
int main() {
 
 
    mse.wr(0xf0);
    mse.wr(0xff);  // reset
    mse.rd();  // ack byte
    mse.rd();  // blank */
    mse.rd();  // blank */
    mse.wr(0xf0);  // remote mode
    mse.rd();  // ack
 
 
    char mstat;
    char mx;
    char my;
 
 
    while (1) {
 
        while (pc.getc()!=0) {
            mse.wr(0xeb);  
            mse.rd();      
            mstat = mse.rd();
            mx = mse.rd();
            my = mse.rd();
            pc.printf("%c%c%c\r\n", mstat,mx,my);
        }
    }
 
 
 
}
 

////////////////////////////////////////////////
PS2Mse.cpp
////////////////////////////////////////////////
dumpz.org/17295
////////////////////////////////////////////////
PS2Mse.h
////////////////////////////////////////////////
dumpz.org/17297

Как мы видим все что выполняет программа так это ждет любого символа от хоста (PC) и в ответ выдает текущие значения координат и клавиш мыши в виде 3х байтового пакета.

Рассмотрим что же происходит далее.
Вот как выглядит наш блок для работы в MatLab
image
Заглянем внутрь блока Mouse
image

Как мы видим тут тоже все довольно просто, идет анализ первого байта, из него извлекается 7 флаговых бита
  • 1 — Нажата первая кнопка мыши
  • 2 — Нажата вторая кнопка мыши
  • 3 — Нажата третья кнопка мыши
  • 5 — Знак приращения по X
  • 6 — Знак приращения по Y
  • 7 — Переполнение по X
  • 8 — Переполнение по Y

Второй и третий байт — приращения по X и по Y соответственно.

Как мы видим использование мыши очень просто.
Если кому то будет интересно то будут и метрологические исследования мыши.

UPDATE:

Кстати небольоше уточнение, мой диплом про другое, датчик же мне «попросили» (как обычно это делается в институте) сделать для помощи другому специалисту ;)
Мой диплом же совершенно про другие вещи, а конкретнее про Lego шарик и компас :)

Нус попробуем немного объяснить зачем вся эта возня была.
Существует задачу управления двухзвенным нежестким манипулятором.
Были испробованы много способов для определения конечного положения каждого из звеньев, начиная от тензометров наклеенных на звенья, заканчивая бредовыми идеями с лазерными датчиками расстояния.
Конечная цель определить куда все таки переместилось звено после подачи управляющих импульсов на сервоприводы, так как звено нежесткое, а также конструкция имеет некоторую инерцию, то использовать для этого тахогенераторы и счетчики самих двигателей бессмысленно.

Под MatLab же заточка велась именно для эта моделирования/программирования, подбора ПИД и подобных регуляторов. Вос ссылочка примерно с такими же задачами в дипломе www.lib.ua-ru.net/diss/cont/61880.html

Вообще тема управления нежесткими манипуляторами — любимая тема специальности Системы Управления, про эту тему уже столько всего написано.

Мышь была взята так как готовый бесконтактный датчик положения в цене явно превышает стоимость мыши.

Постарался как мог объяснить, 9 марта сфотографирую и попытаюсь объяснить предметно.
Теги: MBEDCortex-M3LPC1768ARMMatLabPS 2DIY
Хабы: DIY или Сделай сам
Всего голосов 41: ↑34 и ↓7 +27
Комментарии 48
Комментарии Комментарии 48

Похожие публикации

Лучшие публикации за сутки