精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>電子資料>機械設計開源分享

機械設計開源分享

2023-01-03 | zip | 0.04 MB | 次下載 | 2積分

資料介紹

描述

簡介 :: 2017 年秋季

連大家都喜歡分享成功的作品和驚艷的原型機,這里我要換個思路:幾乎所有的業余級機械臂制造商都專注于工業型機械臂,我打算用機械和功能幾乎與人體相同,但盡可能以最便宜的方式。但由于材料和組件的能力,它變成了一個失敗的故事,然而失敗的故事也是一個吸取教訓的故事。

起初,我開始注意和研究我的手的動作及其尺寸,甚至在四處走動時,所以我冒了很大的風險,因為我附近的幾乎所有人都可能認為我有很強的心理素質疾病 :)

第一次設計在2-3個月內完成,然后使用紙板和牙簽制作原型。很高興看到機械方法是否令人滿意并能夠達到基本要求。

?
?
?
?
pYYBAGOuOCyAe3QwAAGJ_sWD3us982.jpg
?
1 / 6 ?第一個設計 - 將其與 v.2.0 和 2.1 進行比較 :)
?

然后我休息了很長時間以思考更好的意見。

最初的設計在機械方面有很多部分,應該對其進行優化。所以,我決定從頭開始,一開始就選擇了材料:Balsa Wood,但這個選擇會迫使我比我想象的更早結束項目。無論如何,我可以說它運作良好。

2018 年秋季 :: 從零開始

決定材料后,我重新開始了機械設計,盡可能使用單體零件。所有掌骨/近端/內側/遠端“骨骼”、梯形和手腕部分都經過設計、虛擬組裝并在計算機上相互交互。在那段時間里,我也注意到我現在的設計有些東西是撐不住的。為什么?

因為在初始階段,手掌是完全平坦的,與大多數其他可用的機器人手一樣。所以它會導致物體滑出,即使手指是閉合的。

?
poYBAGOuOC6AG84-AAB6dLy6umg795.jpg
版本 2.0
?

然而,人的手掌卻并非如此。如果你把手指伸直,從側面看,你可能會認為它是平的。但是當你直接面向指尖看時(你也可以觸摸你的手的頂部),很明顯你的手掌有一個由掌骨形成的凹陷結構,由一個凹陷的梯形引導。順便說一句,當您合上手指時,它們會從四面八方和您的手掌覆蓋一個球形體積。

所以我將其反映到我的設計中:梯形被重塑為凹面,因此由于掌骨與梯形對齊,手掌變得凹陷。只需要通過調整角度進行幾次試驗,是的,它在理論上是有效的:)

?
pYYBAGOuODKAeGMbAAE0rtkGCks118.jpg
版本 2.1
?

那時,我也想超越單純的機械,開始思考驅動。但是怎么辦?我不得不使用伺服電機,但即使我使用最小的類型,我也沒有地方在包括手腕在內的手部找到它們。我注意到,我只需要 12 個伺服器用于手部和手腕部分來模仿它們的所有動作。同時,我也決定了如何模仿“筋”和“筋”:經過嘗試幾種不同的材料,我發現魚繩是最好的“筋”,因為它的強度和柔韌性,而將橡膠包裝成“筋” (我們還將討論它們)。在這些試驗中,我還使用 6 毫米 PVC 管實現了“肌肉導向”。

?
?
?
?
poYBAGOuOEKAbZ1oABsyu-Rxpbo930.jpg
?
1 / 2 ? v.2.1 的第一個組件
?

很明顯,還應該設計手臂部分。但是由于前臂具有扭轉和杠桿運動,所以只剩下一個可能的地方用于伺服系統:上臂。

也可以驅動上臂,但在上臂-肩部連接上建立萬向接頭將極其復雜和困難。無論如何,上臂可能只是杠桿,整個結構可能會被肩部轉動,所以我決定將機械結構限制在肩部。

第一個問題:扭腕

拼好Hand和Wrist部分后,開始研究Front Arm,立馬問題來了:我的手怎么扭?

或許直到現在你也從未想過這一點。從機械上講,扭轉動作需要樞軸連接。但是它是如何組裝到人體上的呢?我尋求的答案在 Stan Prokopenko 的網頁上:https ://www.proko.com/types-of-joints/

(非常感謝他的指導。與此同時,我還了解到扭轉運動在醫學上被稱為“旋前”和“旋后”。)

所以很明顯尺骨和橈骨之間存在樞軸連接。但為什么那個支點位于后端,肘部?這不是很難做的事嗎?我該如何模仿這種機制?

從 Prokopenko 的動畫中可以看出,尺骨和橈骨圍繞樞軸纏繞在一起。當專門的肌肉伸展時,橈骨會旋轉到尺骨上,因此手腕會扭曲。

所以我一開始也是這樣做的:我準備了一個原型,將樞軸放在肘端,將尺骨和半徑都固定在手腕上,最后用包裝橡膠將它們包裹在肘端。但是,這種配置可以即使手動也不能平穩移動。在仔細研究了機制之后,我采取了完全不同的方式,完全重塑尺骨和橈骨:尺骨設計為僅用于杠桿,并且與手腕完全分離。Ulna-Radius 樞軸重新定位到前臂的中間部分。最后,Wrist 僅固定在 Radius 上。所以,尺骨和橈骨的形狀也終于變得與真骨相似。

?
pYYBAGOuOE2AOMg2ABnCH-_FRvk402.jpg
尺骨和橈骨的初步研究(樞軸在肘端,與您的相同)
?

(在您的前臂上,該樞軸位于肘端,因為這是保護樞軸免受任何損壞的最佳位置。如果前臂骨骼因任何沖擊而骨折,完全愈合后您可以繼續正常使用它。但是,如果樞軸放在中間,受到機械沖擊就會損壞,所以很可能你的手即使痊愈也再也無法扭動了。)

解決這個問題后,現在我必須決定“肌肉”的路由。路線不應受到尺骨和橈骨運動的影響,因此很明顯,所有肌肉繩索都應通過尺骨-橈骨樞軸到達上臂的執行器。所以我犧牲了一支筆來使用它的身體作為一個空心關節。

最后,整個 Humanoid Arm + Hand Mechanicals 幾乎可以執行真人的所有動作:打開和關閉手指以及舉起東西、在手腕處左右轉動和上下轉動、扭轉前部的能力手臂將近 270 度并杠桿化,杠桿化上臂,并在肩部將整個手臂結構旋轉近 180 度。

?

?

?

請注意,如果我計算正確,真人手臂從肩部到手部有 27 個運動軸:

  • 上臂的轉動、杠桿和盤旋 = 3 軸
  • 杠桿和扭轉前臂 = 2 軸
  • 水平(右-左)和垂直(上下)旋轉手腕 = 2 個軸
  • 盤旋和杠桿拇指掌骨 = 2 個軸
  • 杠桿拇指近端和遠端 = 2 軸
  • 杠桿食指、中指、無名指和小指的近端、內側和遠端 = 3 x 4 = 12 個軸
  • 在水平面上閉合和打開食指、中指、無名指和小指,同時保持所有直線 = 1 x 4 = 4 個軸 - 嘗試顯示 Vulkan Salute :)

因此,完成的機械原型能夠在 22 個軸上完成所有這些操作,除了繞上臂旋轉和為 Vulkan Salute 移動手指。

?
?
?
?
poYBAGOuOF6AVv6CABRHRBEisnU021.jpg
?
1 / 2 ?比例 - 1:1
?

通過完成前臂力學,第 13 個伺服器的必要性出現了“旋前”和“旋后”,第 14 個伺服器用于杠桿整個前臂。

與前臂機械相比,上臂和肩部設計更容易。但由于輕木的弱點,上臂的肩端應該從內部得到很好的支撐,40 毫米直徑的 PVC 管完美地做到了。并打入一部分25mm的PVC管,這樣上臂的杠桿軸就完成了。

?
?
?
?
poYBAGOuOGeAH7fZABZwtfU099s857.jpg
?
1 / 4 ?切除上臂的一部分
?

(在這里我寫得很快,但事實并非如此。在意識到某些事情之前,所有部分都被建模、匹配并與其他部分交互,并在計算機上檢查其適用性。實施在工程之后進行。)

不過,自從有了驅動的想法之后,我的腦子里還有一個疑問……

“好吧,到現在為止我們都做得很好,但是……我們要怎么支撐那東西呢,寶貝?”

支持問題不僅針對機械結構。還需要將控制器固定在某處,但由于跳線的長度有限,因此靠近機械結構。幾天來,我一直在想象一個由木頭、管子和其他材料專門制成的支撐結構……但我不喜歡這些想法。

一天晚上,我發現一個很久以前就掛在我桌邊的完美解決方案:我的相機三腳架。只需將其螺絲換成螺栓來固定肩部的轉動軸,它就可以完美地工作,并且可以正常工作。

所以我最終只為 Shoulder 設計了一個軸和底板,并且只使用了我多余的家具部件、塑料廢水管蓋和輕木。然后所有東西都放在三腳架上。

現在我可以開始安裝肌肉、執行器等等,但在此之前發生了另一件事……

“肯定還有一個操控者……”

就在決定啟動整個手臂后,我計算了我必須使用的信號并不可避免地面對壞消息:我只有一個 Arduino Due,即使與其他模型相比它有很多輸入/輸出,但它仍然是不夠。起初我必須定義進一步的必要性,然后我發現 Arduino Leonardo 是輔助控制器的最佳解決方案。在準備輸入/輸出列表并對其進行一些研究后,手部和手腕部分留在 Due 的范圍內;而前臂、上臂和肩部的控制則由萊昂納多負責。

然后,又提出了一個問題……

“哪個控制器應該是主人,他們應該如何相互‘對話’?”

因為容量大,速度快,所以最好讓Due做master。然而,“說話”出現了問題:Due 運行在 3.3V,而 Leonardo 處于 5V 電平。由于它們的 I2C 通信也使用與控制器相同的電壓電平,直接連接會燒毀 Due。

我必須使該接口盡可能簡單,最好的方法是使用模擬(電壓)信號。只是萊昂納多應該“理解”;

  • 應啟動哪個部分,以及,
  • 它應該移動到哪個位置。

所以我決定在 Due 上使用 DAC0 和 DAC1 模擬(電壓)輸出,并在 Leonardo 上相應地使用 A0 和 A1 來定義它們。

然而,電壓輸出的穩定需要一點時間。所以 Leonardo 可能會誤解 Due 的請求,所以它也應該知道命令是否已準備好讀取。第三個通訊信號出現:“執行”。好消息是,它可以直接從 Due 的 Ch.50(數字輸出)連接到 Leonardo 的 Ch.8(數字輸入)。

最后,Due 是如何理解它的命令被執行的呢?第四個信號應該從 Leonardo 發送到 Due:“命令已執行”反饋,但由于上述電壓水平存在問題。如果確認信號直接從 Leonardo 的 Ch.12(數字輸出)連接到 Due 的 Ch.51(數字輸入),那么我應該為可憐的 Due 組織一場葬禮 :)

無論如何,這個問題是整個項目中最簡單的:Leonardo 的 5V 輸出可能僅被兩個千歐級電阻分壓,然后它可能會以 ~3.3V 的形式發送到 Due。在實施階段,只有 270k 和 470k 效果很好。

肌肉和肌腱

你驅動肌肉采取一些動作,但是當相關肌肉被釋放時,身體部分必須回到原來的位置。所以你的身體上有肌腱,與肌肉相反。但是肌腱由于其使用目的而不如相應的肌肉強壯。

我已經在上面寫下了我決定用作肌肉和肌腱的材料。然而,在試驗過程中,我注意到釣魚繩很容易卡在機械接頭之間。所以最好使用某種“指南”,而 6mm 直徑的 PVC 管件正好適合這個目的。

尺骨和上臂沒有使用任何肌腱,因為重力會很好地發揮作用。

?
?
?
?
pYYBAGOuOHCAbI44ABfy298w78A684.jpg
?
1 / 2 ?穿過腕管和中空樞軸的“肌肉”
?

限位開關和位置傳感器

當我決定啟動手臂時,限位開關的必要性直接出現了。沒有它們,伺服系統很容易損壞機械部件。但不幸的是,舵機并沒有我想象的那么強大。

一開始我認為限位開關是最簡單的部件之一,但事實并非如此,尤其是在手指上。實際上,這個問題的出現有兩個主要原因:首先是輕木,由于它的弱點。第二個是我的設計規模。正如您在上面的一些照片中看到的,我的意圖是以 1:1 的比例制作人形手和手臂。

不管怎樣,我只用電線和鋁帶做了接觸點。即使它們對于保護機械裝置必不可少,但由于輕木零件的磨損,它們會及時失去功能,尤其是在手指上。

位置傳感器是通過僅在幾個點上使用電位器來實現的,它們幾乎可以正常工作。

?
poYBAGOuOHuAPalWABfKsHMWnTw020.jpg
手指上的“高”限位開關(連同用于引導“肌肉”的管子)
?

?

?
pYYBAGOuOIWASIvNABkUwrHBbzE578.jpg
典型位置傳感器
?

伺服執行器及其局限性

由于空間有限,我只有一個選擇來驅動(也許我應該說醫學術語中的“伸展”或“屈曲/伸展”)專用于前臂、手腕和手部的“肌肉”,包括手指: -轉動微型伺服電機。所有這些都應該位于 Upper Arm 上,因此 Upper Arm 的設計也通過考慮繩索布線來完成。

起初,我用輕木制作了直徑約 10 毫米的滑輪。然而,微型舵機的輸出扭矩非常低。然后我修改了他們的輪角:通過研磨減小直徑,在喇叭和舵機之間使用墊圈,并在靠近中心的位置鉆孔以連接繩索。這樣,舵機可以拉更高的負載。

?
?
?
?
poYBAGOuOIiAHZKlAABm46BXehw914.jpg
?
1 / 3
?

在后期階段,還需要另一個滑輪組來杠桿前臂和上臂,這樣就完成了。即使是微伺服也可以處理前臂的杠桿,上臂需要標準伺服,因為它應該處理上臂、前臂、手以及它們上面的所有接線的重量。

另一個標準伺服也用于轉動肩部。

?
?
?
?
poYBAGOuOI-ADmrwAAlv1ZY3o2I059.jpg
?
1 / 2 ?前臂滑輪(此處還顯示了 Radius 的位置傳感器組件,就在電線前面)
?

“所有那些導線都必須組織起來……哪怕是一點……”

最好的方法是制作某種“終端組件”。經過幾天的研究,我發現只需2塊8x2厘米的預制PCB就可以制作3個端子組件。

  • TB01 設計用于處理專用于手、手腕和橈骨(扭轉前臂)的所有信號,以及專用于手腕和橈骨(扭轉前臂)的伺服系統
  • TB02 設計用于處理專用于肩部、上臂和尺骨(杠桿前臂)的所有信號和電機
  • TB03 設計用于處理 Fingers 的舵機

當然,所有端子組件都應在首次“制造”之后和焊接電線期間進行測試。

?
?
?
?
pYYBAGOuOJmAcsguABQeWTcWeQY727.jpg
?
1 / 3 ?端子組件
?

舵機的早期測試

在幾乎安裝完所有東西之后,我只帶了 Arduino Leonardo 并開始通過一個簡單的例程單獨測試每個伺服器,以檢查它是否能夠按要求運行。該例程非常基礎,僅用于以數字輸入選擇的最低速度和方向運行一個伺服。那個時候可以一個一個操作。但是當所有舵機一起通電時,意想不到的驚喜就來了。稍后我們將討論那個麻煩。

?
pYYBAGOuOJ6AcCW4AAh4vLOVTCA459.jpg
早期測試
?

第一個問題繼續 :: 扭腕

即使我修改了伺服臂以用作極小直徑的滑輪,但它還不足以“旋前”和“旋后”Radius。所以我做了一個微型滑輪組。

?
pYYBAGOuOKmAYtMrABP_bE55XFI206.jpg
?

?

?

第一個效果很好,但它太大了。所以它在下一步被最小化。

?
poYBAGOuOLGAHQBWABN9aNelMH4544.jpg
?

?

?

不幸的是,各個伺服上的扭矩仍然太大。我嘗試調整,但是當前臂處于水平位置并且伺服將橈骨完全帶到尺骨上然后試圖釋放時,由于微型滑輪上的摩擦和反作用力,相應的“肌腱”橡膠未能恢復原狀。我拉緊了肌腱,但是舵機無法再拉動了……經過幾次嘗試,舵機變得不穩定,很快它的電機控制器就燒毀了。那是Project的第一個受害者。請為無名英雄致敬和祈禱 - 不,對不起它的標簽是“11FR”- :)

(當然,每個點/組件都有自己獨特的標簽。否則不可能進行所有的構造、布線和編程。耐心點,我們還將討論工程的重要性。)

所以我決定停止扭轉前臂的試驗。它需要很大的扭矩,但與此同時,進一步的試驗可能會導致整個前臂損壞。

其他試驗 :: 手指

沒什么特別要說的。一開始,一切看起來都還不錯……直到伺服系統壞了,輕木部件磨損了。

?

?

?

?

?

First Codes :: Due<->萊昂納多互通

原理上面我已經講過了,在編程階段就是第一節。在模擬通道上,Due/DAC0 和 Leonardo/A0 分配給設置值寄存器以發送和接收百分比設置值。Due/DAC1 和 Leonardo/A1 分配給 Section Selector。

但它只是需要做一些范圍:由于可以使用全范圍,但由于 DACx 輸出會在 0.75-2.55V 范圍內產生相應的電壓,因此應該在 Leonardo 上調整匹配比例。因此,Leonardo 被配置為讀取 Set Value between (整數)168-846對應0-100%。對于部分選擇器,整個范圍在 Due-side 上分為 5 個部分,并為 Leonardo 計算相應的值。但在那個實現中,也有必要使用死區。因此,即使是在 Due 上使用的確切值,它們在 Leonardo 上也被解釋為(值 +/- 死區)以確保選擇部分。

最后,相互通信程序在兩個控制器上完成如下并且運行良好。

到期日:

   const int   _FA_Radius  =  840;    // Front Arm Radius Section
   const int   _FA_Ulna    = 1530;    // Front Arm Ulna Section
   const int   _UpperArm   = 2220;    // Upper Arm Section
   const int   _Shoulder   = 2910;    // Front Arm Radius Section
void CommandToLeonardo(String Section, int SetValue) {
   /* SetValue is given as Percentage */
   int Section_Num=0;
   if (Section=="_11FR") Section_Num = _FA_Radius;
      else if (Section=="_11FU") Section_Num = _FA_Ulna;
           else if (Section=="_21UA") Section_Num = _UpperArm;
               else if (Section=="_31SH") Section_Num = _Shoulder;
   if (Section_Num==0)
      Serial.println("Section cannot be recognized.");
   if ((SetValue<0) || (SetValue>100))
      Serial.println("Set Value should be between 0-100).");
   if ((Section_Num!=0) && (SetValue>=0) && (SetValue<=100) )
      {
       Serial.print(String(SetValue) + "% -> ");
       switch(Section_Num){
             case _FA_Radius: Serial.println("Front Arm-Radius"); 
                              break;
             case _FA_Ulna  : Serial.println("Front Arm-Ulna"); 
                              break;
             case _UpperArm : Serial.println("Upper Arm"); break;
             case _Shoulder : Serial.println("Shoulder"); break;
          }
       analogWrite (_00XXCM, Section_Num);
       analogWrite (_00XXSP, map(SetValue, 0, 100, 0, 4095));
       delay(50);        // Delay for stabilization of outputs
       digitalWrite(_00XXXC, HIGH);  // Execute Command
       do { // Wait until getting OK from Leonardo
          } while(!digitalRead(_00XXOK)); 
              
       Serial.println("ARD LNRD = OK.");
       analogWrite (_00XXCM, 0); 
       analogWrite (_00XXSP, 0);  
                    // Resetting Section and Set Value outputs
       delay(50);   // Delay for stabilization of outputs
       digitalWrite(_00XXXC, LOW);   // Resetting Command
      } /* End of "if (Section_Num!=0)" */
} /* End of "void CommandToLeonardo()" */
void loop() {
    if (Serial.available())
       {
        String Command=ReadUserInputOverSerial();
        Serial.println(Command); 
        if (Command.substring(0,1)=="?") /* Help */
           {
            Serial.println("Commands:");
            Serial.println("  CTL [Section] [SetValue (0-100)]");
            Serial.println("      CommandToLeonardo - Section: First 5 characters of PWM Tag (e.g. _10WH for _10WHCM).");
            Serial.end(); Serial.begin(_BAUDRATE);
            while(!Serial) { };
           }
        if (Command.substring(0,3)=="CTL")
           CommandToLeonardo(Command.substring(4,9),
                             Command.substring(10).toInt());
        CommandPromptOverSerial("[ARD DUE/] > ");
       } /* End of "if (Serial.available())..." */
} /* End of "void loop()": ARDUINO DUE */

關于萊昂納多:

   const int   _FA_Radius  = 310;    // Front Arm Radius Section
   const int   _FA_Ulna    = 425;    // Front Arm Ulna Section
   const int   _UpperArm   = 540;    // Upper Arm Section
   const int   _Shoulder   = 655;    // Front Arm Radius Section
   const int   _ICDB       =  40;    // Deadband
   /* Since the signals cannot generate exact integer values, 
    * Section shall be identified by [ (SectionValue) +/- _ICDB ]
    * reading.
   */
void setup() {
  /* Initial Feedback to Due */
  digitalWrite(_00XXOK, LOW); 
}
void CommandFromDue() {  
   CommandFromDue_Section = analogRead(_00XXCM);
   if ( ((_FA_Radius-_ICDB)<=CommandFromDue_Section) && 
        (CommandFromDue_Section<=(_FA_Radius+_ICDB)) )
      CommandFromDue_Section=_FA_Radius;
      else if ( ((_FA_Ulna-_ICDB)<=CommandFromDue_Section) && 
                (CommandFromDue_Section<=(_FA_Ulna+_ICDB)) )
              CommandFromDue_Section=_FA_Ulna;
      else if ( ((_UpperArm-_ICDB)<=CommandFromDue_Section) &&
              (CommandFromDue_Section<=(_UpperArm+_ICDB)) )
              CommandFromDue_Section=_UpperArm;
      else if ( ((_Shoulder-_ICDB)<=CommandFromDue_Section) &&
                (CommandFromDue_Section<=(_Shoulder+_ICDB)) )
               CommandFromDue_Section=_Shoulder;
      else
               CommandFromDue_Section=0;
   CommandFromDue_SetValue = 
               map(analogRead(_00XXSP),168,846,0,100);
   /* Due generates DAC outputs between 0.55-2.75 V and it 
    * corresponds (int) 168-846 on Arduino Leonardo.
    * Here analog reading is converted to Percentage.
    */
   boolean CommandFromDue_Execute = digitalRead(_00XXXC);
   String  Section = "";
   int     Speed   = 0;
   if ((CommandFromDue_Section!=0) && CommandFromDue_Execute)
      {
       Serial.println();
       Serial.print("Command by ARD DUE: "+
                     String(CommandFromDue_SetValue) + "% -> ");
       switch(CommandFromDue_Section){
             case _FA_Radius: Serial.println("Front Arm-Radius");
                              Section = "_11FR";
                              Speed = 20;
                              break;
             case _FA_Ulna  : Serial.println("Front Arm-Ulna");
                              Section = "_11FU";
                              Speed = 20;
                              break;
             case _UpperArm : Serial.println("Upper Arm");
                              Section = "_21UA";
                              Speed = 90;
                              break;
             case _Shoulder : Serial.println("Shoulder");
                              Section = "_31SH";
                              Speed = 30;
                              break;
           }
       Serial.println(" -action-");
       MoveToPosition(Section, Speed, CommandFromDue_SetValue);
       Serial.println("OK -> ARD DUE.");
       CommandPromptOverSerial("[ARD LNRD/] > ");
       digitalWrite(_00XXOK, HIGH); delay(100);
       digitalWrite(_00XXOK, LOW); // OK Feedback to Due
      } /* End of "if (Section_Num!=0)" */
} /* End of "void CommandFromDue()" */

?

?
?
?
?
pYYBAGOuOLeAQ4kWAAHPbKXNIPQ215.jpg
?
1 / 2 ?互通:初級測試
?

編碼::進一步

除了互通之外,這里我不會解釋更多代碼的深層細節,以免讓讀者感到無聊,因為在最后你可以找到完整的程序,如 Due 的 800 多行和 Leonardo 的 500 多行,以及解釋性說明. 正如您在程序中看到的那樣,已經存在具有相同名稱的函數。原則上,這些功能在原理/算法上完全相同,但只是由于控制范圍而進行了一些更改。

void CommandPromptOverSerial(提示符)

它的創建只是為了制作那個花哨的命令行界面。除此之外,它還重新初始化串行通信以確保刷新。

字符串 ReadUserInputOverSerial()

在串行監視器上讀取用戶輸入,并將其作為字符串返回。

無效閱讀(標簽)

空循環測試()

這兩個函數都是為測試單個循環(輸入/輸出通道)而創建的。

LoopTest() 已經有專門用于模擬輸入、模擬輸出、數字輸入、數字輸出和 PWM 輸出類型的小節;但 Read(Tag) 僅用于直接從頂層讀取輸入,而無需轉到 LoopTest()。

?
poYBAGOuOLqARv8GAAIGzq0lNgU344.jpg
循環測試
?

void CommandToServo(標簽,值)

正如您到目前為止所認識到的,我將所有內容都稱為標簽。這也是這個功能的目的:它將設定值(0-180)發送到分配給“標簽”的伺服電機。

void FullTravelDurationMeasurement (PWM_Tag, LimitSw_CCW, LimitSw_CW, int Speed)

編寫此函數是為了檢查手指的完整行程持續時間,因為它們無法配備實際位置傳感器。根據結果??,可以定時拉或放。即使它在理論上通過手動強制輸入/輸出工作,它也不能用于實際系統,因為開關由于機械磨損而無法正常工作。因此,完整的行程持續時間只能通過手動試驗來確定,而不是使用此功能。

?
pYYBAGOuOL2AXV3TAAHCHs8brrY433.jpg
?

void MoveDuringMillis(標記、方向、速度、毫秒)

該函數也被編寫為在指定的方向和指定的毫秒內驅動由標簽定義的手指。

void MoveToPosition (Section, Speed, SetValue)

此函數用于將一個部分移動到 SetValue 給定的位置并以指定的速度移動。注意Section還應裝有位置傳感器。

void Fingers_Hold()

void Fingers_Release()

這些功能被編寫為幾乎同時關閉(握住某物)和釋放手指。不幸的是,手指只能部分地工作一次……

void Final_Demo()

顧名思義:最后只能使用前臂和上臂的杠桿機構,以及肩部的旋轉。所以寫這個函數就是為了演示它們。

在成功測試所有單獨的信號和功能后,我完成了伺服系統和機械部分之間的機械連接。現在,arm 已準備好測試真正的功能,但是……

通電 :: 瘋狂伺服

在一個接一個地測試和調整所有伺服系統之后,是時候為所有伺服系統一次性供電了。但結果并不如我所料。

我最初的設計在上臂有 14 個微型伺服系統來處理輕負載,而在肩部有 2 個標準伺服系統用于杠桿上臂和轉動肩部。他們都能夠接受一個共同的電壓水平,6V,所以我做到了。

但是一旦我操作了一個標準的舵機,一些微型舵機就沒有任何命令就啟動了。幸運的是,我在電源線上放了一個開關,所以我可以一次全部切斷,但無論如何,由于瞬間和極端的加速,一些手指用力過大。我再次擰下所有微型伺服系統的滑輪,然后重新通電。結果是一樣的:不穩定的微舵機永遠無法調整,或者即使調整也無法保持穩定,甚至卸載。

?

我的第一個疑問是電源的適用性:我使用了一個 6V、3Ah 的適配器。

根據可用數據,每個微伺服在空閑時消耗 6 mA,在空載運行時消耗 120 mA,在失速條件下消耗 800 mA。對于標準舵機,只給出一個參數:100 mA 作為工作電流,我認為它是空載運行,并假設其余參數與微型舵機類似。

所以,我的電源就足夠了,因為此刻只有一個舵機運行。那么,失敗的原因可能是什么?

我仍然在考慮電源,并開始通過示波器對其進行監控。結果很有趣,而只有一個標準伺服正在運行:

?
pYYBAGOuOMGAZrBlAAckt7u0qJ4797.jpg
操作標準伺服時的電源電壓波動
?

當我看到這些變化時,我有一個理論:可能微伺服對電壓波動更敏感,而那些被它們誤解為“命令”。然后我決定分別為微型和標準伺服系統供電。標準伺服系統與一個微型伺服系統(專用于杠桿前臂的微型伺服系統)保持連接在當前電源上,而所有其他微型伺服系統都單獨連接到其他電源。這種修改奏效了。

手指 :: 最后一次

正如我在上面已經寫過的,最后由于磨損我無法操作所有部分。無論如何,它只能打開和關閉手指一次,如果我繼續嘗試,我可能會殺死剩下的 6 個微型伺服系統。所以最好在這里停下來。從理論上講,如果輕木部件沒有磨損,您會看到順序但更順暢的工作。

?

最終演示

最后,經過約 4.5 個月的設計和組裝,可以僅操作前臂和上臂的杠桿功能以及肩部的轉動功能。

?

工程 :: 重新審視工業實踐

如果您的項目在很小的區域內并且只包含很少或幾個設備,也許您可??以通過眼睛和手來跟蹤一切。

但是,如果您必須在 ~1 米長的設備上工作,該設備包含 140 多種不同類型的 500 多個零件、~60 種電氣電子設備(開關、電位器、伺服電機)、兩個不同控制器上的 60 多個信號以及將兩者互連,以及數百條連接線;然后在計算機和論文上工作成為必須,并且是解決問題的最佳選擇。

所以一切都是從在計算機上設計機械開始的。在后期階段;模型中添加了伺服電機、開關、位置傳感器和端子組件。

正如我在前面部分提到的,專用的唯一標簽也分配給所有單獨的部分。你也會在節目中看到這些標簽,它們讓生活變得更輕松。最后,有“3D模型”、“滑輪繩布線草圖”、“儀表列表”、“I/O列表”、“儀表布局”、“接線板布局”和“接線圖”作為文檔包項目。

?

?

?
?
?
?
poYBAGOuOMiAHZLMAAD0LXVCYy0998.jpg
?
1 / 8 ? 3D 模型
?

對于未來 :: 瓶頸

我同意我的設計非常原始。我最初的意圖只是機械地模仿人的手和手臂,但后來我決定嘗試驅動整個結構。

在機械設計方面,一切幾乎都符合預期:所有機械部件都完美匹配并通過手動方式相互交互。

無論如何,第一個瓶頸是選擇的材料,輕木:我選擇它只是因為它可以廣泛用于業余愛好作品的預成型/預切割部件,用于原型制作非常便宜,易于通過簡單的手工工具成型,容易只需使用強力膠水即可修復。通過使用輕木,我可以避免購買相當昂貴的 CNC 或 3D 打印機及其配件和耗材。

然而,輕木也是一種非常脆弱的材料,led 比我想象的更早磨損手指。

除此之外,我設計的 1:1 比例“放大”了輕木的弱點。在搭建和嘗試運行期間,我不得不對許多地方進行維修作為最后一個例子,Upper Arm 上的伺服電機支架板也是由輕木制成的,經過幾次拆卸后,它們開始開裂。

而且也不可能使用任何軸承,尤其是手部,因為有刻度。

盡管如此,我還是推薦使用輕木以最便宜的方式制作機械原型。

另一個瓶頸是伺服系統的尺寸和功率。由于規模,我只能使用微型和標準伺服系統,但它們的能力有限。這也是滑輪組考慮用于橈骨和上臂的旋前和屈曲的原因,因此整個手臂具有起重機式結構而不是真正的機器人結構。

為了未來 :: 教訓

模仿自然機制是一個非常困難和復雜的項目,因為它們的一些功能是由機械部分(=骨骼)之間的靈活(幾乎通用)連接提供的,這些連接由執行器(=肌肉)和反向彈簧(=肌腱)保持在一起。肌腱也可以被拉伸——即使是一點點,也沒有肌肉那么多。

但這還不是全部。當您啟動一個“部分”時,您還可以實時了解它的實際位置,以及在達到移動限制時聯鎖啟動。這意味著,每個部分應使用一個位置傳感器和至少 2 個限位開關。

正如您所注意到的,我不得不使用伺服電機,但如果您想避免使用位置傳感器,則可以使用步進電機然而,在這種情況下,每個步進器將需要 4 個數字輸出,因此 2 個 Arduino 級控制器是不夠的。

你認為我們完成了嗎?還沒有。

讓我們做一個簡單的實驗:握住右手,手掌向上。然后右手食指彎曲,“懸”在左手掌側。現在,試著用左手食指的指尖握住右手,同時將右手向上推。你看到了嗎?達到一定限度,你可以抵抗手臂上的肌肉,僅靠控制食指骨的肌肉。

如果你試圖通過模仿機制來做到這一點,幾乎可以肯定它們會被破壞。即使在簡單的試驗中,我也燒毀了 7 個微型伺服系統。

和更多:

在自然機制上,“執行器”放置在非常靠近機械部分的位置。今天,在機械仿制品上做到這一點的最好方法可能是使用液壓缸。但在那種情況下,還應使用強大的液壓泵系統、儲油器、止回閥、電磁閥……這將帶來更大的空間需求和控制器+輸入/輸出能力的必要性。

那些最新的 2 段意味著,需要更小和更強大的執行器。

完成的?不,還有一個問題:

讓你試著動動手指……

現在嘗試同時移動 2 或 3 個手指……很好。

嘗試移動所有手指,同時在手腕處上下移動手,然后左右移動……完美。

在杠桿前臂的同時轉動手腕,移動所有手指……

[ 什么?你還好嗎?看著我,我們帶你去診所好嗎?:))]

如果你沒有任何嚴重的健康問題,你可以做所有的事情,對吧?現在我們如何用機械模仿來做到這一點?

正如我已經提到的,人的手臂和手總共有大約 30 種不同的運動(軸),因此每個都必須使用一個致動器,以便能夠平滑地進行逼真的模仿。

如果我們想通過使用像 Arduino 類這樣的簡單控制器來做到這一點,我們只需要一個子控制器用于每個軸,一個主控制器來命令它們。子控制器應該有其特定的例程,僅定義各個部分的特定運動,以用于整個系統的預定義整體運動。Master 只需將設定點和請求的整體運動信息發送給子控制器,然后向 all in once 發送“執行”命令,并等待確認。

例如,每個子控制器分別專用于食指、中指、無名指和小指的近端、內側和遠端部分(因此我們談論的是 12 個子控制器以及致動器、位置傳感器、限位開關和根據需要等等)應該有 - 例如 - 一個“ Hold_a_Circular_Plate()”子例程僅為相應部分定義特定運動。當主控制器發送“ Command_to_Hold_Circular_Plate() ”時,它應該只觸發一個輸出同時到達所有子控制器。但另一個重要問題是在微秒內同步子控制器,否則所有操作都會失敗。

第二種選擇是使用功能更強大的控制器和響應速度更快的執行器,這樣不同執行器之間的切換將無法識別。

第三種選擇是最好的,如果可能的話:使用有史以來最強大的控制器,能夠以極快的速度執行絕對多處理:有機大腦和神經系統,最好是人腦用于人形手臂(虛構它是在 Robocop 系列中完成的)。

:: 結尾 ::

即便是現在也有一些公司在為殘疾人制造人形假手,即使設計的再好,為人們的生活帶來便利,也不能說是完美的模仿。

我想我們幾乎所有人都可能見過波士頓動力公司設計和建造的最神奇的機器人“阿特拉斯”。這樣的研究和開發消耗大量的金錢、時間,需要長時間的研究、試驗、無數次的失敗等等。例如,波士頓動力公司成立于 1992 年,從那時起他們就一直在研究機器人。這意味著,到今天為止,Atlas 背后有近 30 年的研究、試驗、失敗、重試……等等。

在預算方面,Atlas 的“父親”和“母親”由美國國防高級研究計劃局資助。是的,不幸的是,軍事機構是這些驚人項目的主要支持者,人類仍然非常善于尋找最好的自相殘殺方式:(

市場上的消費品無法制造出如此驚人的東西。所有機械、電子、執行器、傳感器……都應根據項目量身定制的定制參數進行專門和單獨設計。

也許最近發明的人造肌肉可能有助于開發更好的假肢。

在所有情況下,我希望你能從機械和控制的角度發現所有那些冗長的故事,還有你的身體……


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數據手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費