使用Arduino进行USB音量控制

电子说

1.3w人已加入

描述

使用快捷键调节电脑音量非常方便,许多多媒体键盘都内置有该功能。但是如果您的键盘没有,您可以使用Arduino、一个旋钮和一些代码来构建该工具。本指南将介绍如何添加外部的库,并使用Arduino来控制您的PC。
usb

如何使用Arduino控制您的计算机

为了用Arduino控制计算机,我们将使用一种名为Leonardo的变体Uno。与Uno不同的是,该板基于4ATmega32u4芯片组,这种芯片组本身支持USB通信,从而可以使开发板用作鼠标和键盘。方便的一点是,这也使该板可以发送媒体控制命令,类似于键盘上的音量、播放和暂停按钮的工作原理。
但是,为了使用这些媒体命令,您需要在Arduino IDE中启用一个额外的库。库中包含了可以执行各种特定任务的附加代码,而Arduino IDE自带有一些用于控制伺服系统、鼠标或键盘等常用功能的库。与此同时,IDE还包含一个可搜索的附加库目录,可以进一步扩展您的项目。
在这里我们将可以找到所需要的媒体控制库。在Arduino IDE中,进入Sketch > Include library > Manage librarie…然后搜索“hoodloader”,点击“Install(安装)”。现在,您就可以在IDE中使用HID项目库了。我们将在下文代码部分向您展示如何将其引用到您的草图中。

所需工具

有很多种方法可以构建该特定工具,从技术上讲,可以使用带有Hoodloader2 库的 Arduino Uno来实现。但是,此方法的设置过程不在本指南的范围内,所以我们会重点关注被设计为默认用作USB鼠标或键盘的Arduino模型。在这一思路下,您将需要以下工具:

Arduino Leonardo usb
一个电位器
这是一个简单的三引脚输入元件,带有一个附加的旋钮或控制盘。通过调节功率吞吐量,该输入可以调整Arduino内部的一个值,我们可以将其用作音量控制。
usb
Arduino IDE
如果您尚未设置Arduino IDE, 您可以点击此处查看之前的指南
usb

您还需要一根微型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()函数来发送的。该命令还可用于诸如媒体暂停、媒体播放或静音等工作。您可以尝试添加更多的输入元件,如按钮,并调整草图对其进行使用。
usb
接线
现在您已经了解代码是如何工作的了,接下来可以将草图上传到您的Arduino Leonard。上传后,您可以开始连接电位器。这个项目的接线很简单:
● 将电位器的第一个引脚连接到GND。
● 将中间引脚连接到模拟引脚A0。
● 将电位器的最后一个引脚连接到5V引脚。
● 将Leonardo上的微型USB端口连接到计算机
虽然在许多Arduino项目中,只要有电源,就可以在不使用计算机的情况下运行,但是在本项目中,很显然是需要连接计算机的。
在使用此版本的草图时,最好在首次启动Arduino时将计算机音量和控制盘都设置为零。但是,为了使其更加灵活,您也可以尝试添加Consumer 库中的其他命令来自动调低系统音量,以便您在首次连接使用时将其与您的控制盘同步。

usb
DevicePlus 编辑团队
设备升级版适用于所有热爱电子和机电一体化的人。

审核编辑 黄宇

 


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分