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を選択して......
ソースコード
ソース+ファームウェア 。