- Робота зважувальної машини Arduino
- Компоненти, необхідні для зважувальних машин на основі Arduino
- Зважувальна машина на основі Arduino - принципова схема
- Створення ланцюга на пунктирному перфборді
- Створення корпусу для зважувальної машини на основі Arduino
- Зважувальна машина Arduino - код
Цифрові ваги навантаження - ще одне диво сучасної інженерії та дизайну. Так, ми говоримо про ваги, які ми часто бачимо у більшості продуктових магазинів та інших місцях, але чи задумувались ви коли-небудь, як працює вагова вага? Щоб відповісти на це питання, у цьому проекті ми збираємось поглянути на тензодатчик та його роботу. Нарешті, ми побудуємо портативний ваговий вантаж на основі Arduino з датчиком ваги HX711, який може вимірювати вагу до 10 кг.
Ця зважувальна машина ідеально підходить для місцевих магазинів, де вони пакують речі великою кількістю. Як і комерційні продукти, наша вагова шкала матиме нульову кнопку, яка обнуляє вагу. Крім того, у нього є можливість встановити вагу для вимірювання, коли вимірювальна вага досягає заданої ваги, зуммер подає звуковий сигнал швидко і зупиняється, коли встановлена вага дорівнює вимірювальній вазі. Таким чином, користувач може запакувати його, просто почувши звук, і не потрібно дивитись на дисплей. Оскільки це дуже простий проект, ми будуватимемо його дуже легко, використовуючи такі компоненти, як Arduino та тензодатчик. Отже, без подальших зволікань, давайте прямо в це вступимо.
У попередній статті ми створили такі проекти, як датчик ваги на основі Raspberry Pi та розумний контейнер IoT із сповіщенням електронною поштою та веб-моніторингом, використовуючи популярний модуль підсилювача комірки навантаження HX711. Отже, перевірте це, якщо це ваша вимога.
Робота зважувальної машини Arduino
Основний компонент цього проекту є осередком навантаження і HX711 навантаження модуль підсилювача осередки. Як бачите, одна сторона позначена десятьма кілограмами. Крім того, ви можете помітити якийсь білий захисний клей над тензодатчиком, і виходять чотири різних кольори проводів, які розкриють секрет під білим захисним клеєм та функцію цих чотирьох кольорових проводів далі в статті.
Тензодатчик - це перетворювач, який перетворює силу або тиск на електричну потужність. Він має дві сторони, скажімо праву та ліву сторони, і він виготовлений з алюмінієвих блоків. Як бачите, в середині матеріал стоншується, накладаючи великий отвір. Ось чому саме ця точка зазнає деформації, якщо навантажувач розміщений на боці кріплення. А тепер уявіть, що права сторона комірки прикріплена до основи, а ліва частина знаходиться там, де розміщений вантаж, така конфігурація деформує тензодатчик тензодатчика через гігантський отвір посередині.
Коли вантаж розміщується на вантажному боці тензодатчика, верхня частина зазнає натягу, а нижня - стиснення. Ось чому алюмінієвий брусок згинається вниз з лівого боку. Якщо ми виміряємо цю деформацію, ми зможемо виміряти силу, яка була прикладена до алюмінієвого блоку, і це саме те, що ми будемо робити.
Тепер залишається питання, що всередині білого захисного клею? Всередині цього захисного клею ми знайдемо дуже тонкий еластичний компонент, який називається тензодатчиком. Тензодатчик - це компонент, який використовується для вимірювання деформації. Якщо ми уважніше розглянемо цей компонент, ми побачимо дві з'єднувальні колодки, і тоді у нас буде провідний малюнок дроту з повторюваними відхиленнями. Цей провідний провід має певний опір. Коли ми його згинаємо, значення опору зміниться? Отже, одна сторона тензорезистора встановлена і закріплена на місці, якщо ми помістимо гирю з іншого боку алюмінієвої планки, це змусить тензорезистор зігнутися, що призведе до зміни опору. Як це відбувається насправді? Провідна схема тензорезистора виконана з міді, цей провід матиме певну площу та довжину, тому ці два агрегати надаватимуть опір дроту. Опір дроту протистоїть потоку струму. Тепер очевидно, що якщо площа цього дроту зменшиться,менше електронів могло пропускати, що означає менший струм. Тепер, якщо ми збільшимо площу, це збільшить опір провідника. Якщо до цього дроту прикласти деяку силу, це розтягне область, і вона одночасно стане меншою, опір зростає. Але ця варіація опору дуже низька. Якщо розтягнути тензометр, опір зросте, а якщо стиснути, опір стане меншим. Щоб виміряти силу, нам потрібно виміряти опір. Вимірювати опір безпосередньо не завжди практично, оскільки зміна дуже мала. Тому замість вимірювання опору ми можемо легко вимірювати напруги. Отже, у цьому випадку нам потрібно перетворити вихідний показник датчика зі значень опору на значення напруги.Якщо до цього дроту прикласти деяку силу, це розтягне область, і вона одночасно стане меншою, опір зростає. Але ця варіація опору дуже низька. Якщо розтягнути тензометр, опір зросте, а якщо стиснути, опір стане меншим. Щоб виміряти силу, нам потрібно виміряти опір. Вимірювати опір безпосередньо не завжди практично, оскільки зміна дуже мала. Тому замість вимірювання опору ми можемо легко вимірювати напруги. Отже, у цьому випадку нам потрібно перетворити вихідний показник датчика зі значень опору на значення напруги.Якщо до цього дроту прикласти деяку силу, це розтягне область, і вона одночасно стане меншою, опір зростає. Але ця варіація опору дуже низька. Якщо розтягнути тензометр, опір зросте, а якщо стиснути, опір стане меншим. Щоб виміряти силу, нам потрібно виміряти опір. Вимірювати опір безпосередньо не завжди практично, оскільки зміна дуже мала. Тому замість вимірювання опору ми можемо легко вимірювати напруги. Отже, у цьому випадку нам потрібно перетворити вихідний показник датчика зі значень опору на значення напруги.опір стане нижчим. Щоб виміряти силу, нам потрібно виміряти опір. Вимірювати опір безпосередньо не завжди практично, оскільки зміна дуже мала. Тому замість вимірювання опору ми можемо легко вимірювати напруги. Отже, у цьому випадку нам потрібно перетворити вихідний показник датчика зі значень опору на значення напруги.опір стане нижчим. Щоб виміряти силу, нам потрібно виміряти опір. Вимірювати опір безпосередньо не завжди практично, оскільки зміна дуже мала. Тому замість вимірювання опору ми можемо легко вимірювати напруги. Отже, у цьому випадку нам потрібно перетворити вихідний показник датчика зі значень опору на значення напруги.
Ми можемо зробити це за допомогою мосту Уїтстоун. Ми розміщуємо тензометр у мосту Уїтстоуна, якщо міст збалансований, напруга в середній точці має бути нульовим (раніше ми побудували проект, де ми описали, як працює міст Уітстона, ви можете перевірити це, якщо хочете знати більше про тему). Коли тензодатчик змінить свій опір, він розбалансує міст, і напруга також зміниться. Отже, ось як міст Уітстона перетворює зміни опору на значення напруги.
Але ця зміна напруги все ще дуже мала, тому для її збільшення нам потрібно використовувати модуль HX711. HX711 - це 24-бітний диференціальний АЦП, таким чином, ми могли вимірювати дуже незначні зміни напруги. це дасть значення від 0 до 2 експоненціально 24.
Компоненти, необхідні для зважувальних машин на основі Arduino
Щоб зробити цей проект максимально простим, ми використали дуже загальні компоненти, які ви можете знайти в будь-якому місцевому магазині хобі. Зображення нижче дасть вам уявлення про компоненти. Крім того, ми маємо Перелік матеріалів (BOM), перелічений нижче.
- Тензодатчик (ми використовуємо тензодатчик 10 кг)
- Модуль підсилювача HX 711
- Arduino Nano
- I2C LCD 16X2 - сумісний з I2C
- 1k резистор -2 No
- Світлодіоди -2Ні
- Зумер
- Звичайна друкована плата
- 7,4 В акумулятор (якщо ви хочете, щоб він був портативним)
- LM7805 Регулятор напруги
Зважувальна машина на основі Arduino - принципова схема
Навантажувальна комірка має чотири дроти: червоний, чорний, зелений та білий. Цей колір може відрізнятися залежно від виробників, тому краще звернутися до специфікації. Підключіть червоний до E + плати HX711, підключіть чорний до E-, підключіть білий до A +, а зелений підключіть до A-, Dout, а годинник плати - до D4 і D5 відповідно. Підключіть один кінець кнопок до D3, D8, D9 та інші кінці до землі. У нас є I2C LCD, тож підключіть SDA до A4 та SCL до A5. Підключіть землю РК, HX711 та Arduino до землі, а також підключіть VCC до 5Vpin Arduino. Всі модулі працюють від напруги 5 В, тому ми додали регулятор напруги LM7805. Якщо ви не хочете, щоб він був портативним, ви можете безпосередньо живити Arduino за допомогою кабелю USB.
Створення ланцюга на пунктирному перфборді
Ми спаяли всі компоненти на загальній пунктирній перфборді. Ми використовували жіночі роз'єми для пайки Arduino і АЦП з друкованою платою, а також використовували дроти для підключення всіх кнопок і світлодіодів. Після закінчення всього процесу пайки ми переконалися, що з LM7805 виходить належне 5 В. Нарешті, ми поставили перемикач на ввімкнення / вимкнення ланцюга. Коли ми все закінчили, це виглядало як на малюнку нижче.
Створення корпусу для зважувальної машини на основі Arduino
Як бачите, в тензодатчику є кілька гвинтових різьб, тому ми могли б встановити його на базовій пластині. Для основи нашої шкали ми будемо використовувати ПВХ-дошку, для цього ми спочатку вирізали квадрат 20 * 20 см і чотири прямокутники 20 * 5 з ПВХ-дошки. Потім за допомогою твердого клею ми склеїли кожен шматочок і зробили невеликий корпус.
Пам’ятайте, ми не зафіксували одну сторону, тому що нам потрібно розмістити на ній кнопки, світлодіоди та РК-дисплей. Потім ми використовували пластикову дошку для верхньої частини шкали. Перш ніж зробити це налаштування постійним, нам потрібно переконатися, що у нас достатньо місця від землі до тензодатчика, щоб він міг згинатися, тому ми помістили гвинт і гайки між тензодатчиком і основою, а також додали кілька пластикових розпірок між тензодатчиком і верхньою частиною. ми використали круглий пластиковий аркуш як головний розум балансу.
Потім ми розмістили РК-дисплей, світлодіоди та кнопки на передній панелі та все, що з’єднано довгим ізольованим проводом. Після того, як ми закінчили процес проводки, ми приклеїли передню панель до основної основи з певним нахилом, тому ми можемо легко читати значення з РК-дисплея. нарешті, ми прикріпили головний вимикач збоку від ваги, і все. Ось як ми зробили тіло для вагової ваги.
Ви можете проектувати за своїми ідеями, але пам’ятайте розміщувати навантажувальну комірку, як на зображенні.
Зважувальна машина Arduino - код
Оскільки ми закінчили процес побудови для нашого цифрового масштабу, ми можемо перейти до частини програмування. Для зручності програмування ми будемо використовувати бібліотеку HX711, бібліотеку EEPROM та бібліотеку LiquidCrystal. Ви можете завантажити бібліотеку HX711 з офіційного сховища GitHub або перейти до інструментів > включити бібліотеку > керувати бібліотекою, а потім шукати бібліотеку за ключовим словом HX711, після завантаження бібліотеки встановити її в Arduino ide.
Спочатку нам потрібно відкалібрувати навантажувач і зберегти це значення на EEPROM, для цього перейдіть до файлу> приклади> HX 711_ADC, а потім виберіть код калібрування. Перш ніж завантажувати код, поставте вагу на стабільну площину. Потім завантажте код в Arduino і відкрийте послідовний монітор. Потім змініть швидкість передачі на 572600. Тепер монітор попросить взяти вагу, для цього нам потрібно натиснути t і ввести.
Тепер нам потрібно поставити на вагу відому вагу, у моєму випадку це 194 г. Після розміщення відомої ваги наберіть вагу на послідовному моніторі та натисніть Enter.
Тепер послідовний монітор запитує вас, чи хочете ви зберегти значення в EEPROM, чи ні, тому введіть Y, вибравши так. Тепер ми можемо побачити вагу на послідовному моніторі.
Основний код цього проекту, який ми розробили на прикладі ескізу бібліотеки HX711. Ви можете завантажити код цього проекту знизу.
Спочатку в розділі кодування ми додали всі три бібліотеки. Бібліотека HX711 призначена для прийому значень тензодатчиків. EEPROM - це вбудована бібліотека Arduino ide, яка використовується для зберігання значень в EEPROM, а бібліотека LiquidCrystal - для РК-модуля l2C.
#включати
Потім визначаються цілі числа для різних контактів і присвоюються значення. Функція навантажувача HX711_ADC призначена для встановлення штифта Dout і годинника.
const int HX711_dout = 4; const int HX711_sck = 5; int tpin = 3; HX711_ADC LoadCell (HX711_dout, HX711_sck); const int calVal_eepromAdress = 0; довгий t; const int Up_buttonPin = 9; const int Down_buttonPin = 8; float buttonPushCounter = 0; float up_buttonState = 0; float up_lastButtonState = 0; float down_buttonState = 0; float down_lastButtonState = 0;
Спочатку в розділі налаштування ми запустили послідовний монітор, це лише для налагодження. Потім ми визначили режими штифтів, всі кнопки визначаються як вхід. За допомогою функції Arduino PULL UP ми встановлюємо висновки на логічний максимум, як правило. Отже, ми не хочемо використовувати для цього ніякі зовнішні резистори.
pinMode (tpin, INPUT_PULLUP); pinMode (6, ВИХІД); pinMode (12, ВИХІД); pinMode (Up_buttonPin, INPUT_PULLUP); pinMode (Down_buttonPin, INPUT_PULLUP);
Наступні рядки коду призначені для налаштування I2C LCD. Спочатку ми показали привітальний текст за допомогою функції LCD.print () , через дві секунди очистили дисплей за допомогою lcd.clear () . Тобто спочатку на дисплеї відображається ARDUINO BALANCE як вітальний текст, а через дві секунди він очиститься та відобразить вимірювальні ваги.
lcd.init (); lcd.backlight (); lcd.setCursor (0, 0); lcd.print ("ARDUINO BALANCE"); lcd.setCursor (0, 1); lcd.print ("давайте виміряємо"); затримка (2000); lcd.clear ();
Потім почали читати значення з loadcell за допомогою функції loadCell.begin () , після чого ми читаємо EEPROM для відкаліброваних значень, робимо це за допомогою функції EEPROM.get () . Тобто, ми вже зберегли значення за допомогою ескізу калібрування в адресі EEPROM, ми просто беремо це значення.
LoadCell.begin (); EEPROM.get (calVal_eepromAdress, calibrationValue);
Спочатку в розділі циклу ми перевіряємо, чи доступні будь-які дані з навантажувальної комірки за допомогою LoadCell.update (), якщо такі є, ми зчитуємо та зберігаємо ці дані, для цього використовуємо LoadCell.getData () . Далі нам потрібно відобразити збережене значення в РК-дисплеї. Для цього ми використали функцію LCD.print () . також, ми друкуємо встановлену вагу. Встановлена вага встановлюється за допомогою лічильника кнопок. Це пояснено в останньому розділі.
якщо (LoadCell.update ()) newDataReady = true; if (newDataReady) { if (millis ()> t + serialPrintInterval) { float i = LoadCell.getData (); lcd.setCursor (0, 0); lcd.print ("встановити wei:"); lcd.setCursor (9, 0); lcd.print (buttonPushCounter); lcd.setCursor (14, 0); lcd.print ("GM"); lcd.setCursor (0, 1); lcd.print ("вага:"); lcd.setCursor (9, 1); lcd.print (i); lcd.setCursor (14, 1); lcd.print ("GM");
Далі ми встановлюємо значення тари, для цього, по-перше, ми зчитуємо стан кнопки тари за допомогою функції digitalRead () , якщо стан низький, ми таруємо цю вагу до нуля. Тарна функція цієї вагової шкали полягає у приведенні показань до нуля. Наприклад, якщо ми маємо миску, в яку завантажуються речі, то чиста вага буде вагою миски + вагою речей. Якщо перед завантаженням речей натиснути кнопку тари з чашею на вантажній камері, вага кошика буде заперечена, і ми можемо виміряти вагу речей самостійно.
if (digitalRead (tpin) == LOW) { LoadCell.tareNoDelay ();
Тепер нам потрібно встановити умови для різних показників, таких як встановлення затримки зумера та стану світлодіода. Ми зробили це, використовуючи умови if , загалом маємо три умови. Спочатку ми обчислюємо різницю між встановленою вагою та вимірювальною вагою, потім зберігаємо це значення у змінній k.
float k = buttonPushCounter-i;
1. Якщо різниця між встановленою вагою та вимірювальною вагою більша або дорівнює 50 г, зумер подає звуковий сигнал із затримкою у 200 мілісекунд (повільно).
if (k> = 50) { digitalWrite (6, HIGH); затримка (200); digitalWrite (6, LOW); затримка (200); }
2. Якщо різниця між встановленою вагою та вимірювальною вагою менша ніж 50 та перевищує 1 грам, зумер подає звуковий сигнал із затримкою у 50 мілісекунд (швидше).
if (k <50 && k> 1) { digitalWrite (6, HIGH); затримка (50); digitalWrite (6, LOW); затримка (50); }
3. Коли вимірювальна вага дорівнює або перевищує встановлене значення, це увімкне зелений світлодіод та вимкне зумер та червоний світлодіод.
if (i> = buttonPushCounter) { digitalWrite (6, LOW); digitalWrite (12, HIGH); }
У нас є ще дві функції порожнечі () для встановлення заданої ваги (для підрахунку натискання кнопки).
Функція, що збільшує встановлене значення на 10 г / м для кожного натискання. Це робиться за допомогою функції digitalRead Arduino, якщо штифт низький, це означає, що кнопка натиснута, і це збільшить значення на 10 г / м.
up_buttonState = digitalRead (Up_buttonPin); if (up_buttonState! = up_lastButtonState) { if (up_buttonState == LOW) { bPress = true; buttonPushCounter = buttonPushCounter + 10; }
Так само, перевірка призначена для зменшення встановленого значення на 10 г для кожного натискання.
down_buttonState = digitalRead (Down_buttonPin); if (down_buttonState! = down_lastButtonState) { if (down_buttonState == LOW) { bPress = true; buttonPushCounter = buttonPushCounter - 10; }
Це закінчує програмування.
Ця електронна вага на базі Arduino ідеально підходить для вимірювання ваг до 10 кг (ми можемо збільшити цю межу, використовуючи більш високу номінальну навантажувальну комірку). Це на 99% точніше до початкових вимірювань.
Якщо у вас є які-небудь запитання щодо цієї схеми машини для балансування ваги на основі Arduino, будь ласка, опублікуйте її у розділі коментарів, дякую!