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(.....

ดังนั้นรหัสนี้ให้ผลลัพธ์เดียวกัน (BOARD = 0x04 = Micro) สำหรับ Yun 16MHz, Micro, Leonardo y Esplora

มีวิธีใดที่จะได้รับในรหัส C ของฉันอย่างแน่นอนสตริงที่ผู้ใช้มี selecetd ในเมนูของคอมไพเลอร์ Arduino หรือไม่?


2
หากคุณกำลังใช้ IDE Arduino เพื่อสร้างเฟิร์มมีไม่มีบทบัญญัติที่จะผ่าน #define โครงการระดับเรียบเรียงนอกเหนือจาก F_CPU ARDUINO และAVR_whatever คุณอาจต้องใช้ทรัพยากรเพื่อสร้าง build แทนที่จะใช้ arduinio IDE ตรวจสอบเว็บไซต์ arduino.SE Nick และ Ignatio มีตัวอย่างที่ดี
MarkU

ฉันไม่พบสิ่งที่น่าสนใจใน Arduino.SE (ชาวสวีเดนคนนั้นใช่ไหม)
Elmue

@Elmue arduino.StackExchange.com เป็น Arduino SE
Avamander

Ahhhh ตกลง. มี แต่ arduino.se!
Elmue

โดย“ ฉันต้องการแสดงบนพีซีที่บอร์ดเชื่อมต่ออยู่ในปัจจุบัน” คุณหมายถึงแสดงเมื่อสเก็ตช์ที่คอมไพล์และอัปโหลดหรือแสดงในขณะที่สเก็ตช์ถูกคอมไพล์หรือ IDE กำลังนั่งอยู่ที่นั่นด้วย คณะกรรมการที่แนบมา? (ในสองกรณีหลังการเลือกบอร์ดจะแสดงในบรรทัดต่ำสุดของ IDE 1.6.3 แต่ถ้าคุณมี IDE ที่เก่ากว่าหรือแตกต่างกันอาจจะไม่ได้) (ถ้าเป็นกรณีแรกคุณต้องให้มันปรากฏในจอภาพอนุกรมหรือไม่ ?)
James Waldby - jwpat7

คำตอบ:


17

ขอบคุณความช่วยเหลือของ Charlie Hanson และ jantje ฉันพบวิธีแก้ปัญหาสากล!

เนื่องจากเป็นเรื่องที่น่าเสียดายที่โปรแกรมเมอร์ 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

คุณสามารถใส่รหัสนี้ลงในไฟล์ส่วนหัวใหม่และรวม #include ลงในโครงการของคุณ

PD หากคุณต้องการทราบเพิ่มเติมเกี่ยวกับบอร์ดด้วยรุ่น CPU ให้ค้นหาไฟล์ avr_cpunames.h


อีกสิ่งหนึ่งที่. แทนที่จะใช้ "return"? ";" เมื่อคุณไม่ทราบว่าใช้ชื่อคณะกรรมการการเตือน #pragma ไม่เป็นที่รู้จัก
jantje

1. ) ฉันได้แทนที่ "?" ด้วย #error 2. ) ฉันไม่คิดว่าสายนั้นเป็นปัญหาจริงๆ คุณเข้าใจไหมว่าจะมีเพียงหนึ่งสายที่จะรวบรวมในตอนท้าย? ดูการอัปเดตของฉันที่อธิบายสิ่งข้างต้น สตริงที่ยาวที่สุดคือ 11 ไบต์ หากคุณต้องการเพิ่มประสิทธิภาพรหัสของคุณมากจนคุณสนใจประมาณ 11 ไบต์ฉันขอแนะนำให้กำหนด enum และคืนค่านั้นแทนสตริง จากนั้นฟังก์ชั่นของคุณจะคืนค่าหนึ่งไบต์แทน 11
Elmue

3. ) และสิ่งที่เกี่ยวข้องกับการบำรุงรักษา: มันเศร้าที่ฉันต้องเขียนฟังก์ชั่น นี่ควรเป็นส่วนหนึ่งของไฟล์ส่วนหัวที่ติดตั้งไว้กับคอมไพเลอร์แล้วและควรได้รับการดูแลรักษาโดยนักพัฒนาและอัปเดตทุกเวอร์ชั่นใหม่
Elmue

2) ฉันทำผิดพลาดเมื่อเขียนคำพูดเกี่ยวกับขนาด ฉันพูดเมื่อ 5 ชั่วโมงที่แล้ว ขอโทษสำหรับสิ่งนั้น. 3) การบำรุงรักษาเป็นปัญหา ฉันเคยเขียนรหัสที่คล้ายกันมากในอดีต ฉันแน่ใจว่าคนอื่น ๆ มีเช่นกัน มันคือการบำรุงรักษาที่ทำไมฉันถึงชอบ "โซลูชัน IDE ที่ดีกว่า" ฉันค่อนข้างแน่ใจว่า "ดีกว่า IDE ของ" จะมีวิธีการแก้ปัญหาที่คล้ายกันกับที่ฉันกล่าวถึงในคำตอบของฉัน เห็นว่าเป็นส่วนเสริม: คุณเจริญเร็วกว่า Arduino IDE
jantje

หากคุณเขียนความคิดเห็นผิดที่ดีที่สุดจะเป็นการลบ
Elmue

2

ทราบว่านี่เป็น windows mod สิ่งที่คล้ายกันต้องมีอยู่บน linux

อันแรกนั้นง่ายและรวดเร็ว เพียงแก้ไขไฟล์ platform.txt ที่คุณใช้ตามที่อธิบายไว้ข้างต้น ข้อเสียเปรียบนี้คือคุณจะต้องเปลี่ยนไฟล์ platform.txt ในแต่ละรุ่น

เพิ่ม -DBOARD = \ "$ {build.board} \" ในสูตร สิ่งนี้จะช่วยให้

   const char boardName[]=BOARD;

ซึ่งให้สตริง "ARDUINO_AVR_LEONARDO" (สำหรับเลโอนาร์โด) ใน boardName

วิธีที่สองคือการเปลี่ยนเป็น IDE ที่ดีกว่า (เหมือนที่เสนอโดยผู้อื่น) ในฐานะผู้สร้างปลั๊กอิน arduino ฉันจะแนะนำให้ใช้ปลั๊กอิน arduino ในปลั๊กอิน arduino eclipse คุณทำสิ่งนี้ดังนี้: คลิกขวาที่โครงการ -> properties-> arduino-> แท็บ "รวบรวมตัวเลือก" ใส่

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

ในฟิลด์ผนวกไปยัง C และ C ++

นี่จะทำให้โค้ดข้างต้นรวบรวม

Adendum

ฉันไม่รู้ว่าคุณต้องการ "ชื่อที่ดี" ฉันไม่แน่ใจว่าสามารถแก้ไขได้ใน platform.txt ใน arduino IDE ในปลั๊กอิน arduino eclipse ให้เปลี่ยน fixe ด้านบน

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

เพื่อให้ได้ชื่อที่ดี (สำหรับเลโอนาร์โด "Arduino Leonardo") ในกำหนดบอร์ด


downvoter หรือคนอื่น ๆ จะกรุณากรุณาระบุว่าทำไมคำตอบนี้จำเป็นต้องมีการ downvoting?
jantje

1. ) ใช่ StackExchange ควรบังคับให้ทุกคนที่ลงคะแนนเพื่อเขียนคำอธิบาย (ไม่ใช่ downvote ของฉัน) 2. ) ไม่จำเป็นต้องใช้ Eclipse เพื่อแก้ปัญหานี้ 3. ) ดูคำตอบของฉันที่นี่
Elmue

Elmue, 1) ขอบคุณสำหรับการยอมรับ :-) 2) ฉันเห็นด้วย ส่วนแรกของคำตอบคือวิธีที่คุณสามารถแก้ไขการปรับเปลี่ยนแพลตฟอร์ม txt เพื่อให้ทำงานได้ใน Arduino IDE คำตอบของคุณมีรายละเอียดเพิ่มเติมเกี่ยวกับวิธีแก้ไขปัญหานี้ไม่จำเป็นต้องมี eclipse หรือ IDE ที่ดีกว่าสำหรับสิ่งนั้น วิธีการแก้ปัญหา IDE ที่ดีกว่านั้นถูกกล่าวถึงเพราะ Arduino ide จำเป็นต้องแยกวิเคราะห์ boards.txt ดังนั้นจึงอาจมีข้อมูลนี้อยู่ที่ใดที่หนึ่งและมีความเป็นไปได้ในการทำงานโดยไม่จำเป็นต้องแก้ไข platform.txt ในขณะที่ฉันรู้ว่าปลั๊กอิน arduino eclipse เป็นอย่างดีฉันให้ตัวอย่างเกี่ยวกับวิธีการทำสิ่งนี้ด้วยเครื่องมือนี้ 3) ดูการแก้ไขของฉัน
jantje

Eclise ทำงานร่วมกับ Teensy หรือไม่ ข้อดีอื่น ๆ มีการยกเว้น
Elmue

ใช่ teensy ได้รับการสนับสนุนโดยปลั๊กอิน arduino eclipse แต่คุณจะต้องแก้ไข platform.txt (ควรได้รับการแก้ไขใน teensyduino 1.28)
jantje

0

ชื่อที่แน่นอนในเมนูนั้นมาจากไฟล์ boards.txt ใน Arduino IDE ของคุณ (Arduino \ hardware \ arduino \ avr \ boards.txt) ฉันคิดว่าคุณจะต้องแยกไฟล์ด้วยตัวเองและหาบอร์ดที่ตรวจพบที่นั่น


แยกไฟล์หรือไม่ และฉันจะรู้ได้อย่างไรว่ารายการใดถูกเลือกในเมนู
Elmue

0

ฉันถามคำถามที่เกี่ยวข้องในขณะที่ผ่านมา

มีไฟล์ * .h ภายในซึ่งสร้างโดย IDE และเก็บไว้เป็นประเภทของบอร์ดที่ถูกเลือก รายการของตัวเลือกที่เป็นไปได้จะอยู่ในคำถามที่เชื่อมโยง แต่สำหรับบอร์ด AVR เท่านั้น ฉันเชื่อว่ารายการที่ไม่ใช่ AVR นั้นสั้นกว่ามาก

มันเป็นเพียงเรื่องของการเพิ่มคำสั่งเงื่อนไขบางอย่างเพื่อส่งข้อมูลที่ถูกต้อง PC ตัวอย่างง่ายๆ:

//...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
Elmue

คุณอาจต้องการลบเครื่องหมายอัฒภาคท้าย #defines ของคุณ พวกเขาไม่ใช่คำสั่ง C และไม่ต้องการตัวคั่น ในความเป็นจริงตัวคั่นจะถูกแทรกเมื่อใช้แมโครเชื่อมโยงภายใน parens ของฟังก์ชัน println () (หากลบเครื่องหมายอัฒภาคความคิดเห็นนี้จะไม่เหมาะสมสำหรับผู้อ่านในภายหลัง)
Zeph

0

คำตอบเดิมล้าสมัยเมื่อมีการเพิ่มบอร์ดใหม่ การทดสอบขั้นพื้นฐานนั้นถูกต้อง แต่ไม่ชัดเจนว่ารายการมาจากกระดานใด

หากคุณค้นหาboards.txtไฟล์และมองผ่าน (เช่น~\Library\Arduino\hardware\arduino\avr\boards.txtบน Mac) แต่ละบอร์ดจะมีรายการตามบรรทัด<BOARD>.build.board=<NAME>ดังนั้นตัวอย่าง MKR1000 จะมีบรรทัด:

mkr1000.build.board=SAMD_MKR1000

#define ที่เกี่ยวข้องสามารถสร้างขึ้นได้ด้วยการใส่คำนำหน้า<NAME>ด้วยARDUINO_ในตัวอย่างนี้รหัสต่อไปนี้จะเกิดข้อผิดพลาดสำหรับบอร์ด MKR1000 ...

#if defined(ARDUINO_SAMD_MKR1000) #error


คำตอบนี้เป็นเพียง bla bla ทำไมคุณไม่เพียงแค่โพสต์รายชื่อบอร์ดใหม่ทั้งหมดที่มีคำจำกัดความทั้งหมด?
Elmue
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.