Reference - Nghiên cứu Arduino-IRremote-master library có những gì hay


Lại cuối tuần, đến hẹn lại lên :) Mở hộp đồ nghề bóc trúng đầu tiên là cái remote, ok thế là tiếp tục cuộc hành trình với cái remote. Để có thể làm việc với nó thì cần tìm một lib để điều khiển và cuối cùng chọn Arduino-IRremote-maste.

Đồ nghề hôm nay sẽ gồm có các món sau :

Một cái remote Car Mp3, hoặc remote gì cũng được :)



Cái thứ 2 là mắt thu hồng ngoài CHQ1838, có nhiều loại thu hồng ngoại, trong bộ có 1838 sài luôn.

CHQ1838 có 3 chân cứ đếm từ trái qua phải, tín hiệu, âm và dương.

Hôm nay nghiên cứu Arduino-IRremote-master library nên sẽ làm ví dụ dùng remote điều khiển độ sáng của led, như bấm - thì đèn mờ đi, bấm + thì tăng dần ...




OK, để bắt đầu làm thì việc đơn giản như sau, bóc tách nhỏ ra để giải quyết và cuối cùng là ráp lại thành 1 bài.

Led red : Trên led muốn biết độ sáng tăng thì cần biết về kỹ thuật PWM, vậy nó là gì.

PWM là viết tắt của Pulse Width Modulation(điều chế độ rộng xung ) và nó là một kỹ thuật được sử dụng để kiểm soát độ sáng của đèn LED, điều khiển tốc độ của động cơ DC, điều khiển mô tơ servo hoặc nơi bạn phải lấy đầu ra analog bằng phương tiện kỹ thuật số....

Hiểu sơ sơ về PWM xong qua bo mạch xem có gì khác lạ không.

Arduino UNO : Để làm ví dụ ở trên thì trên bo mạch cần hiểu các ký hiệu như sau

Trên Arduino Uno, các chân PWM là 3, 5, 6, 9, 10 và 11. Tần số của tín hiệu PWM trên các chân 5 và 6 sẽ là khoảng 980Hz và trên các chân khác sẽ là 490Hz và các chân PWM được dán nhãn ~ dấu. Tới đây là đã hiểu rằng cứ thấy các số có dấu ~ là cắm dùng thôi :) trên main cũng có ghi rõ.

OK, cách cắm như hình ở trên, cứ bất cứ thiết bị nào cần cấp nguồn âm và dương, nếu có signal thì cấm phù hợp (Xem hình trên) :)

Lib : Tải thư viện về theo link, tải về và import vào

https://github.com/z3t0/Arduino-IRremote


Mỗi remote có tín hiệu riêng để điều khiển, vậy sao biết được, nếu như remote LG, Samsung thì google tìm code điều khiển remote nó sẽ có, thường trang của hãng phần develop sẽ hỗ trợ.

Hôm nay cầm cái remote này biết mới lạ, vậy thì làm sao :) trước tiên cứ test trước, có connect được remote với Arduino không mới quan trọng rồi làm cao siêu j j đó sau .

Thế là làm pặc pặc như sau : 

Viết đoạn code bấm một phát sẽ sau mã code HEX ra, và lưu nó lại thành 1 một mã và dùng, nhanh gọn lẹ :)


Bật Serial Monitor lên và lấy kết quả



Cứ thế là có hết bảng mã, không biết có cách nào nhanh hơn không nhưng cái remote này 21 nút nên nhanh :) Cuối cùng là test xem hoạt động chưa và lấy được mã là ok, coi như bước đầu ok rồi.

Quay lại vần đề chính, hôm nay làm bài test dùng remote điều khiển độ sáng của đèn led, nên ráp thêm Led vào nữa và cuối cùng sẽ ráp lại bài lớn.

Trước tiên, khi lấy được list code HEX như trên thì sẽ khai báo nó ra để cần thì lôi ra dùng.

#include  
/*Khai bao nut remote*/
const uint32_t code1 = 0xFFA25D; //CH-
const uint32_t code2 = 0xFF629D; //CH
const uint32_t code3 = 0xFFE21D; //CH+
const uint32_t code4 = 0xFF22DD; //|<<
const uint32_t code5 = 0xFF02FD; //>>|
const uint32_t code6 = 0xFFC23D; //>||
const uint32_t code7 = 0xFFE01F; //-
const uint32_t code8 = 0xFFA857; //+
const uint32_t code9 = 0xFF906F; //EQ
const uint32_t code10 = 0xFF6897; //0
const uint32_t code11 = 0xFF9867; //100+
const uint32_t code12 = 0xFFB04F; //200+
const uint32_t code13 = 0xFF30CF; //1
const uint32_t code14 = 0xFF18E7; //2
const uint32_t code15 = 0xFF7A85; //3
const uint32_t code16 = 0xFF10EF; //4
const uint32_t code17 = 0xFF38C7; //5
const uint32_t code18 = 0xFF5AA5; //6
const uint32_t code19 = 0xFF42BD; //7
const uint32_t code20 = 0xFF4AB5; //8
const uint32_t code21 = 0xFF52AD; //9


Tiếp theo khai báo Led và hồng ngoại

/*khai bao led Chan 3*/
const int led_pin = 6;
/*Mac dinh khi mo len la led sang*/
float Count = 255;
/*Khai bao receive hong ngoai*/
const int receiverPin = 8; // chan digital 8 doc tin hieu
IRrecv irrecv(receiverPin); // tao doi tuong IRrecv
decode_results results;// luu ket qua giai ma tin hieu

Khai báo setup

void setup() {
   //Serial.begin(9600);
  // put your setup code here, to run once:
   pinMode(led_pin, OUTPUT);
   analogWrite(led_pin, Count);
   irrecv.enableIRIn(); // start the IR receiver  
}

Cuối cùng trong loop dùng switch case đề gọi các nút ra

void loop() {
  // put your main code here, to run repeatedly:
    if (irrecv.decode(&results)){
      unsigned int value = results.value;
      //Serial.println(value);
       switch(value) {
      /*Nhung nut - se giam den 1 led se mo */
      /*63.75 la 255/4 co nghia la tang giam bam 4 lan cho nhanh*/
        case code1 :
        case code4 :
        case code7 :
              if(Count > 1){
                Count = Count - 63.75 ;
              }
              /*Serial.println("giam :");
              Serial.println(Count);*/
               analogWrite(led_pin, Count);
               break;
/*Nhung nut + se tang den 255 led se sang nha */               
        case code3 :
        case code5 :
        case code8 :
              if(Count < 255){
                Count = Count  + 63.75 ;
              }
              /*Serial.println("Tang :");
              Serial.println(Count);*/
               analogWrite(led_pin, Count);
               break;
/*Nhung nut giua se chuyen led den muc sang trung binh */ 
        case code2 :
        case code6 :
        case code9 :
               analogWrite(led_pin, 255 / 2);
               break;
       }
       irrecv.resume();
    }
}

Sau khi nạp code xong sẽ test bằng cách bấm tăng giảm để xem :) sẽ thấy độ sáng thay đổi rõ rệt






Cuối cùng cũng thấy sự khác quắt , tính ra thấy thú vị, vì nó có thể hình thành nhiều ý tưởng.
Full code bài này như sau :

#include  
/*Khai bao nut remote*/
const uint32_t code1 = 0xFFA25D; //CH-
const uint32_t code2 = 0xFF629D; //CH
const uint32_t code3 = 0xFFE21D; //CH+
const uint32_t code4 = 0xFF22DD; //|<<
const uint32_t code5 = 0xFF02FD; //>>|
const uint32_t code6 = 0xFFC23D; //>||
const uint32_t code7 = 0xFFE01F; //-
const uint32_t code8 = 0xFFA857; //+
const uint32_t code9 = 0xFF906F; //EQ
const uint32_t code10 = 0xFF6897; //0
const uint32_t code11 = 0xFF9867; //100+
const uint32_t code12 = 0xFFB04F; //200+
const uint32_t code13 = 0xFF30CF; //1
const uint32_t code14 = 0xFF18E7; //2
const uint32_t code15 = 0xFF7A85; //3
const uint32_t code16 = 0xFF10EF; //4
const uint32_t code17 = 0xFF38C7; //5
const uint32_t code18 = 0xFF5AA5; //6
const uint32_t code19 = 0xFF42BD; //7
const uint32_t code20 = 0xFF4AB5; //8
const uint32_t code21 = 0xFF52AD; //9

/*khai bao led Chan 3*/
const int led_pin = 6;
/*Mac dinh khi mo len la led sang*/
float Count = 255;
/*Khai bao receive hong ngoai*/
const int receiverPin = 8; // chan digital 8 doc tin hieu
IRrecv irrecv(receiverPin); // tao doi tuong IRrecv
decode_results results;// luu ket qua giai ma tin hieu
void setup() {
   //Serial.begin(9600);
  // put your setup code here, to run once:
   pinMode(led_pin, OUTPUT);
   analogWrite(led_pin, Count);
   irrecv.enableIRIn(); // start the IR receiver  
}
void loop() {
  // put your main code here, to run repeatedly:
    if (irrecv.decode(&results)){
      unsigned int value = results.value;
      //Serial.println(value);
       switch(value) {
      /*Nhung nut - se giam den 1 led se mo */
      /*63.75 la 255/4 co nghia la tang giam bam 4 lan cho nhanh*/
        case code1 :
        case code4 :
        case code7 :
              if(Count > 1){
                Count = Count - 63.75 ;
              }
              /*Serial.println("giam :");
              Serial.println(Count);*/
               analogWrite(led_pin, Count);
               break;
/*Nhung nut + se tang den 255 led se sang nha */               
        case code3 :
        case code5 :
        case code8 :
              if(Count < 255){
                Count = Count  + 63.75 ;
              }
              /*Serial.println("Tang :");
              Serial.println(Count);*/
               analogWrite(led_pin, Count);
               break;
/*Nhung nut giua se chuyen led den muc sang trung binh */ 
        case code2 :
        case code6 :
        case code9 :
               analogWrite(led_pin, 255 / 2);
               break;
       }
       irrecv.resume();
    }
}


Nhãn: