Announcement

Collapse
No announcement yet.

ลองทำ ir remote หมุนโวลุ่ม alps ด้วย arduino

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • ลองทำ ir remote หมุนโวลุ่ม alps ด้วย arduino

    อาจเป็นประโยชน์ เลยลงไว้ครับ

    ผมชอบแอมป์ที่มีรีโมตหมุนโวลุ่ม ก็เลยหาข้อมูล ได้ไอเดียจากลิงค์นี้

    http://www.hifivision.com/diy/44275-...g-arduino.html

    จะเอาไว้ใส่กับ lm3886

    ไม่เคยใช้ arduino มาก่อน ก็เลยลองสั่ง uno r3 clone จากจีน ร้อยเดียวส่งถึงบ้าน
    แล้วก็สั่ง mini clone มาอีกตัว 75 บาท
    ทั้งสองตัวใช้ชิบ usb ch340+atmega328

    พอดีตัวใหญ่มาก่อนก็เลยลองทำดู
    นั่งมั่วอยู่สองวัน กว่าจะใช้ได้ ต้องใช้ ide ตัวเก่า ผมใช้ 1.0.5
    ตัว sketch อาศัยลอกจากลิงค์ด้านบน
    รีโมตใช้ของที่มีอยู่ได้
    ตัวรับรีโมต หาจากของเก่า หรือซื้อใหม่ประมาณ 10 กว่าบาท
    ไฟเข้าดีซีตอนทำเสร็จแล้ว 7-12v ผมกะเอาขดไฟ 6vac จากหม้อแปลง
    ผ่านไดโอด+ซีฟิลเตอร์ น่าจะได้ประมาณ 7vdc

    รูปแบบการต่อ



    ลองครั้งแรก มอเตอร์เสียงดังแกรกๆ แล้วเงียบ
    เอาไฟดีซี 5v มาป้อนก็ไม่หมุน นั่งกุมขมับ โวลุ่ม alps ปลอมน่าจะกลับบ้าน
    เลยไปหามอเตอร์อื่นมาลองดู แล้วนั่งแก้โค้ดใหม่จนมันน่าจะใช้ได้
    เอาโวลุ่มตัวเดิมที่ไม่หมุนมาลองอีกที มันดันหมุนได้ ผมงงจริงๆ
    ความรู้พวกนี้ไม่ค่อยมี อาศัยลองผิดถูก

    หมายเหตุ : มอเตอร์ตามดาต้าชีต ใช้กระแสประมาณ 100ma uno r3 จ่ายกระแสที่ 20ma ต่อ pin
    ก็เลยใช้ 6 pin สำหรับ mini น่าจะจ่ายประมาณ 40 ma ก็น่าจะใช้ประมาณ 3 pin

    รูปตอนต่อ ในรูป alps ปลอม ไว้ลองเฉยๆ



    ตัวโค้ดของผม ลบพวก input selector ออก
    พอ upload เสร็จแล้วก็เปิด serial monitor ดู แล้วแก้ค่า 0x40996A95, 0x40995AA5 ตามรีโมตที่ใช้
    หากเสร็จเรียบร้อยก็ลบโค้ดที่ให้พิมพ์ออก serial monitor ออกได้

    #include <IRremote.h>
    #include <IRremoteInt.h> // This library does not need to be included at this point but it seems like it might be important?
    long oldValue; // This value will save the last meaningful remote input and reuse it in the case of a repeat
    int RECV_PIN = 12; // The pin that recieves the IR sensor Output. The leftmost pin when looking at the eye with pins down.
    int volDelay = 100; //this value can be changed to move volume for longer increments

    IRrecv irrecv(RECV_PIN); // The core IR parts of the program and the libraries come from Ken Shirriff's blog: A Multi-Protocol Infrared Remote Library for the

    Arduino
    decode_results results;

    void MotorOff()
    {
    digitalWrite(A0,LOW);
    digitalWrite(A1,LOW);
    digitalWrite(A2,LOW);
    digitalWrite(A3,LOW);
    digitalWrite(A4,LOW);
    digitalWrite(A5,LOW);

    digitalWrite(2,LOW);
    digitalWrite(3,LOW);
    digitalWrite(4,LOW);
    digitalWrite(5,LOW);
    digitalWrite(6,LOW);
    digitalWrite(7,LOW);
    }

    void MotorUp()
    {
    digitalWrite(A0,HIGH);
    digitalWrite(A1,HIGH);
    digitalWrite(A2,HIGH);
    digitalWrite(A3,HIGH);
    digitalWrite(A4,HIGH);
    digitalWrite(A5,HIGH);

    digitalWrite(2,LOW);
    digitalWrite(3,LOW);
    digitalWrite(4,LOW);
    digitalWrite(5,LOW);
    digitalWrite(6,LOW);
    digitalWrite(7,LOW);
    }

    void MotorDown()
    {
    digitalWrite(A0,LOW);
    digitalWrite(A1,LOW);
    digitalWrite(A2,LOW);
    digitalWrite(A3,LOW);
    digitalWrite(A4,LOW);
    digitalWrite(A5,LOW);

    digitalWrite(2,HIGH);
    digitalWrite(3,HIGH);
    digitalWrite(4,HIGH);
    digitalWrite(5,HIGH);
    digitalWrite(6,HIGH);
    digitalWrite(7,HIGH);
    }

    void setup()
    {
    pinMode(A0,OUTPUT);
    pinMode(A1,OUTPUT);
    pinMode(A2,OUTPUT);
    pinMode(A3,OUTPUT);
    pinMode(A4,OUTPUT);
    pinMode(A5,OUTPUT);

    pinMode(2,OUTPUT);
    pinMode(3,OUTPUT);
    pinMode(4,OUTPUT);
    pinMode(5,OUTPUT);
    pinMode(6,OUTPUT);
    pinMode(7,OUTPUT);

    MotorOff();
    Serial.begin(9600);
    irrecv.enableIRIn(); // Start the receiver
    }

    void loop()
    {
    if (irrecv.decode(&results))
    {
    Serial.print(results.bits, DEC);
    Serial.print(" --results.value"); //printing newly recieved IR code to serial monitor
    Serial.print(results.value, HEX);
    irrecv.resume(); // Receive the next IR code. This code is an interrupt, so the arduino can go on with other tasks.

    if (results.value==0x40996A95) //if up button pushed move motor forward with a 120ma shot of 5V
    {
    oldValue=results.value; //setting the placeholders value
    MotorUp();
    delay(volDelay); //this value can be changed to move volume in bigger increments
    MotorOff();
    }

    else if (results.value==0x40995AA5) // down button pushed
    {
    oldValue=results.value;
    MotorDown();
    delay(volDelay);
    MotorOff();
    }

    else if (results.value==0xFFFFFFFF) // button is held down, do the last thing done, again
    {
    if (oldValue==0x40996A95)
    {
    MotorUp();
    delay(volDelay);
    MotorOff();
    }

    else if (oldValue==0x40995AA5)
    {
    MotorDown();
    delay(volDelay);
    MotorOff();
    }
    }

    else if ((results.value!=0x40996A95) && (results.value!=0x40995AA5))
    {
    oldValue =results.value;
    MotorOff();
    }


    Serial.print(" --oldValue");
    Serial.println(oldValue, HEX); // this shows the placeholder at work and starts a new line in the serial monitor

    }
    }

  • #2
    แหล่ม อยากรู้ว่าจะมีvrตัวไหนที่ทำแบบนั้นได้บ้างเนี่ยอยากเอามาทำตัวหรี่ไฟหน่อย - - หรือมีตัวไหนทำได้บ้างอ่ะครับ พอดีผมทำโปรเจคอยู่ 5 5 เพิ่งลองเล่นเหมือนกันใช้ง่ายดี

    Comment


    • #3
      lm3886 วงจรบางส่วนของ my_ref rev c ต่อรีโมต ใช้ arduino mini
      งบชุดรีโมตประมาณ 100 บาทครับ
      รีโมตใช้ของที่ไม่ได้ใช้ ต่อหลอดไฟ เวลากดรีโมต จะกระพริบ

      Comment

      Working...
      X