新年の音楽カード

正月やクリスマス休暇が控えており、多くの人が友人や親relativeに何をプレゼントするかを心配しています。

実際、私は同じ問題を心配していました。 そして、そのようなアイデアが思いつきました。音楽のポストカードを作ることです。 もちろん、このアイデアは新しいものではありません。中国の兄弟が大量に低価格で製造しています。 しかし、私は中国人と競争するつもりはありませんでした、私は自分の何かをしたかっただけです。 そして、私には、良い結果が得られているようです:









TK


まず、次の要件を策定しました。

開くと、カードは円でメロディーを再生します。

メロディとして、Shchedryk、またはキャロル・オブ・ザ・ベルを選びました。

メロディはポリフォニックであることが望ましい。

スキームは可能な限りシンプルで、詳細を最小限に抑え、繰り返しやすく、安価である必要があります。 そして最も重要なこと-はがきに収まる。



分析


長い間、私はマイクロコントローラを使用するつもりでしたが、実験のためにいくつかの最も安いattiny13を購入しました。そこで、これらのマイクロコントローラに基づいて回路を作成することにしました。

そもそも、このMKで考案されたものを実装できるかどうか、もしそうならどのように実装できるかを考えました。 これを行うために、 ノートを見つけてダウンロードし、分析に進みました。

MKのメモリー内のメロディーはさまざまな方法で書き込むことができます。2つのオプションを思い付きました。1)最小ノートの継続時間に対応する各期間のノート番号の形式、2)形式の継続時間-ノート。 もちろん、最初のオプションは実装が簡単です。 私は思う:歌には25小節があり、そのうち16小節は2回繰り返されます。 わずか41小節。 最小音符の長さは1/8で、小節サイズは3/4です。したがって、1小節には最小音長の6つの音符があり、メロディ全体に6(小節あたりの音符)* 41(小節)* 3(声)= 738が含まれますノート。 各ノートに1バイトを費やすと、attiny13には合計1024バイトのフラッシュメモリが含まれているため、かなり多くなります(プログラム自体と頻度テーブルを配置する必要があります)。 したがって、2番目の方法を試す価値があります。 持続時間に1バイトを使用し、ノートの高さまで1バイトを使用した場合でも、すでに263音(ポーズを含む)しか受け入れられないと思います。526バイトになります。

私はアセンブラーで書くことを決めました-最初に、MK自体によりよく対処するため、そして次に-残りの700バイトに収まるようにするため。

MK tiny13には2つのPWMが搭載されており、2ボイスのメロディーを作成できます。 ただし、このメロディには3つの音声が必要なので、PWMだけを使用してサウンドを生成することはできません。 簡単にするため、少なくともデバイスの最初のバージョンでは、PWMの使用を放棄することにしました。



スキーム


まず、メロディーの各声を別々のMK足に持って行くことにしました。 したがって、初期スキームは次のとおりでした。







後に、この組み込みにより、音楽は非常に静かに聞こえることが判明しました。 この問題を解決するには、1つのチャンネルですべての音声をミックスし、逆位相で2つのMK出力に結果を適用する必要がありました。これにより、圧電素子の電圧変化は供給電圧の2倍になりました。 スキームはさらに単純です:







アルゴリズム


MK出力で特定の周波数のサウンドを得るには、そのクロック周波数をMK周波数/プリセット周波数に等しい数係数で除算する必要があります。 除算演算(および剰余モジュロの計算)はAVRコマンドのリストにないため、カウンターを使用して除算します。 最初に、カウンターに除算係数が割り当てられ、次のサイクルで1が減算されます。カウンターがゼロの場合、分周器で信号が変化する時間になり、特定のMKレッグの値を変更し、値係数をカウンターに書き戻す必要があります。

カウンターディバイダーには4つのピースが必要です。1つは投票ごとに1つ、もう1つは音符のカウント(およびテンポの決定)に必要です。

操作アルゴリズムは次のとおりです。



1)変数を初期化する

2)音符のカウンターディバイダーがゼロに等しい場合、各音声で現在の音符の演奏が終了したかどうかを確認し、演奏が終了した場合、次の音符をメモリからロードします。

3)投票ごとに、カウンタがゼロに等しい場合、カウンタを1減らし、除算係数を再割り当てして、出力の値を変更します。

4)2への移行



このアルゴリズムが機能するためには、各プログラムサイクルが同じクロックサイクル数で実行される必要があります。 これを行うには、すべてのブランチブランチを計算し、「速すぎる」セクションにnopまたは空のループを追加する必要がありました。



最初は、MKの3つの出力に音が出力されたとき、波形は蛇行の形でした。 次に、これらすべてをミックスし、逆位相で2つのピンを介して(つまり、実際には1つのピンを介して)出力する必要がある場合、これら3つの音声をミックスする方法の問題が発生しました。 したがって、短いパルスの形で波形を作成し、単純なORでそれらを要約することが決定されました。



プログラムコード


プログラムのソースコードはこちらにあります。





最終バージョンを実装すると、次のタスクが発生しました。

1)栄養

2)オンオフ

この記事によれば、約2016 mAhの容量を持つcr2016リチウム電池で問題1を解決しました。 サイズと価格の点で許容できる工業用コンパートメントが見つからなかったため、バッテリーをペーパークリップからその場しのぎのコンパートメントに入れました。 回路は約2 mAを消費するため、このようなバッテリーは40時間持続する必要がありますが、これで十分です。

最初は同じクリップを使用して問題2を解決することを考えましたが、リードスイッチと磁石を優先してこのアイデアを放棄しました。 操作の原理はビデオで見ることができます。



ファームウェア


AVR Studio 4でコンパイルしてフラッシュし、ヒューズでフラッシュするとき、クロック周波数のみを4.8 MHzに変更し、マスターオシレーターの8つの周波数による除算をオフにしました。



予算


マイクロコントローラー-8 UAH

圧電素子-2 UAH

バッテリー-4 UAH

リードスイッチ-2 UAH

プログラム開発、デバッグ-6時間

回路の開発、テスト-3時間

1枚のはがき(エッチングされたカードがある場合)-1時間



写真




最初のプロトタイプ





第二のプロトタイプ





バッテリーマウント





完成したデバイス-部品の側面からの眺め





レディデバイス-背面図





最初のエピソード



PS


明けましておめでとうございます、メリークリスマス!



All Articles