本文最初發佈在deviceplus.jp網站上,而後被翻譯成英語。
本文中,我將介紹一種不一樣的Arduino使用方式。乍一看,照片中的Arduino看起來像我們之前系列中使用過的Arduino Pro Mini,但其實這是另一種Arduino。它被稱為“Arduino Pro Micro”。雖然“Mini”變成了“Micro”,尺寸卻並沒有發生任何變化,因此,兩者有點難以區分。這種Arduino在連接到電腦時會被識別為滑鼠或鍵盤等HID設備。
預計完成時間:60分鐘
所需元件
Arduino Pro Micro是一種Arduino,配備有名為“ATmega32U4”的晶片(UNO等配有ATmega328P等)。該晶片最大的特點是當通過USB連接時會偽裝成鍵盤和滑鼠等人機周邊設備(HID)。配備ATmega32U4的Arduino除了“Pro Micro”之外,還被稱為“Arduino Leonardo”,是非常有名的開發板。
在編寫程式時,您可以選擇名為“Arduino Leonardo.”的開發板。
乍一看,Arduino Pro Mini與Arduino Pro Micro的外觀非常相似。
但是,Pro Micro具有可以連接到智慧手機等設備的USB連接器,而Pro Mini只有一個串列連接器。
現在,我們讓外觀相似的Arduino Pro Micro讀取示例程式並嘗試讓電腦將其識別為HID。
嘗試運行Arduino IDE的“File”-“Sketch Example”-“09.USB”-“Keyboard”-“KeyboardMessage”程式。
在這個程式中,我們打造一個在引腳4上設有開關的簡單電路,當引腳4被按下時,應通過鍵盤輸入顯示按下的次數。
(這次,我將引腳4改換為引腳7)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#include "Keyboard.h" const int buttonPin = 7; // input pin for pushbutton int previousButtonState = HIGH; // for checking the state of a pushButton int counter = 0; // button push counter void setup() { // make the pushButton pin an input: pinMode(buttonPin, INPUT); // initialize control over the keyboard: Keyboard.begin(); } void loop() { // read the pushbutton: int buttonState = digitalRead(buttonPin); // if the button state has changed, if ((buttonState != previousButtonState) // and it's currently pressed: && (buttonState == HIGH)) { // increment the button counter counter++; // type out a message Keyboard.print("You pressed the button "); Keyboard.print(counter); Keyboard.println(" times."); } // save the current button state for comparison next time: previousButtonState = buttonState; } |
編寫程式並打開記事本後,無需觸碰鍵盤,每按一次按鈕,就會按照上面的描述進行計數。
如果可以如此輕鬆地製作USB設備,那麼就可以實現更多夢想!
我們已經知道Arduino Pro Micro可以用作HID,下面我想通過將它與其他一些元元件組合來打造滑鼠設備。這一次,我將使用曾經在無線電控制設備製作中使用過的操縱杆,並嘗試打造一個可以用操縱杆和輕觸開關來代替滑鼠的設備。
首先,準備一個可用於設置操縱杆方向的程式。
將電路添加到之前的輕觸開關電路中。將操縱杆和後面要使用的LED連接到引腳2。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
const int _UDPIN = A0; // UD Input const int _LRPIN = A1; // LR Input const int _SWPIN = 7; // Digital Pin int _UD = 0; // Value for Up/Down int _LR = 0; // Value for Left/Right void setup() { Serial.begin(9600); pinMode(_SWPIN,INPUT) ; } void loop() { _UD = analogRead(_UDPIN); _LR = analogRead(_LRPIN); Serial.print("UP-DOWN:"); Serial.print(_UD, DEC); Serial.print(" - Left-Rright:"); Serial.println(_LR, DEC); if (digitalRead(_SWPIN) == HIGH) { Serial.println("switch on"); } delay(100); } |
經過確認,可以知道它讀取了程式,轉動操縱杆時數字會發生變化。
接下來,讓我們將操縱杆數位值轉換為滑鼠座標。實際上,這個程式也是已經備好的示例程式,所以讓我們來用用看。請選擇“File”-“Sketch Example”-“09.USB”-“Mouse”-“JoystickMouseControl”。
執行此程式時,會將上下(模擬引腳A2)和左右(模擬引腳A1)的值反映在滑鼠座標上。此外,由於引腳2通過接入5V電源來實現開關功能的,因此可以通過將引腳2與VCC相連或將開關夾在中間的方式來打開/關閉設備。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
#include "Mouse.h" // set pin numbers for switch, joystick axes, and LED: const int switchPin = 5; // switch to turn on and off mouse control const int mouseButton = 7; // input pin for the mouse pushButton const int xAxis = A1; // joystick X axis const int yAxis = A2; // joystick Y axis const int ledPin = 2; // Mouse control LED // parameters for reading the joystick: int range = 12; // output range of X or Y movement int responseDelay = 5; // response delay of the mouse, in ms int threshold = range / 4; // resting threshold int center = range / 2; // resting position value boolean mouseIsActive = false; // whether or not to control the mouse int lastSwitchState = LOW; // previous switch state void setup() { pinMode(switchPin, INPUT); // the switch pin pinMode(ledPin, OUTPUT); // the LED pin // take control of the mouse: Mouse.begin(); } void loop() { // read the switch: int switchState = digitalRead(switchPin); // if it's changed and it's high, toggle the mouse state: if (switchState != lastSwitchState) { if (switchState == HIGH) { mouseIsActive = !mouseIsActive; // turn on LED to indicate mouse state: digitalWrite(ledPin, mouseIsActive); } } // save switch state for next comparison: lastSwitchState = switchState; // read and scale the two axes: int xReading = readAxis(A0); int yReading = readAxis(A1); // if the mouse control state is active, move the mouse: if (mouseIsActive) { Mouse.move(xReading, yReading, 0); } // read the mouse button and click or not click: // if the mouse button is pressed: if (digitalRead(mouseButton) == HIGH) { // if the mouse is not pressed, press it: if (!Mouse.isPressed(MOUSE_LEFT)) { Mouse.press(MOUSE_LEFT); } } // else the mouse button is not pressed: else { // if the mouse is pressed, release it: if (Mouse.isPressed(MOUSE_LEFT)) { Mouse.release(MOUSE_LEFT); } } delay(responseDelay); } /* reads an axis (0 or 1 for x or y) and scales the analog input range to a range from 0 to */ int readAxis(int thisAxis) { // read the analog input: int reading = analogRead(thisAxis); // map the reading from the analog input range to the output range: reading = map(reading, 0, 1023, 0, range); // if the output reading is outside from the // rest position threshold, use it: int distance = reading - center; if (abs(distance) < threshold) { distance = 0; } // return the distance for this axis: return distance; } |
完成程式設計後,我們來嘗試讓它動起來。
哦,它真的動起來了!
這次,我們學習了使用Arduino Pro Micro打造基於Arduino的USB設備時的基本流程。在下一篇文章中,我們將進一步深化應用Arduino Pro Micro,嘗試打造更具“Device Plus”風格的USB設備,讓專案更具挑戰性!
還能用Arduino完成哪些項目?可以流覽相關文章更多瞭解: