본문 바로가기

Lobo's study room/아두이노

아두이노 택트스위치와 가변저항사용하기

#논리연산자

^ 캐럿(Xor) ~필더(Not) &앤퍼잰드(and)

AND

INPUT OUTPUT
A B A AND B
0 0 0
0 1 0
1 0 0
1 1 1

NOR

INPUT OUTPUT
0 0 1
1 0 0
0 1 0
1 1 0

NOT

INPUT OUTPUT
0 1
1 0

XOR

INPUT OUTPUT
0 0 0
0 1 1
1 0 1
1 1 0

 

#도체와 부도체. 그리고 반도체

도체와 부도체는 저항이 어느정도인지에 따라 달라진다.

반도체는 조건이 만족되면 전기가 잘 흐르고 만족되지 않으면 잘 통하지않는 물체를 말한다.

 

실리콘이나 게르마늄같은 진성반도체의 경우 적당한 불순물(갈륨.인륨.비소)등을 섞어야 사용이 가능하다.

 

반도체에는 + 성질을 띠는 P형 반도체와 - 성질을 띠는 N형 반도체가 있는데,

여기서 PN접합이라함은 P형 반도체와 N형 반도체를 붙여놓은것!

 

#공핍층

-를 띤 전하 +전공이 랜덤하게 분포되어있는데 PN접합면 

 

-순방향바이어스

척력이 작용해서 다 가운데로 모이고 결합해서 전류가 흐를수있게 됨.

 

-역방향바이어스

P형에 +를 가해줘야하는데 -를 가해줬을때! 즉, 역방향바이어스 상태일때

인력이 발생해서 한쪽으로 몰려버려 텅 빈 공간이 생기는데 그것을 공핍층이라고 한다!

공핍층에서는 전류가 흐를수 없다.

 

 

#트랜지스터

Trans-Resistor. Resistor값을 변화시킬수 있다.

전류의 양을 조절하는 용도로 쓰인다.

TR은 PNP이거나 NPN 트랜지스터가 있다.

 

BJT : Bipolor Junction Transistor(양방향접합트랜지스터)

B BASE / E EMITTER / C COLLECTOR

B는 Transistor가 동작하게 하는 스위치 역활, 스위치가 ON이 되면 C와 E사이에 전류가 흐른다.

B를 누르는 강도에 따라 C와 E 사이에 흐르는 전류량도 바뀌고 즉 저항값도 변한다.

 

#Exclusive or을 사용한 택트스위치 : Toggle_2

트랜지스터 하나가 게이트를 이루는하나의 소자.

팬아웃:하나의 논리 게이트의 출력이 얼마나 많은 전류를 구동할 수 있는가?

오픈콜렉터:구동할수 있는 양 - 포트 출력으로 얼마만큼의 부하를 발생시킬수 있느냐?

 

내부적으로 풀업이 되어있기 때문에 별도로 풀업해줄 필요 x. 5V 사용할 필요가 없다.

#define ON 0
#define OFF 1

const int pinSW = 2;
const int pinLED = 13;

unsigned int ledVal = 0;

unsigned int key_check_delay = 120;

void setup() {
	pinMode(pinSW, INPUT_PULLUP);
    pinMode(pinLED, OUTPUT);
    Serial.begin(9600);
    }

void loop(){
	if(digitalRead(pinSW) == ON){
    	delay(key_check_delay);
        
    if(digitalRead(pinSW) == ON){
    	ledVal^=1;
        digitalWrite(pinLED, ledVal);
        Serial.println(ledVal);
        }
        }
 }

#BIOS

BIOS : Basic Input Output / Boot Device에서 메모리에서 운영체제 불러옴

ROM Bios 루틴 : 부트스트랩 로더

 

#교류와 직류 그리고 맹류

교류:전송할때 전기 송신방식.전송할때 전압이 높을수록 손실이 적다.

직류:실제 전기 사용방식.감압필요.트랜스포머로 전자기유도현상…

 

#ADC

아날로그 리더 - 내장된 adc 이용 : 아날로그 to data converter

ADC:10bit 해상도. Resolution

같은 아날로그 시계여도 쿼츠 -> 디지털 / 등속운동 -> 아날로그

 

#IP와 Http, DNS

IP : Internet Protocol(일종의 Manual. 통신규약.) 

Http : 하이퍼링크 지원 텍스트.

FTP : File transfer protocol / 인터넷망으로 연결되어있는 멀리 떨어져 있는 서버로 파일을 올리거나 가져오기 위해 필요한 일종의 프로토콜

DNS : Domain Name System. 호스트의 도메인 이름을 호스트의 네트워크 주소로 바꾸거나 그 반대의 변환을 수행할 수 있도록 하기 위해 개발됨

 

#여러 유형의 포맷 : MP3, JPEG, MPEG, BMP, JPG

MP3 동영상포맷

JPEG 모든 그림파일은 압축해서 저장. 순서대로 저장한걸 보여줌 -> MPEG

MP3 오디오포맷의 압축률과 복원시 복원률이 높다

BMP 압축률이 적다

JPG 압축전과 후의 품질의 차이가 별로 없다. 우수한 압축률과 복원률. 현재 웹서비스의 표준 규격

 

#adc_1

가변 저항 사용.

0~1023으로 0v~5v 표시.

void setup(){
	Serial.begin(9600);
}

void loop(){
	Serial.println("adc result = ");
    Serial.println(analogRead(A0));
    }

 

#adc_2_volt_meter

a0에 전압이 가해지면 전압을 측정하는 전압측정기 만들기

void setup(){
	Serial.begin(9600);
    }

void loop(){
	double volt = 0.0; //float이하 오차 줄이기 위해 double 사용
    int adc = 0;
    adc = analogRead(A0);
    //5v:1023=xv:adc
    volt = 5 * adc / 1023.0;
    Serial.print((String)"voltage="+volt+"(v)\n");
    delay(500);
    }

#print와 println

print는 줄 안바꾸고 한번에 출력

println은 줄 바꾸고 출력

줄바꾸기 : ln , \n 사용.

 

#adc_3_volt_meter

정수만 가지고 표현하기!

void setup(){
	Serial.begin(9600);
    }
    
void loop(){
	long volt = 0;
    long adc = 0;
    adc = analogRead(A0);
    //5v:1023=xv:adc
    volt = 5 * 1000 * adc / 1023;
    
    Serial.print("voltage = ");
    Serial.print(volt / 1000);
    Serial.print(".");
    Serial.print(volt % 1000);
    Serial.print("(v)\n");
    
    delay(500);
    }

#Analog에서 Digital로

음성에는 고유의 진동이 있어서 그 진동을 이용해서 인식을 한다.

발진기라는 것을 이용해서 우리의 음성을 받아 주파수에 맞는 전기신호를 생성하는데,

컴퓨터가 이 신호를 받게 되면 음성 -> 전기 신호가 된다.

이때, 음성데이터를 전기신호로 바꾸면 신호가 감쇄되어 사라지므로 

멀리까지 보낼수 있는 힘센 파형으로 전송을 해야한다! -> 변조

 

*양자화현상 : 반올림되거나 버려지는 양자화 오차/ 사이를 메꿔주는 복원법 필요!

 

수신시 변조파에서 원래 신호를 꺼내는 복조가 필요하다!

 

모뎀-> 변조와 복조를 동시에 하는 기계

 

반복되는 횟수 : 주파수

한번 반복될때 걸리는 시간 : 주기

 

#변조

 

1.진폭 변조

AM : Amplitude Modulation.

반송파의 진폭을 정보 신호의 진폭과 같은 형태로 변화시키는 것.

디지털 정보를 아날로그 데이터로 변화시키는 방식.

디지털 정보의 비트 0을 반송파가 없는것에, 비트 1을 반송파가 있는것에 대응시켜서 변조한다.

 

2.주파수 변조

FM : Frequency Modultaion.

신호의 강약에 따라 ...

저파수인 음성 신호를 고주파의 반송파에 실어 전송하는 방식.

진폭의 변화를 주파수의 변화로 바꾸는 변조 방식.

디지털 정보 비트 0 또는 1에 각각 다른 반송파를 대응시키는 것.

 

3.위상 변조

PM : Phase Modultaion.

아날로그 신호의 요소인 진폭, 주기 외에 위상, 파의 개시 위치가 존재하는데

이때 개시 위치의 변화를 0 또는 1에 할당하는 변조 방식.

 

#fade_in_out

인터럽트란?

우리가 라면을 먹고 있을때 택배 아저씨가 와서 초인종이 눌린 상황을 가정해보자.

우선 먹던 라면을 내려놓고 [택배를 받고] 다시 라면을 먹는다. 의 상황이 발생하게 되는데

이처럼 메인프로그램이 수행되고 있는 동안에 어떤 특정한 조건이 발생했을때 기존에 수행되던 프로그램을

일시적으로 중지하고 다른 일을 수행하는 것을 바로 "인터럽트" 라고 한다.

 

타이머 인터럽트?

일정 시간이 지날때마다 하나씩 수행. 

인터럽트 서비스 루틴중에서 외부요소를 사용하지 않는다.

너무 무거워지면 전체적인 동작의 수행에 영향을 준다.

멀티태스킹 역활을 수행할 수 있게 된다.

 

타이머 출력 비교 단자?

출력비교하는 값과 타이머가 같아졌을때 수행한다. 

프로그램중 인터럽트 발생시 인터럽트 수행후 다시 프로그램을 재개한다.

 

마스커블과 논마스커블?

마스커블은 우리가 건들수 있는거 / 논마스커블은 어쩔도리가 없는것을 말한다. 예를들어 전원 Fail과 Reset.

fade_in_out 회로도

int ledPin = 9; //LED connected to digital pin 9

void setup(){

}

void loop(){
	for(int fadeValue = 0; fadeValue <= 255; fadeValue += 5){
    analogWrite(ledPin, fadeValue);
    delay(30);
    }
    
    for(int fadeValue = 255; fadeValue > = 0; fadeValue -= 5){
    analogWrite(ledPin, fadeValue);
    delay(30);
    }
}

#pot2led

가변저항을 통해 Led를 조절할 수 있다.

const int pinLED = 9;
const int pinPot = A0;

void setup(){
	Serial.begin(9600);
    }
    
void loop(){
	int pwm = analogRead(pinPot);
    Serial.println(pwm);
    analogWrite(pinLED,pwd/4);
    delay(250);
}

#여러가지 통신방식.

병렬통신 : 통신을 여러 가닥을 통해서 해서 전송거리가 길어져 회선비용이 증가한다.

시리얼통신 : 간단히 연결이 가능하다.

동기통신 : 동기시리얼통신이 병렬통신을 지원하는 경우가 많아졌다.

센서연결할때 주로 사용하고 한 프레임내에 있는 보드끼리 혹은 보드 내 통신할 때 주로 사용된다.

ata방식->sata방식(serial) : 빠르다, 고속동기통신.

serial:usb(usb serial bus)

이때 bus라함은 통로이다. 여러 장치가 한 통로를 통해 데이터를 전송한다.

IEE:국제규격.sony에서 

USB:play and plug. hot plug. hot swap. / 외부장치 추가시 전원을 끄고 or 리부팅해야 사용했어야 했지만 USB는 바로 사용이 가능하다. 편의성과 대중성이 높다.

async:느리지만 편리하다.

비동기 통신지원:

다목적통신지원:

동기신호가 있다. 없다 -> 클럭

 

#servo

#serial2servo

입력받는 수에 따라 각 조절이 가능하게 구현된 코드이다.

#include <Servo.h>

Servo srv;

int pos = 90;

void setup(){
	Serial.begin(9600);
    srv.attach(8);	//attaches the servo on pin 9 to the servo object
}

void loop(){
	if(Serial.available() > 0){	//goes from 0 degress to 180 degrees
    	//in steps of 1 degree
    char ch = Serial.read();
    if(ch == '1'){
    	pos = 0;
    }
    else if(ch == '2'){
    	pos = 45;
   }
   else if(ch == '3'){
   		pos = 90;
   }
   else if(ch == '4'){
   		pos = 135;
   }
   else if(ch == '5'){
   		pos = 180;
   }
   else;
   
   srv.write(pos);
   delay(50);
   Serial.print("servo positions: ");
   Serial.println(pos);
   }
 }

2줄씩 표시되면 시리얼모니터 설정을 새줄->line-ending으로 바꿔준다.

모터가 덜덜 떠는 현상이 발생될 수도 있는데 이를 '하모닉' 현상이라고 한다.

임계치에 걸렸거나 톱니가 애매한데 걸려있을때 발생한다.

servo:무엇인가를 쫒아감

 

#serial2servo2

부등호를 눌러서 각도 조절이 가능하도록 구현된 코드로, 

<를 눌렀을때 각이 늘어나고, >를 눌렀을때 각이 줄어든다.

#include <Servo.h>

Servo srv; //create servo object to control a servo. class is some kind of type.
//twelve servo objects can be created on most boards

int pos = 90; //variable to store the servo position

const int step_ = 5;
const int maxPos = 180;
const int minPos = 0;

void setup(){
	Serial.begin(9600);
    srv.attach(8); //attaches the servo on pin 9 to the servo object
}

void loop(){
	if(Serial.available() > 0){ //goes from degrees to 180 degrees
    //in steps of 1 degree
    char ch = Serial.read();
    if(ch == '.'){//to show '>'
    	if(pos + step_ <= maxPos){
        pos = pos + step_;
        }
        	else{
        		pos = maxPos;
            	}
            	}
     else if(ch == ','){//to show '<'
         if(pos - step_ >= minPos){
         	pos = pos - step_;
            }
         else{
         	pos = minPos;
            }
            }
         else;
         
srv.write(pos);
delay(50);
Serial.print("servo position: ");
Serial.println(pos);
}
}