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

فاصله سنج چرخشی با روتاری انکودر و آردوینو

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

نحوه کار فاصله سنج چرخشی

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

در کنار اینها، ما باید یک سوئیچ فشاری ساده داشته باشیم که به عنوان دکمه Reset عمل می کند، با استفاده از یک سیگنال از دکمه تنظیم مجدد می توانیم شمارنده را صفر کنیم. برای کنترل این پروژه ما از Arduino Pro-Mini استفاده خواهیم کرد. آردوینو پرو مینی به عنوان کنترل کننده اصلی ما برای پردازش پالس ها از رمزگذار چرخشی عمل می کند و مقدار اندازه گیری شده را از طریق پروتکل SPI روی صفحه نمایش OLED نمایش می دهد.

نحوه کار فاصله سنج چرخشی

شماتیک اتصال متر چرخشی به آردوینو

این نمودار باتری لیتیومی متصل به ماژول TP4056 را نشان می دهد که به یک سوئیچ متصل می شود و تمام اجزای مدار را تغذیه می کند.

شماتیک اتصال متر چرخشی به آردوینو

ماژول OLED، رمزگذار چرخشی و سوئیچ فشاری مطابق زیر به پین ​​های Arduino Pro Mini متصل می شوند.

  • سوئیچ فشاری، متصل به پایه 3 برای استفاده از عملکرد وقفه پرو مینی
  • رمزگذار چرخشی، یک فاز متصل به پین ​​2 پرو مینی برای بهره برداری از عملکرد وقفه، فاز دوم متصل به پین ​​6 که به عنوان یک خواندن دیجیتال ساده عمل می کند.
  • صفحه نمایش 0.96 اینچی OLED، با پین های 8، 9، 10، 12 و 13 در پیکربندی SPI متصل است.

قطعات مورد نیاز

  • برد آردوینو (مثلا پرو مینی)
  • ماژول USB به TTL (برای برنامه نویسی Pro-Mini)
  • نمایشگر OLED SSD1306
  • روتاری انکودر (با پالس بالا در هر دور)
  • باتری Li-Po 700mAh
  • ماژول TP4056
  • سوئیچ فشاری
  • سوئیچ تعویض SPST
قطعات مورد نیاز را از فروشگاه قطعات آیرنکس تهیه کنید.

کد آردوینو چرخ اندازه گیری دیجیتال

اگرچه رمزگذار چرخشی ما به استفاده از هیچ کتابخانه ای نیاز ندارد اما برای کار با ماژول OLED، ما به کتابخانه های OLED Adafruit نیاز داریم. ما با نصب Adafruit GFX و Adafruit SSD 1306 Library شروع می کنیم. برای نصب کتابخانه در آردوینو به سادگی روی Library Manager کلیک کنید و دو کتابخانه زیر را دانلود کنید.

نصب Adafruit GFX و Adafruit SSD1306

Adafruit GFX و Adafruit SSD1306 را جستجو می کنیم و به سادگی با کلیک بر روی دکمه install آنها را نصب می کنیم.

هنگامی که کتابخانه ها نصب شدند، می توانیم به سادگی آنها را در ابتدا به کد خود فراخوانی کنیم.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

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

#define OLED_MOSI  12
#define OLED_CLK   13
#define OLED_DC    9
#define OLED_CS    10
#define OLED_RESET  8
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
  OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
#define outputA 2
#define outputB 6
#define SetZero 3

اکنون ثابت‌های مربوط به دستگاه، قطر دیسک چرخشی و تعداد هر دور (CPR) هر فاز رمزگذار را تعریف می‌کنیم. از آنجایی که ما یک دیسک به قطر 70 میلی متر را روی شفت رمزگذار چرخشی نصب خواهیم کرد، قطر را 70 قرار دادیم. با مشاهدهدیتاشیت رمزگذار چرخشی خود، می دانیم که هر فاز 400 پالس در هر دور ارسال می کند، از آنجایی که هر پالس دارای دو انتقال خواهد بود، تعداد 800 (400X2) به دست می آید. بنابراین ما CPR را به عنوان 800 وارد می کنیم.

ما همچنین متغیری به نام factor تعریف می کنیم که در واقع مسافت طی شده با هر شمارش است. بعداً این ضریب را در تعداد محاسبه شده توسط کنترلر ضرب می کنیم.

#define Diameter 70 //اینچ میلی متر
#define CPR 800 //تعداد در هر دور هر فاز
float factor= (3.1415*Diameter)/(CPR);

اکنون چند متغیر اضافی را که در طول کار کد مورد نیاز خواهند بود، ایجاد می کنیم.

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید
bool aState;
bool aLastState;
unsigned long int lastdata=0;
unsigned long int lastDisplay=0;
bool led=0;
long units=0;
bool i=0;

در تابع Setup، ما به سادگی باید پین های ورودی را با مقاومت پول آپ فعال کنیم. پین های وقفه و عملکردهای وقفه را تنظیم میکنیم و صفحه نمایش OLED را مقداردهی اولیه میکنیم .

void setup() {
  pinMode (outputA,INPUT_PULLUP);
  pinMode (outputB,INPUT_PULLUP);
  pinMode (SetZero,INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(2),ISR1,CHANGE);
  attachInterrupt(digitalPinToInterrupt(3),ISR2,FALLING);
  Serial.begin(9600);
  if(!display.begin(SSD1306_SWITCHCAPVCC)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
  // Clear the buffer
  display.clearDisplay();
  display.display();
  display.setTextColor(WHITE);
  aLastState = PIND&(1<<2)?1:0;
        display.clearDisplay();
        display.setTextSize(2);
        displayCenter("Distance",2);
        display.setTextSize(3);
        displayCenter(String(units),30);
        lastDisplay=millis();
}

در تابع Loop، ما عملکرد بسیار کمی را انجام می دهیم به این دلیل که بیشتر کارها در توابع وقفه و همچنین تابع updateDisplay() انجام می شود. ما از متغیر i به عنوان پرچم استفاده می کنیم که هر زمان که پالسی توسط رمزگذار چرخشی ایجاد شود یا زمانی که متغیر شمارنده را تنظیم مجدد می کنیم، روی یک تنظیم می شود. در تابع loop، تابع updateDisplay() را فقط زمانی فراخوانی می کنیم که متغیر پرچم i برابر 1 باشد.

همراه با این، ما همچنین یک کد ساده را با استفاده از متغیر lastData و تابع millis() برای بازنشانی شمارنده به صفر در صورت عدم وجود ورودی برای 10 ثانیه آخر پیاده سازی می کنیم.

void loop() {
    if(i==1)
    {
      updateDisplay();
    }
   if(millis()-lastdata>10000) {
     units=0;
     updateDisplay();
     lastdata=millis();
   }    
}

از آنجایی که ما یک فاز از خروجی رمزگذار چرخشی را روی پایه 2 Pro-Mini وصل کردیم، ISR1 هر بار که یک انتقال در مقدار وجود دارد، اجرا می‌شود. از عملکرد انکودرهای چرخشی، می دانیم که اگر فازها نابرابر باشند، انکودر خلاف جهت عقربه های ساعت می چرخد، بنابراین مقدار شمارنده را کاهش می دهیم و اگر فازها برابر باشند، مقدار شمارنده را افزایش می دهیم. توجه داشته باشید که به جای استفاده از یک تابع digitalRead() ساده، از دستور bool(PIND&(1<<6)) استفاده کرده ایم.

void ISR1() {
  if ( bool(PIND&(1<<6)) != bool(PIND&(1<<2)) )
     {
       units --;
     }
     else
     {
       units ++;
     }
     i=1; 
}

سوئیچ فشاری به پایه 3 متصل است که وقفه دوم یعنی ISR2 را اجرا می کند. این تابع به سادگی متغیر شمارنده را صفر می کند.

void ISR2() {
  units=0;
  i=1;
}

در نهایت ما توابع updateDisplay() و displayCenter() را داریم. تابع updateDisplay() به سادگی برای پاک کردن صفحه نمایش OLED و نمایش مقدار جدید فاصله اندازه گیری شده استفاده می شود. این عملکرد فقط هر 500 میلی ثانیه نمایشگر را به روز می کند تا منابع CPU را حفظ کند و اطمینان حاصل کند که هیچ پالسی از رمزگذار را از دست نمی دهیم. این کار همچنین از سوسو زدن صفحه نمایش جلوگیری می کند.

تابع displayCenter() همانطور که از نام پیداست، متن را در مرکز افقی صفحه تراز می کند.

void updateDisplay() {
        if(millis() - lastDisplay>500)
        {
        display.clearDisplay();
        display.setTextSize(2);
        displayCenter("Distance",2);
        display.setTextSize(3);     
        displayCenter(String(float(units*factor)),30);
        lastDisplay=millis();
        lastdata = lastDisplay;
        i=0;
        }
}
void displayCenter(String text, int line)
{
  int16_t x1;
  int16_t y1;
  uint16_t width;
  uint16_t height;
  display.getTextBounds(text, 0, 0, &x1, &y1, &width, &height);
  // display on horizontal center
  display.setCursor((SCREEN_WIDTH - width) / 2, line);
  display.println(text); // text to display
  display.display();
}

مونتاژ چرخ اندازه گیری فاصله  آردوینو

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

محفظه چرخ اندازه گیری دیجیتال

دیسک باید به شفت رمزگذار چرخشی متصل شود.

مونتاژ چرخ اندازه گیری دیجیتال

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

موارد موجود در فایل : فایل سورس کامل

5 (1 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

1 دیدگاه

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

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *