week3
2023.01.27
17:10-20:10
-'아두이노와 피지컬 컴퓨팅 with 파이썬' Chapter 11, 13~14 공부
(채희주 조장님의 강의 후 아두이노 실습)

피에조 부저: 피에조(압전) 효과를 이용하여 소리를 낼 수 있는 부품
피에조 효과: 어떠한 성질을 이용하여 압력을 주게되면 표면에 전압이 발생하는 것
피에조 부저에서는 이 효과로 얇은 판에 미세한 떨림이 발생해 소리가 난다.
큰 소리를 내지는 못하지만 값이 싸고 사용하기 간단하다.
피에조 부저에는 2개의 핀이 달려 있는데, 긴 핀은 +극, 짧은 핀은 -극을 나타낸다.
C언어에서는 tone()함수를 이용하여 해당 주파수의 음을 내도록 할 수 있지만, 파이썬에서는 이러한 함수가 존재하지 않아, 원하는 음을 내기 위해 피에조 부저가 몇초마다 어느만큼 진동해야하는지 직접 설정해주어야 한다.
예를 들어, C4(도)는 1초당 262번 진동한다(262Hz). 따라서 이 음을 내기 위해서는 1초/262를 2로 나눈 값(0.001911) 동안 High전압을 주고 다시 같은 시간동안 Low 전압을 주어야 한다.
이 과정을 아래와 같이 파이썬 코드로 작성하여 반복하면 C4(도)의 소리를 낼 수 있다.
while True:
board.digitalWrite(buzzerPin, "HIGH")
time.sleep(0.001911)
board.digitalWrite(buzzerPin, "LOW")
time.sleep(0.001911)

온도 센서: 주변의 온도를 측정할 수 있는 부품
온도 센서의 3개의 핀은 아래의 그림에서 볼 수 있듯, 1번부터 전원 공급핀, 아날로그 출력 핀, GND 핀이다.
이 핀들을 제대로 연결하지 않을 시 온도 센서가 가열될 수 있으므로 주의해서 연결하여야 한다.

온도 센서가 측정한 값을 섭씨 온도로 출력하기 위해 다음과 같은 계산식을 거쳐야 한다.
섭씨온도 = (온도 센서가 출력한 값/1024.0) * 5000.0 / 10.0
우리가 사용한 온도 센서는 LM35dz로, 1℃ 변할 때, 10mV 변한다.(10mv/℃)
온도 센서는 아날로그 값을 출력하므로 이를 1024로 나누어주고, 5V의 전압을 주었으므로 mV로 전환하기 위해 5000을 곱해주고, 10mv/℃로 나누어 주면 섭씨 온도를 도출할 수 있다.
파이썬 코드로 작성할 시 아래와 같다.
while True:
value = board.analogRead(tempPin) # 온도 센서가 출력한 값
print("value: ", value)
millivolts = (value / 1024.0) * 5000.0 # mV 단위로 변환한 값
celsius = millivolts / 10.0 # 섭씨온도 단위로 변환한 값
print("celsius: ", celsius)
time.sleep(1)

서보모터는 전기를 이용하여 회전 동작을 하는 전자 부품이다. 0~180 사이의 각도로 움직이며, 해당 회전 범위 안에서 정확한 위치 제어가 가능하다.
위 그림에 보이는 노란색 선은 PWM(펄스 폭 변조) 기능을 지원하는 디지털 핀에 연결해야한다. 빨간색 선은 5V에, 갈색 선은 GND에 연결한다.
파이썬에서 서보모터를 제어하는 데 사용할 수 있는 명령어는 아래와 같다.
Arduino.Servos.attach(pin, min=544. max=2400) #서보모터 인스턴스 생성, 최대 8개 서보 동작
Arduino.Servos.read(pin) #특정 서보모터의 각도 값 읽기
Arduino.Servos.write(pin, angle) #특정 서보모터의 각도를 angle값으로 이동
Arduino.Servos.detach(pin) #특정 서보모터에 연결된 핀을 반환
위 함수를 이용하여 아래와 같이 코드를 짤 수 있다.
board.Servos.attach(servoPin) #서보모터 인스턴스 생성
while True:
board.Servos.read(servoPin) #서보모터의 각도 값 읽기
time.sleep(1)
board.Servos.write(servoPin, 0) #서보모터의 각도를 0 으로 이동
time.sleep(1)
board.Servos.write(servoPin, 90) #서보모터의 각도를 0 으로 이동
time.sleep(1)
board.Servos.write(servoPin, 180) #서보모터의 각도를 180 으로 이동
time.sleep(1)
board.Servos.write(servoPin, 90) #서보모터의 각도를 90 으로 이동
아두이노 키트에서 제공하는 피에조 부저의 음이 변하지 않아 문제가 발생했다. 동일한 주파수를 입력해도 각 부저마다 다른 음을 내는 것을 확인하여 부저에 문제가 있음을 알 수 있었다. 주파수에 대한 세심한 조절이 불가하여 부저를 변경하는 것이 좋을 것 같다고 판단했다.
또한, 부저를 제어하는 데 있어, 파이썬을 사용하는 게 부적절함을 느낄 수 있었다. C언어에서는 해당 주파수의 음을 원하는 시간동안 출력할 수 있지만, 파이썬은 음을 내기 위해 진동수 자체를 조절해야 하므로 다른 음을 연이어 내기에는 번거로워 교재에서도 한 음을 내는 것을 실습한다. 파이썬은 고등학생들이 접근하기에 쉬운 언어이므로 아두이노를 접하는 데는 용이할 수 있지만, 실제 사용을 위해서는 제어 함수를 다양하게 제공하는 c언어가 적절하다고 느꼈다.