Arduino: कोड में बोर्ड प्रकार कैसे प्राप्त करें


13

मैं एक स्केच लिखना चाहता हूं जिसे विभिन्न Arduino बोर्डों पर संकलित किया जा सकता है। मैं पीसी पर प्रदर्शित करना चाहता हूं कि वर्तमान में कौन सा बोर्ड जुड़ा हुआ है।

इसका अर्थ है कि उपयोगकर्ता पीसी को USB केबल के माध्यम से Arduino / Teensy बोर्ड से जोड़ता है जिसमें मेरा स्केच चलता है और मेरा स्केच पीसी को सीरियल के माध्यम से बताता है कि कौन सा बोर्ड जुड़ा हुआ है। पीसी पर मेरा C # एप्लिकेशन चलता है जो इस डेटा को प्राप्त करता है और इसे प्रदर्शित करता है।

इसलिए मुझे उस बोर्ड की आवश्यकता है जिसे स्केच संकलित किए जाने पर चुना गया है:

Arduino बोर्ड चयनकर्ता

मुझे https://github.com/backupbrain/ArduinoBoardManager पर कोड मिला, लेकिन यह सही परिणाम नहीं देता है (इस तथ्य के अलावा कि कई बोर्ड गायब हैं)।

यहाँ कोड से एक स्निपेट है:

static const uint8_t BOARD_MICRO= 0x04;

....
#elif defined(__AVR_Atmega32U4__) // Yun 16Mhz, Micro, Leonardo, Esplora
  static const uint8_t BOARD = 0x04;
  static const uint8_t NUM_BITS = 8;
  static const uint16_t CPU = __AVR_Atmega32U4__;
  static const unsigned long SRAM_SIZE = 2500;
  static const unsigned long EEPROM_SIZE = 1000;
  static const unsigned long FLASH_SIZE = 32000;
#elif defined(.....

तो यह कोड यूएन 16 मेगाहर्ट्ज, माइक्रो, लियोनार्डो वाई एस्प्लोरा के लिए एक ही परिणाम (BOARD = 0x04 = माइक्रो) देता है।

क्या मेरा सी कोड प्राप्त करने का कोई तरीका है जो उपयोगकर्ता द्वारा Arduino संकलक के मेनू में सेलेक्टेड स्ट्रिंग है?


2
यदि आप फर्मवेयर बनाने के लिए arduino IDE का उपयोग कर रहे हैं, तो F_CPU ARDUINO और AVR_whatever से हटकर, कंपाइलर को प्रोजेक्ट-स्तर #define पास करने का कोई प्रावधान नहीं है । Arduinio IDE के बजाय, आपको निर्माण के लिए मेकफाइल का उपयोग करने की आवश्यकता हो सकती है। Arduino.SE साइट की जाँच करें, निक और इग्नेशियो के कुछ अच्छे उदाहरण हैं।
MarkU

मुझे Arduino.SE पर कुछ भी दिलचस्प नहीं मिल रहा है। (क्या वह
सनी है

@Elmue arduino.StackExchange.com Arduino SE है।
अवामांदर

Ahhhh। ठीक। लेकिन arduino.se मौजूद है!
23

"मैं पीसी पर प्रदर्शित करना चाहता हूं जो वर्तमान में जुड़ा हुआ है" क्या आप इसका मतलब यह प्रदर्शित करना चाहते हैं जब एक संकलित और अपलोड किए गए स्केच चलाता है, या एक स्केच संकलित करते समय इसे प्रदर्शित करता है, या जबकि आईडीई सिर्फ एक विशेष के साथ वहां बैठा है बोर्ड संलग्न है? (बाद के दो मामलों में, बोर्ड का चयन 1.6.3 IDE की सबसे निचली पंक्ति में दिखाई देता है, लेकिन यदि आपके पास एक पुराना या भिन्न IDE है, तो नहीं।) (यदि पहला मामला लागू होता है, तो क्या आप चाहते हैं कि यह धारावाहिक मॉनिटर में दिखाई दे। ?)
जेम्स वाल्डबी - jwpat7

जवाबों:


17

चार्ली हैनसन और जंत्जे की मदद के लिए धन्यवाद मुझे सार्वभौमिक समाधान मिला!

क्योंकि यह अफ़सोस की बात है कि हर Arduino प्रोग्रामर को एक ही दर्द से गुज़रना पड़ता है कि बोर्ड का नाम कैसे लिया जाए, मैं अपना कोड जनता के सामने पेश करूँगा ताकि हर कोई बस उसे कॉपी और पेस्ट कर सके।

यह रहा:

#if defined(TEENSYDUINO) 

    //  --------------- Teensy -----------------

    #if defined(__AVR_ATmega32U4__)
        #define BOARD "Teensy 2.0"
    #elif defined(__AVR_AT90USB1286__)       
        #define BOARD "Teensy++ 2.0"
    #elif defined(__MK20DX128__)       
        #define BOARD "Teensy 3.0"
    #elif defined(__MK20DX256__)       
        #define BOARD "Teensy 3.2" // and Teensy 3.1 (obsolete)
    #elif defined(__MKL26Z64__)       
        #define BOARD "Teensy LC"
    #elif defined(__MK64FX512__)
        #define BOARD "Teensy 3.5"
    #elif defined(__MK66FX1M0__)
        #define BOARD "Teensy 3.6"
    #else
       #error "Unknown board"
    #endif

#else // --------------- Arduino ------------------

    #if   defined(ARDUINO_AVR_ADK)       
        #define BOARD "Mega Adk"
    #elif defined(ARDUINO_AVR_BT)    // Bluetooth
        #define BOARD "Bt"
    #elif defined(ARDUINO_AVR_DUEMILANOVE)       
        #define BOARD "Duemilanove"
    #elif defined(ARDUINO_AVR_ESPLORA)       
        #define BOARD "Esplora"
    #elif defined(ARDUINO_AVR_ETHERNET)       
        #define BOARD "Ethernet"
    #elif defined(ARDUINO_AVR_FIO)       
        #define BOARD "Fio"
    #elif defined(ARDUINO_AVR_GEMMA)
        #define BOARD "Gemma"
    #elif defined(ARDUINO_AVR_LEONARDO)       
        #define BOARD "Leonardo"
    #elif defined(ARDUINO_AVR_LILYPAD)
        #define BOARD "Lilypad"
    #elif defined(ARDUINO_AVR_LILYPAD_USB)
        #define BOARD "Lilypad Usb"
    #elif defined(ARDUINO_AVR_MEGA)       
        #define BOARD "Mega"
    #elif defined(ARDUINO_AVR_MEGA2560)       
        #define BOARD "Mega 2560"
    #elif defined(ARDUINO_AVR_MICRO)       
        #define BOARD "Micro"
    #elif defined(ARDUINO_AVR_MINI)       
        #define BOARD "Mini"
    #elif defined(ARDUINO_AVR_NANO)       
        #define BOARD "Nano"
    #elif defined(ARDUINO_AVR_NG)       
        #define BOARD "NG"
    #elif defined(ARDUINO_AVR_PRO)       
        #define BOARD "Pro"
    #elif defined(ARDUINO_AVR_ROBOT_CONTROL)       
        #define BOARD "Robot Ctrl"
    #elif defined(ARDUINO_AVR_ROBOT_MOTOR)       
        #define BOARD "Robot Motor"
    #elif defined(ARDUINO_AVR_UNO)       
        #define BOARD "Uno"
    #elif defined(ARDUINO_AVR_YUN)       
        #define BOARD "Yun"

    // These boards must be installed separately:
    #elif defined(ARDUINO_SAM_DUE)       
        #define BOARD "Due"
    #elif defined(ARDUINO_SAMD_ZERO)       
        #define BOARD "Zero"
    #elif defined(ARDUINO_ARC32_TOOLS)       
        #define BOARD "101"
    #else
       #error "Unknown board"
    #endif

#endif

आप इस कोड को एक नई हेडर फ़ाइल में भी डाल सकते हैं और इसे अपनी परियोजना में शामिल कर सकते हैं।

पीडी यदि आप बोर्ड को अतिरिक्त रूप से सीपीयू मॉडल जानना चाहते हैं, तो फ़ाइल avr_cpunames.h पर खोजें


एक और बात। "रिटर्न" का उपयोग करने के बजाय? ";" जब आपको पता नहीं है कि #pragma चेतावनी बोर्ड का उपयोग अज्ञात है
jantje

1.) मैं बदल दिया है "?" एक # शेर के साथ। 2.) मुझे नहीं लगता कि तार वास्तव में एक समस्या है। आप समझ गए कि अंत में केवल एक स्ट्रिंग संकलित की जाएगी? मेरा अद्यतन देखें जो इसे ऊपर बताता है। सबसे लंबी स्ट्रिंग 11 बाइट्स है। यदि आपको अपने कोड को इतना अनुकूलित करने की आवश्यकता है कि आप 11 बाइट्स की परवाह करते हैं, तो मैं एक एनम को परिभाषित करने और एक स्ट्रिंग के बजाय वापस जाने की सलाह देता हूं। फिर आपका फ़ंक्शन 11. के बजाय एक बाइट
लौटाएगा

3.) और क्या स्थिरता बनाए रखने की चिंता करता है: यह दुखद है कि मुझे इस तरह के समारोह को लिखना पड़ता है। यह पहले से ही हेडर फ़ाइलों का हिस्सा होना चाहिए जो कंपाइलर के साथ इंस्टॉल किए गए हैं और डेवलपर्स द्वारा बनाए रखा जाना चाहिए और हर नए संस्करण के साथ अपडेट किया जाना चाहिए।
एल्म्यू

2) आकार पर टिप्पणी लिखते समय मैंने एक गलती की। मैंने उस पर 5 घंटे पहले एक टिप्पणी की थी। उसके लिए खेद है। 3) स्थिरता एक समस्या है। मैंने अतीत में बहुत समान कोड लिखा है। मुझे यकीन है कि कई अन्य लोगों के पास भी है। यह स्थिरता है कि मैं "बेहतर आईडीई समाधान" क्यों पसंद करता हूं। मुझे पूरा यकीन है कि सभी "बेहतर आईडीई" का मेरे जवाब में वर्णित के समान समाधान होगा। इसे पूरक के रूप में देखें: आप Arduino IDE को बढ़ा रहे हैं।
जंत्जे

यदि आपने कोई गलत टिप्पणी लिखी है, तो सबसे अच्छा होगा कि आप उसे हटा दें।
एल्म्यू

2

ध्यान दें कि यह एक विंडोज़ मॉड है, जो लिनक्स पर मौजूद होना चाहिए।

पहला त्वरित और आसान है। बस वर्णित। के रूप में आप उपयोग कर रहे हैं platform.txt फ़ाइलों को संशोधित करें। इसका ड्रा बैक यह है कि आपको प्रत्येक रिलीज़ के साथ platform.txt फ़ाइलों को बदलना होगा।

add -DBOARD = \ "$ {build.board} \" नुस्खा पर। इसके लिए अनुमति देगा

   const char boardName[]=BOARD;

जो आपको बोर्डनाम में स्ट्रिंग "ARDUINO_AVR_LEONARDO" (लियोनार्डो के लिए) देता है।

दूसरा तरीका एक बेहतर आईडीई पर स्विच करना है (जैसे कि पहले से ही दूसरों द्वारा प्रस्तावित)। Arduino ग्रहण प्लगइन के निर्माता के रूप में मैं arduino ग्रहण प्लगइन का उपयोग करने की सलाह दूंगा। Arduino ग्रहण प्लगइन में आप निम्नानुसार करते हैं: प्रोजेक्ट पर राइट क्लिक करें-> गुण-> arduino-> टैब "संकलन विकल्प" डालें

-DBOARD=\"${A.BUILD.BOARD}\" 

C और C ++ फ़ील्ड में संलग्न हैं।

यह ऊपर दिए गए कोड को संकलित कर देगा

Adendum

मुझे नहीं पता था कि आप "अच्छा नाम" चाहते हैं। मुझे यकीन नहीं है कि यह arduino IDE में platform.txt में तय किया जा सकता है। Arduino ग्रहण प्लगइन में ऊपर दिए गए फिक्से को बदलें

-DBOARD=\"${A.NAME}\"

परिभाषित बोर्ड में अच्छा नाम (लियोनार्डो "Arduino लियोनार्डो" के लिए) पाने के लिए।


क्या डाउनवॉटर या कोई और कृपया इतना दयालु होगा कि यह निर्दिष्ट करें कि यह उत्तर डाउनवोटिंग की आवश्यकता क्यों है?
jantje

1.) हां, StackExchange को हर उस व्यक्ति को मजबूर करना चाहिए जो एक विवरण लिखने के लिए वोट करता है। (यह मेरी नीचता नहीं थी) 2.) इस समस्या को हल करने के लिए ग्रहण का उपयोग करने की कोई आवश्यकता नहीं है। 3.) यहाँ मेरा जवाब देखें।
एल्म्यू

एल्म्यू, 1) सहमत होने के लिए धन्यवाद :-)। 2) मैं सहमत हूं। उत्तर का पहला भाग यह है कि आप इस प्लेटफ़ॉर्म txt को कैसे संशोधित कर सकते हैं ताकि यह Arduino IDE में काम करे। इसे कैसे ठीक किया जाए, इस पर आपका जवाब अधिक विस्तार से बताता है। इसके लिए ग्रहण या किसी बेहतर आईडीई की आवश्यकता नहीं है। बेहतर विचारधारा के समाधान का उल्लेख किया गया है क्योंकि एक Arduino ide को बोर्ड्स को पार्स करने की आवश्यकता होती है। इसलिए शायद यह जानकारी कहीं है और platform.txt को संशोधित किए बिना काम करने की संभावना है। जैसा कि मैं arduino ग्रहण प्लगइन को अच्छी तरह से जानता हूं, मैं इस उपकरण के साथ ऐसा करने का एक उदाहरण देता हूं। 3) मेरा एडिट देखें
jantje

क्या एक्लिस टेनेसी के साथ भी काम करता है? क्या अन्य फायदे हैं?
एल्म्यू

हाँ किशोरावस्था को एगडिनो एक्लिप्स प्लगइन द्वारा समर्थित किया गया है, लेकिन आपको platform.txt को मॉडिफाई करना होगा (किशोरवयनो 1.28 में तय किया जाना चाहिए)
jantje

0

मेनू में सटीक नाम आपके Arduino IDE (Arduino \ हार्डवेयर \ arduino \ avr \ board.txt) में board.txt फ़ाइल से आते हैं। मुझे लगता है कि आपको फ़ाइल को अपने आप से पार्स करना होगा और वहां पाया गया बोर्ड ढूंढना होगा।


फ़ाइल पार्स करें ?? और मुझे कैसे पता चलेगा कि कौन से मेनू में सेलेक्डेट है?
एल्म्यू

0

मैंने कुछ समय पहले संबंधित प्रश्न पूछा था।

एक आंतरिक * .h फ़ाइल मौजूद है जो IDE द्वारा बनाई गई है, और इसमें उस प्रकार का बोर्ड है जिसे चुना गया है। लिंक किए गए प्रश्न में संभावित विकल्पों की सूची दी गई है, लेकिन केवल AVR बोर्डों के लिए। मेरा मानना ​​है कि गैर-एवीआर सूची बहुत छोटी है।

यह केवल पीसी को सही जानकारी भेजने के लिए कुछ सशर्त बयान जोड़ने की बात है। एक सरल उदाहरण:

//...within your code, perhaps during setup()...
#ifdef ARDUINO_AVR_UNO
    serial.println("UNO");
#endif
#ifdef ARDUINO_AVR_LEONARDO
    serial.println("LEONARDO");
#endif
// etc...

यदि आपको स्केच में एक से अधिक बार बोर्ड प्रकार को संदर्भित करने की आवश्यकता है, तो निम्न प्रारूप का उपयोग करें:

//...BEFORE setup(), or otherwise in the global namespace...
#ifdef ARDUINO_AVR_UNO
    #define __BOARD_TYPE "UNO"
#endif
#ifdef ARDUINO_AVR_LEONARDO
    #define __BOARD_TYPE "LEONARDO"
#endif
// etc...

// within your code, wherever necessary:
serial.println(__BOARD_TYPE);

उत्तरार्द्ध बहुत कठिन है, भले ही आपको केवल __BOARD_TYPEएक बार की आवश्यकता हो, क्योंकि यह #ifdefआपके कार्यों से बोझिल चंक को हटा देता है ।

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


आपके उत्तर के लिए धन्यवाद। इसने मेरी बहुत मदद की। (मेरा उत्तर यहां देखें) लेकिन आपके कोड में कोई त्रुटि है। AVR_UNO के बजाय यह ARDUINO_AVR_UNO होना चाहिए।
एल्म्यू

आप अपने #defines के अंत में अर्धविराम हटाना चाहते हैं; वे C कथन नहीं हैं और उन्हें विभाजकों की आवश्यकता नहीं है; वास्तव में विभाजक डाले जाएंगे जहां मैक्रोज़ का उपयोग किया जाता है, प्रिंट्लन () फ़ंक्शन के पार्न्स के अंदर लिंक। (यदि अर्धविराम हटा दिए जाएं, तो यह टिप्पणी बाद के पाठकों के लिए मायने नहीं रखेगी)।
जेफ

0

मूल उत्तर पुराना है क्योंकि नए बोर्ड जोड़े गए हैं। मूल परीक्षण सही है, लेकिन यह स्पष्ट नहीं है कि बोर्डों की सूची कहां से आती है।

यदि आप boards.txtफ़ाइल का पता लगाते हैं और इसके माध्यम से देखते हैं (उदाहरण के लिए ~\Library\Arduino\hardware\arduino\avr\boards.txtएक मैक पर), प्रत्येक बोर्ड में लाइनों के साथ एक प्रविष्टि होगी <BOARD>.build.board=<NAME>, इसलिए, उदाहरण के लिए, MKR1000 में एक रेखा होगी:

mkr1000.build.board=SAMD_MKR1000

इसी #define को इस उदाहरण में इसके <NAME>साथ प्रीफ़िक्स करके उत्पन्न किया जा सकता है ARDUINO_, निम्नलिखित कोड MKR1000 के लिए त्रुटि होगी ...

#if defined(ARDUINO_SAMD_MKR1000) #error


यह उत्तर सिर्फ ब्ला ब्ला है। आप सभी परिभाषितों के साथ सभी नए बोर्डों की पूरी सूची को केवल पोस्ट क्यों नहीं करते हैं?
एल्म्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.