Digispark (ATTiny85)를 I2C의 슬레이브에서 사용 (TinyWireS)하고 RaspberryPi (Master)와 통신 해보십시오.

개요


  • TinyWireS를 사용하여 Digispark를 I2C의 슬레이브로 사용
  • => TinyWireS 설치, 샘플 스케치

  • Raspberry Pi 2 (I2C Master)와 연결하여 통신 테스트.
  • => Raspbian Jessie Lite (2015-11-21) 기반의 I2C 사용 설정 및 도구 i2c-tools 설치


  • #라즈파이에 ADC가 없다! => 수중에 있는 ATTiny85의 ADC의 값을 I2C로 건네주면... 라는 것이 동기.



  • 환경


  • DigiSpark (호환품)
  • Arduino 소프트웨어 1.6.6 + Windows 10 ("[메모] Digispark(ATTiny85) Arduino 개발 환경에서 L치카 "참조)
  • RaspberryPi2 (I2C Master로 사용 i2c-tools )

  • ATTiny85



    TinyWireS 라이브러리 준비



  • htps : // 기주 b. 코 m / 라 m 보 / 치 ny ぃ 부터,
    git 또는 [Download ZIP]에서 파일 가져 오기 (ZIP 압축 해제)
  • Arduino 소프트웨어 시작
  • 스케치-> Include Library -> Add ZIP Library... 선택
  • 파일 선택 대화 상자에서 TinyWireS의 폴더 선택

  • 샘플 코드



  • attiny85_i2c_slave.ino
  • 슬레이브 주소는 0x5A
  • 4 바이트의 데이터를 보관 유지합니다.
  • 각각 0x00,0x01,0x02,0x03의 데이터 주소로부터 설정·취득 default = {0xDE, 0xAD, 0xBE, 0xEF}
  • 
    #define I2C_SLAVE_ADDRESS 0x5A // the 7-bit address
    #define LED_PIN         1      // DigiSpark LED pin
    
    #include "TinyWireS.h"
    
    #ifndef TWI_RX_BUFFER_SIZE
    #define TWI_RX_BUFFER_SIZE ( 16 )
    #endif
    
    volatile uint8_t i2c_regs[] =
    {
        0xDE, 
        0xAD, 
        0xBE, 
        0xEF, 
    };
    
    volatile byte reg_position;
    const byte reg_size = sizeof(i2c_regs);
    
    void requestEvent()
    {  
        reg_position %= reg_size;
        TinyWireS.send(i2c_regs[reg_position]);
        reg_position++;
    }
    
    void receiveEvent(uint8_t howMany)
    {
        // Sanity check
        if ((howMany < 1) || (howMany > TWI_RX_BUFFER_SIZE)) return;
        
        reg_position = TinyWireS.receive();
        howMany--;
    
        while(howMany--)
        {
            reg_position %= reg_size;
            i2c_regs[reg_position] = TinyWireS.receive();
            reg_position++;
        }
    }
    
    void setup(){
        pinMode(LED_PIN,OUTPUT);
        mt08Blink(LED_PIN, 2);               //開始時LED点滅
    
        TinyWireS.begin(I2C_SLAVE_ADDRESS);
        TinyWireS.onReceive(receiveEvent);
        TinyWireS.onRequest(requestEvent);
    }
    
    void loop()
    {
        TinyWireS_stop_check();
    }
    
    void mt08Blink(byte led, byte times)
    {
      times *= 2;
      while(times > 0) {
        digitalWrite(led,(times & 0x01) ? LOW : HIGH);
        delay (200);
        times--;
      }
    }
    

    Raspberry Pi 2


  • Raspbian: 2015-11-21-raspbian-jessie-lite
  • i2c 설정

  • 초기 설정


  • microSD에 Jessie Lite의 이미지를 넣고 부팅
  • sudo raspi-config 에서 설정
  • 1 Expand Filesystem
  • 5 Internationalisation Options
  • I2 Change Timezone

  • 9 Advanced Options
  • A2 Hostname
  • A7 I2C => <Yes> => <OK> => <Yes> (I2C 사용 가능)

  • 재부팅 => Yes


  • i2c-tools 설치
    sudo apt-get update
    sudo apt-get install i2c-tools
    

  • WiFi 설정(필요한 경우)
    % sudo iwlist wlan0 scan
    % sudo su
    % wpa_passphrase SSID 'KEY' >> /etc/wpa_supplicant/wpa_supplicant.conf
    ###
    # Wifiの素のパスワードを消す
    sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
    

  • swap 비활성화 (필요한 경우)
    sudo dphys-swapfile uninstall
    sudo dpkg --purge dphys-swapfile
    sudo rm -f /var/swap
    
  • 재부팅 ( % sudo reboot )

  • 연결






    ATTiny85
    .
    RaspberryPi


    P0(SDA)
    330Ω (적당한 저항)
    3번 핀 SDA

    P2(SCL)
    330Ω (적당한 저항)
    5번 핀 SCL

    5V
    -
    2 또는 4번 핀(5V)

    GND
    -
    6 또는 9번 핀(GND)


  • IO 전압이, ATTiny85의 5V, RaspberryPi3.3V이기 때문에, 사이 적당한 저항.
  • RaspberryPi측에서 SDA, SCL은 R23, R24에 의해 pull-up 되고 있다
    참고:
    htps //w w. 등 sp 벨 ry 피. 오 rg / 도쿠 멘 타치 온 / r r ぁ れ / 라 sp 베 ry 피 / s 치에 마치 cs / 라 sp 베 ry ー ー ー ー ー ー ー ー V1. 2-S ちぇ 마치 CS. pdf

  • 테스트


  • i2cdetect : 연결된 슬레이브 목록
  • i2cget : 데이터 읽기
  • i2cset : 데이터 쓰기
    pi@raspberrypi:~ $ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00:          -- -- -- -- -- -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    50: -- -- -- -- -- -- -- -- -- -- 5a -- -- -- -- --
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    70: -- -- -- -- -- -- -- --
    pi@raspberrypi:~$ i2cget -y 1 0x5a 0x00
    0xde
    pi@raspberrypi:~$ i2cget -y 1 0x5a 0x01
    0xad
    pi@raspberrypi:~$ i2cget -y 1 0x5a 0x02
    0xbe
    pi@raspberrypi:~$ i2cget -y 1 0x5a 0x03
    0xef
    pi@raspberrypi:~$ i2cget -y 1 0x5a 0x00 w
    0xadde
    pi@raspberrypi:~$ i2cget -y 1 0x5a 0x02 w
    0xefbe
    pi@raspberrypi:~$ i2cget -y 1 0x5a 0x03 w
    0xdeef
    pi@raspberrypi:~ $ i2cset -y 1 0x5a 0x00 0x15
    pi@raspberrypi:~ $ i2cset -y 1 0x5a 0x01 0x26
    pi@raspberrypi:~ $ i2cset -y 1 0x5a 0x02 0x37
    pi@raspberrypi:~ $ i2cset -y 1 0x5a 0x03 0x48
    pi@raspberrypi:~ $ i2cget -y 1 0x5a 0x00
    0x15
    pi@raspberrypi:~ $ i2cget -y 1 0x5a 0x01
    0x26
    pi@raspberrypi:~ $ i2cget -y 1 0x5a 0x02
    0x37
    pi@raspberrypi:~ $ i2cget -y 1 0x5a 0x03
    0x48
    pi@raspberrypi:~ $
    

  • 메모


  • Raspberry Pi 때문에 I2C의 Default의 버스 스피드는, ​​100000(100kHz)인 것 같다.
  • 변경하려면, 다음과 같이 하는 것 같다.

  • 32kHz로 버스 속도 변경
    sudo rmmod i2c_bcm2708
    sudo modprobe i2c_bcm2708 baudrate=32000
    

    좋은 웹페이지 즐겨찾기