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

مقدمه

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

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

اگر چه اندازه گیری جریان سنسورهای مخصوص به خود (مثل 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 دیدگاه

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

  • جریان در حد میکرو امپر رو میتوان با این روش خوند

  • سلام، من مقدار 4 تا 20 میلی آمپر رو میخوام از طریق ورودی آنالوگ آردوینو بخونم ، این روش شما دقتش خوبه ولی دقت بیشتر میخوام .. آیا میشه یک رقم بشتر اعشار رو از این طرق خوند؟ مثلا بجای 1.02mA بشه 1.021mA رو بخونم؟

    • سلام.
      برای این کار باید از ADC های دقیق تر (مثلا ADC های ۱۶ بیتی)استفاده کنید.

      موفق باشید.

  • سلام شماتیک مدار تو پروتیوس رو هم میزارین من مدار رو اونجا بستم جواب نداد میشه دقیق در درباره ی اتصالات ال سیدی و اردوینو توضیح بدین

    • سلام و درود بر شما.
      شما لطفا جلسه اتصال آردوینو به LCD رو مطالعه بفرمایید:
      اتصال آردوینو به LCD

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

  • مهدس سلام خسته نباشین
    شما الان یه ولتاژه dc رو تقویت کردین؟! مگه میشه؟؟من همیشه فکر میکردم فقط ولتاژ های ac رو میشه تقویت کرد
    من هم قصد دارم یه همچین کار مشابه ایی انجام بدم ولی جریان من نهایتا 500 میلی امپر هست
    به نظرتون بهترین راه چیه؟ خودم به این نتیجه رسیدم که باید از سنسور جریان acs712 استفاده کنم.به نظرتون خوب هست؟

    • با سلام.
      بله ! قطعا میتوان ولتاژ DC را نیز تقویت کرد. در مورد سوال دوم خود لطفا توضیحات بیشتری ارایه دهید.

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