ساخت ترازو با آردوینو
نقطه شروع این مقاله، پروژهای بود که در نشریه الکتور چاپشده بود و ساخت یک ترازو با استفاده از یک میکروکنترلر Atmega 328، یک لودسل، یک برد رابط لودسل، یک السیدی و نرمافزار را توضیح داده بود. مقداری هم برش و سوراخکاری چوب موردنیاز بود تا یک ترازوی قابلاستفاده درست شود.
وزن یا جرم؟
در دانش مدرن وزن بهصورت حاصلضرب جرم در مقدار نیروی جاذبه توصیف میشود و ازاینرو وزن یک نیرو است که بهصورت نیوتون بیان میشود و یا در واحد پایه SI بهصورت kg.m.s-2 بیان میگردد. واحد جرم در سیستم SI کیلوگرم است. ترازوی وزنی مقدار وزن را اندازهگیری میکند نه جرم را و اگر بخواهیم دقیقتر صحبت کنیم اینکه ترازو مقدار وزن را با کیلوگرم نشان میدهد چیزی بیمعنی است؛ اما ازآنجاکه نیروی جاذبه برای این منظور در بیشتر مناطق یکسان است، جوامع علمی به ما این اجازه را میدهند که وزن را بهصورت کیلوگرم بیان کنیم.
ازآنجاکه وزن به معنای نیرو است پس میتوان وزن یک جسم را با مشخص کردن مقدار نیرویی که به جسمی دیگر از قبیل فنر یا میله وارد میکند اندازه گرفت. یک فنر بر اثر وزن جسمی دیگر کشیده یا فشرده میشود درحالیکه میله خم میشود. همچنین میتوان وزن یک جسم را با مقدار تعادل نسبت به یک وزن مرجع شناختهشده اندازهگیری کرد.
سنسور کشش
میتوان برای سنجش وزن از نوعی مقاومت متغیر که سنسور کشش نام دارد و برای سنجش تغییر حالتهای مکانیکی مناسب است استفاده کرد. مقدار مقاومت این قطعه تابعی از تنش یا فشردگی مکانیکی است. دستگاه سنسور کشش در سال 1938 بهصورت همزمان در سواحل غربی آمریکا در انستیتو تکنولوژی کالیفرنیا توسط ادگار ای سیمونز (Edgar E. Simmons Jr) و در سواحل شرقی آمریکا در انستیتو تکنولوژی ماساچوست توسط آرتور کلاود روجی (Arthur Claude Ruge) اختراع گردید. این دو نفر نمونه اولیه این دستگاه را باهم به اشتراک گذاشته بودند.
سنسور کشش اولیه شامل یک سیم طولانی و باریک به هم تابیده بود که درواقع یک فویل بود که روی یک برگه منعطف چاپشده بود هنگامیکه دستگاه کشیده میشد، فویل حالت مقاومتی بیشتری پیدا میکرد و هنگامیکه فشرده میشد از مقدار مقاومت فویل کاسته میشد. مقدار تغییر مقاومت خیلی کم بود و برای سنجش مقدار مقاومت بهصورت دقیق میبایست از پل مقاومتی استفاده میشد. برای از بین بردن عامل دما بهتر است که دو سنسور کشش برای یکی از پایههای پل استفاده کنیم. هنگامیکه پایه دیگر پل مقاومتی هم با سنسور کشش ساخته شود مقدار سیگنال خروجی افزایش پیدا میکند. اسم این مدار سنسور کشش پل کامل نام دارد.
سنسور کشش ابزارهایی شکننده هستند و وصل کردن آنها به شیء موردنظر سخت است. ازاینرو اغلب آنها از قبل بر روی یک سطح آماده نصبشدهاند که لودسل نام دارد.
برای ترازوی موردنظر ما از یک لودسل میلهای موازی شکل استفاده میکنیم که 4 سنسور کشش بر روی آن نصبشده و تشکیل یک پل کامل را داده است. یک سر میله بر روی قاب ترازو نصب میشود. شیء ای که میخواهیم وزن کنیم بر روی سر دیگر میله قرار میگیرد تا بهخوبی میله را خم کند. این کار باعث ایجاد عدم تعادل در پل مقاومتی میشود و تفاوت ولتاژ ناشی از این کار در خروجی لودسل ظاهر میشود و میتوان آن را اندازهگیری کرد.
اگرچه ما از یک پل با 4 سنسور کشش استفاده میکنیم ولی بازهم سیگنال خروجی بسیار کوچک است، چیزی در حدود چند ده میلی ولت. درنتیجه ما به یک تقویتکننده نیاز داریم تا سیگنال را بهاندازهای برسانیم که بتوانیم بعداً آن را تبدیل به سیگنال دیجیتال کرده و مورد پردازش قرار دهیم.
ابزار لازم
مدار
حالا که میدانیم ترازوی ما چطور کار میکند بیایید نگاه دقیقتری به شماتیک مدار داشته باشیم. ازآنجاکه لودسلها ابزارهایی نسبتاً عادی و فراگیر هستند، پس تعجبی هم ندارد که مدارهای یکپارچه حرفهای وجود دارد که قادر است خروجی ضعیف لودسل را تقویت کرده و به دیجیتال تبدیل نماید. برای این پروژه ما از ماژول HX711 استفاده کردیم. این ماژول یک مبدل آنالوگ به دیجیتال 24 بیتی برای ترازوهای وزنکشی است و بهصورت برد آماده در بازار وجود دارد که از اینجا هم میتوانید آن را تهیه کنید (پیدا کردن خود آیسی بهتنهایی کار مشکلی است). ماژول مبدل لودسل به قسمت k1 وصل میشود؛ توجه داشته باشید که این کانکتور بهصورت جدا از PCB قرار داشته باشد، چون در غیر این صورت ماژول مبدل در قاب تهیهشده جا نمیشود.
خروجی ماژول مبدل لودسل یک جریان داده از پین 3 و کلاک از پین 2 به برد آردوینو اونو ارسال میکند. میکرو کنترلر موقعیت یک تریمر 15 دوری را میخواند که برای تنظیم دستگاه به کار میرود.
رابط کاربری این دستگاه از یک صفحهنمایش OLED گرافیکی تشکیلشده است که به کانکتور k2 وصل است (از اینجا میتوانید خریداری نمایید). همچنین دو دکمهفشاری S1 (Tare – صفر کردن) و S2 (Hold – نگهداشتن مقدار) نیز وجود دارد که به ترتیب توسط دو مقاومت R1 و R2 پولآپ شدهاند. کانکتور k2 به کمی زاویه نصبشده است تا خوانایی بهتر شود.
نرمافزار
ازآنرو که از آردوینو برای ساخت این ترازو استفاده میکنیم، طرح یا برنامه موردنیاز نسبتاً ساده است.
// This software is made by (c)Elektor Labs #include <U8glib.h> #include "HX711.h" #define DOUT A3 #define CLK A2 HX711 scale(DOUT, CLK); U8GLIB_SSD1306_128X64 u8g(7, 6, 14, 4, 5); //scl,sda,cs(unused),dc,res //variable declaration float calibration_factor = -7050.0; //This value is obtained using the SparkFun_HX711_zeroibration sketch float gram; float ounce; float factor; int button1 = 2; int button2 = 3; int bar = 0; bool button_zero = 0; bool button_hold = 0; uint8_t c[] = //copyright symbol { 0b00000011,0b11100000, 0b00001100,0b00011000, 0b00010000,0b10000100, 0b00100011,0b01100010, 0b00100100,0b00010010, 0b01001000,0b00000001, 0b01001000,0b00000001, 0b01010000,0b00000001, 0b01001000,0b00000001, 0b01001000,0b00000001, 0b00100100,0b00010010, 0b00100011,0b01100010, 0b00010000,0b10000100, 0b00001100,0b00011000, 0b00000011,0b11100000, }; void setup() { Serial.begin(9600); //calibrate the the scale of the hx711 and reset the zero point scale.set_scale(calibration_factor); scale.tare(); //set the interupts for the buttons pinMode(button1, INPUT); attachInterrupt(digitalPinToInterrupt(button1), buttonPressed1, FALLING); pinMode(button2, INPUT); attachInterrupt(digitalPinToInterrupt(button2), buttonPressed2, FALLING); //calibrate the OLED screen and draw the initial screen u8g.setColorIndex(1); u8g.firstPage(); do { draw(0); } while(u8g.nextPage()); u8g.firstPage(); delay(1000); } //interrupt functions for the buttons void buttonPressed1() { button_zero = 1; } void buttonPressed2() { button_hold = 1; } //main function to draw the pages on the OLED screen void draw(int page) { //the outer border of the screen for(int i = 0; i < 5; i++) { u8g.drawFrame(i,i,128-2*i,64-2*i); } //sets the font for the text u8g.setFont(u8g_font_unifont); //initial screen if(page == 0) { u8g.drawStr(10,22,"Elektor"); u8g.drawBitmap(70,10,2,15,c); } //visualization of the measured weight in gram and ounce if(page == 1 || page == 2) { u8g.drawStr(10,20,"Mass:"); u8g.setPrintPos(10,33); u8g.print(gram,1); u8g.print(" g"); u8g.setPrintPos(10,45); u8g.print(ounce); u8g.print(" oz"); //bar graph of the weight in gram u8g.drawStr(101,17,"0"); u8g.drawStr(83,56,"5kg");//for use with a different max load, change the string to the new max and change the first number(-8 for each added character) u8g.drawFrame(110,10,7,44); //makes sure the bar does not surpass the graph and makes sure the height of the bar isn't less then 1 if(bar >= 1 && bar <= 40) { u8g.drawBox(112,12,3,bar); } else if(bar > 40) { u8g.drawBox(112,12,3,40); u8g.drawStr(10,57,"Too much!"); } //displays wether or not the program is in hold mode if(page == 2) { u8g.drawStr(64,20,"Hold"); } } //tells the user that the scale has been calibrated if(page >= 3 && page <= 6) { u8g.drawStr( 10, 20, "calibrating"); if(page == 4) { u8g.drawStr( 10, 33, "."); } if(page == 5) { u8g.drawStr( 10, 33, ".."); } if(page == 6) { u8g.drawStr( 10, 33, "..."); } } } //main loop void loop() { //measures an average ADC value of the potmeter for (int i = 0; i < 100; i++) { factor += analogRead(4); } //the measurement is calculated in a factor for the weight factor /= 100; factor += 15500; //the actual weight is calculated in gram and ounce(avoirdupoids) gram = (scale.get_units(10) * int(factor) / 1000); ounce = gram * 0.0352739619; //calculates the height of the bar in the graph. max height is 40 pixels and max weight is 5000g bar = gram*40/5000; //initiates the draw function for the visualisation of the weight u8g.firstPage(); do { draw(1); } while(u8g.nextPage()); //resets the weight to 0 if(button_zero) { button_zero = 0; scale.tare(); for(int i = 3; i < 7; i++) { u8g.firstPage(); do { draw(i); } while(u8g.nextPage()); delay(250); } } //holds the weight value until the button is pressed again if(button_hold == 1) { button_hold = 0; u8g.firstPage(); do { draw(2); } while(u8g.nextPage()); delay(1000); while(1) { if(digitalRead(button2) == 0) { delay(20); break; } } button_hold = 0; } }
بیشتر کار طرح به روشن کردن پیکسلهای صفحهنمایش در زمان مناسب برمیگردد. خواندن مقدار لودسل و تبدیل آن به کیلوگرم و اونس فقط دو خط کد نوشتن کار دارد:
gram = scale.get_units(10) * int(factor) / 1000; ounce = gram * 0.0352739619; bar = gram*40/5000;
ممکن است این برنامه مقداری برای شما گیجکننده باشد زیرا این طرح بهشدت به یک کتابخانه که وظیفه ایجاد ارتباط با HX711 را به عهده دارد وابسته است. مقدار وزن اندازهگیری شده توسط scale.get_units یک داده از نوع signed integer 32 بیتی است که توسط عامل کالیبراسیون تبدیل به گرم میشود. تنظیم صفحهنمایش با استفاده از کتابخانه گرافیکی 8 بیتی عمومی (U8glib) انجام میشود. صفحهنمایش وزن اندازهگیری شده را بهصورت گرم و اونس نشان میدهد. همچنین یک میله نواری در صفحهنمایش وجود دارد که مقدار وزن را تا 5 کیلوگرم بهصورت گرافیکی نشان میدهد . هنگامیکه دکمه نگهداشتن فشرده (Hold) میشود، مقدار وزن نمایش دادهشده ثابت میماند و اگر شیء را هم بردارید، مقدار اعداد در صفحهنمایش تغییری نمیکند. اگر بار دیگر دکمه Hold را فشار دهید صفحهنمایش به فعالیت عادی خود برمیگردد. دکمه S1 دکمه صفر کردن است. با فشار دادن این دکمه مقدار عدد روی صفحهنمایش صفر نشان داده میشود، چه شیئی روی ترازو باشد چه نباشد. نرمافزار این ترازو در فایلهای ضمیمه موجود میباشد.
تنظیم ترازو
لودسل را به ماژول HX711 متصل کنید (بر اساس جدول 1) و دیگر قطعات را نیز به هم وصل نمایید. ترازو آماده استفاده است؛ ولی قبل از اینکه بخواهید وزن مواد غذایی شام امشبتان را با این ترازو اندازه بگیرید
باید ترازو را تنظیم و یا بهاصطلاح فنی کالیبره کنید. شما میتوانید این کار را با جسم دیگری که وزن آن را دقیقاً میدانید انجام دهید؛ و اما مراحل تنظیم ترازو:
- دستگاه را روشن کنید
- دکمه تنظیم کردن را فشار دهید (دکمه S1)
- شیئی که بهعنوان وزن مرجع انتخاب کردهاید را روی ترازو قرار دهید.
- فرض کنید میدانید این شیء مثلاً 100 گرم وزن دارد. حال پتانسیومتر P1 را آنقدر بچرخانید که مقدار وزن را دقیقاً 100 گرم نشان دهد.
- شیء را بردارید و بار دیگر دکمه S1 را فشار دهید. اکنون مقدار وزن نشان دادهشده باید صفر باشد.
- بار دیگر شیء را روی ترازو قرار دهید اگر وزن نشان دادهشده درست باشد دستگاه بهخوبی تنظیمشده و آماده استفاده است در غیر این صورت بار دیگر مراحل بالا را از شماره 3 به بعد تکرار کنید.
تبریک! ترازوی شما آماده استفاده است. اگر در مورد این نوشته ایده یا نظری دارید آن را در قسمت نظرات با ما در میان بگذارید.
سلام
بسیار عالی
چندتا سوال:
۱- میشه از لودسل بزرگتری استفاده کرد؟برای کارای با وزن سنگین تر؟مثلا تا وزن ۵۰۰ کیلو؟یا حتی بیشتر؟
۲- میشه با استفاده از یک رله یا چیزی دیگه ای که من نمیدونم و با کمک یه صفحه کلید بتونیم یک الکترو موتورو کنترل کنیم؟به این صورت که یه وزن وارد میکنیم و استارت میکنیم و الکتروموتور روشن میشه.بعد از اینکه وزن به مقدار مورد نظر رسید استوپ بشه و الکترو موتور خاموش بشه
۳- میشه به جای اون نمایشگر کوچیک از یه نمایشگر بزرگتر استفاده کرد و برای نمایش دادن وزن از سون سگمنت؟
ممنون میشم پاسخگو باشید،چون کلی دنبال ساخت همچین ترازویی اونم با آردونیو بودم
موفق باشید
سلام
بسیار عالی
چندتا سوال:
۱- میشه از لودسل بزرگتری استفاده کرد؟برای کارای با وزن سنگین تر؟مثلا تا وزن ۵۰۰ کیلو؟یا حتی بیشتر؟
۲- میشه با استفاپه از یک رله یا چیزی دیگه ای که من نمیدونم و با کمک یه صفحه کلید بتونیم یک الکترو موتورو کنترل کنیم؟له این صورت که یه وزن وارد میکنیم و استارت میکنیم،بعد از اینکه وزن به مقدار مورد نظر رسید استوپ بشه و الکترو موتور خاموش بشه
۳- میشه به جای اون نمایشگر کوچیک از یه نمایشگر بزرگتر استفاده کرد و برای نمایش دادن وزن از سون سگمنت؟
ممنون میشم پاسخگو باشید،چون کلی دنبال ساخت همچین ترازویی اونم با آردونیو بودم
موفق باشید
همش که امکان پذیره همه اینایی که گفتید امکان پذیره می تونید این برنامه رو گسترش بدید و استفاده کنید
با تشکر بابت پاسخگویی
آیا امکان داره که همچین آموزشی قرار بدین؟
من تازه دارم آردوینو یاد میگیرم و از قضا همین پروژه خیلی برام حیاتیه
شما راهنمایی کنید اگه میشه
ممنونم ?
مرسی . دست شما درد نکنه
سلام
میشه با تغییراتی تعداد قطعه هارو نمایش بده
یعنی وزن یک قطعه رو بهش بدیم بعد یا تقسیم وزن کل قطعه ها ، تعداد قطعات رو نشون بده