라즈베리파이 4 #5

jjinny_0609·2023년 3월 7일
0

라즈베리파이

목록 보기
6/8

I²C 통신

I²C(Inter-Integrated Circuit)는 SPI 통신처럼 동기식 시리얼통신(직렬통신)이며 마스터 기기들과 슬레이브 기기들 간의 통신이 가능하면서 2개의 통신라인(SDA, SCL)만으로 가능하여서 쉽게 구성이 가능합니다. SPI 통신에는 슬레이브 기기가 추가 될 때 마다 CS(chip select) 통신라인이 필요한 거셍 비해 I²C에서는 추가가 필요없다. 간단하게 동시에 많은 기기를 연결 할 수 있지만 속도가 느려서 보통 저속의 주변장치 사이의 통신에 사용됩니다.

I²C 라즈베리 파이에서 설정하기

  1. 라즈베리 파이 아이콘 클릭 > Preference - Raspberry Pi Configuration을 켜고
  2. Interfaces 창을 보면 I²C 설정 항목이 있습니다. Disable로 설정 되어 있다면 Enable로 설정하고 리부팅 하면 됩니다.
  3. I²C 설정이 잘 되어있다면 커맨드 창을 열어서 다음과 같은 명령어를 입력합니다.
    아래와 같이 답변이 나온다면 설정이 제대로 된 것.

BMP180(대기압 센서) 실습

BMP180은 보쉬(Bosch)사에서 제작한 센서로 정밀한 기압 및 온도를 측정 가능합니다.
(ALTitude)는 기압에 따라서 달라지므로 기압값을 이용하여 고도로 변환이 가능합니다.

1. 브레드보드 연결

2. I²C 테스트 방법
우선 아래의 명령어를 입력하여 테스트 툴을 설치합니다.

BMP180을 연결한 후에 다음과 같이 주소(Address)를 확인

i2cdetect -y 1


3. 커맨드 창에서 다음과 같이 Adafruit사의 BMP180 센서의 라이브러리를 설치

cd (설치된 폴더 경로)
git clone https://github.com/adafruit/Adafruit_Python_BMP.git
cd Adafruit_Python_BMP
sudo pyhton3 setup.py install

4. 파이썬 코드 작성과 실행하기

5. 코드 결과

6. 실습 사진


Flask를 활용하여 센서 제어하기

Flask 세팅하기

플라스크는 경량 웹 프레임워크로, WSGI코어와 URL 라우팅을 지원하기 위해 werkzeug(벡자이그)와 템플릿 출력을 위해 jinja2 라이브러리를 함께 배포합니다.
꼭 필요한 핵심 요소를 제외하고는 필요할 때 마다 직접 환경에 맞춰 개발을 하고 라이브러리를 찾아서 추가해야 합니다.

라즈베리 파이4 에서 설치하기

Flask를 사용하기 위해서 VScode(Visual Studio Code) 툴을 이용
1. VSCode를 설치

sudo apt install code

  1. 설치 완료
  2. 실행 완료
  3. 메뉴에서 File - Open Folder

    webapps 폴더를 기본 폴더로 설정을 합니다.

Flask 설치하기

  1. Flask 설치하기위해 VSCode 메뉴에서 터미널을 실행.
    Terminal - New Terminal[Ctrl+Shift+']

    설치전 테스트를 위해 파이썬 버전을 확인

  2. 플라스크를 설치 , 설치도구는 pip

  3. 플라스크 설치된줄 알았는데 오류

$ sudo pip install flask


4. pip 버젼을 업그레이드

$ sudo pip install --upgrade pip


5. 다시 플라스크 설치

$ sudo pip install flask


6. 플라스크 설치 확인

>> from flask import Flask


7. Python extension 설치까지 완료되면 Web서버 구축을 위한 준비는 끝

설치가 완료된 모습


Flask 웹서버 구축하기

  1. 다음과 같이 코드를 작성하고 저장한다.
from flask import Flask		# from flask에서 flask는 클래스명을 의미, 클래스를 import
app = Flask(__name__)		
							# app은 Flask 객체를 가지게 됨, __name__은 내장변수이면서 전역변수
							(이 변수에는 해당 파이썬의 이름이 저장된다, app_stray)
@app.route("/")				# 라우팅을 위한 뷰 함수 등록
def helloworld():			# "Hello World"는 함수가 종료될때 요청한 쪽으로 응답되는 String 값
    return "Hello World"

if __name__ == "__main__":
    app.run(host="0.0.0.0")	# app.run()이 호출되면 웹서버가 동작함.
    						# 여기서 __name__은 두가지 이름을 가짐 첫번째는 내 모듈명 app_stary.py
							# 두번째 이름은 __main__
# 만약 다른 파일에서 app_stary.py 파일을 import 해서 사용하게 되면 __name__이 __main__이 라는
 이름이 될 수 없습니다.
__name__이 __main__이 되려면 import가 아닌 해당 파일을 직접 실행 시킬때만 가능하다.
위 문장이 필요한 이유는 app_start.py 파일을 직접 실행시켰을 때만 "서버를 작동시켜" 라는 뜻입니다.
  1. 터미널을 열고 다음과 같이 입력

  2. 웹브라우저를 열고 다음과 같이 주소를 입력합니다.

http://localhost:5000

Flask 라우팅

  1. 다음과 같이 코드를 작성하고 저장합니다.
from flask import Flask

app = Flask(__name__)

@app.route("/")
def helloworld():
    return "Hello World"

@app.route("/led/on")
def led_on():
    return "LED ON"
![](https://velog.velcdn.com/images/jjinny_0609/post/1ce56410-0612-459e-a4c0-1db71b6b35ac/image.jpeg)

@app.route("/led/off")
def led_off():
    return "LED OFF"

if __name__ == "__main__":
    app.run(host="0.0.0.0")
  1. 웹브라우저를 열어서 실행시켜봅니다.

Flask LED 제어하기

  1. 코드를 다음과 같이 수정
from flask import Flask
import RPi.GPIO as GPIO

app = Flask(__name__)

LED = 8
GPIO.setmode(GPIO.BOARD)    # BOARD는 커넥터 pin번호 사용
GPIO.setup(LED, GPIO.OUT, initial=GPIO.LOW)

@app.route("/")
def helloworld():
    return "Hello World"

@app.route("/led/on")
def led_on():
    GPIO.output(LED, GPIO.HIGH)
    return "LED ON"

@app.route("/led/off")
def led_off():
    GPIO.output(LED, GPIO.LOW)
    return "LED OFF"

@app.route("/gpio/cleanup")
def gpio_cleanup():
    GPIO.cleanup()
    return "GPIO CLEANUP"

if __name__ == "__main__":
    app.run(host="0.0.0.0")
  1. 다음 준비물이 필요

    브레드보드, 점퍼선, 저항 1K 1개, LED 1개

  2. 라즈베리 파이와 브레드보드에 연결한다. 빨간색 선은 9번 pin에 연결하였고, 주황색 선은 GND에 연결하였습니다.

  3. 웹 브라우저를 열어서 localhost:5000/led/on으로 접속

  4. 웹브라우저를 열어서 localhost:5000/led/off로 접속

  5. 웹브라우저를 열어서 localhost:5000/gpio/cleanup으로 접속


Flask LED 제어 동적 라우팅 <산형 괄호>

from flask import Flask
import RPi.GPIO as GPIO

app = Flask(__name__)

LED = 8
GPIO.setmode(GPIO.BOARD)    # BOARD는 커넥터 pin번호 사용
GPIO.setup(LED, GPIO.OUT, initial=GPIO.LOW)

@app.route("/")
def helloworld():
    return "Hello World"

@app.route("/led/<state>")
def led_on(state):
    if state == "on":
        GPIO.output(LED, GPIO.HIGH)
    else:
        GPIO.output(LED, GPIO.LOW)
    return "LED "+state

@app.route("/gpio/cleanup")
def gpio_cleanup():
    GPIO.cleanup()
    return "GPIO CLEANUP"

if __name__ == "__main__":
    app.run(host="0.0.0.0")

Flask LED 제어 동적 라우팅<쿼리 스트링>

1 app_start.py 파일을 수정

from f1
ask import Flask, request
import RPi.GPIO as GPIO

app = Flask(__name__)

LED = 8
GPIO.setmode(GPIO.BOARD) #BOARD는 커넥터 pin번호 사용
GPIO.setup(LED, GPIO.OUT, initial=GPIO.LOW)

@app.route("/")
def helloworld():
    return "Hello World"

@app.route("/led")
def led_on():
    state = request.values.get("state", "error")
    if state == "on":
        GPIO.output(LED, GPIO.HIGH)
    else:
        GPIO.output(LED, GPIO.LOW)
    return "LED "+state

@app.route("/gpio/cleanup")
def gpio_cleanup():
    GPIO.cleanup()
    return "GPIO CLEANUP" 

if __name__ == "__main__":
    app.run(host="0.0.0.0")
  1. 웹브라우저를 열어서 localhost:5000/led?state=on으로 접속
  2. 웹브라우저를 열어서 localhost:5000/led?state=off으로 접속

    4 localhost:5000/led로 접속. 서버 에러가 발생하였습니다.
  3. app_start_py 파일을 수정합니다.
from flask import Flask, request
import RPi.GPIO as GPIO

app = Flask(__name__)

LED = 8
GPIO.setmode(GPIO.BOARD) #BOARD는 커넥터 pin번호 사용
GPIO.setup(LED, GPIO.OUT, initial=GPIO.LOW)

@app.route("/")
def helloworld():
    return "Hello World"

@app.route("/led")
def led_on():
    state = request.values.get("state", "error")
    if state == "on":
        GPIO.output(LED, GPIO.HIGH)
    elif state == "off":
        GPIO.output(LED, GPIO.LOW)
    elif state == "error":
        return "쿼리스트링 state가 전달되지 않았습니다."
    else:
        return "잘못된 쿼리스트링이 전달되었습니다."
    return "LED "+state

@app.route("/gpio/cleanup")
def gpio_cleanup():
    GPIO.cleanup()
    return "GPIO CLEANUP" 

if __name__ == "__main__":
    app.run(host="0.0.0.0")
  1. 다양하게 주소를 입력하여 테스트(flask 라우팅 테스트)
profile
뉴비 개발자 입니다. velog 주소 : https://velog.io/@jjinny_0609 Github 주소 :

0개의 댓글