現在、arduinoで赤外線リモコンを作成しております。
ネット上の情報を参考にON/OFFのみの送信・受信はできたので、ボタンの数(mode)を21種類に増やして送信機を作成を試みております。
赤外線のON/OFFパターンの配列データが大きかったのでdata[][67]としてPROGMEM に保管し、SRAMにondata[67]として読み込もうとしています。
この状態でコンパイルすると下記のようなエラーが出てしまいます。
[mode][i][cnt]を配列のインデックス(添え字)として使っていますが、これを使用している行にこのエラーが出ます。
調べてみると添え字はintではいけないといった情報もみかけますが、data[i]のように使用されているのをよく見かけます。
データ型を変えてみたり試してみたのですが、'char[int]' や'int[char]'のように変わるだけで解決しませんでした。
このエラーに対して何か解決策があればご教授願えないでしょうか。
よろしくお願い致します。
※エラー
invalid types 'int[int]' for array subscript
※グローバル変数(PROGMEM に保存)
const uint16_t data[21][67] PROGMEM = { /* 4bytes(16bits), Leader code & Customer code(CC) & Data code & ^Data code & Mode code */
/* data[0] */ {9200, 4500, 600, 1650, 600, 1650, 600, 550, 600, 550, 600, 1650, 600, 1650, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 550, 600, 1650, 600, 550, 600, 1650, 600, 550, 600, 1650, 600, 550, 600, 1650, 600},
/* data[1] */ {9200, 4500, 600, 1650, 600, 1650, 600, 550, 600, 550, 600, 1650, 600, 1650, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 550, 600, 550, 600, 1650, 600, 550, 600, 1650, 600, 550, 600, 1650, 600, 550, 600, 1650, 600},
・
・
・
/* data[20] */ {9200, 4500, 600, 1650, 600, 1650, 600, 550, 600, 550, 600, 1650, 600, 1650, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 550, 600, 1650, 600, 550, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 1650, 600, 550, 600, 1650, 600, 550, 600, 1650, 600, 550, 600, 1650, 600, 550, 600, 1650, 600, 550, 600, 1650, 600},
};
※関数
void sendOnSignal(int mode){
int ondata[67];
for (int i = 0; i < 67; i++)
{ondata[i] = pgm_read_word_near(&(data[mode][i]));}
int dataSize = sizeof(ondata[mode]) / sizeof(ondata[mode][0]); /* IRcodeの配列数を計算。67になるはず。 */
for(int cnt = 0; cnt < 67; cnt++) /* iIndexIRcode(現在の配列)が偶数番目ならhigh。 奇数番目ならlow。 */
{
unsigned long len = ondata[mode][cnt]; /* lenに現在の配列の時間を代入。 */
unsigned long us = micros(); /* usにパルス開始時刻を記録。 */
do { /* 周波数38kHzでOn/Offするように配列の時間分点滅。 */
digitalWrite(IRLED_pin, (cnt%2) ? LOW : HIGH); /* 三項演算子[A ? B : C] (Aがtrueの場合はB,falseの場合はCを実行する) */
delayMicroseconds(8); /* キャリア周波数38kHzでON/OFFするよう時間調整 */
digitalWrite(IRLED_pin, LOW);
delayMicroseconds(7);
} while (long(us + len - micros()) > 0); /* 送信時間に達するまでループ */
}
} /* void sendSignal終了*/
お礼
ありがとうございます! PROGMEMに保存している data[mode][]と、SRAMに準備したondata[cnt]の2つが名前が似ていたのでondataに[mode]つけたりと混同していました。 しっかり分けることで解決しました! (はっきりと区別できる名前にすべきでした。) 下記に修正後のスケッチを記載しておきます。 こんな短時間で解決策を提示していただいてありがとうございました。 int ondata[67]; for (int i = 0; i < 67; i++) {ondata[i] = pgm_read_word_near(&(data[mode][i]));} int dataSize = sizeof(ondata) / sizeof(ondata[0]); for(int cnt = 0; cnt < 67; cnt++) { unsigned long len = ondata[cnt];