Baumkuchen’s Workshop

バイオリンと電子工作、DIY、ジョギングなど。

バイオリンタイマーの製作#5-制御基板設計

制御基板のCPUをどうしようか。と、悩んだ結果、PICで行く事にしました。PIC28F26J50です。

baum-kuchen.hatenablog.com

全体構想

改めて、全体構想を整理。

外観図

f:id:Baum_kuchen:20220116213456p:plain

ハードウェア構成

改めて、全体の構成はこんな感じ。

f:id:Baum_kuchen:20220116212437p:plain

機能ブロック図

機能ブロック図の概要です。細かいところは作りながら考えます。

f:id:Baum_kuchen:20220116212611p:plain

制御基板設計

回路設計に当たって、PICのIOの割り当てを考えました。

f:id:Baum_kuchen:20220116213136p:plain

回路図

f:id:Baum_kuchen:20220117011455p:plain

時計ICのバックアップは、スーパーキャバシタを使おうと思いましたが、寸法が入らないのと電池交換の時くらい作動すればいいので、単なる電解コンデンサとしました。

実装図

実装部品の高さ制約が有るので、かなり苦労しました。ずっとやって見たかったプリント基板を作製することも考えましたが、また、今度にします。

マイクとタクトスイッチは、基板裏に実装します。PIC周りは、もう少し調べてから。内蔵オシレータの精度が良くなったので、外付けクリスタル不要との記述がありますが、現物PICで確認してから後で追加は大変のなので、プロビジョンとして付けてます。(ジャンパ線や細かい回路図は作りながら修正予定)

f:id:Baum_kuchen:20220116213255p:plain

今後の計画

まずは、PIC18F26J50を秋月通販でゲットすること。それまでは、MICアンプのところから制御基板を作りだします。

 

バイオリンタイマーの製作#4-LCD画面イメージ

新しいLCDモジュールが届きました。

baum-kuchen.hatenablog.com

LCD画面イメージ

最初、VCC線をつなぎ忘れて、絵が出ないと焦りましたが、ちゃんと出ました。ほっ。

f:id:Baum_kuchen:20220112205545j:plain

画面レイアウトは、大体の感じですが、1.77インチってやっぱり小さいね。

f:id:Baum_kuchen:20220112205652j:plain

 

CPU選定

制御基板を設計するにあたってのキーポイントは、CPUを何にするかです。処理時間的には、一番時間が掛かると考えていたFFT演算が、100mS以下で出来たので、arduino(ATmega-328P 16MHz)クラスで行けるはず。

こうなってくると、制約事項は、FFT演算のためのメモリーになります。float が4バイトなので、128点FFTだと最低でも1024バイトのスタティックメモリが必要。PICだと2KBを選ぶ事になるので、18F系列でUSBインターフェースがあって手頃な18F14K50は、RAMが768bytesしかないので外れます。また、電池作動だと、3.3V系が必要です。手持ちのPICだとUSBインターフェース有りの18F2550は、作動電圧が4.2Vと有るのでダメ。

秋月で取り扱っている物を調べてみると、こんな感じになり、

f:id:Baum_kuchen:20220115162519p:plain

USB有りだと18F25J50辺りになります。これだとRAMが3.7Kも有るので、256点FFTまで出来そうです。

一方、USBシリアル変換IC+USBなしPICやSeeeduino Xiaoという選択肢もあり。なお、コスト、手間を考えるとSeeeduinoになってしまいますが。

さて、どうしようか。

 

(2022.1.15更新)

今後の計画

今後やること(再掲)

  • FFT処理(信号処理をもう少し工夫)
  • 制御基板作成
  • 省電力化検討(スリープ機能など)
  • 簡易オシロ(波形、レベル)
  • 簡易スペアナ
  • 音判別(簡易版、精細版)
  • 練習時間タイマー(本命)
  • 簡易チューナー(おまけ)
  • 時計(時刻設定)

よろしければ、お付き合いください。

 

バイオリンタイマーの製作#3-時計IC DS1302とFFT

LCDモジュールを壊してしまったので、再度、秋月で注文しました。

部品が届くまで、出来ることをちまちまやっていきます。

baum-kuchen.hatenablog.com

時計IC制御 DS1302の確認

時計ICの作動確認です。DS1302は、2~5V作動ができるので、Aruduinoに直接接続しました。インターフェースは、I2Cもどきの独自シリアル規格なので、プログラムを自作します。

f:id:Baum_kuchen:20220110104103j:plain

ネットを探すと、

GitHub - msparks/arduino-ds1302: Arduino library for the DS1302 Real Time Clock chip

というのがありましたが、作動確認だけが目的なので、簡単なデータ読み書きプログラムを書き、年、月、日、時、分、秒をターミナルに表示させてみました。

f:id:Baum_kuchen:20220110103903p:plain

ADサンプリングとFFT処理

MICアンプの出力をAruduinoにつなげてADサンプリングしたら、結構なサンプリングレートでとれたので、FFT処理も実装してみました。

ADサンプリングのスケッチ(一部)はこれだけ(Aruduinoのサンプルスケッチを流用)。

#define MAXDATA 128
float ar[MAXDATA];
float ai[MAXDATA]; 

a= millis(); // read the analog in value: for(i=0;i<MAXDATA;i++){ sensorValue = analogRead(analogInPin); ar[i]=sensorValue; ai[i]=0.0; // map it to the range of the analog out: outputValue = map(sensorValue, 0, 1023, 0, 255); // change the analog out value: analogWrite(analogOutPin, outputValue); } b= millis();

これで、走らせたら大体20mS掛かりましたので(b-aで計算)、約6KHzのサンプリングで出来たことになりますので、まずは、十分です。

FFT処理は、Aruduinoでは厳しいのかなと思って、実装してみたら、128データだと約70mSで処理できました。意外と速いですね。データを増やせばもっと時間はかかりますが、音の認識なら1秒単位位で十分ですし、ArduinoにしろPICにしろ、スタティックRAMの容量からすると、128が限界ですので。なお、コードはこんな感じ。(theta = 2*PI/N;を入れてcallする)

void fft(int n, float theta, float ar[], float ai[])
{
    int m, mh, i, j, k;
    float wr, wi, xr, xi;

    for (m = n; (mh = m >> 1) >= 1; m = mh) {
        for (i = 0; i < mh; i++) {
            wr = cos(theta * i);
            wi = sin(theta * i);
            for (j = i; j < n; j += m) {
                k = j + mh;
                xr = ar[j] - ar[k];          
                xi = ai[j] - ai[k];
                ar[j] += ar[k];
                ai[j] += ai[k];
                ar[k] = wr * xr - wi * xi;
                ai[k] = wr * xi + wi * xr;
            }
        }
        theta *= 2;
    }
    /* ---- unscrambler ---- */
    i = 0;
    for (j = 1; j < n - 1; j++) {
        for (k = n >> 1; k > (i ^= k); k >>= 1);
        if (j < i) {
            xr = ar[j];
            xi = ai[j];
            ar[j] = ar[i];
            ai[j] = ai[i];
            ar[i] = xr;
            ai[i] = xi;
        }
    }  
}

ADサンプルとFFT処理の結果

試しに取得してみたバイオリンの各開放弦でのサンプリングとFFT処理の結果は、こんな感じになりました。 

まずは、生波形。(縦軸200=1V、横軸単位ms)

f:id:Baum_kuchen:20220110180651p:plain

f:id:Baum_kuchen:20220110180714p:plain

A線、D線、E線は、基本周波数が良くわかりやすいですが、G線はよく見ないと分りずらいです。単に弾き方が悪いのか、楽器が安いせいかもしれませんが。
次は、FFT処理をした結果です。(縦軸は、fft()関数からの実部、虚部、横軸はHz)

f:id:Baum_kuchen:20220110181234p:plain

f:id:Baum_kuchen:20220110181301p:plain

やはり、A線、D線、E線は、スペクトルのピークが分かりやすいです。ただし、どれも高調波成分に比べ、基本周波数のレベルが小さいということが分かりました。また、サンプリング数=128だと、今回の設定であは周波数分解能=50Hz(6K÷128≒50Hz)となるので、ピーク周波数が生データの値とも異なります。(当然、窓関数処理なども入れてないので、データの端の影響もあるかと)

一方、G線は、やはりスペクトルとしても分りずらいですね。一応、250Hzのところに僅かなピークがありますが、G線の音と分かっていなければ無視するでしょうね。ここら辺は、もう少し、正確なデータ取得、処理をして確認していくことにします。

いずれにしろ、Aruduinoレベルで、バイオリンの音のサンプリング及びFFT処理がそれなりの時間でできるということと、ある程度、スペクトルも分析できそうだということが分かっただけでも良かったです。

今後の計画

残りの作業。次は、ADサンプリングとFFT処理バイオリンの音判別をトライします。また、大体の要素がそろってきたので改めて全体の設計もしていこうかと。あと、制御基板をどうするかですが、念のためSeeeduinoもポチって置きました。

  • AD&サンプリング
  • FFT処理(信号処理をもう少し工夫)
  • 制御基板作成
  • 省電力化検討(スリープ機能など)
  • 簡易オシロ(波形、レベル)
  • 簡易スペアナ
  • 音判別(簡易版、精細版)
  • 練習時間タイマー(本命)
  • 簡易チューナー(おまけ)
  • 時計(おまけ)(時刻設定)

よろしければ、お付き合いください。

(2022.1.10 更新)

バイオリンタイマーの製作#2

大失敗をやらかしてしまいました。

自作電源にLCDモジュールをつないだまま、電源スイッチをオンにしてしまい、LCDモジュールを壊してしまいました。あとで、電源オン時の過渡電圧を測ったら、ピークで15Vもありました。3.3Vのレギュレータ入れて置けばよかったです。

気を取り直して、他の部分から作って行きます。

baum-kuchen.hatenablog.com

LCD表示(積算時間、履歴、グラフ、表示部品)

LCD画面イメージを作成。年、月、週、日単位での積算時間を上段に表示。下段は、各日の積算時間の履歴表示(36日分)。

f:id:Baum_kuchen:20220108130701p:plain

これをもとに、Aruduinoで仮プログラムで表示までさせましたが、写真を撮る前に、LCDモジュールが逝ってしまいました。後悔、先に立たずです。

f:id:Baum_kuchen:20220106002229j:plain

マイク回路

コンデンサマイク用のアンプ回路の確認をしました。消費電流を抑えるため、抵抗も高め、OP AMPも低消費電力タイプのNJU7062を使用。

f:id:Baum_kuchen:20220108180615p:plain

ブレッドボードで確認しているところ。実際にバイオリンを弾いて、AMPゲインも調整しました。

f:id:Baum_kuchen:20220108194251j:plain

バイオリンの音(A線)は、こんな感じです。かなり大きめに弾いてますが、これ以上だと飽和してしまいます。が、一旦、回路はこれで決定します。

f:id:Baum_kuchen:20220108194614j:plain

今後の計画

思いつく当たりで以下の項目を順不同で、作って行きます。このまま、Aruduinoで行くか、PICを使うかは、ソフトの試作をしながら決める予定。

  • AD&サンプリング
  • FFT処理
  • 時計IC制御
  • 制御基板作成
  • 簡易オシロ(波形、レベル)
  • 簡易スペアナ
  • 音判別(簡易版、精細版)
  • 練習時間タイマー(本命)
  • 簡易チューナー(おまけ)
  • 時計(おまけ)

よろしければ、お付き合いください。

バイオリンタイマーの製作#1

大分経ってしまいました。

そろそろ作りだします。ちなみに、自作CNCは、まだ完成していません。

baum-kuchen.hatenablog.com

外観設計(ケース製作)

全体構造を設計します。ケースは、例によって3Dプリンタで作ります。

こじんまりした、構造と思ってましたが、結局は、ヤマハのチューナと同じ外形寸法で作ることにしました。(バイオリン教室で、他の生徒さんが良く使っているものです。自分は、KORG製ですが)

寸法 111×74×18mmの中に、いかに埋め込むか、それなりに試行錯誤しました。裏側から見た図です。真ん中の四角い穴がLCDパネルがはまるところ。

f:id:Baum_kuchen:20220105213053p:plain

実は、ここまで製作が遅れたのは、FreeCADでのモデル作成で、エラーが解消できなかったためでした。四隅のネジ止めのところが上手くいかず、結局、モデルをほぼ最初から作ることに。

で実際の製作結果です。写真では、秋月で買った1.77インチLCDパネルを嵌めてみたところ(当然裏から見たところ)

f:id:Baum_kuchen:20220105213410j:plain

LCDの上に、基板を載せるイメージです。

f:id:Baum_kuchen:20220105213541j:plain

LCDパネルのテスト

今回の新規部品であるLCDパネルの使い方確認を兼ねてテストです。秋月のサイトからダウンロードしたマニュアルだけでは良くわからないので、ネットを探るとちょうど同じパネルのdemoプログラムがGitHubにありました。

github.comただし、これは、Seeeduino用のプログラムだったので、少し改造して、とりあえず動作の確認ができました(写真の青のグラデーション表示は、GitHubのdemoプログラムにはありません)。ElegooUnoとLCDパネルの間にあるのは、3.3V-5.0Vレベル変換用の74HC4050です。

f:id:Baum_kuchen:20220106002229j:plain

と、簡単に出来たように書いてますが、いろいろ悩んだ末にたどりつきました。

その理由は、何といってもインターフェース仕様の解釈です。

 マニュアル(ILI9163V)には、一応、SPI(LCDパネルとしては、4wire-SPI)とありますが、

f:id:Baum_kuchen:20220106003416p:plain

信号名称がCSX、SCL、SDA、D/CXとなっていて、(SCL、SDA)ときたらI2Cではないですか。でも、D/CXって何って思いましたが。

f:id:Baum_kuchen:20220106003628p:plain

4線SPIでは、普通は信号線は、CS(SS)、SCK、MOSI、MISOだと思うので、一体どっちなんだと。

ネットを幾つか探しても、ILI9143Vは、SPIだと書いてあるし、Aruduioのスケッチ例もありましたが、”SPI.h”をインクルードしているようです。また、マニュアル(ILI9143V)を良く読むと、D/CX信号でコマンドとデータバイトを識別しているともあり、単純なSPIインターフェースでは動かないのでは等々。
 で、ようやくたどり着いたのが、先に紹介したGitHubでしたが、ここまで来て改めて理解しました。

 ILI9143Vは、SPIではないが、描画コマンドを設定するだけなら、SPIインターフェースと同じ動作で動かすことができる

ということかと。 

ちなみに、GitHubのSeeduino用プログラム変更したのは、以下のIO定義と、スタティックRAMのサイズの違い(Aruduinoが2Kしかない)による、vram[]変数の取り扱い位です(当然メモリが少ないのでその範囲で制限しただけなので、同じ表示にはなりませんが、テスト用としては十分でした)。Aruduionのpin13-11が、SPI.hライブラリで使う信号線です。

//Aruduino Uno
//
//13 SCK 
//12 MISO
//11 MOSI
//10 SS
//9  DC
//8  RST
#define TFTCS    10   // chip select
#define TFTCD     9   // command/data
#define SPICLK   13   // clock
#define SPIDAT   11   // data
#define TFTRST    8   // reset

今後の計画

LCDが何とか使えそうになったので、個々の要素を作り上げていきます。LCDつながりで、成果が見えやすい画面構成あたりから作っていこうかな。

 

バイオリンタイマーの製作(構想)

もっぱら、土日曜日の練習ですが、どのくらい練習しているのかを記録してみたくなりました。

一つのことをものにするには、10.000時間の練習が必要、と言う様なことをどこかで聞いたことがあるので、実際、自分はどのくらい練習出来ているのか興味のある所。

  別に、タイマー作らなくでも、エクセルに毎回練習時間を記録していけばいいだけですが、そこは、無精な性格と電子工作の趣味を兼ねて。

と言う事で、前置きが長くなりましたが、作ってみます。

仕様

どこまで実現するかは不明で、仕様をつらつら書き連ねて見ます。

  • 周波数分析でバイオリンの音を判別 
  • バイオリンの音が出ている時間を、練習時間として自動積算
  • 練習時間の積算は、1分単位
  • 液晶表示器or 7セグLEDに、その日の練習時間を表示
  • その週、その月の練習時間も表示可能
  • 電源スイッチはなし。スタンバイ中は、表示は消灯で、消費電力を抑える
  • こじんまりしたケースに収納、バイオリンの雰囲気を阻害しない見栄え
  • 単3 or単4 電池駆動、電池寿命は1ヶ月

  • 電池が切れても記録は保存

  • 超簡易スペアナ機能
  • チューナー機能

インターフェース

  • ヒューマンインターフェースは、シンプル
  • 練習時間は、00:00〜99:59、0000〜9999、練習中検知表示LED点滅
  • モード選択SW 1個
  • 表示期間選択、D.W.M.Yの切替
  • ミニUSB

システム構成

  • 1.7インチ液晶ディスプレー
  • PIC I2C、ADC、TMR、USB、DIO.
  • コンデンサマイク、低消費電力OP AMP
  • 時計IC DS1302
  • タクトSW
  • ミニUSBコネクタ

今後の計画

作りかけCNCの作成をしながら、少しずつ構想を煮詰めていくつまり。まずは、バイオリンの音の自動判別の実現性検討ですね。

ps:我ながら、集中力の無さに、あきれてます。早く、CNC仕上げないとっ!!

 

バイオリン 独学お役立ちサイト#2(日本弦楽協会)

ひさびさ、バイオリンねた。(というほどでもないが)

それなりに曲も弾けるようになって来て、少し上のレベルを目指して、日々(毎週)練習をしているところ。バイオリン教室のリアルな先生もいいですが、ネットからも得る情報も相変わらず貴重です。

バイオリンを始めたころに見ていたサイトです(お世話になりました)。

baum-kuchen.hatenablog.com

最近の一押しのサイトはこれです。最初に見つけたとき、何か怪しい(というのも、一教室なのに、”協会”と名乗るのもどうかな)と思ったけど、とってもまっとうなところの様です。失礼しました。

www.youtube.comで、今では、説明がとっても分かりやすく、理にかなっていると思えるようになりました。ただし、レベルは、かなり高め。毎週金曜22時に新しい動画がアップされます。

その割にはフォロワー数が少なめのので、少しでも貢献出来たら良いかなと思って、(ほぼ自分のために)勝手にインデックスを作ってみました。

良かったら覗いてみてはいかがでしょうか。

#それにしても、何でタイトルが”Keithy’s・・・”なんだろうか。

 

ビブラート

『ビブラートのかけ方①』

『ビブラートのかけ方②』

『ビブラートのかけ方③』

『ビブラート完全攻略法④かける速さをコントロールする練習方法』

『ビブラート完全攻略法⑤♪短い音符にかける練習方法』

『ビブラート完全攻略法⑥*かける方向に注意しましょう』

『ビブラート完全攻略法⑦*かける速さ&回数を自在にコントロールする練習法*』

『ビブラートを音楽的に曲に生かす』

『ディレイビブラートを上手に取り入れる』

『ビブラートは手首を使う?腕を使う?』

『高いポジションのビブラートを綺麗にかけるコツ』

『小指のビブラートの練習』

『人差し指のビブラートを攻略する』

 

音階練習

『変ト長調&変ホ短調(3オクターブ)音階の音程合わせ練習』(♭x6)

『変イ長調&ヘ短調(3オクターブ)音階の音程合わせ練習』(♭x4)

『変ロ長調&ト短調(3オクターブ)音階の音程合わせ練習』(♭x2)

『ハ長調&イ短調(3オクターブ)の音階の音程合わせ練習』(-)

『変ホ長調&ハ短調(3オクターブ)音階の音程合わせ練習』(♭x3)

『ヘ長調&ニ短調(3オクターブ)音階の音程合わせ練習』(♭x1)

『ロ長調&嬰ト短調(3オクターブ)音階の音程合わせ練習』*転ばなずに速くスラーで弾くための練習方法付き*(#x5)

『ホ長調&嬰ハ短調(3オクターブ)音階の音程合わせ練習』(#x4)

『イ長調&嬰ヘ短調(3オクターブ)音階の音程合わせ練習』(#x3)

フラジオレット

『フラジオレットを綺麗に弾くコツ・練習法』

装飾音符&トリル

『装飾音符を効率良く攻略する』

『トリル&装飾音符の形を綺麗にまとめる方法』

『トリルの方法を理解しましょう』

重音

『重音の練習のやり方』

『3重音を音楽的に弾く方法』

 

(注:他にも有益な動画が沢山です)