اندازه گیری جریان با آردوینو و مقاومت شنت {پروژه های آردوینو}

مقدمه

دوست عزیز ، این جلسه یک جلسه کاملا عملی است. اگر نیاز به کدنویسی دارد ، ادیتور خود را باز کنید. اگر مداری لازم است بسته شود ، قطعات آن را تهیه کنید و گام به گام با این جلسه پیش بروید. اگر هم محاسباتی لازم است ، خودتان کاغذ و قلم را بردارید و محاسبات را انجام دهید. این کارها را انجام دهید تا یک بار برای همیشه آردوینو را به صورت حرفه ای یاد بگیرید.

با سلام خدمت همه شما عزیزان. این جلسه به درخواست یکی از کاربران تهیه است و ترجمه شده یکی از مقالات موجود در اینترنت هست  و ما هیچ تعهدی در قبال سالم بودن این کد و پروژه نداریم. این مقاله از این لینک در دسترس هست.
 در این جلسه میخوایم که با استفاده از آردوینو و یک مقاومت شنت مقدار جریان عبوری از یک مدار رو بدون استفاده از اهم متر اندازه گیری کنیم. با ما همراه باشید.

اگر چه اندازه گیری جریان سنسورهای مخصوص به خود (مثل ACS712 ) رو داره اما ما در این آموزش میخوام با استفاده از یک روش سنتی این کار رو با یک مقاومت شنت که مقدار کوچکی هم داره انجام بدیم. علت استفاده از این مقاومت به این علت هست که حضورش باعث انعطاف در رنج اندازه گیری جریان میشه.

تبدیل ولتاژ به جریان

پایه های ورودی آنالوگ در آردوینو ( یعنی پایه های A0 تا A5 ) ولتاژ رو اندازه گیری میکنن. ( از 0 تا 5 ولت). اما ما چطور میتونیم ولتاژ رو به جریان تبدیل کنیم؟

اینجاست که قانون اهم عزیز به کمک ما میاد. ما قبلا در مورد قانون اهم یه مطلب گذاشتیم که خیلی هم مورد استقبال دوستان قرار گرفت. اگه دوست داشته باشید میتونید از این لینک به این مطلب دسترسی پیدا کنید.

قانون اهم یه رابطه خطی بین مقدار جریانی که از یک مقاومت میگذره رو با ولتاژ دو سر اون مقاومت و مقدار اون مقاومت برقرار می کنه. این رابطه بسیار ساده هست. و احتمالا همه شما هم اون رو میدونید.

حال به شکل زیر دقت کنید:

مدار مورد استفاده برای اندازه گیری جریان- اندازه گیری جریان با آردوینو

در این مدار یک لامپ ( که به عنوان بار در نظر گرفته میشه) با یک مقاومت سری شده. در این مدار ما میخوایم بدونیم لامپ چه جریانی مصرف میکنه. با توجه به شکل کاملا واضح هست که جریان گذرنده از لامپ با جریان گذرنده از مقاومت یکسان هست پس اگه ما بتونیم مقدار ولتاژ دو سر مقاومت رو بدست بیاریم با استفاده از قانون اهم میتونیم جریان عبوری از مقاومت رو بدست بیاریم و چون این جریان همون جریانی هست که از لامپ میگذره پس ما تونستیم جریان گذرنده از لامپ رو بدست بیاریم.

حالا اجازه بدید دو فرض رو در اینجا لحاظ کنیم:

  • رنج اندازه گیری جریان ما در اینجا 0 تا 5 آمپر خواهد بود.
  • در اینجا ما از پایه های ورودی آنالوگ در آردوینو استفاده خواهیم کرد تا ولتاژ دو سر مقاومت رو بدست بیاریم.

چون ماکزیمم ولتاژ ورودی پایه های آنالوگ در آردوینو 5 ولت هست اگه بخوایم مقدار مقاومتی که میخوایم جریان رو در اون اندازه گیری کنیم بدست بیاریم با فرض این که حداکثر جریان اندازه گیری ما ( یعنی 5 آمپر ) از اون بگذره مقدار این مقاومت ( طبق قانون اهم) برابر خواهد بود با 5 تقسیم بر 5 یعنی 1 اهم.

اما  این روش محاسبه چند تا اشکال  داره .فرض کنید که ما بخوایم از یک لامپ 12 ولت استفاده کنیم در این صورت Vمنطقی هست که 12 ولت باشه و اگه ما بخوایم 5 ولت دو سر مقاومت بیفته در این صورت 7 ولت به لامپ میرسه که این یک اشکال هست. ( چون لامپ ما 12 ولت هست)

مشکل بعدی مربوط میشه به توان. ما میخوایم جریان 5 آمپر ( که جریان بالایی هم هست) از یه مقاومت یک اهم بگذره. این کار گرمای زیادی رو تولید میکنه. در حقیقت مقاومت 1 اهم با جریان 5 آمپر مقدار 25 وات توان تولید خواهد کرد که این مقدار توان برای یک مقاومت یک اهم و مدارش بسیار بالا هست و گرمای ناشی از تولید اون به مدار ما آسیب میزنه و ممکنه باعث سوختن قطعات هم بشه.

به دلایل بالا منطقی هست که ما بخوایم از یک مدار مقاومت بسیار پایین تر استفاده کنیم. چون اگه مقاومت پایین تر باشه ولتاژ اتلافی دو سر اون و همچنین گرمایی که تولید میکنه کمتر خواهد بود. البته بدیهی هست که اگه مقدار ولتاژ دو سر مقاومت رو هم کم کنیم ولتاژی که به پایه های آنالوگ آردوینو برای اندازه گیری ولتاژ  میرسه کمتر خواهد بود.

تبدیل ولتاژ به جریان

در مورد این مقاومت ها  به همین نکته اکتفا میکنیم که به مقاومت های با مقادیر پایین که برای این چنین اهدافی ساخته می شوند مقاومت شنت گفته می شود.  در شکل زیر یه نمونه مقاومت شنت رو می بینید.

نمونه ای از یک مقاومت شنت

حالا به مدار زیر نگاه کنید. در شکل زیر دو نمونه مقاومت شنت رو میبینید که در اینجا ما از یکیش رو لحیم کردیم. اون دو تا سیمی که در امتداد هم دیگه هستند مربوط به مدار اصلی می باشند و اون دو تا سیمی که بخشی از اون به صورت دایره ای در اومده برای اندازه گیری ولتاژ دو سر مقاومت هست.

نمونه ای از مقاومت های شنت

حالا ما مدار رو به برق وصل کردیم.

در مدار بالا اهم متر سمت راست مقدار جریان رو اندازه گیری میکنه و اهم متر سمت چپ مقدار ولتاژ دو سر مقاومت رو اندازه گیری میکنه. همونطور که انتظار داریم و در شکل هم میبینیم جریان 1 آمپر از لامپ و مقاومت شنت عبور میکنه و مقدار ولتاژ دو سر مقاومت شنت 10 میلی ولت هست.

دوستان توجه داشته باشید که مهم نیست ما ولتاژ کجای مدار رو بگیریم. 1 آمپر همون 1 آمپر هست. حالا شما هر کجای مدار ور که میخواید جریان رو  اندازه گیری کنید.( به علت قانون KCL ) .

آردوینو

محدوده ولتاژ ورودی در پایه های آنالوگ آردوینو از 0 تا AVref هست که این محدوده در حالت عادی بین 0 تا 5 ولت می باشد. چون میکروکنترلر فقط دیجیتال رو میفهمه پس باید مقدار ولتاژی که خونده میشه از طریق واحد ADC به یک عدد دیجیتال تبدیل بشه که این عدد در برد آردوینو از 0 تا 1023 هست. بنابراین در هر 1 ولت این عدد 1023/5 یعنی 204 واحد بالاتر میرود.( این عدد به پایین گرد شده چون حتما باید یک مقدار صحیح باشه)

حالا اگه ما رابطه ی بالا رو برای 10 میلی ولت در هر 1 آمپر در مقاومت شنت محاسبه کنیم ما میبینیم که به ازای تغییر هر 1 واحد در مقدار ADC باعث تغغیر 0.5 آ»پر خواهد شد( به این علت که هر 204 واحد 1000 میلی ولت هست ، پس 2 واحدش برابر 10 میلی ولت یا 1 آمپر میشه  پس هر 1 واحدمعادل  0.5 آمپر میشه) این دقت برای ما که میخوایم در رنج 0 تا 5 آمپر اندازه گیری هامون رو انجام بدیم اصلا مناسب نیست.ما دقت بالاتری میخوایم و اینکار رو با افزایش ولتاژ دو سر مقاومت میتونیم انجام بدیم.  اگه ما رنج ولتاژ دو سر مقاومت رو بالاببریم (در اینجا میخواهیم در 10 ضرب کنیم) ما میتونیم دقت رو تا 0.05 آمپر (یعنی 50 میلی آمپر) بالا ببریم .

پس برای این کار نیاز به یک تقویت کننده داریم که ما در اینجا از تقویت کننده  AD623AN استفاده میکنیم.

تقویت کننده AD623AN

این آیسی یک آپ امپ محصول شرکت Analog Device  هست که در پکیج DIP در بازار موجود هست و قیمتی هم در حدود 16000 تومن داره . در شکل های زیر مدارهای مربوط به این آیسی و اندازه گیری های ولتاژ و جریان رو میبینید:

اندازه گیری جریان با آردوینو

در این تصاویر نتایج نهایی آزمایش رو میبینید. فقط توجه داشته باشید که در اینجا ولتاژ خروجی مربوط به تقویبت کنند 100 میلی ولت هست و در واقع در 10 ضرب شده. در مورد این که چرا این عدد در 10 ضرب میشه دیگه اینجا بحث نمیکنیم ولی اگه براتون سوالی پیش اومد در کامنت ها بپرسید در اونجا پاسخگو خواهیم بود.

توحه داشته باشید که اتصال تغذیه 5 ولت برد آردوینو  به این آیسی ایجاد مشکل نمیکنه چون جریان کشی این آیسی در حد چند میلی آمپر هست و به برد آردوینو آسیبی نمیزنه.

توضیح کد

اما برسیم به اصل داستان که توضیح کد هست. دوستان از این کد اصلا نترسید. کد بسیار ساده ای هست و ما تک به تک خطوطش رو توضیح خواهیم داد. اول کل کد رو در یک نگاه ببینید:

 

#include <SoftwareSerial.h>

#define rxPin 0
#define txPin 2

 SoftwareSerial lcd(rxPin, txPin);  

 int analogInputAmps = 5;
  
 int readAmpsADC = 0;
 float amps = 0.0;
 
void setup(){

  
   lcd.begin(9600);                   
   lcd.print("\r");            // Initialize VT100 Controller with 'CR').                  
   delay(500);
   lcd.print("\e[2J");         // Clear display (VT100 Command).
   delay(300);
   lcd.print("Ready");  
   lcd.print("\e[2m");         // Cursor OFF  (VT100 Command)  
   delay(2000);
 }

float fmap(float x, float in_min, float in_max, float out_min, float out_max) {
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

void loop() {
   readAmpsADC = analogRead(analogInputAmps);
   amps = fabs(fmap(readAmpsADC, 0.0, 1023.0, 0.01, 5.0));
   amps = amps * 10;

   lcd.print("\e[1;1HAmps: ");        //Position cursor row 1; col 1  (VT100 Command)
   delay(200);
   lcd.print(amps); 
   lcd.print("  ");
   delay(500);   
}

 

توضیح بخش اول کد:

ر اینجا برای راه اندازی LCD از یک ماژول استفاده شده به نام VT100 که با استفاده از این ماژول و از طریق ارتباط سریال میشه LCD کاراکتری رو راه اندازی کرد و به همین علت ما باید از دو پایه ارتباط سریال استفاده کنیم.

به همین علت از  هدر SoftwareSerial استفاده شده که کاربرد این تابع برای این هست که ما بتونیم از هر کدوم از پایه های دیجیتال به عنوان RX و TX در برای ارتباط سریال استفاده کنیم که همونطور که در ادامه هم دیده میشه از پایه 0 برای RX و از پایه 2 برای TX استفاده شده.

در خط بعد تعریف شده که پایه ای که ورودی مدار به اون میاد پایه 5 یعنی پایه شماره پنجم ورودی آنالوگ هست.

دو خط بعدی هم مربوط به تعریف دو متغیر هستند که مقادیر خوانده شده از ورودی آنالوگ و مقادیر نهایی در اون ذخیره میشن.

توضیح حلقه void setup :

همونطور که میدونید در این حلقه دستوراتی قرار دارن که فقط یک بار اجرا میشن.  سپس یک سری دستورات که مربوط کنترلی که با استفاده از اون LCD پیکر بندی میشه و سپس صفحه اش پاک میشه آورده شده و برای نمایش داده آماده میشه که این خطوط هم نکته خاصی ندارند.

توضیح حلقه void loop:

برای توضیح این حلقه ابتدا بهتر هست که تابع map و fabs رو با همدیگه بهتر بشناسیم.

معرفی تابع Map : تابع Map در آردوینو برای تبدیل یک رنج عددی به رنج عددی دیگر هست. یعنی فرض کنید ما یه متغیر داریم که رنج این متغیر از 1 تا 50 هست و و میخوایم رنج این متغیر رو تغییر بدیم مثلا از 1 تا 300. در اینجاست که تابع Map به کمک ما میاد. شکل کلی این تابع به صورت زیر هست:

map(value, fromLow, fromHigh, toLow, toHigh);

 

value : نام متغیری که ما میخوایم رنجش تغییر بکنه.

fromLow : پایین ترین مقداری که متغیر در رنج قبلی میتوانست بگیرد.

fromHigh : بالاترین مقداری که متغیر در رنج قبلی میتوانست بگیرد.

toLow : پایین ترین مقداری که متغیر در رنج جدید میتواند بگیرد.

toHigh : بالاترین مقداری که متغیر در رنج جدید میتواند بگیرد.

بدیهی هست که خروجی این تابع مقدار متغیر در رنج جدید هست. یه نمونه مثال هم اگه بخوایم بزنیم به صورت زیر خواهد بود:

/* Map an analog value to 8 bits (0 to 255) */
void setup() {}

void loop()
{
  int val = analogRead(0);
  val = map(val, 0, 1023, 0, 255);
  analogWrite(9, val);
}

برای دوستانی هم که مایل هستند بدونند در درون این تابع چه میگذره محاسبات ریاضی مربوط به این تابع آورده شده.

 

long map(long x, long in_min, long in_max, long out_min, long out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

 

این که این رابطه از کجا بدست می آید را در اینجا بررسی نمیکنیم چون حجم مطلب بالا میرود ولی در همین راهنمایی کنم که باید از معادله خط کمک بگیرید.

خوب حالا ما تابع map رو شناختیم. یه تابع دیگه اینجا تعریف شده به نام fmap که کار این fmap اینه که تغییر رنج رو برای اعداد اعشاری انجام میده و نحوه عملکردش هم کاملا مشابه با تابع map هست فقط در اینجا از داده های float ( اعشاری) استفاده کرده.

تابع fabs: با استفاده از این تابع مقدار قدر مطلق پارامتر ورودی در خورجی قرار میگیره.

حالا میتونیم به توضیح حلقه بپردازیم.

در این حلقه ابتدا مقدار ولتاژ ورودی با استفاده از دستور analogRead خونده میشه. سپس این مقدار تبدیل به رنج درخواستی جریان ما یعنی 0 تا 5 آمپر میشه و در نهایت این مقدار طبق صحبت هایی که کردیم باید در 10 ضرب بشه و سپس بر روی LCD نمایش داده میشه.

به همین سادگی.

خوب دوستان. امیدوارم که از این جلسه هم نهایت استفاده رو برده باشید.مثل همیشه میتونید ما رو در تلگرام و یا اینستاگرام دنبال کنید.

اشتراک گذاری:
مطالب زیر را حتما بخوانید

15 دیدگاه

به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.

  • سلام ممنون از مطالب خوبتون
    یک سوال در مورد اینکه ولتاژ خروجی چرا در 10 ضرب شد؟همیشه اینکارو باید کرد؟

    • با سلام.
      در مورد این که چرا در 10 ضرب شده است باید به دیتاشیت این آیسی مراجعه کنیم. از این لینک میتوانید این دیتاشیت را دانلود کنید. در صفحه 3 این دیتاشیت فرمول مربوط به گین این آیسی آورده شده است. همانطور که میدانیم این آیسی یک آیسی تقویت کننده می باشد که مقدار تقویت کنندگی آن با توجه به مقاومت متصل شده به پایه 8 و 1 ان تعیین می شود. (فرمول را نگاه کنید.) حال با توجه به آن فرمول و مقاومت های استفاده شده به سادگی میتوانیم گین مورد نظر را بدست آوریم. در مداری که در این مقاله استفاده شده است ، از یک پتانسیومتر استفاده کرده ایم که میتوانیم مقدار مقاومت را تغییر دهیم. با یک اندازه گیری مقدار مناسب مقاومت میتوانیم مقدار گین را به 10 برسانیم و به دقت مورد نیاز برسیم. (همانطور که در مقاله نیز توضیح داده شد علت استفاده از این آیسی بالا بردن دقت بود.)
      با توجه به توضیحات بالا مشخص است که هر چقدر مقدار مقاومت باشد ، باید گین را بدست آورد و در همان گین نتیجه را ضرب کرد.
      موفق باشید.

  • سلام.ممنون از مطالب مفیدتان.

    اگر امکانش هست میتوانید یه راهنمایی برای جایگزینی آی سی (تقویت کننده Ad623an) کنید؟

    ضمن اینکه این آی سی بسیار خوب هست اما برای تعداد انبوه صورت به صرفه نیست.

    با تشکر

    • با سلام و درود بر شما.
      برای جایگزین کردن این آیسی میتونید از آپ امپ ها استفاده کنید. نمونه از ای این آپ امپ ها میتونه OP07 باشه. البته بدیهی است که مدارواسط اون هم متفاوت هست. از لینک زیر میتونید اطلاعات تکمیلی مربوط به همین پروژه رو با استفاده از آپ امپ OP07 ببینید:

      اندازه گیری جریان با OP07

      موفق باشید.

  • سلام خسته نباشید

    مطلب جالب و مفیدی بود

    ولی نویسنده پروژه یه جای کار رو یکم مشکل کرده

    اینجا اصلا نیازی به آی سی تقویت کننده و آپ امپ نبود

    می تونید به راحتی ولتاژ مرجع یا رفرنس ADC رو با استفاده از دستور analogReference تغییر بدید و روی INTERNAL یعنی 1.1 ولت قرار بدید و دیگه نیازی هم به خرید آین ای سی گرون قیمت نیست

    حالا متاسفانه نویسنده خود آقای قاسمی نبودن وگرنه میشد که یه تغییراتی رو اعمال کرد اصلا خود مهندس اینطور انجام نمیده پروژه رو

    بازم یک سری مطلب در مورد تغییر ولتاژ مرجع ADC وجود داره که از حوصله ی این بحث خارجه و اگر مهندس قاسمی خودشون صلاح دیدن توضیح میدن البته توی خود سایت آردوینو قسمت رفرنس هاش که برید میتونید در این مورد مطالعه کنید

    • با سلام.
      نکته ای که میفرمایید کاملا صحیح است. البته باید یک موضوع را در نظر بگیریم.
      وقتی ما ولتاژ مرجع ADC را بر روی 1.1 ولت قرار می دهیم ، دقتی که بدست می آوریم تقریبا برابر با 0.1 آمپر خواهد بود. در حالی که ممکن است این دقت برای ما کافی نباشد. به همین دلیل شاید در چنین مواقعی بهتر باشد که از همان آیسی استفاده کنیم. ما با آیسی به دقت 0.05 آمپر رسیده ایم که دقت بسیار مناسب تری می باشد.
      البته برای کارهایی که نیاز به دقت بالایی ندارند همانطور که گفتید میتوانیم از ولتاژ مرجع داخلی استفاده کنیم و مشکلات مربوط به خرید آیسی و مدار بستن را نداشته باشیم.
      موفق باشید.

  • سلام واقعا ممنون اندازه گیری جریان یک طرف کلی دانش جدید و زیبا کسب کردم
    من مطالب ان سایت رو 1000بار مطالعه کرده بودم ولی هیچی
    خیلی قشنگ توضیح دادید چه زیبا درک کردم گفتار اموزش عالیه
    انشالا مطلب بعدی چاپ تابع بر روی سون سگمنت باشه عالی میشه

    خیلی خیلی خیلی لذت بردم

    • با سلام. ممنون از لطف شما.
      به دلیل این که کد نمایش داده بر روی سون سگمنت در وب موجود می باشد و نکته سختی هم ندارد فعلا از قرار دادن این آموزش معذوریم ولی اگر در این باره سوالی باشد در خدمت شما هستیم.
      موفق باشید.

دیدگاهتان را بنویسید