[RPi] Raspberry Pi Introduction | 모니터 없이 RPi IP주소 찾기, ssh connection | GPIO

pos++·2023년 11월 8일
0

Raspberry Pi

목록 보기
1/4

2023.11.02 TIL

Embedded System

특별한 용도에 맞게 다각도로 최적화된 시스템

Operating System

CPU, Graphic Card, Keyboard 등 hardware를 잘 운영하는 체제 = Program = Application

Raspberry pi

영국에서 만들어진 embedded system board(computer)

다양한 in/out port

  • CPU, DRAM
  • Ethernet port → Network
  • GPIO(General Purpose Input-Output Pins) : breadboard에 연결
  • microSD card slot → Disk 역할
  • USB power port → power supply
  • HDMI port → display : 모니터에 연결
  • Camera module port
  • Av jack → Speaker
  • USB 3.0/2.0 port

Raspberry Pi OS

SD card에 Raspberry Pi OS 설치해보기 → Disk

https://www.raspberrypi.com/software/

Raspberry Pi 원격 연결 가능 상태 만들기 → network

진짜 이거때문에 토할뻔함 3일동안 30년늙은듯

  • 모니터가 없어서 RPi IP주소 알아내려고 집 공유기에 LAN연결해서 U+ 공유기 관리자 페이지 뒤짐
  • IP 찾은것같긴 한데 ssh 안돼서 한참 구글링
  • ssh 파일, wpa_supplicant.conf 파일 생성하고 내용 수정
  • 그래도 안됨 내용 구글링해서 사람들마다 설정한게 달라가지고 조금씩 다시 수정해보고 부팅 계속 다시해봐도 안됨
  • 결국 HDMI로 집 TV에 연결.. 그러나 화면 안나옴 줄무늬만나옴
  • 그래서 HDMI 화면 설정하는거 구글링해서 config.txt 파일 수정해보고 이것도 역시 구글링해서 나오는 설정들 다 달라서 다 해보고 부팅해보고 100번함
  • 그래도 안됨 이 시점에 TV는 포기함
  • 근데 슬랙에 어떤 분께서 RPi Imager로 OS 설치하면서 ssh와 네트워크 설정을 할 수 있다고 알려주셔서 해봄 이때 굉장히 희망적이었음
  • OS 처음부터 다시 설치함
  • wlan0 무선연결이 안됨. 설치할때 wifi이름이랑 비밀번호 입력했지만 아무리 부팅하고 sudo iwlist wlan0 scan해보고 sudo wpa_passphrase도 해보고 netstat -nr로 Gateway 확인도 해보고sudo config해서 국가변경 시간대변경도 해보고 sudo vi /etc/dhcpcd.conf도 해보고 내용 수정해보고 reboot 100번했는데 안됨.
  • 그냥 다때려치려했는데 마지막으로 OS 재설치 한번 더 해봄
  • 공유기 관리자 페이지에 여전히 무선 DHCP는 뜨지않음
  • ...! 그런데 이때! 몇분이 지나니까 연결 로그가 뜨게 된다..

    이걸 본 순간은... 절대 잊을 수 없다......

    wlan0도 나온다 너무 감격해서 울뻔했다

RPi Imager에서 OS 설치할때 아마 네트워크는 KR로, 지역은 Europe, London으로 했던것같다. 근데 이거때문에 안됐던거였을까 설마..


GPIO 이해하기

General Purpose Input/Output

Raspberry Pi에게/로부터 입력/출력이 가능한 인터페이스

Raspberry에 입력을 하거나, 입력을 받을 수 있는 pin인데, 우리가 programming 할수있는 pin!

GPIO pin map

Power : Raspberry Pi 로부터 받는 전원

  • 3v3 power → regulator를 거져서 연결
  • 5v power → pi의 전원(USB-C)과 바로 연결

Ground : 다른 전위들의 기준이 되는 전위. 0v를 가르쳐주는 pin. 땅쪽에 연결…?

GPIO

  • I2C(Inter Integrated Circuit) interface에 사용되는 pin
    → N master, M slave (max 127) 구조
    → Clock을 사용하기 때문에 전송시간 자유로움
    → 긴 data에는 부적합
    • GPIO 2(SDA) : Data 선
    • GPIO 3(SCL) : Clock 선
  • General Purpose Clock : SW 개발시 고정된 frequncy를 SW control 없이 출력 가능하게 해주는 pin
    • GPIO 4(GPCLK0)
    • GPIO 5
    • GPIO 6
  • General Purpose I/O pin : 목적이 정해지지 않은, 자유롭게 사용 가능한 pin
    • GPIO 16
    • GPIO 17
    • GPIO 22
    • GPIO 23
    • GPIO 24
    • GPIO 25
    • GPIO 26
    • GPIO 27
  • SPI(Serial Peripheral Interface)에 사용되는 pin
    → MOSI (Master Out, Slave In)
    → MISO (Master In, Slave Out)
    → SCK : clock
    → SS : Slave Select
    → 1:N 연결, N이 높아질수록 물리적 연결이 많아져야함
    → 동시에 송수신 가능, I2C 대비 속도가 빠르다
  • PCM(Pulse-Code Modulation)에 사용되는 pin
    → 사람이 이해하는 데이터를 부호화하는 방식
  • PWM(Pulse-Width Modulation)
    → 일정 주기내에서 전압이 올라가는 비율을 변경하는것 (0.5 per 1, 0.25 per 1)
    → 모터, LED 제어에 용이

→ 파란색, 빨간색 : 전기가 가로로 흐름
→ 초록색 : 전기가 세로로 흐름


GPIO - LED, resistance 연결


pip

Python의 패키지 관리 툴

RPi.GPIO Package

라즈베리파이 GPIO를 위한 Python Library

pi@raspberrypi:~workspace/python $ pip3 install RPi.GPIO

vi led.py → Python 코드 작성

import 해보기

import RPi.GPIO as rg
import time

그 다음 python3 led.py 실행해보기 → 아무 에러도 안뜬다면 성공!

나머지 코드 추가

import RPi.GPIO as rg
import time

rg.setmode(rg.BCM)  # BCM 모드로 pin 넘버링을 하겠다
ledPlusPin = 27  # 27번 pin에 LED 긴 다리 연결했으니까
rg.setup(ledPlusPin, rg.OUT)  # 27번 pin에 뭐할건지 미리 말해줌 : 출력을 하겠다
try:
	while True:
			rg.output(ledPlusPin, rg.LOW)  # ledPlusPin 한테 rg.LOW를 출력해준다 : 끈다(LOW)
			time.sleep(1)  # 1초 쉰다
			rg.output(ledPlusPin, rg.HIGH)  # ledPlusPin 한테 rg.HIGH를 출력해준다 : 켠다(HIGH)
			time.sleep(1)  # 1초 쉰다
except KeyboardInterrupt:  # control+C 누르면
	rg.cleanup()  # 종료 : pinmap 상태를 청소해주고 종료한다

WiringPi Library

라즈베리파이 GPIO를 위한 C Library

git 설치하기

sudo apt-get install git

적당한 directory 만들기

makedir -p /home/pi/workspace/c

cd /home/pi/workspace/c

git clone

git clone https://github.com/WiringPi/WiringPi

Remote에 저장된 WiringPi의 최신 소스를 local로 복사

cd WiringPi

./build

vi led.c → C 코드 작성

Header include 해보기

#include <stdio.h>
#include <wiringPi.h>

int main() {
	return 0;
}

gcc -o led lec.c -lwiringPi → 아무 에러가 없다면 성공

나머지 코드 추가

#include <stdio.h>
#include <wiringPi.h>

int main() {
	if(wiringPiSetup() == -1)  // 라이브러리와 연결이 잘 되었나 확인
		return -1;  // 문제가 있으면 -1 리턴
	
	pinMode(2, OUTPUT);  // 왜 27이 아닌 2인가? BCM 27은 wPi 2 이다. (Python 27, C 2)

	for(;;) {
		digitalWrite(2, 0);  // 2번 pin에 0 출력 
		delay(1000);  // time sleep
		digitalWrite(2, 1);  // 2번 pin에 1 출력
		delay(1000);  // time sleep
	}
	
	return 0;
}

gpio readall → 각 모드별로 pin번호 목록 출력


LED 두개 동시에 깜빡거리기

import RPi.GPIO as rg
import time

rg.setmode(rg.BCM)  # BCM 모드로 pin 넘버링을 하겠다
ledPlusPin1 = 27
ledPlusPin2 = 22

rg.setup(ledPlusPin1, rg.OUT)  # 27번 pin에 뭐할건지 미리 말해줌 : 출력을 하겠다
rg.setup(ledPlusPin2, rg.OUT)

try:
	while True:
			rg.output(ledPlusPin1, rg.LOW)  # ledPlusPin 한테 rg.LOW를 출력해준다 : 끈다(LOW)
			rg.output(ledPlusPin2, rg.LOW)
			time.sleep(1)  # 1초 쉰다
			rg.output(ledPlusPin1, rg.HIGH)  # ledPlusPin 한테 rg.HIGH를 출력해준다 : 켠다(HIGH)
			rg.output(ledPlusPin2, rg.HIGH)
			time.sleep(1)  # 1초 쉰다
except KeyboardInterrupt:  # control+C 누르면
	rg.cleanup()  # 종료 : pinmap 상태를 청소해주고 종료한다
profile
밀린 TIL 업로드 조금씩 정리중...

0개의 댓글

관련 채용 정보