شِفر (کود) جستجو

درس ۹۷-۱: تشخیص چرخش انکودر دوار و فشردن کلید

درس ۹۷-۱: تشخیص چرخش انکودر دوار و فشردن کلید

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

در اینجا چند ایده عملی برای آنچه می‌توانید با این راه‌اندازی پایه بسازید آورده شده است:

  • سیستم ناوبری منو: انکودر را بچرخانید تا گزینه‌های روی LCD را مرور کنید و کلید را فشار دهید تا یک مورد را انتخاب کنید.
  • ابزار تنظیم دقیق: از آن برای تنظیم دقیق یک پارامتر، مانند تنظیم تایمر یا تنظیم سرعت موتور در مراحل کوچک و مشخص استفاده کنید.
  • کنترل‌کننده بازوی رباتیک: به‌جای جوی‌استیک از انکودر برای کنترل دقیق و گام‌به‌گام موقعیت سروو موتور استفاده کنید.

سخت‌افزار مورد نیاز

برای دنبال کردن این درس، به اجزای زیر نیاز دارید:

  • آردوینو اونو (یا برد مشابه سازگار)
  • ماجیول انکودر چرخشی (با PCB) یا انکودر چرخشی ساده با سه مقاومت 10kΩ
  • برد بورد و سیم جامپر
  • کابل USB برای برنامه‌نویسی آردوینو

راهنمای سیم‌کشی

rotary_encoder_schematic_bb
rotary_encoder_breadboard_bb

انکودر چرخشی فرآیند ردیابی چرخش را ساده می‌کند. دو پایه خروجی (اغلب با نام A و B) دارد که با چرخاندن دستگیره، دنباله خاصی از سیگنال‌ها تولید می‌کنند. با خواندن این سیگنال‌ها، آردوینو می‌تواند جهت و میزان چرخش را تعیین کند. انکودر همچنین شامل یک کلید دکمه‌ای داخلی است که با فشار دادن دستگیره فعال می‌شود و ورودی اضافی برای تعامل کاربر فراهم می‌کند.

سیم‌کشی این پروژه ساده است. نمودار ارائه‌شده نحوه اتصال ماجیول انکودر به آردوینو را نشان می‌دهد. پایه CLK (یا A) به پایه دیجیتال 2، پایه DT (یا B) به پایه دیجیتال 3 و پایه SW (کلید) به پایه دیجیتال 4 متصل می‌شود. پایه + (VCC) انکودر به منبع تغذیه 3.3 ولت و پایه GND آن به زمین مشترک متصل می‌شود.

اگر از انکودر چرخشی ساده بدون PCB استفاده می‌کنید، باید سه مقاومت pull-up (بین 1kΩ و 100kΩ) به پایه‌های خروجی آن اضافه کنید تا سیگنال تمیز برای آردوینو تضمین شود.

توضیح شِفر (کود)

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

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

const int SW_PIN = 4;
const int PIN_A =2;
const int PIN_B =3;
  • SW_PIN: این ثابت پایه آردوینو متصل به کلید دکمه‌ای انکودر را تعریف می‌کند.
  • PIN_A و PIN_B: این ثابت‌ها پایه‌های آردوینو متصل به دو کانال خروجی انکودر، A و B را تعریف می‌کنند. این پایه‌ها توسط کتابخانه Encoder برای ردیابی چرخش دستگیره استفاده می‌شوند.

در ادامه، شِفر (کود) کتابخانه لازم را شامل می‌شود و یک نمونه از شیء انکودر ایجاد می‌کند و آن را با پایه‌هایی که تعریف کردیم مرتبط می‌سازد.

#include <Encoder.h>
Encoder myEnc(PIN_A, PIN_B);

در تابع setup()، نمایشگر مسلسل برای ارتباط راه‌اندازی می‌شود و پایه کلید به‌عنوان ورودی پیکربندی می‌شود.

void setup() {
  Serial.begin(9600);
  pinMode(SW_PIN, INPUT);
  Serial.println("Basic Encoder Test:");
}

منطق اصلی در تابع loop() دو وظیفه کلیدی را انجام می‌دهد. اول، به‌طور مداوم موقعیت فعلی انکودر را می‌خواند. اگر این موقعیت از آخرین مقدار ثبت‌شده تغییر کرده باشد، به این معنی است که دستگیره چرخانده شده و موقعیت جدید روی نمایشگر مسلسل چاپ می‌شود. دوم، وضعیت کلید را بررسی می‌کند. وقتی کلید فشرده می‌شود، پایه آن پایین کشیده می‌شود و شِفر (کود) پیامی برای نشان دادن فشار چاپ می‌کند.

long oldPosition  = -999;

void loop() {
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    Serial.println(newPosition);
  }

  if( digitalRead(SW_PIN) == LOW)
  {
   Serial.println("Switch Pressed");
  }

  delay(200);
}

تابع myEnc.read() یک تابع سفارشی از کتابخانه Encoder است. شمارش فعلی موقعیت انکودر را برمی‌گرداند. با مقایسه خوانش‌های فعلی و قبلی، می‌توانید حرکت را تشخیص دهید. تابع digitalRead(SW_PIN) یک تابع استاندارد آردوینو است که وضعیت پایه کلید را می‌خواند.

نمایش زنده پروژه

هنگامی که شِفر (کود) را روی آردوینو خود بارگذاری کردید، می‌توانید نمایشگر مسلسل (تنظیم شده روی ۹۶۰۰ باود) را باز کنید تا نتایج را مشاهده کنید. وقتی دسته‌ی انکودر را در جهت عقربه‌های ساعت می‌چرخانید، اعداد افزایش می‌یابند. چرخاندن آن در خلاف جهت عقربه‌های ساعت باعث کاهش اعداد می‌شود. اگر روی دسته فشار دهید، پیام «دکمه فشرده شد» نمایش داده می‌شود. این تأیید می‌کند که هم چرخش و هم فشار دکمه به‌درستی توسط سیستم تشخیص داده می‌شوند.

پروژه‌های مرتبط از این ویدیو

فصل‌ها

  • [۰۰:۰۱] مقدمه‌ای بر کنترل سروو با انکودر چرخشی
  • [۰۱:۴۱] چرا از انکودر چرخشی به جای پتانسیومتر استفاده کنیم
  • [۰۴:۱۸] مرور ماجیول انکودر چرخشی و سیم‌کشی
  • [۱۳:۲۸] نصب کتابخانه‌های مورد نیاز
  • [۱۴:۵۴] توضیح شِفر (کود) مثال پایه انکودر
  • [۱۶:۴۳] نمایش شِفر (کود) پایه انکودر
  • [۱۷:۵۲] شِفر (کود) اصلاح‌شده با کلید فشاری
  • [۲۰:۲۰] توضیح کامل شِفر (کود) برای کنترل سروو و LCD
  • [۲۳:۴۷] پیدا کردن آدرس I2C صفحه LCD
  • [۳۰:۰۱] نمایش پروژه کامل

تصاویر

Rotary encoder breadboard
Rotary encoder breadboard
Rotary encoder schematic breadboard
Rotary encoder schematic breadboard
431-Lesson 97-1: Code: Rotary Encoder with switch
زبان: C++
/* 
 *  Lesson 97-1: Rotary Encoder with switch 
 *  This code detects rotation of the encoder knob
 *  and also detects when it is pushed
 *  Download and resource page https://robojax.com/RJT453

 *  Watch full details video: https://youtu.be/6xVLbNlmK-g
  This video is part of the Arduino Step by Step Course, which starts here: https://youtu.be/-6qSrDUA5a8
 

If you found this tutorial helpful, please support me so I can continue creating 
content like this. Make a donation using PayPal by credit card: https://bit.ly/donate-robojax
  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact. * 
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 *  Updated by Ahmad Shamshiri on Jan 23, 2022
 *  Encoder Library - Basic Example
 * http://www.pjrc.com/teensy/td_libs_Encoder.html
 *
 * This example code is in the public domain.
 */
const int SW_PIN = 4;
const int PIN_A =2;
const int PIN_B =3;

#include <Encoder.h>

// Change these two numbers to the pins connected to your encoder.
//   Best Performance: both pins have interrupt capability
//   Good Performance: only the first pin has interrupt capability
//   Low Performance:  neither pin has interrupt capability
Encoder myEnc(PIN_A, PIN_B);
//   avoid using pins with LEDs attached

void setup() {
  Serial.begin(9600);
  pinMode(SW_PIN, INPUT);
  Serial.println("Basic Encoder Test:");
}

long oldPosition  = -999;

void loop() {
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    Serial.println(newPosition);
  }

  if( digitalRead(SW_PIN) == LOW)
  {
   Serial.println("Switch Pressed");
  }

  delay(200);
  //Watch video details: https://youtu.be/6xVLbNlmK-g
}

مواردی که ممکن است به آن‌ها نیاز داشته باشید

فایل‌ها📁

هیچ فایلی موجود نیست.