ソフトウェアでどのarduinoボード(またはどのコントローラー)を検出できますか?


14

私はUnoまたはMega(またはDue)で作業したいプロジェクトがあり、ソフトウェアの2つのバージョンが必要なければいいと思います。たとえば、メガでSoftwareSerialを使用するには、Unoのピンとは異なるピンを使用する必要があります。Software Serialのドキュメントを参照してください。とにかく、私はUnoを使用していることを検出できればいいので、TX / RXにピン4と5を使用できます。メガを使用している場合、ソフトウェアはピン10と11(およびもちろん、別の方法で接続する必要がありますが、少なくともソフトウェアは同じです。

回答:


16

実行時間

私の知る限り、ボードの種類を検出することはできませんが、ATmegaデバイスIDは読み取ることができます。この質問の実行方法を確認してください。実行中に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
  • ウィンドウズ: ...\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 for windows
mpflaga

@mpflaga答えを更新しました。入力のためのThnx。
ジッピー

すべてのAVR固有の定義済みマクロは、avr-libcのドキュメントにリストされています
イグナシオバスケス-エイブラムス

Arduino IDEはどのようにしてボード情報を取得しますか?(Tools > Get Board Info)シリアル接続から文字列チェックを行いたいので、アプリケーションの起動時に正しいCOMポートを自動的に選択できます。IDEがこれを行うことができるのは明らかであるため、上記の方法を使用する場合はどうでしょうか。
n00dles

@ n00dles上記の方法は、あなたが望むものとは異なります。Arduino.SEで質問する価値はあるでしょう。Get Board Infoを確認できません。利用可能なArduinoバージョンではありません。
ジッピー

6

Arduinoハードウェア仕様で述べられているように、Arduino IDEは、boards.txt 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ボードのモデルとバージョン決定するプロセスは 、私のブログで詳しく説明されています。


ArduinoBoardManager.hでの Arduino Dueの認識が間違っている可能性があります。この投稿を参照してください。
ウルリッヒスターン

プロジェクトのライセンスを指定してください。
アルン

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

(これはArduino Dueのvariant.hで定義されていますファイルでます。)

Adam Fの功績 /programming//a/21058963/354144


1

Arduino DueはAVRとは異なるプロセッサーファミリー(ARM)であるため、3つすべてに同じ実行可能ファイルを使用することはできません。しかし、あなたは同じを持つことができますソースコード(ポートを読み取るための構文がAVRとARMの両方で同じであると仮定)と、2つの実行可能ファイル(同じものは再コンパイルせずにUnoとMegaの両方で実行されるため)を持つことができます。

いずれのボードでもプログラムでまだ使用されていない2つのデジタルピンを選択し、ボードIDとしてハイまたはローに接続することにより、再コンパイルすることなく実行時にボードタイプを決定できます。たとえば、選択したピンがPC1とPC3の場合:

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

次に、電源投入時にポートを読み取り、プログラムで変数を設定します。

使用できるもう1つのスキームは、1つのピンのみを結び付けるもので、アナログ入力ピンを使用し、抵抗分割器を使用して、たとえば0.25Vの増分で異なる電圧が得られるように抵抗を選択します。この手法を使用して、ボードタイプだけでなく、同じボードのボードリビジョン(ある意味では新しいボードタイプ)も指定しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.