[Nefry BTとGrove接続実験] ブザー

ブザーモジュール

私が購入したGROVEスターターキットV3に入っていたブザーモジュールは、Buzzer V1.2というモジュールです。スイッチサイエンスさんの単体販売ページに掲載されているものと同じです。

Groveブザーモジュール(表)
Groveブザーモジュール(裏)

ブザーモジュールの動作

ブザーモジュールはデジタル出力モジュールです。1(HIGH)を送るとブザーが鳴り、0(LOW)を送るとブザーが止まります。音量の調整はできません。かなり大きな音が出るので、静かな部屋だとびっくりします。

プログラム

1秒間音を鳴らした後1秒間音を止めるという動作を繰り返すプログラムです。

// Nefry BT無印の場合: D2, A0, A2 (注:D0は使えません)
// Nefry BT R2の場合: D0, D2, D5, A1  (注:A0を使うときはA1を記載します。)
#define PIN D2

void setup() {
  pinMode(PIN, OUTPUT);
  Serial.print("PIN = ");
  Serial.println(PIN);
}

void loop() {
  digitalWrite(PIN, HIGH);
  Serial.println(HIGH);
  delay(1000);

  digitalWrite(PIN, LOW);
  Serial.println(LOW);
  delay(1000);
}

setup( )関数内のpinMode(PIN, OUTPUT)で、GPIOピンを出力に設定しています。loop( )関数内では、まずdigitalWrite(PIN, HIGH)でHIGHを出力して音を鳴らし、delay(1000)で1秒間待ちます。次にdigitalWrite(PIN, LOW)でLOWを出力して音を止め、delay(1000)で1秒間待ちます。

メロディーを演奏するプログラム

Seed Studio社のGrove Wikiページにはブザーでメロディーを演奏するプログラムが掲載されています。

下記のリストでは、Nefry BTで動作するように、19行目のBUZZER_PINの設定をコメントアウトし、24行目でBUZZER_PINの値を変更してあります。

/*
  Buzzer
 The example use a buzzer to play melodies. It sends a square wave of the
 appropriate frequency to the buzzer, generating the corresponding tone.

 The circuit:
 * Buzzer attached to pin39 (J14 plug on Grove Base BoosterPack)
 * one side pin (either one) to ground
 * the other side pin to VCC

 * Note:
 This example code is in the public domain.

 http://www.seeedstudio.com/wiki/index.php?title=GROVE_-_Starter_Kit_v1.1b#Grove_-_Buzzer

*/

/* Macro Define */
//#define BUZZER_PIN               39            /* sig pin of the buzzer */

// Nefry BT用にPIN定義を変更する
// Nefry BT無印の場合: D2, A0, A2 (注:D0は使えません)
// Nefry BT R2の場合: D0, D2, D5, A1  (注:A0を使うときはA1を記載します。)
#define BUZZER_PIN D2

int length = 15;         /* the number of notes */
char notes[] = "ccggaagffeeddc ";
int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 };
int tempo = 300;

void setup()
{
    /* set buzzer pin as output */
    pinMode(BUZZER_PIN, OUTPUT);
}

void loop()
{
    for(int i = 0; i < length; i++) {
        if(notes[i] == ' ') {
            delay(beats[i] * tempo);
        } else {
            playNote(notes[i], beats[i] * tempo);
        }
        delay(tempo / 2);    /* delay between notes */
    }

}

/* play tone */
void playTone(int tone, int duration) {
    for (long i = 0; i < duration * 1000L; i += tone * 2) {
        digitalWrite(BUZZER_PIN, HIGH);
        delayMicroseconds(tone);
        digitalWrite(BUZZER_PIN, LOW);
        delayMicroseconds(tone);
    }
}

void playNote(char note, int duration) {
    char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
    int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };

    // play the tone corresponding to the note name
    for (int i = 0; i < 8; i++) {
        if (names[i] == note) {
            playTone(tones[i], duration);
        }
    }
}

60-70行目のplayNote(char note, int duration )が、指定された高さの音を鳴らす関数です。引数noteはnames[ ]配列に入っている’c’, ‘d’,・・・で音の高さを指定します。’c’は’ド’, ‘d’は’レ’, ・・・です。引数durationはその音を鳴らす時間をmsで指定します。tones[ ]配列は、音の矩形波がHight/LOWになっている時間をmicro second単位で覚えています。

51-58行目のplayTone(int tone, int duration)が実際に音を鳴らしている関数です。digitalWrite(BUZZER_PIN, HIGH)でブザーを鳴らしdelayMicroseconds(tone)でtoneで指定されたmicro secondだけ待ちます。次にdigitalWrite(BUZZER_PIN, LOW)でブザーを止めdelayMicroseconds(tone)でtoneで指定されたmicro secondだけ待ちます。toneで指定されるmicro secondが非常に短い時間なので、このOn/Offの繰り返しで音の高さを調整しています。音を鳴らしている時間の調整は52行目で行なっています。

実行してみると、綺麗な音ではありませんが、一応メロディーに聞こえます。

諸元

名称Buzzer
ブザー
バージョンv1.2
Seeed社 Wikihttp://wiki.seeedstudio.com/Grove-Buzzer/
スイッチサイエンス商品ページhttps://www.switch-science.com/catalog/804/
Nefry BT無印 動作ソケットD2, A0, A2
Nefry BT R2 動作ソケットD0, D2, D5, A0(プログラム上はA1)

「Nefry BTとGroveモジュール接続実験」 トップページ

 

[Nefry BTとGrove接続実験] リレー

注意:Groveリレーモジュールの電子回路は5V用に設計されているようなので、Nefry BTが供給する3.3Vでは回路が壊れる可能性があります。筆者の環境では下記の内容で動作しましたが、壊れないことを保証するものではありません。

リレーモジュール

私が購入したGROVEスターターキットV3に入っていたリレーモジュールは、Relay V1.2というモジュールです。スイッチサイエンスさんの単体販売ページに掲載されているものと同じです。

Groveリレー

右側の黒い箱がリレーです。左にある緑色部分にOn/Offしたい機器のケーブルを接続します。ケーブルの固定は上部のマイナスネジを回して行います。

リレーモジュールの動作

1(HIGH)を送ると回路が接続し、0(LOW)を送ると回路を切断します。接続する回路は、リレー上面に記載されている仕様を満たしていなければなりません。

リレーモジュールには回路の接続/切断状態を表すLEDが取り付けられています。回路が接続状態のときLEDが点灯し、切断状態のときLEDが消灯します。

回路が接続状態のときLEDが点灯

プログラム

// Nefry BT無印の場合: D2, A0, A2 (注:D0は使えません)
// Nefry BT R2の場合: D0, D2, D5, A1  (注:A0を使うときはA1を記載します。)
#define PIN D2

void setup() {
  pinMode(PIN, OUTPUT);
  Serial.print("PIN = ");
  Serial.println(PIN);
}

void loop() {
  digitalWrite(PIN, HIGH);
  Serial.println(HIGH);
  delay(1000);

  digitalWrite(PIN, LOW);
  Serial.println(LOW);
  delay(1000);
}

1秒ごとに回路の接続・切断を繰り返すプログラムです。digitalWrite(ピン, 設定値) を使ってHIGHとLOWを交互に設定しています。

諸元

名称Relay
リレー
バージョンv1.2
Seeed社 Wikihttp://wiki.seeedstudio.com/Grove-Relay/
スイッチサイエンス商品ページhttps://www.switch-science.com/catalog/807/
Nefry BT無印 動作ソケットD2, A0, A2
Nefry BT R2 動作ソケットD0, D2, D5, A0(プログラム上はA1)

「Nefry BTとGroveモジュール接続実験」 トップページ

 

[Nefry BTとGrove接続実験] 音センサ

音センサーモジュール

私が購入したGROVEスターターキットV3に入っていた音センサモジュールは、Sound Sensor V1.6というモジュールです。スイッチサイエンスさんの単体販売ページに掲載されているものと同じです。

黒い丸い部分がマイクで、その下にあるICはアンプです。

Grove音センサ(表)
Grove音センサ(裏)

音センサモジュールの動作

音センサモジュールはアナログモジュールです。音の大きさに応じて出力される電圧が変化します。

プログラム

analogRead( )関数を使って音センサーから読み込んだ値をシリアルモニタに表示するプログラムです。

// Nefry BT無印の場合: A2
// Nefry BT R2の場合: A1 (注:A0を使うときはA1を記載します。)
#define PIN A1

void setup() {
 pinMode(PIN, INPUT);
}

void loop() {
 Serial.println(analogRead(PIN));
 delay(100);
}

このプログラムを動作させると、このように数字列が表示されます。

シリアルモニタ出力例

数値が激しく変化していますね。音の情報なので変化速度や変化量が大きいためだと思われます。100ms周期でデータを取るのは遅すぎるようです。

Seeed社のWikiページに掲載されているプログラムは次のようになっています。

// test code for Grove - Sound Sensor
// loovee @ 2016-8-30

const int pinAdc = A0;

void setup()
{
 Serial.begin(115200);
 //Serial.println("Grove - Sound Sensor Test...");
}

void loop()
{
 long sum = 0;
 for(int i=0; i<32; i++)
 {
 sum += analogRead(pinAdc);
 }

sum >>= 5;

Serial.println(sum);
 delay(10);
}

32回測定してその平均を計測結果にしています。また、計測は10ms周期で行なっています。

これだけ短い周期で結果をシリアルモニタに出力すると、値がどんどん流れて行ってしまい、全体の傾向がどうなっているのかがわかりません。

シリアルプロッタを使うと、結果をわかりやすく表示できます。シリアルプロッタを開く手順は次の通りです。

  1. シリアルモニタが開いている場合は閉じます
  2. ツールメニューのシリアルプロッタを選択します。
ツルーメニューでシリアルプロッタを選択

シリアルプロッタには次のようなグラフが表示されます。

シリアルプロッタ表示例

諸元

名称Sound Sensor
音センサ
バージョンV1.6
Seeed社 Wikihttp://wiki.seeedstudio.com/Grove-Sound_Sensor/
スイッチサイエンス商品ページhttps://www.switch-science.com/catalog/816/
Nefry BT無印 動作ソケットA2
Nefry BT R2 動作ソケットA0(プログラム上はA1)

「Nefry BTとGroveモジュール接続実験」 トップページ

 

NefryBT R2のピン配置

NefryBTには2種類のリビジョンがあります。

NefryBT R1 :
クラウドファンディングで販売されたリビジョン。無印とも呼ばれます。
NefryBT R2 :
2018年1月頃から販売されているリビジョン。

R1とR2の見分け方はドットスタジオのページに記載されています。

R1とR2では若干PIN配置が異なります。R1のPIN配置図は公式ドキュメントに記載されていますが、R2のPIN配置図は現時点(2018年2月12日)ではまだ記載されていないようです。そこで勝手に非公式PIN配置図を作ってみました。

NefryBT R2のGroveソケットのピン配置図

Nefry BT R2のGROVEソケットのピン配置図

 

注意点1:Grove A0ソケットは、A0が配線されているはずのピンにA1が配線されています。プログラムでピン番号を指定する際に、ボタン、アナログセンサ、LEDといった信号線を1本しか使わないGroveモジュールを使う場合はA1を指定します。I2Cセンサのように信号線を2本使うモジュール場合はA1とA0を指定します。

注意点2:ADC(Analog to Digital Converter)はADC1とADC2の2系統あります。ADC2はWifiが動作状態にあると使用できないという制限があります。
また、NefryBTのプログラミング環境ではADCm_nという定数は定義されていません。上図では、アナログ入力に使えるソケットを判別できるように補足情報として記載しています。

NefryBT R2 ピンソケット配置図

NefryBT R2 PIN配置(表)
NefryBT R2 PIN配置(裏)

Nefry BTとGroveモジュール接続実験

Nefry BT を購入したので、引き出しにずっとしまったままのGROVE-スターターキットV3のモジュールをつなげて動作を確認してみることにしました。確認ができたモジュールの記事を順次掲載していきます。この記事は概要説明と、各モジュールの記事へのリンクを記載しています。

Nefry BT

Nefry BTドットスタジオ が製造・販売しているIoTデバイスです。下記のような特徴があり、IoT初心者にも経験豊富な人にも使いやすいデバイスです。

  • CPUとしてESP-WROOM-32を使用しているので、WifiとBluetooth接続ができる。
  • Groveソケットを搭載しているので、半田付けやブレッドボードなしでGrove規格のセンサーやアクチュエーターを接続できる。
  • Nefry BT内でWeb Serverが動作しコンソール画面がWebページとして用意されているので、webブラウザを使ってWifiの設定やプログラムの書き込みができる。
  • 小型の液晶ディスプレイを取り付けると、起動状況やWifi接続状態が表示されるので、動作状態の確認が簡単にできる。

Nefry BTの詳しい解説は、こちらに掲載されています。

Nefry BT

 

液晶ディスプレイを取り付けた状態

 

Nefry BTはドットスタジオのネットショップで販売されています。秋葉原の

でも販売されています。

Nefry BTのリビジョン

Nefry BTにはクラウドファンディングで販売された無印版(R1と呼ばれる場合もある)と改良版のR2とがあります。現在販売されているNefry BTはR2 (Revision 2)です。R2ではGroveソケット名が変更されています。プログラムでソケットを指定する際注意が必要です。

Nefry BT R2

 

 

GROVEスターターキット

私が購入したスターターキットは、スイッチサイエンスで販売されている「GROVE – スターターキットV3」です。

GROVE – スタータキットV3

このキットはArduinoに接続して使うことを想定して作られており、ArduinoにGroveソケット群を付け加えるためのシールド(ドーターボード)と、次のようなGroveモジュールが入っています。

どのモジュールも4ピンのGroveソケットが付いていて、Groveケーブルで簡単に接続することができます。

Groveモジュール接続例

接続実験の記事へのリンク

実験を行なって記事を書いたモジュールにリンクをつけていきます。

 

「Elixir入門者LT大会 vol2」を聴講

「Elixir入門者LT大会 vol2」を聴講しました。参加前に抱いていた予想が大幅に覆されたので、とても面白い勉強会でした。https://beam-lang.connpass.com/event/72797/

ElixirはErlang VM上で動作するプログラミング言語で、関数型、actorによる並行処理といった特徴をもっています。

参加前は、
・関数型信教者や並行処理大好き人間が参加する
・並行処理のディープな話題が議論される
・実業務よりも言語仕様に意識が行っている
と思っていました。

実際に講演を聞いてみたら、
・実業務でrubyを使っている人が多い
・オブジェクト指向(ruby)から関数型への乗り換えはそれほど困難を感じていない。
・(rubyと比べて)実行速度の速さが気にいっている
・webアプリフレームワーク(Phoenix)や、ビルド&デプロイフレームワークの充実度に興味がある(ruby on railsの乗り換え先として)
・並行処理? 何、それ美味しいの?
という感じでした。

オーソドックスな言語から関数型言語への移行障壁はとても高く、普及には長い時間がかかると思っていましたが、実際はそうでもないようです。毎年新しいフレームワークが登場するwebアプリ業界の住人は、新しい考え方を取り込むのに抵抗がないのかもしれません。

ADATAのSSDを修理のために台湾に送ってみた

概要

ADATAのSSDに不良セクターが出来て修復不能になりました。3年保証が付いていてまだ1年半しか使っていなかったので、台湾のADATAに直接送って修理してもらいました。SSDを郵便で送ってから修理品が返って来るまで約20日で、かかった費用は日本から台湾への郵便代630円だけでした。郵送には郵便局の国際eパケットというサービスを使いました。

ADATA SP600
修理に出したSSD
返送されてきた小包

詳細

1. SSDが壊れた

Windows Updateを行なったらディスクアクセスが延々と続き、放置していたら数時間後にリブートして、「起動ディスクが見つかりません」状態になりました。BIOSの設定画面でディスクを選択しなおして再起動したところ、起動はできましたが、数分すると「システムファイルがない」というエラーが出てOSがクラッシュしました。SSDの修復ツールで調べてみたところ、修復不能なほど不良セクターができていました。

Windows Updateが壊したのか、SSDが壊れたためWindows Updateが正常に動作しなかったのかどちらかわかりませんでした。

2. 販売店のサポートページを見てみた

購入時のSSDの箱に3年保証と書いてあったので、販売店に問い合わせてみることにしました。購入したのはドスパラで、サポートページを見ると

国内代理店のある輸入商品は代理店サポート

と書いてあるので、ADATAのサポートページを見ることにしました。

後でわかったことですが、日本語のWebページはあるのですが、ここは台湾で運営されていて日本には代理店がないので、ドスパラの分類では、

国内代理店のない輸入商品などはドスパラ商品サポートセンターで対応

になり、ドスパラに問い合わせればよかったのかもしれません。

3. ADATAのWebページで問い合わせしてみた

www.adata.comを開くとwww.adata.com/jp/という日本語ページが表示されます。

サポートタブ > サポートに連絡 > お問い合わせ

を選択して問い合わせページに移動し、「質問のカテゴリ」で「テクニカルサポート」を選択すると問い合わせフォームが表示されます。

このフォームに必要事項を日本語で記入して送信したところ、翌日、サポートから下記の返事がきました。

これを受け取ってわかったことは、
・日本語で対応する窓口はなく、(おそらく台湾の)英語窓口が対応
・修理・交換依頼を出すのはRMAという窓口
ということです。

ドスパラは対応してくれないとこの時点では思っていたので、製品の写真を添付して「あなたのサポートが必要です」という返事を送りました。

すると「製品を台湾に書留郵便で送れ」という返事がきました。

4. 国際eパケットで台湾に発送

国際宅配便や郵便局の各種サービスを調べてみた結果、国際eパケットというサービスが安くてよさそうだということがわかりました。
・書留便にできる
・値段が安い
・日本と相手国の間は航空便なので速い
・必要な書類(税関申告書やインボイスなど)をPCで印刷できる
という点に魅力を感じでこのサービスを利用することにしました。

利用手順は、
・アカウントを登録する
・必要書類を郵便物に貼り付けるビニール袋(パウチ)を請求する。
・必要書類をWebページで作成し印刷する
・必要書類をパウチに入れて郵便物に貼り付け、郵便局に持って行く
です。

パウチは申し込んでから1週間ぐらいで届きました。無料です。
必要書類は、送り状とINVOICEを作成しました。

郵便局に持って行って「国際eパケットを送りたいのですが」と言ったら、「中身はなんですか?」と聞かれ「ハードディスクみたいな物です」と答えたらそれ以上は聞かれずに発送の手続きをしてくれました。郵送料は630円でした。

5. 日本から台湾までの郵送時間

7月21日に東京から発送し、台湾のADATAには7月25日に到着しました。5日で届いたことになります。

6. ADATAからの連絡

荷物がADATAに到着してから1週間ぐらいたっても何の連絡もないので、こちらから問い合わせをしようかと思っていたら、8月2日に「修理した製品を送ります。14営業日ぐらいで受け取れます」という連絡が届きました。

7. 受け取り

8月9日に自宅に届きました。台湾から日本への郵送時間は8日ということになります。14日よりだいぶ早く届きました。

8. 学んだこと

今回のSSD修理で下記のことを学びました。

  • 海外ベンダーに修理依頼するのはわりと簡単
  • 郵送料も国内と大きな差はないし、送り状作成も簡単

反省点は、

  • 日本から台湾への送り状で分類をギフトにしないで価格を記入したので台湾側で税金を取られたかもしれない。(ADATAさんごめんなさい)
  • 最初からドスパラに頼んだ方が早かったかも

です。

でも、無事に修理してもらえてハッピーです。

 

VBAのクラス内でエラーが発生した場所を知る方法

エクセルのVBAでプログラムを書くことがあるのだが困っていることが1つある。自分で定義したClassを使うときに、classのメソッド内でエラーが起きると、その場所ではなくメソッドを呼び出した場所でVBAのIDEが停止してデバッグモードに入る。どこでエラーになっているのかさっぱり分からなくて頭を抱えてしまう。

困った仕様だなーとずっと思っていたが、ふと検索してみたら、設定で変えられることがわかった。

クラスモジュールの内部でデバッグする方法

なぜ、エラー発生場所で止まるのをデフォールトにしておいてくれないのだろうか。エクセルは謎だ。

耳の中でパチンと音がしたら即病院へ

健康診断で発覚した「右耳は低音が聞こえていない問題」は、いろいろ検査した結果「外リンパ瘻(ろう)」が原因だろうということになりました。

外リンパ瘻は、重いものを持ち上げたりトイレでいきんだりしたときに、中耳と内耳の間の壁に穴があいて外リンパ液が漏れ出す病気です。難聴、耳鳴り、めまいなどの症状がでます。( http://www.hosoda-cl.com/耳の病気・治療/外リンパ瘻/ )

発症後1週間以内ぐらいに安静治療や手術をすれば、症状がなくなりますが、治療しないで放置すると難聴は治らなくなるそうです。この点は突発性難聴と似ています。

穴があいたときに耳の中でパチンと音がする場合があるので、「パチンと音がしたあと、難聴、耳鳴り、めまいがでた」場合はすぐに大きな病院に行きましょう。

私の場合、もともとメニエールになっていてめまいや耳鳴りがあったので、外リンパ瘻になったことに気づかず、治療が遅れてしまいました。低音が聞こえない状態になっていて回復が困難な状況になっています。左耳が聞こえているので日常生活に支障はありません。