0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Raspberry Pi完成直線平臺(tái)的設(shè)計(jì)全過(guò)程

工程師兵營(yíng) ? 來(lái)源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2018-07-31 09:18 ? 次閱讀

像 Raspberry Pi 這樣的單板計(jì)算機(jī) (SBC) 只需數(shù)小時(shí)就能輕松構(gòu)建復(fù)雜的機(jī)器,而不必使用一顆裸微控制器從頭開(kāi)始。 為了展示使用現(xiàn)代 SBC 有多簡(jiǎn)單,此“Easy Build”課程將引導(dǎo)您完成構(gòu)建直線平臺(tái)并進(jìn)行編碼所需的步驟。這里的直線平臺(tái)是一個(gè)能夠以直線方向執(zhí)行來(lái)回運(yùn)動(dòng)的,由系統(tǒng)工程師或研究人員用來(lái)完成重復(fù)性任務(wù)的平臺(tái)。

除了引導(dǎo)您完成這些步驟外,我們還將附上用于演示隨附視頻中直線平臺(tái)的代碼,以及幫助您啟動(dòng)的項(xiàng)目物料清單。

為什么選擇直線平臺(tái)?

我們啟動(dòng)此項(xiàng)目的初衷是,展示設(shè)定 Raspberry Pi 微型計(jì)算機(jī)來(lái)執(zhí)行稍復(fù)雜的任務(wù)是如此容易。 盡管我們不會(huì)滿足于幾個(gè)閃光燈,但我們也不想嘗試并計(jì)算軌道力學(xué)。 最終我們決定控制步進(jìn)電機(jī)致動(dòng)的直線平臺(tái)。 畢竟,驅(qū)動(dòng)步進(jìn)電機(jī)正好介于閃爍的 LED 與計(jì)算三個(gè)天體的多體問(wèn)題之間。

我們將項(xiàng)目分成三個(gè)部分:電子硬件、軟件和機(jī)械構(gòu)造。

電子硬件

顯示所有硬件元素的完整系統(tǒng)布局圖片(單擊查看全尺寸圖片)

圖 1:顯示從 Raspberry Pi Model B 到限位開(kāi)關(guān)的所有硬件元素的完整系統(tǒng)布局(左上角)。 (使用 Digi-Key Scheme-it 繪制的原理圖)

目前為止,這些內(nèi)容還非常簡(jiǎn)單、直接。 很顯然,除了 Raspberry Pi 2 (Rpi) 外,我們還需要步進(jìn)電機(jī)、步進(jìn)電機(jī)驅(qū)動(dòng)器以及上述兩個(gè)器件的電源。 之后,我們確定了需要的輸入。 最后,我們確定了以下項(xiàng)目:

- 左移按鈕

- 右移按鈕

- 高/低速開(kāi)關(guān)

- 左限位開(kāi)關(guān)

- 右限位開(kāi)關(guān)

我們將電路布置到 B&K Precision GS-830 試驗(yàn)板上。 顧名思義,它擁有 830 個(gè)連接點(diǎn)以及一個(gè)總線條。

圖 2:如圖所示,滑動(dòng)架擠靠在限位開(kāi)關(guān)上,其中藍(lán)色盒子就是限位開(kāi)關(guān),且在絲杠下方還有一個(gè)柱塞。 (來(lái)源:Digi-Key Electronics)

輸入從左,還是從右,完全隨意。 我們只需對(duì)兩個(gè)相反方向命名。 請(qǐng)注意,該限位開(kāi)關(guān)使用上拉電阻器接線為“正常高”。 我們這樣做是為了給這些輸入提供一些抗噪能力。 Raspberry Pi 具有驚人的靈敏度,我們發(fā)現(xiàn),緊湊型熒光燈等外部噪聲源和繼電器線圈等電感器有時(shí)可以在 Pi 上觸發(fā)輸入。

對(duì)于步進(jìn)電機(jī),我們選擇了 NMB Technologies Corporation 的 23KM-K2(圖 3)。 我們使用的步進(jìn)驅(qū)動(dòng)器是 Geckodrive 的 G210X。 Geckodrive 比市場(chǎng)上許多廉價(jià)的非品牌驅(qū)動(dòng)器要昂貴一些,但它們可以提供流暢、無(wú)故障的步進(jìn)控制。 同樣,我們手頭已經(jīng)有了一個(gè)這樣的步進(jìn)驅(qū)動(dòng)器。 大多數(shù)類似 G210x 這樣的廉價(jià)步進(jìn)電機(jī)驅(qū)動(dòng)器是通過(guò) DIRECTION 引腳和 STEP 引腳來(lái)控制的。 這很適合簡(jiǎn)單的項(xiàng)目:我們只需將這些引腳直接連接到 Rpi 上未使用的 GPIO 引腳即可。

圖 3:對(duì)于步進(jìn)電機(jī),我們選擇了 NMB Technologies Corp. 的 23KM-K2 標(biāo)準(zhǔn)混合電機(jī)。 (來(lái)源:NMB Technologies Corp.)

我們還將 Geckodrive 的 ENABLE 引腳接至 Rpi。 這樣做使得驅(qū)動(dòng)器僅在程序運(yùn)行時(shí)才“開(kāi)啟”并向電機(jī)線圈供電。 否則,即使驅(qū)動(dòng)器未收到執(zhí)行任何操作的任何指令,驅(qū)動(dòng)器仍會(huì)在我們向整個(gè)電路供電后立即將功率轉(zhuǎn)儲(chǔ)至電機(jī)。

將功率轉(zhuǎn)儲(chǔ)至電機(jī)線圈造成兩個(gè)結(jié)果。 首先,它會(huì)促使電機(jī)產(chǎn)生制動(dòng)效果。 電機(jī)會(huì)主動(dòng)抵制任何旋轉(zhuǎn)其軸的嘗試。 這在某些情況下是希望達(dá)到的效果;比如當(dāng)您將滑動(dòng)架移到某個(gè)點(diǎn)并且希望將其鎖定到位,使其不會(huì)被撞離位置。

第二個(gè)結(jié)果是我們希望避免的,即電機(jī)會(huì)在原地不斷升溫。 此電路在我們編輯和測(cè)試代碼的過(guò)程中一直保持通電狀態(tài)。 如果我們不停用驅(qū)動(dòng)器,它會(huì)不斷向我們的電機(jī)轉(zhuǎn)儲(chǔ)功率。 步進(jìn)電機(jī)通常都會(huì)變熱,但我們最好不要讓其在等待指令的過(guò)程中自行加熱。

圖 4:36 VDC XP Power SHP350 系列 36 V 開(kāi)關(guān)式電源用于替換 24 V 電源為系統(tǒng)供電,以增加電機(jī)轉(zhuǎn)速。 (來(lái)源:XP Power)

最初,我們?yōu)殡姍C(jī)連接 24 VDC 電源, 之后我們決定提高轉(zhuǎn)速,于是找到了 36 VDC 電源,即 XP Power 的 SHP350 單輸出、350 W AC-DC 電源。 這將在 24 V 電源的基礎(chǔ)上顯著提升電機(jī)轉(zhuǎn)速。

Gecko 驅(qū)動(dòng)器會(huì)限制通過(guò)電機(jī)線圈的最大電流。 您可以在端子 11 和 12 之間使用電阻器來(lái)設(shè)置電流限制,也可以使用驅(qū)動(dòng)器上的 DIP 開(kāi)關(guān)。 順便提一下,同一組 DIP 開(kāi)關(guān)還用于控制驅(qū)動(dòng)器的微步進(jìn)模式。 我們將在軟件部分對(duì)此做進(jìn)一步討論。

軟件

軟件程序顯示在本頁(yè)面的底部。 此時(shí)我們決定選擇使用兩個(gè)程序:一個(gè)程序用于手動(dòng)控制平臺(tái);另一個(gè)程序負(fù)責(zé)讓直線平臺(tái)滑動(dòng)架在限位開(kāi)關(guān)之間來(lái)回穿梭。 所有代碼均使用 IDLE 3.2.1 以 Python 語(yǔ)言編寫(xiě)。 我們之所以使用 Python,是因?yàn)樗?Rpi 的默認(rèn)語(yǔ)言。 IDLE 是隨 Raspbian 一起提供的 Python 精簡(jiǎn)版系統(tǒng)開(kāi)發(fā)環(huán)境。

為什么使用 Python? 不要讓新語(yǔ)言嚇住了您。 Python 與 C 非常相似,即使您不會(huì)編寫(xiě) Python 代碼,但只要熟悉 C,就幾乎肯定能夠閱讀和理解程序內(nèi)容。

我們的手動(dòng)控制程序要執(zhí)行的操作幾乎一目了然,代碼也未作任何說(shuō)明。 具體而言,電機(jī)加速的問(wèn)題。 步進(jìn)電機(jī)必須逐漸提高轉(zhuǎn)速。我知道,許多讀者會(huì)說(shuō),他們以前見(jiàn)過(guò)或控制過(guò)步進(jìn)電機(jī),電機(jī)轉(zhuǎn)速完全取決于向其輸入的脈沖頻率。 也許是這樣,但我敢打賭,這些情況下的電機(jī)負(fù)載肯定很小,甚至根本沒(méi)有任何負(fù)載。

而我們的直線平臺(tái)中的電機(jī)肯定帶有負(fù)載。 承載的步進(jìn)電機(jī)必須達(dá)到一定的轉(zhuǎn)速,否則電機(jī)將會(huì)失速。 將脈沖輸入到其驅(qū)動(dòng)器時(shí),步進(jìn)電機(jī)只會(huì)在原地?cái)嗬m(xù)運(yùn)轉(zhuǎn)。 這也是我們?cè)谲浖兄萌爰铀俪潭鹊脑颉?加速度需要足夠快,使觀察者不容易觀察到從靜止到最高轉(zhuǎn)速的過(guò)程,但不能太快以至于失速。

加速程序一開(kāi)始很慢地旋轉(zhuǎn)電機(jī)(步進(jìn)電機(jī)在低速下具有最高的扭矩),以向系統(tǒng)施加最大扭矩,從而克服慣性和“靜摩擦力”。 之后,此程序會(huì)快速縮短步進(jìn)脈沖之間的時(shí)間,直至達(dá)到最高轉(zhuǎn)速。 扭矩會(huì)隨著轉(zhuǎn)速的提高而減小,但到此時(shí),如果調(diào)節(jié)得當(dāng),系統(tǒng)中的機(jī)械阻力已被克服。

簡(jiǎn)單地介紹一下“靜摩擦力”一詞的含義。 此術(shù)語(yǔ)的真正解釋遠(yuǎn)遠(yuǎn)超出了此項(xiàng)目分析的目的。 但我們可以采用類比的方法加深了解。 想象一下握住機(jī)器的旋鈕或手輪,并嘗試旋轉(zhuǎn)。 通常,在旋轉(zhuǎn)時(shí)必須克服一個(gè)初始阻力。 一旦克服這個(gè)阻力,旋轉(zhuǎn)旋鈕或手輪就會(huì)變得容易多了,現(xiàn)在需要的扭矩也要小得多。 在本文中,該初始阻力便是靜摩擦力。 這種現(xiàn)象在利用滑臺(tái)執(zhí)行操作的機(jī)床(例如車床或銑床)中特別明顯。

我們的確注意到,Python 也有一個(gè)顯著的局限。 我們對(duì)為電機(jī)驅(qū)動(dòng)器提供輸出的步進(jìn)引腳進(jìn)行切換的速度存在限制。 到某一點(diǎn)后,我們?cè)?5 μs 步進(jìn)脈沖之間加入的延遲不論多小都無(wú)關(guān)緊要,因?yàn)?Python 代碼中的命令執(zhí)行之間存在固有的延遲。 我們沒(méi)有完全弄清這一問(wèn)題的緣由,也不知道如何解決此問(wèn)題。 最好的辦法是采取變通方案,這也是我們將電機(jī)驅(qū)動(dòng)器設(shè)為 Full_Step 模式的原因。

如果使用任何類型的微步進(jìn),我們需要將最大脈沖率(取決于 Python 的具體情況)除以我們將驅(qū)動(dòng)器切換到的微步數(shù)。

因此,對(duì)于半步進(jìn)電機(jī),需要將最高轉(zhuǎn)速除以二。 使用 1/10 微步進(jìn)時(shí),我們需要將最高轉(zhuǎn)速除以 10! 如果您追求更流暢、波動(dòng)較小的動(dòng)作,微步進(jìn)方式是不錯(cuò)的選擇,但對(duì)此項(xiàng)目而言則不必如此。

關(guān)于微步進(jìn)的說(shuō)明

我們?cè)诖隧?xiàng)目中所用的雙極步進(jìn)電機(jī)類型幾乎總是設(shè)計(jì)為每轉(zhuǎn) 200 步。 也就是說(shuō),200 個(gè)“全”步將會(huì)旋轉(zhuǎn)電機(jī)軸一周。 現(xiàn)在,比方說(shuō),我們將電機(jī)驅(qū)動(dòng)器設(shè)置成 ? 微步進(jìn)。 我們這樣做會(huì)將電機(jī)的每個(gè)滿步分成 4 個(gè)更小的步。 電機(jī)驅(qū)動(dòng)器收到的每個(gè) STEP 脈沖會(huì)將電機(jī)軸旋轉(zhuǎn) ? 滿步。 這意味著,我們現(xiàn)在必須發(fā)送 800 個(gè)脈沖到驅(qū)動(dòng)器才能將軸旋轉(zhuǎn)一整轉(zhuǎn)。

1/10 微步呢? 現(xiàn)在,您需要發(fā)送 2000 個(gè)脈沖才能完成一整轉(zhuǎn)。 咋一看,這看起來(lái)不錯(cuò)。 這樣做增加了電機(jī)的位置分辨率。 是的,但不完全如此:您可以采取多小的步幅存在物理限制。 而且,微步越多,您所獲得的可用扭矩越小。

手動(dòng)控制程序分解

首先,我們導(dǎo)入了時(shí)間和 GPIO 庫(kù)。 然后,我們?yōu)槊總€(gè)變量設(shè)置引腳以及這些引腳的輸入/輸出。

方向按鈕和速度開(kāi)關(guān)設(shè)置為使用內(nèi)部下拉電阻。 限位開(kāi)關(guān)設(shè)置為使用內(nèi)部上拉電阻。

轉(zhuǎn)速和加速變量在開(kāi)始時(shí)設(shè)置,并可全局更改,以調(diào)節(jié)運(yùn)行程序中的電機(jī)轉(zhuǎn)速和加速度。

程序僅運(yùn)行一個(gè)“while”循環(huán)作為主循環(huán),掃描“左”和“右”按鈕。

按其中一個(gè)按鈕后,rampUp() 子程序就會(huì)立即執(zhí)行電機(jī),沿所按按鈕的方向加速至最高轉(zhuǎn)速。

只要按下按鈕,程序就會(huì)留在 rampUp() 程序中。 松開(kāi)按鈕后,rampUp() 程序?qū)?huì)跳入 rampDown() 程序,將電機(jī)減速至停止。 rampDown() 會(huì)持續(xù)減速,直至用完減速步數(shù)。 然后程序會(huì)返回到主循環(huán),以檢查方向按鈕。 轉(zhuǎn)速開(kāi)關(guān)有兩個(gè)設(shè)置,高和低。 此開(kāi)關(guān)會(huì)將速度變量更改為對(duì)應(yīng)的速度變量。

在按下左或右方向按鈕以及發(fā)出步進(jìn)脈沖時(shí),步進(jìn)程序還會(huì)檢查確認(rèn)是否已啟用兩個(gè)限位開(kāi)關(guān)之一。 當(dāng)移動(dòng)平臺(tái)觸及限位開(kāi)關(guān)時(shí),電機(jī)就會(huì)停止,改變方向,并執(zhí)行與原始行進(jìn)方向相反的 50 步 (decelPulseCount) 移動(dòng)。 這會(huì)將滑動(dòng)架移至足夠遠(yuǎn)離限位開(kāi)關(guān)的位置,以免再次觸及限位開(kāi)關(guān)。

來(lái)回穿梭程序

從 Raspberry Pi 運(yùn)行該程序后,直線平臺(tái)會(huì)立即在一個(gè)方向上以固定的速度移動(dòng),直至觸及其中一個(gè)限位開(kāi)關(guān)。 平臺(tái)隨即改變方向,逐步提速,并繼續(xù)在另一個(gè)方向上移動(dòng),直至其觸及平臺(tái)行程另一側(cè)的限位開(kāi)關(guān),周而復(fù)始。 移動(dòng)速度可通過(guò)手動(dòng)控制程序中所用的相同開(kāi)關(guān),在預(yù)設(shè)的高速度或低速度之間切換。

機(jī)械構(gòu)造

圖 5:直線平臺(tái)的最終構(gòu)造使用現(xiàn)貨零件組裝而成,包括 1.5 英寸鋁型材以及一根 8 螺紋/英寸的絲杠(8 頭)。 (來(lái)源:Digi-Key Electronics)

直線平臺(tái)完全由現(xiàn)貨零件制成:用于框架的 1.5 英寸鋁型材、夾具、軸、電機(jī)底座,以及 0.5 英寸直徑的 8 螺紋/英寸的絲杠(8 頭)。 八頭表示螺紋具有 8 條平行螺紋,類似于橙汁容器蓋。 最終,絲杠每轉(zhuǎn)動(dòng)一整轉(zhuǎn),機(jī)械系統(tǒng)就會(huì)移動(dòng) 1 英寸。 我們這樣做是為了讓直線平臺(tái)操作視頻更生動(dòng)一些。 我們有 10 螺紋/英寸、單螺紋絲杠,但這會(huì)導(dǎo)致移動(dòng)速度非常慢。 步進(jìn)電機(jī)的局限在于其最大轉(zhuǎn)速實(shí)際上很慢。

滑動(dòng)架架在一對(duì) 20 mm 直線軸及配對(duì)的軸承上。 針對(duì)所用的 NEMA 23 雙極步進(jìn)電機(jī),我們選擇了一個(gè)通用的 NEMA 23 安裝支架。 問(wèn)問(wèn)圖片和視頻您可以看到,我們使用齒輪和正時(shí)皮帶將機(jī)械動(dòng)力從電機(jī)傳遞到軸末端,以便在出現(xiàn)振動(dòng)或機(jī)械靜摩擦?xí)r能夠調(diào)節(jié)齒輪比。 一些實(shí)驗(yàn)表明,電機(jī)和軸之間的比率為 1:1 效果很好。

對(duì)于位于絲杠從動(dòng)端的軸臺(tái),我們必須做一些設(shè)計(jì)工作和加工(圖 6)。 軸臺(tái)是支撐軸的一個(gè)機(jī)械元件,在本例中僅傳輸旋轉(zhuǎn)運(yùn)動(dòng)并阻止直線運(yùn)動(dòng)(至少在理論上如此)。 我們能否在沒(méi)有軸臺(tái)的情況下完成項(xiàng)目? 存在這種可能。 我們本可以將絲杠直接連接到步進(jìn)電機(jī)的輸出軸,但如果我們選擇這種做法,我們的系統(tǒng)將很不穩(wěn)定。 因此,我們?cè)谥本€平臺(tái)上設(shè)計(jì)并制造了一個(gè)直接連接到 20 mm 直線軸的軸臺(tái)。

圖 6:為延長(zhǎng)設(shè)計(jì)壽命,使用軸臺(tái)支撐軸并且僅傳輸旋轉(zhuǎn)運(yùn)動(dòng),同時(shí)阻止直線運(yùn)動(dòng)(至少在理論上如此)。 (來(lái)源:Digi-Key Electronics)

步進(jìn)電機(jī)內(nèi)的軸承通常僅設(shè)置為處理側(cè)向力,而非軸向力。 隨著時(shí)間的推移,在滑動(dòng)架來(lái)回穿梭的過(guò)程中,這些電機(jī)軸承將受到不應(yīng)有的應(yīng)力。 最終會(huì)損壞電機(jī)。 我們不清楚多久會(huì)發(fā)生這種情況。 但我們不希望電機(jī)在項(xiàng)目中途出現(xiàn)磨損,因此我們制造軸臺(tái)時(shí)使用一些推力軸承、一個(gè)滾針軸承和一根 1/4 英寸的軸。 滾針軸承(紅色)在軸臺(tái)右側(cè)中間位置固定 1/4 英寸軸,止推軸承(藍(lán)色)負(fù)責(zé)處理從絲杠傳輸?shù)娜魏屋S向力。

最后,我們對(duì)限位開(kāi)關(guān)進(jìn)行定位,讓滑動(dòng)架在撞上其機(jī)械行程極限之前便能觸發(fā)該開(kāi)關(guān)。 此時(shí),滑動(dòng)架的撞擊不會(huì)導(dǎo)致物理?yè)p毀,但肯定會(huì)開(kāi)始磨損正時(shí)皮帶和齒輪,因此我們會(huì)盡力避免這種情況。

以下就是運(yùn)行中的完整項(xiàng)目:

結(jié)論

Raspberry Pi Model B 等 SBC 可以讓工程師和研究人員更輕松地設(shè)計(jì)并實(shí)現(xiàn)可行且實(shí)用的系統(tǒng)。 此 Easy Build 分步指南通過(guò)一個(gè)實(shí)用的實(shí)例,詳細(xì)指導(dǎo)讀者完成直線平臺(tái)的設(shè)計(jì)全過(guò)程,同時(shí)針對(duì)過(guò)程中的組件選擇和設(shè)計(jì)決策,提供了深入淺出的分析。 除物料清單和相關(guān)代碼外,您在實(shí)現(xiàn)下一個(gè)創(chuàng)意時(shí)也可借鑒該實(shí)例。

物料清單:

  1. Seeed Raspberry Pi 2 Model B

  2. XP Power:36 V 電源

  3. NMB Technologies Corporation:步進(jìn)電機(jī)(零件即將缺貨。)

  4. B&K Precision:試驗(yàn)板

  5. 項(xiàng)目電線

    1. Bud Industries

    2. MikroElektronika

  6. Honeywell:限位開(kāi)關(guān)

    1. DTE6-2RQ9

    2. NGCMB10AX01R

  7. Judco Manufacturing:表面貼裝開(kāi)關(guān)

  8. C&K Components:JS 系列滑動(dòng)開(kāi)關(guān)

其它零件:

Gecko 210X 步進(jìn)電機(jī)控制器

? 英寸 8 頭絲杠

Bass 絲杠螺母

軸臺(tái)軸承

聯(lián)軸器

滑輪

電機(jī)驅(qū)動(dòng)正時(shí)皮帶

鋁型材

直線軸承

精密連桿

兩個(gè)定制底座、滑動(dòng)架和軸臺(tái)

代碼:

代碼、按鈕控制

發(fā)送順時(shí)針 (CW) 和逆時(shí)針 (CCW) 脈沖至步進(jìn)驅(qū)動(dòng)器;對(duì)限位開(kāi)關(guān)做出反應(yīng);按初始行程方向相反的方向轉(zhuǎn)動(dòng)電機(jī)以“退避”限位開(kāi)關(guān)。

"""

"""

導(dǎo)入模塊和/或模塊分段

"""

import RPi.GPIO as GPIO

import time

"""

設(shè)置 I/O 引腳掩碼

"""

step = 18 # step signal to driver

directionPin = 23 # direction signal to driver

enable = 24 # enable signal to driver

button1 = 13 # direction pin

button2 = 5

output1 = 19

output2 = 12

output3 = 21

speedHiLo = 6

limitLeft = 12

limitRight = 16

"""

設(shè)置通用 IO

"""

GPIO.setmode(GPIO.BCM) #configure pin layout

GPIO.setwarnings(False)

GPIO.setup(step, GPIO.OUT)

GPIO.output(step, GPIO.LOW)

GPIO.setup(directionPin, GPIO.OUT)

GPIO.output(directionPin, GPIO.LOW)

GPIO.setup(enable, GPIO.OUT)

GPIO.output(enable, GPIO.HIGH)

GPIO.setup(button1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

GPIO.setup(button2, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

GPIO.setup(speedHiLo, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

GPIO.setup(limitLeft, GPIO.IN, pull_up_down=GPIO.PUD_UP)

GPIO.setup(limitRight, GPIO.IN, pull_up_down=GPIO.PUD_UP)

"""

一般配置及聲明

"""

global lospeed, hispeed, startTime, endTime, limitFlag, timeVar, accelTime, decelTime,decelPulseCoun, flag1, highPulse, direction, limitPulseCount

flag1 = 0 # variable for loop control

timeVar = 0 # variable for loop control

direction = 0 # variable for storing direction pin value

endTime = 0 # variable for storing wait time between pulses whilst slowing to a stop

limitFlag = 0 # signals that limit has been reached and flow must return to main loop

highPulse = 0.0001 # time for pulses to go high to trigger driver

startTime = 0.001 # time between pulses at start of movement

hispeed = 0.0001 # time between pulses at full speed

lospeed = 0.001 # time between pulses

accelTime = 0.000003 # amount of time to decrement between acceleration pulses

decelTime = 0.00005 # amount of time to increment between deceleration pulses

decelPulseCount = 50 # number of pulses sent during deceleration, 1/4 rev for current setup

limitPulseCount = 200 # number of pulses sent to the driver when a limit is tripped, 1/2 rev for current setup

"""

功能定義

"""

def rampUp():

GPIO.output(enable, 1) # enable driver for movement

timeVar = startTime #initialize time variable with starting time between pulses

global flag1

global limitFlag

global direction

flag1 = 1 # set flag HI

if(GPIO.input(button1)):

direction = 1

GPIO.output(directionPin, direction)

# light an LED

if(GPIO.input(button2)):

direction = 0

GPIO.output(directionPin, direction)

# light an LED

while((GPIO.input(button1) or GPIO.input(button2) == 1)):

if(GPIO.input(limitLeft)== 0): # if a limit input goes LOW, call the limit function

limit()

if(GPIO.input(limitRight)== 0): #if a limit input goes LOW, call the limit function

limit()

if(limitFlag == 1):

limitFlag = 0

break

GPIO.output(step, 1)

time.sleep(highPulse)

GPIO.output(step, 0)

time.sleep(abs(timeVar))

if(timeVar > endTime):

timeVar = timeVar - accelTime #decrease time between pulses until they reach endTime

def rampDown():

global flag1

flag1 = 0

global timeVar

timeVar = endTime #initialize time variable with ending time bewteen pulses

x = decelPulseCount

while(x > 0):

x = x - 1

GPIO.output(step, 1)

time.sleep(highPulse)

GPIO.output(step, 0)

time.sleep(abs(timeVar))

if(timeVar < startTime):

timeVar = timeVar + decelTime

def limit(): # this routine is like the ramp down routine

print("Limit Hit")

time.sleep(0.015) #wait for a bit

if(GPIO.input(limitLeft) and GPIO.input(limitRight) == 1): # debounce

return

GPIO.output(enable, 1) # enable driver for movement

global direction

global timeVar

global limitFlag

global flag1

flag1 = 0 # disable the flag so u dont call rampDown upon exiting limit()

timeVar = endTime #initialize time variable with ending time bewteen pulses

direction = not direction

GPIO.output(directionPin, direction)

limitFlag = 1 # set this flag so that the rampUp routine 'breaks' and jumps back to Main()

x = limitPulseCount

while(x > 0):

x = x - 1

GPIO.output(step, 1)

time.sleep(highPulse)

GPIO.output(step, 0)

time.sleep(abs(timeVar))

if(timeVar < startTime):

timeVar = timeVar + decelTime

"""

主循環(huán)

"""

while(1): #loop forever, check for button presses, speed changes and limit trips

#disable driver to keep from overheatings

if(GPIO.input(button1) or GPIO.input(button2) == 1): # button pressed, call rampUp function

rampUp()

if(flag1 == 1):

rampDown()

# movement over, deactivate direction LEDs

if(GPIO.input(speedHiLo) == 0):

endTime = lospeed #if lo-speed selected, initialize endTIme with lo-speed wait time

else:

endTime = hispeed #if hi-speed selected, initialize endTIme with hi-speed wait time

# light up red LED to indicate hi-speed mode

if(GPIO.input(limitLeft)== 0): # if a limit input goes LOW, call the limit function

limit()

if(GPIO.input(limitRight)== 0): #if a limit input goes LOW, call the limit function

limit()

代碼,來(lái)回穿梭

import RPi.GPIO as GPIO

import time

"""

設(shè)置 I/O 引腳掩碼

"""

step = 18 # step signal to driver

directionPin = 23 # direction signal to driver

enable = 24 # enable signal to driver

button1 = 13 # direction pin

button2 = 5

output1 = 19

output2 = 12

output3 = 21

speedHiLo = 6

limitLeft = 12

limitRight = 16

"""

設(shè)置通用 IO

"""

GPIO.setmode(GPIO.BCM) #configure pin layout

GPIO.setwarnings(False)

GPIO.setup(step, GPIO.OUT)

GPIO.output(step, GPIO.LOW)

GPIO.setup(directionPin, GPIO.OUT)

GPIO.output(directionPin, GPIO.LOW)

GPIO.setup(enable, GPIO.OUT)

GPIO.output(enable, GPIO.HIGH)

GPIO.setup(button1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

GPIO.setup(button2, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

GPIO.setup(speedHiLo, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

GPIO.setup(limitLeft, GPIO.IN, pull_up_down=GPIO.PUD_UP)

GPIO.setup(limitRight, GPIO.IN, pull_up_down=GPIO.PUD_UP)

"""

一般配置及聲明

"""

global lospeed, hispeed, startTime, endTime, limitFlag, timeVar, accelTime, decelTime,decelPulseCoun, flag1, highPulse, direction, limitPulseCount

flag1 = 0 # variable for loop control

timeVar = 0 # variable for loop control

direction = 0 # variable for storing direction pin value

endTime = 0 # variable for storing wait time between pulses whilst slowing to a stop

limitFlag = 0 # signals that limit has been reached and flow must retuen to main loop

highPulse = 0.000005 # time for pulses to go high to trigger driver

startTime = 0.001 # time between pulses at start of movement

hispeed = 0.0005 # time bewtween pulses at full speed

lospeed = 0.0009 # time between pulses

accelTime = 0.000003 # amount of time to decrement between accleration pulses

decelTime = 0.00005 # amount of time to increment between deceleration pulses

decelPulseCount = 50 # number of pulses sent during deceleration, 1/4 rev for current setup

limitPulseCount = 5 # number of pulses sent to the driver when a limit is tripped, 1/2 rev for current setup

timeVar = startTime

def limit(): # this routine is like the ramp down routine

GPIO.output(enable, 0)

print("Limit Hit")

time.sleep(0.015) #wait for a bit

if(GPIO.input(limitLeft) and GPIO.input(limitRight) == 1): # debounce

return

GPIO.output(enable, 1) # enable driver for movement

global direction

global timeVar

global limitFlag

global flag1

flag1 = 0 # disable the flag so u dont call rampDown upon exiting limit()

timeVar = endTime #initialize time variable with ending time bewteen pulses

direction = not direction

GPIO.output(directionPin, direction)

limitFlag = 1 # set this flag so that the rampUp routine 'breaks' and jumps back to Main()

x = limitPulseCount

while(x > 0):

x = x - 1

GPIO.output(step, 1)

time.sleep(highPulse)

GPIO.output(step, 0)

time.sleep(abs(timeVar))

if(timeVar < startTime):

timeVar = timeVar + decelTime

"""

global direction

print("Limit Hit")

time.sleep(0.015)

if(GPIO.input(limitLeft) and GPIO.input(limitRight) == 1): # debounce

return

timeVar = startTime

flag1 = 0

direction = not direction

"""

"""

主循環(huán)

"""

while(1):

GPIO.output(enable, 1)

if(GPIO.input(limitLeft)== 0): # if a limit input goes LOW, call the limit function

GPIO.output(enable, 0)

limit()

if(GPIO.input(limitRight)== 0): #if a limit input goes LOW, call the limit function

GPIO.output(enable, 0)

limit()

if(limitFlag == 1):

limitFlag = 0

GPIO.output(directionPin, direction)

GPIO.output(step, 1)

time.sleep(highPulse)

GPIO.output(step, 0)

time.sleep(abs(timeVar))

if(timeVar > endTime):

timeVar = timeVar - accelTime

if(GPIO.input(speedHiLo) == 0):

endTime = lospeed #if lo-speed selected, initialize endTIme with lo-speed wait time

else:

endTime = hispeed

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Raspberry Pi
    +關(guān)注

    關(guān)注

    2

    文章

    616

    瀏覽量

    22812
  • 智能硬件
    +關(guān)注

    關(guān)注

    205

    文章

    2372

    瀏覽量

    108763
  • 步進(jìn)驅(qū)動(dòng)器

    關(guān)注

    7

    文章

    81

    瀏覽量

    58511
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何在Raspberry Pi OS上安裝SDK?

    Raspberry Pi OS 上安裝 SDK
    發(fā)表于 04-30 06:45

    OpenVINO?是否與TensorFlow集成支持Raspberry Pi?

    無(wú)法確定OpenVINO?是否與 TensorFlow* 集成支持 Raspberry Pi
    發(fā)表于 03-05 08:26

    貿(mào)澤電子開(kāi)售Raspberry Pi Hailo 8L AI套件

    近日,全球電子元器件和工業(yè)自動(dòng)化產(chǎn)品的領(lǐng)先授權(quán)代理商貿(mào)澤電子(Mouser Electronics)正式宣布開(kāi)售Raspberry Pi的Hailo 8L AI套件。這一創(chuàng)新產(chǎn)品的推出,標(biāo)志著貿(mào)澤
    的頭像 發(fā)表于 01-15 14:25 ?365次閱讀

    Raspberry Pi樹(shù)莓派新手指南

    電子發(fā)燒友網(wǎng)站提供《Raspberry Pi樹(shù)莓派新手指南.pdf》資料免費(fèi)下載
    發(fā)表于 12-23 17:05 ?2次下載

    新品來(lái)襲!Raspberry Pi Compute Module 5

    今天,我們很高興地宣布推出備受期待的Raspberry Pi計(jì)算模塊5,這是我們旗艦Raspberry Pi 5單板計(jì)算機(jī)的模塊化版本,售價(jià)僅為45美元。 意外之旅 我們?cè)?008年成
    的頭像 發(fā)表于 11-27 18:21 ?948次閱讀
    新品來(lái)襲!<b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b> Compute Module 5

    Raspberry Pi Pico 2 W 發(fā)布

    樹(shù)莓派官方今日宣布推出支持無(wú)線連接的新款 MCU(微控制器)主板 Raspberry Pi Pico 2 W,售價(jià) 7 美元, 較此前的有線版本高出 2 美元 。 ? ? Raspberry
    的頭像 發(fā)表于 11-25 18:25 ?881次閱讀
    <b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b> Pico 2 W 發(fā)布

    Raspberry Pi Pico 2

    、可選的RISC?V內(nèi)核、增強(qiáng)的安全特性,以及升級(jí)的接口功能。該器件由RP235x微控制器平臺(tái)提供支持,此平臺(tái)也由Raspberry Pi設(shè)計(jì)。Pico 2將RP2350與4MB板載Q
    的頭像 發(fā)表于 11-25 15:10 ?1045次閱讀
    <b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b> Pico 2

    Banana Pi M5 與 Raspberry Pi 4 – 基準(zhǔn)測(cè)試

    Banana Pi M5 基準(zhǔn)測(cè)試已成為我的網(wǎng)站上最受歡迎的作品之一,而且似乎人們真正想看到的是它與其 Raspberry 口味的表親之間的直接比較,所以這里就是 Banana Pi M5 與
    的頭像 發(fā)表于 10-28 10:28 ?794次閱讀
    Banana <b class='flag-5'>Pi</b> M5 與 <b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b> 4 – 基準(zhǔn)測(cè)試

    e絡(luò)盟開(kāi)售Raspberry Pi新款產(chǎn)品

    安富利旗下全球電子與工業(yè)系統(tǒng)設(shè)計(jì)、維護(hù)和維修產(chǎn)品及技術(shù)分銷商 e絡(luò)盟 現(xiàn)為客戶供應(yīng)小巧、快速、多功能的 Raspberry Pi Pico 2。
    的頭像 發(fā)表于 10-12 16:57 ?914次閱讀

    e絡(luò)盟開(kāi)售Raspberry Pi AI 攝像頭

    安富利旗下全球電子元器件產(chǎn)品與解決方案分銷商e絡(luò)盟開(kāi)售全新 Raspberry Pi AI攝像頭,這是 Raspberry Pi 的最新產(chǎn)品,擴(kuò)大了 e絡(luò)盟的人工智能設(shè)備范圍。
    的頭像 發(fā)表于 10-10 10:09 ?433次閱讀
    e絡(luò)盟開(kāi)售<b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b> AI 攝像頭

    e絡(luò)盟發(fā)售功能強(qiáng)大的入門(mén)級(jí) Raspberry Pi 5 2GB

    安富利旗下全球電子元器件產(chǎn)品與解決方案分銷商e絡(luò)盟日前開(kāi)售極具性價(jià)比的全新 Raspberry Pi 5 2GB。
    的頭像 發(fā)表于 09-02 10:39 ?511次閱讀
    e絡(luò)盟發(fā)售功能強(qiáng)大的入門(mén)級(jí) <b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b> 5 2GB

    天合光能獲“全過(guò)程功率測(cè)量控制評(píng)估認(rèn)證”證書(shū)

    ? 近期,天合光能成為首批獲得鑒衡認(rèn)證中心“光伏組件制造商全過(guò)程功率測(cè)量控制評(píng)估認(rèn)證”證書(shū)的光伏企業(yè)之一,其卓越的質(zhì)量控制流程和功率測(cè)試穩(wěn)定性再次獲得業(yè)內(nèi)權(quán)威認(rèn)可,充分展現(xiàn)了天合光能強(qiáng)大的制造能力
    的頭像 發(fā)表于 07-15 17:15 ?785次閱讀

    名單公布!樹(shù)莓派5(Raspberry Pi 5)開(kāi)發(fā)板免費(fèi)試用!??!

    突發(fā)狀況,無(wú)法繼續(xù)完成試用,以及收到套件的15天內(nèi),若沒(méi)有更新內(nèi)容,請(qǐng)主動(dòng)與企業(yè)或者平臺(tái)客服協(xié)商退還,方便其他網(wǎng)友繼續(xù)試用。 活動(dòng)過(guò)程中,套件所有權(quán)歸活動(dòng)發(fā)起者,試用者只擁有套件使用權(quán); 若在使用
    發(fā)表于 06-27 15:40

    精準(zhǔn)到毫米:H9激光切管機(jī)鋁材切割與打孔全過(guò)程解析

    H9激光切管機(jī)在鋁材切割與打孔的全過(guò)程包括設(shè)定參數(shù)、啟動(dòng)切割、監(jiān)控質(zhì)量、完成取件和檢查效果等。H9激光切管機(jī)鋁材切割與打孔的全過(guò)程可以詳細(xì)解析如下:一、操作準(zhǔn)備檢查H9激光切管機(jī)各部件是否齊全,并
    的頭像 發(fā)表于 06-20 11:14 ?1016次閱讀
    精準(zhǔn)到毫米:H9激光切管機(jī)鋁材切割與打孔<b class='flag-5'>全過(guò)程</b>解析

    如何將CYKIT-028 TFT模塊與Raspberry Pi和ESP32微控制器結(jié)合使用?

    我目前正在探索如何將 CYKIT-028 TFT 模塊與 Raspberry Pi 和 ESP32 微控制器結(jié)合使用。 不過(guò),在選擇集成開(kāi)發(fā)環(huán)境(IDE)和使用 PSOC Creator 的必要性
    發(fā)表于 05-21 07:36

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品