주문한 아두이노는 아직 오지 않았다..
그냥 컴파일러만 받아서, 이렇게 하면 되겠지 하는 생각만으로 한번 짜봤는데,, 다행히 컴파일상 오류는 없나보다 ㅎㅎㅎ
조건 :
아두이노는 폴딩제어를 하는 8핀 릴레이가 달려있다.
입력은 Acc , 폴딩스위치 2핀 , 도어락 모터 구동신호 (+,-) 를 받는다.
폴딩스위치의 동작이 최우선하여 어느순간이건 누르면 접히게 한다.
사람이 운전중이라 판단되는 상태인 Acc 입력 상태에선 도어언락 신호에 반응하지 않는다.
Acc 가 없는 상태에서는 도어 언락/락 신호에 반응하여 폴딩 동작을 한다.
아두이노의 핀번호도 잘 모른다 어떤게 디지털인지 아날로그인지.. 일단 그냥 해봤다. ㅋㅋ
2010/07/02 수정
아두이노 시뮬레이터를 구했다.
이것저것 세팅하고 회로를 그려 어제 만든 프로그램을 테스트 했더니 제대로 동작하지 않았다.
원인파악후, 제대로 동작하는 소스를 다시 만들었다.
12V 입력을 5V 로 낮춰주는 방법, 제너다이오드 이용
아두이노 소스
// 모든 12V 가 입력되는 입력선은 전압분배회로나 제너다이오드를 써서 5V 로 낮춰줘야함.
int relay_output=1; // 폴딩을 제어할 8핀 릴레이 출력
int lock_input=2; // 도어락시 + 가 출력되는 핀 입력
int unlock_input=3; // 도어 언락시 + 가 출력되는 핀 입력
int acc = 4; // ACC 입력
int folding_switch=5; // 폴딩스위치에서 폴딩시 + 가 나오는 핀 입력
int doorlock_status = 0; // 0 = unlock , 1 = lock
int folding_switch_status=0; // 0 = normal , 1 = pushed
// 미러 접는 기능.
void folding()
{
// 폴딩 릴레이가 동작하지 않을때만 동작
if (digitalRead(relay_output)==LOW) digitalWrite(relay_output,HIGH);
}
// 미러 펼침 기능
void unfolding()
{
// 폴딩릴레이가 동작할때만 동작.
if (digitalRead(relay_output)==HIGH) digitalWrite(relay_output,LOW);
}
void setup()
{
pinMode (relay_output,OUTPUT);
pinMode (lock_input,INPUT);
pinMode (unlock_input,INPUT);
pinMode (acc,INPUT);
pinMode (folding_switch,INPUT);
}
void loop()
{
// 폴딩 스위치의 현재값을 읽음
if (digitalRead(folding_switch)==HIGH) folding_switch_status=1;
else folding_switch_status=0;
// 도어락의 신호에 따라 도오락 상태값을 저장해둠.
// 도어락 모터 신호는 연속적이지 않으니 저장해 두었다 사용해야함.
if (digitalRead(unlock_input) == HIGH) doorlock_status = 0;
if (digitalRead(lock_input) == HIGH) doorlock_status = 1;
if (folding_switch_status==1)
{
folding(); // 폴딩스위치가 눌린상태면 무조건 접음
}
else if (folding_switch_status==0) // 폴딩스위치가 안눌린 상태.
{
if (digitalRead(acc)==LOW) // 주행중인 ACC 상태에서는 속도감응 도어락이 동작하므로 락폴딩 기능 정지. ACC 가 아닌 상태에서만 동작함.
{
if (doorlock_status==0) unfolding(); // 도어가 열린 상태면 펼침
if (doorlock_status==1) folding(); // 도어가 잠긴 상태면 접음
}
}
delay (500);
}
|