Baumkuchen’s Workshop

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

バイオリンタイマーの製作#7-制御基板設計(つづき^3)

制御基板の作動確認をします。PICには、既にテスト用のプログラムが入っているので動くはず。

baum-kuchen.hatenablog.com

作動確認

配線チェック(2か所間違ってました)を行ったあと、LCDをつないで作動確認。

PICにはプログラムは入っているので、あっさりと画面が表示されました。

f:id:Baum_kuchen:20220125215305j:plain

ここまでくれば、後は、ソフトをひたすら組み上げるだけです。電池作動を意識して8MHzクロックで動かしているので、Aruduinoの時より、少し、表示スピードが遅いです。

写真では分かりませんが、時計IC、スイッチの作動確認プログラムもAruduinoから移植して無事動くことを確認。(時計ICの初期化を忘れて、少し、悩みましたが)

今後の計画

ハードは一応完成です。USBのインターフェースはまだ未確認ですが、何とかなるでしょう。ケースに組み込んだら、ソフトの完成度を上げていきます。

秋月ファンクションジェネレータ 085miniDDS

ずっと気になっていた、秋月のファンクションジェネレーターをぽちってしまいました。
f:id:Baum_kuchen:20220124020527j:plain

ファンクションジェネレーターはずっと欲しいと思ってましたが、使用頻度もそう高くもないので、ちょっとした信号が出せるという事で、秋月キットになりました。

今作っているバイオリンタイマーのテスト用というのもあります。

安物買いの銭失いになってしまうか分かりませんが、作る楽しみを買ったと思い、製作に勤しみます。

f:id:Baum_kuchen:20220125214750j:plain

確認がてら部品を並べてみました。欠品、欠損もなかったので安心。

ただそれだけです。

ちなみに、もっと安いもといいうことでは、こちらも検討しました。結局、作りたい人なんです。

 

(2022.1.25更新)

 

 

 

 

 

 

バイオリンタイマーの製作#6-制御基板設計(つづき^2)

土曜日にPICが届きました。制御基板の製作を進めます。

baum-kuchen.hatenablog.com

PICでの事前確認

いきなり回路を組んで動かないと、あとのデバッグが大変なので、ブレッドボードで事前確認を行いました。Aruduinoで作っていたプログラムをPICに移植してLCD表示だけでも出ることを確認します。

f:id:Baum_kuchen:20220123020256j:plain

無事に絵が出ました。細かい表示部品も平行して作ってたので、”VilolinTimer”のロゴも見えるかと思います。消費電力を抑えるため、内臓RCで8MHzで動かしていますのでSPIのクロックが2MHz(LCDのスペック的には最大6MHz)になりますが、描画の速度は、そんなに遜色ない感じです。

バックライト制御

最大の消費電力となるバックライトの制御は重要です。最大40mAも流せますが、そんなに流したらあっという間に電池が無くなります。3.3Vに100Ωつないでも可なり明るい感じなので、バックライト制御は、直接PICのポートに抵抗をつないで行うことにしました。

こんな感じです。片方だけONとする場合は、残ったポートに逆流しないように、入力に設定するようにします。で、問題は抵抗値をどうするかです。PICの出力電圧は、Min 2.4Vとあり、LCDバックライトの最低電圧2.9Vを満足しない可能性もありです。ちなみに、出力電流は、PORTCなら25mA Maxなので一応はOK。

f:id:Baum_kuchen:20220123023026p:plain

ということで、早速実験。

結果、

 100Ω×1(PC7のみ接続)     :電流4.2mA (PIC 出力3.1V) 

 100Ω×2(PC7、PC6の両方に接続):電流7.0mA

 200Ω×1(PC7のみ接続)     :電流2.8mA

で、電流によって明るさの違いは当然ありますが、2.8mAでもはっきり見えます。

昼間、明るいところで確認していないので、輝度を高めにできるように、最初は、100Ωと47Ω(多分8mAくらいにはなるでしょう)で行くことにしました。

基板組み立て

ほぼ完成しました。右側部分は、LCD接続用の基板が上に乗り隠れてしまいます。

f:id:Baum_kuchen:20220124015251j:plain

LCD接続用の基板を載せたところ。小さいコネクタにLCDのフラットケーブルが接続されます。

f:id:Baum_kuchen:20220124015303j:plain

今後の計画

制御基板の組立が完成したので、一通りの作動確認を行います。PICには、ブレッドボードで使ったソフトが入っているので、何事もなければ絵が出るハズです。

 

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

制御基板の製作を進めます。

baum-kuchen.hatenablog.com

スイッチ部分(LCD面)

回路を実装していく前にスイッチの位置決めを行います。制御基板の裏(LCD面側)にタクトスイッチを付ける構想です。

f:id:Baum_kuchen:20220119233911j:plain

が、そのままむき出しは何なので、ちょっと細工を。ということで、3Dプリンタでボタンを作りました。これをタクトスイッチにかぶせます。

f:id:Baum_kuchen:20220119233847j:plain

組み上げたところ。穴の位置が制御基板のピッチと微妙にずれてしまったため、無理やり基板取付穴を削って位置合わせをしたので、中心があってません。

f:id:Baum_kuchen:20220119234241j:plain

裏カバー+スイッチ部分

制御基板表面(カバー側)にもスイッチを付ける予定。

f:id:Baum_kuchen:20220119234439j:plain

同じく3Dプリンターで作ったボタンをかぶせ、裏面カバーを閉めたところ。こっちも、センターが微妙にずれてますが、まずはこれでOKとします。(現状は、電池交換のため、裏面のネジを外さないといけないですが、この改善のため、ケースを作り直すときに考える予定)

f:id:Baum_kuchen:20220119234529j:plain

あと、ケースへの加工として、USBコネクタの取付が必要ですが、ペンディング

制御基板製作 その1

マイクアンプと時計ICまで実装しました。左のコンデンサがはみ出ていますが、ケース内のスペースが空いているのでOKです。とにかく、部品実装高さを6mmに納めないといけないので。

f:id:Baum_kuchen:20220122014830j:plain

(2022.1.21更新)

今後の計画

回路を作り出しました。注文したPICは、明日に届きそうです。

 

バイオリンタイマーの製作#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 更新)