マグネトーン Magnetone

Pocket

マグネトーン(Magnetone,Magnet Sensor Ringtone)についての説明です。
→ 組み立て方
→ 回路図
→ 書き換え用Arduinoスケッチ

マグネトーンとは

磁石を離すと音が鳴る、磁石を近づけると超省電力待機する。
ドアや箱、引き出し、冷蔵庫などに使うことを想定した
フリスクケースにピッタリサイズの電子工作キットです。

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

→ ご購入はコチラ Buy This!

製品内容物

  • マグネトーン(Magnet Sensor Ringtone)基板 1枚
    マグネトーン基板
    マグネトーン基板
  • リードスイッチ(ノーマルクローズ) 1個
    リードスイッチ
    リードスイッチ(ノーマルクローズ) 1個

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

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

    他の磁石でも構いません。

ご注意

この商品は、ご自身でのはんだ付けが必要です。

→ ご購入はコチラ Buy This!

組み立て方


写真のように全ての部品をハンダ付けします。

動画でも組み立て方を解説しています。ご覧ください。

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

方向に注意する必要があるのは
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」をクリックして左窓で
バージョンを選択、「インストール」を押す。
(今回は2018/8時点で最新の1.1.5をインストールしました)


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

スケッチの準備

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

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

スケッチ書き換え

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

ArduinoのICSPピンにさしたケーブルを、
同じ並びになるようにマグネトーンに挿します。
写真では茶色の5番ピンの場所にはArduinoの10番ピンにさした
ケーブルが来るようにして、テープなどでとめます。
とめなくても配線はできますが、マグネトーン側が
ロープロファイルなので完全に固定されず難儀します。

いよいよ書き込みです。

買った状態のATtiny85の場合はブートローダを書き込むという
作業が必要ですが、キットをご購入いただいた場合は
すでにマイコンに書き込み済みですのでそのまま
スケッチ書き込み作業をしていただけます。


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

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

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

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

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

利用例


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

→ ご購入はコチラ Buy This!

要改善点など

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

また、3Vの電池で駆動している関係で、
ピッチが若干低めになっています。
pitches.hファイルを編集するか、
本体のスケッチに少し手を加えることで
修正することが可能だと思いますので、
気になる方は修正にチャレンジして下さい。

回路図

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

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

#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;
}

ご購入はコチラ Buy this!


base_s necobit電子BASEショップで買う→ ¥1,280 送料無料♪ マグネトーン Magnetone
(別ウインドウでBASEショップページへ移動します。移動先のカートに入れるボタンをクリックして決済手続きへお進みください)

2 thoughts on “マグネトーン Magnetone”

コメントを残す

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