Arduinoで遊ぶページ

Arduinoで遊んだ結果を残すページです。
garretlab
Arduino UnoとDueの比較

はじめに

Arduino UnoとDueの違いをまとめていきます。できる限り実験でも確認していきます。利用しているIDEは、Arduino-1.5.2です。

比較

以下に比較結果を記載します。

大項目 小項目 Uno Due 備考
コンパイラ 利用コンパイラ avr-g++ arm-none-eabi-g++
事前定義マクロ(コンパイラ) #define __AVR 1
#define __AVR__ 1
#define __AVR_2_BYTE_PC__ 1
#define __AVR_ARCH__ 5
#define __AVR_ATmega328P__ 1
#define __AVR_ENHANCED__ 1
#define __AVR_HAVE_JMP_CALL__ 1
#define __AVR_HAVE_LPMX__ 1
#define __AVR_HAVE_MOVW__ 1
#define __AVR_HAVE_MUL__ 1
#define __AVR_MEGA__ 1
#define __CHAR_BIT__ 8
#define __DBL_DENORM_MIN__ 1.40129846e-45
#define __DBL_DIG__ 6
#define __DBL_EPSILON__ 1.19209290e-7
#define __DBL_HAS_DENORM__ 1
#define __DBL_HAS_INFINITY__ 1
#define __DBL_HAS_QUIET_NAN__ 1
#define __DBL_MANT_DIG__ 24
#define __DBL_MAX__ 3.40282347e+38
#define __DBL_MAX_10_EXP__ 38
#define __DBL_MAX_EXP__ 128
#define __DBL_MIN__ 1.17549435e-38
#define __DBL_MIN_10_EXP__ (-37)
#define __DBL_MIN_EXP__ (-125)
#define __DEC_EVAL_METHOD__ 2
#define __DEC128_DEN__ 0.000000000000000000000000000000001E-6143DL
#define __DEC128_EPSILON__ 1E-33DL
#define __DEC128_MANT_DIG__ 34
#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL
#define __DEC128_MAX_EXP__ 6144
#define __DEC128_MIN__ 1E-6143DL
#define __DEC128_MIN_EXP__ (-6143)
#define __DEC32_DEN__ 0.000001E-95DF
#define __DEC32_EPSILON__ 1E-6DF
#define __DEC32_MANT_DIG__ 7
#define __DEC32_MAX__ 9.999999E96DF
#define __DEC32_MAX_EXP__ 96
#define __DEC32_MIN__ 1E-95DF
#define __DEC32_MIN_EXP__ (-95)
#define __DEC64_DEN__ 0.000000000000001E-383DD
#define __DEC64_EPSILON__ 1E-15DD
#define __DEC64_MANT_DIG__ 16
#define __DEC64_MAX__ 9.999999999999999E384DD
#define __DEC64_MAX_EXP__ 384
#define __DEC64_MIN__ 1E-383DD
#define __DEC64_MIN_EXP__ (-383)
#define __DECIMAL_DIG__ 9
#define __FINITE_MATH_ONLY__ 0
#define __FLT_DENORM_MIN__ 1.40129846e-45F
#define __FLT_DIG__ 6
#define __FLT_EPSILON__ 1.19209290e-7F
#define __FLT_EVAL_METHOD__ 0
#define __FLT_HAS_DENORM__ 1
#define __FLT_HAS_INFINITY__ 1
#define __FLT_HAS_QUIET_NAN__ 1
#define __FLT_MANT_DIG__ 24
#define __FLT_MAX__ 3.40282347e+38F
#define __FLT_MAX_10_EXP__ 38
#define __FLT_MAX_EXP__ 128
#define __FLT_MIN__ 1.17549435e-38F
#define __FLT_MIN_10_EXP__ (-37)
#define __FLT_MIN_EXP__ (-125)
#define __FLT_RADIX__ 2
#define __GNUC__ 4
#define __GNUC_GNU_INLINE__ 1
#define __GNUC_MINOR__ 3
#define __GNUC_PATCHLEVEL__ 2
#define __GXX_ABI_VERSION 1002
#define __INT_MAX__ 32767
#define __INTMAX_MAX__ 9223372036854775807LL
#define __INTMAX_TYPE__ long long int
#define __LDBL_DENORM_MIN__ 1.40129846e-45L
#define __LDBL_DIG__ 6
#define __LDBL_EPSILON__ 1.19209290e-7L
#define __LDBL_HAS_DENORM__ 1
#define __LDBL_HAS_INFINITY__ 1
#define __LDBL_HAS_QUIET_NAN__ 1
#define __LDBL_MANT_DIG__ 24
#define __LDBL_MAX__ 3.40282347e+38L
#define __LDBL_MAX_10_EXP__ 38
#define __LDBL_MAX_EXP__ 128
#define __LDBL_MIN__ 1.17549435e-38L
#define __LDBL_MIN_10_EXP__ (-37)
#define __LDBL_MIN_EXP__ (-125)
#define __LONG_LONG_MAX__ 9223372036854775807LL
#define __LONG_MAX__ 2147483647L
#define __NO_INLINE__ 1
#define __PTRDIFF_TYPE__ int
#define __REGISTER_PREFIX__
#define __SCHAR_MAX__ 127
#define __SHRT_MAX__ 32767
#define __SIZE_TYPE__ unsigned int
#define __SIZEOF_DOUBLE__ 4
#define __SIZEOF_FLOAT__ 4
#define __SIZEOF_INT__ 2
#define __SIZEOF_LONG__ 4
#define __SIZEOF_LONG_DOUBLE__ 4
#define __SIZEOF_LONG_LONG__ 8
#define __SIZEOF_POINTER__ 2
#define __SIZEOF_PTRDIFF_T__ 2
#define __SIZEOF_SHORT__ 2
#define __SIZEOF_SIZE_T__ 2
#define __SIZEOF_WCHAR_T__ 2
#define __SIZEOF_WINT_T__ 2
#define __STDC__ 1
#define __STDC_HOSTED__ 1
#define __UINTMAX_TYPE__ long long unsigned int
#define __USER_LABEL_PREFIX__
#define __USING_SJLJ_EXCEPTIONS__ 1
#define __VERSION__ "4.3.2"
#define __WCHAR_MAX__ 32767
#define __WCHAR_TYPE__ int
#define __WINT_TYPE__ unsigned int
#define AVR 1
#define __APCS_32__ 1
#define __arm__ 1
#define __ARM_ARCH_7M__ 1
#define __ARM_EABI__ 1
#define __ARMEL__ 1
#define __BIGGEST_ALIGNMENT__ 8
#define __CHAR_BIT__ 8
#define __CHAR_UNSIGNED__ 1
#define __CHAR16_TYPE__ short unsigned int
#define __CHAR32_TYPE__ unsigned int
#define __DBL_DENORM_MIN__ 4.9406564584124654e-324
#define __DBL_DIG__ 15
#define __DBL_EPSILON__ 2.2204460492503131e-16
#define __DBL_HAS_DENORM__ 1
#define __DBL_HAS_INFINITY__ 1
#define __DBL_HAS_QUIET_NAN__ 1
#define __DBL_MANT_DIG__ 53
#define __DBL_MAX__ 1.7976931348623157e+308
#define __DBL_MAX_10_EXP__ 308
#define __DBL_MAX_EXP__ 1024
#define __DBL_MIN__ 2.2250738585072014e-308
#define __DBL_MIN_10_EXP__ (-307)
#define __DBL_MIN_EXP__ (-1021)
#define __DEC_EVAL_METHOD__ 2
#define __DEC128_EPSILON__ 1E-33DL
#define __DEC128_MANT_DIG__ 34
#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL
#define __DEC128_MAX_EXP__ 6145
#define __DEC128_MIN__ 1E-6143DL
#define __DEC128_MIN_EXP__ (-6142)
#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL
#define __DEC32_EPSILON__ 1E-6DF
#define __DEC32_MANT_DIG__ 7
#define __DEC32_MAX__ 9.999999E96DF
#define __DEC32_MAX_EXP__ 97
#define __DEC32_MIN__ 1E-95DF
#define __DEC32_MIN_EXP__ (-94)
#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF
#define __DEC64_EPSILON__ 1E-15DD
#define __DEC64_MANT_DIG__ 16
#define __DEC64_MAX__ 9.999999999999999E384DD
#define __DEC64_MAX_EXP__ 385
#define __DEC64_MIN__ 1E-383DD
#define __DEC64_MIN_EXP__ (-382)
#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD
#define __DECIMAL_DIG__ 17
#define __ELF__ 1
#define __FINITE_MATH_ONLY__ 0
#define __FLT_DENORM_MIN__ 1.40129846e-45F
#define __FLT_DIG__ 6
#define __FLT_EPSILON__ 1.19209290e-7F
#define __FLT_EVAL_METHOD__ 0
#define __FLT_HAS_DENORM__ 1
#define __FLT_HAS_INFINITY__ 1
#define __FLT_HAS_QUIET_NAN__ 1
#define __FLT_MANT_DIG__ 24
#define __FLT_MAX__ 3.40282347e+38F
#define __FLT_MAX_10_EXP__ 38
#define __FLT_MAX_EXP__ 128
#define __FLT_MIN__ 1.17549435e-38F
#define __FLT_MIN_10_EXP__ (-37)
#define __FLT_MIN_EXP__ (-125)
#define __FLT_RADIX__ 2
#define __GNUC__ 4
#define __GNUC_GNU_INLINE__ 1
#define __GNUC_MINOR__ 4
#define __GNUC_PATCHLEVEL__ 1
#define __GXX_ABI_VERSION 1002
#define __GXX_TYPEINFO_EQUALITY_INLINE 0
#define __INT_MAX__ 2147483647
#define __INTMAX_MAX__ 9223372036854775807LL
#define __INTMAX_TYPE__ long long int
#define __LDBL_DENORM_MIN__ 4.9406564584124654e-324L
#define __LDBL_DIG__ 15
#define __LDBL_EPSILON__ 2.2204460492503131e-16L
#define __LDBL_HAS_DENORM__ 1
#define __LDBL_HAS_INFINITY__ 1
#define __LDBL_HAS_QUIET_NAN__ 1
#define __LDBL_MANT_DIG__ 53
#define __LDBL_MAX__ 1.7976931348623157e+308L
#define __LDBL_MAX_10_EXP__ 308
#define __LDBL_MAX_EXP__ 1024
#define __LDBL_MIN__ 2.2250738585072014e-308L
#define __LDBL_MIN_10_EXP__ (-307)
#define __LDBL_MIN_EXP__ (-1021)
#define __LONG_LONG_MAX__ 9223372036854775807LL
#define __LONG_MAX__ 2147483647L
#define __NO_INLINE__ 1
#define __PTRDIFF_TYPE__ int
#define __REGISTER_PREFIX__
#define __SCHAR_MAX__ 127
#define __SHRT_MAX__ 32767
#define __SIZE_TYPE__ unsigned int
#define __SIZEOF_DOUBLE__ 8
#define __SIZEOF_FLOAT__ 4
#define __SIZEOF_INT__ 4
#define __SIZEOF_LONG__ 4
#define __SIZEOF_LONG_DOUBLE__ 8
#define __SIZEOF_LONG_LONG__ 8
#define __SIZEOF_POINTER__ 4
#define __SIZEOF_PTRDIFF_T__ 4
#define __SIZEOF_SHORT__ 2
#define __SIZEOF_SIZE_T__ 4
#define __SIZEOF_WCHAR_T__ 4
#define __SIZEOF_WINT_T__ 4
#define __SOFTFP__ 1
#define __STDC__ 1
#define __STDC_HOSTED__ 1
#define __thumb__ 1
#define __THUMB_INTERWORK__ 1
#define __thumb2__ 1
#define __THUMBEL__ 1
#define __UINTMAX_TYPE__ long long unsigned int
#define __USER_LABEL_PREFIX__
#define __USES_INITFINI__ 1
#define __VERSION__ "4.4.1"
#define __VFP_FP__ 1
#define __WCHAR_MAX__ 4294967295U
#define __WCHAR_TYPE__ unsigned int
#define __WINT_TYPE__ unsigned int
事前定義マクロ(Arduinoソフトウェア) F_CPU = 16000000
__AVR_ATmega328P__ = 1
F_CPU = 84000000
__SAM3X8E__ = 1
データ長 char 1 1
unsigned char 1 1
short 2 2
unsigned short 2 2
int 2 4 差分あり
unsigned int 2 4 差分あり
long 4 4
unsigned long 4 4
long long 8 8
unsigned long long 8 8
float 4 4
double 4 8 差分あり
long double 4 8 差分あり
byte 1 1
word 2 4 差分あり
void * 2 4 差分あり
pinMode() 出力モードに設定した後のデフォルト値 以前の出力値(プログラム開始後はLOW) 。
pinMode(pin, OUTPUT)としたときには、PORTの値を変更しない。
HIGH。
pinMode(pin, OUTPUT)としたときには、出力をHIGHにする。

実験

コンパイラ

事前定義マクロ(コンパイラ)

事前定義マクロ(コンパイラ)は、コンパイラを以下のようにコマンドラインから動かして確認しました。

Arduino Unoの場合

> avr-g++ -mmcu=atmega328p -dM -E - | sort

Arduino Dueの場合

> arm-none-eabi-g++.exe -mthumb -mcpu=cortex-m3 -dM -E - | sort

事前定義マクロ(Arduinoソフトウェア)

事前定義マクロ(Arduinoソフトウェア)は、以下のスケッチを動かして確認しました。

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  Serial.print("ARDUINO            = ");
  Serial.println(ARDUINO);

#if defined (__cplusplus)
  Serial.print("__cplusplus        = ");
  Serial.println(__cplusplus);
#endif

#if defined (F_CPU)
  Serial.print("F_CPU              = ");
  Serial.println(F_CPU);
#endif

#if defined (__AVR_ATmega328P__)
  Serial.print("__AVR_ATmega328P__ = ");
  Serial.print(__AVR_ATmega328P__);
#endif

#if defined (__SAM3X8E__)
  Serial.print("__SAM3X8E__        = ");
  Serial.println(__SAM3X8E__);
#endif

}

void loop() {
  // put your main code here, to run repeatedly: 
  
}

データ長

基本的なデータ型についてそれぞれのデータ長を調べました。

スケッチ

以下のスケッチを動かしました。

void setup() {
  // put your setup code here, to run once:
  char s[64];

  Serial.begin(9600);
  
  sprintf(s, "sizeof(char)                 = %d\n", sizeof(char));
  Serial.print(s);
  sprintf(s, "sizeof(unsigned char)        = %d\n", sizeof(unsigned char));
  Serial.print(s);
  sprintf(s, "sizeof(short)                = %d\n", sizeof(short));
  Serial.print(s);
  sprintf(s, "sizeof(unsigned short)       = %d\n", sizeof(unsigned short));
  Serial.print(s);
  sprintf(s, "sizeof(int)                  = %d\n", sizeof(int));
  Serial.print(s);
  sprintf(s, "sizeof(unsigned int)         = %d\n", sizeof(unsigned int));
  Serial.print(s);
  sprintf(s, "sizeof(long)                 = %d\n", sizeof(long));
  Serial.print(s);
  sprintf(s, "sizeof(unsigned long)        = %d\n", sizeof(unsigned long));
  Serial.print(s);
  sprintf(s, "sizeof(long long)            = %d\n", sizeof(long long));
  Serial.print(s);
  sprintf(s, "sizeof(unsigned long long)   = %d\n", sizeof(unsigned long long));
  Serial.print(s);
  sprintf(s, "sizeof(float)                = %d\n", sizeof(float));
  Serial.print(s);
  sprintf(s, "sizeof(double)               = %d\n", sizeof(double));
  Serial.print(s);
  sprintf(s, "sizeof(long double)          = %d\n", sizeof(long double));
  Serial.print(s);
  sprintf(s, "sizeof(byte)                 = %d\n", sizeof(byte));
  Serial.print(s);
  sprintf(s, "sizeof(word)                 = %d\n", sizeof(word));
  Serial.print(s);
  sprintf(s, "sizeof(void *)               = %d\n", sizeof(void *));
  Serial.print(s);
}

void loop() {
  // put your main code here, to run repeatedly: 
  
}

結果

結果は以下の通りです。Arduino Dueでは、word/intが4バイトに、doubleが8バイトとなっています。

Arduino Unoでの結果 Arduino Dueでの結果

pinMode()

出力モードに設定した後のデフォルト値

以下のスケッチを動かした後、内蔵LEDの点灯状況を確認しました。

プログラム起動直後に設定した場合の挙動を以下のスケッチで確認しました。結果は、Uno→消灯、Due→点灯。

void setup() {
  // put your setup code here, to run once:
  pinMode(13, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly: 
}

一度HIGHにした後、再度、出力モードに設定。

void setup() {
  // put your setup code here, to run once:
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
  pinMode(13, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly: 
  
}

一度LOWにした後、再度、出力モードに設定。

void setup() {
  // put your setup code here, to run once:
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
  pinMode(13, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly: 
  
}

上記の結果は以下の通りです。

プログラム概要 Uno Due
1 pinMode(13, OUTPUT) 消灯 点灯
2 digitalWrite(13, HIGH) → pinMode(13, OUTPUT) 点灯 点灯
3 digitalWrite(13, LOW) → pinMode(13, OUTPUT) 消灯 点灯

上記により、Unoでは出力モードに切り替えるが値は変更しない。Dueでは出力モードに切り替えたときに値をHIGHにすることがわかります。ソースコードでも確認したところ、実際そのようにコーディングされていました。

Uno/Due双方で動くプログラムを作成する場合は、出力モードに変更した直後の値には気を付けたほうがよさそうです。

バージョン

Arduino 1.5.2(Uno/AVR)、Arduino 1.5.2(Due/SAM)



メニューを表示するためにJavaScriptを有効にしてください。

Arduinoで遊ぶページ
Copyright © 2013 garretlab all rights reserved.
inserted by FC2 system