ATtiny85로 만드는 I2C 연결 범용 리모컨 송신 모듈

여러분, 즐거운 적외선 라이프를 만끽하고 계십니까? 또한 직렬은 일대일 연결이므로 너무 많은 장치를 연결할 수 없습니다. 그래서 이번에는 I2C slave판을 만들어 보았습니다.

예에 따라 우선 이번에 만든 것. ATtiny85를 I2C slave device로 사용하고 수신 된 명령을 적외선으로 전송합니다.

마지막 기사

동기



마지막 모듈을 ESP8266 + MicroPython에서 사용하려고하면 UART가 비어 있지 않아 슬픈 기분이 들었기 때문입니다. 괜찮다면 I2C다.

하고 싶은 일


  • 언어 또는 프레임 워크 런타임에 관계없이 적외선 전송의 추상화
  • 하드웨어에 관계없이 연결할 수있는 모듈화
  • NEC 형식과 그 파생 형식에 대한 대응
  • UART 없음/비어 있지 않은 마이크로 컴퓨터 용 I2C 연결 ← NEW!

  • 하드웨어편



    준비한 것



    정확히 같습니다. 라고 말하면서 마지막 기사 를 도입했습니다. In-System Programming은 코피가 나올 정도로 편리합니다.

    사양 및 회로도


  • 전원: 3.3V
  • 내장 풀업 없음

  • Pololu USB AVR Programmer v2.1

    소프트웨어편



    Arduino에서 I2C slave를 만들 때 받은 데이터를 "인터럽트로 처리하는"방법과 "loop() 함수로 처리하는"방법이 있습니다. "인터럽트 처리"방법에서는 버퍼가 작고(16바이트) 데이터를 흘리기 때문에 loop() 함수로 처리하는 방법을 채택합니다.

    여기서도 을 참고로 리모컨의 신호를 만들고 있습니다. 기본적인 움직임은 이전 기사와 동일합니다.

    Arduino에서 ATtiny85에 쓸 때 ATtiny85로 적외선 리모컨 용 파형을 만드는 이야기 | 도쿄 편의 카메라 대신 GitHub - damellis/attiny: ATtiny microcontroller support for the Arduino IDE을 사용해야합니다. 전자는 Wire.h를 다룰 수 없습니다.
    #include <avr/wdt.h>
    #include <Wire.h>
    #define COMMAND_BUFFER_SIZE 150
    #define OUTPUT_PIN _BV(1)
    
    unsigned int commandBuffer[COMMAND_BUFFER_SIZE];
    char c;
    int index = 0;
    int signalSize = 0;
    unsigned int t;
    boolean ready = false;
    
    void setup() {
    
      // I2C slave
      Wire.begin(0x40);
    
    }
    
    void mark() {
      // 38kHz, 1/3 duty
      OCR0A = OCR1C = 25;  // TOP value :  38kHz --> 26.3us.
      OCR0B = OCR1B = 6;  //  H period  : 6.4us.
      TCCR0A = B00100011; // COM0A: 00, COM0B: 10, WGM01-00: 11
      TCCR0B = B00001000; // FOC:00, WGM02:1, CS02-01: 000 (stop clock)
      GTCCR = B01100000; // OC1B cleared on compare match. Set when TCNT1 = $00.
      TCCR1 = B10000100; // CTC=1. clear TCNT1 on OCR1C==TCNT1. CS13-10 = 0100B (/8)
      TCNT1 = 0;
      TCCR0B |= B010;  // enable clock (/8).
      TCNT0 = OCR0A ;
    
    }
    
    void space() {
      TCCR0A = 0;
      TCCR0B = 0;
      TCCR1 = 0;
      GTCCR = 0;
    }
    
    void loop() {
    
      while(Wire.available()) {
        c = Wire.read();
        switch (c) {
          case '0': t = t * 10; break;
          case '1': t = t * 10 + 1; break;
          case '2': t = t * 10 + 2; break;
          case '3': t = t * 10 + 3; break;
          case '4': t = t * 10 + 4; break;
          case '5': t = t * 10 + 5; break;
          case '6': t = t * 10 + 6; break;
          case '7': t = t * 10 + 7; break;
          case '8': t = t * 10 + 8; break;
          case '9': t = t * 10 + 9; break;
          case ',':
            commandBuffer[index] = t;
            index++;
            t = 0;
            break;
          case '.':
            commandBuffer[index] = t;
            signalSize = index+2;
            t = 0;
            ready = true;
            break;
        }
        if(COMMAND_BUFFER_SIZE <= index) {
          index = 0;
        }
      }
    
      if(ready) {
    
        // IR LED
        // http://okiraku-camera.tokyo/blog/?p=7480
        noInterrupts();
        DDRB = OUTPUT_PIN; // inputは0
        PORTB = 0; // 他は0
        ACSR |= 0x80; // アナログコンパレータ禁止
        ADCSRA &= 0x7f; // disable ADC
        wdt_disable();
        TIMSK = 0;  // disable Timer0/1 overflow interrupt.
    
        for(index = 0; index < signalSize; index++) {
          if(0 == index % 2) {
            mark();
          } else {
            space();
          }
          delayMicroseconds(commandBuffer[index]);
        }
        space();
        ready = false;
        index = 0;
        signalSize = 0;
    
        // restore I2C slave
        Wire.begin(0x40);
    
        interrupts();
      }
    
    }
    

    사용 예



    전회와 같이 도시바의 실링 라이트용 리모컨 FRC-194T(W)의 「전등」버튼 채널 2를 보냅니다.

    ESP8266 (ESP-WROOM-02)의 MicroPython으로 전송



    GitHub - SpenceKonde/ATTinyCore: Arduino core for ATtiny 1634, 828, x313, x4, x41, x5, x61, x7 and x8 에 연결된 그림.

    스위치 사이언스 ESPr Developer (ESP-WROOM-02 개발 보드)
    from machine import I2C, Pin
    i2c = I2C(scl=Pin(14), sda=Pin(4))
    i2c.writeto(0x40, "10200,5050, 650,1900, 650,1900, 650,1900, 650,600, 650,600, 700,1900, 650,1850, 700,1850, 700,600, 650,600, 650,1900, 650,1900, 650,600, 700,550, 700,600, 700,600, 650,1850, 700,1900, 650,1850, 700,600, 650,1900, 650,600, 650,650, 650,600, 650,650, 650,600, 650,600, 700,1850, 650,650, 650,1900, 650,1850, 650,1900, 650.")
    

    감사의 말



    부엌에서 납땜 공작을 해도 좋다고 말해주는 아내에게 감사드립니다. 제대로 납 프리 땜납을 사용해 후 정리도 하고 있으니까.

    좋은 웹페이지 즐겨찾기