11페이지
2017년 1월 현재 시점에서는 overclock을 지원하지 않는다.
2017년 1월 현재 시점에서 파이3에서는 overclock을 지원하지 않는다. (파이 2에서는 지원)
130페이지
i2cdetect 0
i2cdetect 1
i2cdetect -y 0
i2cdetect -y 1
3.2.4
SCL은 파이의 GPIO 4번과 연결한다.
SCL은 파이의 GPIO 3번과 연결한다.
201페이지
대부분의 서보 모터는 PWM 펄스 주기와 듀티비를 이용해 회전 각도를 조절하게 설계되어있다.
위 표현은 설명이 부족하다. PWM 펄스의 High 상태의 시간으로 조절한다는 표현이 더 정확하다. 물론 펄스 주기(Hz)와 듀티비를 조절하면 PWM 펄스의 High 상태 시간 조절이 가능하다. 많은 서보 모터들은 50Hz의 PWM을 사용한다. (하지만 반드시 50Hz일 이유는 없다.) 따라서 하나의 펄스 폭은 20ms가 되며 듀티비가 10%이면 2ms가 된다. 대부분의 서보는 1ms ~ 2ms 또는 0.5ms ~ 2.5ms에서 작동한다. 정확한 값은 데이터 시트 및 실험을 통해 확인한다.
205페이지
SG90 데이터시트에는 50Hz의 PWM이 필요하며 1.5ms 펄스는 0도(중앙), 2ms 펄스는 90도까지, 0 ~ 1ms 펄스는 -90도로 변한다고 되어 있다.
SG90 서보 모터의 회전각은 데이터 시트의 내용과는 달리 대략 0.6ms ~ 2.4ms 근처에서 정해진다.
SG90 서보 모터는 입문용으로 정밀한 제어가 불가능하다. 정확한 각도로 움직이지 않더라도 이상하게 생각할 필요 없다. 성능이 뛰어난 서보 모터를 사용하면 좀 더 정확한 제어가 가능하다.
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import sys
import time
# 하드웨어 PWM은 18번 핀을 이용해 제어한다.
pin = 18
# 임의의 입력 각도 만큼 SG90 모터를 회전시킨다.
# 0.6ms ~ 2.4ms (duty -> 3 ~ 12) JDX 서보 모터는 0.5 ~ 2.5ms에서 작동
def sg90_servo(angle):
global pwm
if(angle < 0 or angle > 180):
print "invalid angle:", angle
return
dp = 3 + angle * 9.0 / 180.0
pwm.ChangeDutyCycle(dp)
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin, GPIO.OUT)
# 18번 핀을 H/W PWM(50Hz)으로 지정한다.
pwm = GPIO.PWM(pin, 50)
# 서보 모터를 중앙에 위치 시킴
pwm.start(7.5)
try:
while True:
# 임의의 회전각 입력 받음
val = input("angle 0 ~ 180 or -1 to quit:")
angle = val
if(-1 == angle):
break
# 회전각만큼 모터 회전 시킴
sg90_servo(angle)
except KeyboardInterrupt:
pwm.stop()
GPIO.cleanup()
209페이지
그림 4-17에서 GPIO24는 GPIO27의 표기 오류이다. 스테퍼 모터 예제에서는 GPIO27번을 사용했다.
220 ~ 222페이지
201페이지 수정 내용을 반영해 소스코드의 서보모터 회전각 조절하는 부분을 수정한다.
수정전
# PWM 듀티 설정
def set_PWM_Duty(channel, rate):
on = 0
off = rate * 4095.0 / 100.0
set_PWM(channel, on, int(off))
......(중략)......
try:
while True:
val = input("Duty: 0.0 ~ 100.0, Ctrl+C to quit:")
set_PWM_Duty(0, val)
time.sleep(1)
except KeyboardInterrupt:
print "Servo driver Application End"
set_PWM(0, 0, 0)
exit()
수정 후
# PWM 듀티 설정
def set_PWM_Duty(channel, rate):
on = 0
off = rate * 4095.0 / 100.0
set_PWM(channel, on, int(off))
# PWM Length 설정
def set_PWM_Length(channel, rate):
pulse = 1000.0 / Hz #perhaps 20ms
off = rate * 4095/pulse
on = 0
set_PWM(channel, on, int(off))
print "PWM 0 ~ 4095:", off, " duty:", off * 100 / 4095
# angle 설정 (SG90의 경우 대략... 0도=0.6ms ... 180도=2.5ms)
def set_angle(channel, rate):
val = 0.6 + rate * 1.9 / 180.0
print "PWM High time:", val
set_PWM_Length(channel, val)
......(중략)......
try:
while True:
val = input("angle: 0 ~ 180, Ctrl+C to quit:")
if(val < 0 or val > 180):
print "Invalid range"
else:
set_angle(0, val)
time.sleep(1)
except KeyboardInterrupt:
print "Servo driver Application End"
set_PWM(0, 0, 0)
exit()
238페이지
그림 5-17설명 위치가 테이블 내용과 겹치는 편집 오류
290페이지
그림 6-22에서 LED 연결시 저항이 빠져있습니다. 저항을 한개 연결하시기 바랍니다. image.md 파일에 새로운 이미지를 올려두었습니다.
300페이지