//------------------------------------------------- // マトリクスLEDにサイン波のつもりが失敗して変な波に。 //------------------------------------------------- // 列の制御ピン番号 byte colpin[] = {2, 3, 4, 5, 6, 7, 8, 9}; // 行の制御ピン番号 byte rowpin[] = {10, 11, 12, 14, 15, 16, 17, 18}; //----------------------------------------------------------- // 初期化 //----------------------------------------------------------- void setup() { // 制御する全部のピン for(byte i=0 ; i<8 ; i++ ) { // 列の制御ピンを初期化 pinMode(colpin[i], OUTPUT); digitalWrite(colpin[i], LOW); // 行の制御ピンを初期化 pinMode(rowpin[i], OUTPUT); digitalWrite(rowpin[i], HIGH); } } //----------------------------------------------------------- // ループ処理 //----------------------------------------------------------- void loop() { static int count = 0; //カウント // 位相用 #define PHASE_COUNT 500 #define PHASE_HALF (PHASE_COUNT/2) // 周波数用 #define FRQ 72 #define FRQ_HALF (FRQ/2) // カウント count++; // 位相を求める。 float phase = PI * (float)((count%PHASE_COUNT)-PHASE_HALF)/(float)PHASE_HALF; // 周波数を求める。 float frq = 5.0 + 40.0 * (float)(abs(FRQ_HALF-(count%FRQ)))/(float)FRQ_HALF; // float frq = 50.0; // サインカーブを計算する。 for( byte col=0 ; col<8 ; col++ ) { // ラジアン角に変換 float r = (float)col * frq * PI / 180.0; // 0~6の範囲の数値に変換 byte row = (byte)(4 + sin(r+phase) * 3.9); // LEDに表示。 Led(col,row); } } //----------------------------------------------------------- // LEDに表示する //----------------------------------------------------------- void Led(byte col,byte row) { // 該当の列と行のLEDを点灯にする。 digitalWrite(rowpin[row], LOW); digitalWrite(colpin[col], HIGH); // LEDが光っている時間 delayMicroseconds(300); // LEDを消灯。 digitalWrite(rowpin[row], HIGH); digitalWrite(colpin[col], LOW); }