12

コンパイル時にArduinoのボードタイプ(UnoとNanoなど)をどのように判断できますか?プロセッサタイプの決定と混同しないでください。私がこの例を見ると、例えば#if defined(__ AVR_ATmega32U4__)..。

同様に、ATmega328の同じプロセッサを使用してArduinoのすべてのフレーバーを判別する方法が必要です。

IDEはボードを知っています。したがって、プリコンパイラ#IFからアクセスすることは可能ですか?

Nanoには、Unoとは異なる割り込みがあります。したがって、コンパイル時にボードタイプを知ることで、パブリックライブラリのピン割り当てを自動化できます。

4

3 に答える 3

4

すでに述べたように、開発環境でボードターゲットをチェックして、コンパイラがボードを認識できるようにします。残念ながら、IDEはコンパイラにこの情報を直接通知しません。プロセッサの種類と周波数のみが渡されます。

IDEがプログラムをコンパイルするために何をするかを見ることができます。環境設定メニューで、コンパイル用の詳細出力をオンにします。スケッチをコンパイルすると、次のようなものが表示されます。

C:\ Apps \ arduino-1.0-windows \ arduino-1.0 \ hardware \ tools \ avr \ bin \ avr-g ++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu = atmega328p -DF_CPU = 16000000L -DARDUINO = 100 -IC:\ Apps \ arduino-1.0-windows \ arduino-1.0 \ hardware \ arduino \ cores \ arduino -IC:\ Apps \ arduino-1.0-windows \ arduino-1.0 \ hardware \ arduino \ Variants \ standard C:\ Users \ Jim \ AppData \ Local \ Temp \ build4664216036291565363.tmp \ Blink.cpp -oC:\ Users \ Jim \ AppData \ Local \ Temp \ build4664216036291565363.tmp \ Blink.cpp.o

-Dは、Arduino環境がプリプロセッサに定義を渡す方法です。この方法では、CPU速度とarduinoバージョンのみが渡されることがわかります。

IOピンは別の方法で定義されます。IDEには、ボード固有のヘッダーファイルを含む1つのフォルダーが含まれています。

この-I引数には、コンパイラの検索パスへのフォルダが含まれています。

-IC:\ Apps \ arduino-1.0-windows \ arduino-1.0 \ hardware \ arduino \ Variants \ standard

そのフォルダには、選択したボードに適したpins_arduino.hファイルがあります。別のボードを選択すると、このパラメーターが変更されます。

IDE構成を変更する場合は、必要なものを入手できます。

したがって、必要なものを取得するには、1つの#defineディレクティブを取得する必要があります。だからここに方法があります

ステップ1.独自のボードタイプを作成します。新しいボードタイプを作成するには、次のフォルダにあるboards.txtファイルを参照してください。

... \ arduino-1.0 \ hardware \ arduino

このような行は、インクルードフォルダー(この場合は標準)を定義します。

uno.build.variant=standard

ブロック全体をコピーし、名前とフォルダーを変更します

myuno.name=My Arduino Uno
...
myuno.build.variant=myunoboard

この変更により、このボードターゲットを選択すると、myunoboardフォルダーがコンパイラパスに配置されます。

ステップ2.定義を含むヘッダーを作成します。

フォルダ内

... \ arduino-1.0 \ hardware \ arduino \ Variants \ myunoboard

ファイルpins_arduino.hを作成します。そのファイルで

#include "..\standard\pins_arduino.h"
#define BOARD MY_UNO
// and/or this form
#define __BOARD_MY_UNO

ステップ3.さらにボードについて繰り返します。

これにより、さまざまなボードターゲット用のコードを作成できるようになります。

そうは言っても、私はこのアプローチを本当にお勧めしません。複数のターゲットにまたがって実行されるコードの作成について考え始めている場合は、ArduinoIDEから移行する時期かもしれません。Eclipseなどの環境を使用している場合は、任意の数のビルド構成を持つ1つのプロジェクトがあります。ビルド構成ごとに、ボードターゲットに異なるプリプロセッサ定義を指定できます。

于 2012-12-29T12:38:21.940 に答える
3

arduino IDEにそのようなものが組み込まれているとは思いませんが、いつでも独自のmakefileを作成して、そのようなものを自分で定義することができます。

http://pragprog.com/magazines/2011-04/advanced-arduino-hacking

hello worldの例まで下にスクロールすると、makefileの例が表示され、BOARD make変数が定義されており、makefilesmartsを少し追加するだけで次のようにmakeを呼び出すことができます。

make BOARD=UNO

また

make BOARD=NANO

さまざまなボードのスケッチを作成します。

于 2012-12-13T07:26:29.817 に答える
0

ボードスニッフィングを行う簡単な方法は、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() {
}

ArduinoUnoでの出力は次のとおりです。

Board is compatible with Arduino UNO

Speed/SRAM/Flash: 
16000000
2048
33554432

Arduinoボードのモデルとバージョンを決定するためにこのライブラリ(サンプルコードを含む)を作成するプロセスは 、私のブログで詳しく説明されています。

于 2015-12-12T05:09:58.550 に答える