पायथन 3 और मॉड्यूल धारावाहिक के माध्यम से Arduino UNO को नंबर कैसे भेजें


9

मैं Arduino (और सामान्य रूप से कंप्यूटर प्रोग्रामिंग) के लिए नया हूं, इसलिए मैं माफी मांगता हूं अगर यह प्रश्न मूर्खतापूर्ण लगता है।

एक बार जब मैंने एक बुनियादी arduino-LED कनेक्शन स्थापित किया, तो मुझे सीरियल पोर्ट के माध्यम से arduino में INTEGERS भेजने में समस्याएं हैं। मैं आसानी से 'm', 'o' वगैरह जैसे कैरेक्टर भेज सकता हूं। हालांकि, अगर मैं कोई नंबर भेजता हूं तो ऐसा लगता है कि यह बस नहीं मिलता।

यहाँ Arduino कोड है, आदर्श रूप में इसे अजगर या धारावाहिक मॉनिटर के माध्यम से USB पोर्ट से एक मान मिलना चाहिए और फिर मूल्य के अनुसार एलईडी की चमक को समायोजित करना चाहिए। (मान सीमा [0,255] में होना चाहिए)।

नोट: मैं ARDUINO UNO और PYTHON 3 का उपयोग कर रहा हूं

// --------------------------

int LED = 10;
int number;

void setup(){

pinMode(LED,OUTPUT);
Serial.begin(9600);
}

void loop(){

number = Serial.read();
Serial.print(number);
Serial.print('\n');
if(number == -1){
number = 0;
}

else if(number > 255){

number = 255;

}

else if(number < 0){

number = 0;
}

analogWrite(LED,number);
delay(1000);
}

हालाँकि, जब मैं सीरियल पोर्ट में या पायथन के माध्यम से एक मान इनपुट करता हूं, उदाहरण के लिए, यह मुझे 48 उत्तर के रूप में देता है (जो, दिलचस्प है, 0 के लिए एएससीआईआई कोड है!) और एलईडी को रोशनी देता है जो कि तब से नहीं होना चाहिए। 0 पर एलईडी बंद होना चाहिए !! मुझे कुछ याद आ रहा है लेकिन मुझे पता नहीं चल रहा है ... क्या आप मुझे बता सकते हैं कि क्या गलत है?

यहाँ मैं पायथन में उपयोग किए जाने वाला कोड है:

import serial
import time
try:
    arduino = serial.Serial(port,speed)
    time.sleep(2)
    print("Connection to " + port + " established succesfully!\n")
except Exception as e:
    print(e)

#Note: for characters such as 'a' I set data = b'a' to convert the data in bytes
#However the same thing does not work with numbers...
data = 0
data = arduino.write(valueToWrite)
time.sleep(2)
arduino.close()

मैं क्या गलत या गलत समझ रहा हूं? धन्यवाद।


1
कोशिश करेंarduino.write(chr(valueToWrite))
गेर्बिन

यह समाधान वर्णों के लिए भी काम नहीं करता है .. इसके अलावा, जहाँ तक पात्रों का संबंध है, यह ठीक काम करता है बस उन्हें बाइट्स जैसे: b'm 'भेज रहा है। वैसे भी, उत्तर के लिए धन्यवाद।
23:12

जवाबों:


6

Arduino पर पार्स करना धीमा और समय लेने वाला हो सकता है (जो कि अगर आप घड़ी के प्रस्कूलिंग का उपयोग करते हैं या समय-समय पर महत्वपूर्ण कार्य करते हैं तो बुरा है), तो चलो इसे पायथन में करते हैं।

समस्या यह है कि आप संख्या को ASCII के रूप में भेज रहे हैं जबकि आपको उन्हें कच्चे बाइनरी के रूप में भेजने की आवश्यकता है। यह वह जगह है जहाँ structअंदर आता है

3>> import struct
3>> print(struct.pack('>B', 0))
b'\x00'
3>> print(struct.pack('>B', 255))
b'\xff'
3>> print(struct.pack('>2B', 255, 0))
b'\xff\x00'
3>> print(struct.pack('>H', 9000))
b'#('

तो आप वास्तव में क्या चाहते हैं:

data = arduino.write(struct.pack('>B', valueToWrite))

या प्रभाव के लिए कुछ है।


आपका बहुत बहुत धन्यवाद! यही वह है जिसकी तलाश में मैं हूं!
mickkk

खाली टिप्पणी बॉक्स ग्रेय्ड टेक्स्ट के कहने के बावजूद, मैं धन्यवाद कहने जा रहा हूँ! एसपीआई फ्लैश चिप के साथ एसपीआई फ्लैश चिप का उपयोग करके एसपीआई फ्लैश चिप में एक बिट-स्ट्रीम (FPGA .bin प्रोग्राम फाइल) लिखने की कोशिश कर रहा था - पीसी - फ्लैश इंटरफ़ेस, और यह पीसी अंत पर इसे काम करने की कुंजी थी।
21

1

Serial.read()सीरियल पोर्ट से केवल एक चरित्र को पढ़ता है और अपने ASCII मान को लौटाता है, जो आपको समझाता है 48

एक पूर्ण संख्या पढ़ने के लिए, आपके पास 2 विकल्प हैं:

  1. उपयोग Serial.parseInt()कि रीड के रूप में कई पात्रों के रूप में की जरूरत है और एक के रूप में पढ़ा संख्या लौटने से पहले रूपांतरण करता है int। कृपया यहाँ संदर्भ देखें
  2. आप प्रत्येक वर्ण को एक लूप (साथ Serial.read()) में पढ़ते हैं, पिछले एक तक, प्रत्येक पढ़े हुए चार्ट को बफर ( charसरणी) में डालते हैं, फिर परिणामी स्ट्रिंग को मानक सी फ़ंक्शन के साथ एक संख्या में परिवर्तित करते हैं atoi

बेशक, पहला विकल्प सबसे आसान है, लेकिन यह 01 एस टाइमआउट (साथ कॉन्फ़िगर करने योग्य Serial.setTimeout()) के बाद कुछ भी नहीं पढ़ने पर वापस आ जाएगा ।


यह उत्तर ठीक वैसा नहीं था जैसा मैं पूछ रहा था, हालाँकि यह बहुत उपयोगी रहा है और मैं इसका उपयोग करूँगा! मदद के लिए बहुत - बहुत धन्यवाद!
mickkk
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.