里面包括各個(gè)模塊的電路連接方式,
開(kāi)發(fā)板跟AD轉(zhuǎn)換模塊的連接,
開(kāi)發(fā)板跟液晶顯示屏的連接,
傳感器跟AD模塊的連接,
各個(gè)模塊的原理圖
電子秤的開(kāi)發(fā)代碼
0.png (48.9 KB, 下載次數(shù): 102)
下載附件
2018-9-21 00:56 上傳
0.png (5.81 KB, 下載次數(shù): 104)
下載附件
2018-9-21 00:56 上傳
DIY ARDUINO精密珠寶電子稱
1. 項(xiàng)目介紹:
電子秤從其原理來(lái)講,就是根據(jù)金屬受力以后的微弱形變來(lái)計(jì)算其受力的大小,算是《材料力學(xué)》第一節(jié)實(shí)驗(yàn)課就會(huì)接觸到的內(nèi)容。而測(cè)量金屬的微弱形變最常用的就是應(yīng)變片。在典型的應(yīng)用中,通過(guò)材料表面不同方位,不同角度貼附的應(yīng)變片,就可以測(cè)量出當(dāng)前材料所受到拉彎扭的力。
當(dāng)然,作個(gè)開(kāi)源的電子秤沒(méi)有這么復(fù)雜,一方面有稱重的模塊,另一方面還有稱重專用的AD芯片(hx711),再加上Arduino和對(duì)應(yīng)library庫(kù),很簡(jiǎn)單。
因?yàn)锳D模塊的輸出和重量在模塊量程內(nèi)為線性的關(guān)系,所以基本就是一個(gè)調(diào)整比例系數(shù)和偏移量的問(wèn)題。在類庫(kù)中還對(duì)測(cè)量值進(jìn)行了均值處理,讓輸出更加穩(wěn)定。3kg的模塊,基本可以達(dá)到+/- 0.2g的精度,對(duì)于一般的應(yīng)用是足夠了。而稱重模塊的應(yīng)用也不限于此,用來(lái)進(jìn)行一些對(duì)敲擊力度的測(cè)量,相信也沒(méi)什么問(wèn)題。
科易互動(dòng)機(jī)器人 電子秤組裝手冊(cè)
電子秤的包括亞克力板、Arduino UNO 主板、l602I2C液晶、稱重傳感器、HX711模塊。這些零部件需要按照一定的順序組裝起來(lái),才能實(shí)現(xiàn)電子稱的基本要求。安裝也有一些難度,大家在安裝的時(shí)候一定要注意一些細(xì)節(jié),清楚哪一個(gè)零部件安裝在哪一部分。 我們先把亞克力板上的保護(hù)紙剝?nèi)ィ粍兊魧?shí)在有點(diǎn)難看。在配送的螺絲和銅柱中拿出那三根長(zhǎng)的銅柱安裝在底板最邊的三個(gè)孔上(底板上有七個(gè)螺絲孔),固定后將Arduino UNO 控制板也用螺絲固定在底座上。 2.安裝主要零部件 主要零部件有1602、HX711和稱重傳感器。先將稱重模塊用螺絲固定在中間層的亞克力板上(上面有兩個(gè)方孔),不過(guò),要注意的是,在亞克力和稱重傳感器之間還要墊一塊亞克力板,這一小塊亞克力是必須要放置的,將直接影響電子稱安裝的。
接下來(lái)就把固定好的亞克力連接到底座上:
完成后就把1602液晶和稱重模塊也固定在這塊亞克力上,具體怎么布置就看個(gè)人愛(ài)好了。
電子秤的接線不是很多,按照下表的接線對(duì)應(yīng)關(guān)系連接就可以了:
UNO與1602的接線:
UNO與 HX711接線:
HX711與稱重傳感器: 這里稱重傳感器的接線口是沒(méi)有接好的,所以在接線的時(shí)候需要大家在稱重傳感器上接上杜邦線的母頭,以便與HX711相連接,可以在配送的杜邦線中區(qū)四根剪斷使用。
最后一塊亞克力(只有一個(gè)孔)就是電子秤的托盤(pán),同樣在安裝的時(shí)候需要在稱重模塊和托盤(pán)之間加一塊亞克力,如果此時(shí)亞克力和下面的1602距離太近,還需要加厚亞克力,比如加多一塊紙片。這是防止在托盤(pán)受力時(shí)頂?shù)?602上面,不能有效得到實(shí)際的數(shù)據(jù)。具體需要在理解了電子秤原理的基礎(chǔ)上才能安裝。確定好后打上螺絲固定就完成了!
2. HX711模塊技術(shù)參數(shù):
HX711是一款專為高精度稱重傳感器而設(shè)計(jì)的24位A/D轉(zhuǎn)換器芯片。與同類型其它芯片相比,該芯片集成了包括穩(wěn)壓電源、片內(nèi)時(shí)鐘振蕩器等其它同類型芯片所需要的外圍電路,具有集成度高、響應(yīng)速度快、抗干擾性強(qiáng)等優(yōu)點(diǎn)。降低了電子秤的整機(jī)成本,提高了整機(jī)的性能和可靠性。該芯片與后端MCU芯片的接口和編程非常簡(jiǎn)單,所有控制信號(hào)由管腳驅(qū)動(dòng),無(wú)需對(duì)芯片內(nèi)部的寄存器編程。輸入選擇開(kāi)關(guān)可任意選取通道A或通道B,與其內(nèi)部的低噪聲可編程放大器相連。通道A的可編程增益為128或64,對(duì)應(yīng)的滿額度差分輸入信號(hào)幅值分別為±20mV或±40mV。通道B則為固定的32增益,用于系統(tǒng)參數(shù)檢測(cè)。芯片內(nèi)提供的穩(wěn)壓電源可以直接向外部傳感器和芯片內(nèi)的A/D轉(zhuǎn)換器提供電源,系統(tǒng)板上無(wú)需另外的模擬電源。芯片內(nèi)的時(shí)鐘振蕩器不需要任何外接器件。上電自動(dòng)復(fù)位功能簡(jiǎn)化了開(kāi)機(jī)的初始化過(guò)程。
特點(diǎn):
兩路可選擇差分輸入
片內(nèi)低噪聲可編程放大器,可選增益為64 和128
片內(nèi)穩(wěn)壓電路可直接向外部傳感器和芯片內(nèi)A/D 轉(zhuǎn)換器提供電源
片內(nèi)時(shí)鐘振蕩器無(wú)需任何外接器件,必要時(shí)也可使用外接晶振或時(shí)鐘
上電自動(dòng)復(fù)位電路
簡(jiǎn)單的數(shù)字控制和串口通訊:所有控制由管腳輸入,芯片內(nèi)寄存器無(wú)需編程
可選擇10Hz 或80Hz 的輸出數(shù)據(jù)速率
3. Arduino電子秤的調(diào)試
看一下接線:
1. VCC 可以是 2.6-5.5 中的任意值,因?yàn)槲覀兪褂玫氖?Arduino ,所以直接5V供電,GND 接地。
2. SCK 接 Arduino 的 Pin 9,DT 接 Pin10,這兩個(gè)接腳可以在程序中改變。
3. E+、E-、A+ 和 A- 分別接橋式傳感器的:激勵(lì)電壓正、負(fù),輸出電壓正、負(fù)
(E+ 接紅線;E- 接黑線;A+ 接綠或藍(lán)線;A- 接白線)。
4. B+ 和 B- 接通道B的傳感器,也可以通過(guò)分壓電路接電源,用來(lái)檢測(cè)電源電壓。不用的話最好接GND,不過(guò)我試驗(yàn)不接也沒(méi)問(wèn)題。
在 Arduino 中打開(kāi)示例代碼,可以看到非常簡(jiǎn)單:
#include <HX711.h> // 包含庫(kù)的頭文件
HX711 hx(9, 10); // 數(shù)據(jù)接腳定義
void setup() {
Serial.begin(9600);
}
void loop()
{
double sum = 0; // 為了減小誤差,一次取出10個(gè)值后求平均值。
for (int i = 0; i < 10; i++) // 循環(huán)的越多精度越高,當(dāng)然耗費(fèi)的時(shí)間也越多
sum += hx.read(); // 累加
Serial.println(sum/10); // 求平均值進(jìn)行均差
}
給的示例程序非常簡(jiǎn)單,但是我查看庫(kù)中含有很多示例沒(méi)有給出的函數(shù):HX711(byte sck, byte dout, byte amp = 128, double co = 1); // 定義 sck、dout 接腳,增益倍數(shù)(默認(rèn)128)和修正系數(shù)(默認(rèn)1)
void set_amp(byte amp); // 改變?cè)鲆姹稊?shù)和對(duì)應(yīng)的通道,至少調(diào)用一次 read() 后起作用
bool is_ready(); // 返回 hx711 是否可用,在 read() 函數(shù)中會(huì)被調(diào)用
long read(); // 返回傳感器電壓值,如果 hx711 不可用則程序會(huì)暫停在此函數(shù)
double bias_read(); // 返回:(read() - 偏移值) * 修正系數(shù)
void tare(int t = 10); // 將皮重添加到偏移值,影響每次 read(); 的調(diào)用
void set_co(double co = 1); // 修改修正系數(shù)(默認(rèn)為1)
void set_offset(long offset = 0); // 修改偏移值(默認(rèn)為0)可以看到,HX711還可以使用四參數(shù)方式定義,同時(shí)指定增益倍數(shù)及修正系數(shù)。在程序運(yùn)行中還可以隨時(shí)改變?cè)鲆姹稊?shù),修正系數(shù)以及利用偏移值實(shí)現(xiàn)去皮重等功能,非常實(shí)用。
這里唯一需要解釋的是第一個(gè)函數(shù),HX711 hx(9, 10); // 這樣用說(shuō)明只定義SCK和DOUT接腳,AMP默認(rèn)使用A通道的128位增益,修正系數(shù)默認(rèn)為1;
HX711 hx(9, 10, 64); // 這樣用說(shuō)明定義SCK和DOUT接腳,AMP使用A通道的64增益,修正系數(shù)默認(rèn)為1;
HX711 hx(9, 10, 32, 1.4); // 這樣用說(shuō)明定義SCK和DOUT接腳,AMP使用B通道的32位增益,修正系數(shù)為1.4;
這里有關(guān)通道和增益倍數(shù)的選擇,資料中已經(jīng)提及過(guò),A通道只有128和64位兩種增益倍數(shù),對(duì)應(yīng)滿載電壓為 20mV 和 40mV,B通道只有固定的32位增益倍數(shù),滿載電壓為 80mV,使用時(shí)各個(gè)通道輸入電壓不要超過(guò)對(duì)應(yīng)增益倍數(shù)的滿載電壓。當(dāng)然,程序中額可以隨時(shí)切換增益倍數(shù)和通道,使用set_amp(amp)函數(shù)即可,當(dāng)然,amp 的值只能是 128、64或32。
再?gòu)?qiáng)調(diào)一句,如果增益倍數(shù)選擇32位增益,那么讀出的數(shù)據(jù)就是B通道的。
下面寫(xiě)一個(gè)具體應(yīng)用示例:
我選擇的傳感器參數(shù)如下:
滿量程輸出電壓=激勵(lì)電壓x靈敏度1.0mV/V
例如:供電電壓是5V乘以靈敏度1.0mV/V=滿量程5mV
實(shí)際上我選用的這個(gè)模塊,當(dāng)電源電壓是5V時(shí),供給傳感器的供電電壓是4V,于是我的傳感器滿量程電壓為4mV。
這樣我就完全可以選擇增益倍數(shù)最高的A通道128位增益來(lái)得到最高的精度。
電子稱連接圖示:
圖中紅色的為HX711模塊,右下角為Arduino UNO,吊臂上掛著的就是橋式傳感器(我連接的方式為懸吊式測(cè)拉力值),AD模塊與傳感器間的電線越短越好,過(guò)長(zhǎng)的話會(huì)受到各種干擾,AD模塊與Arduino之間的連線最好也不要超過(guò)30cm,如果必須加長(zhǎng)的話,可以考慮使用帶電磁屏蔽的線以及信號(hào)放大器。
首先使用庫(kù)自帶的例子測(cè)試一下,可以看到懸掛上1kg砝碼以及托盤(pán)等部件后得到的值為:1315588.75
1315597.75
1315607.37
1315606.75
1315604.75
1315589.62
1315579.62
1315594.25
1315588.75
1315580.25
1315589.00
1315584.25
1315605.50
1315596.12
1315592.25
1315607.75
1315585.75
1315582.87
1315568.75
1315574.75
1315578.00
1315583.12
1315604.62
1315573.50
1315584.25
去掉一個(gè)500g砝碼后值為:742865.50
742847.87
742869.00
742879.12
742873.68
742858.81
742867.81
742843.37
742862.18
742844.87
742856.50
742834.31
742831.31
742825.12
742842.31
742821.31
742816.12
742846.00
742844.00
742826.87
742818.12
742812.87
742807.18
742835.00
可以粗略的計(jì)算:
1315500 - 742800 = 572700
所以修正系數(shù)大概為: 500 / 572700 = 0.00087305
那么程序就可以寫(xiě)成(這時(shí)可以適當(dāng)?shù)臏p小些讀取速度,增加個(gè)delay,比如讓程序半分鐘一讀。
#include <HX711.h>
HX711 hx(9, 10, 128, 0.00087305);
void setup() {
Serial.begin(9600);
}
void loop() {
delay(500);
double sum = 0;
for (int i = 0; i < 10; i++)
sum += hx.read();
Serial.println(sum/10);
}
編譯寫(xiě)入Arduino后,將砝碼全部取下,僅保留稱體,得到結(jié)果是:169640.70
169632.59
169632.90
169640.90
169632.79
169623.59
169649.79
169610.40
169615.20
169659.40
169619.90
169624.79
169614.79
169624.29
169617.79
169629.20
169604.00
169617.50
169628.20
169589.40
169602.29
169598.40
169596.40
169604.00
169612.40
169592.20
說(shuō)明偏移值近似為 169600,那么我們?cè)趕etup中調(diào)用偏移值的函數(shù)(使用bias_read()讀取帶修正系數(shù)及偏移值的讀數(shù),與read()對(duì)比作參考):
- #include <HX711.h>
- HX711 hx(9, 10, 128, 0.00087305);
- void setup() {
- Serial.begin(9600);
- hx.set_offset(169600);
- }
- void loop() {
- delay(500);
- double sum0 = 0;
- double sum1 = 0;
- for (int i = 0; i < 10; i++) {
- sum0 += hx.read();
- sum1 += hx.bias_read();
- }
- Serial.print(sum0/10);
- Serial.print(" ");
- Serial.println(sum1/10);
- }
復(fù)制代碼
這時(shí)讀出的數(shù)據(jù)變?yōu)椋?br />
169615.20 0.01
169616.70 0.02
169613.40 0.02
169636.50 0.03
169620.70 0.02
169638.09 0.04
169625.29 0.02
169620.50 0.02
169612.29 0.01
169609.79 0.01
169624.40 0.02
169625.20 0.02
169630.00 0.03
169628.29 0.03
169606.29 0.00
169617.79 0.02
169637.90 0.03
169603.70 0.00
169605.29 0.01
169636.50 0.03
然后再放上500g砝碼查看一下數(shù)據(jù):
742492.68 500.16
742499.81 500.17
742503.81 500.17
742505.18 500.18
742507.18 500.17
742499.31 500.17
742499.50 500.17
742512.37 500.18
742521.87 500.19
742497.87 500.17
742518.12 500.18
742518.81 500.18
742520.87 500.19
742520.68 500.19
742530.18 500.20
742532.87 500.20
742543.00 500.20
742540.12 500.21
742517.00 500.19
再放上一個(gè)500g砝碼試試:1315286.75 1000.25
1315304.62 1000.25
1315296.62 1000.25
1315302.25 1000.26
1315302.12 1000.26
1315294.25 1000.25
1315310.00 1000.26
1315277.37 1000.24
1315283.75 1000.24
1315280.25 1000.23
1315286.75 1000.24
1315293.25 1000.25
1315309.87 1000.26
1315299.50 1000.25
1315307.12 1000.26
1315304.50 1000.25
1315301.50 1000.25
1315296.75 1000.25
1315284.50 1000.23
1315284.37 1000.24
1315308.75 1000.26
1315291.62 1000.25
1315312.75 1000.26
1315312.25 1000.26
可以看到第一位小數(shù)發(fā)生了大概0.2的變化,這說(shuō)明我們粗略取的修正系數(shù)還不夠精確,但是完全符合1g精度的要求。
接下來(lái)就是完善程序,增加去皮重的功能了,在Arduino上接一個(gè)按鈕,為了阻止電磁干擾發(fā)生誤判斷,我采用了常輸出高電平的按鈕,當(dāng)按下按鈕的時(shí)候輸出低電平,按鈕接在 4 號(hào)口上:#include <HX711.h>
- HX711 hx(9, 10, 128, 0.00087305);
- void setup() {
- Serial.begin(9600);
- hx.set_offset(169600);
- }
- void loop() {
- if(digitalRead(4) == LOW) hx.tare();
- double sum0 = 0;
- double sum1 = 0;
- for (int i = 0; i < 10; i++) {
- sum0 += hx.read();
- sum1 += hx.bias_read();
- }
- Serial.print(sum0/10);
- Serial.print(" ");
- Serial.println(sum1/10);
- }
復(fù)制代碼
這樣每次按下按鈕的時(shí)候就可以去皮重了。
再來(lái)一個(gè)加了1602液晶的代碼
- #include <HX711.h>
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- HX711 hx(9, 10, 128, 0.00127551);
- LiquidCrystal_I2C lcd(0x27,16,2);
- void setup() {
- Serial.begin(9600);
- hx.set_offset(41562);
- lcd.init(); // initialize the lcd
- lcd.backlight();
- lcd.begin(16,2);
- }
- void loop() {
- delay(500);
- double sum0 = 0;
- double sum1 = 0;
- for (int i = 0; i < 10; i++) {
- sum0 += hx.read();
- sum1 += hx.bias_read();
- }
- lcd.clear();
- lcd.setCursor(2,0);
- lcd.print("keyes-scale");
- lcd.setCursor(5, 1);
- lcd.print(sum1/10);
- lcd.print("g");
- delay(10);
- }
復(fù)制代碼 由于溫度, 環(huán)境 ,線材 ,等等因素的影響,實(shí)際的誤差+-0.5克左右。
全部資料51hei下載地址:
KT0015 DIY ARDUINO精密珠寶電子秤HX711稱重傳感器專用AD模塊 稱重傳感器 迷你支架.rar
(10.29 MB, 下載次數(shù): 237)
2018-9-20 20:17 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|