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)) // 풀다운은 눌렀을때 d2에 0이기 떄문에 참과거짓이 반대?
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);
}
}