2012-06-05 9 views
8

मैंने एक प्रोग्राम बनाया है जो मेरे Arduino को डेटा भेजता है जो पता लगाता है कि क्या भेजा गया था और फिर कुंजी पिन दबाए जाने के बाद सही पिन चालू करता है।सीरियल पोर्ट काम नहीं कर रहा है?

मेरी खिड़कियां कंप्यूटर से Arduino सॉफ्टवेयर arduino स्केच ठीक काम करता है का उपयोग कर, मैं प्रत्येक पिन मोड़ पर और बंद या तो किया गया था या भेजने डी

द्वारा जब arduino चमक पर नोड के माध्यम से भेजने RX प्रकाश कर सकते हैं लेकिन कुछ और नहीं होता है।

क्या कोई मदद कर सकता है?

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

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

अद्यतन, इसके दिखने से Arduino उपलब्ध सीरियल पोर्ट का पता नहीं लगा रहा है। मुझे नहीं पता कि इससे मदद मिलती है या नहीं। –

+0

मेरा पहला विचार यह है कि सीरियल पोर्ट का पता लगाया गया है और काम कर रहा है (फ्लैशिंग के कारण)। मेरा अनुमान भेजने के अंत में है। "ComEmulDrv3" googling का प्रयास करें। यह आपको एक आभासी कॉम्पोरेट स्थापित करने देता है जिससे आप यह सत्यापित कर सकें कि आप क्या भेज रहे हैं। देखने के लिए चीजें चरित्र एन्कोडिंग और सफेद जगह शामिल हैं। – cstrutton

उत्तर

9

मैं हाल ही में इस में हाथ आजमाया। Arduino आईडीई के अलावा अधिकांश चीजों से सीरियल संचार प्राप्त करते समय Arduino स्वचालित रूप से रीसेट करता है। यही कारण है कि आप आईडीई से भेज सकते हैं लेकिन node.js. नहीं

मेरे पास एक यूनो है और रीसेट और ग्राउंड के बीच संधारित्र लगाया गया है। यहां एक पृष्ठ है जो विषय पर कुछ अच्छी जानकारी के साथ है।
शुभकामनाएं। http://arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection

+0

हम्म, लेकिन उदाहरण भी आपको Arduino को रीबूट करने के लिए कहते हैं: एस –

+0

आईडीई कोड अपलोड करने के लिए, इसे Arduino को रीबूट करने में सक्षम होना चाहिए। इसलिए, जब भी आप कोई अपलोड करते हैं, तो आपको संधारित्र को हटाना होगा, इसे अपलोड करने दें, फिर क्रमशः काम करने के लिए संधारित्र के लिए संधारित्र को प्रतिस्थापित करें (पुनरारंभ किए बिना)। आपका कोड अच्छा दिखता है, खासकर अगर यह आईडीई से सीरियल डेटा भेजते समय ठीक से काम करता है। – ZnArK

+0

हम्म, लेकिन आईडीई का उपयोग करते समय यह भेजता है, नोड का उपयोग करते समय यह नहीं करता है। फिलहाल मैं एक तर्क स्तर कनवर्टर की प्रतीक्षा कर रहा हूं, इसलिए मैं इसे अपने रास्पबेरी पीआई पर सीरियल पोर्ट्स के साथ उपयोग कर सकता हूं। यदि यह तब होता है जब मैं ऐसा करता हूं तो मैं फिर से पोस्ट करूंगा;) –

1

संधारित्र पर और समस्या को रीसेट करें ... सीरियल नियंत्रण रेखाओं में से एक के बीच एक छोटा संधारित्र है और बाद के मॉडल में Arduino पर रीसेट किया गया है। बंदरगाह खोले जाने पर यह संधारित्र Arduino को रीसेट करने का कारण बनता है लेकिन अन्यथा सामान्य सीरियल ऑपरेशन में हस्तक्षेप नहीं करता है।

यह रीसेट चाल अपलोड प्रक्रिया के हिस्से के रूप में कोड को अपलोड करने की अनुमति देता है। जब Arduino शुरू होता है तो कोड बूट लोडर लोड कोड से पहले थोड़े समय के लिए पहले चलता है।

अपलोड प्रक्रिया है: बूट लोडर शुरू करने वाले Arduino को रीसेट करें, Arduino IDE में अपलोड प्रक्रिया शुरू करें, संचार स्थापित करें, अपलोड करें, फिर लोड कोड चलाएं। जब Arduino शुरू होता है तो यह थोड़े समय के लिए अपलोड की प्रतीक्षा करता है, अगर कोई प्राप्त नहीं होता है, तो यह कोड चलाने के लिए आगे बढ़ता है।

मुझे यह बहुत उपयोगी लगता है क्योंकि यह हमें पोर्ट बंद करने और खोलने के द्वारा प्रभावी रूप से Arduino को रीसेट करने की अनुमति देता है। पुरानी Arduino में, इस संधारित्र के बिना, कोड अपलोड करने के लिए आपको सही समय पर रीसेट बटन दबा देना था। और समय ऐसा था कि अपलोड किए गए कोड से शुरू होने से पहले Arduino ने और अधिक समय इंतजार किया।

यहां वर्णित समस्या में, मुझे विश्वास नहीं है कि रीसेट की गई चाल के कारण उसे कोई परेशानी हो रही थी। जब उसने सीरियल बंदरगाह खोला, और उसकी जानकारी के दिखने से, Arduino को रीसेट करने का केवल प्रभाव होना चाहिए था, यह वांछित दुष्प्रभाव है।

1

मैं यूएसबी के माध्यम से या बीटी के माध्यम से अपने Arduino में कार्रवाई भेजने के लिए दैनिक आधार पर नोड का उपयोग करता हूं और यह दोनों मामलों में महान काम करता है। मुझे लगता है कि आपकी समस्या पत्र भेजने से आता है। आप बस ऐसे ही पत्र की ascii मूल्य के साथ बजाय एक बफर भेजना चाहिए,,:

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

भी, इस के लिए, मैं डेटा हेडर के साथ लगता है, तो आप कुछ "तर्क" इंटरफेस के साथ बेहतर होगा, की संख्या कार्रवाई, उस तरह की चीजें। यह आपके लिए आवश्यक नहीं है लेकिन यह भविष्य में संशोधित करने के लिए आपके कोड को और अधिक मजबूत और आसान बना देगा।

यहां एक उदाहरण है कि मैं इसे कैसे करता हूं। सबसे पहले, नोड:

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; 

तरह तुमने किया था फिर आप उन्हें फोन:

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

इस तरह यह Arduino Serial.read करने के लिए() के आंकड़ों पर आसान है: (ध्यान दें कि आप परिभाषित करने की जरूरत डेटा हेडर और डेटा फ़ूटर कहीं)

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

मुझे आशा है कि मैं स्पष्ट हूं और मुझे उम्मीद है कि इससे मदद मिलती है! चीयर्स!