본문 바로가기
1.B. Low Level Engineering/Micro Controller Unit

[MCU] P2. PWM 신호 만들기 (LED 밝기조절, 피에조, 모터 신호...)

by Never Settle Down 2023. 3. 6.
반응형

 

 

내가 지금 좀 바빠서

잡소리는 나중에 여유있을 때 추가하는 것으로 하고.

 

PWM이 뭔지 모르면 구글링 하고 오세요.

 

펄스파 (구형파, 사각파 라고도 부름)를 주기적으로 생성하는 것이다.

 

 

제목처럼

- LED 밝기조절 (아날로그로 조절하는게 아닌. 디지털 껐다켜기 + 잔상)

- Piezo로 특정 음 내기 (e.g. A = 440Hz (나는 A = 432Hz를 주장하는 사람중 하나다) )

- PWM 제어를 쓰는 모터 컨트롤 (서보모터, 대표적인 예가 CNC머신의 서보나 컴퓨터 팬)

 

 

 

I2C LCD와 포텐쇼미터를 추가로 쓸 것이다.

 

뭔지 모르면 무시하거나, 앞 포스팅을 참고하면 된다:

2023.02.15 - [Engineering Log/Micro Controller Unit] - Arduino - P1. I2C 디스플레이 연결하기 (1602A LCD + Adafruit OLED)

 

Arduino - P1. I2C 디스플레이 연결하기 (1602A LCD + Adafruit OLED)

MCU 카테고리의 글을 읽는 독자 친구 한 명과 전화를 했다. - 마리우스가 누구에요? - 어 있어 묻지 마셈. - 정수까지만 하고 왜 안올려요 - 바빠 임뫄 - 이론 쓰기 귀찮아서 그렇죠 - ㅇㅇ - 어차피

thewanderer.tistory.com

 

 

 

 

소오스코드

 

더보기
//#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(2);
  display.setCursor(0,0);
  display.print("Potentio %");
  display.setTextSize(2);
  display.setCursor(0,16);
  display.print("   %");

  display.display();


  //using PWM on pin 3 (490MHz, pin5 goes 980Hz)
  pinMode(3, OUTPUT);
  digitalWrite(3, LOW);
}

void loop() {
  static unsigned short potentVal;
  static unsigned short prevPVal = 0;
  static unsigned short potentPercent;
  static unsigned short prevPPercent = 0;  

  potentVal = analogRead(A0);
  potentPercent = (unsigned short)((double)(potentVal) * 100.0 / 1023.0);
  display.setCursor(0,16); display.setTextColor(SSD1306_BLACK); display.print(prevPPercent);
  display.setCursor(0,16); display.setTextColor(SSD1306_WHITE); display.print(potentPercent);
  display.setCursor(70,16); display.setTextColor(SSD1306_BLACK); display.print(prevPVal);
  display.setCursor(70,16); display.setTextColor(SSD1306_WHITE); display.print(potentVal);
  display.display();

  prevPVal = potentVal;
  prevPPercent = potentPercent;


  analogWrite(3, potentVal>>2);
  //analogWrite() value range: 0 (0% duty, low) ~ 128(50% duty) ~ 255 (100% duty, HIGH)

  delay(100);
}

 

 

 

 

 

 

 

LED가 점점 밝아진다.

 

 

끝.

 

 

 

 

 

 

은 아니고.

 

 

프루프 오브 콘셉트 보여줘\야지.

 

 

컴퓨터 팬

전원부에 12V 넣어주고

4번쨰 핀 PWM핀에 아두이노 5V PWM 신호를 넣어주면 돌아간다.

 

컴퓨터가 제어하듯 제대로 되는건 아니고

그냥 속도변화를 볼 수 있다.

정도.

 

 

 

 

맥 프로 팬 물려서

이것저것 실험하다가

아두이노 프로세서부분을 태워먹었다.

ㅜㅜ

 

 

트랜지스터인줄 알고 꽂았는데

태워먹고 보니 단순히 다이오드가 마주보고 있는

휘트스턴 브릿지용 다이오드...220V 견디는 AC to DC용 다이오드 ㅜㅜ

 

다이오드가 GND랑 12V 쇼트나는건 막아주었는데

12V 전압이가 0.7V 다이오드 하강 후

인풋핀으로 아무 저항 없이 쏟아져 들어갔다.

 

아마 1A (어댑터 최대출력)이 고대로 다 쳐들어 가지 않았을까..

 

 

인풋 핀에다 12V 1A를 때려박아버리니

아예 맛탱이가 가버렸다.

 

 USB 통신 프로세서랑 전원부는 살아있는데

프로세서는 아예 식물인간..ㅜㅜ

 

파츠 살릴만한거

납땜 제거하고 떼어낸 다음에

DC 변압기로 써야겠다.

(12V 입력하고 3.3V랑 5V 뽑아내는 용)

 

 

끝.

반응형

댓글