使用Arduino進行USB音量控制

使用快速鍵調節電腦音量非常方便,許多多媒體鍵盤都內置有該功能。但是如果您的鍵盤沒有,您可以使用Arduino、一個旋鈕和一些代碼來構建該工具。本指南將介紹如何添加外部的資料資料庫,並使用Arduino來控制您的PC。

arduino

如何使用Arduino控制您的電腦

為了用Arduino控制電腦,我們將使用一種名為 the Leonardo的變體Uno。與Uno不同的是,該板基於4ATmega32u4晶片組,這種晶片組本身支援USB通信,從而可以使開發板用作滑鼠和鍵盤。方便的一點是,這也使該板可以發送媒體控制命令,類似於鍵盤上的音量、播放和暫停按鈕的工作原理。

但是,為了使用這些媒體命令,您需要在Arduino IDE中啟用一個額外的資料庫。資料庫中包含了可以執行各種特定任務的附加代碼,而Arduino IDE自帶有一些用於控制伺服系統、滑鼠或鍵盤等常用功能的資料庫。與此同時,IDE還包含一個可搜索的附加資料庫目錄,可以進一步擴展您的專案。

在這裡我們將可以找到所需要的媒體控制資料庫。在Arduino IDE中,進入Sketch > Include library > Manage libraries… 然後搜索“hoodloader”,點擊“Install(安裝)”。現在,您就可以在IDE中使用HID專案資料庫了。我們將在下文代碼部分向您展示如何將其引用到您的草圖中。

所需工具

有很多種方法可以構建該特定工具,從技術上講,可以使用帶有Hoodloader2資料庫的 Arduino Uno來實現。但是,此方法的設置過程不在本指南的範圍內,所以我們會重點關注被設計為預設用作USB滑鼠或鍵盤的Arduino模型。在這一思路下,您將需要以下工具:

Arduino Leonardo arduino leonardo
一個電位器

這是一個簡單的三引腳輸入元件,帶有一個附加的旋鈕或控制盤。通過調節功率輸送量,該輸入可以調整Arduino內部的一個值,我們可以將其用作音量控制。

potentiometer
Arduino IDE

如果您尚未設置Arduino IDE, 您可以點擊此處查看之前的指南

arduino IDE

您還需要一根微型USB線(如果您身邊沒有的話),以及一台可以工作的電腦。
本指南是為Windows使用者設計的,雖然也適用於使用其他作業系統的使用者,但是在細節上可能會有所不同。

代碼

首先,以下是我們將使用的草圖中的完整代碼:

#include

int potpin = 0; // Assign analog pin to potentiometer
int val = 0; // Variable to read value from potentiometer, starts at 0
int oldVolume = 0; // Used to compare volume levels
int currentVolume = 0; // Used to compare volume levels

void setup() {
Serial.begin(9600); // This will allow you to read the current value of the dial
}

void loop() {
val = analogRead(potpin); // Reads potentiometer value (between 0 and 1023)
val = map(val, 0, 1023, 0, 50); // Scale value to volume (value between 0 and 50)
Serial.print(val); // Print dial/volume position
Serial.println(); //

if (val != oldVolume) {
if(val > oldVolume){
//delay(100);
Consumer.write(MEDIA_VOLUME_UP);
currentVolume = currentVolume + 2;
oldVolume = val;
}
else{
//delay(100);
Consumer.write(MEDIA_VOLUME_DOWN);
currentVolume = currentVolume – 2;
oldVolume = val;
}
}
}

如果您想直接跳到接線部分,可以將此代碼複製到IDE中並上傳。現在,我們來解釋一下這個草圖中的一些重要部分。

#include

該命令將會把您之前添加到草圖中的媒體控制資料庫進行引用。這使我們可以使用稍後將討論的那些命令。雖然通過功能表將Hoodloader資料庫添加到您的IDE也可以使其在草圖中可用,但是該行代碼對於需要使用其中所包含命令的任何草圖都是必需的。

int potpin = 0; // Assign analog pin to potentiometer
int val = 0; // Variable to read value from potentiometer, starts at 0
int oldVolume = 0; // Used to compare volume levels
int currentVolume = 0; // Used to compare volume levels

這裡的第一行從電位器(按鈕/控制盤)啟動信號。然後將控制盤的位置分配給val變數。這用於提高或降低音量。

由於無法直接分配音量級別,草圖會指示PC以2為增量來提升或降低音量級別(Windows音量級別範圍為0到100),直到調整到所需的音量級別。之後的兩個變數oldVolume和currentVolume在每次迴圈反覆運算中都會進行比較,直到它們與控制盤輸出的級別匹配。

val = analogRead(potpin); // Reads potentiometer value (between 0 and 1023)
val = map(val, 0, 1023, 0, 50); // Scale value to volume (value between 0 and 50)

這兩行代碼用於讀取控制盤的位置,然後將該值映射到0到50的範圍中。通常,電位器可以讀取0到1023範圍內的值,但這比我們所需要的變化範圍大得多,所以我們需要將範圍壓縮到0到50。

由於Windows的音量調整範圍是0到100,並且每執行一次音量增大或減小命令,音量級別的增量為2,所以這可以使控制盤的最小和最大值對應於Windows中的最小和最大音量級別。

if (val != oldVolume) {
if(val > oldVolume){
Consumer.write(MEDIA_VOLUME_UP);
currentVolume = currentVolume + 2;
oldVolume = val;
}
else{
Consumer.write(MEDIA_VOLUME_DOWN);
currentVolume = currentVolume – 2;
oldVolume = val;
}
}

在這個基本迴圈中,會將來自控制盤的值和之前的音量級別進行比較。只要沒有發生任何變化,該迴圈中的代碼就不會被執行。一旦控制盤發生了移動,迴圈代碼將開始執行。如果控制盤向上移動,那麼迴圈將會執行MEDIA_VOLUME_UP命令,直到系統音量與控制盤位置相匹配。如果控制盤向下移動,迴圈將改為執行MEDIA_VOLUME_DOWN命令。

該命令是使用HID專案API的 Consumer.write() 函數來發送的。該命令還可用于諸如媒體暫停、媒體播放或靜音等工作。您可以嘗試添加更多的輸入元件,如按鈕,並調整草圖對其進行使用。

arduino & potentiometer

接線

現在您已經瞭解代碼是如何工作的了,接下來可以將草圖上傳到您的Arduino Leonard。上傳後,您可以開始連接電位器。這個專案的接線很簡單:

● 將電位器的第一個引腳連接到GND。
● 將中間引腳連接到模擬引腳A0。
● 將電位器的最後一個引腳連接到5V引腳。
● 將Leonardo上的微型USB埠連接到電腦

雖然在許多Arduino專案中,只要有電源,就可以在不使用電腦的情況下運行,但是在本專案中,很顯然是需要連接電腦的。

在使用此版本的草圖時,最好在首次啟動Arduino時將電腦音量和控制盤都設置為零。但是,為了使其更加靈活,您也可以嘗試添加Consumer 資料庫中的其他命令來自動調低系統音量,以便您在首次連接使用時將其與您的控制盤同步。