요즘 아두이노 버닝 중이에요.
아두이노 관련 첫 글이라 약간의 잡설(=뻘소리)을 좀 해야겠어요. 방해 안되게 접어둘게요. :)

더보기


여튼, PlugHouse에서 Opto-sensor라는 물건을 팔더군요. 용도는 물체의 접근을 감지하는 것.
아두이노를 접하고 만들어 보고 싶은게 충돌 감지를 이용한 '무언가'인데다가 가격도 꽤 싼편이라 올타꾸나 하고 질렀는데...
받고 나니 좌절이더군요. 데이터시트가 있지만 이건 뭐 낫 놓고 기역자도 모른다는 딱 그 꼴.

그래도 수 차례 삽질을 한 끝에 (저는) 만족할만한 결과를 뽑아주는 회로와 스케치 코드를 만들었어요.
이 회로에서 저항들이 무엇을 의미하냐고요?

몰라요;

그냥 이 회로는 수십번에 걸친 와이어링 끝에 원하는 동작이 나왔을 뿐...
저항값 수식 계산 한 번 안했지요; 핫핫핫.
그래서 말인데 혹시 이거 제대로 볼 줄 아는, 댓글 남겨 주실 분... 안생기겠죠? 네 뭐.

여기서 주의해야 할 점은 OSG-105LF라는 부품의 위치인데요,
회로도에서는 1번 핀을 기준으로 2, 4, 3 순서이지만 실제 부품상의 배치는 1, 2, 3, 4 라는 점이에요.
무슨 얘기냐면 실제 부품은 아래와 같이 생겼다는 거죠.
부품을 자세히 보면 약간 둥그스러운 부분이 딱 한 귀퉁이가 있는데 거기가 1번이에요.

암튼 위의 회로도와 부품 핀 번호를 참고해서 브레드보드에 회로를 대충대충 구성하고,
- Vcc는 아두이노의 아날로그 5v 출력으로
- Ground는 아두이노의 아날로그 Gnd로
- Signal은 아두이노의 아날로그 0번 입력으로 연결하면 돼요.

여기에 출력 확인을 위해 LED를 9번 핀에 연결했어요. (요부분은 아두이노 책에 나온 PWM 기초 회로 5-4와 동일)

다음 스케치 코드는,

const int analogInPin = 0;  // Analog input pin that the potentiometer is attached to
const int analogOutPin = 9; // Analog output pin that the LED is attached to

const int fromLow = 0;
const int fromHigh = 700;

int sensorValue = 0;        // value read from the pot
int outputValue = 0;        // value output to the PWM (analog out)

void setup() {
  // initialize serial communications at 9600 bps:
  Serial.begin(9600);
}

void loop() {
  // read the analog in value:
  sensorValue = analogRead(analogInPin);           
  // map it to the range of the analog out:
  outputValue = constrain(map(sensorValue, fromLow, fromHigh, 0, 255), 0, 255); 
  // change the analog out value:
  analogWrite(analogOutPin, outputValue);          

  Serial.print("sensor value / output value: " );                      
  Serial.print(sensorValue);
  Serial.print(" / ");
  Serial.println(outputValue);

  // wait 10 milliseconds before the next loop
  // for the analog-to-digital converter to settle
  // after the last reading:
  delay(10);                     

}

이렇게 하면 9번 핀에 연결한 LED가 0번 핀에 입력으로 들어온 Opto-interrupter의 값에 따라 밝아졌다 어두워졌다 할거에요.
동시에 시리얼 포트로는 입력으로 들어온 값이 표시되겠죠?
센서에 따라 값이 조금 다르게 들어오겠지만 제 경우는 map()함수에서 사용할 fromHigh값을 700 정도로 잡았을 때 가장 적당한 범위로 사용이 가능했어요.

여기에 이르기까지 많은 실패와 시행착오가 있었으니...

수 많은 실패작들;;
잘 보면 아시겠지만 되도 않는 회로를 그냥 막 가져다 붙였을 뿐...;;;

최종적으로 제대로 동작하는 회로.
그러나 저 저항값들이 왜 그래야 하는지는 이유가 없으니... 갑자기 부품이 파손되어도 전혀 이상하지 않을 일!

겨우겨우이어 맞춘 회로. 끝내고 나니 별거 아니네요. -_-;

저작자 표시 동일 조건 변경 허락
신고
Posted by gongdo


티스토리 툴바