요즘 아두이노 버닝 중이에요.
아두이노 관련 첫 글이라 약간의 잡설(=뻘소리)을 좀 해야겠어요. 방해 안되게 접어둘게요. :)
더보기
어느날 서점에서 '응? 이건 뭥미?' 느낌으로 책을 집었다가 삘 받고 즉시 구매한(물론 인터넷서 ㅋㅋ) 아두이노 책과 스타터 키트.
얼마나 삘을 받았냐면요 지금 휴가 1주일 받았는데 그 기간 내내 아두이노 붙잡고 쪼물딱 거리고 있어요 ㅎㅎ
그 첫 번째 글이 무려 Opto-interrupter 센서의 값을 받아서 LED의 밝기를 조절하는 회로도 및 스케치 코드라니! 얼마나 야심찹니까!
사실 저는 고등학교도 무려 '전자통신과'를 나왔고 1년 밖에 안다녔지만 대학도 전자통신과 출신.
당연히 이 정도 회로는 가볍게 만들 수 있어야 하겠죠?
...라는 건 고딩 3년간 지옥을 맛보고 이제는 직장 생활 열심히 하는 일반인에게 행렬이나 삼각함수 문제를 풀어보라고 하는 것과 마찬가지.
에? 쉽다고요? ... 쳇. 미안합니다. 전 삼각함수 따윈 죄다 잊어버렸다고요.
참 사람일이라는게 그렇더라고요.
학교 다닐 때 그렇게 재미없고 지루하게 배우고 시험 끝나자 마자 잊어버렸던 옴의 법칙이니 다이오드나 트랜지스터의 원리니 하는게 이제 와서 이토록 필요하게 될 줄은... 정말이지 몰랐네요. 삼각함수도 마찬가지지만.
그런 점에서 아두이노는 정말로 훌륭해요!
납땜도 없이 하다 못해 저항값 계산도 없이 그냥 '직관'만으로 대충대충 쓱-쓱 해서 뭔가 그럴싸한 걸 만들 수 있다니... 그것도 PC랑 연동까지 가능하다니!
여튼, 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 정도로 잡았을 때 가장 적당한 범위로 사용이 가능했어요.
여기에 이르기까지 많은 실패와 시행착오가 있었으니...
수 많은 실패작들;;
잘 보면 아시겠지만 되도 않는 회로를 그냥 막 가져다 붙였을 뿐...;;;
최종적으로 제대로 동작하는 회로.
그러나 저 저항값들이 왜 그래야 하는지는 이유가 없으니... 갑자기 부품이 파손되어도 전혀 이상하지 않을 일!
겨우겨우이어 맞춘 회로. 끝내고 나니 별거 아니네요. -_-;