8フロッピーのMIDIプレーヤー。 または、電子技術者がどのように夢中になったか

フロップの歌唱と廃盤になったコンピューターの山に関するビデオを見たことがあります。 私はそのようなことをすることにしました。



レディデバイス



Arduinoで他のことは好きですか? 本気ですか? 彼らが言うように、F * ckシステム! 彼女だけが手元にいたため、 Atmega8Aで行うことにしました。 ワイヤーも弱虫用であるため、HC-05を見つけました(なぜ余分な鼻水ですか?)。



行こう!



スキーム



通常の最初の段階はスキームです。 彼女には問題はありません。



スキーム



シンプルであり、不要なフリルはありません。



料金



ボードは、フォトレジストを使用して大きなストレスなしで作成されます。 10分で散乱し、1時間で作られました。



PCBレイアウト






コードを書く



今、楽しい部分はプログラミングです。 時間を節約するために、Cで書くことにしました。 しかし、すでに熊手として、開始する時間がありませんでした。



レーキは、フロップを制御することにあります。 ご存知のように、Directピン= 0でステップにパルスを与えると、フロップは前進し、Directピン= 1でバックすると、フロップは80ステップしかありません。 することはほとんどない? 解決策は簡単です。 ステップの状態を変更するだけで、パルスをパルス化するのではなく、フロップが半分のステップを取ることができます。 これを行う方が良い:



Step ^= (1<<pin);
      
      





最初の問題は解決されました! 管理機能全体のさらなる実装。



 void output(int drive){ // drive -   1 - 8 int position = drive - 1; //       0-7 if(currentPosition[position] >= max)direct |= 1 << position; // direct -  char (8 ).   ,    if(currentPosition[position] <= 0)direct &= ~(1<<position); // ,     if(direct & (1<<position)){ //  back(drive); //  currentPosition[position]--; //    }else{ forward(drive); //  currentPosition[position]++; //  } }
      
      





できた! 今、タイマー。 タイマーをCTCモードに設定し、8で割って、アウトプットコンペア(以下OCと呼びます)による割り込みを有効にします。 OCRに40を入れます。40マイクロ秒ごとに約1回、OCイベントが発生します。 割り込みハンドラーは非常に大容量です。



好奇心のために
 void Action(){ if(fr1 != 0){ currentTick[0]++; //   if(currentTick[0] >= fr1){ //fr* -     output(1); currentTick[0]=0; // -  } }; if(fr2 != 0){ currentTick[1]++; if(currentTick[1] >= fr2){ currentTick[1]=0; output(2); } }; if(fr3 != 0){ currentTick[2]++; if(currentTick[2] >= fr3){ output(3); currentTick[2]=0; } }; if(fr4 != 0){ currentTick[3]++; if(currentTick[3] >= fr4){ currentTick[3]=0; output(4); } }; if(fr5 != 0){ currentTick[4]++; if(currentTick[4] >= fr5){ currentTick[4]=0; output(5); } }; if(fr6 != 0){ currentTick[5]++; if(currentTick[5] >= fr6){ currentTick[5]=0; output(6); } }; if(fr7 != 0){ currentTick[6]++; if(currentTick[6] >= fr7){ currentTick[6]=0; output(7); } }; if(fr8 != 0){ currentTick[7]++; if(currentTick[7] >= fr8){ currentTick[7]=0; output(8); } }; } ISR(TIMER2_COMP_vect){ Action(); }
      
      







これでコンピューターとの接続。 ここでそうします。 ヘッダーにマクロがある行(C / F)->本体(番号)->パケットの終わり( ';')が渡されます。 まず、ステートマシンを介した処理:



 void parse(){ char data = UDR; switch(data){ case 'C': tmp_int = 0; SM= data; break; //  -    case 'F': tmp_int = 0; SM= data; break; // F -  case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': tmp_int = tmp_int * 10 + (data -'0'); break; case ';': switch(SM){ case 'C': channel=tmp_int; break; case 'F': freq = tmp_int; break; }; play(freq, channel); break; // play          fr* case 'R' : resetAll(); break; default: break; } }
      
      





次に、受信はアイドル状態のみです。



 while ( UCSRA & (1<<RXC))parse();
      
      





-さて、すべてはすでに?

-いや! そして、何を管理しますか?



ゼロから制御プログラムを書くことは壊れていたので、テスラコイル制御プログラム( HETC制御端末 )に機能を追加しました。 中毒? もちろん。 インターフェースは自分で把握できますが、あまり説明しません。 最初に行うことは、フロッピーとデバイスのCOMポートを選択してから、接続することだけです。



はい、それはブルートゥースなしで可能です、それはちょうど私のトラブルです。



MIDIファイルIIIを選択して......







ソースコード



ソース+ファームウェア



All Articles