マグネトーン詳細説明

LinkedIn にシェア
Delicious にシェア
LINEで送る
email this
Pocket

マグネトーン(Magnetone,Magnet Sensoe Ringtone)についての説明です。
回路図、書き換え用Arduinoスケッチも公開しています。

マグネトーンとは

磁石を離すと音が鳴る、磁石を近づけると超省電力待機する。
そんな冷蔵庫やトイレ、フリスクケースにピッタリ(?)の
電子工作キットです。


ATTiny85というマイコンがArduinoでプログラムされているので、
Arduino UNO等がひとつとジャンパーケーブルが数本あれば
後から自由にメロディの書き換えが可能です。

製品内容物

マグネトーン(Magnet Sensor Ringtone)基板 1枚


 
 
リードスイッチ(ノーマルクローズ) 1個


プチプチにくるんであります。
接点の周りがガラスカバーに覆われており
壊れやすいので慎重にお取り扱いください。
組み立てでリードを曲げる際も手でやらずに
ラジオペンチやピンセットを使ってガラスに
負担がかからないようにしてください。
 
 
マイコンATTiny85-20PU 1個


 
 
CR2032リチウム電池 1個


 
 
2*3ロープロファイルピンヘッダ 1個


 
 
CR2032電池ケース 1個


 
 
圧電スピーカー 1個


大きめのスピーカーに置き換えることで音量を上げることができます。
厚みが増すとフリスクケースにはおさまらなくなるので
平たくて横に大きいスピーカーを使って
コードを直接はんだ付けしてください。
差し替え可能例
ただし基板上への固定はできなくなります。
 
※ネオジム磁石 1個
※Maker Faire Tokyo2018販売品のみ

組み立て方


図のように全ての部品をハンダ付けします。
基板裏側に部品の脚が飛び出しすぎると
フリスクケースにおさまらなくなりますので、
なるべく足を折り曲げたり切ったりして
あまり飛び出さないようにはんだ付けしてください。

方向に注意する必要があるのは
IC1マイコンとJ1のロープロファイルピンヘッダです。


IC1のマイコンはポッチがある方を基板上の
凹みがある方向に合わせてください。

J1のピンヘッダは短い方を基板に刺して、
長い方が上にくるようにしてください。
逆につけると書き換えができません。

また、リードスイッチは一応どの方向でも反応しますが、
リードの両端にN極とS極をぞれぞれ当てると反応しやすいので、
テスターを持っている方は導通チェックモードにして
試してみてください。
(ノーマルクローズなので磁石を近づけると
非導通、離れると導通します)

プチプチにくるまれたリードスイッチは
接点の周りがガラスカバーに覆われており
壊れやすいので慎重にお取り扱いください。
組み立てでリードを曲げる際も手でやらずに
ラジオペンチやピンセットを使ってガラスに
負担がかからないようにしてください。

全て組み立てて電池を入れると音が鳴ります。
磁石を近づけると省電力待機、離すとメロディが鳴ります。

注意点

磁石が離れている状態で放置すると短い時間で
電力を消費してしまいます。
普段は磁石を近づけて待機状態を
維持するようにしてください。

メロディ変更のために準備するもの

Arduino UNO,NANO等 1台
互換機でも問題ありませんが、
ドライバの問題などがあるので
もしこれから最初の一台を購入するのでしたら
一台目だけは高くても純正品をお勧めします。


と、書きながらも互換品を掲載します。
通常のやり方で「スケッチ例」にある
「Arduino ISP」を書き込んでおいてください。
Arduino本体の書き換え方については
沢山ある他のサイトにお任せいたします。

ジャンパケーブル
メス-メス 5本
オス-メス 1本


ArduinoとATTiny85の接続に使用します。

書き換え前準備


Arduino IDEの環境設定内の
「追加のボードマネージャのURL」に

http://drazzy.com/package_drazzy.com_index.json

を入力して「OK」する。

「ツール」「ボード」「ボードマネージャ」を選択

検索窓に「attiny」を入力して「ATTinyCore」が出てきたら
「More info」をクリックして左窓で
バージョンを選択、「インストール」を押す。


インストールが終わったらArduino IDEを再起動すると、
ボードから「ATTiny25/45/85」が選べるようになっているので
選択、その他の設定は画像のようにする。
選択できるシリアルポートは環境によって変わります。

スケッチの準備

メロディのデータを準備します。
マグネトーンではArduinoにスケッチサンプルとして用意されている
toneMelodyの一部を利用しています。
まずファイルのスケッチ例から02.Digitalの
toneMelodyを開いてください。
開くとスケッチのタブの右側に「pitches.h」というタブがあると思いますが、
これが必要です。
「名前をつけて保存」から好きな別名をつけて保存してください。

そうしたら、この記事の下部に3種類のメロディデータのスケッチがありますので、
お好きなものを選んで丸ごとコピー&ペーストしてください。
これで準備は完了です。

書き換え

 
Arduino本体の「ICSP」と書いてあるピンの
左下(5番ピン)を除いてメス-メスの
ケーブルをさして、
オス-メスのオス側をArduinoの10番ピンに接続します。

ArduinoのICSPピンにさしたケーブルを、
逆側が同じ並びになるようにして、
左下(5番ピン)の場所にはArduinoの10番ピンにさした
ケーブルが来るようにして、テープなどでとめます。
いよいよ書き込みです。


まず、マグネトーンに磁石を近づけた状態にしてください。
磁石が離れている状態では書き込みができません。

Arduino側のICSPと書いてある「I」の部分と
マグネトーンの「J1」が同じ位置になるように
6本のケーブルをマグネトーンに接続します。

マグネトーン側の端子はフリスクケースに
入るようにするために短いピンヘッダが入っています。
たださすだけではかみ合わず通信ができないので、
書き込み時は軽く押さえつけるようにしてください。
 

書き込み時は、「スケッチ」から
「書き込み装置を使って書き込む」を選んでください。
コンパイル後、「ププププププピピピピピピピピピ」
という音と共に書き替えが終わると、新しいメロディが鳴ります。
エラーが出た場合は、Arduinoの設定、
配線が間違えてないか、軽く押さえて
導通している状態になっているかを確認してください。
電池は入っていてもいなくても書き換えできます。

以上で書き換え方法の説明は終了です。

利用例


冷蔵庫、フリスクケース、小物入れなど、
ケースと磁石側を工夫することで
多彩な使い方ができます。
磁石が近づいていて待機状態になっていれば
電池は数ヶ月持ちます。

要改善点など

ギリギリまで部品を減らした影響で、
スリープ前後の動作が若干不安定です。
もしバッテリーが十分あるにもかかわらず
反応がなくなった場合は電池を抜き差しして下さい。

また、3Vの電池で駆動している関係で、
ピッチが若干低めになっています。
pitches.hファイルを編集するか、
本体のスケッチに少し手を加えることで
修正することが可能ですので
近いうちにアップデートしたスケッチを掲載します。
(もちろん、修正にチャレンジしていただいても結構です)

回路図

最後に雑ですが回路図を掲載します。
ぜひご自身でも制作にチャレンジしてください。

Maker Faire Tokyo2018出展内容に戻る

ゲームオーバーのスケッチ

#include "pitches.h"
#include 
#define BODS 7
#define BODSE 2

int n = 80;

int melody[] = {
  NOTE_DS6, NOTE_GS5, NOTE_DS6, NOTE_GS5, NOTE_DS6, NOTE_GS5, NOTE_DS6, NOTE_GS5,
  NOTE_B5 , NOTE_DS5, NOTE_B5 , NOTE_DS5, NOTE_B5 , NOTE_DS5, NOTE_B5 , NOTE_DS5,
  NOTE_GS5, NOTE_B4 , NOTE_GS5, NOTE_B4 , NOTE_GS5, NOTE_B4 , NOTE_GS5, NOTE_B4 ,
  NOTE_G5 , NOTE_AS4, NOTE_G5 , NOTE_AS4, NOTE_G5 , NOTE_AS4, NOTE_G5 , NOTE_AS4,
  NOTE_AS5, NOTE_CS5, NOTE_AS5, NOTE_CS5, NOTE_AS5, NOTE_CS5, NOTE_AS5, NOTE_CS5,
  NOTE_CS6, NOTE_E5 , NOTE_CS6, NOTE_E5 , NOTE_CS6, NOTE_E5 , NOTE_CS6, NOTE_E5 ,
  NOTE_B5 , NOTE_DS5, NOTE_B5 , NOTE_DS5, NOTE_B5 , NOTE_DS5, NOTE_B5 , NOTE_DS5, 
  NOTE_B5 , NOTE_DS5, NOTE_B5 , NOTE_DS5, NOTE_B5 , NOTE_DS5, NOTE_B5 , NOTE_DS5, 
  NOTE_B5 , NOTE_DS5, NOTE_B5 , NOTE_DS5, NOTE_B5 , NOTE_DS5, NOTE_B5 , NOTE_DS5, 
  NOTE_B5 , NOTE_DS5, NOTE_B5 , NOTE_DS5, NOTE_B5 , NOTE_DS5, NOTE_B5 , NOTE_DS5, 
  };

int noteDurations[] = {
  64,64,64,64,64,64,64,64,
  64,64,64,64,64,64,64,64,
  64,64,64,64,64,64,64,64,
  64,64,64,64,64,64,64,64,
  64,64,64,64,64,64,64,64,
  64,64,64,64,64,64,64,64,
  64,64,64,64,64,64,64,64,
  64,64,64,64,64,64,64,64,
  64,64,64,64,64,64,64,64,
  64,64,64,64,64,64,64,64,
};

void setup() {
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
}

void loop() {
  for (int thisNote = 0; thisNote < n; thisNote++) {

    int noteDuration = 2000 / noteDurations[thisNote];

    if (melody != 0) tone(1, melody[thisNote], noteDuration);
    else delay(noteDuration);
    
    int pauseBetweenNotes = noteDuration * 1.0;
    delay(pauseBetweenNotes);
    noTone(1);
  }

  while (digitalRead(2) == LOW) {
  }

  goToSleep();


}

void goToSleep(void)
{
  byte adcsra, mcucr1, mcucr2;

  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  MCUCR &= ~(_BV(ISC01) | _BV(ISC00));      //INT0 on low level
  GIMSK |= _BV(INT0);                       //enable INT0
  adcsra = ADCSRA;                          //save ADCSRA
  ADCSRA &= ~_BV(ADEN);                     //disable ADC
  cli();                                    //stop interrupts to ensure the BOD timed sequence executes as required
  mcucr1 = MCUCR | _BV(BODS) | _BV(BODSE);  //turn off the brown-out detector
  mcucr2 = mcucr1 & ~_BV(BODSE);            //if the MCU does not have BOD disable capability,
  MCUCR = mcucr1;                           //  this code has no effect
  MCUCR = mcucr2;
  sei();                                    //ensure interrupts enabled so we can wake up again
  sleep_cpu();                              //go to sleep
  sleep_disable();                          //wake up here
  ADCSRA = adcsra;                          //restore ADCSRA

}

ISR(INT0_vect)
{
  GIMSK = 0;
}

 
 

ファンファーレのスケッチ

#include "pitches.h"
#include 
#define BODS 7
#define BODSE 2

int n = 7;

int melody[] = {
  NOTE_GS5, NOTE_B5, NOTE_E6, NOTE_GS6, 0, NOTE_E6, NOTE_GS6,
};

int noteDurations[] = {
  8, 8, 8, 8, 8, 8, 2
};

void setup() {
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
}

void loop() {
  for (int thisNote = 0; thisNote < n; thisNote++) {

    int noteDuration = 1000 / noteDurations[thisNote];

    if (melody != 0) tone(1, melody[thisNote], noteDuration);
    else delay(noteDuration);
    
    int pauseBetweenNotes = noteDuration * 1.0;
    delay(pauseBetweenNotes);
    noTone(1);
  }

  while (digitalRead(2) == LOW) {
  }

  goToSleep();


}

void goToSleep(void)
{

  byte adcsra, mcucr1, mcucr2;

  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  MCUCR &= ~(_BV(ISC01) | _BV(ISC00));      //INT0 on low level
  GIMSK |= _BV(INT0);                       //enable INT0
  adcsra = ADCSRA;                          //save ADCSRA
  ADCSRA &= ~_BV(ADEN);                     //disable ADC
  cli();                                    //stop interrupts to ensure the BOD timed sequence executes as required
  mcucr1 = MCUCR | _BV(BODS) | _BV(BODSE);  //turn off the brown-out detector
  mcucr2 = mcucr1 & ~_BV(BODSE);            //if the MCU does not have BOD disable capability,
  MCUCR = mcucr1;                           //  this code has no effect
  MCUCR = mcucr2;
  sei();                                    //ensure interrupts enabled so we can wake up again
  sleep_cpu();                              //go to sleep
  sleep_disable();                          //wake up here
  ADCSRA = adcsra;                          //restore ADCSRA

}

ISR(INT0_vect)
{
  GIMSK = 0;
}

 
 

ふしぎを発見のスケッチ

#include "pitches.h"
#include 
#define BODS 7
#define BODSE 2

int melody[8] = {
  NOTE_D5, NOTE_FS6, NOTE_AS5, NOTE_DS6, NOTE_D6, NOTE_A5, NOTE_F5, NOTE_CS5
//  NOTE_E4, NOTE_GS5, NOTE_C5, NOTE_F5, NOTE_E5, NOTE_B4, NOTE_G4, NOTE_DS4
};

int noteDurations[8] = {
  8, 8, 8, 8, 8, 8, 8, 8
};

void setup() {
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
}

void loop() {



  for (int thisNote = 0; thisNote < 8; thisNote++) {

    int noteDuration = 1000 / noteDurations[thisNote];

    tone(1, melody[thisNote], noteDuration);

    int pauseBetweenNotes = noteDuration * 1.0;
    delay(pauseBetweenNotes);
    noTone(1);
  }

  while (digitalRead(2) == LOW) {
  }

  goToSleep();


}

void goToSleep(void)
{
  byte adcsra, mcucr1, mcucr2;

  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  MCUCR &= ~(_BV(ISC01) | _BV(ISC00));      //INT0 on low level
  GIMSK |= _BV(INT0);                       //enable INT0
  adcsra = ADCSRA;                          //save ADCSRA
  ADCSRA &= ~_BV(ADEN);                     //disable ADC
  cli();                                    //stop interrupts to ensure the BOD timed sequence executes as required
  mcucr1 = MCUCR | _BV(BODS) | _BV(BODSE);  //turn off the brown-out detector
  mcucr2 = mcucr1 & ~_BV(BODSE);            //if the MCU does not have BOD disable capability,
  MCUCR = mcucr1;                           //  this code has no effect
  MCUCR = mcucr2;
  sei();                                    //ensure interrupts enabled so we can wake up again
  sleep_cpu();                              //go to sleep
  sleep_disable();                          //wake up here
  ADCSRA = adcsra;                          //restore ADCSRA

}

ISR(INT0_vect)
{
  GIMSK = 0;
}

Maker Faire Tokyo2018出展内容に戻る

“マグネトーン詳細説明” への2件の返信

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください