디지털 인터페이스가 있는 간단한 아날로그 근접 센서(Raspberry Pi용) [최종 업데이트:2014년 2월 7일]
Raspberry Pi에는 26개의 GPIO(범용 입/출력) 핀을 제어하는 Broadcom BCM2835 칩이 있습니다. 핀을 제어하는 데 사용할 수 있는 C 라이브러리 또는 RPi.GPIO python 패키지가 온라인에서 제공됩니다. RPi.GPIO 패키지는 기본적으로 Debian Linux 시스템의 RPi 버전인 Raspbian과 같은 대부분의 Raspberry Pi 시스템에 포함되어 있습니다.
arduino에 비해 RPi의 한 가지 단점은 아날로그 핀이 없다는 것입니다. 모든 GPIO 핀은 순수 디지털입니다. 예를 들어 핀 A가 출력 핀이면 0 또는 1로 표시되는 LOW(0V) 또는 HIGH(3.3V)만 출력할 수 있습니다. 핀 A가 입력 핀이면 핀 A에 가해지는 0.8V 미만의 전압에 대해 , LOW 또는 0으로 취합니다. 1.3V 이상의 전압(실제로 놀랍도록 낮습니다!)에 대해 HIGH 또는 1[참조:RPi GPIO]로 간주합니다.
하지만 실제 세계에서는 순전히 0 또는 1이 거의 발생하지 않습니다. 우리는 항상 범위 내에서 지속적인 가치를 가질 수 있는 정보를 얻습니다. 예를 들어, 온도는 10C 또는 50F 또는 100C 또는 212F일 수 있습니다. 이 숫자에는 단순히 "콜드" 또는 "핫"보다 더 많은 정보가 포함되어 있습니다. 거리는 2cm 또는 10m일 수 있으며, '가까운' 또는 '멀리'만 아는 것으로는 충분하지 않습니다.
이 단점을 극복하기 위한 몇 가지 방법이 있습니다. RPi는 SPI 또는 I2C 인터페이스를 지원하므로 외부 아날로그-디지털 변환기(ADC)를 사용하고 SPI 또는 I2C 인터페이스를 사용하여 MCP3008, TLC549, MCP23017 등과 같은 ADC를 통해 준 아날로그 신호를 얻을 수 있습니다. 이 칩 일반적으로 몇 달러의 비용이 듭니다. 그러나 추가 상용 센서를 사용하면 전체 부품 비용이 20~30달러 이상일 수 있으며 시스템을 컴팩트하게 만들기가 어렵습니다. 로봇 프로젝트의 경우 일반적으로 하나 이상의 센서가 필요하며 비용이 쉽게 추가될 수 있습니다.
사실, 많은 상황에서 실제로 이러한 외부 장치를 사용하지 않고 아날로그 디지털 을 통한 신호 핀!
핵심은 아날로그 신호를 지속 시간으로 변환하는 것입니다. 시간은 항상 아날로그이기 때문에!
몇 개의 적외선 LED, 하나의 포토트랜지스터, 하나의 2N3904 NPN 트랜지스터, 100nF 세라믹 커패시터 및 여러 개의 저전력 저항을 사용하여 간단한 적외선 근접 센서를 구축합니다. 그리고 나는 약간의 아날로그 읽기를 얻을 수 있습니다.
모든 요소는 전자 시장에서 가장 저렴합니다.
어떤 LED, 포토트랜지스터 또는 NPN 트랜지스터가 사용되는지는 중요하지 않습니다. 그것들은 거의 동일합니다.
조금 중요할 수 있는 유일한 것은 100nF(0.1uF) 커패시터입니다. 나는 아마도 최선의 선택이 아닌 로우 프로파일 세라믹을 사용했습니다. 클래스 1 세라믹 또는 필름 커패시터가 여기에 더 적합합니다.
+5V 및 GND 와이어를 외부 5V 전원 공급 장치에 연결하고 GND 와이어도 Raspberry Pi GPIO 핀의 접지에 연결합니다. 하나의 GPIO 핀, 예를 들어 핀 A를 트리거로 선택하고 이를 트리거 와이어에 연결합니다. 신호 입력/출력으로 다른 GPIO 핀, 예를 들어 핀 B를 선택하고 OUT 와이어에 연결합니다.
물체의 거리를 측정하기 위해 트리거 신호를 보내 적외선 LED를 활성화합니다. 이 LED에서 방출된 빛은 센서 앞의 물체에 의해 반사됩니다. 중간에 있는 포토트랜지스터는 반사된 빛을 모아 비례하는 전류를 발생시킨다. 이 전류는 커패시터 양단의 전압을 통합하는 데 사용됩니다(I=CdV/dt). 커패시터 전압이 특정 임계값에 도달하는 데 걸리는 시간을 모니터링하여 광트랜지스터에서 생성된 전류의 양, 즉 반사된 빛의 양을 알 수 있습니다. 분명히 물체가 가까울수록 반사광이 더 많습니다. 센서의 타이밍을 조심스럽게 보정함으로써 거리를 꽤 정확하게 측정할 수 있을 것입니다.
자세한 작업 순서는 다음과 같습니다.1. 커패시터 제로
먼저 핀 B를 출력 핀으로 설정하고 0으로 설정합니다.
GPIO.setup(PIN_B,GPIO.OUT)
GPIO.output(PIN_B,0)
time.sleep(0.01)
그러면 커패시터의 잔류 전압이 방전됩니다. 커패시터 방전을 위한 RC 시간은 t=RC=500ohm * 100nF =50us =0.00005초입니다. 핀 B에서 200RC 시간 동안 0볼트를 유지함으로써 커패시터가 완전히 방전되었는지 확인합니다(잔류 전압은 원래 잔류 전압의 e−200=10−87배여야 함).2. 핀 B를 입력으로 설정
이제 핀 B를 입력 핀으로 사용하여 광 트랜지스터에서 데이터를 가져옵니다.
GPIO.setup(PIN,GPIO.IN)
3. LED 켜기
적외선 LED를 켤 시간입니다.
GPIO.setup(PIN_A,GPIO.OUT)
GPIO.출력(PIN_A,1)
이것은 트리거 핀의 전압을 3.3V로 설정합니다. 2N3904의 BE 노드가 0.7V로 떨어지기 때문에 R1 양단의 전압은 2.6V입니다. R1을 통한 전류는 I=2.6V/4.3kΩ=0.6mA입니다. 그런 다음 2N3904는 이 전류를 ~150배 증폭하여 컬렉터에서 이미 터까지 ~ 100mA의 전류를 생성합니다. 각 LED는 짧은 시간 동안 약 50mA를 전도합니다.4. LOW로 남아 있는 핀 B의 지속 시간 타이밍
커패시터가 RPi의 임계값에 도달하여 핀 B가 HIGH가 되는 데 걸리는 시간 측정을 시작합니다.
counter=0
t1=time.clock()*1000
while(GPIO.input(PIN_B)==0)&(counter<1e4):
counter =counter+1
deltat=time.clock()*1000-t1
deltat는 핀 B가 LOW로 유지되는 시간입니다. deltat는 포토트랜지스터 전류의 역수에 비례하기 때문에 (또는 반사된 빛의 양 ), 광트랜지스터 전류는 대략 거리의 역수에 비례합니다. , deltat는 거리에 대략 비례합니다. .
deltat∝1I∝1light∝distance
(counter<1e4) 용어는 극도로 낮은 광트랜지스터 전류, 즉 무한한 거리로 인해 커패시터를 통합하는 데 너무 오래 걸리는 상황을 방지하기 위한 것입니다.
자세한 내용:디지털 인터페이스가 있는 간단한 아날로그 근접 센서(Raspberry Pi용) 마지막 업데이트 2014년 2월 7일]