Polulu 3piロボットに触発されました。 しかし、彼は自分で作ることを決めましたが、後でそれはより難しく、最も重要なことにははるかに高価であることが判明しました。 しかし、これらは些細なことです)
私はさまざまなフォーラムでさまざまなスキームを掘りました。エンジン制御回路 、 IRセンサー制御回路 、そして私はこのすべてをAtMega8 MKで始めました。
ここで判明したVobschemの何かはそのような動物です

前方に2つのTSOPと3つのIR LEDがあります。 5個以下のLEDと5個のフォトトランジスタ。 Vobschem何かと線をたどって障害物を検出できます。
ロボットについてもう少し詳しく、写真とビデオをいくつか
私は彼に多くの時間を殺しました。 多くの夜。 しかし、今では、回路基板のエッチング方法、どのような不快な塩化第二鉄、それが衣服からどれほどひどく洗い流されているか、そしてそれがどのような悪い場所をテーブルに残すかを知っています。 錫とはんだ付けを学びましたが、以前はそれを行う方法を知っていましたが、ロボットの後でしか方法を理解できませんでした。
しかし、これはささいなことです)結果の喜びはすべてを明るくします。
MKはTSOP用のICパルスを生成しています;また、それらからの応答を監視し、エンジンを制御します。
後ろ

そして底

すべての部品、モーター、センサーなど 回路基板上にまとめて配置されました。
彼はコーレルで自分でスキームを描いた)

モーターはこんな感じ

そして、ここに小さなビデオがあります-ビデオにわずかな修正を加えたロボットですが-バッテリーがさらにあります。
予想どおり、ホッチキスで撮影された...
現時点では、ロボットの作業が少し凍結されています。 時間がなくなった。
しかし、近い将来、それを復活させ、いくつかの改善を行う計画です。
1.バッテリーを入れます(すでにDectの携帯電話で購入しました-それだけです)。そうしないと、バッテリーがすぐになくなります。
2.各ホイールのシャフトに、古いボールマウスのホイールとセンサーを取り付けます。 したがって、ホイールの回転数を追跡し、ホイールを必要な角度に回すことができます。 これにより、移動軌跡を非常に柔軟に制御できます。 はい...このため、私はいくつかのフォトトランジスタを削除する必要があります...むしろ、私は4を削除し、中央に1つを残さなければなりません。 しかし、一般的に、黒い線に沿って移動するタスクはそれ以上の価値はありません。 したがって、たとえばテーブルの端を検出するには、CD + FTのペアで十分です。
3. MKとエンジン用の本格的な個別の電源を作成します。
ファームウェアソース。
マニュアルの断片から収集されたので、厳密に判断しないでください:)
/************************************************ *************************************************/ #include <avr/io.h> #include <avr/delay.h> #define F 8000.0 // F, , #define N 20L // N, #define S 2L // S, #define t (unsigned long)((1/F)*1000000.0/2.0) // t, , #define Tp (unsigned long)(N*(t*2)) // Tp, , #define Td (unsigned long)(Tp*(S-1)) // Td, , void init(void) { DDRD = 0x00; DDRB = 0xff; DDRC = 0xff; PORTB = 0xff; PORTC = 0xff; PORTD = 0xff; PORTB |= _BV(PB1); PORTB |= _BV(PB2); } void rMotorF(void) { PORTC &= ~_BV(PC4); // "0" PORTC |= _BV(PC2); // "1" } void lMotorF(void) { PORTC &= ~_BV(PC5); // "0" PORTC |= _BV(PC3); // "1" } void rMotorB(void) { PORTC &= ~_BV(PC2); // "0" PORTC |= _BV(PC4); // "1" } void lMotorB(void) { PORTC &= ~_BV(PC3); // "0" PORTC |= _BV(PC5); // "1" } void IRGenerate(void) { int i; for (i = 0; i < N; ++i) // - { PORTC |= _BV(PC1); _delay_us (t); PORTC &= ~_BV(PC1); _delay_us (t); } } int main(void) // { init(); PORTC |= _BV(PC0); PORTB |= _BV(PB0); while (1) { IRGenerate(); if (!(PIND & (1 <<PIND7))) // { rMotorB(); // _delay_ms(50); } else { rMotorF(); // _delay_ms(50); } _delay_us(Td); IRGenerate(); if (!(PIND & (1 <<PIND6))) // { lMotorB(); // _delay_ms(50); } else { lMotorF(); // _delay_ms(50); } _delay_us(Td); // } }
私自身はこれが簡単にできることを理解しています...しかし、私はプログラマーではないので、科学的な突っ込みの方法です)