2010-11-06 13 views
7

पर बाइट लिखें, मैं अपने Ardunio में धारावाहिक बंदरगाह पर एक पूर्णांक भेजने की कोशिश कर रहा हूँ। चिप तब एलईडी पर बाइनरी में संख्या प्रदर्शित करने जा रहा है। हालांकि मुझे धारावाहिक बंदरगाह पर एक बाइट के रूप में डेटा भेजने की कोशिश करने में बहुत परेशानी हो रही है, जहां तक ​​मैं निम्नलिखित कोड डीबग कर सकता हूं इसे एएससी चार मानों के रूप में भेजता है।रूबी से रूडी से Arduino

क्या कोई मुझे सही दिशा में इंगित कर सकता है या गलती को देख सकता है? मैं वास्तव में इसकी सराहना करता हूं। मैं लंबे समय से इस पर अपने बालों को खींच रहा हूं।

रूबी

require 'rubygems' 
require 'serialport' # use Kernel::require on windows, works better. 

#params for serial port 
port_str = "/dev/tty.usbserial-A700dZt3" #may be different for you 
baud_rate = 9600 
data_bits = 8 
stop_bits = 1 
parity = SerialPort::NONE 

sp = SerialPort.new(port_str, baud_rate, data_bits, stop_bits, parity) 

i = 15 

#just write forever 
while true do 
    sp.write(i.to_s(2)) 
    sleep 10 
end 

Arduino

int ledPin = 10; 
int ledPin1 = 11; 
int ledPin2 = 12; 
int ledPin3 = 13; 

byte incomingByte; // for incoming serial data 

void setup() { 
    pinMode(ledPin, OUTPUT); // initialize the LED pin as an output: 
    pinMode(ledPin1, OUTPUT); // initialize the LED pin as an output: 
    pinMode(ledPin2, OUTPUT); // initialize the LED pin as an output: 
    pinMode(ledPin3, OUTPUT); // initialize the LED pin as an output: 
    Serial.begin(9600); 
    Serial.println("I am online"); 
} 

void loop() { 
// send data only when you receive data: 
if (Serial.available() > 0) { 
    incomingByte = Serial.read(); 
      Serial.println(incomingByte, DEC); 

    int value = (incomingByte, DEC) % 16; 
    digitalWrite(ledPin, (value >> 0) % 2); 
    digitalWrite(ledPin1, (value >> 1) % 2); 
    digitalWrite(ledPin2, (value >> 2) % 2); 
    digitalWrite(ledPin3, (value >> 3) % 2); // MSB 

} 

} 
+0

क्या आपने रूबी के बजाय टर्मिनल प्रोग्राम का उपयोग करने का प्रयास किया है? क्या यह आपका पहला सेटअप है या क्या आपके पास पहले से कुछ काम कर रहा है? –

उत्तर

5

मुझे लगता है कि आप सभी एल ई डी को एक बार में प्रकाश देने के लिए मूल्य 15 लिखने की कोशिश कर रहे हैं।हालांकि, 15.to_s(2) "1111" है। चरित्र '1' का एएससीआईआई मूल्य 49 है, इसलिए 15 बार लिखने के बजाय आप तेजी से उत्तराधिकार में 49 बार लिख रहे हैं।

लिखने की कमांड जो आप खोज रहे हैं इसलिए शायद sp.putc(i) है। यह बाइनरी में व्यक्त मूल्य के ASCII स्ट्रिंग प्रस्तुति के बजाय दिए गए द्विआधारी मूल्य (= Arduino के लिए मशीन-पठनीय) के साथ केवल एक वर्ण लिखता है (= आपके लिए मानव-पठनीय)।

loop do 
    sp.putc(i) 
    puts 'Wrote: %d = %bb' % [ i, i ] 
    i = (i == 15) ? 0 : (i + 1) 
    sleep(10) 
end 

आप Arduino से प्रतिक्रियाओं को पढ़ने के लिए चाहते हैं, तो आप उपयोग कर सकते हैं जैसे:

तो सब कुछ किसी और ही रखते हुए, साथ अपने रूबी कोड में while पाश की जगह sp.gets टेक्स्ट की एक पंक्ति प्राप्त करने के लिए, उदा। sleep (और एक puts sp.gets से पहले लूप में puts 'Arduino replied: ' + sp.gets को लूप से पहले "मैं ऑनलाइन हूं" कनेक्शन को पहली बार स्थापित होने पर पढ़ने की कोशिश करने का प्रयास करें)।

संपादित करें: मैं सिर्फ अपने कोड में एक और समस्या पाई थी Arduino तरफ: value = (incomingByte, DEC) % 16; हमेशा मूल्य 10 क्योंकि (incomingByte, DEC) मूल्य DEC (जो 10) है का परिणाम है। आपको इसके बजाय value = incomingByte % 16; का उपयोग करना चाहिए। या value से पूरी तरह से दूर करें और incomingByte स्वयं संशोधित करें, उदा। incomingByte %= 16;

+0

माइक्रोकंट्रोलर पर मामूली अनुकूलन के रूप में, आपके पिन असाइनमेंट के साथ 10-13 आप 'डिजिटलवाइट' लाइनों को एक (एक) 'PORTB = ((आने वाली बाइट और 0x0F) << 2) | (पीओटीबी और 0xC3); '। – Arkku

+0

मैं इस उत्तर का समर्थन कर रहा हूं, इसमें सबसे अधिक है जो मैं कहने जा रहा था। इसके अलावा, हालांकि, 'डिजिटलवाइट (ledPin, (मान >> 0)% 2);' लाइनें एक मुद्दा हो सकती हैं। मुझे नहीं पता कि एचजीआईएच और लो मैप को 1 और 0 पर मानना ​​सुरक्षित है या नहीं और आमतौर पर पिन 13 का उपयोग करने के लिए एक iffy पिन है, क्योंकि यह प्रतिरोधी में बनाया गया है। –

+0

हां, 'HIGH' और 'LOW' नक्शा 0 और 1. के लिए मानचित्र = =) मानने के लिए _not_ सुरक्षित क्या है कि' PORTB' मानचित्र में बिट्स विशिष्ट भौतिक पिन पर हैं लेकिन यह एक अलग μC में जाने पर केवल एक समस्या है किस मामले में भौतिक कनेक्शन भी स्थानांतरित किया जा सकता है। (यदि 'PORTB' पर संबंधित पिन उपलब्ध हैं।) – Arkku

1

मैंने पहले

while true do 
    printf("%c", sp.getc) 
end 

बजाय sp.write(i.to_s) का उपयोग कर इस रूबी कोड काम किया है। ऐसा लगता है कि आप इसे एक स्ट्रिंग में स्पष्ट रूप से परिवर्तित कर रहे हैं, जो आपकी समस्याओं का कारण हो सकता है।

मैं मूल ब्लॉग पोस्ट मैं इस्तेमाल किया पाया: http://www.arduino.cc/playground/Interfacing/Ruby

1

यह बहुत देर से मैं सीरियल पोर्ट है कि मैं वहाँ मदद नहीं कर सकता के साथ कुछ भी किया है, लेकिन मैं एक बात क्यों दिखाई देता है।

>> 15.to_s #=> "15" 

और

>> 15.to_s(2) #=> "1111" 

मुझे लगता है कि अगर आप चाहते हैं बाइनरी मान आप "\xf" या "\u000F" चाहता हूँ भेजे जाने के लिए। यहाँ तार की लंबाई जा रहा है उत्पादन है,

while true do 
    sp.write(i.chr) # <-- this sends a single byte binary representation of the "i" value, NOT the ASCII. 
    sleep 10 
end 

अंतर दिखाने के लिए::

while true do 
    sp.write(i.to_s(2)) # <-- this sends a multi-character ASCII representation of the "i" value, NOT the binary. 
    sleep 10 
end 

रहे हैं:


से अपने कोड को बदलें

>> 15.to_s(2).size #=> 4 
>> 15.chr.size #=> 1 

और बाइट्स कॉम्प के दशमलव मान तारों को बढ़ाना:

>> 15.to_s(2).bytes.to_a #=> [49, 49, 49, 49] 
>> 15.chr.bytes.to_a #=> [15] 
+0

सुझाव के लिए धन्यवाद मैंने sp.write 9to_s (2) के साथ कोशिश की लेकिन यह अभी भी काम नहीं करना प्रतीत होता है। –

+1

खैर, '9 .to_s (2)' 9 का द्विआधारी प्रतिनिधित्व नहीं है। यह एक स्ट्रिंग प्रतिनिधित्व है। आपको कुछ "\ x9" 'या' "\ x0009" 'या' [9] .pack ('c') 'का उपयोग करना होगा। बाइनरी प्रतिनिधित्व और * बाइनरी होने की तरह दिखने के बीच एक अंतर है। –

1

आपकी समस्याएं बफरिंग के कारण हो सकती हैं। (लेखन से पहले) यह बनाने के बाद

  • Set sp to unbuffered: बफरिंग अक्षम करने के लिए, आप निम्न में से एक कार्य कर सकते हैं write
  • उपयोग unbuffered syswrite लिखने के बजाय बाद sp.sync = true
  • कॉल flush
+0

या बंदरगाह खोले जाने के तुरंत बाद 'sp.sync = true' सेट करें। –

+0

धन्यवाद, ग्रेग। संपादित। –

+0

सुझाव लोगों के लिए धन्यवाद Ive sp.sync = true जोड़ा गया है लेकिन यह अभी भी सही ढंग से काम नहीं कर रहा है –