[참고] Digispark (ATTiny85)를 I2C의 A/D 변환 장치로 사용하여 RaspberryPi에서 사용합니다.
#라즈파이에 ADC가 없다! => 수중에 있는 ATTiny85의 ADC의 값을 I2C로 건네주면... 라는 것이 동기.
해소. 포토셀을 사용하여 전압을 적당히 바꾸고 A/D 변환하여 값을 취한다.
준비
지난번와 유사한 환경
핀 배치
P4
를 ADC 포트로 사용. Digispark 측 코드
#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,
};
int get_adcVal() {
analogReference(DEFAULT); // Reference = 5V
int adcValue = analogRead(2); // Read P4
i2c_regs[0] = adcValue & 0xff;
i2c_regs[1] = (adcValue>>8) & 0xff;
}
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(4, INPUT); // P4=ADC Input
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();
get_adcVal();
}
void mt08Blink(byte led, byte times)
{
times *= 2;
while(times > 0) {
digitalWrite(led,(times & 0x01) ? LOW : HIGH);
delay (200);
times--;
}
}
실행 예
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; i2cget -y 1 0x5a 0x01
0xed
0x02
pi@raspberrypi ~ $ i2cget -y 1 0x5a 0x00; i2cget -y 1 0x5a 0x01
0x59
0x00
ADC(16진)
ADC(10진)
ADC 전압
전압 실측 (테스터로 계측)
0x02ED
749
5V * 749/1024 = 3.66V
3.64V
0x0059
89
5V * 89/1024 = 0.43V
0.412V
일정은 미정
Reference
이 문제에 관하여([참고] Digispark (ATTiny85)를 I2C의 A/D 변환 장치로 사용하여 RaspberryPi에서 사용합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mt08/items/c17bb817063f379f6a10텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)