라즈베리파이

라즈베리파이 - 3 조도센서 ,버튼

인생진리 2023. 3. 22. 13:01


수업 요약
- 18번 핀을 사용하는 이유는 라즈베리 파이에서 신호를 보내주는 용도로 쓰기 위해서임
- 18번 핀을 통해서 어떤 장치가 연결될지는 모르겠으나 수로를 출력하는 용도로 쓸 것임

- gpiop는 신호를 주고받기 위한 통로의 역할을 할 뿐임
- gpiop의 역할은 내가 원하는 신호를 원하는 시점에 주고받고 싶을 때 사용하는 게 

gpio 핀이고, gpiop는 데이터를 주고받는 용도로 

 

어떨 때는 내가 타이라는 신호를 보내 어떨 때는 이 18mp를 통해서 모라는 신호를 보내는 

그 통로의 역할만 하는 핀이 바로 gpiop임

- 모듈을 만들어서 모듈 리폴트해가지고 써보는 것만 처럼 좀 더 해보겠음


- led 실습하는 거 그다음에 버튼 연결해가지고 실습해보는 거 pwm도 바로 나옴


- 데이터 베이스 마리아들이 사용하는 것까지 같이 합쳐서 실습을 해보면 좋을 것 같음


- aws 가입해서 이미지 분석해 보는 실습까지 세 가지고 전체 시간을 마무리를 하려고 함

- 코드를 완성할 때는 단계적으로 해야 함


- 코드만 봐서는 잘못된 게 뭔지 찾기가 어려움


- 버튼을 눌렀을 때 신호가 잘 읽히는지 확인 후 pwm 동작하는 코드를 합쳐줌

버튼 눌렀을대 변화는 코드

import RPi.GPIO as gpio 
import time 

gpio.setmode(gpio.BCM) 
gpio.setup(21,gpio.IN) 
gpio.setup(18,gpio.OUT) 

p = gpio.PWM(18, 500) 
p.start(0) 

cnt= 0 
check = True 
while True: 
	btn = gpio.input(21) 
	if btn == 1: 
    	if check == True : 
        	cnt += 1 check = False print(cnt) 
            if cnt == 1: 
            	p.ChangeDutyCycle(30) 
            if cnt == 2: 
            	p.ChangeDutyCycle(100) 
            if cnt == 3: 
            	p.ChangeDutyCycle(0) 
                cnt = 0 
	elif btn == 0:
		check = True

 

주어진 코드는 RPi.GPIO 모듈을 이용하여 라즈베리 파이의 GPIO 핀을 제어하는 ​​코드입니다. 

코드를 실행하면 GPIO 21번을 입력하고, GPIO 18번을 출력으로 설정합니다. 

GPIO 18번에는 PWM 제어를 위한 객체 생성이 0%로 설정된 후 시작됩니다. 

그리고 버튼이 눌릴 때마다 cnt가 증가합니다. cnt 값에 따라 PWM 신호의 듀티 사이클이 변경됩니다.

하지만 현재 코드에서 필요하지 않은  상황이 많은 뒷받침 코드의 반환이나

코드가 요구 상황 등을 고려하여 적절한 리뷰를 작성하는 것이 좋습니다.

 

조도 센서는 주변 환경의 조도(빛의 세기)를 감지하는 센서입니다. 

이 센서는 일반적으로 광전지, 포토 다이오드 또는 CCD(Charge-Coupled Device)와 광감지 장치를 사용하여 작동합니다.

조도 센서는 보통 디지털 또는 아날로그 출력을 보면, 대부분의 경우 광센서와 함께 사용되어 조명 장치의 자동 제어 및 조명 감지, 디스플레이 제어 자동, 안전 장치, 로봇 등 다양한 응용 분야에서 사용됩니다.

하기전에 셋팅값 변경 필요

 

그후 spidev 파일 만들기 

import spidev 

spi = spidev.SplOev() 

spi.open(0,0) 

spi.max_speed_hz = 1000000

def analog_read(portChanner): 
	adc = spi.xfer2((1, (8+portChanner)«4, 0)) 
    data = ((adc[1]&3)«8)+adc[2] 
    return data

주어진 코드는 SPI 통신을 이용하여 MCP3008 아날로그-디지털 변환기에서 데이터를 읽어오는 

함수를 구현한 코드입니다. 코드의 주요 기능은 다음과 같습니다.

spidev 패키지를 이용하여 SPI 통신을 설정합니다.

 spidev는 Linux 시스템에서 SPI 통신을 사용할 수 있도록 해주는 패키지입니다.


spi 객체를 생성하고, open 함수를 이용하여 SPI 통신을 시작합니다. 

이때, open 함수의 인자로는 버스 번호와 디바이스 번호를 지정합니다.


spi.max_speed_hz를 이용하여 SPI 통신의 최대 속도를 지정합니다.


analog_read 함수를 정의합니다. 

 

이 함수는 MCP3008에서 데이터를 읽어와서, 0부터 1023까지의 값으로 변환한 후 반환합니다.


코드 자체는 큰 문제가 없어 보입니다. 하지만, 코드에서 발견된 오타나 다른 문제점을 수정해야 한다면 그 부분을 추가적으로 검토해야 합니다. 또한, 코드가 실행되는 환경에 따라서 spidev 패키지를 설치해야 할 수도 있습니다. 

이 부분도 미리 확인해야 합니다.


 

ex05_analogRead.py 만든후 아래코드 입력

import spidevRead as sr 
import time 
import RPi.GPIO as gpio 

gpio.setmode(gpio.8CM) 
gpio.setup(18,gpio.OUT) 

while True : 
	data msr.analog_read(0) 
    if data >700: 
    	gpio.output(18,0) 
        
	else: gpio.output(18,1)

주어진 코드는 SPI 통신을 이용하여 아날로그 값을 읽고, 그 값에 따라 LED를 제어하는 코드입니다.

그러나 이 코드는 E910.68 sun sensor와 같은 SPI 기반의 센서를 사용하는 경우에는 적절하지 않을 수 있습니다.

 

만약 E910.68 sun sensor와 같은 SPI 기반의 센서를 사용하는 경우,

SPIdev 라이브러리를 이용하여 데이터를 읽어와야 합니다. 이를 위해서는 다음과 같은 절차가 필요합니다.

  1. SPIdev 라이브러리를 이용하여 SPI 통신을 설정합니다.
    이때, 센서와 라즈베리파이 사이의 연결을 확인하고, 해당하는 버스 번호와 디바이스 번호를 입력해야 합니다.

  2. 0x00 명령을 전송하여 센서에서 값을 읽어옵니다. 이때, xfer2 함수를 이용하여 데이터를 송수신합니다.

  3. 읽어온 데이터를 해석하여 필요한 값으로 변환합니다.

따라서, E910.68 sun sensor와 같은 SPI 기반의 센서를 사용하는 경우,
다음과 같은 코드를 사용할 수 있습니다.

 

import spidev
import time

spi = spidev.SpiDev()
spi.open(bus, device)
spi.max_speed_hz = 5000

def read_sensor():
    # send 0x00 command to the sensor
    resp = spi.xfer2([0x00])
    # interpret the response to get the measurement value
    # ...
    return value

while True:
    value = read_sensor()
    if value > 700:
        gpio.output(18, 0)
    else:
        gpio.output(18, 1)

이 코드에서는 E910.68 sun sensor에서 값을 읽어오기 위해 0x00 명령을 전송하고,

 응답을 해석하여 값을 반환하는 read_sensor 함수를 사용합니다. 이 함수를 이용하여 값을 읽어온 후, 기존의 코드와 같이 값을 분석하여 LED를 제어합니다.


 

저항 필요

 

다른방식

import RPi.GPIO as gp 

gp.setmode(gp.BCM) 
gp.setup(18,gp.OUT) 

def ledOn() :
	gp.output(18, 1) 
def ledOff(): 
	gp.output(18,0)

주어진 코드는 RPi.GPIO 라이브러리를 이용하여 GPIO 18 핀을 출력으로 사용하고,

이 핀을 이용하여 LED를 제어하는 코드입니다. 코드 자체는 큰 문제가 없어 보입니다.

 

그러나, 만약 코드를 실행하기 전에 RPi.GPIO 라이브러리가 설치되어 있지 않다면,

이 코드는 동작하지 않을 수 있습니다. RPi.GPIO 라이브러리를 설치하기 위해서는 다음과 같은 절차를 따르면 됩니다.

  1. 터미널을 열고 다음 명령어를 실행하여 라이브러리를 설치합니다.
sudo apt-get update
sudo apt-get install python-rpi.gpio
  1. 이후에 주어진 코드를 실행하여 LED를 제어할 수 있습니다.

만약 이미 RPi.GPIO 라이브러리가 설치되어 있다면, 주어진 코드를 실행하기 전에 다음 라인을 추가하여 GPIO 핀을 초기화할 수 있습니다.

pythonCop
gp.cleanup()

이렇게 초기화를 하면 이전에 설정된 GPIO 핀의 상태를 초기화하고, 다시 설정할 수 있습니다.

따라서, 위 코드를 아래와 같이 수정하면 됩니다.

import RPi.GPIO as gp 

gp.setmode(gp.BCM) 
gp.setup(18, gp.OUT) 

def ledOn(): 
	gp.output(18, 1) 

def ledOff(): 
	gp.output(18, 0)

gp.cleanup()  # initialize GPIO pins

while True:
    ledOn()
    time.sleep(1)
    ledOff()
    time.sleep(1)
 

이렇게 수정된 코드는 LED를 1초 간격으로 켜고 끄는 코드입니다. 코드 실행 전에 RPi.GPIO 라이브러리가 설치되어 있어야 하며, GPIO 핀을 초기화하는 코드가 추가되어 있습니다.

import spidevRead as sr 
import time 
import ledCon as lc 

while True : 
	data = sr.analog_read(0) 
	if data >700: 
		lc.ledeff() 
	else: 
		lc.ledOn()

주어진 코드는 spidevRead 라이브러리를 이용하여 아날로그 값을 읽어와서, 그 값에 따라 LED를 제어하는 코드입니다.
코드 자체는 큰 문제가 없어 보입니다.

하지만 코드에서 어떤 SPI 디바이스를 사용하는지 명시되어 있지 않습니다.
이는 코드가 실행될 때, 기본적으로 SPI0 버스의 0번 디바이스를 사용하도록 설정되어 있다는 것을 의미합니다.

만약 다른 SPI 디바이스를 사용하고자 한다면, spidev 라이브러리의 open() 메소드를 사용하여
디바이스를 명시적으로 지정해주어야 합니다.

open() 메소드에는 bus와 device 인자를 전달하여 사용할 SPI 디바이스를 명시할 수 있습니다.

예를 들어, SPI1 버스의 1번 디바이스를 사용하고자 한다면, 다음과 같이 코드를 수정해야 합니다.

import spidevRead as sr 
import time 
import ledCon as lc 

spi = spidev.SpiDev()
spi.open(1, 1)  # open SPI1.1 device

while True : 
	data = sr.analog_read(0) 
	if data >700: 
		lc.ledeff() 
	else: 
		lc.ledOn()

spi.close()  # close the SPI device

이렇게 수정된 코드는 SPI1 버스의 1번 디바이스를 사용하여 아날로그 값을 읽어와서,

그 값에 따라 LED를 제어하는 코드입니다.

또한, 코드에서 SPI 디바이스를 사용하기 전에 spi.open() 메소드를 호출하여 디바이스를 열고,

사용이 끝나면 spi.close() 메소드를 호출하여 디바이스를 닫습니다.