ATMega8のタートルロボット

彼らはここで彼らの「ロボクラフト」について語り、私も私のものを共有することにしました。

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); // } }
      
      





私自身はこれが簡単にできることを理解しています...しかし、私はプログラマーではないので、科学的な突っ込みの方法です)



All Articles