본문 바로가기

웹_프론트_백엔드/JAVA프레임윅기반_풀스택

2020.07.13

1. 서보 모터(Servo Motor)
 : DC 모터와 달리 속도와 각도를 모두 제어하는 모터,
   RC카의 방향제어, 로봇의 관절 제어, 잠금잠치 열고 닫을때 등에 활용

 

 

2. 서보 모터를 사용하기 위해서는 라이브러리 사용 필요하다.

 

3. 09_03 서브모터

#include <Servo.h>

Servo myServo;

void setup()
{
  // 아두이노의 디지털 9번 핀을 서보 모터 제어에 사용.
  myServo.attach(9);
}

void loop()
{
  //  서보 모터의 각도를 0 ~ 180도 까지 바꿈
  for(int angle = 0; angle <= 180; angle++){
    myServo.write(angle);
    delay(100);   // 0.1 초씩 지연.
  }
  
}

 

 

4. 09_04 자동문

#include <Servo.h>

Servo myServo;

void setup()
{
  // 아두이노의 디지털 9번 핀을 서보모터 제어에 사용
  myServo.attach(9);
  
  // PIR 센서의 값을 디지털 7번 핀에서 읽음
  pinMode(7, INPUT);
}

void loop()
{
  
  int detect = digitalRead(7);
  if(detect == HIGH) {
  	myServo.write(90);	// 모터각도 조절
    delay(100);
  } else {
  	myServo.write(0);
    delay(100);
  }
   
}

 

 

5. LCD (Liquid crystal display, 액정표시장치)
 : LCD는 뒷면에 빛을 내는 백라이트(backlight)를 배치하고 앞면에 액정을 두어

   전기 신호에 따라 빛을 차단하거나 통과하는 방식으로 문자나 숫자등을 표시하는 장치

 

6. LCD 배선 16개

1, 2) LED

 : LCD에서 백라이트 사용하기 위한 단자,

   음극(오른쪽 K, cathode), 양극(왼쪽 A, anode),

   220Ω 저항 연결 필요 

3, 4, 5, 6, 7, 8, 9, 10) DB0  ~ DB7

   : 데이터나 명령어를 전송하는 단자

11) E(enable)

 : 명령어를 실행하는 시점을 결정

   LOW에서 HIGH로 변경되는 시점에 LCD를 초기화하거나 문자의 출력위치를 결정하는 커서(cursor)를 변경하는 등

   스케치 코드로 작성한 명령을 LCD로 전송한 후 실행시키는 시점 결정

12) RW

   : LCD의 값을 읽을지(read), 쓸지(write) 결정하는 단자,

   HIGH 값으로 설정하면 LCD에 현재 출력된 값을 읽어올 수 있다,

   LOW값으로 설정하면 LCD에 문자로 출력할 수 있다


13) RS(resistor select)

 : LCD 에 명령어를 전달할지, 데이터를 전달할지 선택하는 스위치

   LOW값을 쓰면 LCD의 환경설정을 바꿀수 있는 명령어 전송

   HIGH값을 쓰면  LCD 에 출력할 데이터를 전송(디지털 값)

14) V0

 : LCD 에 표시되는 문자의 밝기 제어,

   V0에 입력할 값을 정하기 위해 가변저항의 와이퍼 단자에 연결

15) VCC : 전원 (5V)

16) GND : 접지

 

 

7. 10_01 LCD 문자열

** 저항 : 220Ω

#include <LiquidCrystal.h>

// LCD모듈 초기화
// 연결된 아두이노 핀 번호 초기화
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
				// RS, E, DB4 ~ DB7


void setup()
{
  lcd.begin(16, 2);	// 1602 LCD 모듈 설정
  lcd.print("Hello, Arduion!!");	// 문자 출력12
}

void loop()
{
  lcd.setCursor(0, 1);	// 커서 위치 변경
  lcd.print("1234567890");	// 출력
}

 

 

8. 10_02 LCD 온도값 LCD 출력

** 저항 : 220Ω

#include <LiquidCrystal.h>

// LCD모듈 초기화
// 연결된 아두이노 핀 번호 초기화
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
				// RS, E, DB4 ~ DB7


void setup()
{
  lcd.begin(16, 2);	// 1602 LCD 모듈 설정
  Serial.begin(9600);
}

void loop()
{
  int readValue = analogRead(A0);	// 온도센서값 측정
  float voltage = readValue * 5.0 / 1024.0;	// 전압값 변환
  float temperature = voltage * 100 - 50;	// 온도값 변환
  
  String tempStr = String(temperature);	// 온도값 -> 문자열 변환
  lcd.print("TEMP : " + tempStr);	// LCD에 문자열 출력
  Serial.println(tempStr);	// 직렬 모니터에 문자열 출력
  
  delay(500);
  lcd.clear();	// lcd 초기화
  
}

 

 

9. 10_03 문자이동효과

** 저항 : 220Ω

#include <LiquidCrystal.h>

// LCD모듈 초기화
// 연결된 아두이노 핀 번호 초기화
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
				// RS, E, DB4 ~ DB7


void setup()
{
  lcd.begin(16, 2);	// 1602 LCD 모듈 설정
  lcd.print("Hello, Arduion!!");	// 문자 출력12
}

void loop()
{
  // 출력된 문자를 왼쪽으로 16칸 (문자열 길이)이동
  for(int position = 0; position < 16; position++) {
  	lcd.scrollDisplayLeft();
    delay(150);
  }
  
  // 출력된 문자를 오른쪽으로 32칸 이동 (문자열 길이 + LCD 가로 길이)
  for(int position = 0; position < 32; position++) {
  	lcd.scrollDisplayRight();
    delay(150);
  }
  
  // 출력된 문자를 왼쪽으로 16칸
  for(int position = 0; position < 16; position++) {
  	lcd.scrollDisplayLeft();
    delay(150);
  }
  
}

 

 

10. 7 세그먼트(7 segment)
 : 숫자나 문자를 표시하는 일곱 개의 LED와 점을 표시하는 한 개의 LED로 구성,
   공통단자는 양극인 유형과 음극인 유형으로 나뉜다.


   [공통단자가 양극(common - cathode type)]
    : 전원을 공통으로 사용하므로 7 세그먼트의 각 단자에 LOW신호를 줘야 LED가 켜진다. 
   [공통단자가 음극(common - anode type)]
    : 접지를 공통으로 사용하므로 각 단자에 HIGH 신호를 줘야 LED가 켜진다.

 

 

11. 11_01 7 세그먼트

** 7 세그먼트 : 음극
** 저항 : 220Ω

// 아두이노의 디지털 핀 - 7 세그먼트 연결
#define A 3
#define B 2
#define C 11
#define D 12
#define E 13
#define F 5
#define G 4
#define DP 10

void setup()
{
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(DP, OUTPUT);
}

void loop()
{
  number0();  delay(1000);
  number1();  delay(1000);
}

// 숫자 0 출력, LOW 출력, HIGH 꺼짐
void number0() {
  digitalWrite(A,HIGH);
  digitalWrite(B,HIGH);
  digitalWrite(C,HIGH);
  digitalWrite(D,HIGH);
  digitalWrite(E,LOW);
  digitalWrite(F,HIGH);
  digitalWrite(G,LOW);
  digitalWrite(DP,HIGH);
}
void number1() {
  digitalWrite(A,LOW);
  digitalWrite(B,LOW);
  digitalWrite(C,LOW);
  digitalWrite(D,LOW);
  digitalWrite(E,LOW);
  digitalWrite(F,HIGH);
  digitalWrite(G,LOW);
  digitalWrite(DP,HIGH);
}

 


12. 11_02 7 세그먼트(rev.)

** 7 세그먼트 : 양극
** 저항 : 220Ω

// 아두이노의 디지털 핀 - 7 세그먼트 연결
#define A 3
#define B 2
#define C 11
#define D 12
#define E 13
#define F 5
#define G 4
#define DP 10

int digit[10][8] = {
//A, B, C, D, E, F, G, DP
 0, 0, 0, 0, 0, 0, 1, 1,	// 숫자 0을 표현
 1, 0, 0, 1, 1, 1, 1, 1,	// 숫자 1을 표현
 0, 0, 1, 0, 0, 1, 0, 1,	// 숫자 2를 표현
 0, 0, 0, 0, 1, 1, 0, 1,	// 숫자 3을 표현
 1, 0, 0, 1, 1, 0, 0, 1,	// 숫자 4를 표현
 0, 1, 0, 0, 1, 0, 0, 1,	// 숫자 5를 표현
 0, 1, 0, 0, 0, 0, 0, 1,	// 숫자 6을 표현
 0, 0, 0, 1, 1, 1, 1, 1,	// 숫자 7을 표현
 0, 0, 0, 0, 0, 0, 0, 1,	// 숫자 8을 표현
 0, 0, 0, 1, 1, 0, 0, 1		// 숫자 9를 표현
};

void setup()
{
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(DP, OUTPUT);
}

void loop()
{
  for(int i = 0; i <= 9; i++) {
  	displayDigit(digit[i]); delay(1000);
  }
}

// 7 세그먼트 숫자 표시 함수
void displayDigit(int* digit) {
  digitalWrite(A, digit[0]);
  digitalWrite(B, digit[1]);
  digitalWrite(C, digit[2]);
  digitalWrite(D, digit[3]);
  digitalWrite(E, digit[4]);
  digitalWrite(F, digit[5]);
  digitalWrite(G, digit[6]);
  digitalWrite(DP, digit[7]);
}

 


13. 11_03 7세그먼트 디코더

** 7 세그먼트 : 음극
** 저항 : 220Ω

// 아두이노 디지털 핀과 7 세그먼트 디코더 연결

//				DIN CIN BIN AIN
int dataPin[4] = {7, 6, 5, 4};


int digit[10][4] = {
  //DIN, CIN, BIN, AIN
  0,   0,   0,   0,	// 숫자 0을 표현
  0,   0,   0,   1,	// 숫자 1을 표현
  0,   0,   1,   0,	// 숫자 2를 표현
  0,   0,   1,   1,	// 숫자 3을 표현
  0,   1,   0,   0,	// 숫자 4를 표현
  0,   1,   0,   1,	// 숫자 5를 표현
  0,   1,   1,   0,	// 숫자 6을 표현
  0,   1,   1,   1,	// 숫자 7을 표현
  1,   0,   0,   0,	// 숫자 8을 표현
  1,   0,   0,   1,	// 숫자 9를 표현
};

void setup()
{
  // 디코더와 연결된 디지털 핀을 출력모드로 설정
  for(int i = 0; i < 4; i++) {
  	pinMode(dataPin[i], OUTPUT);
  }
}

void loop()
{
  // 0 ~ 9 까지 숫자 출력
  for(int i = 0; i < 10; i++) {
  	displayDigit(dataPin, digit[i]);
    delay(1000);
  }
}

// 7 세그먼트 디코더로 숫자를 표시하는 함수
void displayDigit(int* dataPin, int* digit) {
  for(int i = 0; i < 4; i++) {
  	digitalWrite(dataPin[i], digit[i]);
  }
  
}

 

 

14. 적외선(IR, Infrared Ray)

 : 붉은색 가시광성보다 파장이 길며, 가시광선 외 영역이기 때문에 사람의 눈으로는 볼 수 없다.

   [어디에 주로 사용?] TV나 에어컨 등 가전 제품을 원격제어할때 주로 사용한다.

 

 

15. 리모컨은 적외선 신호를 전송하고 적외선 센서는 적외선 신호를 수신한다.

 

 

16. 적외선 리모컨에서 보내는 값

 

 

17. 12_01 리모컨 LDE 켜기

** 저항 : 220Ω

#include <IRremote.h>

IRrecv irrecv(8);	// 8번 핀에 연결된 적외선 센서
decode_results results;	// 수신된 적외선 신호를 저장할 변수

void setup()
{
  irrecv.enableIRIn();	// 적외선 센서 활성화
  pinMode(9, OUTPUT);	// LED
  Serial.begin(9600);
}

void loop()
{
  // decode()
  // 적외선 신호에 수신된 내용이 result에 담고
  // '참' 리턴
  if(irrecv.decode(&results)) {
    // 적외선 신호 수신
    Serial.println(results.value, HEX);
    
    if(results.value == 0xFD30CF) {	// '0'이 눌렸으면
      digitalWrite(9, HIGH);	// LED 켜기
    } else {
      digitalWrite(9, LOW);	// LED 끄기
    }
    delay(30);
    
    irrecv.resume();	// 다음 신호를 받을 수 있도록 센서를 다시 준비
  
  }
  
}

 

 

18. 12_02 적외선제어 무드등

** 저항 : 220Ω

#include <IRremote.h>

const int RED_FIN = 11;
const int GREEN_FIN = 9;
const int BLUE_FIN = 10;
unsigned long lastValue = 0;	// 적외선 센서가 마지막으로 수신한 신호값 저장

IRrecv irrecv(8);	// 8번 핀에 연결된 적외선 센서
decode_results results;	// 수신된 적외선 신호를 저장할 변수

void setup()
{
  irrecv.enableIRIn();	// 적외선 센서 활성화
  pinMode(RED_FIN, OUTPUT);
  pinMode(GREEN_FIN, OUTPUT);
  pinMode(BLUE_FIN, OUTPUT);
}

void loop()
{
  // decode()
  // 적외선 신호에 수신된 내용이 result에 담고
  // '참' 리턴
  if(irrecv.decode(&results)) {
    // 적외선 신호 수신
    Serial.println(results.value, HEX);
    
    if(results.value == 0xFFFFFF) {	// 적외선 센서가 반복 신호를 받았을때
      // 마지막 신호가 담긴 lastValue 사용
      results.value = lastValue;
      
    } 
    
    if(results.value == 0xFD08F7) {	// 숫자 1 눌렀을때
      // HOTPINK 색 출력
      printRGB(255, 105, 180);
    } else if(results.value == 0xFD8877) {	// 숫자 2 눌렀을때
      // AQUA 색 출력
      printRGB(0, 255, 255);
    } else if(results.value == 0xFD48B7) {	// 숫자 3 눌렀을때
      // GREEN 색 출력
      printRGB(0, 255, 0);
    } else {
      // LED 끄기
       printRGB(0, 0, 0);
    }
    
    delay(30);
    lastValue = results.value;
    irrecv.resume();	// 다음 신호를 받을 수 있도록 센서를 다시 준비
  
  }
  
}

void printRGB(int red, int green, int blue) {
  analogWrite(RED_FIN, red);
  analogWrite(GREEN_FIN, green);
  analogWrite(BLUE_FIN, blue);
}