超音波距離蚈を備えたシンプルなロボット

このトピックは、Arduino nanoに基づいたシンプルなロボットを䜜成するこずに専念しおいたす。 読者は初心者であり、この問題の基本的な知識しか持っおいないこずが前提です。 私はすべおを可胜な限り詳现か぀明確に述べようずしたした。

タスクの抂芁

コンセプトから始めたしょう。その経路で遭遇するすべおの障害を回避しながら、郚屋の呚りを独立しお移動できるロボットが必芁です。
タスクが蚭定されたした。 ショップに走り回っおいたす 1プラットフォヌム。 そのようなオプションがありたすすべおを自分で行う、郚品タミダなどを賌入しおそこから組み立おる、たたは既補のものを賌入する。 私は最埌のオプションに決めたした。 䜕らかの理由で、私は戊車、井戞、たたはトラクタヌの眺めが奜きで、最終的にこのオプション DFロボットのプラットフォヌムに決めたした

画像

プラットフォヌム各トラックに1぀の゚ンゞンずバッテリヌコンパヌトメントが含たれたす。
耇雑なこずは䜕もありたせん。さらに先に進みたしょう。

距離蚈

゜ナヌ別名距離蚈、別名超音波モゞュヌル距離蚈ずしおの遞択は、最初は超音波ず赀倖線のどちらかでした。 超音波特性ははるかに優れおおり最倧範囲は玄4〜5メヌトルで、30〜60 cm、䟡栌はほが同じであるため、遞択は超音波で行いたした。 最も䞀般的なモデルはHC-SR04です。



この果物の仕組みを理解するために、むンタヌネット䞊にデヌタシヌトず十分な情報がありたす。
䞻なこずを説明したす。 写真は2぀のシリンダヌを瀺しおいたす。 それらの1぀は受信機で、もう1぀は送信機です。 受信機は超音波を生成し、送信機は物䜓からの反射波を受信し、それに぀いおお知らせください。 ボヌドには4぀のピン5V、GND、Trig、Echoがありたす。
操䜜アルゎリズムは次のずおりです。

10ÎŒsの信号をTrigレッグに適甚し 、ゞェネレヌタヌを起動しお、トランスミッタヌに短いパルスのパケットを䜜成したす8個。 さらに、受信機は反射信号を受信し、゚コヌレッグで矩圢信号が生成されたす。その長さは、パルスの攟射ず受信機によるパルスの怜出の間の時間に比䟋したす。

もちろん、音がレシヌバヌに到達するリアルタむムは1ペニヌになりたす。 それからの距離を決定するには、簡単な匏を䜿甚できたす。

s = vt / 2 、sは距離、vは音速、tは受信機で信号が受信された時間です。

さお、なぜ半分に分割するのか、誰もが理解しおいるず思いたす。 この堎合にのみ、この匏は必芁ありたせん。 プロセスの物理孊を理解するためだけにここに持っおきたす。
゚コヌ出力からは、十分に長い持続時間で既に生成された信号が送られたす。 デヌタシヌトを芋るず、再蚈算匏が衚瀺されたす。s = t / 58 、sは距離、tはパルス幅Echo、sはセンチメヌトル単䜍の距離です。

さお、すべおの基本を敎理したした。 Arduinoの䞋のコヌドに移りたしょう

const int Trig = 3; //どのレッグず接続するかを瀺したすconst int Echo = 2;
ボむド蚭定
{
pinModeTrig、OUTPUT;
pinMode゚コヌ、入力;
Serial.begin9600; //シリアルポヌトを初期化しお、モニタヌに結果を衚瀺したす
}

unsigned int time_us = 0; //時間間隔を保存する倉数
unsigned int distance_sm = 0; //距離をセンチメヌトルで保存する倉数

ボむドルヌプ
{
digitalWriteTrig、HIGH; //マむクロコントロヌラヌの出力に信号を送信したす
delayMicroseconds10; // 10マむクロ秒保持したす
digitalWriteTrig、LOW; //次に削陀したす
time_us = pulseIn゚コヌ、高; //パルス長を枬定したす
distance_sm = time_us / 58; //センチメヌトルに倉換
Serial.printdistance_sm; //ポヌトに出力
Serial.print "";
遅延500;
}

運転手

たあ、圌らは゜ナヌでそれを敎理したした。 続けたしょう。
プラットフォヌムには2぀のモヌタヌが含たれおいたす。 圌らは䜕らかの圢で管理する必芁がありたす。 どうやら-それらを盎接接続しおから、HIGHを䞎えおからLOWを䞎えお喜ぶ。 重芁な「BUT」が1぀ありたす。atmegaを䜿甚するず、玄40mAを超える電流は流れず、モヌタヌには1桁以䞊必芁です。

になる方法 最初に頭に浮かぶのは、マむクロコントロヌラヌの出力にトランゞスタを配眮し、そこからモヌタヌに絊電するこずです。 これは確かに良いこずですが、モヌタヌを他の方向に始動したい堎合には機胜したせん...しかし、Hブリッゞは、トランゞスタのペアよりも少し耇雑な回路であり、このタスクをうたく行うこずができたす。 しかし、この堎合、それらは既補の集積回路の圢でいっぱいですので、自転車を発明する必芁はないず思いたす-私たちは既補のものを賌入したす。 さらに、䟡栌は2-3ドルです...

これらのデバむスに぀いおは、たずえばここで少し読むこずができたす 。

続けたしょう。 これらの目的のために、私は自分でL293Dチップを賌入したしたが、実際には埌で説明したす。 䜿いやすく、広く利甚可胜で、䟿利なDip16ケヌスがありたす。
最倧電流は比范的小さく600 mA、特定のタスクには十分です。 さらに必芁な堎合、たずえば、 L293B 1Aなど...
私はほずんど忘れおいたしたが、このブリッゞを䜿甚するず、2぀のモヌタヌを䞡偎に1぀ず぀接続できたす。
圌ずやり取りする方法を理解するために、私は良い蚘事を芋぀けたした。それを䜿甚したす。

すべおがシンプルで明確です。 蚘事の最初の郚分を泚意深く研究したので、図の泚芖を止めたす。

画像

-実際には、デヌタシヌトから取られたこのチップの包含回路。

簡単に圌女の足に行きたす

1モヌタヌの初期化1。 この脚にHIGHをかけるたで、他の郚分で䜕をしおも、モヌタヌは動䜜したせん。 1,2Eず曞かれおいたすが、1぀のモヌタヌがありたす。 混同しないでください。 実際には、1぀のモヌタヌを制埡するには、マむクロコントロヌラヌの2぀の脚が必芁であり、それに応じおH-ブリッゞが必芁です。 片方の足をHIGHに、もう䞀方の足をLOW-モヌタヌを䞀方向に回転させたす。 最初のLOW、2番目のHIGHに適甚したしょう-反察に回転したす。 䞡方のLOWに適甚したしょう-停止したす。
2 1A 。 この区間では、マむクロコントロヌラヌからの信号䜎電流を送信しお、1぀のモヌタヌ入力を制埡したす。
3 1Y そしお、これはモヌタヌに盎接送られる信号高電流です。 その倖芳では、入力1Aに䟛絊される信号を完党に繰り返したす。
4-5 地球
6 2Yここで、モヌタヌの2番目の脚を接続したす。
7 2Aモヌタヌの2番目の入力を制埡するためのマむクロコントロヌラヌからの信号。
8ここで、モヌタヌが䟛絊する電圧を印加したす。 実際、この入力に䞎えるものは、レッグ1Y 、 2Yでロック解陀されたす。
9-16最初の8぀ず完党に類䌌しおいたすが、2番目のモヌタヌに぀いおです。

次に、包含回路

画像

画像

モヌタヌがオンになっおいるずきの電力サヌゞを陀去するために、以䞋に瀺すように、コンデンサを䜿甚したす。

画像

最埌に、䞊蚘のすべおを芁玄した私の小さな゚ディションで、゜ヌスコヌドが提䟛されたす。

const int motor1Pin = 3; // Hブリッゞ脚1ピン2、1A
const int motor2Pin = 4; // Hブリッゞ脚2ピン7、2A
const int enablePin = 9; // Hブリッゞむネヌブルピン
ボむド蚭定
{//出力ずしお䜿甚しおいる他のすべおのピンを蚭定したす。
pinModemotor1Pin、OUTPUT;
pinModemotor2Pin、OUTPUT;
pinModeenablePin、OUTPUT; // enablePinを高く蚭定しお、モヌタヌをオンにできるようにしたす。
digitalWriteenablePin、HIGH;
}

ボむドルヌプ
{//モヌタヌを䞀方向に回す
digitalWritemotor1Pin、LOW; // Hブリッゞのレッグ1を䜎く蚭定したす
digitalWritemotor2Pin、HIGH; // Hブリッゞのレッグ2を高遅延1000に蚭定したす; //そしお、1秒埌に別のdigitalWritemotor1Pin、HIGH; // Hブリッゞのレッグ1を高く蚭定したす
digitalWritemotor2Pin、LOW; // Hブリッゞのレッグ2を䜎遅延1000に蚭定したす;
//そしお今、もう䞀床
}

サヌボ

それで、レンゞファむンダヌの仕事を芋぀けたした。 続けたしょう。 距離蚈が1぀ありたす。前方ず呚囲の䞡方を芋る必芁があるので、䜕かの堎合にどこを向くべきかを知るこずができたす。 これらの目的のために、サヌボサヌボ、サヌボ、サヌボを䜿甚したす。

画像

これらのおもちゃは䞻に航空機のモデリングに䜿甚されたすが、ロボットにもほずんど䜿甚されたせん。
このデバむスは、0〜180床の角床で回転できたす。 ケヌスには3線ケヌブルが付属しおいたす。

黒-GND
èµ€-5V
癜-信号

モヌタヌはコントロヌラヌによっお制埡されたす怖がらないでください-賌入する必芁はありたせん。既にサヌボの内郚にありたす。倖郚信号を受信するず、モヌタヌが所定の角床だけ回転するように制埡したす。 これらの目的のために、モヌタヌからコントロヌラヌぞのフィヌドバックが確立されたす。これは、回転角に応じお抵抗倀が倉化する可倉抵抗噚です。 コントロヌラヌ自䜓は、入力パルス長によっお制埡されたす。 通垞380-400ÎŒs-0床、2200ÎŒs-180床。 Arduinoの簡単なサヌボ制埡アルゎリズムを次に瀺したす。

#define ServoPin 2 //この脚にサヌボを接続したす癜いワむダヌ
ボむド蚭定
{
pinMode2、OUTPUT;
}

void Servo_motionint angle//サヌボ制埡機胜
{
int time = 390 + 10 *角床; //サヌボに䟛絊されるパルス長で指定された回転角床を再蚈算したす//
digitalWriteサヌボピン、高; //信号は消えたした
delayMicroseconds時間; //指定された時間保持したす
digitalWriteサヌボピン、LOW; //オフにしたす
delayMicroseconds20000時間; //回転するサヌボ時間を䞎えたす20000ÎŒs-50 Hz
}

ボむドルヌプ
{

forint i = 0; i <= 180; i ++
{
Servo_motioni; //スクロヌルサヌボワンりェむ
遅延10; //各次数で10ミリ秒の遅延
}

forint i = 180; i> = 0; i--
{
Servo_motioni; //その埌、他の方法
遅延10;
}

}

しかし、将来的には、特別なラむブラリを䜿甚しおサヌボを制埡したす。その説明は次のずおりです。

www.arduino.cc/en/Reference/Servo

arduino.cc/en/Tutorial/Sweep

この䟋2぀のリンクは、䞊蚘のプログラムずたったく同じこずを行いたす。 写真、写真、コメント付きのコヌドのカラフルな説明がありたすので、特別な困難はないず思いたす。 このコヌドを確認するずきは、デゞタルポヌト9のサヌボを再配眮するか、そのコヌドの次の行を修正するこずを忘れないでください。

myservo.attach9; //ピン9のサヌボをサヌボオブゞェクトに接続したす

そしお、䜕も動䜜したせん。 最埌に远加したいこず-この䟋は、䞊蚘のリンクずArduino開発環境の[䟋]タブの䞡方で利甚できたす。

組立

創造の組み立おに移りたしょう。 ボヌドを䜜成しなかったため、残念ながら回路図はありたせん。 しかし、これは私たちをあたり劚げないず思いたす-スキヌムはシンプルで、すべおが明確です。 写真ず小さなコメントで十分です。 この段階では、Arduino nanoが衚瀺されたす。これは、ご想像のずおり、以前のコヌドはすべお期埅しお䜜成されおいたためです。 このデバむスを説明するのはかなり面倒で退屈な䜜業です。知らない人にずっおは-リンク

arduino.cc/en/Guide/HomePage
freeduino.ru/arduino/index.html
arduino.ru

それにもかかわらず、私は、以前のように、あなたは少なくずもこのこずをただ少し経隓しおいる、たたは少なくずもそれが䜕であるかを想像しおいるず仮定したす。 この堎合、これで十分です。 それで、あたり倚くの知識を埗ないで、さらに食べたす。
接続から始めたしょう。 どの入力ず接続したものをリストしたす。

4本の脚-Hブリッゞの入力、各モヌタヌに2本
1A-11
2A-6
3A-10
4A-5

enablePin-12

1,2ENおよび3,4EN甚の1本の脚-䞡方のモヌタヌを個別に必芁ずしないため、それらをたずめたす。 原則ずしお、䞀般的に、ブリッゞのこれらの2本の足をArduinoに接続するこずはできたせんが、それらに5Vを印加するだけです。

゜ナヌ甚の2本の脚
トリガヌ-3
゚コヌ-2

サヌボフット
サヌボ-8

それだけです。 さらに、ロボットの組み立お䞭に1぀の問題が発生したした。ロボットが定期的に停止し、Arduinoが再起動したした。 少し考えおみるず、Arduino nanoは暙準の安定装眮からこのシステム党䜓Hブリッゞ、サヌボ、゜ナヌに電力を䟛絊できないこずに気付きたした。 電圧安定噚7805L7805、LM7805が私の助けになったからです。 このデバむスは䜿いやすく、入力6〜35 V、接地、出力〜5Vの3本の脚がありたす。 Datashitは、むンタヌネット䞊のどこにでもありたす。 その土地、Arduinoの土地、それに応じおバッテリヌのマむナスを組み合わせるこずによっお。 私はこれをしたした-Arduinoから私はHブリッゞに絊逌するだけで、スタビラむザヌから他のすべおサヌボ、゜ナヌに絊逌したす。 その埌、ロボットは故障するこずなく完党に動䜜し始めたした。 はい、重芁なルヌルを忘れないでください-どんなスキヌムの地球もすべおの芁玠に共通でなければなりたせん モヌタヌ自䜓に぀いおは、理解できるず思いたす-バッテリヌからブリッゞ入力に電圧を䟛絊したす-Vcc2。 たあ、接続を理解したので、写真で䞊蚘を説明したす

スキヌム党䜓
画像

電圧安定噚コンデンサを取り付ける必芁はありたせん
画像

゜ナヌケヌブル
画像

H-ブリッゞ
画像

デザむン自䜓に぀いお少しフリルはありたせんでした。 プラットフォヌムにプラスチック補の蓋を切り、サヌボを取り付けるための穎を開けたした。 同じプラスチックから曲がっおいたす産業甚ドラむダヌで予熱-圢のブラケット。 ゜ナヌ自䜓が既に挿入されおいる4芯ケヌブルがPLSプラグの䞋に2.54 mm刻みで接着されおいたす。

プログラミング

それで、ロボットは組み立おられたす。 最終段階であるファヌムりェアに進みたす。 ここでは、このアルゎリズムの実装に぀いお説明したす。 たずえば、゜ナヌを垞に回転させるのではなく、障害物があるずきに停止し、「呚囲を芋回しお」、最適な方向を向くなど、すべおを倧幅に簡略化できるこずに事前に泚意したす。 たたは、頭をたったく回さないでください。

さお、ここでは簡単な方法を探したせんが、最初のオプションが最も興味深くお面癜いです。 以䞋のコヌドはもちろん湿っおいたすが、䞀郚の堎所では最適ではないかもしれたせん。 あなたのコメントや提案はすべお歓迎したす。 それにも関わらず、このバヌゞョンは珟堎で実蚌されおいたす。 さあ、始めたしょう。 コヌドを理解するのに最も䟿利な順序でコヌドの芁点を抂説したす。

倉数宣蚀

゜ナヌアルゎリズムを実装するための倉数は、unsigned int time_us = 0です。
゜ナヌ距離-unsigned int distance_sm = 0;
この倉数はルヌプで䜿甚され、ロボットの電源を入れたずきに、その堎所を「芋回す」こずを確認し、次に移動したす-
笊号なし敎数円= 0;
前の最も近いオブゞェクトたでの距離はunsigned int dist_f = 0です。
巊偎の最も近いオブゞェクトたでの距離は、unsigned int dist_l = 0です。
右偎の最も近いオブゞェクトたでの距離は、unsigned int dist_r = 0です。
45床の角床で最も近いオブゞェクトたでの距離-unsigned int dist_45 = 0;
135床の角床で最も近いオブゞェクトたでの距離-unsigned int dist_135 = 0;

ロボットの動きの最小ステップを定矩する時定数ms。 実隓的に遞択。 ロボットの移動速床ずサヌボの回転速床に応じお、倉曎する必芁がありたす。 埌でそれが必芁な理由がより明確になりたす-
unsigned int t = 15;

機胜

sonar-゜ナヌアルゎリズムを実装し、距離[cm]を返したす。
前方、埌方、右偎、巊偎は基本的なモヌション機胜です。
動きを実装する䞻な機胜は

ボむドモヌションchar次元、int prev_angle、int next_angle、int time
{
/ *この機胜は、モヌタヌずサヌボの䞡方の回転を同時に制埡したす。
チャヌ次元-移動方向
int prev_angle-前のサヌボ䜍眮
int next_angle-サヌボを蚭定したい䜍眮
int time-ロボットの1぀の動きのタむムステップ* /

//移動䞭に角床が倉化する倀-
int a;
ifnext_angle> = prev_angle
a = 15;
他に
a = -15;
if次元== 'f'
{
//前に進むず蚀うず、
int i = prev_angle;
whilei= next_angle
{
/ *蚭定角床に達するたで、ルヌプ内の*によっおサヌボの珟圚䜍眮を埐々に倉曎したす
i + = a; myservo.writei; //そしお、この倀をサヌボに枡したす
転送; //その埌、前進したす
遅延時間; //時間間隔timeの間
}
}

/ *巊、右、埌方に移動しお静止するための同様のアルゎリズム* /

...

}

void front_motionint時間
{
/ *オブゞェクトが45床ず135床の角床にある堎合、ロボットを片偎にわずかに「回転」させる機胜* /
ifdist_45 <= 9
{// 45床の角床でオブゞェクトたでの距離が9 cm未満の堎合、巊に曲がる
巊;
遅延3 *時間; // 3぀の最小間隔䞭
}
/ *右に「曲がる」ための同様のアルゎリズム* /

...

}
void motion_backint time
{
/ *サヌボを180床、180床の角床から回転させながら、ロボットを2時間埌退させたす* /
モヌション 'b'、180.90.2 *時間;
}
ボむドルヌプ
{
//䜜業の最終アルゎリズムを実装するメむン関数
ifcircle == 0
{
//ロボットの電源を入れたばかりの堎合、サヌボを初期䜍眮に蚭定したす。
myservo.write0; //そしお、偎面を「芋お回る」
dist_r =゜ナヌ;
モヌション 'w'、0.45、t;
dist_45 =゜ナヌ;
モヌション 'w'、45.90、t;
dist_f =゜ナヌ;
モヌション 'w'、90、135、t;
dist_135 =゜ナヌ;
モヌション 'w'、135、180、t;
dist_l =゜ナヌ; } //このアクションはもう実行したせん
サヌクル++; 私は
fdist_f> = 25
{//前の最も近い物䜓が25センチメヌトルを超える堎合
a//サヌボを180床から135床回転させながら前進したす
モヌション 'f'、180、135、t; // 135床の角床でオブゞェクトたでの距離を枬定したす
dist_135 =゜ナヌ; //必芁に応じお、ひねりを加えたす
front_motiont; //さらに䌌おいたすが、倀が異なりたす
モヌション 'f'、135.90、t;
dist_f =゜ナヌ;
front_motiont;
モヌション 'f'、90.45、t;
dist_45 =゜ナヌ;
front_motiont;
モヌション 'f'、45.0、t;
dist_r =゜ナヌ;
front_motiont;
モヌション 'f'、0.45、t;
dist_45 =゜ナヌ;
front_motiont;
モヌション 'f'、45.90、t;
dist_f =゜ナヌ;
front_motiont;
モヌション 'f'、90、135、t;
dist_135 =゜ナヌ;
front_motiont;
モヌション 'f'、135、180、t;
dist_l =゜ナヌ; front_motiont; //前の距離がただ25センチメヌトルを超えおいる堎合は、ポむント「a」に戻りたす
ifdist_f> = 25
goto a;
}
他に
{//そうでない堎合
ifdist_f <5
{//ロボットが既に最も近いオブゞェクトに近すぎる堎合は、埌方に移動したす
motion_backt;
//新しい距離枬定を行いたす
dist_f =゜ナヌ;
} //この堎合、より倚くの空きスペヌスがある方向に曲がる
ifdist_l> = dist_r || dist_135> dist_r
{
モヌション 'l'、180.90、t;
dist_f =゜ナヌ;
}
ifdist_l <dist_r
{
モヌション 'r'、180.90、t;
dist_f =゜ナヌ;
}
} //次に、新しいサヌクル
}

このプログラムの完党版はここからダりンロヌドできたす。
maxim.wf/arduino_code/Robot_compilation.pde

それで、ここでこのトピックの終わりに来たす。 ロボットが完成し、すべおが機胜したすパスは十分に長く、面癜くお楜しいものでした。 これで、すっごく原始的でありながら、ただ人工知胜を備えたロボットを䜜成した経隓に基づいお、より耇雑なものを䜜成できたす。 ある皋床たで、あなたは特定の生物の創造者のように感じるこずさえできたす、最も単玔な生き物に䌌た心。 最終結果のビデオを次に瀺したす。






ご枅聎ありがずうございたした
ご質問、ご提案、コメントをお埅ちしおおりたす。

Source: https://habr.com/ru/post/J142156/


All Articles