GR-SAKURAのArduino互換機能についてのまとめです。
ライブラリの動作まで確認すると大変なので、ここでは言語仕様についてのみ検証しています。
内容については無保証です。
誰でも編集出来る設定となっていますので、間違いの修正や追記など、どしどしお願いします。
GR-SAKURA のArduino互換ライブラリはArduino IDE 0022と互換性があるとのことです。
※βテスト中に聞いた話なので、情報のソースを示すことができません。
arduino-0022/reference/index.htmlと比較し、互換性について検証します。
テンプレート
V1.00
Web Compiler
GNURX
v12.01
Arduinoについては、IDE0022+ Arduino MEGA 2560R2で動作確認を行っています。(RAM容量の都合)
添付の"Arduino_compatibility_LangRef.pde"をWebComplierにてビルド。
※Arduino IDE 0022では問題なくコンパイルできる。
凡例
OK 問題なくコンパイルできる
NG コンパイルエラーとなる
△ コンパイルできるが動作がArduinoと異なるもの
Structure
Variables
Constants
HIGH | LOW
HIGH
LOW
INPUT | OUTPUT
INPUT
OK
true | false
integer constants
decimal
B1111011
0173
hexadecimal
0x7B
unsigned
33u
100000L
32767ul
floating point constants
2.34E5
67e-12
Data Types
void
以下、空白は
スケッチ参照
boolean
char
unsigned char
テンプレE0.90より対応
Arduinoは16bit長。GR-SAKURAは32bit長。
intはアーキテクチャディペンドなので、ひとまず無視。
unsigned int
16bitが必要ならunsigned shortを使う。
unsigned long
string - char array
String - object
array
Conversion
char()
byte()
int()
word()
long()
float()
Variable Scope
& Qualifiers
variable scope
static
volatile
const
Utilities
sizeof()
PROGMEMを指定できるが、読み出し用のpgm_read_xxxxが無い。ただし、これはArduinoではなくてavr-gccの仕様。
GR-SAKURAでは"OUTPUTHIGH"を指定可能
GR-SAKURAでは"INPUT_PULLUP"を指定可能(Arduino1.0.1相当)
DEFAULT
GR-SAKURAでは10bit で 3.3/5倍の値に補正。(3.3Vで675)
REF=1.1V
AnalogReference(RAW12BIT)で12bitの精度となる
最大15ポートまで(UNOは6ポートまで)
PWM周波数はArduinoは490Hz固定だが、GR-SAKURAは
analogWriteFrequency()で指定可能。 (12~184999Hz)
また、GR-SAKURAはDACを持っているため、
analogWriteDAC()の実行も可能。
tone()
MSBFIRST
LSBFIRST
pulseIn()
ドキュメントにはないけど念のため
Trigonometry
radians()
random(max)
random(min,max)
割り込み番号とピン番号がArduinoと異なる
attachInterrupt()と同じ
Arduino Megaと同様に、Serial,Serial1,Serial2,Serial3が使用可能。ただし、Arduinoの様に固定ではなく、begin()で任意のポートをアサイン可能。
begin()
第2引数でアサインするポートを指定可能。
省略した場合はUSB仮想COMポートが有効となる。
SCI_SCI0P2x
SCI_SCI1JTAG
USB、SCI0、SCI1の中でいずれかの通信を受信するまで待機し最初に受信したポートが使われる
USB仮想COMとIO0,IO1(SCI_SCI0P2X)は連動しない。(Arduino Leonardoと同じ動作)
print(78)
ArduinoIDE1.0と同様にwrite()推奨
print(1.23456, 0)
bool型変数
unsigned char型変数
unsigned int型変数
添付の"Arduino_compatibility_LangRef.pde"をWebComplierでビルドして実行。
Arduino0022では最後まで実行できるが、GR-SAKURAでは、Interruptsのテストで停止する。
Arudino0022では、割り込み禁止でもSerial.printが実行可能。Arduino1.0では、割り込み禁止中は出力が停止するが、割り込み許可で再開する。
GR-SAURAは割り込み系の関数(4関数)を実行すると、Serial.printの出力が止まり、割り込みを許可しても出力データはロストする。
4pinと6pinをジャンパーで接続。
A0と5V(GR-SAKURAは3.3V)で接続。
A1と5pinをジャンパーで接続。
OK 結果が一致するもの
NG 結果が一致しないもの
△ 一部結果が異なるもの
※網羅的なテストを実施しているわけではないので、結果は参考値。
Arduino
出力値
GR-SAKURA
コンパイルできたことでOKとする
GR-SAKURAではアクセス関数は使えないが、直接アクセスが可能。
たぶん
未検証
(REF=3.3V)
(REF=1.1V)
8bitの送出時間は
Arduinoは165us程度、
GR-SAKURAは20us程度。
t1=millis();
delay(1000);
t2=millis();
t3=t2-t1;
2789,1788,1001
6599,5599,1000
t1=micros()
delayMicroseconds(16383)
t2=micros()
2835064,2818576,16488
6615420,6599036,16384
min(1, 100)
min(-0.5, -0.1)
max(1, 100)
max(-0.5, -0.1)
constrain(0.8, -0.1, 2.5)
map(600, 0, 1023, 0, 255)
map(2000, 0, 1023, 0, 255)
pow(10, 2.1)
NaNは何?
(libmの振る舞いが異なる。コンパイラによる差異と思われる)
負数を指定することはないので実害はないと想定。
round(10.1) : 10
round(10.49) : 10
round(10.5) : 11
round(10.9) : 11
10
11
sin(radians(10))
cos(radians(10))
tan(radians(90))
-22877332.00
degrees(pi)
random(300)
random(10,20)
lowByte(0x12345678)
highByte(0x12345678)
bitRead(B11010001, 7)
bitRead(B11010001, 6)
bitRead(B11010001, 5)
bitRead(B11010001, 4)
bitRead(B11010001, 3)
bitRead(B11010001, 2)
bitRead(B11010001, 1)
bitRead(B11010001, 0)
1
0
bwr = 0xff;
bitWrite(bwr, 7, 0)
bitSet(bwr, 7)
bitClear(bwr, 7)
bitWrite(bwr, 7, 1)
bitWrite(bwr, 6, 0)
bitSet(bwr, 6)
bitClear(bwr, 6)
bitWrite(bwr, 6, 1)
bitWrite(bwr, 5, 0)
bitSet(bwr, 5)
bitClear(bwr, 5)
bitWrite(bwr, 5, 1)
bitWrite(bwr, 4, 0)
bitSet(bwr, 4)
bitClear(bwr, 4)
bitWrite(bwr, 4, 1)
bitWrite(bwr, 3, 0)
bitSet(bwr, 3)
bitClear(bwr, 3)
bitWrite(bwr, 3, 1)
bitWrite(bwr, 2, 0)
bitSet(bwr, 2)
bitClear(bwr, 2)
bitWrite(bwr, 2, 1)
bitWrite(bwr, 1, 0)
bitSet(bwr, 1)
bitClear(bwr, 1)
bitWrite(bwr, 1, 1)
bitWrite(bwr, 0, 0)
bitSet(bwr, 0)
bitClear(bwr, 0)
bitWrite(bwr, 0, 1)
11111111
1111111
10111111
11011111
11101111
11110111
11111011
11111101
11111110
bit(7)
bit(6)
bit(5)
bit(4)
bit(3)
bit(2)
bit(1)
bit(0)
80
40
20
8
4
2
GR-SAKURAでこれらの関数を実行すると、各種通信機能やタイマが停止するため、setupのみで実行することが望ましい。
print("78")
78
print(78,BYTE)
print(78,BIN)
1001110
print(78,OCT)
print(78,DEC)
print(78,HEX)
println(blFlagT)
println(blFlagF)
GR-SAKURAはtrue=1,false=0
Arduinoは何も出力されない。
普通、bool値をprintしないので
対応は不要?
println(cData)
println(ucData)
println(iData)
print(uiData)
println(lData)
100000
println(ulData)
32767
println(dData)
234000.00
0.00
println(strBuf)
stringStr)
print()/println()
char桁あふれ
char c = 128;
println(c, BIN)
11111111111111111111111110000000
10000000
println(c, OCT)
37777777600
println(c, DEC)
-128
println(c, HEX)
FFFFFF80
write(65)
write("BCD")
write(strBuf)
write(ucBuf, 1)
2012.07.30 V1.00での検証結果を反映。
Attachment: http://japan.renesasrulz.com/gr_user_forum_japanese/m/mediagallery/23.aspx