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

کنترل ماژول ال ای دی نئوپیکسل توسط ماژول روتاری انکودر و برد آردوینو

نوشته شده توسط CiferTech

تا امروز آموزش های متفاوتی با ماژول ال ای دی نئوپیکسل منتشر شده است. از جمله کنترل آن بوسیله وب‌سرور که چند هفته پیش منتشر شد. در کل ماژول ال ای دی Neopixel قابلیت‌های زیاد و جذابی دارند. با یک پایه از میکروکنترلر امکان تولید چند میلیون نور مختلف را دارند. در این آموزش قصد داریم با کمک ماژول روتاری انکودر و برد آردوینو وضعیت ال ای دی نئوپیکسل را با توجه به رنگ های مورد نیاز تغییر دهیم. به این صورت که با تغییر زاویه روتاری انکودر در هر پله وضعیت ال ای دی نئوپیکسل نیز تغییر خواهد کرد. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.


ماژول روتاری انکودر


روتاری انکودر نوعی سنسور موقعیت است که برای تعیین موقعیت زاویه ای شافت چرخان استفاده می شود. که یک سیگنال الکتریکی، آنالوگ یا دیجیتال، با توجه به حرکت چرخشی تولید می کند. با توجه به استحکام و کنترل خوب دیجیتال آن، در بسیاری از پروژه ها از جمله رباتیک، دستگاه های CNC و چاپگرها از ماژول روتاری انکودر استفاده می شوند. انکودرها در دو نوع مطلق و افزایشی وجود دارند. انکودر مطلق موقعیت دقیق دکمه را بر حسب درجه به ما می دهد در حالی که رمزگذار افزایشی گزارش می دهد که چند شافت حرکت کرده است. روتاری انکودر ها معادل دیجیتال مدرن پتانسیومتر ها هستند. آنها می توانند بدون توقف انتهایی کاملاً بچرخند در حالی که یک پتانسیومتر می تواند فقط در حدود ۳/۴ دایره را بچرخد. در داخل انکودر، یک دیسک شکاف دار به پایه مشترک زمین C متصل است و دو پایه تماس A و B، همانطور که در زیر نشان داده شده است. هنگامی که دستگیره را می چرخانید، A و B با توجه به جهتی که در حال چرخاندن دستگیره هستید، با پین زمین مشترک C تماس می گیرند.

شماتیک ماژول روتاری انکودر و روش عملکرد آن - دیجی اسپارک

در نهایت با تماس با نقاط مشترک سیگنال تولید می کنند. این سیگنال ها با تماس یک پین قبل از پین دیگر ۹۰ درجه خارج از فاز با یکدیگر منتقل می شوند. این کدگذاری quadrature نامیده می شود. هنگامی که دکمه را در جهت عقربه های ساعت می چرخانید، ابتدا پایه A متصل می شود ، و سپس پایه B متصل می شود. هنگامی که دکمه را در خلاف جهت عقربه های ساعت می چرخانید، ابتدا پایه B متصل می شود و سپس پایه A متصل خواهد شد.

ماژول روتاری انکورد Rotary Encoder - دیجی اسپارک

 


برد آردوینو Arduino


مجموعه بردهای آردوینو از جمله بردهای توسعه پرطرفدار بین مهندسین امبدد هستند. در مدل های مختلفی از جمله Micro ,  proMini , Nano , Uno و همچنین Mega قابل تهیه هستند. هسته مرکزی این بردهای محبوب از سری AtMega328 تشکیل شده است. آردوینو پلتفرم سخت‌افزاری و نرم‌افزاری متن‌باز است. همان طور که قبل تر اشاره کردیم، پلتفرم آردوینو شامل یک میکروکنترلر تک‌بردی متن‌باز است که قسمت سخت‌افزار آردوینو را تشکیل می‌دهد. علاوه بر این، پلتفرم آردوینو یک نرم‌افزار آردوینو IDE که به منظور برنامه‌نویسی برای بردهای آردوینو طراحی شده‌است و یک بوت لودر نرم‌افزاری که بر روی میکروکنترلر بارگذاری می‌شود را در بر می‌گیرد.

برد آردوینو نانو Arduino Nano - دیجی اسپارک

 


ماژول ال ای دی نئوپیکسل


ال ای دی نئوپیکسل نوعی قابل آدرس دهی جداگانه همه روی رشته ای قرار دارند که می توانند از یک پایه روی میکروکنترلر کنترل شوند. این بدان معنی است که یک پایه می تواند تمام رنگ های LED ها را کنترل کند و اینکه کدام LED ها در هر زمان روشن هستند. در مقایسه با یک LED RGB معمولی متوجه خواهید شد که برای کنترل مقدار Red ،Green و Blue به ۳ پایه نیاز داریم و همه LED ها باید روشن یا خاموش باشند. همانطور که مشاهده می کنید استفاده از آدرس دهی جداگانه می تواند به ایجاد برخی افکت های جالب کمک کند. بسیاری از شرکت ها نوارهای LED قابل آدرس دهی را به فروش می رسانند، اما معروف ترین آن‌ها یعنی ال ای دی نئوپیکسل توسط Adafruit ساخته شده است. Adafruit یک خط نوار LED آدرس پذیر تولید می کند. همچنین کتابخانه‌ای را برای کنترل آنها توسعه داده‌اند، که “Adafruit NeoPixel” نامیده می شود. شرکت های دیگری هم وجود دارند که برای کنترل این LED های آدرس پذیر کتابخانه تولید کرده اند. با این حال به نظر من، Adafruits بهترین پشتیبانی را دارد و برای شروع انتخاب مناسبی است.

آموزش کنترل ال ای دی نئوپیکسل با آردوینو - دیجی اسپارک

توضیح تکمیلی


در پروژه کنترل ال ای دی نئوپیکسل با مشخص کردن مقادیر R ,G و B در کد پروژه، با حرکت هر پله از ماژول روتاری انکودر وضعیت نئوپیکسل تغییر خواهد کرد. به این صورت که هر پله از انکودر نمایانگر یک case در کد پروژه است. هر case مقادیر مشخصی با خود به همراه دارد، که با تغییر وضعیت انکودر نمایش داده می شود. به تصویر زیر دقت کنید.

آموزش کنترل ماژول ال ای دی نئوپیکسل با روتاری انکودر و آردوینو - دیجی اسپارک

 


وسایل مورد نیاز


ماژول روتاری انکودر Rotary Encoder

برد آردوینو نانو Arduino Nano

حلقه ال ای دی نئوپیکسل

 


شماتیک و اتصالات


ابتدا اتصالات مربوط به ماژول انکودر و همچنین ماژول نئوپیکسل را برقرار کنید. پین های ۲ و  در آردوینو به S1 , S2 در روتاری انکودر متصل می‌شوند همچنین پین ۴ در آردوینو به ورودی مربوط به سوویچ روتاری متصل می‌شود در ادامه پین ۶ در آردوینو به ورودی دیتای نئوپیکسل متصل می‌شود، همچنین هردو ماژول از ۵ولت تغذیه می‌کنند.

  • اتصالات ماژول روتاری انکودر و آردوینو.

اتصال ماژول روتاری انکودر به برد آردوینو - دیجی اسپارک

  • اتصالات ماژول حلقه نئوپیکسل و آردوینو.

اتصال ماژول ال ای دی نئوپیکسل به آردوینو - دیجی اسپارک

 

شماتیک اتصالات مربوط به آموزش کنترل ال ای دی نئوپیکسل با روتاری انکودر و آردوینو

شماتیک اتصالات پروژه کنترل ال ای دی نئوپیکسل با روتاری انکودر و آردوینو - دیجی اسپارک

 


راه‌اندازی و کدنویسی


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

#include <Adafruit_NeoPixel.h>

 

در این بخش سه متغیر برای سه رنگ اصلی موجود در نئوپیکسل ایجاد می‌کنیم.

int R = 0; int G = 0; int B = 0; 

 

همچنین این سه متغیر مربوط به ماژول روتاری می باشد که پین های مربوط به هر پایه را مشخص کرده‌ایم.

const int buttonPin = 4;
const int PinA = 2; 
const int PinB = 3;

 

در این قسمت جدا از void loop و void setup یک void دیگر ایجاد کرده ایم که مربوط به اینتراپت است.

void time ()  {
  static unsigned long lastInterruptTime = 0;
  unsigned long interruptTime = millis();

  if (interruptTime - lastInterruptTime > 20) {
    if (digitalRead(PinB) == LOW)
    {
      virtualPosition-- ; 
    }
    else {
      virtualPosition++ ; 
    }

    lastInterruptTime = interruptTime;
  }
}

 

در نهایت این بخش مربوط به حالات موجود برای نئوپیکسل است، که با توجه به نیاز می‌توانید در آن‌ها تغییر ایجاد کنید.

    case 6:  R = 255; G = 0;   B = 0;    break;
    case 7:  R = 255; G = 0;   B = 51;   break;
    case 8:  R = 255; G = 0;   B = 102;  break;
    case 9:  R = 255; G = 0;   B = 153;  break;
    case 10: R = 255; G = 0;   B = 204;  break;
    case 11: R = 255; G = 0;   B = 255;  break;
    case 12: R = 204; G = 0;   B = 255;  break;
    case 13: R = 153; G = 0;   B = 255;  break;
    case 14: R = 102; G = 0;   B = 255;  break;
    case 15: R = 51;  G = 0;   B = 255;  break;
    case 16: R = 0;   G = 0;   B = 255;  break;
    case 17: R = 0;   G = 51;  B = 255;  break;
    case 18: R = 0;   G = 102; B = 255;  break;
    case 19: R = 0;   G = 153; B = 255;  break;
    case 20: R = 0;   G = 204; B = 255;  break;
    case 21: R = 0;   G = 255; B = 255;  break;
    case 22: R = 0;   G = 255; B = 204;  break;
    case 23: R = 0;   G = 255; B = 153;  break;
    case 24: R = 0;   G = 255; B = 102;  break;
    case 25: R = 0;   G = 255; B = 51;   break;
    case 26: R = 0;   G = 255; B = 0;    break;
    case 27: R = 51;  G = 255; B = 0;    break;
    case 28: R = 102; G = 255; B = 0;    break;
    case 29: R = 153; G = 255; B = 0;    break;
    case 30: R = 204; G = 255; B = 0;    break;
    case 31: R = 255; G = 255; B = 0;    break;
    case 32: R = 255; G = 204; B = 0;    break;
    case 33: R = 255; G = 153; B = 0;    break;
    case 34: R = 255; G = 102; B = 0;    break;
    case 35: R = 255; G = 51;  B = 0;    break;
    case 36: R = 255; G = 0;   B = 0;    break;

 

کد کامل پروژه کنترل ال ای دی نئوپیکسل با روتاری انکودر و آردوینو

#include <Adafruit_NeoPixel.h>  
#ifdef __AVR__
  #include <avr/power.h>
#endif
#define PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(130, 6, NEO_GRB + NEO_KHZ800);

int R = 0; int G = 0; int B = 0; 
int OldLamp;

#define BUTTON_PIN   4    

const int buttonPin = 4;
const int PinA = 2; 
const int PinB = 3;  

int lastCount = 0;

volatile int virtualPosition = 365;

int pos = 0;

bool oldState = HIGH;
int showType = 0;


void time ()  {
  static unsigned long lastInterruptTime = 0;
  unsigned long interruptTime = millis();

  if (interruptTime - lastInterruptTime > 20) {
    if (digitalRead(PinB) == LOW)
    {
      virtualPosition-- ; 
    }
    else {
      virtualPosition++ ; 
    }

    lastInterruptTime = interruptTime;
  }
}


void setup() {  
  pinMode(BUTTON_PIN, INPUT_PULLUP);

  Serial.begin(9600);

  pinMode(PinA, INPUT);
  pinMode(PinB, INPUT);

  attachInterrupt(digitalPinToInterrupt(PinA), time, LOW);

  Serial.println("Start");
  strip.begin();
    strip.setBrightness(120);
}


boolean checkPos(){

  if (virtualPosition != lastCount) {

    lastCount = virtualPosition ;
  
    pos = abs(virtualPosition % 36);

    Serial.println(pos);
    return true;
  }
  return false;
}


void loop() {

  bool newState = digitalRead(BUTTON_PIN);

  if (newState == LOW && oldState == HIGH) {
    delay(20);
    newState = digitalRead(BUTTON_PIN);
    if (newState == LOW) {
      showType++;
      if (showType > 1)
        showType=0;
    }
  }

  oldState = newState;
  
 if (showType == 0) {
  for (int i = 0; i < strip.numPixels(); i++)
  {
    strip.setPixelColor(i, 0, 0, 0);
  }
  strip.show();  
}
if (showType == 1) {
  
  checkPos();
  
  switch(pos){
    
    case 0: 
    OldLamp = random(100,200);
    R = 250-OldLamp; G = R-40-OldLamp; B = 40-OldLamp; 
    if(G<0) G=0; if(R<0) R=0; if(B<0) B=0;
    delay(random(100,150));
    break;
    
    case 6:  R = 255; G = 0;   B = 0;    break;
    case 7:  R = 255; G = 0;   B = 51;   break;
    case 8:  R = 255; G = 0;   B = 102;  break;
    case 9:  R = 255; G = 0;   B = 153;  break;
    case 10: R = 255; G = 0;   B = 204;  break;
    case 11: R = 255; G = 0;   B = 255;  break;
    case 12: R = 204; G = 0;   B = 255;  break;
    case 13: R = 153; G = 0;   B = 255;  break;
    case 14: R = 102; G = 0;   B = 255;  break;
    case 15: R = 51;  G = 0;   B = 255;  break;
    case 16: R = 0;   G = 0;   B = 255;  break;
    case 17: R = 0;   G = 51;  B = 255;  break;
    case 18: R = 0;   G = 102; B = 255;  break;
    case 19: R = 0;   G = 153; B = 255;  break;
    case 20: R = 0;   G = 204; B = 255;  break;
    case 21: R = 0;   G = 255; B = 255;  break;
    case 22: R = 0;   G = 255; B = 204;  break;
    case 23: R = 0;   G = 255; B = 153;  break;
    case 24: R = 0;   G = 255; B = 102;  break;
    case 25: R = 0;   G = 255; B = 51;   break;
    case 26: R = 0;   G = 255; B = 0;    break;
    case 27: R = 51;  G = 255; B = 0;    break;
    case 28: R = 102; G = 255; B = 0;    break;
    case 29: R = 153; G = 255; B = 0;    break;
    case 30: R = 204; G = 255; B = 0;    break;
    case 31: R = 255; G = 255; B = 0;    break;
    case 32: R = 255; G = 204; B = 0;    break;
    case 33: R = 255; G = 153; B = 0;    break;
    case 34: R = 255; G = 102; B = 0;    break;
    case 35: R = 255; G = 51;  B = 0;    break;
    case 36: R = 255; G = 0;   B = 0;    break;
    default: R = 0;   G = 0;   B = 0;
  }
  
  for (int i = 0; i < strip.numPixels(); i++)
  {
    strip.setPixelColor(i, R, G, B);
  }
  strip.show();  

} else {
  for (int i = 0; i < strip.numPixels(); i++)
  {
    strip.setPixelColor(i, 0, 0, 0);
  }
  strip.show(); 
  }
}

 


جمع بندی


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

  • تنظیمات منوی tools در نرم افزار آردوینو نیز مانند تصویر زیر است.

 

 

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

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

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

CiferTech

تبادل نظر و رفع عیب با ثبت دیدگاه

۹ دیدگاه

  • سلام وقت بخیر، با استفاده از همین ماژول آردوینو نانو تا چه تعداد از این مدل نئوپیکسل را می توان کنترل کرد؟ سپاس

    • با سلام
      کاربر گرامی تعداد نئوپیکسل ها ارتباطی با تعدا پایه ها ندارد. تعداد نئوپیکسل ها را کد برنامه تعریف کنید.

      • ممنون از پاسختون، امکان این وجود داره که تعداد حالات ( case) روشنایی رو از ۳۶ حالتی که در این برنامه تعریف شده، بیشتر کرد؟ درواقع چطور می تونیم با کنترل بهتری رنگ های بیشتری تولید کنیم.

        • بله میتونید تعداد رو افزایش بدید، در واقع با نزدیک کزدن مقادیر R G B در هر case نسبت به مورد بعدی میتونید به رنگ های مختلفی دسترسی داشته باشد.

    • سلام، تعداد این نئوپیسکل ها از طریق کد قابل مشخص شدن است. همان طور که اطلاع دارید با استفاده از پین Do میتوانیم ماژول اول به ماژول بعدی اتصال دهیم اما باید توجه داشت که جریان مورد نیاز نئوپیکسل ها در تعداد بالا به میزانی نرسد که آردوینو نوانایی کنترل کردن آن را نداشته باشد.

      • سپاس از پاسختون، استفاده از آداپتور با جریان بالاتر کمکی به این قضیه نمی کنه؟ و هر پیکسل چه میزان جریان مصرف می کنه که بتوانیم تعداد حداکثر نئوپیکسل رو محاسبه کنیم.

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

  • سلام ، میتونم از خود روتاری انکودر بصورت جدا استفاده کنم یعنی دیگه از ماژولش استفاده نکنم

    ممنون