อาจเป็นประโยชน์ เลยลงไว้ครับ
ผมชอบแอมป์ที่มีรีโมตหมุนโวลุ่ม ก็เลยหาข้อมูล ได้ไอเดียจากลิงค์นี้
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
}
}
ผมชอบแอมป์ที่มีรีโมตหมุนโวลุ่ม ก็เลยหาข้อมูล ได้ไอเดียจากลิงค์นี้
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
}
}
Comment