2012-06-05 36 views
8

Hice un programa que envía datos a mi Arduino que detecta lo que se envió y luego enciende el pin correcto de acuerdo con la tecla que se presiona.¿El puerto serie no funciona?

Cuando se utiliza el software de Arduino de mi equipo con Windows el boceto Arduino funciona bien, puedo hacer que cada vez pasador de encendido y apagado, ya sea mediante el envío fue o D.

Cuando se envía a través del nodo de la luz RX en el Arduino parpadea pero nada más sucede.

¿Alguien puede ayudar? programa

Node.js:

var httpServer = require('http').createServer(function(req, response){ /* Serve your static files */ }) 
httpServer.listen(8080); 

var nowjs = require("now"); 
var everyone = nowjs.initialize(httpServer); 

everyone.now.logStuff = function(msg){ 
    console.log(msg); 
} 

var SerialPort = require('serialport2').SerialPort; 
var assert = require('assert'); 

var portName; 

if (process.platform == 'win32') { 
    portName = 'COM4'; 
} else if (process.platform == 'darwin') { 
    portName = '/dev/cu.usbserial-A800eFN5'; 
} else { 
    portName = '/dev/ttyUSB0'; 
} 

var readData = ''; 
var sp = new SerialPort(); 

sp.on('close', function (err) { 
    console.log('port closed'); 
}); 

sp.on('error', function (err) { 
    console.error("error", err); 
}); 

sp.on('open', function() { 
    console.log('port opened... Press reset on the Arduino.'); 
}); 

sp.open(portName, { 
    baudRate: 9600, 
    dataBits: 8, 
    parity: 'none', 
    stopBits: 1, 
    flowControl: false 
}); 

everyone.now.forward = function() { 
sp.write("w"); 
} 

everyone.now.back = function() { 
sp.write("s"); 
} 

everyone.now.left = function() { 
sp.write("a"); 
} 

everyone.now.right = function() { 
sp.write("d"); 
} 

sp.on('data', function(data) { 
    console.log(data.toString()); 
}); 

Programa Arduino:

void setup(){ 
    Serial.begin(9600); 
    Serial.write("READY"); 
    //Set all the pins we need to output pins 
    pinMode(8, OUTPUT); 
    pinMode(9, OUTPUT); 
    pinMode(10, OUTPUT); 
    pinMode(11, OUTPUT); 
} 

void loop(){ 
    if (Serial.available() > 0) { 

    //read serial as a character 
    char ser = Serial.read(); 
    Serial.write(ser); 
    //NOTE because the serial is read as "char" and not "int", the read value must be compared to character numbers 
    //hence the quotes around the numbers in the case statement 
    switch (ser) { 
     case 'w': 
     move(8); 
     break; 
     case 's': 
     move(9); 
     break; 
     case 'a': 
     move(10); 
     break; 
     case 'q': 
     move(10); 
     move(8);   
     break; 
     case 'd': 
     move(11); 
     break; 
     case 'e': 
     move(11); 
     move(8); 
     break; 
    } 
    } 
} 

void move(int pin){ 
    Serial.print(pin); 
    digitalWrite(pin, HIGH); 
    delay(1); 
    digitalWrite(pin, LOW); 
} 
+0

Actualización, por lo que parece, el arduino no está detectando el puerto en serie como está disponible. No sé si eso ayuda. –

+0

Mi primer pensamiento es que el puerto en serie se detecta y funciona (debido al led parpadeante). Mi conjetura está en el extremo enviado. Intenta buscar en Google "ComEmulDrv3". Debe permitirle configurar un dispositivo virtual que le permita verificar su envío. Lo que debe buscar es la codificación de caracteres y el espacio en blanco. – cstrutton

Respuesta

9

que recientemente incursionó en esto. El Arduino se reinicia automáticamente cuando recibe comunicación serial de la mayoría de las cosas que no sean Arduino IDE. Es por esto que puedes enviar desde el IDE pero no a node.js.

Tengo un Uno y pongo un condensador entre Reset y Ground. Aquí hay una página con buena información sobre el tema.
Buena suerte. http://arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection

+0

Hmm, pero los ejemplos incluso le piden que reinicie el arduino: S –

+0

Para que el IDE cargue el código, tiene que poder reiniciar el Arduino. Por lo tanto, siempre que realice una carga, debe quitar el condensador, dejarlo cargar y luego reemplazar el capacitor para que funcione en serie (sin reiniciar). Su código se ve bien, especialmente si funciona correctamente al enviar datos en serie desde el IDE. – ZnArK

+0

Hmm, pero cuando se utiliza el IDE que envía, cuando se utiliza el nodo No lo hace. Por el momento estoy esperando un convertidor de nivel lógico para poder usarlo con los puertos serie de mi Raspberry Pi. Si no funciona cuando lo hago, entonces volveré a publicar;) –

1

En el condensador y reinicie el problema ... Hay un pequeño condensador entre una de las líneas de control en serie y restablecer en el Arduino en los modelos posteriores. Este condensador hace que el Arduino se reinicie cuando se abre el puerto, pero de lo contrario no interfiere con la operación en serie normal.

Este truco de reinicio permite que la carga del código restablezca el Arduino como parte del proceso de carga. Cuando el Arduino se inicia, el cargador de arranque de código se ejecuta primero durante un corto tiempo antes de que se ejecute el código cargado.

El proceso de carga es: Restablezca el Arduino que inicia el gestor de arranque, inicie el proceso de carga en Arduino IDE, establezca las comunicaciones, cargue y ejecute el código cargado. Cuando el Arduino se inicia espera las cargas durante un corto período de tiempo, si no se recibe ninguna, pasa a ejecutar el código.

Me parece muy útil, ya que nos permite restablecer efectivamente el Arduino simplemente cerrando y abriendo el puerto. En el antiguo Arduino, sin este condensador, tenía que presionar el botón de reinicio en el momento adecuado para que el código se cargue. Y el momento fue tal que el Arduino pasó mucho más tiempo esperando antes de que comenzara con el código cargado.

En el problema que aquí se describe, no creo que haya tenido problemas debido al truco de reinicio utilizado. Debería haber tenido solo el efecto de restablecer el Arduino cuando abrió el puerto serie, y por el aspecto de su información, este es un efecto secundario deseado.

1

Uso el nodo diariamente para enviar acciones a mi Arduino a través de usb o vía bt y funciona muy bien en ambos casos. Creo que su problema proviene de enviar cartas. Usted debe enviar una memoria intermedia en cambio, con el valor ASCII de la letra, al igual que:

myPort.write(Buffer([myValueToBeSent])); 

también, por esto, creo que sería mejor con un poco de interfaz "lógica", con las cabeceras de datos, el número de acciones, cosas así. No es necesario para usted, pero hará que su código sea más robusto y fácil de modificar en el futuro.

Aquí hay un ejemplo de cómo lo hago. En primer lugar, el Nodo:

var dataHeader = 0x0f, //beginning of the data stream, very useful if you intend to send a batch of actions 
myFirstAction = 0x01, 
mySecondAction = 0x02, 
myThirdAction = 0x03; 

A continuación, los llaman igual que lo hizo:

everyone.now.MyBatchOfActions = function() { 
    sp.write(Buffer([dataHeader])); 

    sp.write(Buffer([0x03])); // this is the number of actions for the Arduino code 

    sp.write(Buffer([myFirstAction])); 
    sp.write(Buffer([mySecondAction])); 
    sp.write(Buffer([myThirdAction])); 
} 

De esta manera es fácil en el Arduino para Serial.read() los datos: (Tenga en cuenta que es necesario definir encabezado de datos y pie de página de datos en algún lugar)

void readCommands(){ 
    while(Serial.available() > 0){ 

     // Read first byte of stream. 
     uint8_t numberOfActions; 
     uint8_t recievedByte = Serial.read(); 

     // If first byte is equal to dataHeader, lets do 
     if(recievedByte == DATA_HEADER){ 
      delay(10); 

      // Get the number of actions to execute 
      numberOfActions = Serial.read(); 

      delay(10); 

      // Execute each actions 
      for (uint8_t i = 0 ; i < numberOfActions ; i++){ 

       // Get action type 
       actionType = Serial.read(); 

       if(actionType == 0x01){ 
        // do you first action 
       } 
       else if(actionType == 0x02{ 
        // do your second action 
       } 
       else if(actionType == 0x03){ 
        // do your third action 
       } 
      } 
     } 
    } 
} 

Espero que esté claro y espero que ayude! ¡Salud!

Cuestiones relacionadas