아두이노
- 이탈리아어로 절친한 친구
- 센서나 부품 등 장치를 연결하는 오픈소스의 마이크로 컨트롤러 내장한 기기제어용 기판
아두이노 프로젝트의 구성
- 아두이노 보드
- 외부 하드웨어
- 오감 표현의 부품센서
- 관절과 신체를 표현할 모터, 바퀴 프레임
- 부품을 움직이게 하는 프로그래밍
- 스케치(아두이노 IDE)를 사용하여 개발한다.
마이크로 컨트롤러(MCU)
- 작고 간단한 제어장치를 만들기 위한 특화덴 마이크로 프로세서의 한 종류(임베디드 시스템)
아두이노 보드의 종류
- 아두이노 UNO : 기본 기판, DIP, SMD
- 14개의 디지털 입력과 6개의 아날로그 입력을 받는다.
- 아두이노 MEGA : 다른 보드보다 입력 포트가 더 많은 54개를 가진다.
- 아두이노 Leonardo : USB 내장된 프로세서 사용
- 아두이노 YUN : 와이파이 내장된 보드
아두이노 실드
- 기본 보드 외 기능 확장을 위해 사용
- 종류 : 이더넷 쉴드, 와이파이 실드, 블루투스 실드 등
아두이노 UNO
- 디지털 0,1은 통신을 위한 포트이기 때문에 장치를 연결하지 않는다.
- 전원은 usb 전원과 기본 전원이 있다.
- reset버튼은 내 코드를 처음부터 재시작한다.
- 아날로그는 입력만 가능하다.
- 아날로그 출력을 위해서 PWM 기능을 사용한 디지털 포트를 이용한다.
- PWM은 전압 값을 이용하여 디지털 신호를 아날로그 신호처럼 사용한다.
- ~표시가 있는 3,5,6,10,11번 포트에서 사용 가능하다.
- 파워 :
- Vin : 외부 전원을 입력할 포트.
- gnd : ground의 약자 -
- 전압 : 사용전압 5V, 추천입력 7~12V, 최대 입력 6~20V
브레드보드
- +,-가 작성된 부분은 버스영역, 전원을 연결할 때 사용
- 5개씩 있는 부분은 IC영역, 부품영역
- 부품영역은 5개씩 짝지어있고, 그 이외와 연결되지 않음
아두이노 스케치의 요소
- 시리얼 플로터 : 입출력 전압 정보를 알려준다.
- 시리얼 모니터 : 변수 등의 내용물을 보기 위한 툴
아두이노 코드의 구성
- setup : 한번만 실행되는 코드
- loop : 계속해서 반복하는 코드
아두이노 메소드
- pinMode : 각 포트에 대한 모드를 지정한다. INPUT, OUTPUT
- pinMode(13, OUTPUT);
- digitalWrite : 디지털 포트에 전기신호를 보낸다. HIGH, LOW 등이 지정되어 있다.
- digitalWrite(13, HIGH);
- analogWrite : 디지털 포트에 아날로그 전기신호를 보낸다. 0~255의 사이의 숫자를 지정하여준다. PWM포트에서만 사용 가능하다.
- analogWrite (13, 255);
- delay : 일정 시간만큼 대기 후 코드 실행한다.
- delay(500);
======================================================
c++의 상수 선언
- 자바에서 final과 같은 사용
- #define 변수명 값
버튼 연결하기
- 버튼을 사용하기 위해 10k 저항을 이용한다.
- 버튼의 기본 원리는 전류의 방향을 바꿔 전압 상태를 바꾸는 것이다.
- 기본 회로는 다음과 같다
- 토글식으로 버튼의 불빛이 켜지고 꺼지도록 하는 방법
// 핀 번호 정의
const int buttonPin = 2; // 버튼 핀
const int ledPin = 13; // LED 핀
// 변수 선언
int buttonState = 0; // 버튼 상태 저장 (HIGH 또는 LOW)
int lastButtonState = 0; // 이전 버튼 상태 저장
int ledState = LOW; // LED 상태 저장 (ON 또는 OFF)
void setup() {
// 핀 모드 설정
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void loop() {
// 버튼 상태 읽기
buttonState = digitalRead(buttonPin);
// 버튼의 상태가 변경되었는지 확인
if (buttonState != lastButtonState) {
// 버튼이 눌리면 LED 상태 토글
if (buttonState == HIGH) {
ledState = !ledState;
digitalWrite(ledPin, ledState);
}
delay(50); // 디바운스를 위한 짧은 지연 시간
}
// 현재 버튼 상태를 이전 버튼 상태로 업데이트
lastButtonState = buttonState;
}
가변저항을 이용해 아날로그 데이터를 받고 led 밝기로 지정하는 코드
// 핀 번호 정의
const int buttonPin = 2; // 버튼 핀
const int ledPin1 = 11;
const int ledPin2 = 10; // LED 핀
// 변수 선언
int buttonState = 0; // 버튼 상태 저장 (HIGH 또는 LOW)
int lastButtonState = 0; // 이전 버튼 상태 저장
int ledState = 0; // LED 상태 저장 (ON 또는 OFF)
int brightness = 0;
void setup() {
// 핀 모드 설정
pinMode(buttonPin, INPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
Serial.begin(9600);
}
void loop() {
// 버튼 상태 읽기
buttonState = digitalRead(buttonPin);
brightness = analogRead(0) / 4;
Serial.println(brightness);
// 버튼의 상태가 변경되었는지 확인
if (buttonState != lastButtonState) {
// 버튼이 눌리면 LED 상태 토글
if (buttonState == HIGH) {
ledState++;
}
}
if (ledState % 3 == 0) {
analogWrite(ledPin1, 0);
analogWrite(ledPin2, 0);
} else if (ledState % 3 == 1) {
analogWrite(ledPin1, brightness);
analogWrite(ledPin2, 0);
} else if (ledState % 3 == 2) {
analogWrite(ledPin1, brightness);
analogWrite(ledPin2, brightness);
}
delay(50);
// 현재 버튼 상태를 이전 버튼 상태로 업데이트
lastButtonState = buttonState;
}
아날로그 입력과 출력의 범위가 다를 때의 매핑
- map함수에 입력값, 입력 범위, 출력 범위를 넣어주면 된다.
map(analogRead(0),0,1023,0,255);
RGB LED
- r,g,b 표시에 따라 각 색의 입력을 받을 수 있다.
- -를 gnd로 연결하여 사용한다.
- 별도의 저항이 없어도 동작한다.(특정 모듈이 있다면)
- 예시) 게이밍 라이트 만들기
// RGB LED 핀 설정
#define R 9 // 빨간색 핀
#define G 10 // 초록색 핀
#define B 11 // 파란색 핀
int rainbow = 0;
void setup() {
// RGB LED 핀을 출력으로 설정
pinMode(R, OUTPUT);
pinMode(G, OUTPUT);
pinMode(B, OUTPUT);
Serial.begin(9600);
}
void loop() {
rainbow += 4;
// sin() 함수의 출력 범위를 -1에서 1로 제한하고 map() 함수를 사용하지 않음
float rFloat = sin(radians(rainbow)) * 127.5 + 127.5;
float gFloat = sin(radians(rainbow + 120)) * 127.5 + 127.5;
float bFloat = sin(radians(rainbow + 240)) * 127.5 + 127.5;
// 실수 값을 정수로 변환
int rValue = int(rFloat);
int gValue = int(gFloat);
int bValue = int(bFloat);
analogWrite(R, rValue);
analogWrite(G, gValue);
analogWrite(B, bValue);
delay(50);
}
시리얼
- 시리얼 통신을 통해 아두이노에 문자를 전송할 수 있다.
- 전송되는 문자를 1글자씩(char단위?) 가져온다.
- serial.available을 이용하면 시리얼 통신 버퍼에 값이 있는 경우 1, 없는 경우 0을 반환하게 된다.
randomseed
- 시드를 별도로 설정하지 않은 경우 리셋마다 같은 랜덤 숫자가 나오게 된다.
라즈베리 파이
- 사용 기기 : 라즈베리 파이 3 모델 b+
- cup : quad cortex a53 1.2g
- gpu : 400m video core 4
- ram : 1g
- 이더넷 : 10/100
- wireless 802.11m, 블루투스 4.0
- audio : HDMI
라즈베리파이 IoT개발 준비사항
- 라즈베리파이 3
- 무선공유기
- sd카드, sd카드리더기
- 전원, LAN, HDMI케이블
라즈베리 파이 설치
- 라즈베리파이 os 다운로드
파이썬을 이용한 라즈베리파이 조작하기
- thonny ide를 이용하여 개발
삼바(samba)
- 리눅스와 유닉스 시스템에서 Windows 파일 및 프린터 공유를 가능하게 하는 프로토콜과 소프트웨어 슈트
- 리눅스 시스템을 Windows 네트워크와 쉽게 통합할 수 있도록 도와준다.
삼바 설치
- 삼바 설치파일 실행
- sudo apt-get install samba samba-common-bin
- 삼바 비밀번호 등록
- sudo smbpasswd -a pi
- 비밀번호 2번 입력
- 삼바 환경파일 수정하기
- sudo nano /etc/samba/smb.conf
- 맨 아래 추가하기
- [pi] path = /home/pi comment = PI SAMBA SERVER valid user = pi writable = yes create mask = 0777 public = yes
- 서버 재시작
- sudo /etc/init.d/smbd restart
- 윈도우에서 라즈베리 파이 공유폴더 접근
- \\파이 ip\
리눅스, 라즈비안 명령어
- 파일 및 디렉토리 관리:
- ls: 디렉토리의 파일 목록을 표시합니다.
- cd: 디렉토리를 변경합니다.
- pwd: 현재 작업 중인 디렉토리를 표시합니다.
- cp: 파일 또는 디렉토리를 복사합니다.
- mv: 파일 또는 디렉토리를 이동하거나 이름을 변경합니다.
- rm: 파일 또는 디렉토리를 삭제합니다.
- 파일 내용 확인 및 편집:
- cat: 파일의 내용을 화면에 출력합니다.
- more 또는 less: 파일의 내용을 페이지 단위로 확인합니다.
- nano, vim, emacs: 각각의 텍스트 편집기로 파일을 편집합니다.
- 권한 및 소유자 관리:
- chmod: 파일이나 디렉토리의 권한을 변경합니다.
- chown: 파일이나 디렉토리의 소유자를 변경합니다.
- 시스템 정보 확인:
- uname: 시스템 정보를 표시합니다.
- df: 디스크 공간 사용량을 확인합니다.
- free: 메모리 사용량을 확인합니다.
- 프로세스 관리:
- ps: 현재 실행 중인 프로세스를 표시합니다.
- kill: 프로세스를 종료합니다.
- 파일 검색 및 찾기:
- find: 파일을 검색합니다.
- grep: 파일에서 특정 패턴을 검색합니다.
- 네트워크 관리:
- ifconfig 또는 ip: 네트워크 인터페이스 정보를 표시합니다.
- ping: 네트워크 호스트에 대한 응답을 확인합니다.
- netstat 또는 ss: 네트워크 연결 및 통계를 표시합니다.
- 시스템 관리:
- systemctl: 시스템 서비스 및 상태를 관리합니다. (systemd 기반 시스템에서)
- service: 시스템 서비스를 관리합니다. (init.d 기반 시스템에서)
- sudo: 관리자 권한으로 명령어를 실행합니다.
카메라 사용하기
- sudo raspi-config에서 interface 항목에서 수정 가능하다.
파이썬 기초
주석처리
-
이후의 문자는 주석으로 인식한다.
- print(”글자”);로 콘솔 출력, 쌍따옴표와 홀따옴표 구분 x
- 변수 선언시 별도의 선언문이 없다. 이름에 바로 값을 넣으면 됨
- 사칙연산
- +, -, *, / : 사칙연산 기호
- // : 몫 구하기
- x**y : x^y와 같다
- +=, -=, *=, /= : 복합 연산자도 자바와 동일하게 동작한다.
- 리스트
- 대괄호 사이에 작성한다.
- numbers = [1,2,3,4,5]
- numbers[0] 등으로 접근 가능하다.
- len(리스트) 로 리스트의 크기를 알 수 있다.
- remove(value) : 특정 값을 지울 수 있다.
- 제어문
- while
- 조건에 따라 반복하는 반복문
- while문 내부는 들여쓰기를 통해 구분한다.
num = 1 while num<=100: print(num) num += 1
- for
- 자바의 foreach와 유사한 구조이다.
family = ['asdf','asdfasdf','asd'] for x in family: print(x, len(x))
- len()함수의 내부에 문자열이 올 경우 문자열의 길이가 출력된다.
- while
'공부일지' 카테고리의 다른 글
240216 (google drive api) (0) | 2024.02.16 |
---|---|
231227 (Spring) (0) | 2023.12.27 |
231221 (Spring) (0) | 2023.12.21 |
231220 (Spring) (0) | 2023.12.20 |
231219 (Android) (0) | 2023.12.20 |