반응형
SMALL

안녕하세요! Choi GPT 입니다.

이번 시간에는 아두이노 기초과정 중 디지털 입력에 대해 설명드리고자 합니다.

아두이노에서 디지털 입력(Digital Input)이라 함은,

아두이노 보드의 디지털 핀을 통해
외부 신호의 디지털 값(HIGH or LOW)을 읽어들이는 것을 말합니다.

주로 스위치, 센서와 같은 입력 장치의 신호를 읽어오는 데 사용합니다.


다음 예제파일을 테스트 해보도록 하겠습니다.

먼저 하드웨어 연결에 대한 정보 입니다.

장치 아두이노 핀맵
스위치 D7
LED D13
(내장 LED 사용-따로 연결하지 않음)


다음으로 동작 소스 입니다.

const int switchPin = 7; // 스위치 연결핀 
const int ledPin = 13; // LED 연결핀

void setup() {
  pinMode(switchPin, INPUT); // 스위치핀을 입력으로 
  pinMode(ledPin, OUTPUT); // LED핀을 출력으로
  Serial.begin(9600);
}

void loop() {
  int switchState = digitalRead(switchPin); // 스위치핀 읽기
  Serial.println(switchState);
  if (switchState == HIGH) {  
    digitalWrite(ledPin, HIGH); // 스위치 ON시 LED 켜기 
  }
  else {
    digitalWrite(ledPin, LOW); // 스위치 OFF시 LED 끄기
  }
}

 

digitalRead() 명령어의 정의
https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/
 

digitalRead() - Arduino Reference

Description Reads the value from a specified digital pin, either HIGH or LOW. Syntax Parameters pin: the Arduino pin number you want to read Returns

www.arduino.cc

 

위의 함수는 아두이노에서 디지털 핀의 입력값을 설정하는 함수입니다.

val = digitalRead(핀번호);
  • val: 읽어온 입력값이 저장되는 변수
  • 핀번호: 입력값을 읽어올 디지털 입력핀 번호

보통의 아두이노의 입력 카테고리(디지털, 아날로그)는 변수를 생성해 읽어드린 값을 저장해 줍니다. 

또한, digitalRead() 함수는 지정한 디지털 입력핀의 값을 읽어옵니다.
읽어온 입력값은 HIGH(1) 또는 LOW(0) 두 가지 중 하나의 값입니다.
입력핀은 앞서 pinMode() 함수를 사용하여 입력모드로 설정되어 있어야합니다.


위에 제공한 예시 소스를 구성하고 업로드 후에 동작사항을 확인해 보세요.

내장 LED (LED_BUILTIN) 에 불이 들어오나요?

정상동작이 되지 않습니다. 이유는 바로 스위치의 특성 때문인데요.

채터링 [chattering] 특성 파형

채터링 [chattering]

스위치의 하드웨어 특성 중 하나인 채터링은 스위치를 눌렀을 때 스위치 연결 핀에
불안정한 신호가 발생하는 현상을 의미합니다.
이 채터링 현상은 스위치의 접촉이 닫히는 과정에서 발생할 수 있으며,
짧은 시간 동안 스위치 연결 핀이 빠르게 ON과 OFF를 반복하여 신호를 보낼 수 있습니다.


그럼 이러한 현상을 해결할 수 있는 방법은 무엇이 있을까요?

크게 2가지가 있습니다.

1. 디바운스[debounce] : 짧은 시간에 여러번 스위치의 상태를 확인하는 방법을 의미합니다.
2. 하드웨어 혹은 소프트웨어의 풀업[PULLUP] & 풀다운[PULLDOWN] 셋팅


우선 디바운스 설정 방법 입니다.

아두이노 스케치 프로그램에서
파일 -> 예제 -> 02.Digital -> Debounce 선택하시면 됩니다.

const int buttonPin = 2;      // 버튼 핀 번호
const int ledPin = 13;        // LED 핀 번호

boolean ledState = HIGH;      // 현재 LED 상태를 초기 설정합니다. (켜진 상태)
boolean buttonState;          // 현재 버튼 상태를 저장합니다. (기본적으로 LOW)
boolean lastButtonState = LOW;// 이전 버튼 상태를 저장합니다.

unsigned long lastDebounceTime = 0; // 버튼 디바운스를 위한 시간 변수
unsigned long debounceDelay = 50;   // 디바운스 지연 시간 (50ms)

void setup() {
  pinMode(buttonPin, INPUT);   // 버튼 핀을 입력으로 설정합니다.
  pinMode(ledPin, OUTPUT);     // LED 핀을 출력으로 설정합니다.

  digitalWrite(ledPin, ledState);  // 초기 LED 상태를 설정합니다. (켜진 상태)
}

void loop() {
  int reading = digitalRead(buttonPin);  // 버튼 핀의 상태를 읽어옵니다.

  if (reading != lastButtonState) {  // 버튼 상태가 이전 상태와 다를 경우
    lastDebounceTime = millis();     // 현재 시간을 기록합니다.
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {  // 디바운스 지연 시간이 경과한 경우
    if (reading != buttonState) {   // 버튼 상태가 이전 상태와 다를 경우
      buttonState = reading;        // 버튼 상태를 업데이트합니다.

      if (buttonState == HIGH) {    // 버튼이 눌린 상태일 경우
        ledState = !ledState;       // LED 상태를 반전시킵니다. (ON <-> OFF)
      }
    }
  }

  digitalWrite(ledPin, ledState);  // LED 상태를 출력합니다.

  lastButtonState = reading;  // 이전 버튼 상태를 업데이트합니다.
}

다음으로 풀업 저항 설정 방법 입니다.

풀업 저항 설정 방법은 크게 2가지가 있습니다.

1. 하드웨어 셋팅

1. 스위치 입력단자(D7)번에 저항(10K ohm) 연결 후
2. 저항의 반대쪽은 5V 전압을 연결해주면 됩니다.

시연영상

 

2. 소프트웨어 셋팅

 

const int switchPin = 7; // 스위치 연결핀 
const int ledPin = 13; // LED 연결핀

void setup() {
  pinMode(switchPin, INPUT_PULLUP); // 스위치핀을 입력으로 
  pinMode(ledPin, OUTPUT); // LED핀을 출력으로
  Serial.begin(9600);
}

void loop() {
  int switchState = digitalRead(switchPin); // 스위치핀 읽기
  Serial.println(switchState);
  if (switchState == HIGH) {  
    digitalWrite(ledPin, HIGH); // 스위치 ON시 LED 켜기 
  }
  else {
    digitalWrite(ledPin, LOW); // 스위치 OFF시 LED 끄기
  }
}

 

감사합니다.

 

반응형
LIST
반응형
SMALL

안녕하세요! Choi GPT 입니다.

오늘 소개해드릴 내용은 아두이노 기초과정 중 디지털 출력에 대해 설명드리고자 합니다.

아두이노에서 디지털 출력(Digital Output)이라 함은,

아두이노 보드의 디지털 핀을 통해 0또는 1의 두 가지 디지털 신호 수준을 출력하는 것을 말합니다.

즉 5V나 3.3V와 같은 고전압 또는 0V의 저전압을 핀에서 출력할 수 있습니다. 

이를 이용하여 LED, 모터, 릴레이 등과 같은 다양한 장치를 ON/OFF 제어할 수 있습니다.

디지털 출력을 사용하기 위해서는 먼저 pinMode() 함수를 사용하여 해당 핀을 출력으로 설정해야 합니다. 

그리고 나서 digitalWrite() 함수를 사용하여 HIGH(고전압)나 LOW(저전압)를 출력할 수 있습니다.


다음은 예제파일 소스 입니다.

int ledPin = 13; 

void setup() {
   pinMode(ledPin, OUTPUT); // 핀 13번을 출력으로 설정
}

void loop() {
   digitalWrite(ledPin, HIGH); // 고전압 출력
   delay(1000);  
   digitalWrite(ledPin, LOW); // 저전압 출력 
   delay(1000);
}

아두이노의 내장된 LED를 출력신호를 통해 제어하는 가장 기본적인 Blink 소스 입니다.


또한 위 내용에 대한 자세한 정의는 아두이노 공식 사이트에서 확인 가능 합니다.

 

pinMode() 명령어의 정의

https://www.arduino.cc/reference/en/language/functions/digital-io/pinmode/

 

pinMode() - Arduino Reference

Example Code The code makes the digital pin 13 OUTPUT and Toggles it HIGH and LOW void setup() { pinMode(13, OUTPUT); // sets the digital pin 13 as output } void loop() { digitalWrite(13, HIGH); // sets the digital pin 13 on delay(1000); // waits for a sec

www.arduino.cc

pinMode() 함수는 아두이노에서 디지털 핀의 동작 모드를 설정하는 함수입니다.

pinMode()의 사용법은 다음과 같습니다.

pinMode(핀번호, 모드);

여기서 핀번호에는 설정하고자 하는 디지털 핀의 번호를 입력합니다.
쉽게 장치를 연결한 핀번호를 작성하시면 됩니다.

다음으로 모드 파라미터에는 다음과 같은 설정 값을 사용할 수 있습니다.

  • INPUT: 해당 핀을 입력모드로 설정합니다. 스위치, 센서등 입력 장치를 연결할 때 사용합니다.
  • OUTPUT: 해당 핀을 출력모드로 설정합니다. LED, 모터, 릴레이 등 출력장치를 제어할 때 사용합니다.
  • INPUT_PULLUP: 해당 핀에 내부 풀업 저항을 연결한 입력모드입니다.


예를들어 다음과 같이 13번 핀을 출력으로 설정할 수 있습니다.

pinMode(13, OUTPUT);

pinMode()는 설정하고자 하는 핀의 기능을 지정하기 위한 필수 함수이므로 
디지털 입출력 기능을 사용하기 전에 반드시 호출하여 사용해야 합니다.

 

digitalWrite() 명령어의 정의

https://www.arduino.cc/reference/en/language/functions/digital-io/digitalwrite/

 

digitalWrite() - Arduino Reference

Example Code The code makes the digital pin 13 an OUTPUT and toggles it by alternating between HIGH and LOW at one second pace. void setup() { pinMode(13, OUTPUT); // sets the digital pin 13 as output } void loop() { digitalWrite(13, HIGH); // sets the dig

www.arduino.cc

아두이노에서 디지털 핀의 출력값을 설정하는 함수입니다.

digitalWrite(핀번호, 값);

 

  • 핀번호: 출력값을 설정하고자 하는 디지털 핀 번호
  • : 설정하고자 하는 출력 값
       - HIGH: 고전압 출력(5V 또는 3.3V)
       - LOW: 저전압 출력(0V)

이상입니다.

다음 시간에는 디지털 입력에 대한 설명을 드리도록 하겠습니다.

감사합니다.

 

반응형
LIST
반응형
SMALL

안녕하세요! Choi GPT 입니다.

오늘은 아두이노 응용모듈 중에서 많이 사용하는 라이브러리에 대한 정보 입니다.

 

< 아두이노 16X2 I2C LCD >

https://blog.naver.com/boilmint7/221895866337<

 

아두이노 1602 캐릭터 LCD(I2C) 사용 예제

이번에 함께 다룰 아두이노 부품은 1602 CLCD (I2C) 입니다. (캐릭터 LCD = CLCD) 아두...

blog.naver.com

 

* LCD Address 주소 찾기(소스 다운로드 후 압축해제 후 수정없이 사용)

LCD_Adress_Finder_r1.zip
0.00MB

* LCD 기본 테스트 소스

LCD_Basic_Test_r1.zip
0.00MB

 

< 아두이노 DHT11 온습도모듈 >

https://blog.naver.com/hma778/222285869823

 

아두이노 온습도센서모듈 다루기

안녕하세요. 지난 시간에는 조도센서를 다뤄 피에조 스피커와 LED를 제어해보았습니다. 오늘은 온습도센...

blog.naver.com

* DHT11 온습도 모듈 예제 소스파일

DHTtester.zip
0.00MB


< 네오픽셀 라이브러리>

Adafruit_NeoPixel-master.zip
0.06MB

 

감사합니다.

 

반응형
LIST
반응형
SMALL

안녕하세요! Choi GPT 입니다.

이번 글은 챗GPT를 활용한 프로그램 작성 예시 입니다.

정말 왠만한 사람보다 훌륭하게 작성해주는데요.

ChatGPT를 활용한 프로그램 작성 예제

아두이노 나노에 연결된 6개의 LED를 D13부터 D8까지 사용하여 랜덤으로 점멸하는 프로그램을 작성하려면 다음과 같이 코드를 작성할 수 있습니다. 이 코드는 아두이노 IDE에서 작성하고 업로드할 수 있습니다.

// LED 핀 설정
const int ledPins[] = {13, 12, 11, 10, 9, 8};
const int numLEDs = 6;

void setup() {
  // 모든 LED 핀을 출력 모드로 설정
  for (int i = 0; i < numLEDs; i++) {
    pinMode(ledPins[i], OUTPUT);
  }
  randomSeed(analogRead(0)); // 랜덤 시드 초기화
}

void loop() {
  // 랜덤 LED 선택
  int randomLED = random(numLEDs);

  // 선택된 LED를 랜덤으로 켜고 끄기
  digitalWrite(ledPins[randomLED], HIGH);
  delay(500); // 0.5초 동안 켜기
  digitalWrite(ledPins[randomLED], LOW);
  delay(500); // 0.5초 동안 끄기
}

위 코드를 아두이노 IDE에 복사하고 아두이노 나노에 업로드하면 6개의 LED 중 하나가 랜덤으로 선택되어 0.5초 동안 켜지고 0.5초 동안 꺼집니다. 코드에서 `random()` 함수를 사용하여 랜덤한 LED를 선택하고 `digitalWrite()` 함수를 사용하여 LED를 켜고 끕니다. `randomSeed(analogRead(0))`는 랜덤 시드를 초기화하는데 사용되며, 시드를 초기화하지 않으면 항상 같은 순서로 LED가 선택될 수 있습니다.


소스상세 설명

  • ledPins[] 배열: LED가 연결된 핀 번호를 저장하는 배열입니다.
  • 여기서는 총 6개의 핀(13, 12, 11, 10, 9, 8)을 사용합니다.
  • numLEDs: 사용되는 LED의 개수를 나타냅니다. 여기서는 6으로 설정되어 있습니다.


이렇게 하면 다음과 같은 새로운 기능이 추가됩니다.

랜덤한 개수의 LED 켜기: 각 루프마다 1개에서 최대 6개의 LED가 랜덤하게 켜집니다.랜덤한 시간 동안 켜기/끄기: LED가 켜지고 꺼지는 시간이 0.1초에서 1초 사이로 랜덤하게 변경됩니다.

이 코드로 LED가 더 다양한 패턴으로 깜빡거리는 모습을 볼 수 있을 것입니다. 즐겁게 코딩하세요!

// LED 핀 설정
const int ledPins[] = {13, 12, 11, 10, 9, 8};
const int numLEDs = 6;

void setup() {
  // 모든 LED 핀을 출력 모드로 설정
  for (int i = 0; i < numLEDs; i++) {
    pinMode(ledPins[i], OUTPUT);
  }
  randomSeed(analogRead(0)); // 랜덤 시드 초기화
}

void loop() {
  // 랜덤으로 켜질 LED 개수 결정 (1~numLEDs)
  int numLEDsToLight = random(1, numLEDs + 1);

  // 선택된 LED를 랜덤으로 켜기
  for (int i = 0; i < numLEDsToLight; i++) {
    int randomLED = random(numLEDs);
    digitalWrite(ledPins[randomLED], HIGH);
  }

  // 랜덤한 시간 동안 켜기 (0.1초 ~ 1초)
  int onTime = random(100, 1001);
  delay(onTime);

  // 모든 LED 끄기
  for (int i = 0; i < numLEDs; i++) {
    digitalWrite(ledPins[i], LOW);
  }

  // 랜덤한 시간 동안 끄기 (0.1초 ~ 1초)
  int offTime = random(100, 1001);
  delay(offTime);
}

230710_메모.docx
0.01MB

 

감사합니다.

반응형
LIST
반응형
SMALL

#define BUTTON_PIN      2
#define LED_RED_PIN     4
#define LED_BLUE_PIN    9

volatile int button_state;

void setup()
{
  pinMode(BUTTON_PIN  , INPUT_PULLUP);
  pinMode(LED_RED_PIN , OUTPUT);
  pinMode(LED_BLUE_PIN, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), buttonInterrupt, CHANGE);
}

void loop()
{
  digitalWrite(LED_BLUE_PIN, HIGH);
  delay(1000);
  digitalWrite(LED_BLUE_PIN, LOW);
  delay(1000);
}

void buttonInterrupt() 
{
  button_state = digitalRead(BUTTON_PIN);

  if (button_state == HIGH) 
  {
    digitalWrite(LED_RED_PIN, LOW);
  }
  if (button_state == LOW) 
  {
    digitalWrite(LED_RED_PIN, HIGH);
  }
}

소스.txt
0.00MB

반응형
LIST
반응형
SMALL

안녕하세요! Choi GPT 입니다.

아두이노를 활용할 때 제품마다 PC(컴퓨터)와의 연결하는 방법이 다릅니다.

출처 : 아두이노 스토리

보편적으로 위의 제품을 많이 사용합니다.

그 중 오른쪽 SMD 타입에 관련된  USB 드라이버 자료 및 아두이노 스케치 프로그램 다운로드를 소개하고자 합니다.


1. PC와 아두이노를 연결할 때 필요한 USB 드라이버(CH340) 자료 입니다.

CH341SER.zip
0.14MB

다운로드 받으신 파일을 압축해제 후

 

 

해당 Setup 파일을 실행하면 다음과 같은 화면이 나옵니다.

 

 

여기서 Install 버튼을 클릭하면 자동으로 설치가 완료 됩니다.


그 후 정상 설치여부를 다음과 같이 확인 가능합니다.

먼저 내컴퓨터에서 드라이버 인식 여부를 확인하는 방법 입니다.


윈도우 시작버튼 -> 마우스 우클릭

 

 

옵션 팝업창 중에서 장치 관리자 선택

 

포트 -> USB-SERIAL CH340 포트 번호를 확인하시면 됩니다.

그 후에 아두이노 프로그램으로 복귀하셔서

툴 -> 포트 -> 해당 포트번호를 선택해 주시면 됩니다.

 


 

2. 아두이노 코딩 전용 프로그램 중 1.8.19 버전의 프로그램 입니다.

https://www.arduino.cc/en/donate/newsletter

 

 

 

감사합니다.

반응형
LIST

+ Recent posts