আরডুইনো: কোডটিতে বোর্ড টাইপ কীভাবে পাবেন


13

আমি একটি স্কেচ লিখতে চাই যা বিভিন্ন আরডুইনো বোর্ডে সংকলন করা যায়। বর্তমানে পিসিতে কোন বোর্ডটি সংযুক্ত রয়েছে তা আমি প্রদর্শন করতে চাই।

এর অর্থ হল যে ব্যবহারকারী পিসিটিকে ইউএসবি কেবল দ্বারা আরডুইনো / টেনেসি বোর্ডের সাথে সংযুক্ত করে যেখানে আমার স্কেচটি চালায় এবং আমার স্কেচটি সিরিয়ালের মাধ্যমে পিসিকে জানায় যে বোর্ডটি সংযুক্ত রয়েছে। পিসিতে আমার সি # অ্যাপ্লিকেশন চালায় যা এই ডেটা গ্রহণ করে এবং এটি প্রদর্শন করে।

সুতরাং স্কেচটি সংকলন করার সময় আমার নির্বাচিত বোর্ডটি প্রয়োজন:

আরডুইনো বোর্ডের নির্বাচক

আমি https://github.com/backupbrain/ArdinoBoardManager এ কোডটি পেয়েছি তবে এটি সঠিক ফলাফল দেয় না (বেশ কয়েকটি বোর্ড নিখোঁজ হওয়া বাদে)।

এখানে কোড থেকে একটি স্নিপেট:

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 = মাইক্রো) দেয়।

আমার সি কোডটিতে প্রবেশের কোনও উপায় কি ব্যবহারকারীটি আরডুইনো সংকলকটির মেনুতে সিলসেট করে দিয়েছে?


2
আপনি যদি ফার্মওয়্যারটি তৈরি করতে আরডুইনো আইডিই ব্যবহার করেন তবে এফ_সিপিইউ আরডিউইনো এবং এভিআর_ও যাই হোক না কেন, কম্পাইলারে কোনও প্রকল্প-স্তরের # ডিফাইনটি পাস করার বিধান নেই । আপনার আরডুইনিও আইডিইয়ের পরিবর্তে মেকফিল তৈরির জন্য গ্রুয়েট করতে হবে। আরডুইনো.এসই সাইটটি দেখুন, নিক এবং ইগনাতিওর কয়েকটি ভাল উদাহরণ রয়েছে।
মার্কু

আমি আরডুইনোএসই তে আকর্ষণীয় কিছু খুঁজে পাচ্ছি না। (এটাই কি
হলিডে

@ এলময়ে আরডুইনো.স্ট্যাকএক্সচেঞ্জ.কম হলেন আরডিনো এসই।
আওমাদার

Ahhhh। ঠিক আছে. কিন্তু arduino.se বিদ্যমান!
এলময়ে

"আমি বর্তমানে পিসিতে কোন বোর্ডটি সংযুক্ত আছে তা প্রদর্শন করতে চাই" এর অর্থ কি আপনি যখন কোনও সংকলিত এবং আপলোডকৃত স্কেচটি চালিত হবে বা স্কেচটি সংকলিত হওয়ার সময় এটি প্রদর্শিত হবে বা আইডিই কেবল নির্দিষ্টটির সাথে বসে আছে তখন বোর্ড সংযুক্ত? (পরের দুটি ক্ষেত্রে বোর্ড নির্বাচন 1.6.3 আইডিইয়ের সর্বনিম্ন লাইনে প্রদর্শিত হয় তবে আপনার যদি বয়স্ক বা আলাদা আইডিই নাও থাকে not) (প্রথম ক্ষেত্রে যদি প্রয়োগ হয়, আপনি কি এটি সিরিয়াল মনিটরে উপস্থিত হতে চান? ?)
জেমস ওয়াল্ডবি - jwpat7

উত্তর:


17

চার্লি হ্যানসন এবং জাঞ্জের সহায়তায় আমি সর্বজনীন সমাধানটি পেয়েছি!

কারণ এটি অত্যন্ত দুঃখের বিষয় যে প্রতিটি আরডিনো প্রোগ্রামারকে বোর্ডের নাম কীভাবে পাওয়া যায় তা নির্ধারণ করতে একই ব্যথার মধ্য দিয়ে যেতে হয়, আমি আমার কোডটি জনসাধারণকে উপস্থাপন করব যাতে প্রত্যেকে এটি কপি করে পেস্ট করতে পারে।

এটা এখানে:

#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 ফাইলটি অনুসন্ধান করুন


আরেকটি বিষয়. "প্রত্যাবর্তন"? " আপনি যখন জানেন না #
প্রগমা

1.) আমি "প্রতিস্থাপন করেছি?" একটি # আতঙ্কের সাথে। ২) আমি মনে করি না যে স্ট্রিংগুলি আসলেই একটি সমস্যা। আপনি কি বুঝতে পেরেছিলেন যে শুধুমাত্র একটি স্ট্রিং শেষে সংকলিত হবে? আমার আপডেট দেখুন যা উপরে এটি ব্যাখ্যা করে। দীর্ঘতম স্ট্রিং 11 বাইট। আপনি যদি আপনার কোডটিকে এত বেশি অনুকূল করতে চান যে আপনি 11 বাইট সম্পর্কে যত্নশীল হন তবে আমি একটি এনাম সংজ্ঞায়িত করতে চাই এবং স্ট্রিংয়ের পরিবর্তে সেটি ফিরিয়ে আনতে পরামর্শ দিই। তারপরে আপনার ফাংশন ১১ এর পরিবর্তে এক বাইট ফিরে আসবে
এলময়ে

৩) এবং যা রক্ষণাবেক্ষণের বিষয়টি নিয়ে উদ্বেগ প্রকাশ করে: দুঃখের বিষয় যে আমাকে এই জাতীয় একটি ফাংশন লিখতে হয়েছে। এটি ইতিমধ্যে সংকলক সহ ইনস্টল করা শিরোনাম ফাইলগুলির অংশ হওয়া উচিত এবং বিকাশকারীদের দ্বারা বজায় রাখা উচিত এবং প্রতিটি নতুন সংস্করণ সহ আপডেট করা উচিত।
এলমিউ

2) আকারে মন্তব্য লিখতে গিয়ে আমি ভুল করেছিলাম। আমি এই সম্পর্কে একটি মন্তব্য 5 ঘন্টা আগে। তার জন্য দুঃখিত। 3) রক্ষণাবেক্ষণ একটি সমস্যা। আমি অতীতে খুব অনুরূপ কোড লিখেছি। আমি নিশ্চিত অন্য অনেকেরও আছে। আমি রক্ষণাবেক্ষণের কারণেই কেন আমি "আরও ভাল আইডিই সমাধান" পছন্দ করি। আমি পুরোপুরি নিশ্চিত যে আমার "উত্তরের আইডিই" এর উত্তরটির মধ্যে যেমনটি সমাধান হয়েছে তেমন সমাধান হবে। একে পরিপূরক হিসাবে দেখুন: আপনি আরডুইনো আইডিইকে ছাড়িয়ে যাচ্ছেন।
জান্তে

আপনি যদি কোনও ভুল মন্তব্য লিখে থাকেন তবে এটি মুছে ফেলা ভাল।
এলমিউ

2

নোট করুন এটি একটি উইন্ডোজ মোড যা লিনাক্সে অনুরূপ কিছু উপস্থিত থাকতে পারে।

প্রথমটি দ্রুত এবং সহজ। আপনি প্ল্যাটফর্ম.টেক্সট ফাইলগুলিকে কেবল নীচে বর্ণিত হিসাবে ব্যবহার করছেন mod এটির পিছনের চিত্রটি হ'ল প্রতিটি প্রকাশের সাথে আপনার প্ল্যাটফর্ম.টিএসটিএস্ট ফাইলগুলি পরিবর্তন করতে হবে।

রেসিপি -DBOARD = \ "$ {build.board} \" যোগ করুন। এই জন্য অনুমতি দেবে

   const char boardName[]=BOARD;

যা আপনাকে বোর্ডআনেমে "আরডিউইনো_আভিআর_লেওনার্দো" (লিওনারডোর জন্য) স্ট্রিং দেয়।

দ্বিতীয় উপায়টি হ'ল আরও ভাল আইডিইতে স্যুইচ করা (যেমন ইতিমধ্যে অন্যদের দ্বারা প্রস্তাবিত)। আরডুইনো এক্সলিপ প্লাগইনটির স্রষ্টা হিসাবে আমি আরডুইনো এক্সপ্লাইস প্লাগইনটি ব্যবহার করার পরামর্শ দেব। আরডুইনো ইক্লিপস প্লাগইনে আপনি নীচের মতো এটি করেন: প্রজেক্ট-> বৈশিষ্ট্য-> আরডুইনো-> ট্যাবে "সংকলন বিকল্পগুলি" লাগাতে ডান ক্লিক করুন

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

সি এবং সি ++ ক্ষেত্রে সংযোজন।

এটি সংকলনের জন্য উপরের কোডটি তৈরি করবে

Adendum

আপনি "সুন্দর নাম" চেয়েছিলেন তা আমি জানতাম না। আমি নিশ্চিত নই যে এটি আর্টুইনো আইডিই-র প্ল্যাটফর্ম.টেক্সটে স্থির করা যেতে পারে। আরডুইনো ইক্লিপস প্লাগইনে উপরের ফিক্সটি পরিবর্তন করুন

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

সংজ্ঞায়িত বোর্ডে দুর্দান্ত নাম (লিওনার্ডো "আরডুইনো লিওনার্দো") পেতে get


ডাউনওয়োটার বা অন্য কেউ দয়া করে এই উত্তরটি কেন ডাউনভোটিংয়ের প্রয়োজন তা উল্লেখ করার জন্য দয়া করে দয়া করবেন?
জান্তে

১) হ্যাঁ, স্ট্যাক এক্সচেঞ্জের ভোটারদের প্রত্যেককে একটি ব্যাখ্যা লিখতে বাধ্য করা উচিত। (এটি আমার ডাউনটোট ছিল না) ২) এই সমস্যাটি সমাধান করার জন্য Eclipse ব্যবহার করার দরকার নেই। ৩) আমার উত্তরটি এখানে দেখুন।
এলময়ে

এলমু, ১) সম্মত হওয়ার জন্য ধন্যবাদ :-)। 2) আমি একমত। উত্তরের প্রথম অংশটি হল আপনি কীভাবে এই সংশোধন প্ল্যাটফর্মটি txt ঠিক করতে পারেন তাই এটি আরডুইনো আইডিইতে কাজ করে। আপনার উত্তর কীভাবে এটি ঠিক করবেন সে সম্পর্কে আরও বিশদে যায় cl এর জন্য গ্রহন বা কোনও ভাল আইডিই লাগবে না। উন্নত আদর্শ সমাধানটি উল্লেখ করা হয়েছে কারণ একটি আরডুইনো আইডিয়াকে বোর্ডগুলি পার্স করা দরকার ars টেক্সট যাতে এটি সম্ভবত কোথাও এই তথ্য রয়েছে এবং প্ল্যাটফর্ম.টিএসটিএসটি পরিবর্তনের প্রয়োজন ছাড়াই কাজ করার সম্ভাবনা রয়েছে। যেহেতু আমি খুব ভালভাবে অর্ডিনো গ্রহন প্লাগইনটি জানতে পারি আমি কীভাবে এই সরঞ্জামটি দিয়ে এটি করতে পারি তার একটি উদাহরণ দিই। 3) আমার সম্পাদনা দেখুন
jantje

এলিয়েন্স কি টেনেসির সাথেও কাজ করে? এক্সক্লিপসের অন্যান্য কী কী সুবিধা রয়েছে?
এলমিউ

হ্যাঁ টেনেসি আরডুইনো এক্সিলিপ প্লাগইন দ্বারা সমর্থিত তবে আপনাকে প্ল্যাটফর্মটি পরিবর্তন করতে হবে t টেক্সট (টেনিসিডিনো ১.২৮-এ স্থির করা উচিত)
জান্তে

0

মেনুতে হুবহু নামগুলি আপনার আরডুইনো আইডিই (আরডুইনো \ হার্ডওয়্যার ino আরডুইনো \ আভার t বোর্ডস.টিএসটিএক্স) এর boards.txt ফাইল থেকে আসে। আমি মনে করি আপনাকে নিজেরাই ফাইলটি বিশ্লেষণ করতে হবে এবং সেখানে চিহ্নিত বোর্ডটি খুঁজে পেতে হবে।


ফাইল পার্স করবেন ?? এবং আমি কীভাবে জানব যে কোনটি মেনুতে আলাদা?
এলমিউ

0

আমি কিছুক্ষণ আগে একটি সম্পর্কিত প্রশ্ন জিজ্ঞাসা করেছি ।

একটি অভ্যন্তরীণ *। এইচ ফাইল উপস্থিত রয়েছে যা আইডিই দ্বারা নির্মিত এবং এতে নির্বাচিত হওয়া বোর্ডের ধরণটিকে ধারণ করে। সংযুক্ত প্রশ্নে সম্ভাব্য বিকল্পগুলির তালিকা দেওয়া হয়েছে, তবে কেবল এভিআর বোর্ডগুলির জন্য। আমার বিশ্বাস, নন-এভিআর তালিকাটি আরও খাটো।

পিসিকে সঠিক তথ্য প্রেরণ করার জন্য এটি কিছু শর্তাধীন বিবৃতি যুক্ত করার বিষয় মাত্র। একটি সহজ উদাহরণ:

//...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 হওয়া উচিত।
এলময়ে

আপনি আপনার # ডেফাইনস এর শেষে অর্ধসীমাগুলি অপসারণ করতে চাইতে পারেন; এগুলি সি স্টেটমেন্ট নয় এবং পৃথককারীগুলির প্রয়োজন নেই; প্রকৃতপক্ষে বিভাজকগুলি সন্নিবেশ করা হবে যেখানে ম্যাক্রোগুলি ব্যবহৃত হয়, প্রিন্টলান () ফাংশনের প্যারেন্সের ভিতরে লিঙ্ক করুন। (যদি সেমিকোলনগুলি সরিয়ে ফেলা হয়, তবে এই মন্তব্যটি পরবর্তী পাঠকদের জন্য তাত্পর্যপূর্ণ হবে না)।
Zeph

0

নতুন বোর্ড যুক্ত করা হওয়ায় মূল উত্তরটি পুরানো। প্রাথমিক পরীক্ষাটি সঠিক, তবে বোর্ডের তালিকাটি কোথা থেকে এসেছে তা পরিষ্কার নয়।

আপনি যদি boards.txtফাইলটি সনাক্ত করেন এবং এটির মাধ্যমে দেখে (যেমন ~\Library\Arduino\hardware\arduino\avr\boards.txtম্যাকের উপরে), প্রতিটি বোর্ডের লাইন বরাবর একটি প্রবেশ থাকবে <BOARD>.build.board=<NAME>, উদাহরণস্বরূপ, এমকেআর 1000 এর একটি লাইন থাকবে:

mkr1000.build.board=SAMD_MKR1000

সম্পর্কিত উদাহরণস্বরূপ এর <NAME>সাথে ARDUINO_পূর্বনির্ধারণের মাধ্যমে সম্পর্কিত # ডিফাইন তৈরি করা যেতে পারে , উদাহরণস্বরূপ, নিম্নলিখিত কোডটি এমকেআর 1000 বোর্ডের জন্য ত্রুটি করবে ...

#if defined(ARDUINO_SAMD_MKR1000) #error


এই উত্তরটি কেবল ব্লে ব্লাড। আপনি কেবল সমস্ত সংজ্ঞায়িত সমস্ত নতুন বোর্ডের একটি সম্পূর্ণ তালিকা কেন পোস্ট করবেন না?
এলমু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.