ฉันจะตรวจสอบบอร์ด Arduino (หรือตัวควบคุมใด) ในซอฟต์แวร์ได้อย่างไร


14

ฉันมีโครงการที่ฉันต้องการทำงานกับ Uno หรือ Mega (หรือแม้กระทั่ง Due) และจะดีถ้าฉันไม่ต้องการซอฟต์แวร์สองรุ่น ตัวอย่างเช่นบน Mega เพื่อใช้ SoftwareSerial คุณต้องใช้พินที่แตกต่างจากหมุดบน Uno ดูเอกสารเกี่ยวกับซอฟท์แวประจำสินค้า อย่างไรก็ตามมันเป็นการดีที่จะตรวจจับว่าฉันใช้ Uno ดังนั้นฉันสามารถใช้พิน 4 และ 5 สำหรับ TX / RX และถ้าฉันใช้ Mega ซอฟต์แวร์จะตรวจจับและใช้หมุด 10 และ 11 (และของ แน่นอนฉันจะต้องวางสายต่างกัน แต่อย่างน้อยซอฟต์แวร์จะเหมือนเดิม)

คำตอบ:


16

ใช้เวลา

ตามความรู้ของฉันคุณไม่สามารถตรวจพบประเภทของบอร์ด แต่คุณสามารถอ่าน ID อุปกรณ์ ATmega ตรวจสอบคำถามนี้ว่าจะทำอย่างไร: ลายเซ็นอุปกรณ์ ATmega หรือ ATtiny สามารถอ่านได้ในขณะที่ทำงานหรือไม่? โปรดสังเกตว่าเมื่อใช้วิธีนี้การมอบหมายการลงทะเบียนหลายรายการจะเปลี่ยนไปไม่ใช่แค่ pinout ดังนั้นรหัสของคุณอาจมีความซับซ้อนมากขึ้น ข้อดีคือถ้าคุณจัดการเพื่อหลีกเลี่ยงทั้งหมดเปลี่ยนการกำหนดลงทะเบียนและการอ้างอิงฮาร์ดแวร์อื่น ๆ ที่คุณสามารถใช้ไฟล์ .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
  • ของ windows: ...\Arduino\hardware\tools\avr\avr\include\avr\io.h

การใช้ตัวประมวลผลล่วงหน้า C (ซึ่งจัดการโค้ดข้างต้น) อาจไม่อยู่ในขอบเขตสำหรับไซต์นี้ http://stackoverflow.comจะเป็นสถานที่ที่ดีกว่าสำหรับคำถามโดยละเอียด

หากคุณอยู่บน Linux คุณสามารถค้นหาประเภทคอนโทรลเลอร์ที่รองรับทั้งหมดได้อย่างง่ายดายโดยพิมพ์:

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

.. \ Arduino \ hardware \ tools \ avr \ avr \ include \ avr \ io.h สำหรับ windows
mpflaga

@mpflaga ฉันอัปเดตคำตอบ ขอบคุณสำหรับการป้อนข้อมูลของคุณ
jippie

ทั้งหมด AVR-เฉพาะที่กำหนดไว้ล่วงหน้าแมโครมีการระบุไว้ในเอกสาร AVR-libc
Ignacio Vazquez-Abrams

ดังนั้น Arduino IDE จะรับข้อมูลบอร์ดได้อย่างไร ( Tools > Get Board Info) ฉันหวังว่าจะทำการตรวจสอบสายอักขระจากการเชื่อมต่อแบบอนุกรมดังนั้นพอร์ต COM ที่ถูกต้องสามารถเลือกได้โดยอัตโนมัติเมื่อแอปพลิเคชันของฉันเริ่มทำงาน เพราะเห็นได้ชัดว่า IDE สามารถทำสิ่งนี้ความคิดใด ๆ ถ้าพวกเขาใช้วิธีการข้างต้น?
n00dles

@ n00dles วิธีการอธิบายด้านบนนั้นแตกต่างจากสิ่งที่คุณต้องการ มันน่าจะเป็นคำถามของตัวเองใน Arduino.SE ฉันไม่สามารถตรวจสอบรับข้อมูลบอร์ดไม่ได้อยู่ในรุ่น Arduino ที่ฉันมีให้
jippie

6

ตามที่ระบุไว้ในข้อกำหนดฮาร์ดแวร์ของ Arduino ตอนนี้ Arduino IDE จะกำหนดแมโครสำหรับแต่ละบอร์ดตามที่กำหนดไว้ในbuild.boardคุณสมบัติboards.txt ค่าดังกล่าวจะถูกผนวกเข้ากับARDUINO_ตัวอย่างเช่นแมโครสำหรับแผงควบคุมที่คุณสนใจคือ:

  • Uno: 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อาจไม่ถูกต้องให้ดูโพสต์นี้
Ulrich Stern

กรุณาระบุใบอนุญาตในโครงการของคุณ ..
อรุณ

2

สำหรับบอร์ดทั้งหมดที่เข้ากันได้กับ Arduio Due

#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

(สิ่งนี้ถูกกำหนดไว้ในไฟล์variant.hของ Arduino Due )

ให้เครดิตกับ Adam F /programming//a/21058963/354144


1

เนื่องจาก Arduino Due เป็นตระกูลโปรเซสเซอร์ที่แตกต่างกัน (ARM) กว่า AVR คุณจึงไม่สามารถใช้ปฏิบัติการที่เหมือนกันสำหรับทั้งสามตัวได้ แต่คุณสามารถมีซอร์สโค้ดเดียวกันได้(สมมติว่าซินแทกซ์สำหรับการอ่านพอร์ตนั้นเหมือนกันทั้งในส่วน AVR และ ARM) และมีเพียงสองเอ็กซีคิวต์

คุณสามารถกำหนดประเภทบอร์ดที่รันไทม์โดยไม่ต้องคอมไพล์ใหม่โดยเลือกพินดิจิตอลสองอันที่โปรแกรมของคุณไม่ได้ใช้บนบอร์ดใด ๆ แล้วผูกให้สูงหรือต่ำเป็นไอดีของบอร์ด ตัวอย่างเช่นหากหมุดที่คุณเลือกคือ PC1 และ PC3:

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

จากนั้นเพียงแค่อ่านพอร์ตเมื่อเปิดเครื่องและตั้งค่าตัวแปรในโปรแกรมของคุณ

อีกรูปแบบหนึ่งที่สามารถใช้ได้ซึ่งเชื่อมโยงขาเดียวคือการใช้ขาอินพุตแบบอะนาล็อกและใช้ตัวแบ่งความต้านทานเลือกตัวต้านทานเช่นที่คุณได้รับแรงดันไฟฟ้าที่แตกต่างกันในการพูดเพิ่มขึ้น 0.25V ฉันใช้เทคนิคนั้นเพื่อระบุไม่เพียง แต่ประเภทของบอร์ด แต่ยังรวมถึงการปรับปรุงบอร์ดสำหรับบอร์ดเดียวกัน (ซึ่งในความหมายคือบอร์ดประเภทใหม่)

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