使用Arduino信号作为PC的输入?

时间:2013-04-04 08:51:10

标签: c++ c windows arduino

我最近得到了一个Arduino(Uno),我想知道一些事情。

我的扬声器没有外接音量调节器,所以我想,也许连接一个电位器到Arduino,然后用它来控制音量(在Windows中)。但这可能吗?

使用Visual C,C ++(或更多'多平台'语言)读取Arduino引脚的值?然后使用它在Windows中设置音量级别(如果在Linux中也是如此)。

我认为这可能是有可能的,因为如果你使用:

Serial.println(analogRead([pin with potentiometer]));

您可以将电位计的值输入到电脑(通过USB)。那么有没有办法在C或C ++中读取这些值?

我知道如何通过C或C ++在Windows中设置音量,我只需要知道是否有办法在(Visual)C或C ++脚本中读出电位计的值。

2 个答案:

答案 0 :(得分:6)

当然。并使用完全相同的方法:串行通信。由于我不是一个优秀的Windows专家,我不能给你写一个完整的Windows示例,但这里有一些片段可能会让你开始使用Unix(Linux,OS X等):

Arduino上的代码:

#define POT_PIN 1

void setup()
{
    Serial.begin(9600); // 9600 baud is more than enough
}

void loop()
{
    int pot = analogRead(POT_PIN);
    unsigned char byte = (pot + 2) >> 2; // round and divide by 4
    Serial.write(pot);
    delay(100); // or do something useful
}

计算机上的代码:

#include <termios.h>

struct termios tio;
memset(&tio, 0, sizeof(tio));

// Open serial port in mode `8N1', non-blocking
tio.c_cflag = CS8 | CREAD | CLOCAL;
tio.c_cc[VMIN] = 1;
tio.c_cc[VTIME] = 5;

int fd = open(device, O_RDONLY);

cfsetospeed(&tio, B9600);
cfsetispeed(&tio, B9600);
tcsetattr(fd, TCSANOW, &tio);

while (1) {
    unsigned char byte;
    read(fd, &byte, 1);
    use_some_library_to_set_volume(byte);
}

答案 1 :(得分:0)

有些事情需要考虑。

  • 您希望PC只能收听“电位器Arduino”。您不希望它收听任何端口的任何随机USB数据。需要创建一个对您的设备有些独特的数据协议。如果您只是垃圾模拟读数,您将获得一些原始数据,如“123 128 133 145”,这可能意味着什么,并且来自任何类型的设备。

  • 当您键入Serial.whatever时,Arduino可能会吐出UART信号。我对Arduino一无所知,但希望它上面有RS-232或USB电路。您将需要PC上的匹配端口,传统的RS-232 9针d-sub连接器在现代计算机上越来越少见。您可能需要RS-232转USB转换器。

  • 您需要一个意思来确定设备连接到哪个COM端口。就PC而言,USB端口和传统RS-232端口的工作原理相同。让用户手动选择端口,或设计更智能的算法来查找设备所连接的端口。

  • 研究所有串行端口例程的Windows API。 MSDN上的文档和示例。