2012-06-05 18 views
8

Ich habe ein Programm erstellt, das Daten an mein Arduino sendet, das erkennt, was gesendet wurde, und dann den richtigen Pin entsprechend der gedrückten Taste einschaltet.Serielle Schnittstelle funktioniert nicht?

Wenn die Arduino Software von meinem Windows-Computer mit der Arduino Skizze gut funktioniert, kann ich jeden Stift wiederum machen und Ausschalten durch das Senden entweder war, oder D.

Wenn über den Knoten des RX Licht auf die Arduino blinkt Senden aber nichts anderes passiert.

Kann jemand helfen?

Node.js Programm:

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()); 
}); 

Arduino Programm:

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

Update, Durch das Aussehen des Arduino erkennt die serielle Schnittstelle nicht als verfügbar. Ich weiß nicht, ob das hilft. –

+0

Mein erster Gedanke ist, dass die serielle Schnittstelle erkannt und funktioniert (aufgrund der blinkenden LED). Meine Vermutung ist auf der Sendungsseite. Versuchen Sie, "ComEmulDrv3" zu googeln. Damit können Sie einen virtuellen Comport einrichten, mit dem Sie überprüfen können, was Sie gesendet haben. Zu den Dingen, nach denen gesucht werden muss, gehören Zeichenkodierung und Leerzeichen. – cstrutton

Antwort

9

ich vor kurzem in dieses versucht. Der Arduino wird automatisch zurückgesetzt, wenn er serielle Kommunikation von den meisten anderen Dingen als der Arduino IDE empfängt. Aus diesem Grund können Sie von der IDE aus senden, aber nicht von node.js.

Ich habe eine Uno und setzen einen Kondensator zwischen Reset- und Ground.Here ist eine Seite mit ein paar gute Informationen zu diesem Thema.
Viel Glück. http://arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection

+0

Hmm, aber die Beispiele fordern Sie sogar zum Neustart des Arduino: S –

+0

Damit die IDE Code hochladen, muss es in der Lage sein, den Arduino neu zu starten. Also, wenn Sie einen Upload machen, müssen Sie den Kondensator entfernen, lassen Sie es hochladen, dann ersetzen Sie den Kondensator für die serielle ordnungsgemäß funktionieren (ohne Neustart). Ihr Code sieht gut aus, besonders wenn es beim Senden serieller Daten von der IDE richtig funktioniert. – ZnArK

+0

Hmm, aber wenn Sie die IDE verwenden, sendet es, wenn Knoten verwendet es nicht. Im Moment warte ich auf einen Logic Level Converter, damit ich ihn mit den seriellen Anschlüssen meines Raspberry Pi verwenden kann. Wenn es nicht funktioniert, wenn ich das mache, werde ich wieder posten;) –

1

Auf dem Kondensator und Reset-Problem ... Es gibt einen kleinen Kondensator zwischen einer der seriellen Steuerleitungen und Reset auf dem Arduino in den späteren Modellen. Dieser Kondensator bewirkt, dass der Arduino zurückgesetzt wird, wenn der Port geöffnet wird, aber ansonsten den normalen seriellen Betrieb nicht beeinträchtigt.

Dieser Reset-Trick ermöglicht das Hochladen des Codes, um den Arduino als Teil des Upload-Prozesses zurückzusetzen. Wenn der Arduino gestartet wird, wird der Code-Bootloader zunächst für kurze Zeit ausgeführt, bevor der geladene Code ausgeführt wird.

Der Upload-Prozess ist: das Arduino zurücksetzen, die den Bootloader gestartet wird, starten Sie den Upload-Prozess in der Arduino IDE, stellen Sie die Kommunikation hoch laden, führen Sie den Code geladen. Wenn der Arduino hochfährt, wartet er für kurze Zeit auf Uploads. Wenn keine Daten empfangen werden, wird der Code ausgeführt.

Ich finde dies sehr nützlich, da es uns ermöglicht, den Arduino durch Schließen und Öffnen des Ports effektiv zurückzusetzen. In den alten Arduino, ohne diesen Kondensator, mussten Sie den Reset-Knopf zur richtigen Zeit drücken, um den Code zum Hochladen zu bekommen. Und das Timing war so, dass der Arduino viel mehr Zeit brauchte, bevor er mit dem hochgeladenen Code anfing.

Im hier beschriebenen Problem, glaube ich nicht, dass er aufgrund des Reset-Tricks verwendet, um irgendwelche Probleme hat. Es hätte nur den Effekt gehabt, den Arduino zurückzusetzen, als er die serielle Schnittstelle öffnete, und aus dem Aussehen seiner Informationen ist dies ein gewünschter Nebeneffekt.

1

Ich benutze Knoten auf einer täglichen Basis Aktionen zu meinem Arduino über USB zu senden oder über bt und es funktioniert super in beiden Fällen. Ich denke, dein Problem kommt vom Senden von Briefen. Sie sollten einen Puffer stattdessen mit dem ASCII-Wert des Briefes, einfach so senden:

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

auch, denn dies ist, ich glaube, Sie besser wäre mit etwas „Logik“ Schnittstelle, mit Daten-Header, die Anzahl der Aktionen, solche Sachen. Es ist nicht erforderlich für Sie, aber es macht Ihren Code robuster und einfacher in der Zukunft zu ändern.

Hier ist ein Beispiel, wie ich es mache. Zuerst Knoten:

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; 

Sie sie dann rufen Sie wie Sie haben:

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])); 
} 

diese Weise ist es auf dem Arduino zu Serial.read leicht() die Daten: (Beachten Sie, dass Sie definieren müssen Datenheader und Datenfuß irgendwo)

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

Ich hoffe, ich bin klar und ich hoffe, es hilft! Prost!

Verwandte Themen