안녕하세요. 제로윈코딩입니다. Show *만들어볼 것) 키패드와 서보모터 연동 후 암호가 맞지 않는다면 서보모터는 동작하지 않고 암호가 맞는다면 서보모터를 90도 동작하고 3초간 유지. 이를 다했다면 LCD Displays로 안내 문구를 보여주고 키패드에서 암호를 입력 시 암호가 맞다면 서보모터를 동작하고 초음파 센서로 차가 지나가는 동안 서보모터가 다시 돌아오지 않도록 구현. #include <Password.h> //http://www.arduino.cc/playground/uploads/Code/Password.zip #include <Keypad.h> //http://www.arduino.cc/playground/uploads/Code/Keypad.zip #include <Servo.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 20, 4); #define TRIGPIN 11 // 트리거(송신쪽) 핀 (쏘다) trigger #define ECHOPIN 12 // 에코(수신쪽) 핀 (반향) #define CTM 10 // HIGH인 시간(µ 초) int dur; // 시간 차(µ초) float dis; // 거리(cm) Servo myservo; Password password = Password( "1234" ); const byte ROWS = 4; // Four rows const byte COLS = 4; // columns // Define the Keymap char keys[ROWS][COLS] = { {'*', '0', '#', 'D'}, {'7', '8', '9', 'C'}, {'4', '5', '6', 'B'}, {'1', '2', '3', 'A'} }; int p = 5; byte rowPins[ROWS] = { 9, 8, 7, 6 }; byte colPins[COLS] = { 5, 4, 3, 2, }; // Create the Keypad Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); void setup() { lcd.init(); lcd.backlight(); myservo.attach(10); lcd.setCursor(2, 0); lcd.print("PRESS THE KEY"); Serial.begin(9600); pinMode(TRIGPIN, OUTPUT); // 트리거 핀을 디지털 출력으로 설정 pinMode(ECHOPIN, INPUT); // 에코 핀을 디지털 입력으로 설정 keypad.addEventListener(keypadEvent); //add an event listener for this keypad } void loop() { keypad.getKey(); digitalWrite(TRIGPIN, HIGH); delayMicroseconds(CTM); digitalWrite(TRIGPIN, LOW); dur = pulseIn(ECHOPIN, HIGH); // HIGH가 되기까지 걸리는 시간을 측정 dis = (float) dur * 0.017; // 음속을 사용해서 거리 계산 } //take care of some special events void keypadEvent(KeypadEvent eKey) { switch (keypad.getState()) { case PRESSED: Serial.print("Pressed: "); Serial.println(eKey); lcd.setCursor(p, 1); lcd.print(eKey ); p ++; switch (eKey) { case '*': checkPassword(); break; //비밀 번호가 맞는지 체크하는 부분이 * case '#': password.reset(); break; //비밀번호를 리셋 default: password.append(eKey); } } } void checkPassword() { if (password.evaluate()) { Serial.println("Success"); //일치하면 Success lcd.clear(); lcd.setCursor(2, 0); lcd.print("OPEN"); int speedA = 180; myservo.write(speedA); p = 5; delay(5000); if (dis >= 100) { myservo.write(0); lcd.clear(); lcd.setCursor(2, 0); lcd.print("CLOSE"); delay(1000); lcd.clear(); lcd.setCursor(2, 0); lcd.print("PRESS THE KEY"); delay(10); p = 5; } } else { Serial.println("Wrong"); //불일치하면 Wrong lcd.clear(); lcd.setCursor(2, 0); lcd.print("WRONG"); delay(2000); lcd.clear(); lcd.setCursor(2, 0); lcd.print("PRESS THE KEY"); delay(10); p = 5; } } 코드는 위와 같이 작성함. (비밀번호 입력 후 오픈 후 5초간의 딜레이 후 거리가 10 이상이된다면 다시 클로즈. 5초의 딜레이 후 거리가 10 미만이라면 오픈 유지) 아두이노 주차장 출입구 차량차단장치(아두이노)
일상을 주제로 주변에 상황을 아두이노로 표현하는 실험을 계속 진행 중입니다. 오늘은 아파트나 일반 주차장 또는 특정 건물에 차량을 진입하는 입구 쪽에 차량 차단장치가 설치되어 있는 곳들이 많습니다. 이 차량 차단장치를 아두이노적 시각으로 한번 실험을 해보도록 하겠습니다. 1. 주차장 출입구 차량차단장치 설정위와 같이 상황은 근접감지센서를 다른 것을 이용해야 하는데 실험에서는 초음파센서를 이용하여 근접감지를 하도록 상황을 만들고 차량이 출입구 쪽으로 다가오면 근접감지가 되고 그 감지되었을 때 차량차단막기 올라가게 됩니다. 차량차단막이 내려져 있을 때는 Red LED에 불이 들어와 있는 상태이고 차단막이 올라가면 Green LED에 불이 들어오고 차량이 통과된다는 설정입니다. 2. 아두이노 주차장 출입구 차량차단장치 회로도
실제 초음파센서는 4핀이지만 가상시뮬레이터에서는 3핀 초음파센서로 7번핀으로 Trig, Echo 역활을 수행합니다. 회로도는 복잡하지 않죠. 위 회로도는 각 역활은 아래 그림으로 이해하시면 되겠습니다. 3. 코딩
사전학습으로 Servo모터와 초음파센서에 대해서 한번 읽고 오세요. 사용하실 수 있는 분들은 그냥 넘어가셔도 됩니다. [설계]
차량감지 거리를 측정은 위 초음파센서 post의 거리 계산를 함수로 거리값을 구하게 됩니다.
거리를 구하게 되면 차량이 감지판정은 if문으로 만든다.
차량이 감지 후 동작은
주석을 일일히 다 달아놓았으니깐 주석을 살펴보시기 바랍니다. 왜! if문을 state의 상태값으로 두가진 차단막 올리기/내리기 동작을 구분하였을 까요. 두 동작을 구분을 지어서 동작하게 하기 위해서요. 자세히 보시면 만약 차단막이 올라간 상태에서 계속 현재 차량이 감지되거나 계속 새로운 차량이 들어올 경우는 계속 차단막 올리는 명령을 내려야 합니다. 이미 올라갔는데 구지 반복 명령을 내릴 필요는 없이 현상태만 유지하면 됩니다. 그래서 if문으로 올라갔으면 내려가는 상황만 체크하면 되지 올라가는 상황을 동작할 필요없는 없습니다. 여기서, timeVal은 올라가는 상황 코딩 안에 다 넣지 않고 밖에다 빼낸 이유는 계속 초음파센서로 감지했을 때 마지막으로 감지된 시간을 기준으로 차단막의 유지시간을 결정하게 하기 위해서 입니다. 종합해보면,
loop()함수 내 로직만 설계에 맞게 코딩만 하면 오늘 코딩의 전부입니다. loop()함수 내 코딩은 몇줄 안되지만 설계의 내용을 다 포함되어 있네요. 글보다 코딩이 더 짧은 케이스네요. 4. 결과가상시뮬레이터에서 결과입니다. 5. 실제 테스트정상적으로 동작하는지 실제로 구현해 봤네요. 1) 아두이노 주차장 출입구 차량차단장치 회로도4핀짜리 초음파센서로 대충 실제 제작 모습과 동일하게 디자인 했네요. 위 회로도를 실제 배치하고 선을 연결하니깐 아래와 같은 모습으로 좀 지져분하게 되었습니다. 2) 코딩
위의 가상시뮬레이터 코딩에서 newPing 라이브러리를 사용해서 그부분만 수정했습니다. 그리고 초음파센서가 4핀이니 trig, echo 핀을 정확하게 지정해 줘야 합니다. 코딩은
가상시뮬레이터 소스에서 newPing 라이브러리를 이용한 방식과 4핀 초음파센서 부분만 수정하면 됩니다.
제가 쓰는 초음파센서는 가끔 0과 10이하의 값들이 찍히네요. 그래서 실험에서는 10이상의 값들만 거리 판정을 내렸네요. 만약 결과가 정상적으로 나오지 않는다면 거리측정값을 시리얼통신을 통해 시리얼모니터로 그 결과를 찍어보시고 여러분들이 원하는 값으로 수정해 주시면 됩니다. 수정해보면,
3) 결과10cm이하는 차량감지로 판정을 하지 않습니다. 그리고 20cm미만일 때 차량감지 파전을 내렸네요. 스마트폰으로 촬영하기 위해서 거리값을 최대한 줄여서 실험 했네요. |