내맘대로 정리

모바일프로세서(아두이노)

하나의묵 2020. 3. 11. 12:43

PWM

디지털 신호의 일종이지만 아날로그 신호와 유사한 효과.(0~255)

analogWrite() 함수사용

아두이노 보드에서 ~ 표시가 있는곳

 

 

인터럽트

-예외상황 처리

 

 

, 스위치

 

- 채터링 /바운스 현상 : 버튼의 물리적인 진동에 의해 버튼을 한번 누를 때 두 번이상 눌러 진 것으로 인식되는 현상

해결방법 : 커페시터를 이용 미세한 신호는 커페시터에서 압축 , 강한신호만 보낸다

슈미트 트리거 사용 신호가 애매한 구간은 없앤다 (필터링)

 

 

인터럽트

 

 

 

 

 

 

 

#define blue 11

#define green 12

#define red 13

#define swich1 2

#define swich2 3

void setup()

{

//pinMode(13, OUTPUT);

 

 

pinMode(13, OUTPUT);

pinMode(blue, OUTPUT);

pinMode(green, OUTPUT);

 

pinMode(2, INPUT);

pinMode(3, INPUT);

// 인터럽트 ppt 에서 다시보기

// 다른일을 수행하고 있더라도 attachInterrupt 를시행하면 수행됨

attachInterrupt(digitalPinToInterrupt(swich1),blueTurnOn ,CHANGE);

attachInterrupt(digitalPinToInterrupt(swich2),greenTurnOn ,CHANGE);

//blueturnOn 은 불을 키는 함수.

// CHANGE int mode 입력값의 상태가 변할떄 인터럽트가 발생.

}

 

void loop()

{

 

digitalWrite(red, HIGH);

delay(2000);

 

digitalWrite(red, LOW);

delay(2000);

 

 

}

 

 

void blueTurnOn()

{

digitalWrite(blue , digitalRead(2));

 

 

}

 

void greenTurnOn()

{

digitalWrite(green ,digitalRead(3));

 

 

}

 

 

 

 

 

 

 

 

풀업 스위치

 

 

// 풀업 제어 ? 버튼을 안누르면 실행되고 누르면 멈추는 것.

 

void setup()

{

pinMode(13, OUTPUT);

pinMode(2, INPUT);

digitalWrite(13,HIGH);

 

}

 

void loop()

{

 

if(digitalRead(2)) // 풀다운은 눌렀을때 d20이기 떄문에 참과거짓이 반대?

digitalWrite(13,HIGH);

else

digitalWrite(13, LOW);

 

}

 

 

 

 

 

 

 

 

풀 다운 스위치

 

 

// 풀다운 저항

void setup()

{

pinMode(13, OUTPUT);

digitalWrite(13,LOW);

 

pinMode(2, INPUT);

 

 

}

 

void loop()

{

 

if(digitalRead(2))// 2번이 들어오면

digitalWrite(13, HIGH); //13번을 킨다

else digitalWrite(13,LOW);

 

 

}

 

 

 

 

 

 

크로스 시리얼 통신?

 

 

왼쪽 아두이노 :

 

// 직렬로 연결 시리어통신 아두이노끼리 통신 . RX 에는 TX , TX에는 Rx

// 8트 신호를 한번에 전송

int val ,T;

void setup()

{

pinMode(A0,INPUT);

Serial.begin(9600);

}

 

void loop() // 값을 읽어서 비교해서 어느선 넘으면 y를 보내고 인런것 코드 냄

{

val= analogRead(A0);

int temp = map(val,0,1023,0,5000);// 0부터 1023까지나옴 온도가

T= (temp-500)/10; //근데 이걸 0부터 5000으로

Serial.println(T);

 

 

 

 

if(T>100)

Serial.println('y');

else

Serial.println('n');

 

}

 

오른쪽 아두이노 :

 

void setup()

{

Serial.begin(9600);

pinMode(9, OUTPUT);

}

 

void loop()

{

if(Serial.available())

{

char state = (char)Serial.read();

if(state=='y')

digitalWrite(9,HIGH);

}

else

{

digitalWrite(9,LOW);

}

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

/*

 

#define F_CPU 16000000UL

 

#include

 

#include

 

 

 

 

void INIT_PORT(void)

 

{

 

DDRB = 0x20; // PB5 (디지털 13번 핀) 출력으로 설정

 

PORTB = 0x00; // LED는 꺼진 상태에서 시작

 

DDRD = 0x00; // 버튼 입력

 

PORTD = 0x04; // PD2 (디지털 2번 핀) 풀업 저항 사용

 

}

 

 

 

 

void UART_INIT(void) {

 

UCSR0A |= _BV(U2X0);

 

 

 

 

UBRR0H = 0x00;

 

UBRR0L = 207;

 

 

 

 

UCSR0C |= 0x06;

 

 

 

UCSR0B |= _BV(RXEN0);

 

UCSR0B |= _BV(TXEN0);

 

}

 

 

 

 

void UART_transmit(unsigned char data)

 

{

 

while( !(UCSR0A & (1<

 

UDR0 = data;

 

}

 

 

 

 

//채터링 현상 발생

 

int main(void)

 

{

 

UART_INIT(); // UART 통신 초기화

 

INIT_PORT(); // 포트 설정

 

int state = 0; // 현재 버튼의 상태

 

while(1){

 

if(PIND & 0x04){

 

state = 0; // 버튼이 눌러지지 않은 상태로 표시

 

PORTB = 0x00; // LED 끄기

 

}

 

else{

 

// 눌러지지 않은 상태에서 눌러진 상태로 바뀔 때마다 ‘*’ 문자 전송

 

if(state == 0) UART_transmit('*');

 

state = 1; // 버튼이 눌러진 상태로 표시

 

PORTB = 0x20; // LED 켜기

 

}

 

}

 

}

 

*/

 

/*

 

//디바운싱-버튼이 눌러지기 시작하는 시점 찾기

 

int main(void)

 

{

 

UART_INIT(); // UART 통신 초기화

 

INIT_PORT(); // 포트 설정

 

int state = 0; // 현재 버튼의 상태

 

 

 

 

while(1){

 

if(PIND & 0x04){

 

state = 0; // 버튼이 눌러지지 않은 상태로 표시

 

PORTB = 0x00; // LED 끄기

 

}

 

else{

 

// 눌러지지 않은 상태에서 눌러진 상태로 바뀔 때마다 ‘*’ 문자 전송

 

if(state == 0) UART_transmit('*');

 

state = 1; // 버튼이 눌러진 상태로 표시

 

PORTB = 0x20; // LED 켜기

 

_delay_ms(100); // 디바운싱

 

}

 

}

 

}

 

 

 

 

//디바운싱-버튼이 완전회 눌려진 시점 찾기

 

unsigned char button_pressed(void)

 

{

 

if(bit_is_clear(PIND, PIND2)){ // 첫 번째 검사

 

_delay_ms(10);

 

if(bit_is_clear(PIND, PIND2)) // 두 번째 검사

 

return 1;

 

}

 

return 0;

 

}

 

 

 

 

int main(void)

 

{

 

UART_INIT(); // UART 통신 초기화

 

INIT_PORT(); // 포트 설정

 

int state = 0; // 현재 버튼의 상태

 

 

 

 

while(1){

 

if(button_pressed()){

 

// 눌러지지 않은 상태에서 눌러진 상태로 바뀔 때마다 ‘*’ 문자 전송

 

if(state == 0) UART_transmit('*');

 

state = 1; // 버튼이 눌러진 상태로 표시

 

PORTB = 0x20; // LED 켜기

 

}

 

else{

 

state = 0; // 버튼이 눌러지지 않은 상태로 표시

 

PORTB = 0x00; // LED 끄기

 

}

 

}

 

}

 

*/

 

 

 

 

 

 

 

//아두이노 코드

 

int state = 0; // 현재 버튼의 상태

 

void setup()

 

{

 

pinMode(2, INPUT_PULLUP); // 내부 풀업 저항을 사용하는 버튼 입력

 

pinMode(13, OUTPUT); // 13번 핀을 출력으로 설정

 

Serial.begin(9600); // UART 통신 초기화

 

}

 

unsigned char button_pressed()

 

{

 

if(!digitalRead(2)){ // 첫 번째 검사

 

delay(10);

 

if(!digitalRead(2)) return 1; // 두 번째 검사

 

}

 

return 0;

 

}

 

 

 

 

void loop()

 

{

 

if(button_pressed()) { // 버튼이 눌러진 경우

 

if(state == 0) Serial.write('*');

 

state = 1;

 

digitalWrite(13, HIGH);

 

}

 

else{ // 버튼이 눌러지지 않은 경우

 

state = 0;

 

digitalWrite(13, LOW);

 

}

 

}

'내맘대로 정리' 카테고리의 다른 글

컴퓨터네트워크  (0) 2020.03.11
자료구조  (0) 2020.03.11
데이터베이스  (0) 2020.03.11
앱비지니스 모델  (0) 2020.03.11
PG와 VAN  (0) 2020.03.11