資料介紹
描述
一種易于使用的動力假肢——開源且價格合理。為適應持續發展而開發的簡單、有效、輔助技術。由一群勤奮的本科生為您帶來,他們熱衷于機器人技術被廣泛用于改善所有人生活質量的未來愿景。雖然新技術的努力往往是揮霍無度的,但我們的腿的成本大約相當于一張中檔宜家沙發(550 美元)。
我們的項目和價格點在很大程度上依賴于新技術的利用,例如最近才出現的連續 3D 打印碳纖維。此外,我們的項目是完全開源的,因此學生、技術愛好者和截肢者都可以自由制造和完善它。我們希望該項目能夠立即提高感興趣的截肢者的功能質量,并最終可能成為輔助技術領域擴散發展和未來研究的平臺。
信用到期的信用
該項目由猶他大學的Tommaso Lenzi 博士提出概念。這些材料全部由他的實驗室仿生工程實驗室贊助。去尤特斯。
?
?
收集零件
要做的第一件事是訂購所有組件。他們需要幾天時間才能到達。我們已嘗試使用盡可能少的供應商,以避免不得不進行數十次采購。
拆卸鉆頭
該項目使用鉆頭,因為它是獲得強大的無刷直流電機、電機控制器、行星齒輪組和可充電鋰離子電池的一種經濟高效的方式。
3D打印
首選的 3D 打印機是 Markforged Mark Two,因為它能夠結合連續的碳纖維束,而 Ultimaker S5 則適用于 Tough PLA 組件。
我們用連續股碳纖維打印軸套連接器,以實現令人難以置信的 3D 打印重量強度比。前殼、后殼和電機外殼采用堅固的 PLA 印刷,用于初始原型制作,以降低成本并為這些組件設定基準。隨著我們繼續開發,將探索使用 3D 復合打印機進行實驗以減輕重量并提高這些組件的耐用性。
總共需要制作六個打印文件:
- 軸套接頭(碳纖維/瑪瑙復合材料)
- 前殼(Tough PLA)
- 后殼(Tough PLA)
- 電機外殼(Tough PLA)
- 墊片(Tough PLA)
- 緊急停止(Tough PLA)
軸套連接器
使用具有以下設置的 Markforged Mark Two 或其他復合打印機
- 噴嘴尺寸:標準
- 打印層高:0.125 [mm]
- 支持:瑪瑙
- 填充率:37%
- 碳纖維同心層數:最多 15 個同心環,所有墻壁都經過加固,37% 填充,屋頂和地板層 5,墻層 3,三角形填充
- 層數:在第 139 - 278 層上加固,在所示尺寸中同心
前殼、后殼和電機外殼
使用具有以下設置的 Ultimaker S5 或其他 Tough PLA 打印機
- 噴嘴尺寸:AA 0.4
- 印刷層高:0.2[mm]
- 支持:PVA
- 填充率:10%
墊片
使用具有以下設置的 Ultimaker S5 或其他 Tough PLA 打印機
- 噴嘴尺寸:AA 0.4
- 印刷層高:0.1[mm]
- 支持:PVA
- 填充率:100%
緊急停止
使用具有以下設置的 Ultimaker S5 或其他 Tough PLA 打印機
- 噴嘴尺寸:AA 0.4
- 印刷層高:0.06[mm]
- 支持:PVA
- 填充率:100%
電子組裝
組裝電路板:
在等待零件進來的同時,您需要訂購兩塊印刷電路板 (PCB)。一個用于主板,另一個用于地面反作用力 (GRF) 傳感器。您需要將 Gerber 文件發送到您最喜歡的制造廠。壓縮的 Gerber 文件可以在 GitHub 存儲庫上找到,文件路徑為“PCB -> Motherboard”和“PCB -> GRF”。隨訂單一起提交 .zip 文件。我們的董事會使用了以下細節:
- 層數:2
- 材質:FR4
- 材料厚度:0.062 [英寸]
- 單位尺寸:0.972 x 2.350 [in](主板)和 0.835 x 0.600 [in](GRF)
- 銅重量:1 [oz]
當電路板到達時,在 BOM 中找到的參考標記中焊接適當的組件(這些可以在與 Gerber 文件相同的文件路徑中找到)。
如果您不知道如何將表面貼裝器件 (SMD) 安裝到 PCB,請觀看本教程。
組裝地面反作用力 (GRF) 傳感器:
將 3 [mm] 橡膠墊切成 52.0 x 52.0 [mm] 的正方形,然后在每個角上切出 10.0 x 10.0 [mm] 的正方形。它應該看起來大致像這樣。
以干凈的方式切割橡膠非常困難,但請盡力使線條筆直且切割成比例。這將使傳感器校準更容易,讀數更可靠。
接下來,我們需要將磁鐵安裝在底部金字塔的內部(或者任何你用來連接塔的東西)。GRF 下死點到磁鐵上死點的最佳距離為 11.55 [mm],這也是最小距離。最大距離為 15.15 [mm]
將電子設備安裝到主要結構上:
將緊急停止 (e-stop) 線穿過頂部金字塔平面的一側,然后收集慣性測量單元 (IMU) 線,并將 e-stop 和 IMU 線向下穿過金字塔平面,穿過指示的孔并引出靠近磁鐵(非鏈輪)側的軸。
將這些和編碼器線沿著外殼干凈地布置到工字梁的通道,將它們固定在鏈條和鏈輪傳動系統之外。
將 GRF 的電線向上穿過工字梁上的底部金字塔平面。
?
在此圖像中,焊接線是綠色到黑色端子(負極)和灰色到紅色端子(正極)。
如果您計劃使用定制電池(沒有電池監控系統)或電源運行腿,您還需要在紅色(正極)和黃色(參考)端子之間焊接一個 250 [Ohm] 電阻以復制牧田電池組中熱敏電阻的電阻。
注意:使用鋰電池很危險,因此請遵循正確的程序并確保裸露的電線不會短路。
布線完所有電線后,我??們需要將它們連接到主板。按照 GitHub 上文件路徑“PCB->Motherboard”中的引出線描述連接 20 位和 5 位 Molex 連接器
?
機械組裝
在組裝支腿之前,請務必準備好下面顯示和列出的所有零件。
1.組裝所需的第一步是修改軸套連接器襯套(第 3 部分)。如下圖所示,需要使用帶鋸將襯套切割成 0.5 [in] 的長度,然后去毛刺。然后需要將襯套安裝到軸套連接器(第 15 部分)。
2.然后需要將 0.5 [in] 軸(第 13 部分)切割成 103 [mm],并擰上螺紋并攻絲以連接鏈輪。在軸兩端的中心鉆一個 5 [mm] 的孔,然后用 M6 螺栓攻絲。然后使用 1/2 [in]-13 模具,在軸的兩個外端創建螺紋。
3.在軸套連接器 20 齒鏈輪(第 5b 部分)上,需要等距分布 4 個孔,并圍繞 0.5 [in] 孔的周邊鉆孔。孔的直徑需要為 3.4 [毫米],距鏈輪中心的距離為 8.89 [毫米](0.35 [英寸])(中心到中心測量值)。
4.接下來取出所有 4 [mm] 熱固插件并安裝在后殼(第 10 部分)上相應的 4 [mm] 間隙孔中。對頂部軸套連接器(第 15 部分)上的 3 [mm] 熱插件執行相同操作。
5.將兩個軸連同 0.5 [in] ID 襯套和相應的墊片一起安裝在框架的兩半之間。將編碼器(部件 12b)放入軸套連接器旁邊的槽中。固定所有螺栓以將外殼的兩個部分裝配在一起。左側 2 個螺栓為 M4-40 [mm](零件 6c),軸之間的 3 個螺栓為 M4-55 [mm](零件 6a),右側三個螺栓為 M4-50 [mm](零件 6b) ,底部軸邊緣的 2 個螺栓為 M4-25 [mm](第 6d 部分)。
6.使用 M3-70 [mm] 螺栓(第 4a 部分)將頂部鏈輪(第 5b 部分)固定到軸套接頭上。
7.安裝電機(第 1 部分)并擰入用于電機外殼(第 11 部分)的 M4-12 [mm] 緊固件和 M4 螺母(第 6e 部分)。
8.在兩組鏈輪上安裝鏈條(第 7 部分)和主鏈節。
9.將 IMU(部件 12a)安裝到軸套連接器上。將 GRF(第 12d 部分)放置在連接框架的底部,然后是聚氨酯橡膠,最后是金字塔(第 8 部分)以將 GRF 固定到位。
10.從電鉆手柄上切下 Makit 電鉆電池座,使其與頂部齊平。將電池端子(第 1 部分)和電機控制器固定在縮小的 Makita 電鉆外殼中。使用 M4-12 [mm] 螺釘將鉆頭外殼固定到后殼上。
代碼
您將需要 Arduino 和 Teensyduino(輕松)將 Teensy 4.0 上的以下代碼上傳到主板(第 12c 部分)。
傳感器驗證:
為確保所有傳感器和信號線都正常工作,請將代碼單獨上傳到 GitHub 的文件路徑“Verification -> verifying[sensorName]”。每段代碼都測試單個傳感器及其連接。
現在一切正常,讓我們開始移動這條腿。在首次啟動時嚴格遵循這些步驟至關重要,因為不正確的傳感器讀數會導致系統不穩定。如果您運行了之前的所有代碼并且沒有返回任何錯誤,則傳感器讀數應該是正確的,但安全第一,請按照以下步驟操作:
注意:請勿在支腿通電時將 USB 數據線連接到主板,否則會損壞 Teensy。如果要在腿帶電的情況下連接主板,則USB電源和板卡電源必須分開。
- 確保腿由頂部或底部金字塔固定
- 關閉緊急停止(將紅色蓋帽向下推)
- 使用 USB 轉 micro USB 電纜將計算機連接到主板
- 上傳GitHub上“Integration -> testingPcontroller”文件路徑下的代碼到主板
- 斷開計算機與主板的連接
- 打開急停(擰紅帽)
- 腿上的功率為 18 [V]
這是使腿來回擺動的代碼:
/*
* Auth: Justin Francis
* Date: 11/27/19
* Ver: 1.0
* Sum: this is a position P-controller for the Open source powered prosthetic //leg,
* it oscillates the leg back and forth between 5 deg and 85 deg from vert//ical,
* or it can be controlled with a potentiometer remotely.
* written for teensy 3.2
*
* Mod:
*
*/
#include
#include
//empirically determined speed curve (x = thetaDotDes [rad/s], y = command vol//tage[rad/s])
#define MOT_CONTROL_CURVE (0.67 - 0.148*log(abs(thetaDotDes)))
//teensy 3.2 limits
#define DAC_RES 1023 //10 bit
#define DAC_MAX 3.3 //[V]
//incremental encoder interrupt pins
#define IncEncA 2
#define IncEncB 3
//use this for potentiometer control
// #define POT_CTRL
//use this for plotting
// #define PLOTTING
//use this for use with battery pack, comment out if using a current limited p//ower supply
//the reason being, the battery pack can supply enough power to tear the leg a//part if a signal
//is being processed incorrectly, this keeps that from happening.
#define TRIAL
//control vars
float P = 30; //proportional gain K_u ~= 35
float k; //conversion factor for theta dot to voltage for the controller output
float motCmd; //value to output to motor controller
float err; //controller error
float thetaDes = 0; //desire joint position [rad]
float theta, thetaDotDes; //joint position [rad], desire joint velocity [rad/s]
#ifdef POT_CTRL
float inputV; //potentiometer voltage [V]
const int POT_PIN = 14; //potentiometer pin
#endif
//motor vars
const int DAC_Pin = A14; //motor speed pin
const int directionPin = 5;
const int enablePin = 4;
//incremental Encoder
Encoder inc(IncEncA,IncEncB); //interrupt attach to digital pins 2 and 3
int counts, countsOld = 0;
const float INC_RES = 4096.0; //resolution of encoder [cpr]
void setup()
{
Serial.begin(115200); //turn on serial port (display) at 115200 baud
//set ports
pinMode(DAC_Pin, OUTPUT);
pinMode(directionPin, OUTPUT);
pinMode(enablePin, OUTPUT);
#ifdef POT_CTRL
pinMode(POT_PIN, INPUT);
#endif
//this is needed for the motor startup sequence
digitalWrite(enablePin, LOW);
delay(200);
#ifdef PLOTTING
Serial.println("theta thetaDes");
#endif
}
/*
* function to control the motor, takes in a desired velocity and commands the motor
* no return
*/
void MotorDrive(float thetaDotDes)
{
if(thetaDotDes >= 0.0)
{
digitalWrite(directionPin, HIGH);
}
else
{
digitalWrite(directionPin, LOW);
}
digitalWrite(enablePin, HIGH);
motCmd = MOT_CONTROL_CURVE; //[V]
motCmd = constrain(motCmd, 0.0, .75); //anything outside of this voltage r //ange cause the controller to pause
analogWrite(DAC_Pin, (int)(motCmd*DAC_RES/DAC_MAX)); //convert command int //o voltage
}
float i = 0; //used for oscillations
void loop()
{
//read sensor
counts = inc.read();
//potentiometer control
#ifdef POT_CTRL
inputV = analogRead(POT_PIN) * (3.3/1024); //[V]
#endif
//standard oscillations
#ifndef POT_CTRL
thetaDes = (PI/2.2*sin(i));
i += 0.0001; //this needs to decrease if the teensy 4.0 is used because of //faster clock
#endif
//convert to radians
theta = (((float)counts/INC_RES))*2*PI; //[rad]
#ifdef POT_CTRL
thetaDes = inputV * (PI/(3.3*2)) - .5; //[rad]
#endif
#ifdef TRIAL
thetaDes = constrain(thetaDes, -.5, 1.5);
#endif
#ifdef PLOTTING
Serial.print(theta*.25);Serial.print("\t");Serial.println(thetaDes*.25);
#endif
//find err
err = thetaDes - theta; //rad
//calc correction
thetaDotDes = P * err; //[rad/s]
//command system
MotorDrive(thetaDotDes);
//feedback (not needed for P controller)
}
現在腿應該來回擺動,在擺動的兩端停幾秒鐘。
第一次試運行后,可以使用以下步驟為腿加電。
- 打開急停(擰紅帽)
- 以 18 [V] 為腿供電
可選的無線通信(高級)
通過使用第二個 Raspberry Pi Zero W 作為控制器,可以最輕松地進行無線通信。然后可以通過連接到現有網絡或將其中一個樹莓派設置為接入點來實現設備之間的通信。
連接到同一網絡后,Python 的套接字庫可用于使用 GitHub 上文件路徑“wireless_communication”中的代碼在兩個 Pi 之間創建服務器(在腿上)客戶端(遠程)關系。
服務器設置(Python):
import socket
# establish connection
HOST = "INSERT SERVER IP ADDRESS"
PORT = "INSERT OPEN PORT" # e.g. port above 5000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "socket created"
# check for valid host and port
try:
s.bind((HOST,PORT))
except socket.error:
print "bind Failed"
# establish connection
s.listen(1)
print "Socket awaiting messages"
(conn, addr) = s.accept()
print "connected"
# await and receive messages
while True:
data = conn.recv(1024)
print data
# close connection when finished
conn.close()
客戶端設置(Python):
import socket
import Adafruit_ADS1x15
import time
# Configure wireless connection with server (board on leg)
HOST = "INSERT SERVER IP ADDRESS"
PORT = "INSERT OPEN PORT" # e.g. port above 5000
# Connect to server host/port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
# ADC Converter: Create an ADS1115 ADC (16-bit) instance.
adc = Adafruit_ADS1x15.ADS1115()
# Choose Gain
GAIN = 1
while True:
# Read all the ADC channel values in a list.
# Our joystick has two channels (direction and button)
values = [0]*2
for i in range(2):
# Read the specified ADC channel using the previously set gain value.
values[i] = adc.read_adc(i, gain=GAIN)
# we are currently only interested in the direction value
command = str(values[0])
# send command to the server
s.send(command)
# delay
time.sleep(0.5)
通過模數轉換器 ( ADC),控制器的 Pi 可以讀取操縱桿的 ADC 通道值,然后將其發送到腿的 Pi。最后,通過 pySerial 庫,腿部的 Pi 可以將這些模擬值傳輸到 Teensy 4.0,以控制電機的速度和方向。
將代碼添加到服務器代碼的頂部(Python):
import serial
import time
# connect with teensy, choose baud rate
ser = serial.Serial('/dev/tty/ACM0', 9600)
time.sleep(.5)
將代碼添加到服務器底部while 循環以與 Teensy (Python)通信:
# send command to teensy
ser.write(str(data))
time.sleep(.1)
青少年設置(C++):
void setup() {
Serial1.begin(9600);
Serial.begin(9600);
}
void loop() {
String readString = "";
// read in message
while (Serial.available())
{
delay(30);
if (Serial.available() > 0)
{
char c = Serial.read();
readString += c;
}
}
// print message to serial monitor or use value to control motor
if (readString.length() > 0)
{
Serial.println(readString);
}
}
我們使用無線通信讓控制、數據收集、代碼重構和調試更加高效和方便。
- 粒子動力機械臂開源構建
- 機器人假肢開源構建
- 混合動力火箭發動機開源
- 易于使用的二氧化碳傳感器MH Z19B開源
- 汽車輪胎動力學教材分享 0次下載
- 開源網絡協議分析器WireShark軟件下載 15次下載
- ThinkPHP 6.0完全開發手冊資源下載 13次下載
- 開源課程行動倡議及科學導論綜述 6次下載
- 污染環境中微生物治理的種群動力學算法PDO-MCCE 10次下載
- 使用FPGA時序使時鐘保持純凈或使雜質易于消化的詳細說明 9次下載
- 異構雙足機器人的步態規劃和步態識別研究論文說明 15次下載
- 基于兩自由度髖關節運動和MSP430單片機的機器人假肢控制系統 9次下載
- 基于FSR的假肢手抓握力控制_鄧小保 4次下載
- 基于AMT的假肢接受腔CAM系統
- 易于擴充的圖像檢索平臺實現
- 利用開源軟件的最佳實踐 464次閱讀
- 前沿開源技術領域的開源大數據一一解讀 1005次閱讀
- 安全的任務關鍵型通信需要一種新的、易于實施的方法 1173次閱讀
- 一種開源滲透測試工具toxssin介紹 1300次閱讀
- littleVGL開源圖形庫的主要特性與移植過程 3143次閱讀
- 制作一個易于使用的自動寵物喂食器 5116次閱讀
- 易于構建的摩托車報警器電路圖 2407次閱讀
- 采用單片機和CPLD器件實現仿人手臂形假肢控制系統的設計 1074次閱讀
- 四款炫酷Linux開源程序照亮你的生活! 5340次閱讀
- NASA的開源軟件是什么?NASA的開源軟件的詳細分析 7186次閱讀
- 為機器學習開發者指明道路的八種開源AI技術! 966次閱讀
- 動力電池pack是什么_動力電池pack結構設計介紹 8.3w次閱讀
- 動力電池技術分哪幾種_動力電池分類 1.4w次閱讀
- 谷歌開發一個輕量級的庫——TFGAN 它可以讓生成對抗網絡更易于實驗 5412次閱讀
- 插電式混合動力與混合動力的區別 1.2w次閱讀
下載排行
本周
- 1Keysight B1500A 半導體器件分析儀用戶手冊、說明書 (中文)
- 19.00 MB | 4次下載 | 免費
- 2使用TL431設計電源
- 0.67 MB | 2次下載 | 免費
- 3BT134雙向可控硅手冊
- 1.74 MB | 2次下載 | 1 積分
- 4一種新型高效率的服務器電源系統
- 0.85 MB | 1次下載 | 1 積分
- 5LabVIEW環形控件
- 0.01 MB | 1次下載 | 1 積分
- 6PR735,使用UCC28060的600W交錯式PFC轉換器
- 540.03KB | 1次下載 | 免費
- 751單片機核心板原理圖
- 0.12 MB | 1次下載 | 5 積分
- 8BP2879DB支持調光調滅的非隔離低 PF LED 驅動器
- 1.44 MB | 1次下載 | 免費
本月
- 1開關電源設計原理手冊
- 1.83 MB | 54次下載 | 免費
- 2FS5080E 5V升壓充電兩串鋰電池充電管理IC中文手冊
- 8.45 MB | 23次下載 | 免費
- 3DMT0660數字萬用表產品說明書
- 0.70 MB | 13次下載 | 免費
- 4UC3842/3/4/5電源管理芯片中文手冊
- 1.75 MB | 12次下載 | 免費
- 5ST7789V2單芯片控制器/驅動器英文手冊
- 3.07 MB | 11次下載 | 1 積分
- 6TPS54202H降壓轉換器評估模塊用戶指南
- 1.02MB | 8次下載 | 免費
- 7STM32F101x8/STM32F101xB手冊
- 1.69 MB | 8次下載 | 1 積分
- 8基于MSP430FR6043的超聲波氣體流量計快速入門指南
- 2.26MB | 7次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935119次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
- 1.48MB | 420061次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233084次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191367次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183335次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81581次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73807次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65987次下載 | 10 積分
評論
查看更多