본문 바로가기

공부일지

240115 (IoT)

아두이노

  • 이탈리아어로 절친한 친구
  • 센서나 부품 등 장치를 연결하는 오픈소스의 마이크로 컨트롤러 내장한 기기제어용 기판

아두이노 프로젝트의 구성

  • 아두이노 보드
  • 외부 하드웨어
    • 오감 표현의 부품센서
    • 관절과 신체를 표현할 모터, 바퀴 프레임
  • 부품을 움직이게 하는 프로그래밍
  • 스케치(아두이노 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케이블

라즈베리 파이 설치

파이썬을 이용한 라즈베리파이 조작하기

  • thonny ide를 이용하여 개발

삼바(samba)

  • 리눅스와 유닉스 시스템에서 Windows 파일 및 프린터 공유를 가능하게 하는 프로토콜과 소프트웨어 슈트
  • 리눅스 시스템을 Windows 네트워크와 쉽게 통합할 수 있도록 도와준다.

삼바 설치

  1. 삼바 설치파일 실행
    1. sudo apt-get install samba samba-common-bin
  2. 삼바 비밀번호 등록
    1. sudo smbpasswd -a pi
    2. 비밀번호 2번 입력
  3. 삼바 환경파일 수정하기
    1. sudo nano /etc/samba/smb.conf
    2. 맨 아래 추가하기
    3. [pi] path = /home/pi comment = PI SAMBA SERVER valid user = pi writable = yes create mask = 0777 public = yes
  4. 서버 재시작
    1. sudo /etc/init.d/smbd restart
  5. 윈도우에서 라즈베리 파이 공유폴더 접근
    1. \\파이 ip\

리눅스, 라즈비안 명령어

  1. 파일 및 디렉토리 관리:
    • ls: 디렉토리의 파일 목록을 표시합니다.
    • cd: 디렉토리를 변경합니다.
    • pwd: 현재 작업 중인 디렉토리를 표시합니다.
    • cp: 파일 또는 디렉토리를 복사합니다.
    • mv: 파일 또는 디렉토리를 이동하거나 이름을 변경합니다.
    • rm: 파일 또는 디렉토리를 삭제합니다.
  2. 파일 내용 확인 및 편집:
    • cat: 파일의 내용을 화면에 출력합니다.
    • more 또는 less: 파일의 내용을 페이지 단위로 확인합니다.
    • nano, vim, emacs: 각각의 텍스트 편집기로 파일을 편집합니다.
  3. 권한 및 소유자 관리:
    • chmod: 파일이나 디렉토리의 권한을 변경합니다.
    • chown: 파일이나 디렉토리의 소유자를 변경합니다.
  4. 시스템 정보 확인:
    • uname: 시스템 정보를 표시합니다.
    • df: 디스크 공간 사용량을 확인합니다.
    • free: 메모리 사용량을 확인합니다.
  5. 프로세스 관리:
    • ps: 현재 실행 중인 프로세스를 표시합니다.
    • kill: 프로세스를 종료합니다.
  6. 파일 검색 및 찾기:
    • find: 파일을 검색합니다.
    • grep: 파일에서 특정 패턴을 검색합니다.
  7. 네트워크 관리:
    • ifconfig 또는 ip: 네트워크 인터페이스 정보를 표시합니다.
    • ping: 네트워크 호스트에 대한 응답을 확인합니다.
    • netstat 또는 ss: 네트워크 연결 및 통계를 표시합니다.
  8. 시스템 관리:
    • 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()함수의 내부에 문자열이 올 경우 문자열의 길이가 출력된다.

'공부일지' 카테고리의 다른 글

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