Yadda ake Amfani da Arduino a matsayin Mai Sarrafa Remote na TV
Wannan jagorar tana nuna yadda ake canza Arduino zuwa na'urar sarrafa nesa ta duniya don TV, Blu-ray player, ko wasu na'urori masu sarrafa infrared. Za ku koyi yadda ake kwance lambobin daga kowane remote, sannan ku aika waɗannan lambobin ta amfani da Arduino da LED infrared. Wannan yana buɗe duniyar damar sarrafa kai, daga sarrafa kunnawa/ kashewa mai sauƙi zuwa jerin ayyuka masu rikitarwa da suka haɗa da na'urori da yawa.
Ga wasu ra'ayoyin ayyuka don farawa:
- Ƙirƙiri tsarin kunnawa/ kashewa TV da aka tsara.
- Haɗa sarrafa TV ɗin ku cikin tsarin gida mai wayo.
- Gina remote na musamman tare da ayyuka na musamman.
- Sarrafa tsarin nishaɗin ku da umarnin murya ta hanyar mataimakin murya na Arduino.
Kayan aiki/Abubuwan haɗi
- Arduino Uno (ko allo mai jituwa)
- Modul ɗin karɓar Infrared (IR) (misali, TSOP1738, VS1838B)
- LED Infrared (IR) (misali, tsawon 940nm)
- Resistor (270-330 ohm don LED IR)
- Wayoyin haɗi
- Breadboard (na zaɓi)
Jagorar Haɗin Waya
Haɗa modul ɗin karɓar IR kamar haka (a cikin bidiyo a 02:45):
- VCC zuwa Arduino 5V
- GND zuwa Arduino GND
- Pinin sigina zuwa pin 11 na Arduino (ana iya canza shi a cikin lambar)
Haɗa LED IR kamar haka (a cikin bidiyo a 02:07):
- Ɗaya daga cikin pins ɗin LED zuwa pin 3 na Arduino (ta hanyar resistor 270-330 ohm)
- Sauran pin ɗin LED zuwa GND na Arduino
Resistor ɗin yana iyakance wutar lantarki zuwa LED IR, yana kare shi daga lalacewa (a cikin bidiyo a 03:37).
Bayanin Lambar
Da farko, shigar da ɗakin karatu na IRremote (a cikin bidiyo a 04:16). Wannan ɗakin karatu yana sarrafa rikitattun ayyukan aika da karɓar sigina na infrared. Kuna iya samun shi a cikin Manajan ɗakin karatu na Arduino.
Ƙananan lambobin da aka bayar sune don tunani. Ɗakin karatu na IRremote ya haɗa da misalin lamba don karɓa da aika sigina na IR. Misalan ana iya samun su a cikin Arduino IDE: File > Examples > IRremote.
Lambar Karɓa
Wannan ɗan lambar yana saita mai karɓa akan pin 11 (a cikin bidiyo a 04:50). Gyara RECV_PIN idan kuna amfani da wani pin daban.
#include
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
Lambar Aikawa
Wannan lambar tana aika lambar IR ɗanyen da aka ɗauka. Tsararrun raw yana adana lokutan sigina, kuma 38 yana wakiltar mitar (a cikin kHz). Kuna buƙatar maye gurbin bayanan misalin da lambar da aka ɗauka daga remote ɗin ku (a cikin bidiyo a 05:26).
irsend.sendRaw(raw, sizeof(raw) / sizeof(raw[0]), 38);
sizeof(raw) / sizeof(raw[0]) yana ƙididdige adadin abubuwan da ke cikin tsararrun raw (a cikin bidiyo a 06:18).
Aiki/ Nunin Kai tsaye
Bidiyon yana nuna ɗaukar lambar maɓallin wuta daga remote ɗin TV na Samsung sannan amfani da Arduino don kunnawa da kashe TV ɗin (a cikin bidiyo a 08:29). Tsarin ya ƙunshi ɗaukar lambar ta amfani da sketch ɗin karɓa, sannan liƙa wannan lambar a cikin sketch ɗin aikawa. Nunin yana nuna yadda Arduino ke yin koyi da remote ɗin asali cikin nasara.
Babuka
- [00:00] Gabatarwa da Bayanin Aikin
- [00:41] Fahimtar Sarrafa Nesa na Infrared
- [02:07] Abubuwan Kayan aiki da Haɗin Waya
- [04:16] Shigar da Ɗakin karatu na IRremote
- [05:26] Aika Sigina na IR tare da Arduino
- [06:46] Gwada Aikewar IR
- [08:29] Nunin Kai tsaye tare da TV na Samsung
- [09:27] Faɗaɗa Aikin da Ƙarin Ra'ayoyi
#include <IRremote.h>
// Sketch from:
//https://gist.github.com/probonopd/5793692#file-sendandreceive-ino
// http://www.pjrc.com/teensy/td_libs_IRremote.html
// If one keypress results in multiple codes being output, then
// change in IRremoteInt.h:
// #define _GAP 50000
// Provided by Robojax.com on August 4, 2018
// Watch video instructions for this code:https://youtu.be/xA66hXYRx9I
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
// Compare two tick values, returning 0 if newval is shorter,
// 1 if newval is equal, and 2 if newval is longer.
// Use a tolerance of 20%
int compare(unsigned int oldval, unsigned int newval) {
if (newval < oldval * .8) {
return 0;
}
else if (oldval < newval * .8) {
return 2;
}
else {
return 1;
}
}
// Use FNV hash algorithm: http://isthe.com/chongo/tech/comp/fnv/#FNV-param
#define FNV_PRIME_32 16777619
#define FNV_BASIS_32 2166136261
/* Converts the raw code values into a 32-bit hash code.
* Hopefully this code is unique for each button.
*/
unsigned long decodeHash(decode_results *results) {
unsigned long hash = FNV_BASIS_32;
for (int i = 1; i+2 < results->rawlen; i++) {
int value = compare(results->rawbuf[i], results->rawbuf[i+2]);
// Add value into the hash
hash = (hash * FNV_PRIME_32) ^ value;
}
return hash;
}
void setup()
{
Serial.begin(9600);
Serial.println("Robojax IR Capture");
irrecv.enableIRIn(); // Start the receiver
}
int c = 1;
void dump(decode_results *results) {
int count = results->rawlen;
Serial.println(c);
c++;
Serial.println("Hash: ");
unsigned long hash = decodeHash(results);
Serial.println(hash, HEX);
Serial.println("For IR Scope/IrScrutinizer: ");
for (int i = 1; i < count; i++) {
if ((i % 2) == 1) {
Serial.print("+");
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
}
else {
Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
}
Serial.print(" ");
}
Serial.println("-127976");
Serial.println("For Arduino sketch: ");
Serial.print("unsigned int raw[");
Serial.print(count, DEC);
Serial.print("] = {");
for (int i = 1; i < count; i++) {
if ((i % 2) == 1) {
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
}
else {
Serial.print((int)results->rawbuf[i]*USECPERTICK, DEC);
}
Serial.print(",");
}
Serial.print("};");
Serial.println("");
Serial.print("irsend.sendRaw(raw,");
Serial.print(count, DEC);
Serial.print(",38);");
Serial.println("");
Serial.println("");
}
#include <avr/interrupt.h>
#include <stdio.h>
#include <avr/pgmspace.h>
#include <stdint.h>
#include <avr/io.h>
#define IR_PORT PORTB
// #define IR_PIN PINB
// #define IR_DDR DDRB
// #define IR_BV _BV(1)
#define IR_OCR OCR1A
#define IR_TCCRnA TCCR1A
#define IR_TCCRnB TCCR1B
#define IR_TCNTn TCNT1
#define IR_TIFRn TIFR1
#define IR_TIMSKn TIMSK1
#define IR_TOIEn TOIE1
#define IR_ICRn ICR1
#define IR_OCRn OCR1A
#define IR_COMn0 COM1A0
#define IR_COMn1 COM1A1
#define PRONTO_IR_SOURCE 0 // Pronto code byte 0
#define PRONTO_FREQ_CODE 1 // Pronto code byte 1
#define PRONTO_SEQUENCE1_LENGTH 2 // Pronto code byte 2
#define PRONTO_SEQUENCE2_LENGTH 3 // Pronto code byte 3
#define PRONTO_CODE_START 4 // Pronto code byte 4
static const uint16_t *ir_code = NULL;
static uint16_t ir_cycle_count = 0;
static uint32_t ir_total_cycle_count = 0;
static uint8_t ir_seq_index = 0;
static uint8_t ir_led_state = 0;
void ir_on()
{
IR_TCCRnA |= (1<<IR_COMn1) + (1<<IR_COMn0);
ir_led_state = 1;
}
void ir_off()
{
IR_TCCRnA &= ((~(1<<IR_COMn1)) & (~(1<<IR_COMn0)) );
ir_led_state = 0;
}
void ir_toggle()
{
if (ir_led_state)
ir_off();
else
ir_on();
}
void ir_start(uint16_t *code)
{
ir_code = code;
// IR_PORT &= ~IR_BV; // Turn output off (atmega328 only)
digitalWrite(9,LOW); // Turn output off
// IR_DDR |= IR_BV; // Set it as output (atmega328 only)
pinMode(9,OUTPUT); // Set it as output
IR_TCCRnA = 0x00; // Reset the pwm
IR_TCCRnB = 0x00;
//printf_P(PSTR("FREQ CODE: %hd\r\n"), code[PRONTO_FREQ_CODE]);
uint16_t top = ( (F_CPU/1000000.0) * code[PRONTO_FREQ_CODE] * 0.241246 ) - 1;
//printf_P(PSTR("top: %hu\n\r"), top);
IR_ICRn = top;
IR_OCRn = top >> 1;
IR_TCCRnA = (1<<WGM11);
IR_TCCRnB = (1<<WGM13) | (1<<WGM12);
IR_TCNTn = 0x0000;
IR_TIFRn = 0x00;
IR_TIMSKn = 1 << IR_TOIEn;
ir_seq_index = PRONTO_CODE_START;
ir_cycle_count = 0;
ir_on();
IR_TCCRnB |= (1<<CS10);
}
#define TOTAL_CYCLES 80000 // Turns off after this number of
// cycles. About 2 seconds.
// FIXME: Turn off after having sent all data
ISR(TIMER1_OVF_vect) {
uint16_t sequenceIndexEnd;
uint16_t repeatSequenceIndexStart;
ir_total_cycle_count++;
ir_cycle_count++;
if (ir_cycle_count== ir_code[ir_seq_index]) {
ir_toggle();
ir_cycle_count = 0;
ir_seq_index++;
sequenceIndexEnd = PRONTO_CODE_START +
(ir_code[PRONTO_SEQUENCE1_LENGTH]<<1) +
(ir_code[PRONTO_SEQUENCE2_LENGTH]<<1);
repeatSequenceIndexStart = PRONTO_CODE_START +
(ir_code[PRONTO_SEQUENCE1_LENGTH]<<1);
if (ir_seq_index >= sequenceIndexEnd ) {
ir_seq_index = repeatSequenceIndexStart;
if(ir_total_cycle_count>TOTAL_CYCLES) {
ir_off();
TCCR1B &= ~(1<<CS10);
}
}
}
}
void ir_stop()
{
IR_TCCRnA = 0x00; // Reset the pwm
IR_TCCRnB = 0x00;
}
const uint16_t inputLength = 512;
void loop() {
if (irrecv.decode(&results)) {
dump(&results);
irrecv.resume(); // Receive the next value
}
if ( Serial.available() > 0 )
{
static char input[inputLength];
static uint16_t i;
char c = Serial.read();
if ( c != '\r' && c != '\n' && i < inputLength-1)
input[i++] = c;
else
{
input[i] = '\0';
i = 0;
uint16_t array[80];
uint16_t j = 0;
if ( !strncmp(input, "SEND", 4) )
{
char* p = input+4;
while ( (p = strchr(p, ' ')) != NULL )
array[j++] = strtol(p, &p, 16);
ir_start(array);
Serial.print("SENT ");
for ( uint8_t i = 0; i < j; i++ )
{
Serial.print ("0x");
Serial.print (array[i], HEX);
Serial.print(" ");
}
Serial.println();
}
}
}
}
Abin da zaka iya bukata
-
Amazon
-
eBay
Albarkatun da kuma shafukan da za a duba
-
Waje
Fayiloli📁
Babu fayiloli da ake da su.