如何設(shè)計(jì)一個(gè)數(shù)字秤
掃描二維碼
隨時(shí)隨地手機(jī)看文章
一個(gè)沒有活動部件的秤——你說不可能?根據(jù)我目前項(xiàng)目的結(jié)果,它擁有令人難以置信的分辨率和準(zhǔn)確性。從一個(gè)鋁制長方體的彎曲到眼睛難以察覺的彎曲,一個(gè)24位模數(shù)轉(zhuǎn)換器(ADC),一個(gè)ESP8266或ESP32(縮寫為以下文本ESP)和一個(gè)OLED顯示器,一個(gè)數(shù)字秤被創(chuàng)造出來,在我的情況下,可以測量高達(dá)1kg的質(zhì)量,分辨率為0.01g!本系列的這篇文章解釋了它是如何工作的以及它背后的技巧。
ESP32和ESP8266上的Micropython
數(shù)字秤與HX711
我最初認(rèn)為這是不可能的,結(jié)果讓我非常驚訝。所用的鋁制組件是一種所謂的測壓元件。中間的兩個(gè)孔將金屬削薄,拉伸條粘在墻上,如圖1的頂部和底部。材料厚度約為。1毫米。
圖1:側(cè)面的工資單元
稱重傳感器與底板一起擰在右側(cè),秤帶連接在左側(cè)。
圖2:1公斤的天秤座
一張尺寸為10cm x 15cm的紙現(xiàn)在使測壓元件彎曲如此之多,或者更確切地說,很小,以至于秤上顯示的重量為0.9g。
這是如何工作的呢?拉伸帶是應(yīng)用于塑料載體的晶圓薄導(dǎo)體軌道。這些墊子粘在載體材料上。
圖3:拉伸條示意圖
通過彎曲載體,導(dǎo)體被稍微拉伸,從而變得更薄更長。這會引起電阻的變化,這取決于兩個(gè)參數(shù),ρ是比電阻,一個(gè)材料常數(shù)。
圖4:阻力公式
紙上的紙張很可能會引發(fā)12.5毫米高的長方體的彎曲,這是一個(gè)原子的順序。由此產(chǎn)生的測量條長度的變化也是如此。這足以改變四個(gè)測量條在測量橋上的張力,兩個(gè)在長方體上面,兩個(gè)在長方體下面,到目前為止,HX711可以得出一個(gè)可測量的,最重要的是可重復(fù)的電壓變化。
圖5:HX711 -電路
Micropython -語言-模塊和程序
要安裝托尼,你會在這里找到一個(gè)詳細(xì)的說明(英文版)。還有一個(gè)關(guān)于ESP芯片上的Micropython固件(截至2022年6月18日)如何被燒毀的描述。
Micropython是一種解釋器語言。Arduino IDE與Arduino IDE的主要區(qū)別在于,你只需要在ESP32上閃爍Micropython固件一次,以便控制器理解Micropython指令。您可以使用Thonny,μpycraft或ESPTOOL.PY。對于安東尼,我在這里描述了這個(gè)過程。
一旦固件閃過,你就可以很容易地在對話框中與控制器對話,測試單個(gè)命令并立即看到答案,而無需事先編譯和傳輸整個(gè)程序。這正是Arduino IDE困擾我的地方。如果您可以檢查語法和硬件的簡單測試,以便在編寫程序之前通過命令行嘗試和改進(jìn)函數(shù)和整個(gè)程序部分,則可以節(jié)省大量時(shí)間。出于這個(gè)目的,我總是喜歡創(chuàng)建小型測試程序。作為一種宏,它們總結(jié)了重復(fù)出現(xiàn)的命令。然后從這些程序片段開發(fā)整個(gè)應(yīng)用程序。
自動啟動
如果程序要通過打開控制器自動啟動,請將程序文本復(fù)制到新創(chuàng)建的空白磁貼中。將此文件保存在工作區(qū)的boot.py下,并將其上傳到ESP芯片。該程序?qū)⒃谙麓螐?fù)位或開機(jī)時(shí)自動啟動。
測試程序
tony - ide中當(dāng)前編輯器窗口中的程序通過F5按鈕手動啟動。這可以比鼠標(biāo)點(diǎn)擊開始按鈕或通過菜單運(yùn)行更快地完成。只有程序中使用的模塊必須在ESP32的flash中。
在兩者之間,Arduino id ?
如果您以后將控制器與Arduino IDE一起使用,只需以通常的方式刷新程序。然而,ESP32/ESP8266隨后忘記了它曾經(jīng)說過Micropython。相反,任何包含Arduino IDE或AT-Firmware或Lua或…可以很容易地提供micropython固件。這個(gè)過程總是像這里描述的那樣。
電路
以下是該項(xiàng)目的電路圖,它可以自由選擇ESP32和ESP8266。選擇用于連接HX711的gpio,以便您不會阻礙ESP8266的啟動,并且對于兩種控制器類型具有相同的名稱。只有I2C總線的連接是不同的,但由程序自動分配。
圖6:ESP8266上的HX711縮放
圖7:HX711在ESP32上的比例
HX711的Micropython模塊
與大多數(shù)傳感器組件一樣,HX711模塊也需要操作軟件。不幸的是,HX711不支持i2c。數(shù)據(jù)傳輸也通過dot和dpclk線以串行方式進(jìn)行。24位加1 ~ 3位,用于通道A或B的選擇和加強(qiáng)的設(shè)置。MSbit(最高有效位=高質(zhì)量位)是HX711的第一個(gè)位。
用于編程模塊hx711。我有這個(gè)制造商使用的數(shù)據(jù)表。
異常類處理HX711不可訪問的情況。接下來是HX711類的聲明,Devicenotready繼承了HX711類。拋出異常后,將生成一個(gè)實(shí)例,構(gòu)造函數(shù)確保輸出錯誤消息。
我們從幾個(gè)常數(shù)開始。校正系數(shù)是用各種已知的按摩片和一個(gè)計(jì)算工具(例如Libre Office)進(jìn)行加權(quán)來確定的。我一會兒就來。
構(gòu)造函數(shù)接受兩個(gè)引腳對象dot和pdsk,以及ch中的可選通道。Dout被切換為入口,因?yàn)樗鼞?yīng)該從HX711的結(jié)果接收數(shù)據(jù)。ESP通過DPSCK管理指定速度。我們聲明屬性channel、tar和cal,然后等待HX711的Ready信號。如果它沒有出現(xiàn),則拋出WAITREADY()一個(gè)Devicenotready-Exception。如果它工作,那么我們獲得通道和增益設(shè)置,并在終端中發(fā)出消息。Dictionary Channelandgain將頻道號轉(zhuǎn)換為純文本。
Closure Time-out()實(shí)現(xiàn)了一個(gè)軟件定時(shí)器,它不會在程序處于sleep() & Co狀態(tài)時(shí)阻塞程序。返回的函數(shù)compare()如果分配了一個(gè)標(biāo)識符來詢問傳遞的時(shí)間是否已經(jīng)以毫秒為單位過期(True)或未過期(false)。
當(dāng)數(shù)據(jù)線處于GND電位時(shí),ISDEVICEREADY()方法返回True。根據(jù)數(shù)據(jù)表,這是HX711準(zhǔn)備好發(fā)送數(shù)據(jù)的條件。時(shí)鐘線上的第一個(gè)正側(cè),HX711在DOUT線上提供MSbit。
圖8:邏輯2掃描
每增加一個(gè)脈沖,比特就依次推出。同時(shí),ESP必須讀取和處理線路的狀況。ESP通過時(shí)鐘設(shè)定節(jié)奏。脈沖序列為125μs,對應(yīng)的時(shí)鐘約為。8 kHz。
我用邏輯分析儀和軟件logic 2記錄了脈沖結(jié)果。每當(dāng)數(shù)據(jù)傳輸出現(xiàn)問題時(shí),我喜歡使用DSO(數(shù)字存儲示波器),或者更小的工具,更便宜的世界邏輯分析儀(La) 8通道。這個(gè)東西連接到USB總線,并使用免費(fèi)軟件顯示總線管道上正在發(fā)生的事情。在脈沖的形狀無關(guān)緊要,而只與時(shí)間順序有關(guān)的地方,LA值千金。雖然DSO只提供曲線的快照,但您可以長時(shí)間感受洛杉磯,然后將自己放大到有趣的地方。你可以在Bernd Albrecht的博客文章“邏輯分析儀第1部分:使I2C信號可見”中找到設(shè)備的描述。其中還描述了如何掃描I2C總線。
在讀取24個(gè)數(shù)據(jù)位后,再使用pdsk發(fā)出的一到三個(gè)脈沖,即稅收位。你的意思是:
圖9:控制脈沖的含義
名稱是程序,WAITREADY()等待ISDEVICEREADY()的true,但之前在Readydydelay中設(shè)置了計(jì)時(shí)器,即3秒。如果Dout在此期間沒有變?yōu)閘ow,則會拋出一個(gè)devicenotready - exception。如果調(diào)用程序不攔截異常,就會關(guān)閉它。
HX711將數(shù)據(jù)作為雙補(bǔ)碼值發(fā)送。Conpricerult()實(shí)際上在設(shè)置的MSbit(位23)中識別負(fù)值。如果設(shè)置為2,則第2級是24的第2級減去得到一個(gè)真正的負(fù)數(shù)。
0xc17ac3 = 12679875設(shè)置了MSbit
12679875 - 0x1000000 = -4097341
clock()只在PDSCK線上產(chǎn)生一個(gè)12.4μs的正脈沖。
忽略channel()無參數(shù),然后該函數(shù)傳遞當(dāng)前通道和增益值。字典。將譯文轉(zhuǎn)換為純文本。
一旦通道號被移交,我們檢查正確的區(qū)域,檢查HX711是否準(zhǔn)備好,然后將相應(yīng)數(shù)量的脈沖推到PDSCK線上,24加上稅位。
HX711傳遞的原始值是由aw()接收的。變?yōu)門rue或根本不傳遞參數(shù),則返回值為粉紅色,即帶符號的整數(shù)。如果為false,則返回值Bloody,因?yàn)樗鼘?yīng)于位序列,raw。
我們正在等待HX711的發(fā)送,并將接收緩沖區(qū)設(shè)置為0。
在for循環(huán)中,我們在PDSCK上發(fā)送23個(gè)脈沖。每次運(yùn)行時(shí),我們都在數(shù)據(jù)線上的LSBIT(最低有效位=低質(zhì)量位)的位置,然后將位向左推一個(gè)位置。第一個(gè)接收到的位移動到位置23,即MSbit。在另一個(gè)時(shí)鐘脈沖之后,HX711將LSbit推到數(shù)據(jù)線上,我們只在原始的LSbit上或必須。除了競爭之外,下一次測量的稅收也必須被記錄下來。
為了平滑值的噪聲,我們不僅使用單個(gè)測量值,而且使用多個(gè)測量值的平均值。這就得到了方法mean(),我們把單個(gè)測量值的數(shù)量交給它。
未受污染的天平自然也提供了ADC值,即塔拉。我們總是在啟動稱重程序時(shí)調(diào)用該方法,以便能夠?qū)@示設(shè)置為0。Tara值在屬性self中。保存,以便方法Dimensions()可用,n再次是單個(gè)測量的數(shù)量。
方法Dimensions()將Tara從測量值中提取出來,然后通過除以校準(zhǔn)因子計(jì)算出以克為單位的真實(shí)測量值。稍后我將說明它是如何確定的。
在校準(zhǔn)期間,如果您可以手動處理校準(zhǔn)因子,而不必每次都將HX711.PY模塊上傳到ESP,這將是一個(gè)優(yōu)勢。當(dāng)前值將不帶參數(shù)返回。
wake up()和tosleep()將HX711從睡眠模式中喚醒,或者將其置于睡眠模式中。線路上的信號順序由HX711的數(shù)據(jù)表指定。
用于OLED顯示器的大字符集
大數(shù)字使測量更容易閱讀。我們使用30作為符號,而不是通常的8像素。文件geometer_30。包含相關(guān)信息。
因此,您可以從Windows提供的TTF中創(chuàng)建自己的字符集。
下載zeichensatz存檔文件。rdown并將內(nèi)容解包到任意目錄中。為了節(jié)省小費(fèi),我建議在硬盤或存儲卡的根路徑上放置一個(gè)名字簡短的列表。對我來說是F: \ fonts。
通過右鍵單擊該目錄并按下按鈕,在資源管理器中打開該目錄下的PowerShell窗口。然后左鍵點(diǎn)擊打開PowerShell窗口。
圖10:打開PowerShell窗口
在提示符下輸入以下一行,按“Enter”:
.\ Makecharset.bat Britannic 30 "" 0123456789, -+KG "" “F: \ fonts \ sources \”
圖11:字符集準(zhǔn)備好了
現(xiàn)在目錄britannic_30.py中有一個(gè)文件,其中包含新字符集的像素?cái)?shù)據(jù)。僅實(shí)現(xiàn)字符“0123456789,-+KG”“”,節(jié)省存儲空間。您可以從目錄源中的Windows字體列表中獲取其他簽名速率,如上面指定的復(fù)制和轉(zhuǎn)換。請注意,文件名指定時(shí)沒有附加。tttf。
Libra的操作軟件
程序scale.py訪問四個(gè)外部模塊,hx711.py,oled.py,SSD1306,這些模塊在啟動前必須上傳到ESP的閃存中。PYand geometer_30.py。
關(guān)于變量sys。平臺的ESP可以確定它自己。然后將GPIO引腳聲明為I2C總線。
我們實(shí)例化一個(gè)顯示對象,刪除顯示并聲明連接到HX711的PIN對象,還有按鈕,Tara鍵的實(shí)例。
函數(shù)Putnumber()用數(shù)字n定位字符的像素模式(基于上面生成的提取,而不是Ascii)。圖案左上角的位置在XPOS, YPOS中。
查看文件geometer_30。pyx解釋了這個(gè)過程。在字符串字符中列出了字符。字符串中的索引是圖紙?zhí)?。因此,?”號代表數(shù)字11,“0”代表數(shù)字0。在列表編號中,此編號標(biāo)識Tupel具有寬度信息和像素矩陣?,F(xiàn)在,它被逐行逐列分散,當(dāng)找到1時(shí)設(shè)置像素。這是隱藏的。只有當(dāng)顯示值為True Has時(shí),整個(gè)緩沖區(qū)才會被發(fā)送到Display。返回值是下一個(gè)自由繪圖位置。
圖12:符號0的矩陣
繪圖位置設(shè)置為0,作為開始信息,我給出了一些“-”符號。然后ESP嘗試聯(lián)系HX711。如果成功,我們喚醒它,用增益128通道A,并看到屬性self中的TARAWALT。是土地。
如果連接不工作,我們在終端中得到一條消息,并在顯示中得到一系列零。
160MHz是ESP8266的最高速度,ESP32也包含240 MHz。
然后進(jìn)入主循環(huán)。我們查看是否按下了Tara鍵,在顯示器上用一系列逗號確認(rèn),并獲得一個(gè)新的Tara值。這個(gè)功能是有用的,因?yàn)榉Q重單元受到溫度漂移和零點(diǎn)可以在任何時(shí)候重新調(diào)整。
輸出的格式字符串由測量值提供。斷開顯示,將繪圖位置刪除為0,用逗號小數(shù)點(diǎn),并將緩沖區(qū)中的字符寫到倒數(shù)第二個(gè)。
隨著最后一個(gè)字符的輸出,緩沖區(qū)內(nèi)容被發(fā)送到顯示器。休息半秒后開始下一輪比賽。
校準(zhǔn)秤
圖13:用于刻度校準(zhǔn)的質(zhì)量塊
你需要一些質(zhì)量片,如果有必要,如果質(zhì)量片沒有校準(zhǔn),還需要一個(gè)廚房或字母秤。在這種情況下,你可以做一層厚厚的堅(jiān)果或螺絲之類的東西。當(dāng)然,在使用前必須用不同的刻度確定質(zhì)量。
圖14:在ESP8266上校準(zhǔn)
現(xiàn)在啟動程序縮放。并在主循環(huán)中中斷Ctrl+C。HX711對象在HX實(shí)例化下,可以從終端控制臺訪問。我們從以下命令開始。
我們從25次單獨(dú)測量的平均值中減去塔拉值。如果天平?jīng)]有加載,結(jié)果應(yīng)該在-50…+50之間。
現(xiàn)在我們把大塊一塊一塊地放在一起,分成幾組,這樣它的壓力就會越來越大。每次我們再次啟動最后一個(gè)命令,并以克為單位寫下質(zhì)量和終端顯示的值。
讓我們在Libre Office Calc或其他程序中輸入,顯示測量曲線以及測定(相關(guān)系數(shù))和公式。
圖15:校準(zhǔn)曲線
相關(guān)系數(shù)R2等于1,這說明了我們測量的精度。我們可以忽略-43的軸截面,…訂單是10萬件。直線的斜率因子1104是我們追求的標(biāo)定因子?,F(xiàn)在將這個(gè)值共享給對象HX。
如果您現(xiàn)在是方法Dimensions() Call up,則值為0.0…應(yīng)該顯示。
佩戴文件hx711.py中的校準(zhǔn)因子,將它們上傳到ESP并啟動程序scale.py new。
如果在戴上重物時(shí)顯示重物,他們就贏了,可以敲打肩膀。
如果顯示的值稍微靠近期望的權(quán)重,您仍然可以對校準(zhǔn)因子值進(jìn)行一些修改。如果你放大它,質(zhì)量值就會下降,反之亦然。
本文編譯自hackster.io