SSブログ

スピーカーとの接続 [Arduino]

たぶん、いけないんだろうと思いながらも、今までスピーカーとArduino (AVR) を直接つないでいました。

エレキジャックのSDカードでWAV再生の記事では、

lineout_ej.png

こんな感じで、抵抗を挟んだり、コンデンサを付けたりしてありました。

また、音声合成LSIというのがあって、、

AquesTalk - テキスト音声合成ミドルウェア
http://www.a-quest.com/products/aquestalk.html

音声合成LSI ATP3012F5-PU(落ち着いた女声): 半導体 秋月電子通商 電子部品 ネット通販
http://akizukidenshi.com/catalog/g/gI-06218/

をはじめ、何種類か発売されています。
これに使われているマイコンがATmega328であり、DIP版の12番ピン (PD6, OC0A) が出力になっています。

lineout_aq1.png

lineout_aq2.png

今後は少し気を遣ってみてもいいかもしれません。

新・踏切カンカン 省エネ? ATtiny13A版 [Arduino]

ATtiny13AでPWMを使った踏切カンカンです。

fk_tn13_pwm_sleep.png
接続は、8-PDIP/SOIC では、
 2 (PB3), 3 (PB4) をLEDに、
 4 (GND) を乾電池のマイナス極に、
 5 (PB0, OC0A) をスピーカーに、
 6 (PB1, INT0) をタクトスイッチで、ボタンを押すとGNDに落ちるように
 8 (VCC) を乾電池のプラス極に
つなぎます。

// 踏切音くん (ATtiny13, 9.2MHz), Sleep mode 付き
#include <avr/sleep.h>

byte swFlg  = 0;                                   // スイッチの状態

void setup() {
  DDRB   = B11001;                                 // PB0(OC0A)をサウンド出力, PB3,PB4をLED ,
  PORTB  = B10010;                                 // PB1(INT0)をスイッチ入力 (内部PullUp有効) とする
  TCCR0A = _BV(COM0A1) | _BV(WGM01) | _BV(WGM00);  // 8bit高速PWM
  TCCR0B = _BV(CS00);                              // 分周なし
  TIMSK0 = 0;                                      // Arduino の割り込みを潰す
}

void wakeUpNow() {       // here the interrupt is handled after wakeup
 }

void sleepNow() {        // here we put the arduino to sleep
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);           // sleep mode is set here
    sleep_enable();                                // enables the sleep bit in the mcucr register
    attachInterrupt(0, wakeUpNow, LOW);            // use interrupt 0 (pin 1) 
    sleep_mode();                                  // here the device is actually put to sleep!!
    sleep_disable();                               // first thing after waking from sleep:
    detachInterrupt(0);                            // disables interrupt 0 on pin 1
}
  
void loop() {
  unsigned int pwmVal, t;  
  if( !swFlg ) {                                   // スイッチが押されていなければスリープモードに入る
    OCR0B = 0;                                     // 消音
    PORTB &= ~B11000;                              // LEDを消灯
    sleepNow();                                    // sleep function called here
    PORTB |=  B10000;                              // LED点灯開始
  }
  swFlg = 0;                                       // スイッチの確認フラグを降ろしておく
  PORTB ^= B11000;                                 // LEDを交互に光らせる
  for( t = 0; t < 15000; t++ ) {                   // 音発生用のループ
    pwmVal = (t & B111111)  * (255 - (t>>6)) >> 6; // 計算式で音の波形をつくる
    while( !(TIFR0 & _BV(TOV0)) ) {                // タイマーがオーバーフローするのを待つ
      if( !(PINB & B00010) ) swFlg = 1;            // スイッチが押されていたら(LOWなら)フラグをたてる 
    }
    TIFR0 |= _BV(TOV0);                            // Timer/Counter0 Overflow Flag をクリア
    OCR0A = pwmVal;                                // PWMの値を指定
  }
}

電流計で電流を測ろうとしましたが、電池との間に挟むとなぜかうまく動かず測定できず、、。
あまりの省電力から通常電流への変化に電流計が対応できず電流計で電流が流れなかったという事だったらいいなぁと思っています。

新・踏切カンカン ATtiny13A版 [Arduino]

ATtiny13AでPWMを使った踏切カンカンです。

接続は、8-PDIP/SOIC では、
 2 (PB3), 3 (PB4) をLEDに、
 4 (GND) を乾電池のマイナス極に、
 5 (PB0, OC0A) をスピーカーに、
 8 (VCC) を乾電池のプラス極に
つなぎます。

pr_fumikiri2.jpg
ソースは比較的シンプル。(420バイト)
// 踏切音くん (ATtiny13A, 9.2MHz)

void setup() {  
  DDRB   = B11001;                                       // PB0(OC0A)をサウンド出力, PB3,PB4をLED
  TCCR0A = _BV(COM0A1) | _BV(WGM01) | _BV(WGM00);        // 8bit高速PWM
  TCCR0B = _BV(CS00);                                    // 分周なし
  TIMSK0 = 0;                                            // Arduino の割り込みを潰す
  PORTB |= B01000;                                       // LEDを片方だけ点灯する
}

void loop() {
  unsigned int pwmVal, t;
  
  PORTB ^= B11000;                                       // LEDを交互に光らせる
  
  for( t = 0; t < 15000; t++ ) {                         // 音発生のループ
    pwmVal = ( t & B111111 )  * ( 255 - (t>>6) ) >> 6;   // 計算式で音の波形をつくる
    while( !(TIFR0 & _BV(TOV0)) );                       // タイマーがオーバーフローするのを待つ
    TIFR0 |= _BV(TOV0);                                  // Timer/Counter0 Overflow Flag をクリア
    OCR0A = pwmVal;                                      // PWMの値を指定
  }
}

LEDを交互に光らせるのに、PINB (Port B Input Pins Address) に反転させたいビットの論理1を書き込むことでもできるようです。

(10.2.2 Toggling the Pin : Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn. Note that the SBI instruction can be used to toggle one single bit in a port.)


タグ:踏切 ATtiny13A

SOIC版 ATtiny13 用のアダプタ [ツール]

またまたATtiny13がらみです。
某中華系通販サイトで、、

・ATtiny13A-SU (SOIC8, 209mil)
   10個で7ドル、送料込み
・T13+ ADPII
   ATtiny13 ATiny25 tiny13 tiny25 programmer adapter 10SU 20SU:
   http://www.wvshare.com/product/T13-ADPII.htm

を購入しました。
t13adpii.jpg

これと、ArduinoISPを書き込んだDuemilanoveの上に載せたArduinoISPシールド上のICSPピンとを6ピンフラットケーブルでつなぎます。

<ArduinoISPの関連おさらい。>
私のブログのISPシールド関連のページ:
http://hello-world.blog.so-net.ne.jp/2011-04-03
http://hello-world.blog.so-net.ne.jp/2011-07-17
http://hello-world.blog.so-net.ne.jp/2012-02-19
 あるいは次のような製品もあるようです。
スイッチサイエンス/商品詳細 AVR ISPシールドキット:
http://www.switch-science.com/products/detail.php?product_id=929

t13adpii_2.jpg
さて、SOICのソケットにATtiny13A-SUを載せて挟みます。

<ArduinoでATtiny13Aを使う関連のおさらい。>
http://hello-world.blog.so-net.ne.jp/2012-08-14
http://hello-world.blog.so-net.ne.jp/2012-02-21

FUSEの設定なども簡単で、
 「ツール」→「マイコンボード」→「ATtiny13 (internal x.xMHz clock)」
を選択して、
 「ツール」→「ブートローダを書き込む」
で設定します。

あとは、スケッチを作成して書き込むだけ。

ちょっと注意するのは、ついついこのアダプタにヘッダピンがついているので、そこにいろいろつなぎがちですが、つなぐ場所やモノによってはスケッチを書き込めなかったりします。
また、書き込めても、動作確認のために6ピンフラットケーブルから電源をとろうとしてつないだままにしておくと、他の信号ピンもつながった状態になるため、予定通りの動作をしない場合があります。
書き込み終わったら、6ピンフラットケーブルを外し、別のところから電源をとる必要があります。

他の表面実装用AVRマイコンのライターもいくつか売っています。
http://www.wvshare.com/column/AVR_Adapter.htm

新・踏切カンカン 省エネ? [Arduino]

「踏切カンカン」を押しボタンスイッチで制御し、鳴らさない時はスリープモードに入るようにしてみました。

fumikiri_powersave.png
5Vのソケットに乾電池のプラス極、GNDに乾電池のマイナス極をつなぎ電力供給します。
(5Vのソケットは出力用なのかもしれませんが、ここから電力を供給することもできるみたい。単3乾電池2本で電圧は3Vしかありませんが、16MHzで動きました。)
スピーカーをデジタル3番ピンとGNDにつなぎます。
そして、デジタル2番ピン(INT0)は内部プルアップしておき、スイッチでGNDに落とすと、スリープから目覚めるようにしました。

// 踏切音くん (Arduino Uno / Duemilanove系, 16MHz), Sleep mode 付き
#include <avr/sleep.h>

#define PIN_SW    2   // Arduino pin 2 (ATmega328 PD2, INT0)をスイッチ入力 (固定, 変更不可)
#define PIN_SP    3   // Arduino pin 3 (ATmega328 PD3, OC2B)をサウンド出力 (固定, 変更不可)
#define PIN_LED1  12  // 信号のLED (変更可)
#define PIN_LED2  13  // 信号のLED (変更可)

boolean sigLED = 0;   // LEDの状態
boolean swFlg  = 0;   // スイッチの状態

void setup() {
  pinMode( PIN_SW,   INPUT_PULLUP );               // 内部プルアップ有効, LowでスイッチON
  pinMode( PIN_SP,   OUTPUT       );
  pinMode( PIN_LED1, OUTPUT       );
  pinMode( PIN_LED2, OUTPUT       );
  TCCR2A = _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);  // 8bit高速PWM
  TCCR2B = _BV(CS20);                              // 分周なし (8分周なら TCCR2B = _BV(CS21);)
}

void wakeUpNow() {       // here the interrupt is handled after wakeup
}

void sleepNow() {        // here we put the arduino to sleep
    set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
    sleep_enable();                      // enables the sleep bit in the mcucr register
    attachInterrupt(0, wakeUpNow, LOW);  // use interrupt 0 (pin 2) 
    sleep_mode();                        // here the device is actually put to sleep!!
    sleep_disable();                     // first thing after waking from sleep:
    detachInterrupt(0);                  // disables interrupt 0 on pin 2 so the
}

void loop() {
  unsigned int pwmVal, t;  
  if( !swFlg ) {                         // スイッチが押されていなければスリープモードに入る
    OCR2B = 0;                                 // 消音
    digitalWrite( PIN_LED1, LOW );             // LEDを消灯
    digitalWrite( PIN_LED2, LOW );
    sleepNow();                                // sleep function called here
  }
  swFlg = 0;                             // スイッチの確認フラグを降ろしておく
  digitalWrite( PIN_LED1, sigLED );      // LEDを交互に光らせる
  digitalWrite( PIN_LED2, sigLED ^= 1 );
  for( t = 0; t < 30000; t++ ) {         // 音発生用のループ
    pwmVal = (t & B1111111)  * (255 - (t>>7)) >> 7; // 計算式で音の波形をつくる
    while( !(TIFR2 & _BV(TOV2)) ) {                 // タイマーがオーバーフローするのを待つ
      if( digitalRead(PIN_SW) == LOW ) swFlg = 1;   // スイッチが押されていたらフラグをたてる 
    }
    TIFR2 |= _BV(TOV2);                  // タイマー/カウンター2 オーバーフロー・フラグ をクリア
    OCR2B = pwmVal;                      // PWMの値を指定
  }
}

LEDはつながず、スピーカーのみの場合の電流を確認してみます。
電池との間に、電流計をはさんで確認すると、、
fumikiri_sleep.jpg
ちなみにスピーカーも外してみると、20mA強でした。

Uno(Rev.1) 上の、ATMEGA8U2 にも電流が摂られてしまっているのでしょうか?



新・踏切カンカン [Arduino]

「LED チカチカ」からLEDを交互に光らせる「踏切チカチカ」はできても、「踏切カンカン」はちょっと高度で、前回は力業で実現しました。

踏切カンカン
http://hello-world.blog.so-net.ne.jp/2011-10-30

PWMの勉強をして、少しばかり使えるようになったので、改めて作ってみました。
ただし、前回よりもハードを直接触ることになってしまい、そのままではLeonardでは動きません。

タイマーのオーバーフローについて勉強しました。
タイマー/カウンター2割り込みフラグレジスタ(TIFR2) の タイマー/カウンター2 オーバーフロー・フラグ (TOV2) のビットで確認します。TOV2ビットに論理値1を書き込むことで、クリアされるとのこと。

また、8bit高速PWM、分周なしだと、256 CPUサイクルしかありません。
 → 計算式で波形を作るとき短時間で処理を済ませないといけない
  → 割り算はどうやら非常に時間がかかる
   → 割り算はビットシフトで、剰余はAnd演算で対応 (どちらも2のn乗しかできないけど、)

耳で確認しながら、それっぽいところで定数を決めていきました。

pr_fumikiri.jpg

というわけで、やってみました。

// 踏切音くん (Arduino Uno / Duemilanove系, 16MHz)
boolean sigLED = 0;      // LEDの状態

void setup() {
  pinMode(  3, OUTPUT );    // Arduino pin 3 (ATmega328 PD3, OC2B)をサウンド出力 (固定)
  pinMode( 12, OUTPUT );
  pinMode( 13, OUTPUT );
  TCCR2A = _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);  // 8bit高速PWM
  TCCR2B = _BV(CS20);                              // 分周なし
}

void loop() {
  unsigned int pwmVal, t;
  
  digitalWrite( 12, sigLED );       // LEDを交互に光らせる
  digitalWrite( 13, sigLED ^= 1 );
  
  for( t = 0; t < 30000; t++ ) {
    pwmVal = ( t & B1111111 )  * ( 255 - (t>>7) ) >> 7; // 計算式で音の波形をつくる
    while( !(TIFR2 & _BV(TOV2)) );  // タイマーがオーバーフローするのを待つ (この行を消して音に変化なければ計算に時間がかかりすぎ)
    TIFR2 |= _BV(TOV2);             // タイマー/カウンター2 オーバーフロー・フラグ をクリア
    OCR2B = pwmVal;                 // PWMの値を指定
  }
}


Arduino Uno や Duemilanove などATmega 328/168 系で、16MHzでの動作です。
デジタル3番(PWM)とGNDにスピーカーをつなぎます。
本当は、スピーカーにコンデンサやら何やらつけないといけないとは思うのですが、とりあえず直接つないで動いています。

タグ: 踏切

Uno と Leonardo [Arduino]

Arduino Leonardo というものが出ています。
ATmega32u4 というマイコンを使っていて、USB-シリアル変換チップが不要となっています。

Arduino - Products:
http://arduino.cc/en/Main/Products

これまでの、Duemilanove や Uno で使われてきた ATmega328 とマイコンの種類が大きく変更になっているため、Arduino 上のピンとマイコン上のピンの相関を表にしてみました。

uno_vs_leo.jpg
uno_vs_leo_table.png
(間違ってたらすみません。)

今までのスケッチをLeonardoで動かそうとするとトラブルが起きるのもうなづけます。
もうすこし購入は待ちかな?

Arduino Leonardo(+Headers)

Arduino Leonardo(+Headers)

  • 出版社/メーカー: GHEO SA
  • メディア: エレクトロニクス

タグ:AVR uno LEONARDO

ハサミのパラドックス [ツール]

我が家のハサミが紛失してしまい、アマゾンで良さそうなものを探して購入してみました。
hasami_1.jpg

やや大きめのハサミです。
刃の先の一部とがっていなくてもいい場所がとがっていてちょっと不安要因はありますが、今までの台所用ハサミでは切りにくかったパーツなどの入ったプラスチック袋がなめらかに切れるようになりました。

hasami_2.jpg
一応、Made in Chinaですが、刃は日本製だそうです。
なんとなく柄の部分のゴム加工の精度は今ひとつ。

ただ、その下に書いてある、、
 「止めてあるテープを切って開封してください。」
、、
hasami_3.jpg

こういうものを切るために購入したハサミなのですが、なんとも逆説的。

昔、LHarcという圧縮ソフトがありましたが、このソフトでこのソフト自身を圧縮してしまった、という話を思い出しました。


住友スリーエムスコッチ チタンコートシザーズ ベタ付防止加工 1468

100円ショップのスピーカ- [パーツ]

先日の「SDカードのWAVファイル再生する。」で再生した音量が小さくてなんとかならないかと思って、前回作成した「みのむしクリップワイヤ」を使って100円ショップで購入したスピーカーとつないでみました。

sp100yen.jpg

そうすると、なかなか満足のいく音量がでてきました。

この100円ショップスピーカーで使われているスピーカーは径57mmで、筐体をあけてみると裏に「32Ω 0.5W」と印字されていました。
sp100yen_open.jpg

その前に使っていたスピーカーはにマルツの通販で購入した径36mm のもので 「8Ω 0.5W」となっています。

【SP36MM】スピーカー 36mm 0.5W 8Ω - スピーカー - 音響部品 - _【マルツパーツ館WebShop】:
http://www.marutsu.co.jp/shohin_56485/

この音量の違いと、これらの数値(インピーダンスとかワットとか)が何を意味するのか、簡単に調べてみましたが理解できない世界でした。

ただ基本的にはどうやら、、
 ・スピーカーはちゃんと筐体(キャビネット)に入れる
 ・そこそこの大きさは必要
なようです。


SANWA SUPPLY TK-P19 内部スピーカー

SANWA SUPPLY TK-P19 内部スピーカー

  • 出版社/メーカー: サンワサプライ
  • メディア: エレクトロニクス

タグ:スピーカー

みのむしクリップ [パーツ]

ぼくの職場で単回使用ののちに廃棄されるみのむしクリップがあったのでいくつか回収してきました。
minocli_1.jpg
さて、これをどうするかというと、ブレッドボードなどでつかうジャンパワイヤーとつないでみたいと思います。
minocli_2.jpg
せっかくブログに載せるので、E-CALL社のものを使ってみました。
E-CALLのジャンパワイヤーは、オスの部分が細いのでエレガントな感じがします。

会社別/E-CALL ENTERPRISE CO., LTD.  イーコール(ブレッドボード) 秋月電子通商 電子部品 ネット通販:
http://akizukidenshi.com/catalog/c/cecall/

オス-メスのものと、メス-メスのものしか持っていなかったので、まずはソケットを外します。
そして、みのむしクリップに挟み込みますが、その前に、みのむしクリップのゴムカバーをあらかじめワイヤーに通しておきます。
minocli_3.jpg
はさんで、、
minocli_4.jpg
ここをハンダ付け。
こんな感じで、
minocli_5.jpg
できあがり。


シールドクリップ 小 2個入り(赤・黒)

シールドクリップ 小 2個入り(赤・黒)

  • 出版社/メーカー: オーム電機
  • メディア:

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。