里面包括各個模塊的電路連接方式,
開發板跟AD轉換模塊的連接,
開發板跟液晶顯示屏的連接,
傳感器跟AD模塊的連接,
各個模塊的原理圖
電子秤的開發代碼
0.png (48.9 KB, 下載次數: 102)
下載附件
2018-9-21 00:56 上傳
0.png (5.81 KB, 下載次數: 104)
下載附件
2018-9-21 00:56 上傳
DIY ARDUINO精密珠寶電子稱
1. 項目介紹:
電子秤從其原理來講,就是根據金屬受力以后的微弱形變來計算其受力的大小,算是《材料力學》第一節實驗課就會接觸到的內容。而測量金屬的微弱形變最常用的就是應變片。在典型的應用中,通過材料表面不同方位,不同角度貼附的應變片,就可以測量出當前材料所受到拉彎扭的力。
當然,作個開源的電子秤沒有這么復雜,一方面有稱重的模塊,另一方面還有稱重專用的AD芯片(hx711),再加上Arduino和對應library庫,很簡單。
因為AD模塊的輸出和重量在模塊量程內為線性的關系,所以基本就是一個調整比例系數和偏移量的問題。在類庫中還對測量值進行了均值處理,讓輸出更加穩定。3kg的模塊,基本可以達到+/- 0.2g的精度,對于一般的應用是足夠了。而稱重模塊的應用也不限于此,用來進行一些對敲擊力度的測量,相信也沒什么問題。
科易互動機器人 電子秤組裝手冊
電子秤的包括亞克力板、Arduino UNO 主板、l602I2C液晶、稱重傳感器、HX711模塊。這些零部件需要按照一定的順序組裝起來,才能實現電子稱的基本要求。安裝也有一些難度,大家在安裝的時候一定要注意一些細節,清楚哪一個零部件安裝在哪一部分。 我們先把亞克力板上的保護紙剝去,不剝掉實在有點難看。在配送的螺絲和銅柱中拿出那三根長的銅柱安裝在底板最邊的三個孔上(底板上有七個螺絲孔),固定后將Arduino UNO 控制板也用螺絲固定在底座上。 2.安裝主要零部件 主要零部件有1602、HX711和稱重傳感器。先將稱重模塊用螺絲固定在中間層的亞克力板上(上面有兩個方孔),不過,要注意的是,在亞克力和稱重傳感器之間還要墊一塊亞克力板,這一小塊亞克力是必須要放置的,將直接影響電子稱安裝的。
接下來就把固定好的亞克力連接到底座上:
完成后就把1602液晶和稱重模塊也固定在這塊亞克力上,具體怎么布置就看個人愛好了。
電子秤的接線不是很多,按照下表的接線對應關系連接就可以了:
UNO與1602的接線:
UNO與 HX711接線:
HX711與稱重傳感器: 這里稱重傳感器的接線口是沒有接好的,所以在接線的時候需要大家在稱重傳感器上接上杜邦線的母頭,以便與HX711相連接,可以在配送的杜邦線中區四根剪斷使用。
最后一塊亞克力(只有一個孔)就是電子秤的托盤,同樣在安裝的時候需要在稱重模塊和托盤之間加一塊亞克力,如果此時亞克力和下面的1602距離太近,還需要加厚亞克力,比如加多一塊紙片。這是防止在托盤受力時頂到1602上面,不能有效得到實際的數據。具體需要在理解了電子秤原理的基礎上才能安裝。確定好后打上螺絲固定就完成了!!
2. HX711模塊技術參數:
HX711是一款專為高精度稱重傳感器而設計的24位A/D轉換器芯片。與同類型其它芯片相比,該芯片集成了包括穩壓電源、片內時鐘振蕩器等其它同類型芯片所需要的外圍電路,具有集成度高、響應速度快、抗干擾性強等優點。降低了電子秤的整機成本,提高了整機的性能和可靠性。該芯片與后端MCU芯片的接口和編程非常簡單,所有控制信號由管腳驅動,無需對芯片內部的寄存器編程。輸入選擇開關可任意選取通道A或通道B,與其內部的低噪聲可編程放大器相連。通道A的可編程增益為128或64,對應的滿額度差分輸入信號幅值分別為±20mV或±40mV。通道B則為固定的32增益,用于系統參數檢測。芯片內提供的穩壓電源可以直接向外部傳感器和芯片內的A/D轉換器提供電源,系統板上無需另外的模擬電源。芯片內的時鐘振蕩器不需要任何外接器件。上電自動復位功能簡化了開機的初始化過程。
特點:
兩路可選擇差分輸入
片內低噪聲可編程放大器,可選增益為64 和128
片內穩壓電路可直接向外部傳感器和芯片內A/D 轉換器提供電源
片內時鐘振蕩器無需任何外接器件,必要時也可使用外接晶振或時鐘
上電自動復位電路
簡單的數字控制和串口通訊:所有控制由管腳輸入,芯片內寄存器無需編程
可選擇10Hz 或80Hz 的輸出數據速率
3. Arduino電子秤的調試
看一下接線:
1. VCC 可以是 2.6-5.5 中的任意值,因為我們使用的是 Arduino ,所以直接5V供電,GND 接地。
2. SCK 接 Arduino 的 Pin 9,DT 接 Pin10,這兩個接腳可以在程序中改變。
3. E+、E-、A+ 和 A- 分別接橋式傳感器的:激勵電壓正、負,輸出電壓正、負
(E+ 接紅線;E- 接黑線;A+ 接綠或藍線;A- 接白線)。
4. B+ 和 B- 接通道B的傳感器,也可以通過分壓電路接電源,用來檢測電源電壓。不用的話最好接GND,不過我試驗不接也沒問題。
在 Arduino 中打開示例代碼,可以看到非常簡單:
#include <HX711.h> // 包含庫的頭文件
HX711 hx(9, 10); // 數據接腳定義
void setup() {
Serial.begin(9600);
}
void loop()
{
double sum = 0; // 為了減小誤差,一次取出10個值后求平均值。
for (int i = 0; i < 10; i++) // 循環的越多精度越高,當然耗費的時間也越多
sum += hx.read(); // 累加
Serial.println(sum/10); // 求平均值進行均差
}
給的示例程序非常簡單,但是我查看庫中含有很多示例沒有給出的函數:HX711(byte sck, byte dout, byte amp = 128, double co = 1); // 定義 sck、dout 接腳,增益倍數(默認128)和修正系數(默認1)
void set_amp(byte amp); // 改變增益倍數和對應的通道,至少調用一次 read() 后起作用
bool is_ready(); // 返回 hx711 是否可用,在 read() 函數中會被調用
long read(); // 返回傳感器電壓值,如果 hx711 不可用則程序會暫停在此函數
double bias_read(); // 返回:(read() - 偏移值) * 修正系數
void tare(int t = 10); // 將皮重添加到偏移值,影響每次 read(); 的調用
void set_co(double co = 1); // 修改修正系數(默認為1)
void set_offset(long offset = 0); // 修改偏移值(默認為0)可以看到,HX711還可以使用四參數方式定義,同時指定增益倍數及修正系數。在程序運行中還可以隨時改變增益倍數,修正系數以及利用偏移值實現去皮重等功能,非常實用。
這里唯一需要解釋的是第一個函數,HX711 hx(9, 10); // 這樣用說明只定義SCK和DOUT接腳,AMP默認使用A通道的128位增益,修正系數默認為1;
HX711 hx(9, 10, 64); // 這樣用說明定義SCK和DOUT接腳,AMP使用A通道的64增益,修正系數默認為1;
HX711 hx(9, 10, 32, 1.4); // 這樣用說明定義SCK和DOUT接腳,AMP使用B通道的32位增益,修正系數為1.4;
這里有關通道和增益倍數的選擇,資料中已經提及過,A通道只有128和64位兩種增益倍數,對應滿載電壓為 20mV 和 40mV,B通道只有固定的32位增益倍數,滿載電壓為 80mV,使用時各個通道輸入電壓不要超過對應增益倍數的滿載電壓。當然,程序中額可以隨時切換增益倍數和通道,使用set_amp(amp)函數即可,當然,amp 的值只能是 128、64或32。
再強調一句,如果增益倍數選擇32位增益,那么讀出的數據就是B通道的。
下面寫一個具體應用示例:
我選擇的傳感器參數如下:
滿量程輸出電壓=激勵電壓x靈敏度1.0mV/V
例如:供電電壓是5V乘以靈敏度1.0mV/V=滿量程5mV
實際上我選用的這個模塊,當電源電壓是5V時,供給傳感器的供電電壓是4V,于是我的傳感器滿量程電壓為4mV。
這樣我就完全可以選擇增益倍數最高的A通道128位增益來得到最高的精度。
電子稱連接圖示:
圖中紅色的為HX711模塊,右下角為Arduino UNO,吊臂上掛著的就是橋式傳感器(我連接的方式為懸吊式測拉力值),AD模塊與傳感器間的電線越短越好,過長的話會受到各種干擾,AD模塊與Arduino之間的連線最好也不要超過30cm,如果必須加長的話,可以考慮使用帶電磁屏蔽的線以及信號放大器。
首先使用庫自帶的例子測試一下,可以看到懸掛上1kg砝碼以及托盤等部件后得到的值為: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
去掉一個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
可以粗略的計算:
1315500 - 742800 = 572700
所以修正系數大概為: 500 / 572700 = 0.00087305
那么程序就可以寫成(這時可以適當的減小些讀取速度,增加個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);
}
編譯寫入Arduino后,將砝碼全部取下,僅保留稱體,得到結果是: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
說明偏移值近似為 169600,那么我們在setup中調用偏移值的函數(使用bias_read()讀取帶修正系數及偏移值的讀數,與read()對比作參考):
- #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);
- }
復制代碼
這時讀出的數據變為:
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砝碼查看一下數據:
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
再放上一個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
可以看到第一位小數發生了大概0.2的變化,這說明我們粗略取的修正系數還不夠精確,但是完全符合1g精度的要求。
接下來就是完善程序,增加去皮重的功能了,在Arduino上接一個按鈕,為了阻止電磁干擾發生誤判斷,我采用了常輸出高電平的按鈕,當按下按鈕的時候輸出低電平,按鈕接在 4 號口上:#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);
- }
復制代碼
這樣每次按下按鈕的時候就可以去皮重了。
再來一個加了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);
- }
復制代碼 由于溫度, 環境 ,線材 ,等等因素的影響,實際的誤差+-0.5克左右。
全部資料51hei下載地址:
KT0015 DIY ARDUINO精密珠寶電子秤HX711稱重傳感器專用AD模塊 稱重傳感器 迷你支架.rar
(10.29 MB, 下載次數: 237)
2018-9-20 20:17 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|