شبیه سازی های درایو های الکتریکی

شبیه سازی های درایو های الکتریکی

در این وبلاگ می توانید شبیه سازی درایو های الکتریکی را دریافت نمایید
شبیه سازی های درایو های الکتریکی

شبیه سازی های درایو های الکتریکی

در این وبلاگ می توانید شبیه سازی درایو های الکتریکی را دریافت نمایید

20 آموزش ساخت ریموت کنترل تلویزیون توسط آردویینو ARDUINO

در بازار ریموت هایی تولید شده که قابلیت کپی کردن ریموت را دارد و بلحاظ کارایی ، جایگاه ویژه ای برای خود در بازار، باز کرده است. نمونه ای از این ریموت ها را در شکل زیر مشاهده می نمایید :

در این آموزش می خواهیم اساس کارکرد این کنترل ها را بررسی نماییم.

دریافت کننده ریموت کنترل

ارتباطات اینفرارد INFRARED ( IR )  به طور گسترده در صنعت کنترل تلویزیون کاربر دارد.توسط گیرنده و فرستنده IR  شما می توانید پروژه های آردویینو را برنامه نویسی و نهایتا آنرا بسازید. قبل از برنامه نویسی لازمست در مورد اینفرارد توضیحاتی بدهیم :

اینفرارد چیست ؟

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

از آنجایی که IR یک نوع نور است، ارتباط IR نیاز به یک خط دید مستقیم از گیرنده به فرستنده دارد. نمی تواند از طریق دیوارها یا سایر مواد مانند WiFi یا بلوتوث منتقل شود.

نحوه عملکرد ریموت ها و گیرنده های IR

یک سیستم ارتباطی معمولی مادون قرمز به یک فرستنده IR و یک گیرنده IR نیاز دارد. فرستنده دقیقاً مانند یک LED استاندارد به نظر می رسد، با این تفاوت که به جای طیف مرئی، نور را در طیف IR تولید می کند. اگر نگاهی به جلوی کنترل از راه دور تلویزیون بیندازید، LED فرستنده IR را خواهید دید:

از همین نوع LED در بردهای شکست فرستنده IR برای آردوینو استفاده می شود. می توانید آن را در جلوی این فرستنده IR Keyes ببینید:

گیرنده IR یک فتودیود و پیش تقویت کننده است که نور مادون قرمز را به سیگنال الکتریکی تبدیل می کند. دیودهای گیرنده IR معمولاً به شکل زیر هستند:

مدولاسیون سیگنال IR

نور مادون قرمز توسط خورشید، لامپ ها و هر چیز دیگری که گرما تولید می کند ساطع می شود. این بدان معناست که نویز نور IR زیادی در اطراف ما وجود دارد. برای جلوگیری از تداخل این نویز با سیگنال IR، از تکنیک مدولاسیون سیگنال استفاده می شود. در مدولاسیون سیگنال IR، یک رمزگذار روی کنترل از راه دور IR یک سیگنال باینری را به یک سیگنال الکتریکی مدوله شده تبدیل می کند. این سیگنال الکتریکی به LED فرستنده ارسال می شود. LED فرستنده سیگنال الکتریکی مدوله شده را به سیگنال نور مادون قرمز مدوله شده تبدیل می کند. سپس گیرنده IR سیگنال نور مادون قرمز را دمدوله می کند و قبل از اینکه اطلاعات را به یک میکروکنترلر ارسال کند، آن را به باینری تبدیل می کند:



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


پروتکل های انتقال IR

الگویی که در آن سیگنال IR مدوله شده به باینری تبدیل می شود توسط یک پروتکل انتقال تعریف می شود. پروتکل های انتقال IR زیادی وجود دارد. سونی، ماتسوشیتا، NEC و RC5 برخی از پروتکل های رایج هستند. پروتکل NEC نیز رایج ترین نوع در پروژه های آردوینو است، بنابراین من از آن به عنوان مثال استفاده می کنم تا به شما نشان دهم که چگونه گیرنده سیگنال مادون قرمز مدوله شده را به یک باینری تبدیل می کند. «1» منطقی با یک پالس IR به طول 562.5 میکروثانیه با فرکانس IR 38 کیلوهرتز و سپس یک پالس LOW با طول 1687.5 میکرو ثانیه شروع می‌شود. "0" منطقی با یک پالس HIGH 562.5 میکروثانیه و به دنبال یک پالس LOW با طول 562.5 µs ارسال می شود:


به این صورت است که پروتکل NEC داده های باینری را به یک سیگنال مدوله شده رمزگذاری و رمزگشایی می کند. پروتکل های دیگر فقط در مدت زمان تک تک پالس های HIGH و LOW متفاوت هستند. کدهای IR هر بار که دکمه ای را بر روی کنترل از راه دور فشار می دهید، یک کد هگزادسیمال منحصر به فرد ایجاد می شود. این اطلاعاتی است که مدوله شده و از طریق IR به گیرنده ارسال می شود. برای اینکه بفهمد کدام کلید فشرده شده است، میکروکنترلر گیرنده باید بداند کدام کد مربوط به هر کلید روی کنترل از راه دور است. ریموت‌های مختلف کدهای متفاوتی را برای فشار دادن کلیدها ارسال می‌کنند، بنابراین باید کد تولید شده برای هر کلید را روی کنترل از راه دور خاص خود تعیین کنید. اگر می توانید دیتاشیت را پیدا کنید، کدهای کلید IR باید فهرست شوند. اگر نه، یک طرح ساده آردوینو وجود دارد که اکثر کنترل های از راه دور محبوب را می خواند و با فشار دادن یک کلید، کدهای هگزا دسیمال را روی نمایشگر سریال چاپ می کند. من به شما نشان خواهم داد که چگونه آن را در یک دقیقه تنظیم کنید، اما ابتدا باید گیرنده را به آردوینو وصل کنیم… نحوه اتصال گیرنده IR به آردوینو انواع مختلفی از گیرنده های IR وجود دارد، برخی به صورت مستقل هستند و برخی بر روی یک برد شکسته نصب می شوند. برگه اطلاعات گیرنده IR خاص خود را بررسی کنید زیرا ممکن است پین ها متفاوت از گیرنده IR HX1838 و مجموعه راه دوری که من در اینجا استفاده می کنم ترتیب داده شوند.

با این حال، تمام گیرنده های IR دارای سه پایه هستند: سیگنال، زمین و Vcc. بیایید با اتصالات سخت افزاری شروع کنیم. چیدمان پین در اکثر تابلوهای شکست مانند این است:

پین اوت اکثر دیودهای مستقل به شرح زیر است:

برای اتصال گیرنده مادون قرمز برروی برد، آن را به صورت زیر به آردوینو متصل کنید:

برنامه نویسی گیرنده IR هنگامی که گیرنده را وصل کردید، می توانیم کتابخانه آردوینو را نصب کرده و برنامه نویسی را شروع کنیم. در مثال‌های زیر به شما نشان می‌دهم که چگونه کدهای ارسال شده توسط ریموت خود را پیدا کنید، چگونه پروتکل IR مورد استفاده توسط ریموت خود را پیدا کنید، چگونه فشارهای کلیدی را روی نمایشگر سریال یا LCD چاپ کنید و در نهایت، چگونه کنترل کنید. پین های خروجی آردوینو با ریموت. کتابخانه IRremote را نصب کنید ما از کتابخانه IRremote برای همه نمونه کدهای زیر استفاده خواهیم کرد. شما می توانید فایل ZIP کتابخانه را از اینجا دانلود کنید.

برای نصب کتابخانه از فایل ZIP، Arduino IDE را باز کنید، سپس به Sketch > Include Library > Add .ZIP Library بروید، سپس فایل ZIP IRremote را که از لینک بالا دانلود کرده اید انتخاب کنید. کدهای مربوط به ریموت خود را پیدا کنید برای پیدا کردن کدهای کلیدی برای کنترل از راه دور، این کد را در آردوینو خود آپلود کنید و مانیتور سریال را باز کنید:


#include <IRremote.h>

const int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup(){
  Serial.begin(9600);
  irrecv.enableIRIn();
  irrecv.blink13(true);
}

void loop(){
  if (irrecv.decode(&results)){
        Serial.println(results.value, HEX);
        irrecv.resume();
  }
}
حالا هر کلید را روی ریموت فشار دهید و کد هگزادسیمال چاپ شده برای هر کلید را ضبط کنید.

با استفاده از برنامه بالا، جدولی از کلیدها و کدهای مربوط به آنها را از کنترلی که با گیرنده مادون قرمز و مجموعه راه دور HX1838 ارائه شده بود، استخراج کردم. توجه داشته باشید که با فشار دادن مداوم یک کلید، یک کد 0XFFFFFFFF دریافت خواهید کرد.

 Key Code
 CH- 0xFFA25D
 CH 0xFF629D
 CH+ 0xFFE21D
 << 0xFF22DD
 >> 0xFF02FD
 >|| 0xFFC23D
 – 0xFFE01F
 + 0xFFA857
 EQ 0xFF906F
 100+ 0xFF9867
 200+ 0xFFB04F
 0 0XFF6897
 1 0xFF30CF
 2 0xFF18E7
 3 0xFF7A85
 4 0xFF10EF
 5 0xFF38C7
 6 0xFF5AA5
 7 0xFF42BD
 8 0xFF4AB5
 9 0xFF52AD

پروتکل مورد استفاده توسط ریموت خود را پیدا کنید

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

#include <IRremote.h>

const int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup(){
  Serial.begin(9600);
  irrecv.enableIRIn();
  irrecv.blink13(true);
}

void loop(){
  if (irrecv.decode(&results)){
        Serial.println(results.value, HEX);
        switch (results.decode_type){
            case NEC: Serial.println("NEC"); break ;
            case SONY: Serial.println("SONY"); break ;
            case RC5: Serial.println("RC5"); break ;
            case RC6: Serial.println("RC6"); break ;
            case DISH: Serial.println("DISH"); break ;
            case SHARP: Serial.println("SHARP"); break ;
            case JVC: Serial.println("JVC"); break ;
            case SANYO: Serial.println("SANYO"); break ;
            case MITSUBISHI: Serial.println("MITSUBISHI"); break ;
            case SAMSUNG: Serial.println("SAMSUNG"); break ;
            case LG: Serial.println("LG"); break ;
            case WHYNTER: Serial.println("WHYNTER"); break ;
            case AIWA_RC_T501: Serial.println("AIWA_RC_T501"); break ;
            case PANASONIC: Serial.println("PANASONIC"); break ;
            case DENON: Serial.println("DENON"); break ;
          default:
            case UNKNOWN: Serial.println("UNKNOWN"); break ;
          }
        irrecv.resume();
 }
}

کلیدهای مانیتور سریال را چاپ کنید

 من کد بالا را گسترش دادم تا مقدار کلید را به جای کد هگزادسیمال چاپ کنم:

#include <IRremote.h>

const int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long key_value = 0;

void setup(){
  Serial.begin(9600);
  irrecv.enableIRIn();
  irrecv.blink13(true);
}

void loop(){
  if (irrecv.decode(&results)){
 
        if (results.value == 0XFFFFFFFF)
          results.value = key_value;

        switch(results.value){
          case 0xFFA25D:
          Serial.println("CH-");
          break;
          case 0xFF629D:
          Serial.println("CH");
          break;
          case 0xFFE21D:
          Serial.println("CH+");
          break;
          case 0xFF22DD:
          Serial.println("|<<");
          break;
          case 0xFF02FD:
          Serial.println(">>|");
          break ;  
          case 0xFFC23D:
          Serial.println(">|");
          break ;               
          case 0xFFE01F:
          Serial.println("-");
          break ;  
          case 0xFFA857:
          Serial.println("+");
          break ;  
          case 0xFF906F:
          Serial.println("EQ");
          break ;  
          case 0xFF6897:
          Serial.println("0");
          break ;  
          case 0xFF9867:
          Serial.println("100+");
          break ;
          case 0xFFB04F:
          Serial.println("200+");
          break ;
          case 0xFF30CF:
          Serial.println("1");
          break ;
          case 0xFF18E7:
          Serial.println("2");
          break ;
          case 0xFF7A85:
          Serial.println("3");
          break ;
          case 0xFF10EF:
          Serial.println("4");
          break ;
          case 0xFF38C7:
          Serial.println("5");
          break ;
          case 0xFF5AA5:
          Serial.println("6");
          break ;
          case 0xFF42BD:
          Serial.println("7");
          break ;
          case 0xFF4AB5:
          Serial.println("8");
          break ;
          case 0xFF52AD:
          Serial.println("9");
          break ;      
        }
        key_value = results.value;
        irrecv.resume(); 
  }
}

اگر ریموت شما کدهای متفاوتی با کدهای جدول بالا ارسال می کند، کافی است کد هگز را در هر خطی که می گوید:

case 0xFFA25D:
Serial.println(“CH-“);
در این خطوط، زمانی که کد هگز 0xFFA25D دریافت می شود، آردوینو "CH-" را چاپ می کند. کد چگونه کار می کند برای هر ارتباط IR با استفاده از کتابخانه IRremote، ابتدا باید یک شی به نام irrecv ایجاد کنیم و شماره پین ​​محل اتصال گیرنده IR را مشخص کنیم (خط 3). این شی از پروتکل و پردازش اطلاعات از گیرنده مراقبت می کند. مرحله بعدی ایجاد یک شی به نام results، از کلاس decode_results است که توسط شی irrecv برای به اشتراک گذاشتن اطلاعات رمزگشایی شده با برنامه ما استفاده می شود (خط 5). در بلوک void setup() ابتدا نرخ باود مانیتور سریال را پیکربندی می کنیم. سپس گیرنده IR را با فراخوانی تابع عضو IRrecv enableIRIn() (خط 10) شروع می کنیم. عملکرد irrecv.blink13 (true) در خط 11 هر بار که گیرنده سیگنالی از کنترل از راه دور دریافت می کند، LED آردوینو را چشمک می زند که برای اشکال زدایی مفید است. در بلوک void loop() تابع irrecv.decode در صورت دریافت کد true برمی گردد و برنامه کد را در دستور if اجرا می کند. کد دریافتی در results.value ذخیره می شود. سپس از یک سوئیچ برای مدیریت هر کد IR و چاپ مقدار کلید مربوطه استفاده کردم. قبل از شروع بلوک سوئیچ یک بلوک شرطی وجود دارد:

if (results.value == 0XFFFFFFFF)
results.value = key_value;

اگر 0XFFFFFFFF را از ریموت دریافت کنیم به معنای تکرار کلید قبلی است. بنابراین برای مدیریت الگوی کلید تکرار، هر بار که یک کد دریافت می‌شود، کد هگز را در یک متغیر جهانی key_value ذخیره می‌کنم: key_value = results.value; هنگامی که یک الگوی تکرار دریافت می کنید، سپس مقدار ذخیره شده قبلی به عنوان فشار کلید فعلی استفاده می شود. در انتهای بخش void loop() irrecv.resume() را فراخوانی می کنیم تا گیرنده ریست شود و برای دریافت کد بعدی آماده شود.


چاپ کلیدهای LCD به جای چاپ مقادیر کلیدی در مانیتور سریال، می توانید اطلاعات را روی LCD نیز نمایش دهید. برای اطلاعات بیشتر در مورد برنامه نویسی LCD، مقاله ما را در مورد راه اندازی و برنامه نویسی LCD در آردوینو بررسی کنید، اما تنظیمات اولیه به این صورت است:
مقاومت روشنایی نور پس زمینه LCD را تنظیم می کند. می تواند از 200 اهم تا حدود 2K اهم باشد. پتانسیومتر کنتراست کاراکتر را تنظیم می کند. من معمولاً از یک پتانسیومتر 10K اهم برای این یکی استفاده می کنم.

پس از اتصال همه چیز، این کد را در آردوینو آپلود کنید:
#include <IRremote.h>
#include <LiquidCrystal.h>

const int RECV_PIN = 7;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long key_value = 0;

void setup(){
  Serial.begin(9600);
  irrecv.enableIRIn(); 
  irrecv.blink13(true);
  lcd.begin(16, 2);
}

void loop(){
  if (irrecv.decode(&results)){
 
        if (results.value == 0XFFFFFFFF)
        results.value = key_value;
        lcd.setCursor(0, 0);
        lcd.clear();
        
        switch(results.value){
          case 0xFFA25D:          
          lcd.print("CH-");
          break;
          case 0xFF629D:
          lcd.print("CH");
          break;
          case 0xFFE21D:
          lcd.print("CH+");
          break;
          case 0xFF22DD:
          lcd.print("|<<");
          break;
          case 0xFF02FD:
          lcd.print(">>|");
          break ;  
          case 0xFFC23D:
          lcd.print(">|");
          break ;               
          case 0xFFE01F:
          lcd.print("-");
          break ;  
          case 0xFFA857:
          lcd.print("+");
          break ;  
          case 0xFF906F:
          lcd.print("EQ");
          break ;  
          case 0xFF6897:
          lcd.print("0");
          break ;  
          case 0xFF9867:
          lcd.print("100+");
          break ;
          case 0xFFB04F:
          lcd.print("200+");
          break ;
          case 0xFF30CF:
          lcd.print("1");
          break ;
          case 0xFF18E7:
          lcd.print("2");
          break ;
          case 0xFF7A85:
          lcd.print("3");
          break ;
          case 0xFF10EF:
          lcd.print("4");
          break ;
          case 0xFF38C7:
          lcd.print("5");
          break ;
          case 0xFF5AA5:
          lcd.print("6");
          break ;
          case 0xFF42BD:
          lcd.print("7");
          break ;
          case 0xFF4AB5:
          lcd.print("8");
          break ;
          case 0xFF52AD:
          lcd.print("9");
          break ;                   
        }
        key_value = results.value;
        irrecv.resume(); 
  }
}
مجدداً، اگر کدهای هگزا با کدهای خروجی ریموت شما مطابقت ندارند، کافی است آنها را برای هر کاراکتری که در آن نوشته شده است 0xXXXXXXXXXX; جایگزین کنید.

استفاده از کنترل از راه دور IR برای کنترل چیزها
اکنون به شما یک نمایش ساده از نحوه استفاده از کنترل از راه دور IR برای کنترل پین های خروجی آردوینو را نشان خواهم داد. در این مثال، هنگامی که دکمه خاصی فشار داده می شود، یک LED روشن می کنیم. می توانید به راحتی کد را برای انجام کارهایی مانند کنترل سروو موتورها یا فعال کردن رله ها با فشار دادن هر دکمه از راه دور تغییر دهید.

مدار مثال دارای گیرنده IR متصل به آردوینو است که یک LED قرمز به پایه 10 و یک LED سبز به پایه 11 متصل است:

کد زیر با فشردن دکمه «5» به مدت 2 ثانیه پین دیجیتال 10 HIGH و با فشار دادن دکمه «2» پین دیجیتال 11 HIGH را به مدت 2 ثانیه می نویسد:

#include <IRremote.h>

const int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
decode_results results;
const int redPin = 10;
const int greenPin = 11;


void setup(){
  irrecv.enableIRIn();
  irrecv.blink13(true);
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
}

void loop(){
    if (irrecv.decode(&results)){

        switch(results.value){
          case 0xFF38C7: //Keypad button "5"
          digitalWrite(redPin, HIGH);
          delay(2000);
          digitalWrite(redPin, LOW);
          }

        switch(results.value){
          case 0xFF18E7: //Keypad button "2"
          digitalWrite(greenPin, HIGH);
          delay(2000);
          digitalWrite(greenPin, LOW);
          }

        irrecv.resume(); 
    }
}
تا اینجا به خواص تابش مادون قرمز و چگونگی ارتباط بین فرستنده و گیرنده پرداختیم. ما دیدیم که چگونه کدهای کلید IR را برای یک کنترل از راه دور مشخص شناسایی کنیم. ما یاد گرفتیم که چگونه فشار دادن کلید را روی مانیتور سریال و روی صفحه LCD نمایش دهیم. در نهایت به شما نشان دادم که چگونه خروجی آردوینو را با ریموت کنترل کنید. از بازی با این لذت ببرید و اگر سوالی دارید یا مشکلی در تنظیم آن دارید حتما در نظرات به ما اطلاع دهید!

منابع :

منبع 1

منبع 2


از سری ای سی های استفاده شده در بازار نصب شده روی  ریموت های تلویزیون و دیگر دستگاه ها می توان به مدل زیر اشاه کرد :

GW6122