你有不用的玩具嗎?讓我們加入一些聰明才智和愛好技能,使它令人興奮!靈感來自我的智能機器人汽車套件模型。
我們中的許多人家里都有一些玩具,我們不知道如何處理它。也許是因為我們不知道如何使用它,或者它的功能非常簡單(就像我的情況一樣),因此變得有點太無聊了。我想展開函數(shù)。所以我們可以把一些聰明才智,一些我們最喜歡的愛好放在一起。因為你可能沒有同樣的玩具車,這篇博客文章可以作為靈感。我也在給智能機器人汽車套件施加控制。下文將詳細介紹。
在這種情況下,所選擇的玩具是一輛玩具店的汽車,它只有后輪上的直流電機和兩個位置的前進或倒車開關(guān)。為了能夠駕駛,車頂上有一個輪子,手動驅(qū)動齒輪機構(gòu)。
我們將做的修改是安裝四個直流電機(每個車輪一個)。我們將做一個新的轉(zhuǎn)向機構(gòu),它將由一個驅(qū)動。我們將做的修改是安裝四個直流電機(每個車輪一個)。我們將制造一種新的轉(zhuǎn)向裝置,通過向前或向后駕駛汽車,或向右或向左轉(zhuǎn)向來驅(qū)動汽車。
我們還將為AZ-Delivery的智能機器人汽車2WD使用相同的功能。由于這輛車沒有轉(zhuǎn)向裝置,轉(zhuǎn)換起來非常簡單。我們只需要安裝側(cè)面的超聲波傳感器。
一旦我們選擇了我們想要改裝的汽車,我們準(zhǔn)備一杯咖啡或茶,并開始計劃。我們需要知道的第一件事是每種情況需要哪些組件。
首先我們將開發(fā)和解釋玩具車的改裝,然后我們將對智能機器人車做同樣的事情。
電路及所用元件說明
根據(jù)組件計劃,我們將使用“4通道L293D電機驅(qū)動器屏蔽”模塊來移動四個直流電機。它簡化了電機的編程,并消除了許多電纜。此外,我們只需要在草圖中的一個對象為每個電機,我們可以選擇電機速度和工作與前進,逆轉(zhuǎn)和停止命令。由于這是一個屏蔽模塊,我們只需要將其連接到ATmega328微控制器,它們形成一個單元。
我們將使用兩個SG90微伺服電機,其中一個將驅(qū)動車輛的轉(zhuǎn)向,另一個將執(zhí)行一個小的40度回轉(zhuǎn)與前超聲波傳感器。HC-SR04超聲波傳感器告訴我們與物體或障礙物的距離。我使用的4個直流電機是機器人汽車套件的常用電機。對于整個套件的電源,我使用了兩個帶1A的外部5V直流電池,但您可以使用任何提供最低5V直流電壓的電池組。
請密切關(guān)注不同模塊的最大功耗。
車輛轉(zhuǎn)向系統(tǒng)的改裝
我將簡要說明我是如何改變汽車的轉(zhuǎn)向系統(tǒng)的。
這輛車的手動系統(tǒng)在車頂上有一個輪子,用來移動齒輪。這些齒輪帶動到汽車前部的軸來移動方向盤。從圖中可以看出,這個系統(tǒng)非常麻煩,而且還是人工操作的。
新的轉(zhuǎn)向系統(tǒng)由兩個軸操作,對應(yīng)于圖片中的綠點。這樣,當(dāng)伺服電機被驅(qū)動時,整個裝配在這兩點上移動和轉(zhuǎn)動。在圖片的左側(cè),您還可以看到伺服電機,我們將連接到前面的超聲波傳感器。
車輛的操作說明和草圖
這三個超聲波傳感器是汽車的“眼睛”。微控制器向超聲波傳感器發(fā)送信號,使其連續(xù)發(fā)射脈沖。當(dāng)它們在物體上反彈時,傳感器接收信號并將其傳輸?shù)轿⒖刂破?。?jīng)過的時間除以2,因為信號必須來回傳遞。有了所用時間的信息和聲速的數(shù)據(jù),就可以計算出到物體的距離。每個傳感器的信息存儲在變量中,并在帶有if-else條件的多回路中永久地與距離限制進行比較。測量到物體的距離,物體可以在車的右邊、左邊和前面。如果距離更大,汽車繼續(xù)行駛,如果其中一個距離更小,它比較左右兩邊的距離。如果右側(cè)更大,并且與物體的距離大于極限,則向右轉(zhuǎn)。如果右側(cè)之間的距離小于左側(cè),則檢查到對象的左側(cè)距離是否大于極限值。如果是這樣,它將轉(zhuǎn)向左邊。如果這三個距離恰好小于我們設(shè)定的限制,汽車將停止并倒車2秒,然后再次開始距離檢查過程。根據(jù)不同的情況,微控制器執(zhí)行一些動作來激活電機屏蔽模塊的L293D芯片的h橋,使電機向一個方向或另一個方向轉(zhuǎn)動。
讓我們從草圖的發(fā)展開始。為了使用伺服電機、超聲波傳感器和電機控制板,我們需要在草圖開始時包括它們的庫。我選擇了這些sr04庫,因為我已經(jīng)使用它很長時間了,從來沒有遇到過任何問題。你必須下載并解壓縮它。在子文件夾中,您將找到ZIP文件HC-SR04.zip,您可以通過菜單Sketch-> integration library->Add.ZIP library安裝在Arduino IDE中。
添加庫之后,我們需要繼續(xù)執(zhí)行所有已安裝組件的實現(xiàn)和配置。我們將從超聲波傳感器的實現(xiàn)開始。我們需要告訴微控制器我們將每個傳感器的引腳連接到哪個引腳。一個發(fā)送信號(ECHO),一個在擊中目標(biāo)后接收信號(TRIG)。接下來,我們需要為每個傳感器創(chuàng)建一個帶有一些參數(shù)的名稱。這是通過實現(xiàn)SR04庫中的一個對象來實現(xiàn)的,該對象包含傳感器的名稱,以及作為參數(shù)的發(fā)送和接收信號的引腳的名稱?,F(xiàn)在我們需要存儲距離數(shù)據(jù),并為每個傳感器定義一個變量。
下面是兩臺伺服電機的實現(xiàn)。我們?yōu)槊總€伺服電機創(chuàng)建一個對象。我們連接伺服電機信號的引腳將在稍后的草圖的setup()-方法中定義。
“4通道L293D電機驅(qū)動器屏蔽”是我們需要配置和實現(xiàn)的最后一個組件,因此我們可以管理電機的控制。我們需要為電機控制的每個輸出通道創(chuàng)建一個庫對象。在我們的例子中是4個通道。作為參數(shù),我們必須指定端口號和工作信號的頻率。根據(jù)微控制器的數(shù)據(jù)表,端口3和4僅以1KHz的頻率工作,因此我們將所有端口配置為此頻率。此外,在這個更新速度下,功耗更低,所以我們可以節(jié)省電池。
移除屏蔽上相應(yīng)的跳線是非常重要的,因為我們將為電路板提供外部電壓,而不是來自微控制器。
現(xiàn)在我們需要setup()-method。在其中,我們定義了連接伺服電機線路的引腳。這里我們使用數(shù)字引腳的PWM輸出。幸運的是,由于我們使用的是屏蔽模塊及其庫,因此我們只需要指定0到255之間的一個數(shù)字,這分別是最小值和最大值。
setup()方法的前兩行非常簡單:我們初始化串行監(jiān)視器并在其上輸出一條消息。
現(xiàn)在我們在這里定義引腳,我們向兩個伺服電機發(fā)送信號。
現(xiàn)在我們配置電機的轉(zhuǎn)速以及微控制器初始化或復(fù)位時電機的初始狀態(tài)。轉(zhuǎn)速是用指令motor_name.setSpeed(120)設(shè)置為最大速度的一半,電機必須停止,后者是用指令motor_name.run(RELEASE)配置完成的。
在setup()-方法的末尾,我們調(diào)用兩個方法在汽車開始移動之前檢查伺服電機。我們將在后面解釋這些方法。
loop()方法非常短,因為操作已外包給方法。這使得代碼更加清晰。這個loop()方法的唯一一行是調(diào)用執(zhí)行前超聲波傳感器的伺服電機旋轉(zhuǎn)運動的方法。
該方法通過將伺服電機定位在三個角度(70,90和110度)來執(zhí)行平移。一旦定位到這些角度,就調(diào)用這三種方法來測量可能的物體或障礙物到右、左和前方的距離。在測量前方距離之后,調(diào)用object_distance_compare()方法來比較三個測量值,并針對車輛的方向執(zhí)行一個特定的操作。
我解釋了上面提到的方法。定位后的前三個測量汽車在行駛途中遇到的物體或障礙物的距離。超聲波傳感器測量到最近的物體或障礙物的距離,并將此距離存儲在我們在開始時定義的變量中。我們通過串行監(jiān)視器顯示距離數(shù)據(jù)。每個傳感器都有一個單獨的方法。
下面的方法將三個超聲波傳感器的測量值進行比較。如果三個值都匹配,則調(diào)用car_advances()方法。另一方面,如果三個測量值中有一個較低,則執(zhí)行第二行,檢查現(xiàn)有對象在右側(cè)是否比在左側(cè)更遠,以及它們是否也比30厘米更遠。如果是,則調(diào)用turn_right()方法。如果向左的距離大于向右的距離,并且物體距離也大于30厘米,則調(diào)用turn_left()方法。如果要檢查的三個距離小于我們配置的距離,則最后一行調(diào)用方法go_back()。
使我們的汽車以直線前進的方法將用于轉(zhuǎn)向的伺服電機定位為100度角,并使用指令motor_name.run(forward)激活它,以激活微控制器的引腳,使L293D電機屏蔽模塊為正確的電機提供正確的電壓,使車輪向前轉(zhuǎn)動。提醒一下,只要超聲波傳感器測量到物體的距離大于或等于我們設(shè)置的距離,這個方法就會運行。
如果超聲波傳感器對某一物體的測量結(jié)果小于指定的測量值,則將橫向傳感器的測量值進行比較。如果右側(cè)的距離大于左側(cè)的距離,并且這個距離也大于我們指定的距離,則條件命令塊調(diào)用turn_right()方法,該方法會使伺服電機將汽車的方向定位為184度。然后馬達執(zhí)行一組指令向前移動。這樣我們的車就可以右轉(zhuǎn)然后向前開。
相反,如果向左的距離確定為20度,則執(zhí)行方法turn_left(),以便車輛在該方向上轉(zhuǎn)彎而不停車。
要調(diào)用的最后一個方法是go_back(),如果前面三個條件都不滿足,則執(zhí)行該方法。當(dāng)車輛進入前方障礙物小于1米,側(cè)面障礙物小于20厘米的區(qū)域時,將執(zhí)行以下命令:將車輛定位成100度角,并命令停止發(fā)動機。motor_name.run(RELEASE),暫停500毫秒,然后使用命令motor_name.run(BACKWARD)停止2秒,這與方法delay(2000)的最后一行相同,對應(yīng)于時間設(shè)置。
最后兩個方法接收setup()方法的調(diào)用,因此它們只執(zhí)行一次以檢查伺服電機是否正常工作。第一個檢查前超聲波傳感器的伺服電機。定位度與servo_ultrasonic_scan()方法相同,但我們在位置之間編程了500毫秒的延遲。
草圖的下一個也是最后一個方法檢查驅(qū)動車輛轉(zhuǎn)向系統(tǒng)的伺服電機的運動。伺服電機放置在轉(zhuǎn)向的工作角度,檢查其是否正常工作。這個伺服電機在這輛車的中心位置是100度,車右轉(zhuǎn)彎的位置必須是184度,車左轉(zhuǎn)彎的位置必須是20度。兩個位置之間的暫停時間為1秒。
AZ-Delivery智能機器人汽車改裝
智能機器人汽車的改裝有點不同。我們不需要“4通道L293D電機驅(qū)動器屏蔽”模塊,因為它只有兩個電機。在這種情況下,我們使用“L298N電機驅(qū)動板”模塊,該模塊還包含一個h橋,提供驅(qū)動兩個直流電機所需的功率。因為我們沒有轉(zhuǎn)向系統(tǒng),改變方向是通過改變馬達的旋轉(zhuǎn)方向來實現(xiàn)的?!癡5擴展板屏蔽”模塊用于連接所有組件。
障礙物檢測的過程和需要采取的行動與前面解釋的類似。超聲波傳感器以類似的方式測量距離,即如果前方和側(cè)面障礙物比設(shè)定的距離更遠,汽車就向前行駛。當(dāng)其中一個傳感器檢測到障礙物的距離小于設(shè)定的距離時,將比較與旁邊物體的距離,并轉(zhuǎn)向與障礙物距離更大的方向。如果三個傳感器檢測到到障礙物的距離小于設(shè)定的距離,汽車就會向后移動。
這兩款車的區(qū)別在于馬達的工作方式和編程方式。在這種情況下,使用“L298N電機驅(qū)動板”模塊,我們沒有FORWARD, REVERSE和RELEASE命令。為了使電機轉(zhuǎn)動,我們必須首先使其啟動,并在電機上的兩個觸點之一上施加電壓。根據(jù)用哪個觸點供電,它會朝一個方向或另一個方向轉(zhuǎn)動。在“L298N電機驅(qū)動板”模塊中,EN A引腳激活一臺電機的IN1和IN2線,EN B引腳激活另一臺電機的IN3和IN4線,因此電機的編程如下:激活電機通過將EN引腳設(shè)置為HIGH并轉(zhuǎn)動相應(yīng)的電機,必須將電機的兩個In連接中的一個設(shè)置為HIGH,另一個設(shè)置為LOW。如果改變兩個連接的狀態(tài),電機將向相反方向旋轉(zhuǎn)。從這個意義上講,我們將使用AZ-Delivery Modify智能機器人汽車。
為了在兩側(cè)安裝傳感器和伺服器,需要進行一些修補。
草圖描述
和往常一樣,要做的第一件事是添加必要的庫。在這種情況下,我們只需要超聲波傳感器和伺服電機的傳感器。
在下面幾行中,我們聲明了6個常量來命名用于控制電機的微控制器的引腳。
接下來,要實現(xiàn)超聲波傳感器和前超聲波模塊的伺服電機。連接引腳和傳感器的名稱與之前車輛的改裝相同。伺服電機的名稱也相同。
在setup()方法中,唯一的區(qū)別是缺少轉(zhuǎn)向伺服電機和我們配置電機的方式。我們必須將“L298N電機驅(qū)動板”模塊所連接的微控制器的引腳配置為OUTPUT。我們將改變他們的狀態(tài)之間的高和低,使電機和提供電壓到他們的接觸取決于所需的旋轉(zhuǎn)方向。連接伺服電機信號和調(diào)用servo_ultrasonic_front_check()方法是相同的。
方法loop(), servo_ultrasonic_scan(), right_distance_object(), left_distance_object(), front_distance_object(), object_distance_compare()和servo_ultrasonic_front_check()與前一章完全相同,并且執(zhí)行與上面解釋的相同的功能。
方法car_advances()、turn_right()、turn_left()和go_back()負責(zé)給兩個電機端子供電,使智能機器人小車向前、向右或向左或向后移動。我將解釋的第一個方法是car_advances()。注釋的第一行通過串行監(jiān)視器顯示我們的汽車正在向前移動。在下一行中,我們將正確的電機使能引腳設(shè)置為HIGH。接下來的兩條線是兩個電機觸點。我們將一個引腳設(shè)置為HIGH-level(供電電壓),另一個引腳設(shè)置為LOW-level,電機將向前旋轉(zhuǎn)(如果電機向相反方向旋轉(zhuǎn),我們只需要改變“L298N電機驅(qū)動板”模塊中的電機連接)。該方法的最后3行與上面描述的完全相同,也適用于其他電機。
turn_right()方法導(dǎo)致汽車向右轉(zhuǎn)彎。我們可以觀察到,右電機的引腳狀態(tài)是相反的。這導(dǎo)致電機向相反方向旋轉(zhuǎn)。因此,如果左電機向前轉(zhuǎn),右電機向后轉(zhuǎn),我們的智能機器人汽車將圍繞其想象的中心軸迅速向右轉(zhuǎn)。
在以下兩種方法中,只有電機引腳的狀態(tài)被交換以使它們向一個方向或另一個方向轉(zhuǎn)動。通過這種方式,智能機器人汽車可以向左或向后移動。
如果我們不希望旋轉(zhuǎn)如此突然,當(dāng)我們調(diào)用激活電機時,我們必須使用digitalWrite(enable_name_motor, state),我們必須將參數(shù)狀態(tài)設(shè)置為LOW設(shè)置。這將允許我們禁用電機,無論電機觸點的狀態(tài)如何,它都不會向任何方向旋轉(zhuǎn),并且會在另一個電機繼續(xù)旋轉(zhuǎn)時停止,因此旋轉(zhuǎn)將在停止的輪子上。
正如你所看到的,智能機器人汽車非常多功能。我們可以給它改裝,裝上兩個超聲波傳感器,讓它有點自主。例如,它也可以被改裝成智能機器人汽車的追隨者。
本文編譯自hackster.io