Як я можу визначити, яка плата arduino (або який контролер) у програмному забезпеченні?


14

У мене є проект, над яким я хочу працювати або на Uno, або на Mega (або навіть на Due), і було б непогано, якби мені не потрібні дві версії програмного забезпечення. Наприклад, на Mega, щоб використовувати SoftwareSerial, ви повинні використовувати інші штифти, ніж ті, що знаходяться на Uno. Див . Документи на Software Serial . У будь-якому разі, було б непогано виявити, що я використовую Uno, тому я можу просто використовувати штифти 4 і 5 для TX / RX, і якщо я використовую Mega, то програмне забезпечення буде виявляти і просто використовувати шпильки 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. Перевірте цей код на деякі інші хитрощі пристрою.

Залежно від операційної системи вашого хоста, підтримувані типи контролерів можна знайти в наступному файлі:

  • Linux: /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 Я оновив відповідь. Thnx для вашого вводу.
jippie

Усі визначені для AVR макроси визначені у документації avr-libc .
Ігнасіо Васкес-Абрамс

Отже, як Arduino IDE отримує інформацію про плату? ( Tools > Get Board Info) Я сподівався зробити строкову перевірку від послідовного з'єднання, тож правильний COM-порт може бути автоматично обраний при запуску моєї програми. Тому що, очевидно, IDE може це зробити, будь-яка ідея, якщо вони використовують методи, описані вище?
n00dles

@ n00dles Вищеописані методи відрізняються від бажаних. На Arduino.SE, мабуть, варто власне запитання. Я не можу перевірити інформацію про отримання борту, її немає у наявній у мене версії Arduino.
джиппі

6

Як зазначено в специфікації обладнання Arduino, тепер Ardeino 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 може бути неправильним, дивіться цю публікацію .
Ульріх Штерн

Прохання вказати ліцензію в вашому проекті ..
Арун

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

Зарахування Адама F /programming//a/21058963/354144


1

Оскільки Arduino Due є іншим процесором (ARM), ніж AVR, ви не зможете використовувати один і той же виконуваний файл для всіх трьох. Але у вас може бути той самий вихідний код (якщо припустити, що синтаксис для читання порту однаковий як для AVR, так і для ARM-частин), і лише два виконувані файли (оскільки той самий буде працювати як у Uno, так і в Mega без перекомпіляції).

Ви можете визначити тип плати під час виконання без необхідності перекомпілювати, вибравши два цифрові штифти, які вже не використовуються вашою програмою на будь-якій із дощок, і прив’язати їх високо чи низько як ідентифікатор дошки. Наприклад, якщо шпильками ви обрали PC1 та PC3:

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

Потім просто прочитайте порт при включенні та встановіть змінну у вашій програмі.

Інша схема, яка може бути пов'язана лише одним штифтом, - це використовувати аналоговий вхідний штифт і використовувати дільник резистора, вибираючи резистори такі, щоб отримати різні напруги, скажімо, з кроком 0,25 В. Я використовував цю техніку, щоб вказати не тільки тип дошки, але і перегляд дошки для тієї ж дошки (що в певному сенсі є новим типом дошки).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.