2013-04-04 14 views
5

Recentemente ho messo le mani su un Arduino (Uno), e mi stavo chiedendo qualcosa.Usa i segnali Arduino come input per PC?

Non ho alcun commutatore di volume esterno per i miei diffusori, quindi ho pensato, forse, collegare un potenziometro all'Arduino e quindi usarlo per controllare il volume (in Windows). Ma è possibile?

Per leggere un valore di un pin Arduino utilizzando forse Visual C, C++ (o un altro linguaggio 'multipiattaforma')? E poi usando quello per impostare il livello del volume in Windows (e se è possibile anche in Linux).

ho pensato che potrebbe essere possibile, perché se si utilizza:

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

è possibile ottenere i valori del potenziometro al PC (via USB). Quindi c'è un modo per leggere quei valori in C o C++?

So come impostare il volume in Windows tramite C o C++, ho solo bisogno di sapere se c'è un modo per leggere i valori di un potenziometro in uno script (Visual) C o C++.

+1

È possibile aprire la porta COM appropriata e utilizzare la comunicazione seriale tra PC e Arduino. – helloworld922

risposta

6

Definitivamente. E usando esattamente lo stesso metodo: comunicazione seriale. Dato che non sono un grande esperto di Windows, non posso scriverti un esempio completo di Windows, ma qui ci sono alcuni frammenti che possono farti iniziare su un Unix (Linux, OS X, ecc.):

Codice su 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 
} 

codice sul computer:

#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); 
} 
+0

Grazie! Il codice funziona, ma non riesco a trovare un modo per ottenere il giusto valore. Il mio Arduino ora usa un comando 'Serial.println()' per inviare una variabile tra 0 e 100 al pc.Ma per qualche ragione, stampare la variabile sullo schermo con 'std :: cout << byte;' funziona bene, ma come faccio a inserirli in una variabile che posso usare per impostare il volume? Ho provato un sacco di cose, ma niente funziona fino ad ora ... (Il mio codice Arduino: http://pastebin.com/JXetGJvh, Il mio codice C++: http://pastebin.com/95K4R1jQ) – Jers

+0

@brickmasterj I Sono sicuro che l'API di Windows fornisce funzioni per l'impostazione del volume di sistema. –

+0

Lo so, e su Linux c'è anche un'API, ma non è questo il mio punto; il mio punto è che non riesco a ottenere la variabile stampata in una variabile che posso quindi utilizzare per impostare il volume. Perché la variabile 'byte' nel codice contiene la maggior parte delle volte niente o un'interruzione di riga. Ma non so come gestirlo, oltre a stamparlo. – Jers

0

ci sono alcune cose da considerare.

  • Si desidera che il PC ascolti solo il "potenziometro Arduino". Non vuoi che ascolti dati USB casuali provenienti da qualsiasi porta. È necessario creare un protocollo dati che sia in qualche modo unico per il tuo dispositivo. Se si inviano semplicemente delle letture analogiche, si otterranno dati grezzi come "123 128 133 145", che potrebbero significare qualsiasi cosa e provenire da qualsiasi tipo di dispositivo.

  • Quando si digita Serial.whatever, è probabile che Arduino emetta un segnale UART. Non so nulla di Arduino, ma spero che abbia a bordo un circuito RS-232 o USB. Avrai bisogno di una porta corrispondente sul PC, il tradizionale connettore D-sub a 9 pin RS-232 sta diventando sempre più raro sui computer moderni. Potrebbe essere necessario un convertitore da RS-232 a USB.

  • È necessario un media per determinare a quale porta COM è connesso il dispositivo. Le porte USB e le tradizionali porte RS-232 funzionano allo stesso modo, per quanto riguarda il PC. Lascia che l'utente scelga manualmente la porta o progetta un algoritmo più intelligente per trovare la porta in cui è connesso il tuo dispositivo.

  • Studio dell'API di Windows per tutte le routine di porta seriale. Documentazione ed esempi allo MSDN.