Comunicando Wiring y su programa de C++

por Andres Burbano, University of California Santa Barbara.

Este tutorial muestra como leer datos seriales desde el hardware Wiring codificado en C/C++ en máquinas basadas en UNIX (OSX y Linux), los ejemplos leen datos desde la tarjeta Wiring donde están conectados un sensor de ultrasonido ping o un potenciómentro.

Equipamento:

Será necesario un ping de ultrasonido parallax (digital) o el potenciómetro (análogo). Esto no ha sido probado en Windows.

 

Proceso:

Paso 0. Conecte la tarjeta I/O Wiring usando un cable USB a su computador, conecte el sensor de ultrasonido ping y/o la resistencia variable a la tarjeta I/O Wiring. El ultrasonido ping va al pin digital uno, y el potenciómetro va al pin análogo uno. Paso uno: Programe la tarjeta I/O Wiring con el lenguaje Wiring , el modo más fácil es usar los ejemplos que están publicados en la sección de Learning para leer datos desde el ping o el potenciómetro (son diferentes).

Ejemplo para leer desde un Parallax ping
Ejemplo Potenciómetro

Código para el Sensor de Ultrasonido Ping / sensor PING Parallax

Paso 2. Identifique en su computador el puerto Serial creado cuando la tarjeta I/O Wiring es conectada. Es posible solo revisando el menú Tools / Serial Port antes y después de conectar la tarjeta para identificar el puerto correspondiente, seleccione de la lista el más apropiado. Debe ser algo como esto: tty.usbserial-0000103D

Paso 3. Inicie su rutina en C/C++ incluyendo las siguiente librerías:

#include <iostream> 
#include <fcntl.h> 
#include <termios.h> 


#define USB_SERIAL_PORT "/dev/tty.usbserial-0000103D" // (OSX Power Book) 
//#define USB_SERIAL_PORT  "/dev/cu.usbserial-3B1" // (OSX Mac Book) 
//#define USB_SERIAL_PORT "/dev/tty.usbserial-0000103D" // (Linux Ubuntu Mac Book) 
//#define USB_SERIAL_PORT "/dev/tty.usbserial-0000103D" 
    

Paso 4. Cree una función como esta para leer los datos y analizar la información desde el puerto serial: Para el ping Ultrasonido es algo así:

int port_fd; 
int init_serial_input (char * port) {   
  int fd = 0;   
  struct termios options;   

  fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY);   
  if (fd == -1)     
    return fd;   
    fcntl(fd, F_SETFL, 0);    // clear all flags on descriptor, enable direct I/O   
    tcgetattr(fd, &options);   // read serial port options   
    // enable receiver, set 8 bit data, ignore control lines   
    options.c_cflag |= (CLOCAL | CREAD | CS8);    
    // disable parity generation and 2 stop bits   
    options.c_cflag &= ~(PARENB | CSTOPB);  
    // set the new port options   
    tcsetattr(fd, TCSANOW, &options);      
    return fd; 
}
    

Paso 5. Tranforma la información que recibe desde ASCII a otro tipo, en este caso a entero

int read_serial_int (int fd) {     
  char ascii_int[8] = {0};     
  char c = NULL;     
  int i = 0;     

  read(fd, &c, 1);         
  //while (c != '\n')     
  while (c != ' ')  {         
    ascii_int[i++] = c;         
    read(fd, &c, 1);     
  }     
  return atoi(ascii_int); 
} 
    

NOTA: Hay una pequeña diferencia entre el Potenciómetro y el Ping de Ultrasonido en la línea: while (c != ' ') Para el ping de ultrasonido es: while (c != '\n') Para el potenciómetro es: while (c != ' ')

Paso 6. Luego puede hacer operaciones para obtener los valores específicos que necesita, este es solo un ejemplo:

void sound() {              
  data.val = read_serial_int(port_fd);                                     
  if (data.val >= 0 && data.val <= 8000)  {                          
    if (data.val > 2000)                              
      data.val2 = -((8000 - data.val) / 10000.0f);                          
    else                          
      data.val2 = (data.val) / 1000.0f;                                         
    data.val3 = (data.val) / 10000.0f;                          
    cout << data.val3 << endl;                      
  }                      
}                            
    

Paso 7. Finalmente dentro de la función main debe haber el siguiente código que realmente inicializa la entrada serial

port_fd = init_serial_input(USB_SERIAL_PORT);                 
// serial is checked              
if (port_fd == -1)  {                  
  cout << "Couldn't open USB port" << endl;              
}                       
    

Disfrute, y contribuya!!! vea los ejemplos aquí:

Paradiso un modelado básico 3D en OpenGL de estructura "Paradiso" como es descrito en la "Divina Commedia" por Dante Alighieri (El orden de las esferas de "Paradiso" es: Luna, Mercurio, Venus, Sol, Marte, Jupiter, Saturno, Estrellas, Primum Mobile y Empyrean). Paradiso es también un intento de explorar la posibilidad de transladar la experiencia de vuelo usando un escenario virtual y una entrada externa, porque funciona con un sensor de ultrasonido ping que mide la diferencia de movimiento de la distancia de la mano del usuario respecto al sensor. El sensor no es invasivo por lo tanto el usuario puede interactuar con su movimiento. Paradiso es un sketch para una instalación interactiva.

Square_Rot es un sketch de un herrramienta de perfomance interactivo en tiempo real (audio y video). El objetivo del proyecto es usando la integración de entradas seriales en C++ y un micrófono como entrada tranformando elementos en Opengl, generando síntesis básicas de audio usando PortAudio. Realmente es ruido.

Gracias especiales a: amar, newman, shear y villegas