2018年06月12日
【番外編1】Auduino_v5 / ブレッドボード
Auduinoって?
ロボットのためにArduinoのことを調べているときに"Auduino"というのを見かけた
AuduinoはArduinoを使ったシンセサイザーのようなもののよう
ロボット作りと直接関係ないけど寄り道は楽しい
というわけで番外編
今回は、第6回「シンプルなのに出音がすごいシンセサイザ - Auduino入門」を参考に「Auduino_v5」を作ります
この記事は・・・(2009年 7月 16日)のものなんですかね・・・結構前ですね・・・知らんかった
では、やってみます
ブレッドボードでAuduino
(1)配線
ブレッドボードを使って組んでみます
(材料)
1. Arduino UNO (互換品)x1
2. Arduino UNO付属のUSBケーブル x1
3. B10Kポテンショメーター x5
4. 0.5Wスピーカー x1
5. ブレッドボード x1
6. ジャンパワイヤー x必要数
そんなに複雑じゃ無いのでブレッドボードいらないんですが・・・
一応できました
写真だとわかりにくいのでFritzingも置いて
(2)スケッチ
スケッチは第6回「シンプルなのに出音がすごいシンセサイザ - Auduino入門」の記事中に紹介されているtinker.it のリスト中のauduino_v5.pdeをダウンロードしてAuduino IDEで開きます
auduino_v5
――――――――――(auduino_v5)――――――――――
// Auduino, the Lo-Fi granular synthesiser
//
// by Peter Knight, Tinker.it http://tinker.it
//
// Help: http://code.google.com/p/tinkerit/wiki/Auduino
// More help: http://groups.google.com/group/auduino
//
// Analog in 0: Grain 1 pitch
// Analog in 1: Grain 2 decay
// Analog in 2: Grain 1 decay
// Analog in 3: Grain 2 pitch
// Analog in 4: Grain repetition frequency
//
// Digital 3: Audio out (Digital 11 on ATmega8)
//
// Changelog:
// 19 Nov 2008: Added support for ATmega8 boards
// 21 Mar 2009: Added support for ATmega328 boards
// 7 Apr 2009: Fixed interrupt vector for ATmega328 boards
// 8 Apr 2009: Added support for ATmega1280 boards (Arduino Mega)
#include
#include
uint16_t syncPhaseAcc;
uint16_t syncPhaseInc;
uint16_t grainPhaseAcc;
uint16_t grainPhaseInc;
uint16_t grainAmp;
uint8_t grainDecay;
uint16_t grain2PhaseAcc;
uint16_t grain2PhaseInc;
uint16_t grain2Amp;
uint8_t grain2Decay;
// Map Analogue channels
#define SYNC_CONTROL (4)
#define GRAIN_FREQ_CONTROL (0)
#define GRAIN_DECAY_CONTROL (2)
#define GRAIN2_FREQ_CONTROL (3)
#define GRAIN2_DECAY_CONTROL (1)
// Changing these will also requires rewriting audioOn()
#if defined(__AVR_ATmega8__)
//
// On old ATmega8 boards.
// Output is on pin 11
//
#define LED_PIN 13
#define LED_PORT PORTB
#define LED_BIT 5
#define PWM_PIN 11
#define PWM_VALUE OCR2
#define PWM_INTERRUPT TIMER2_OVF_vect
#elif defined(__AVR_ATmega1280__)
//
// On the Arduino Mega
// Output is on pin 3
//
#define LED_PIN 13
#define LED_PORT PORTB
#define LED_BIT 7
#define PWM_PIN 3
#define PWM_VALUE OCR3C
#define PWM_INTERRUPT TIMER3_OVF_vect
#else
//
// For modern ATmega168 and ATmega328 boards
// Output is on pin 3
//
#define PWM_PIN 3
#define PWM_VALUE OCR2B
#define LED_PIN 13
#define LED_PORT PORTB
#define LED_BIT 5
#define PWM_INTERRUPT TIMER2_OVF_vect
#endif
// Smooth logarithmic mapping
//
uint16_t antilogTable[] = {
64830,64132,63441,62757,62081,61413,60751,60097,59449,58809,58176,57549,56929,56316,55709,55109,
54515,53928,53347,52773,52204,51642,51085,50535,49991,49452,48920,48393,47871,47356,46846,46341,
45842,45348,44859,44376,43898,43425,42958,42495,42037,41584,41136,40693,40255,39821,39392,38968,
38548,38133,37722,37316,36914,36516,36123,35734,35349,34968,34591,34219,33850,33486,33125,32768
};
uint16_t mapPhaseInc(uint16_t input) {
return (antilogTable[input & 0x3f]) >> (input >> 6);
}
// Stepped chromatic mapping
//
uint16_t midiTable[] = {
17,18,19,20,22,23,24,26,27,29,31,32,34,36,38,41,43,46,48,51,54,58,61,65,69,73,
77,82,86,92,97,103,109,115,122,129,137,145,154,163,173,183,194,206,218,231,
244,259,274,291,308,326,346,366,388,411,435,461,489,518,549,581,616,652,691,
732,776,822,871,923,978,1036,1097,1163,1232,1305,1383,1465,1552,1644,1742,
1845,1955,2071,2195,2325,2463,2610,2765,2930,3104,3288,3484,3691,3910,4143,
4389,4650,4927,5220,5530,5859,6207,6577,6968,7382,7821,8286,8779,9301,9854,
10440,11060,11718,12415,13153,13935,14764,15642,16572,17557,18601,19708,20879,
22121,23436,24830,26306
};
uint16_t mapMidi(uint16_t input) {
return (midiTable[(1023-input) >> 3]);
}
// Stepped Pentatonic mapping
//
uint16_t pentatonicTable[54] = {
0,19,22,26,29,32,38,43,51,58,65,77,86,103,115,129,154,173,206,231,259,308,346,
411,461,518,616,691,822,923,1036,1232,1383,1644,1845,2071,2463,2765,3288,
3691,4143,4927,5530,6577,7382,8286,9854,11060,13153,14764,16572,19708,22121,26306
};
uint16_t mapPentatonic(uint16_t input) {
uint8_t value = (1023-input) / (1024/53);
return (pentatonicTable[value]);
}
void audioOn() {
#if defined(__AVR_ATmega8__)
// ATmega8 has different registers
TCCR2 = _BV(WGM20) | _BV(COM21) | _BV(CS20);
TIMSK = _BV(TOIE2);
#elif defined(__AVR_ATmega1280__)
TCCR3A = _BV(COM3C1) | _BV(WGM30);
TCCR3B = _BV(CS30);
TIMSK3 = _BV(TOIE3);
#else
// Set up PWM to 31.25kHz, phase accurate
TCCR2A = _BV(COM2B1) | _BV(WGM20);
TCCR2B = _BV(CS20);
TIMSK2 = _BV(TOIE2);
#endif
}
void setup() {
pinMode(PWM_PIN,OUTPUT);
audioOn();
pinMode(LED_PIN,OUTPUT);
}
void loop() {
// The loop is pretty simple - it just updates the parameters for the oscillators.
//
// Avoid using any functions that make extensive use of interrupts, or turn interrupts off.
// They will cause clicks and poops in the audio.
// Smooth frequency mapping
//syncPhaseInc = mapPhaseInc(analogRead(SYNC_CONTROL)) / 4;
// Stepped mapping to MIDI notes: C, Db, D, Eb, E, F...
//syncPhaseInc = mapMidi(analogRead(SYNC_CONTROL));
// Stepped pentatonic mapping: D, E, G, A, B
syncPhaseInc = mapPentatonic(analogRead(SYNC_CONTROL));
grainPhaseInc = mapPhaseInc(analogRead(GRAIN_FREQ_CONTROL)) / 2;
grainDecay = analogRead(GRAIN_DECAY_CONTROL) / 8;
grain2PhaseInc = mapPhaseInc(analogRead(GRAIN2_FREQ_CONTROL)) / 2;
grain2Decay = analogRead(GRAIN2_DECAY_CONTROL) / 4;
}
SIGNAL(PWM_INTERRUPT)
{
uint8_t value;
uint16_t output;
syncPhaseAcc += syncPhaseInc;
if (syncPhaseAcc < syncPhaseInc) {
// Time to start the next grain
grainPhaseAcc = 0;
grainAmp = 0x7fff;
grain2PhaseAcc = 0;
grain2Amp = 0x7fff;
LED_PORT ^= 1 << LED_BIT; // Faster than using digitalWrite
}
// Increment the phase of the grain oscillators
grainPhaseAcc += grainPhaseInc;
grain2PhaseAcc += grain2PhaseInc;
// Convert phase into a triangle wave
value = (grainPhaseAcc >> 7) & 0xff;
if (grainPhaseAcc & 0x8000) value = ~value;
// Multiply by current grain amplitude to get sample
output = value * (grainAmp >> 8);
// Repeat for second grain
value = (grain2PhaseAcc >> 7) & 0xff;
if (grain2PhaseAcc & 0x8000) value = ~value;
output += value * (grain2Amp >> 8);
// Make the grain amplitudes decay by a factor every sample (exponential decay)
grainAmp -= (grainAmp >> 8) * grainDecay;
grain2Amp -= (grain2Amp >> 8) * grain2Decay;
// Scale output to the available range, clipping if necessary
output >>= 9;
if (output > 255) output = 255;
// Output to PWM (this is faster than using analogWrite)
PWM_VALUE = output;
}
―――――――――――――――――――――――――――
(3)実行
(2)のスケッチをArduinoに書き込んで実行します
初めは小さなビープ音しか聴こえなくて、なんか失敗したかなって感じだったんですが、ノブを色々いじってみるとそれなりに音が聴こえるようになりました
ちょっと楽しくていろいろいじって遊んでしまった
でも・・・音が小さいというか・・・小さい音の中にもかすかに音の変化があるというか・・・何かを聴き落としているような・・・
もっと大きなスピーカーに繋ぐとかイヤホンで聴いた方が良いかな?
というわけで、4極オーディオジャック実装済み基板につないでイヤホンで聴いてみます
4極オーディオジャック実装済み基板
イヤホンから出ている音だけでもスピーカーより大きいような・・・
途中イヤホンの左右のつなぎ変えの方法を確かめたりしてます
音が聞こえないところでは耳にイヤホンを入れて聴いてます
イヤホンを耳で聴いたら、耳が痛いくらいの大音量になったけど、音の傾向は変わらず、逆にゲインが大きすぎると耳に良く無さそうで聴きにくい
心持ちビビリノイズが増えているような・・・
これはアンプに繋いでボリューム調節できないとダメなんじゃ・・・オーディオジャック経由でアンプ付きスピーカーに繋ぐしか無いのかな・・・持ち運びできるといいんだが・・・
なんかいいのないかなあってググっててAmazonでボリュームノブのついた小型オーディオアンプボードを見つけたのでつないでみる
小型オーディオアンプボード
小型オーディオアンプボードのスルーホールに直接ジャンパー線をつないで接続しているのでところどころ接触が悪くて音が飛んでます・・・
結果はまあ、いいんじゃないでしょうか
小さな音の変化を拾いやすくなったような気がします
これくらいの構成で一度ケースに組み込んでみようと思います
ではまた〜
新品価格 |
Raspberry Pi3 Model B ボード&ケースセット (Element14版, Clear)-Physical Computing Lab 新品価格 |
Arduinoをはじめよう 第3版 (Make:PROJECTS) 新品価格 |
Arduinoをはじめよう 互換キット UNO R3対応互換ボード 初心者専用実験キット 基本部品セット20 in 1 Arduino sidekick basic kit 新品価格 |
新品価格 |
Arduino エントリーキット(Uno版)- Physical Computing Lab 新品価格 |
タミヤ 楽しい工作シリーズ No.216 3ch RCロボット製作セット 70216 新品価格 |
新品価格 |
新品価格 |
新品価格 |
タミヤ 楽しい工作シリーズ No.211 アームクローラー工作セット 70211 新品価格 |
タミヤ 楽しい工作シリーズ No.97 ツインモーターギヤーボックス (70097) 新品価格 |
タミヤ 楽しい工作シリーズ No.106 4チャンネル・リモコンボックス (70106) 新品価格 |
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7764244
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック