Padaukマイコンで音を出すプログラムを作り、メロディIC化することができました。
メロディIC化
プログラムを作る
void main() { // Initialize hardware AUTO_INIT_SYSCLOCK(); PDK_USE_FACTORY_IHRCR_16MHZ(); PDK_USE_FACTORY_BGTR(); // disable WDT CLKMD &= ~CLKMD_ENABLE_WATCHDOG; PAC |= (1 << SPK_BIT); // Set Speaker as output (all pins are input by default) // Main processing loop while (1) { for(uint16_t i = 0; i < 10000; i++) { tone(melody_data[i].delay_cycles, melody_data[i].cycles); } } }
プログラムは上のような感じで、音の高さと長さを指定して音を鳴らすtone関数を音楽に合わせて呼びます。
void tone(const uint16_t delay_cycles, uint16_t cycles) { static uint16_t i; if(delay_cycles != NOFF_DELAY_CYCLES) { // is NOT Note OFF for(i = 0; i < cycles; i++) { SPK_ON(); _delay_loop_32((uint32_t)delay_cycles << 0); SPK_OFF(); _delay_loop_32((uint32_t)delay_cycles << 0); } } else { for(i = 0; i < cycles; i++) { // is Note OFF SPK_OFF(); _delay_loop_32((uint32_t)delay_cycles << 0); SPK_OFF(); _delay_loop_32((uint32_t)delay_cycles << 0); } } }
tone関数はこんな感じにしました。音程によってディレイの長さが変わります。
#define NOTE(FREQ, LEN) {(uint16_t)MIN(((uint32_t)LOOP_CTR_32(US_TO_CYCLES(1000000 / FREQ / 2)) >> 0), 65535), (uint16_t)MIN((((uint32_t)NOTE_US * LEN) / ((uint32_t)1000000 / FREQ)), 65535)} __code uint16_t NOFF_DELAY_CYCLES = ((uint16_t)MIN(((uint32_t)LOOP_CTR_32(US_TO_CYCLES(1000000 / NOFF / 2)) >> 0), 65535));
ただ、実行時にディレイを計算するとPadaukのごく少量しかないメモリが足りなくなるため、プリプロセッサを先に計算しておきます。
NOTE(FS2, 2), // 1 1 intro /* Ievan Polkka */ NOTE(CS3, 2), NOTE(CS2, 2), // 1 2 NOTE(CS3, 2), NOTE(FS2, 2), // 1 3 NOTE(CS3, 2), NOTE(CS2, 2), // 1 4 NOTE(E2, 2), NOTE(FS2, 2), // 2 1 ...
音楽のデータはこんな感じに音程と長さがセットになっています。
聞いてみる
鳴りましたよ!
PadaukはIOピンのドライブ能力が低いので、直接スピーカーを接続しても問題なさそうです。電源のバイパスコンデンサも不要。あると逆に起動できなかったりします。
もう少し長く鳴らしたい
k-mean法という非可逆圧縮を使って、メロディーをもっと長く記憶できるようにしてみました。
非可逆圧縮なので2カ所の音が正しくありませんが、長い曲をPadaukマイコンに収めることができました。
安価なPadaukマイコンがメロディICになりましたよ!
メロディスピーカー
基板の設計
PMS150CというPadaukマイコンはROMの容量が小さいですが、SOT-23パッケージもあります。そこで、スピーカーと同じ大きさの基板を作り、その中にマイコンを実装して、電源をつなぐだけで音楽が鳴るスピーカーを作ろうと思います。
実装しやすいように、12個面付けして大きな基板にします。小さな基板は、Vカットを使って基板から切り離せるようにしました。
PCBgogoに基板を発注
PCBgogoに基板を発注します。まずは基板のパラメータを設定します。
基板のサイズと製造する基板の枚数を設定します。今回は10cm x 10cmを10枚作ってもらいます。5枚でも十分なのですが、5枚と10枚と値段が変わらなかったので10枚としました。
「Xマークを許容できる」は、面付けした子基板のうちどれかに不良があってもいいかという質問です。不良があっても別にいいので「はい」を選びました。
あとは基板の色を選択します。今回はスピーカーが黒なので基板も黒にしました。他のパラメータはデフォルトのままでもOKです。
表面処理はデフォルトでは有鉛はんだですが、無鉛はんだを選びました。
メタルマスクも作ってもらいます。枠があると重くて邪魔なので「枠なし」を選びます。
またメタルマスクは基板のサイズ+20mmくらいがちょうどいいので、カットしてもらいます。「ご要望」の欄に「120mmx120mmにカットして下さい」と記入します。PCBgogoは日本語で大丈夫です。
以上でパラメータの設定は完了です。画面右の「カートに入れる」をクリックしてカートに入れます。
ガーバーファイルのアップロード画面が表示されるので、「ガーバーデータを入稿」をクリックして、zipで圧縮したガーバーファイルをアップロードします。アップロードできたら「確認」をクリックします。
アップロードが完了すると、データのチェックが開始されます。データのチェックには数10分から数時間かかることもあります。今回は午前中の営業時間内だったこともあり、3分程度で完了しました。
データに問題があると、エンジニアからメールが届きます。PCBgogoは、このエンジニアからのメールも全て日本語対応しています。何か問題があっても日本語で解決できるので、全然大丈夫です。
データのチェックが完了すると、支払いができるようになります。右下の「レジに進む」をクリック。
発送手段を選択し、右側の赤い「支払い」をクリックします。
PayPalの画面が表示されるので、そこで支払いを完了させます。
以上で発注が完了です。製造が開始されました。
メロディスピーカーできるかな?
基板が届いたら、SOT32のPadaukマイコンにプログラムを書き込んで、組み立てたいと思います。
コメント