मैं कैसे पता लगा सकता हूँ कि कौन सा arduino बोर्ड (या कौन सा नियंत्रक) सॉफ्टवेयर में है?


14

मेरे पास एक ऐसी परियोजना है जिसे मैं या तो एक या एक मेगा (या एक ड्यू) पर भी काम करना चाहता हूं और यह अच्छा होगा यदि मुझे सॉफ़्टवेयर के दो संस्करणों की आवश्यकता नहीं है। उदाहरण के लिए, एक मेगा पर, SoftwareSerial का उपयोग करने के लिए, आपको एक Uno पर वाले की तुलना में विभिन्न पिनों का उपयोग करना होगा। सॉफ़्टवेयर सीरियल पर डॉक्स देखें । वैसे भी, यह पता लगाना अच्छा होगा कि मैं एक यूनो का उपयोग कर रहा हूं, इसलिए मैं TX / RX के लिए सिर्फ 4 और 5 पिन का उपयोग कर सकता हूं और यदि मैं एक मेगा का उपयोग कर रहा हूं तो सॉफ्टवेयर पता लगाएगा और सिर्फ 10 और 11 पिन का उपयोग करेगा (और बेशक, मुझे इसे अलग तरीके से वायर करना होगा लेकिन कम से कम सॉफ्टवेयर समान होगा)।

जवाबों:


16

भागो समय

मेरी जानकारी के लिए आप बोर्ड प्रकार का पता नहीं लगा सकते, लेकिन आप ATmega डिवाइस आईडी पढ़ सकते हैं। इस प्रश्न की जांच करें कि यह कैसे किया जा सकता है: क्या एक ATmega या ATtiny डिवाइस हस्ताक्षर को चलाते समय पढ़ा जा सकता है? ध्यान दें कि इस पद्धति का उपयोग करते समय, कई रजिस्टर असाइनमेंट बदल जाएंगे, न कि केवल पिनआउट। इसलिए आपका कोड काफी अधिक जटिल हो सकता है। लाभ यह है कि यदि आप सभी बदलते रजिस्टर असाइनमेंट और अन्य हार्डवेयर निर्भरताओं के आसपास काम करना चाहते हैं, तो आप सीधे अपने उपकरणों को प्रोग्राम करने के लिए एक .hex फ़ाइल का उपयोग कर सकते हैं avrdude

संकलन समय

बोर्ड / नियंत्रक प्रकार का पता लगाने का एक अन्य तरीका संकलन समय पर है। मूल रूप से आप कोड के भागों को संकलित करते हैं या Arduino IDE में कॉन्फ़िगर किए गए डिवाइस प्रकार के आधार पर मैक्रोज़ सेट करते हैं। एक उदाहरण के लिए इस कोड स्निपलेट की जाँच करें:

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define DEBUG_CAPTURE_SIZE 7168
#define CAPTURE_SIZE 7168
#elif defined(__AVR_ATmega328P__)
#define DEBUG_CAPTURE_SIZE 1024
#define CAPTURE_SIZE 1024
#else
#define DEBUG_CAPTURE_SIZE 532
#define CAPTURE_SIZE 532
#endif

कोड स्निपलेट को बेशर्मी से https://github.com/gillham/logic_analyzer/wiki से कॉपी किया गया था ताकि कुछ और डिवाइस विशिष्ट ट्रिकरी के लिए उस कोड की जाँच करें।

आपके मेजबान के ऑपरेटिंग सिस्टम के आधार पर, निम्न फ़ाइल में समर्थित नियंत्रक प्रकार पाए जा सकते हैं:

  • लिनक्स: /usr/lib/avr/include/avr/io.h
  • खिड़कियाँ: ...\Arduino\hardware\tools\avr\avr\include\avr\io.h

सी-प्रीप्रोसेसर (जिसके द्वारा उपरोक्त कोड को संभाला जाता है) का उपयोग संभवतः इस साइट के दायरे से बाहर है। http://stackoverflow.com विस्तृत प्रश्नों के लिए बेहतर स्थान होगा।

यदि आप लिनक्स पर हैं, तो आप आसानी से टाइप करके सभी समर्थित नियंत्रक प्रकार पा सकते हैं:

grep 'defined (__AVR' /usr/lib/avr/include/avr/io.h | sed 's/^[^(]*(\([^)]*\))/\1/'

.. \ Arduino \ हार्डवेयर \ टूल्स \ avr \ avr \ में विंडोज़ के लिए \ avr \ io.h शामिल हैं
mpflaga

@mpflaga मैंने उत्तर को अपडेट किया। अपने इनपुट के लिए Thnx।
जिप्पी

सभी AVR- विशिष्ट पूर्वनिर्धारित मैक्रो को avr-libc प्रलेखन में सूचीबद्ध किया गया है ।
इग्नासियो वाज़केज़-अब्राम्स

तो Arduino IDE को बोर्ड की जानकारी कैसे मिलती है? ( Tools > Get Board Info) मैं सीरियल कनेक्शन से एक स्ट्रिंग चेक करने की उम्मीद कर रहा था, इसलिए मेरा आवेदन शुरू होने पर सही COM पोर्ट स्वचालित रूप से चुना जा सकता है। क्योंकि जाहिर है, आईडीई यह कर सकता है, किसी भी विचार अगर वे उपरोक्त विधियों का उपयोग करते हैं?
n00dles

@ n00dles ऊपर वर्णित विधियां जो आप चाहते हैं, उससे भिन्न हैं। यह शायद Arduino.SE पर अपने सवाल के लायक है। मैं गेट बोर्ड की जानकारी की जाँच नहीं कर सकता, यह मेरे पास उपलब्ध Arduino संस्करण में नहीं है।
जिप्पी

6

जैसा कि Arduino हार्डवेयर विनिर्देश में कहा गया है , Arduino IDE अब प्रत्येक बोर्ड के लिए एक मैक्रो को परिभाषित करता है, जैसा कि बोर्ड में दिखाया गया build.boardहै। यह मान ARDUINO_इसलिए जोड़ा जाता है, उदाहरण के लिए, उन बोर्डों के लिए मैक्रो जो आप में रुचि रखते हैं:

  • ऊनो: ARDUINO_AVR_UNO
  • मेगा 2560: ARDUINO_AVR_MEGA2560
  • कारण: ARDUINO_SAM_DUE

आप इन मैक्रोज़ का उपयोग अपने कोड में कैसे कर सकते हैं इसका उदाहरण:

#if defined(ARDUINO_AVR_UNO)
//Uno specific code
#elif defined(ARDUINO_AVR_MEGA2560)
//Mega 2560 specific code
#elif defined(ARDUINO_SAM_DUE)
//Due specific code
#else
#error Unsupported hardware
#endif

मैं कहूंगा कि यह सवाल का सबसे सरल और सीधा-सीधा जवाब है। काश यह स्वीकृत होता।
Erutan409

4

बोर्ड सूँघने का एक आसान तरीका है कि आप ArduinoManager जैसी लाइब्रेरी का उपयोग करें। इससे आप बहुत आसानी से बोर्ड का नाम और सुविधाएँ प्राप्त कर सकते हैं https://github.com/backupbrain/ArduinoBoardManager

यह लगभग हर Arduino बोर्ड के बारे में बहुत सारी जानकारी प्रकट करने के लिए ऊपर वर्णित तकनीक का उपयोग करता है, इसलिए यह उन परियोजनाओं को बनाने के लिए बहुत अच्छा है जो बहुत अलग वातावरण पर तैनात हो सकते हैं।

बस डाउनलोड करें और अपने Arduino प्रोजेक्ट में शामिल करें।

#include "ArduinoBoardManager.h"

ArduinoBoardManager arduino = ArduinoBoardManager(); // required if you want to know the board name and specific features

void setup() {
  Serial.begin(9600);

  Serial.print("Board is compatible with Arduino ");
  Serial.println(arduino.BOARD_NAME);

  Serial.println("Speed/SRAM/Flash: ");
  Serial.print(ArduinoBoardManager::MAX_MHZ);
  Serial.println(ArduinoBoardManager::SRAM_SIZE);
  Serial.println(ArduinoBoardManager::FLASH_SIZE);

  // Board features (multiple serial ports on Mega, for example)
  if (arduino.featureExists(ArduinoBoardManager::FEATURE_MULTIPLE_SERIAL)) {
    Serial.println("Your board supports multiple serial connections");
  }

}

void loop() {
}

Arduino Uno पर परिणामी आउटपुट है:

Board is compatible with Arduino UNO

Speed/SRAM/Flash: 
16000000
2048
33554432

Arduino बोर्ड मॉडल और संस्करण को निर्धारित करने के लिए इस लाइब्रेरी (उदाहरण कोड सहित) बनाने की प्रक्रिया मेरे ब्लॉग पर विस्तार से वर्णित है।


आपका Arduino ArduinoBoardManager.h में कारण मान्यता गलत हो सकती है, इस पोस्ट को देखें ।
उलरिच स्टर्न

कृपया अपने प्रोजेक्ट में लाइसेंस का संकेत दें ..
arun

2

Arduio ड्यू के साथ संगत सभी बोर्डों के लिए

#if defined (__arm__) && defined (__SAM3X8E__) // Arduino Due compatible
// your Arduino Due compatible code here
#endif

( अधिक जानकारी के लिए फ़ाइल sam3.h देखें ।)

यदि आप सिर्फ Arduino Due (संगत बोर्डों को छोड़कर) को लक्षित करना चाहते हैं, तो आप उपयोग कर सकते हैं

#if defined (_VARIANT_ARDUINO_DUE_X_)
// your Arduino Due code here
#endif

(यह Arduino ड्यू के variant.h फ़ाइल में परिभाषित किया गया है ।)

एडम एफ /programming//a/21058963/354144 को क्रेडिट


1

चूंकि Arduino एवीआर की तुलना में एक अलग प्रोसेसर परिवार (एआरएम) है, आप तीनों के लिए एक ही निष्पादन योग्य का उपयोग नहीं कर पाएंगे । लेकिन आपके पास एक ही स्रोत कोड हो सकता है (एक पोर्ट को पढ़ने के लिए वाक्यविन्यास मानने से एवीआर और एआरएम दोनों भागों में समान है), और सिर्फ दो निष्पादनयोग्य (चूंकि एक ही पुनरावृत्ति के बिना यूनो और मेगा दोनों पर चलेंगे)।

आप बिना रेकॉर्ड किए बिना रनटाइम पर बोर्ड के प्रकार का निर्धारण कर सकते हैं, दो डिजिटल पिनों का चयन करके जो आपके प्रोग्राम द्वारा किसी भी बोर्ड पर पहले से उपयोग नहीं किए जा रहे हैं और उन्हें बोर्ड आईडी के रूप में उच्च या निम्न टाई। उदाहरण के लिए, यदि आपके द्वारा चुने गए पिन PC1 और PC3 हैं:

 PC1   PC3   Board ID
  0     0      Uno
  0     1      Mega
  1     0      Due
  1     1      spare

फिर बस पावर अप पर पोर्ट पढ़ें और अपने प्रोग्राम में एक वैरिएबल सेट करें।

एक और योजना जिसका उपयोग किया जा सकता है, जो केवल एक पिन को जोड़ता है, एक एनालॉग इनपुट पिन का उपयोग करना है और एक प्रतिरोधक विभक्त का उपयोग करना है, प्रतिरोधों का चयन करना, जैसे कि आप कहते हैं, 0.25V वेतन वृद्धि। मैंने न केवल एक बोर्ड प्रकार को निर्दिष्ट करने के लिए उस तकनीक का उपयोग किया है, बल्कि एक ही बोर्ड के लिए एक बोर्ड संशोधन (जो एक मायने में एक नया बोर्ड प्रकार है)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.