Volume نوعی پتانسیومتر است. پتانسیومترها نوعی مقاومتهای متغییر هستند. درواقع مقاومتهای متغیر انواع متفاوتی دارند.برخی از آنها مانند ترمیستورها، با تغییر دما مقاومت خود را تغییر میدهند. برخی دیگر مانند LDRها با تغییر نور مقاومت خود را تغییر میدهند. پتانسیومترها نیز با چرخاندن صفحه (یا پیچ) مقاومت خود را تغییر میدهند. پتانسیومترها دارای سه پایه شامل یک پایه مرکزی و دو پایه بیرونی هستند.
دو پایه بیرونی توسط یک ماده مقاومتی به هم متصل شده و یک نیمدایره از این ماده در داخل بدنه پتانسیومتر میسازد.
نحوه کار کلی این قطعه به این شکل است: پایه مرکزی به یک لغزنده متصل است. این لغزنده در مسیر نیمدایرهای ساخته شده از ماده مقاومتی با چرخاندن پیچ میچرخد و پایه مرکزی را به قسمتهای مختلف این مسیر وصل میکند.
مقدار مقاومت این ماده در مسیر نیمدایره متفاوت است. بنابراین بسته به موقعیتی که این لغزنده در آن قرار میگیرد، مقاومت نیز متفاومت میشود.

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

R1 را میتوانیم مقاومت ماده مقاومتی (بر اساس طول آن) بین VCC و لغزنده متصل به پایه مرکزی و R2 را مقاومت ماده مقاومتی (بر اساس طول آن) بین GND و لغزنده متصل به پایه مرکزی در نظر گرفت.
حال با توجه به اصول الکترونیکی، اگر مقدار مقاومت R1 و R2 با یکدیگر برابر باشد مقدار ولتاژ خروجی دقیقا نصف ولتاژ اولیه است. اگر مقدار مقاومت R2 بیشتر باشد، میزان ولتاژی که دریافت میکنیم به ولتاژ اولیه نزدیکتر و اگر ولتاژ R1 بیشتر باشد، ولتاژ خروجی به صفر ولت نزدیکتر است.
حال این موضوع را دقیقا با مقاومت درون پتانسیومتر شبیه سازی میکنیم:
زمانی که لغزنده به ولتاژ ورودی نزدیکتر باشد، طول ماده مقاومتی بین ولتاژ ورودی و لغزنده از طول ماده مقاومتی بین GND و لغزنده کمتر است و درنتیجه مقاومت بین ولتاژ ورودی و لغزنده از مقاومت بین GND و لغزنده کمتر است و دقیقا همین حالت در زمانی که لغزنده به GND نزدیکتر باشد هم صدق میکند
ساخت پروژه با Volume
دستور map یا تناسب گیری در آردوینو
در واقع این دستور یک عدد را از یک محدوده به محدوده دیگر منتقل میکند. محدوده اعداد در آردوینو از 0 تا 255 است. برای مثال اگر نیاز باشد که ما عددی از یک سنسور مانند سنسور نور که محدوده آن از 0 تا 1023 است را با آردوینو دریافت کنیم، میتوانیم از این دستور استفاده کنیم.
map(value, fromLow, fromHigh, toLow, toHigh);
پارامتر اول (value) عددی است که میخواهیم به محدوده خواسته شده تبدیل شود. این عدد میتواند خروجی عددی یک سنسور باشد.
پارامتر دوم (fromLow) کوچکترین عدد محدوده پارامتر اول (value) است.
پارامتر سوم (fromHigh) کوچکترین عدد محدوده پارامتر اول (value) است.
پارامتر چهارم (toLow) کوچکترین عدد محدودهای است که میخواهیم عدد متناسب با پارامتر اول را در آن مشخص کنیم.
پارامتر پنجم (toHigh) بزرگترین عدد محدودهای است که میخواهیم عدد متناسب با پارامتر اول را در آن مشخص کنیم.
حال میخواهیم برای درک بهتر این دستور، عدد دریافتی از یک سنسور با بازه عددی 0 تا 1023 را به عددی در بازه اعداد آردوینو یعمی 0 تا 255 تبدیل کنیم.
map(analogRead(A0), 0, 1023, 0, 255);
ساخت پروژه با Volume
میخواهیم با استفاده از Volume و سه LED در سه رنگ متنوع دستگاهی بسازیم که به ازای مقدار خاصی از Volume هر یک از LED ها جداگانه روشن شوند. بازه عدد دریافتی از Volume بین 0 تا 1023 میباشد. میخواهیم در ازای عدد دریافتی بین 0 تا 341 LED قرمز، در ازای عدد دریافتی بین 342 تا 682 LED سبز و در ازای عدد دریافتی بین 683 تا 1023 LED آبی روشن شود.
در ابتدا اتصالات را به شکل زیر انجام میدهیم:

برنامه آردوینو این دستگاه نیز به شکل زیر است:
void setup() {
pinMode(3, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(A0, INPUT);
}
void setup() {
pinMode(3, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(A0, INPUT);
}
void loop() {
if (0 < analogRead(A0) && analogRead(A0) < 341) {
analogWrite(3, map(analogRead(A0), 0, 341, 0, 255));
analogWrite(5, 0);
analogWrite(6, 0);
}
if (341 < analogRead(A0) && analogRead(A0) < 682) {
analogWrite(5, map(analogRead(A0), 341, 682 , 0, 255));
analogWrite(3, 0);
analogWrite(6, 0);
}
if (682 < analogRead(A0) && analogRead(A0) < 1023) {
analogWrite(6, map(analogRead(A0), 682, 1023, 0, 255));
analogWrite(3, 0);
analogWrite(5, 0);
}
}
در این برنامه ابتدا عدد دریافتی از پتانسیومتر را (1023) بر 3 تقسیم کردیم و بعد عدد به دست آمده را با دستور map به عددی از 0 تا 255 (ولتاژ تغذیه LED) تبدیل کردیم. در حقیقت این برنامه به ازای دریافت عدد خاصی در بازههای مشخص از پتانسیومتر، ولتاژ LED ها را از min به max میرساند.