오윤석

도어락 열기 프로세스 base code

1 +#-*- coding:utf-8 -*-
2 +
3 +import time
4 +import RPi.GPIO as GPIO
5 +from multiprocessing import Queue
6 +import os
7 +
8 +PIN = {
9 + 'Motor_MT_N':17,
10 + 'Motor_MT_P':4
11 +}
12 +
13 +class Motor:
14 + LEFT = 0
15 + RIGHT = 1
16 +
17 + def __init__(self):
18 + self.pwmN = GPIO.PWM(PIN['Motor_MT_N'], 100)
19 + self.pwmP = GPIO.PWM(PIN['Motor_MT_P'], 100)
20 + self.pwmN.start(0)
21 + self.pwmP.start(0)
22 +
23 + def rotate(self, direction):
24 + if direction == Motor.LEFT:
25 + GPIO.output(PIN['Motor_MT_N'], GPIO.HIGH)
26 + GPIO.output(PIN['Motor_MT_P'], GPIO.LOW)
27 + self.pwmN.ChangeDutyCycle(50)
28 + else:
29 + GPIO.output(PIN['Motor_MT_N'], GPIO.LOW)
30 + GPIO.output(PIN['Motor_MT_P'], GPIO.HIGH)
31 + self.pwmP.ChangeDutyCycle(50)
32 +
33 + def stop(self):
34 + self.pwmP.ChangeDutyCycle(0)
35 + self.pwmN.ChangeDutyCycle(0)
36 +
37 +def RFIDProcess(signalQueue):
38 + while True:
39 + ################## 이곳을 지우고 코드를 작성해주세요 ################
40 + # RFID ID가 등록된 기기의 ID인 경우 success에 True를 넣습니다.
41 + #
42 + # RFID 태그가 된 경우 API에 요청을 보내 (GET /api/device) ID 목록을
43 + # 가져온 후 이 목록 안에 태그된 기기의 ID가 있는지 여부를 확인하는 방식으로
44 + # 동작하면 될 것 같습니다.
45 + #
46 + # ID 목록을 미리 받아온 후 비교하도록 하면 ID 목록 업데이트가 안 될 수 있으니
47 + # 태그가 된 경우 ID 목록을 받아오도록 해주세요.
48 + #
49 + # success가 True인 경우 모터가 회전합니다.
50 + #
51 + # 아래 코드는 테스트를 위한 코드입니다. 아래 코드까지 지우고 작성해주세요.
52 + time.sleep(30)
53 + success = True
54 + ##############################################################
55 + if success:
56 + print("등록된 RFID ID가 확인됨")
57 + signalQueue.put("RFID")
58 +
59 +def RemoteProcess(signalQueue):
60 + while True:
61 + ################## 이곳을 지우고 코드를 작성해주세요 ################
62 + # 원격 잠금해제 요청이 들어온 경우 success에 True를 넣습니다.
63 + # 원격 잠금해제 요청은 IPC로 처리합니다.
64 + # 지우님과 협업하여 작업해주세요.
65 + #
66 + # 제 생각으로는 한 파일에 대해서 (ex ~/IPC.txt) API에서는 write하고
67 + # 도어락 프로세스에서는 read하는 방법으로 하면 될 것 같습니다.
68 + # 원격 잠금해제 요청이 들어온 경우 API에서 write하도록 하면 되겠죠..?
69 + #
70 + # success가 True인 경우 모터가 회전합니다.
71 + #
72 + # 아래 코드는 테스트를 위한 코드입니다. 아래 코드까지 지우고 작성해주세요.
73 + time.sleep(13)
74 + success = True
75 + ##############################################################
76 + if success:
77 + print("원격 잠금해제 요청이 들어옴")
78 + signalQueue.put("Remote")
79 +
80 +def signalProcess(signalQueue):
81 + pid = os.fork()
82 + if pid == 0:
83 + RFIDProcess(signalQueue)
84 + else:
85 + RemoteProcess(signalQueue)
86 +
87 +def doorProcess(doorQueue):
88 + motor = Motor()
89 + while True:
90 + signal = doorQueue.get()
91 + print("{} 신호를 받아 문 열기 동작 수행 시작".format(signal))
92 + if signal is not None:
93 + print("문 열림")
94 + motor.rotate(Motor.LEFT)
95 + time.sleep(0.5)
96 + motor.stop()
97 + time.sleep(5) # 열린 후 5초 지나면 닫힘
98 + print("문 닫힘")
99 + motor.rotate(Motor.RIGHT)
100 + time.sleep(0.5)
101 + motor.stop()
102 +
103 +if __name__ == '__main__':
104 + try:
105 + GPIO.setmode(GPIO.BCM)
106 + GPIO.setup(PIN['Motor_MT_N'], GPIO.OUT, initial=GPIO.LOW)
107 + GPIO.setup(PIN['Motor_MT_P'], GPIO.OUT, initial=GPIO.LOW)
108 +
109 + signalQueue = Queue()
110 + pid = os.fork()
111 + if pid == 0:
112 + doorQueue = Queue()
113 + pid = os.fork()
114 + if pid == 0:
115 + while True:
116 + signal = signalQueue.get()
117 + print("{} 신호가 들어와 전달 준비".format(signal))
118 + if signal is not None:
119 + doorQueue.put(signal)
120 + else:
121 + doorProcess(doorQueue)
122 + else:
123 + signalProcess(signalQueue)
124 + except Exception as e:
125 + print(e)
126 + finally:
127 + GPIO.cleanup()
...\ No newline at end of file ...\ No newline at end of file