Site Language

Translate

Danish Dutch English French German

CashBack Реальный возврат при покупках в интернете

Основные версии плат Arduino

Due — плата на базе 32-битного ARM микропроцессора Cortex-M3 ARM SAM3U4E;

Leonardo — плата на микроконтроллере ATmega32U4;

Uno — самая популярная версия базовой платформы Arduino;

Duemilanove — плата на микроконтроллере ATmega168 или ATmega328;

Diecimila — версия базовой платформы Arduino USB;

Nano — компактная платформа, используемая как макет. Nano подключается к компьютеру при помощи кабеля USB Mini-B;

Mega ADK — версия платы Mega 2560 с поддержкой интерфейса USB-host для связи с телефонами на Android и другими устройствами с интерфейсом USB;

Mega2560 — плата на базе микроконтроллера ATmega2560 с использованием чипа ATMega8U2 для последовательного соединения по USB-порту;

Mega — версия серии Mega на базе микроконтроллера ATmega1280;

Arduino BT — платформа с модулем Bluetooth для беспроводной связи и программирования;

LilyPad — платформа, разработанная для переноски, может зашиваться в ткань;

Fio — платформа разработана для беспроводных применений. Fio содержит разъем для радио XBee, разъем для батареи LiPo и встроенную схему подзарядки;

Mini — самая маленькая платформа Arduino;

Pro — платформа, разработанная для опытных пользователей, может являться частью большего проекта;

Pro Mini — как и платформа Pro, разработана для опытных пользователей, которым требуется низкая цена, меньшие размеры и дополнительная функциональность.

CashBack Все честно и без обмана

Подключение клавиатуры и мыши

Широкую популярность интерфейс PS/2 (Personal System/2) приобрел благодаря использованию для взаимодействия с манипулятором типа мышь в компьютерах Apple Macintosh и позднее, в конце 1980-х годов, в ОС Windows для IBM PC. Однако сегодня PS/2 практически полностью заменен интерфейсом USB. Тем не менее, протокол PS/2 представляет собой интересную платформу для различных экспериментов. Например, можно с помощью клавиатуры, подключенной через этот интерфейс, осуществлять ввод фраз для бегущей строки из светодиодных матриц, подключенных к Arduino.

Схема выводов разъема PS/2 (в просторечии распиновка) представлена на рисунеку

Разъем PS/2

Обмен данными по протоколу PS/2

Обмен данными через PS/2 осуществляется асинхронно по последовательному протоколу. Для обмена информацией используются 2 линии:

 1 — DATA (по этой линии передаются сами данные);

 5 — CLOCK (по этой линии передаются тактовые сигналы).

При передаче от устройства (клавиатуры или мыши), подключенного через интерфейс PS/2 к компьютеру (или, в нашем случае, к контроллеру), используется протокол, суть которого иллюстрирует схема, показанная на рис. 9.2. Устройство не начинает передачу, если линия Clock не находилась в "1" по крайней мере 50 микросекунд.

 

Устройство передает последовательно:

 стартовый бит — всегда ноль;

 8 битов данных;

 бит четности;

 стоп-бит — всегда единица.

Таким образом, данные передаются по одному байту за раз, при этом байт данных передается побитно. Первым, как можно видеть, идет стартовый бит (Start bit) — он всегда передается низким уровнем (логический "0"). Далее передается сам байт данных, начиная от младшего бита к старшему. То есть, если нужно передать байт 0xF0, который в двоичной системе записывается так: 11110000, то передаваться его биты будут в следующем порядке: "0","0","0","0","1","1","1","1". После данных идет бит четности (Parity bit): если число четное — будет передана "1", а если нечет- ное — "0". Бит четности — это контрольный бит, принимающий значения "0" или "1" и служащий для проверки общей четности двоичного числа (четности количества единичных битов в числе). Стоп-бит (Stop bit) — всегда логическая "1".

Устройство устанавливает/меняет сигнал Data, когда линия Clock находится в логической единице. Контроллер читает данные, когда линия Clock находится в логиче- ском нуле.

Частота сигнала Clock примерно 10–16,7 кГц. Время от фронта сигнала Clock до момента изменения сигнала Data — не менее 5 микросекунд.

Передача данных от PS/2-клавиатуры (мыши) к контроллеру

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

Хост-контроллер опускает сигнал Clock в ноль на время примерно 100 микросекунд.

Хост-контроллер опускает сигнал Data в ноль, формируя стартовый бит.

Хост-контроллер отпускает сигнал Clock в логическую единицу, клавиатура фиксирует стартовый бит.

Далее клавиатура генерирует сигнал Clock, а хост-контроллер подает передаваемые биты.

После того, как хост-контроллер передаст все свои биты, включая бит четности и стоп-бит, клавиатура посылает последний бит "0", который является подтверждением приема.

 

Отправка данных по протоколу PS/2 от контроллера к клавиатуре (мыши)

 

Библиотека ps2dev

 

На официальном сайте Arduino имеется библиотека для работы с устройствами PS/2. Скачать библиотеку можно по адресу http://www.arduino.cc/playground/ В архиве находится папка ps2dev, которую нужно поместить в библиотечный каталог Arduino IDE (\hardware\libraries\).

Библиотека PS/2 представляет собой класс C++:

class PS2dev

{

 

public:

 

PS2dev(int clk, int data); int write(unsigned char data);

int read(unsigned char * data);

 

private:

int _ps2clk; int _ps2data;

void golo(int pin); void gohi(int pin);

};

Конструктор класса принимает два параметра типа int — номера портов устройства Arduino, к которым подключены линии Clock и Data, например:

PS2dev mouse(6, 5);

Здесь к Pin5 подключена линия Data, а к pin6 — линия Clock.

Функция golo переводит порт в режим вывода и устанавливает на нем логический "0", функция же gohi переводит порт в режим ввода и подключает на нем подтягивающий резистор. Обе функции имеют тип private и используются только внутри класса. Нам же доступны всего две функции:

 write — записывает байт в линию PS/2;

 read — считывает байт из линии PS/2.

 

Подключение клавиатуры

 

На каждую принятую от контроллера команду (или — проще сказать — на каждый принятый байт) клавиатура должна обязательно ответить одним из следующих байтов:

 0xFA — подтверждение об успешном приеме;

 0xFE — команда принята с ошибкой — вероятно, это ошибка циклической контрольной суммы (CRC).

При получении от контроллера команды 0xFF (начальная установка) клавиатура отвечает 0xFA, а затем сбрасывается и посылает в ответ байт 0xAA.

В клавиатуру контроллер может послать следующие команды:

 0xED — зажечь или потушить светодиоды CAPS/NUM/SCROLL. Если клавиатура принимает эту команду, то она не пошлет более никаких ответов до тех пор, пока компьютер не пришлет следующий байт — параметр, который определяет битовую маску: один бит — это один из светодиодов. Битовая маска для светодиодов клавиатуры определена так:

• #define KEYBOARD_CAPS_LOCK_ON 4

• #define KEYBOARD_NUM_LOCK_ON 2

• #define KEYBOARD_SCROLL_LOCK_ON 1

 0xF3 —– это тоже двухбайтовая команда. После этой команды следует параметр, определяющий частоту повтора кодов при нажатой клавише и интервал времени между нажатием и началом повторов.

После подачи напряжения питания клавиатура посылает код 0xAA и немедленно готова к работе. Она сразу, без дополнительного программирования, готова посылать коды нажатых клавиш. По умолчанию клавиатура посылает на нажатие клавиши один байт-код, а на отпускание клавиши два байта. Первый байт в кодах отпуска ния клавиши — это префикс отпускания 0xF0. Например, если нажать и отпустить клавишу <1>, то клавиатура пошлет последовательность кодов 0x16, 0xF0, 0x16. Существует еще так называемый дополнительный код — это префикс 0хE0. Он посылается вместе с кодами дополнительных клавиш. Например, при нажатии клавиши <Insert> (нецифрового блока) отправляется последовательность 0хE0, 0x70, 0хE0, а при ее отпускании 0xF0, 0x70.

До сих пор все более или менее понятно, но, как оказалось позже (при написании редактора текста — см. разд. 9.4), это еще не все... Получив от контроллера команду зажечь светодиод — например, Num_Lock, клавиатура зажигает соответствующий светодиод, но теперь при нажатии клавиш основной панели клавиатуры, которые продублированы на цифровой панели (<Del>, <Home>, <Insert> и пр.), отправ- ляется иная последовательность байтов, например:

 клавиша <Home> основной панели при потушенном Num_Lock:

E0 6C E0

 клавиша <Home> основной панели при включенном Num_Lock:

E0 12 E0 6C E0

Это все необходимо учитывать при приеме кодов с клавиатуры. В следующем разделе мы создадим редактор текста. Текст, получаемый с клавиатуры, будет выводиться на дисплей WINSTAR WH1604. При этом вводимый текст мы сможем редактировать.

 

Редактор текста на дисплее WH1604

 

Сначала определим список служебных клавиш, необходимых при редактировании текста или выполнении действий с набранным текстом (сохранить в файл, отправить SMS и пр.), и зададим их значения в константах. Список используемых констант приведен в примере. Этот список в последующем мы будем расширять.

 

#define CAPS 0x58 // включить/выключить режим Caps_Lock

#define NUM 0x77 // включить/выключить режим Num_Lock

#define SCROLL 0x7E // включить/выключить режим Scroll

#define ESC 0x76 // выход из редактора

#define F10 0x9 // сохранить в файл на SD-карте памяти

// будем еще добавлять служебные клавиши

#define ALT 0x11 // выбор языка eng/rus

#define CTRL 0x14 // нажатие Ctrl

#define L_SHIFT 0x12 // нажатие клавиши shift

#define R_SHIFT 0x59 // нажатие клавиши shift

#define LEFT 0x6B // курсор влево

#define RIGHT 0x74 // курсор вправо

#define UP 0x75 // курсор вверх на 1 строку

#define DOWN 0x72 // курсор вниз на 1 строку

#define PGUP 0x7D //

#define PGDOWN 0x7A //

#define END 0x69 // курсор в конец строки

#define HOME 0x6C // курсор в начало строки

#define NUM5 0x73 // пустая клавиша цифровой панели

#define BACKSPACE 0x66 // удалить предыдущий символ

#define DELETE 0x71 // удалить символ из текущей позиции

#define INSERT 0x70 // включить/выключить режим Insert

При нажатии обычных клавиш их визуальное представление будет выводиться в текущую позицию дисплея с заменой текущего символа (режим Insert) или со сдвигом курсора вправо. Линию Clock клавиатуры подсоединим к pin3 и запустим обработчик прерывания 1 для отслеживания момента передачи данных с клавиатуры. Схема подключения клавиатуры и дисплея представлена на рисунке

Схема подключения

В функции начальной установки необходимо инициализировать клавиатуру и дисплей и запустить обработчик прерывания по событию начала отправки кода с клавиатуры. Содержимое функции setup() представлено в примере.

 

void setup()

{

Serial.begin(9600); Serial.println("start-ok");

// инициализация клавиатуры kbd_init(); Serial.println("keyboard-ok");

// инициализация дисплея lcd.begin(16, 4);

// Начальное сообщение lcd.clear(); lcd.print("Редактор текста"); lcd.cursor();

delay(5000); lcd.clear();

// ожидание передачи от клавиатуры по прерыванию 1 attachInterrupt(1, get_char, FALLING);

}

Коды, поступающие с клавиатуры PS/2, не соответствуют кодам ASCII. Если отсечь все служебные коды, из клавиатуры выдаются коды в интервале 0 — 0x7f. Для перевода поступающих кодов в коды ASCII создадим массив размером 1024 байта. Массив памяти условно разделен на 8 блоков. Карта распределения памяти в массиве для разных режимов приведена в таблице. Код нажатия неслужебной клавиши клавиатуры будет являться адресом нахождения соответствующего кода ASCII для нажатой клавиши. Отпускание клавиши отсечем программно. Переключение между языками станем осуществлять по нажатии клавиши <Alt>. В скетче предусмотрим возможность перехода и по нажатии клавиши <Scroll> — этот вариант более удобен, т. к. при этом будет осуществляться индикация на светодиоде Scroll клавиатуры выбранного языка. Выбор нужного символа для режима Num_Lock будем подготавливать программно.

Карта распределения памяти для перевода кодов клавиатуры в коды ASCII

 

 

Фрагмент содержимого массива приведен в примере.

 

unsigned char table1[1024]={

// 0 – 0x7f

' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','`',' ',

' ',' ',' ',' ',' ','q','1',' ',' ',' ','z','s','a','w','2',' ',

' ','c','x','d','e','4','3',' ',' ',' ','v','f','t','r','5',' ',

' ','n','b','h','g','y','6',' ',' ',' ','m','j','u','7','8',' ',

' ',',','k','i','o','0','9',' ',' ','.','/','l',';','p','-',' ',

' ',' ','\'',' ','[','=',' ',' ',' ',' ',' ',' ',']','\\',' ',' ',

' ',' ',' ',' ',' ',' ',' ',' ',' ','1',' ','4','7',' ',' ',' ',

'0',' ','2','5','6','8',' ',' ',' ','+','3','-','*','9',' ',' ',

// 0x80 – 0xff

' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','`',' ',

' ',' ',' ',' ',' ','Q','1',' ',' ',' ','Z','S','A','W','2',' ',

' ','C','X','D','E','4','3',' ',' ',' ','V','F','T','R','5',' ',

' ','N','B','H','G','Y','6',' ',' ',' ','M','J','U','7','8',' ',

' ','<','K','I','O','0','9',' ',' ','.','/','L',';','P','-',' ',

' ',' ','\'',' ','[','=',' ',' ',' ',' ',' ',' ',']','\\',' ',' ',

' ',' ',' ',' ',' ',' ',' ',' ',' ','1',' ','4','7',' ',' ',' ',

'0',' ','2','5','6','8',' ',' ',' ','+','3','-','*','9',' ',' ',

// 0x100 – 0x17f

........

};

При начале передачи кода из клавиатуры при переходе тактового сигнала Clock из логической "1" в "0" на digital pin 3 происходит вызов процедуры обработки прерывания 1 — функции get_char(). Функция отключает прерывание 1, получает байт от клавиатуры и производит анализ полученного байта. При этом возможны сле- дующие действия:

 установка служебных переменных:

• f0 — признак получения кода отпускания клавиши;

• e0 — начало служебной последовательности;

• lang — язык (для выбора языка по клавише <Scroll>);

• alt — язык (для выбора языка по клавише <Alt>);

 

ins

— режим Insert;

 

l_shift,r_shift

— состояние клавиш <Shift>;

 

leds

 

— состояние светодиодов на клавиатуре;

 отправка команд установки светодиодов на клавиатуре;

 вывод символа на дисплей и в буфер данных;

 действия с курсором;

 действия со всем набранным текстом — выход, сохранение, отправка и т. д.

После выполнения всех действий с полученным байтом, которые мы рассмотрим далее, запускается прерывание 1. Фрагмент функции get_char() приведен в примере.

 

void get_char()

{

unsigned char code;int ledsb=0; detachInterrupt(1); // отключить прерывание 0 code = kbd.read(); // получить байт от клавиатуры switch(code)

{

case 0: break;

case 0xF0: f0=1; break; case 0xFA: break;

case 0xE0: e0=1-e0; break;

case ALT: if(f0==0)alt=1-alt; else f0=0; break; // eng/rus

.. .. ..

}

attachInterrupt(1, get_char, FALLING);

}

При получении от клавиатуры кодов нажатия клавиш <Num Lock>, <Caps Lock> и

<Scroll Lock> необходимо установить новое значение для служебной переменной leds (листинг 9.5) и вызвать функцию set_leds() для отправки команд клавиатуре .

 

case NUM: // NumLock if(bitRead(leds,1)==1 && f0<1)

{bitClear(leds,1);set_leds();} else if(bitRead(leds,1)==0 && f0<1)

{bitSet(leds,1);set_leds();}

 

else f0=0; break;

case CAPS: // CapsLock if(bitRead(leds,2)==1 && f0<1)

{bitClear(leds,2);set_leds();} else if(bitRead(leds,2)==0 && f0<1)

{bitSet(leds,2);set_leds();} else f0=0;

break;

case SCROLL: // ScrollLock if(bitRead(leds,0)==1 && f0<1)

{bitClear(leds,0);set_leds();lang=0;} else if(bitRead(leds,0)==0 && f0<1)

{bitSet(leds,0);set_leds();lang=1;} else f0=0;

break;

 

void set_leds()

{

kbd.write(0xED); // send reset code kbd.write(leds); // send reset code

}

При получении кодов нажатия клавиш цифровой панели (для режима не Num_Lock) и аналогичных им клавиш основной клавиатуры (кроме <Backspace> и

<Delete>) происходит вызов функций для расчета нового положения курсора new_cursor() и установки нового положения курсора set_cursor(). Содержимое этих функций приведено в примере.

 

// рассчитать для нового положения курсора

// смещения для Left=-1, Right = +1, Up = -width дисплея и т. д. void new_cursor(int to)

{

//txt_tek_pos=min(txt_tek_pos+to,lcd_cols*lcd_rows-1); txt_tek_pos=min(txt_tek_pos+to,txt_end_pos); txt_tek_pos=max(txt_tek_pos,0); set_cursor(txt_tek_pos);

}

// установка курсора void set_cursor(int pos)

{

int col;int row; col=max(0,pos%lcd_cols);

 

if(pos==lcd_cols*lcd_rows) col=lcd_cols-1; row=min(3,pos/lcd_cols);

Serial.print("pos=");Serial.print(pos); Serial.print("txt_end_pos=");Serial.print(txt_end_pos); Serial.print(" col=");Serial.print(col); Serial.print(" row=");Serial.println(row);

lcd.setCursor(col,row);

}

При получении кодов нажатия обычных клавиш клавиатуры либо клавиш цифровой панели при установленном режиме Num_Lock получаем код ASCII нажатой клавиши из массива table1. При получении адреса в таблице учитываются состояния переменных caps, l_shift, r_shift и alt (l или ang). Полученный из таблицы символ выводим на дисплей в текущую позицию курсора. Кроме того, весь набираемый текст хранится в буфере (массив txt_buffer[]). Код для указанных действий приведен в примере.

 

default: if(f0==1)

{f0=0;}

else

{

int addr=bitRead(leds,2)*128+min(1,l_shift+r_shift)*256; int addr+=alt*512+code;

// если для переключения eng/rus используется Scroll_Lock

// int addr+=lang*512+code; add_buffer(table1[addr]);

}

break;

.. .. ..

// ****************** добавление в буфер символа void add_buffer(char char1)

{

if(txt_end_pos==txt_tek_pos)

{txt_end_pos++;} else

{txt_end_pos=txt_end_pos+(1-ins);shift_buffer_right();} txt_buffer[txt_tek_pos]=char1; if(txt_end_pos!=txt_tek_pos)

shift_lcd_right(); txt_tek_pos=min(txt_tek_pos+1,lcd_cols*lcd_rows-1); txt_tek_pos=max(txt_tek_pos,0); set_cursor(txt_tek_pos-offset);

}

 

// сдвиг буфера текста вправо void shift_buffer_right()

{

if(ins==1) return;

for(int i=txt_end_pos;i>=txt_tek_pos;i--) txt_buffer[i]=txt_buffer[i-1];

}

// сдвиг на дисплее вправо void shift_lcd_right()

{;

for(int j=txt_tek_pos;j<min(txt_end_pos,lcd_cols*lcd_rows);j++)

{set_cursor(j);lcd.write(txt_buffer[j]);}

}

При получении с клавиатуры кода нажатия клавиши <Backspace> необходимо удалить предыдущий символ из буфера текста и вывести заново на дисплей содержимое буфера от удаляемого символа до конца. Код для данных действий приведен в примере.

 

case BACKSPACE: if(f0==0){delete_from_buffer();} else(f0=0);

break;

.. .. ..

// ****************** удаление из буфера backspace void delete_from_buffer()

{

if(txt_tek_pos>0)

{

txt_buffer[txt_end_pos]=' '; txt_end_pos--;

txt_tek_pos--; shift_buffer_left(); shift_lcd_left();

}

set_cursor(txt_tek_pos);

}

// сдвиг буфера текста влево void shift_buffer_left()

{

for(int i=txt_tek_pos;i<=txt_end_pos;i++) txt_buffer[i]=txt_buffer[i+1];

}

// сдвиг на дисплее влево void shift_lcd_left()

 

{;

for(int j=txt_tek_pos;j<=min(txt_end_pos,lcd_cols*lcd_rows);j++)

{set_cursor(j);lcd.write(txt_buffer[j]);}

}

При получении с клавиатуры кода нажатия клавиши <Delete> необходимо удалить символ из буфера текста из текущей позиции и вывести заново на дисплей содержимое буфера от текущего символа до конца. Код для данных действий приведен в примере.

 

case DELETE: if(f0==0){del_from_buffer();} else(f0=0); Serial.println("delete");

break;

.. .. ..

// ****************** удаление из буфера delete void del_from_buffer()

{

if(txt_tek_pos<txt_end_pos)

{

txt_buffer[txt_end_pos]=' '; txt_end_pos--; shift_buffer_left(); shift_lcd_left();

}

set_cursor(txt_tek_pos);

}

Подключение мыши

Рассмотрим протокол PS/2 для мыши (обычной 3-кнопочной с колесом). Программировать мышь не легче, чем клавиатуру, а, может быть, даже и труднее. После включения питания мышь не готова к работе, она лишь посылает байты 0xAA и, следом, 0x00. Требуется запрограммировать мышь на разрешение передачи. Для этого, как минимум, нужно послать ей специальную команду 0xF4. Только после этой команды мышь начнет посылать пакеты с координатами и состоянием кнопок. Вторая проблема состоит в том, что по умолчанию мышь работает без колеса прокрутки. Для того чтобы включить колесо, нужно выполнить инициализацию мыши, послав с контроллера в мышь следующую последовательность байтов:

0xF3, 200, 0xF3, 100, 0xF3, 80, 0xF2

 

На каждый из этих байтов мышь отвечает 0xFA. Последняя команда из посланной последовательности здесь — это 0xF2. После этой последовательности мышь должна прислать ID. Если пришел ноль, значит колеса нет и не будет. Если пришло "3", то это значит, что колесо прокрутки включено.

Приведем перечень наиболее важных команд для мыши:

 SET_MOUSE_RESOLUTION = 0xE8

 SET_MOUSE_SAMPLING_RATE = 0xF3

 ENABLE_MOUSE_TRANSMISSION = 0xF4

 SET_MOUSE_SCALING_1TO1 = 0xE6

 READ_MOUSE_STATUS = 0xE9

 GET_DEVICE_ID = 0xF2

 MOUSE_RESET = 0xFF

Некоторые из них идут в паре с параметром, некоторые — команды одиночные.

В ответ на команду 0xF4 мышь без колеса прокрутки посылает пакеты по три байта, а мышь с колесом — пакеты по четыре байта.

Первый байт в пакете передает знак перемещения SY и SX (вверх-вниз и влево- вправо), а также состояние трех кнопок: BM (middle — центральная), BR (right — правая), BL (left — левая):

0 0 SY SX 1 BM BR BL

Второй байт передает смещение по координате X: X7 X6 X5 X4 X3 X2 X1 X0

Третий байт передает смещение по координате Y: Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0

Четвертый байт посылается только для мышей с колесом и только, если оно включено. Он и определяет вращение колеса.

0 0 0 0 Z3 Z2 Z1 Z0

Теперь закрепим полученные знания на практическом примере.

 

Опрос состояния мыши

 

Создадим пример опроса состояния мыши с выводом значений состояния в после- довательный порт. Линию Clock мыши (вывод 5) подсоединим к pin 11, линию Data (вывод 1) к pin 10.

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

 

void mouse_init()

{

mouse.write(0xff); // команда сброса mouse.read(); // ответ мыши mouse.read(); //

mouse.read(); // mouse.write(0xf0); // remote mode mouse.read(); // ответ мыши delayMicroseconds(100);

// установим режим третьей кнопки mouse.write(0xF3);Serial.print(0xF3,HEX);Serial.print(" - "); Serial.println(mouse.read(),HEX); mouse.write(200);Serial.print(200,DEC);Serial.print(" - "); Serial.println(mouse.read(),HEX); mouse.write(0xF3);Serial.print(0xF3,HEX);Serial.print(" - "); Serial.println(mouse.read(),HEX); mouse.write(100);Serial.print(100,DEC);Serial.print(" - "); Serial.println(mouse.read(),HEX); mouse.write(0xF3);Serial.print(0xF3,HEX);Serial.print(" - "); Serial.println(mouse.read(),HEX); mouse.write(80);Serial.print(80,DEC);Serial.print(" - "); Serial.println(mouse.read(),HEX); mouse.write(0xF2);Serial.print(0xF2,HEX);Serial.print(" - "); Serial.println(mouse.read(),HEX); Serial.println(mouse.read(),HEX);

delay(1000);

}

void setup()

{

Serial.begin(9600); mouse_init();

}

Установка режима трехкнопочной мыши

 

Как видно из рисунке последний ответ мыши — байт 0x03 — колесо прокрутки включено.

В функции loop() происходит постоянный опрос состояния мыши (отправка байта запроса и чтение 4-х байтов). В случае изменения состояния мыши происходит анализ полученных байтов и отправка в последовательный порт событий для мы- ши: изменение координат, нажатие клавиш . Содержимое функции loop() представлено в примере.

 

void loop()

{

char mstat; char mx; char my; char mz;

/* чтение из мыши */ mouse.write(0xeb); // запрос mouse.read(); //

mstat = mouse.read(); mx = mouse.read(); my = mouse.read(); mz = mouse.read();

if(mstat!=0x08) // ничего не произошло

{

Serial.print(mstat, BIN); if(bitRead(mstat,0)==1) Serial.print("Click left button "); if(bitRead(mstat,1)==1) Serial.print("Click right button "); if(bitRead(mstat,2)==1) Serial.print("Click middle button "); Serial.print("\tX="); Serial.print(mx, DEC); Serial.print("\tY="); Serial.print(my, DEC); Serial.print("\tZ="); Serial.print(mz, DEC); Serial.println();

delay(300);

}

}

Вывод состояния мыши

Плата расширения L293D, ИК-датчик VS1838B, TFT LCD, Модем M590E GSM GPRS, "монитор TFT LCD, датчик движения HC-SR501, ИК-пульт дистанционного управления, Радиомодуль NRF24L01, SD Card Module, Звуковой модуль, 5-axis stepper motor driver, Шаговый двигатель, Модем M590E GSM GPRS, 5-axis stepper motor driver, Часы реального времени DS 3231/DS 1307, терморегулятор W1209 DC, Релейный модуль, датчик движения HC-SR501, Модуль Wi-Fi ESP8266-12E, датчик движения HC-SR501, Передатчик и приемник в диапазоне RF 433 Mhz, Блок питания, L293D, Микросхема контроллера коллекторного электродвигателя, ИК-пульт дистанционного управления, Датчики контроля температуры, Радиомодуль NRF24L01, OKI 120A2, Rotary Encoder, SD Card Module, Беспроводной пульт дистанционного управления, Микросхема контроллера коллекторного электродвигателя, Модуль Bluetooth HC-06,, Модем M590E GSM GPRS, Часы реального времени DS 3231/DS 1307, Mini 360 на схеме LM2596, MP3-TF-16P, L293D, Модуль LCD монитора, Инфракрасные датчики расстояния, Часы реального времени, USB Host Shield, HC-SR501, Cветочувствительный датчик сопротивления, блок питания Mini 360 на схеме LM2596, ЖК-дисплей TFT дисплей, Контроллер L298N, HC-SR501, Модуль MP3 Player WTV020, GSM GPRS, Сервоприводы, Модем M590E GSM GPRS, Часы реального времени DS 3231/DS 1307, Модуль Wi-Fi ESP8266-12E, Инфракрасные датчики расстояния, Card Module, Ультразвуковые дальномеры HC-SR04, Блок питания, Карта памяти SD, Mini 360, Ethernet shield, L293D, блок питания Mini 360 на схеме LM2596, Радиомодуль, датчик температуры DS18B20, ИК-пульт дистанционного управления, USB конвертер UART, ИК-пульт, Антена для модуля WiFi, Ethernet shield, Модуль блока питания XL6009, Микросхема контроллера коллекторного электродвигателя, Модуль качества воздуха MQ-135, Микросхема контроллера коллекторного электродвигателя, ИК-пульт дистанционного управления, SD Card Module, Радиомодуль NRF24L01, двигатель OKI, 5-axis stepper motor driver, L293D, TB6560, Драйвер шагового двигателя TB6600, Шаговый двигатель, Модуль камеры, Блок питания, L293D, блок питания Mini 360 на схеме LM2596, 5axis mach3 interface, Карта памяти SD, Ethernet shield, Контроллер L298N, датчик движения HC-SR501, Модуль Wi-Fi ESP8266-12E, Модуль LCD монитора LCD1602, Шаговый двигатель OKI 120A2, Шаговый двигатель, Шаговый двигатель.

РУБИКОН Группа «Мозаика», ИЕРОГЛИФ ГРУППА «ПИКНИК», В ПОЛЁТ ГРУППА «ТЯЖЕЛЫЙ ДЕНЬ», Группа «Алиса», Бенни Гудмен, Равноденствие ГРУППА «АКВАРИУМ», Элтон Джон Твоя песня, Демон Группа «Август», Deep Purple – The House Of Blue Light, «Лед Зеппелин» Led Zeppelin, «Акцепт», Doors, «Металлика», АНСАМБЛЬ „UB 40", группа «Зоопарк», рок-группа «ЗОДИАК», «Браво», «Кино», Rolling Stones «Роллинг стоунз», РОК-ГРУППА «МАШИНА ВРЕМЕНИ»,«Кокто твинз», Группа «ДИАЛОГ», Bill Evans, Джимми Лансфорд, Флетчера Хендерсона, Дюк Эллингтон, Каунт Бейси, АНСАМБЛЬ "THE MOODY BLUES", Элвис Пресли, "Юнона" и "Авось" , Дж. Верди Реквием G.Verdi Requiem Mass, Элтон Джон, Реджинальд Кеннет Дуайт, АББА, ABBA, “Deep Purple”, «ЧЕЛОВЕК С БУЛЬВАРА КАПУЦИНОВ», “Rolling Stone”, Instrumrutal rock group Zodiac,‘‘Long Tall Ernie and The Shakers”, “The Beatles”, "Tom Fcgerty and The Blue Velvets", "Creedruce Clearwater Revival","Greru River" "Bayou Country", "Willy and The Poorboys", Varnishing Day Songs on Ilya Reznik's lirics , Leo Sayer ЛЕО СЕЙЕР, Boney M,"Waiting For The Sun", Doors «ДОРЗ», "Piper At The Gates Of Dawn", Led Zeppelin ? «ЛЕД ЗЕППЕЛИН», Rolling Stones , "Юнона" и "Авось" Опера Либретто, «РОЛЛИНГ СТОУНЗ», Modern talking,"Aftermath", «ДОМ ГОЛУБОГО СВЕТА», "Out Of Our Heads", Ricchi E Poveri, PINK FLOYD «Пинк Флойд», Vladimir Kuzmin, ПОЛ МАККАРТНИ Paul McCartney, «TWruTY FLIGHT ROCK», Creedruce Clearvater revival Traveling band,«LAWDY. MISS CLAWDY», «BRING IT ON HOME TO ME», Light My Fire,«DON'T GET AROUND MUCH ANY MORE», МУЗЫКАЛЬНЫЙ ТЕЛЕТАЙП-3,«I'М GONNA BE A WHEEL SOME DAY», МОДЕРН ТОКИНГ,«AINT THAT A SHAME», «THAT'S ALL RIGHT (МАМА)», АНСАМБЛЬ UB 40, «JUST BECAUSE», МИГЕЛЬ РАМОС, «SUMMERTIME», "АНСАМБЛЬ "THE MOODY BLUES", «CRACKIN UP», ТНЕ СОММОDORES, «MIDNIGHT SPECIAL», АННА ГEРМАН, Deep Purple «ДИП ПЁРПЛ», „Deep Purple in Rock", Андрей Миронов, Олег Табаков, Михаил Боярский, Николай Караченцов, Альберт Филозов, Олег Анофриев, Игорь Кваша, Леонид Ярмольник, ИЛЬЯ РЕЗНИК , Резанов Николай Петрович, ВЛАДИМИР ВЫСОЦКИЙ, Роджер Уотерс, АЛЕКСАНДР РОЗЕНБАУМ, Ричард Райт и Ник Мэйсон, ВЛАДИМИР КУЗЬМИН, Элвис Аарон Пресли, Leo Sayer, АДРИАНО ЧЕЛЕНТАНО, Билл Эванс, Клаудия Мори....

и это еще не конец.

С уваженим Dron!