Arduino UNOと Multifunction shield を使ったリズムボックスを紹介します。
Arduinoリズムボックスの使い方
ARDUINOリズムボックスの使い方を説明します。
- LED リズム:1/4, 2/4, ….. 9/8 まで拍子ができる
- 3-- プッ・プッ・ピッ と3/4で変化する。
- LED ビート:1分間のビート数
- 120 -- 1分に120回の音がでる。
- スイッチ S1: リズムを変える
- 1-->2--> …… -->9 -->1
- スイッチ S2:ビートを早くする
- スイッチ S3:ビートを遅くする
回路図
これは回路図ですが、8セグLEDとスイッチはMultifunction shield のを使います、そしてピエゾスピーカーをA5ピンとGNDピンに接続しました。他の部品は使っていません。
- スピーカー 赤線:Pin A5, 黒線: GND
- スイッチ S1: Pin A1、S2: Pin A2, S3: Pin A3
- 8セグLED SDI: Pin 8, CLK: Pin 7, LAT: Pin 4
プログラム構造
MsTimer2割り込みを2msインターバルで使います。ここでは8セグLEDの表示とスイッチ(S1,S2,S3)をチェックしています。
LOOP内ではTone時間と無音時間の設定を変数beatとpatternで行います。
デモビデオ
ソースコード
#include <mstimer2 .h> #define S1 A1 // Switch S1 #define S2 A2 // Switch S2 #define S3 A3 // Switch S3 #define SDI 8 // Serial data in pin #define CLK 7 // Clock Pin #define LAT 4 // Latch Pin #define SPEAKER A5 // Speaker Pin int s1Latch; //Switch S1 Latch int s2Latch; //Switch S2 Latch int s3Latch; //Switch S3 Latch int beat = 120; //BEAT parameter int pattern = 1; //RYTHM parameter int count; void Display (byte digit4, byte digit3, byte digit2, byte digit1); unsigned char NUM_pattern[] = { 0b00000011, // 0 0b10011111, // 1 0b00100101, // 2 0b00001101, // 3 0b10011001, // 4 0b01001001, // 5 0b01000001, // 6 0b00011011, // 7 0b00000001, // 8 0b00011001 // 9 }; unsigned char Digit_pattern[] = { 0b00010000, 0b00100000, 0b01000000, 0b10000000 }; void tick(void) { int d3, d2, d1; d3 = beat / 100; d2 = (beat - d3 * 100) / 10; d1 = beat % 10; Display(pattern, d3, d2, d1); if (digitalRead(S1) == LOW) { if (s1Latch == LOW) { s1Latch = 1; pattern++; if (pattern > 9) pattern = 1; } } else s1Latch = 0; if (digitalRead(S2) == LOW) { if (s2Latch == 0) { s2Latch = 1; beat++; if (beat > 240) beat = 240; } } else s2Latch = 0; if (digitalRead(S3) == LOW) { if (s3Latch == 0) { s3Latch = 1; beat--; if (beat < 30) beat = 30; } } else s3Latch = 0; } void setup() { pinMode(SDI, OUTPUT); pinMode(CLK, OUTPUT); pinMode(LAT, OUTPUT); pinMode(S1, INPUT); pinMode(S2, INPUT); MsTimer2::set(2, tick); // tick のコール MsTimer2::start(); } void loop() { if (count % pattern == 0) tone(A5, 3830 , 20); else tone(A5, 2864 , 20); count++; delay(60000 / beat - 20); } void Display(byte digit4, byte digit3, byte digit2, byte digit1) { static int Seg_count = 0; Seg_count++; switch (Seg_count) { case 1: digitalWrite(LAT, LOW); shiftOut(SDI, CLK, LSBFIRST, NUM_pattern[digit1]); shiftOut(SDI, CLK, LSBFIRST, Digit_pattern[0]); digitalWrite(LAT, HIGH); break; case 2: digitalWrite(LAT, LOW); shiftOut(SDI, CLK, LSBFIRST, NUM_pattern[digit2]); shiftOut(SDI, CLK, LSBFIRST, Digit_pattern[1]); digitalWrite(LAT, HIGH); break; case 3: digitalWrite(LAT, LOW); shiftOut(SDI, CLK, LSBFIRST, NUM_pattern[digit3]); shiftOut(SDI, CLK, LSBFIRST, Digit_pattern[2]); digitalWrite(LAT, HIGH); break; case 4: digitalWrite(LAT, LOW); shiftOut(SDI, CLK, LSBFIRST, NUM_pattern[digit4] - 1); shiftOut(SDI, CLK, LSBFIRST, Digit_pattern[3]); digitalWrite(LAT, HIGH); Seg_count = 0; break; default: break; } }
0 件のコメント:
コメントを投稿