포텐셔미터

magicdrill·2025년 1월 26일

포텐셔미터

가변저항

전자회로에서 저항값을 임의로 바꿀수 있음.
아날로그 입력을 아두이노로 받은 후 저항값으로 변환해서 시리얼 모니터에 출력해본다.

register는 예약어다
애초에 저항은 regist가 아니고 resist, resistor이다

#define MAX_REGISTER 10000

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println("Serial Com Start");
}

void loop() {
  // put your main code here, to run repeatedly:
  int val = analogRead(A0);//A0에서 아날로그 입력값 읽어서 val에 저장 : 0~1023
  int registor = map(val, 0, 1023, 0, MAX_REGISTER);// map함수를 사용함 -> 아날로그 값을 저항값으로 변환
  
  Serial.print("val : ");
  Serial.println(val);
  Serial.print("registor : ");
  Serial.println(registor);
  delay(500);
}

map(value, fromLow, fromHigh, toLow, toHigh);
특정 범위의 숫자를 다른 범위의 숫자로 변환하는 함수이다.
예를 들어 0~1023의 숫자를 0~10000 사이의 숫자로 변환한다.

조이스틱

내부 가변저항으로 x축과 y축의 데이터를 읽어온다. 또한 모듈에 따라 푸시스위치가 있을 경우 디지털신호 푸시스위치 입력도 받을 수 있다.

int sw = 7;//조이스틱 푸시스위치는 7

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(sw, INPUT_PULLUP);//내부 풀업저항 사용
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.print("X축 : ");
  Serial.print(analogRead(A0));
  Serial.print(", Y축 : ");
  Serial.print(analogRead(A1));
  Serial.print(", 스위치 : ");
  Serial.println(digitalRead(sw));
  
  delay(100);
}

스위치 변수를 sw가 아니라 switch로 했었는데, 생각해보니 switch-case문의 예약어이다.


기본적으로 스위치 상태는 안 눌렀을 때 1이다. 눌러야 1이고 안누르면 0이라고 생각했는데 핀모드 내부 풀업저항 때문이다.

내부 풀업 저항을 사용하면 디지털 핀을 기본적으로 HIGH상태로 유지한다. 그래서 digitalRead(sw)는 기본적으로 1이다.
스위치를 누르면 디지털 핀과 GND가 연결되어 전압이 0이 되고 digitalRead(sw)는 0이 된다.

스위치를 눌렀을 때 sw값이 1이 되게 하려면 풀다운 저항을 추가해야 한다.

Page 115 Example

LED 4개를 마름모 모양으로 배치하고 조이스틱을 기울이면 기울인 방향에 해당하는 LED가 들어오도록 회로를 구성한다. -> 스위치 클릭 여부도 해보겠다.

int sw = 13;//조이스틱 푸시스위치는 7

//12시 방향부터 시계방향으로
int led1 = 2;
int led2 = 3;
int led3 = 4;
int led4 = 5;
int led9 = 10;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(sw, INPUT_PULLUP);//내부 풀업저항 사용
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led9, OUTPUT);

  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  digitalWrite(led9, LOW);
}

void loop() {
  // put your main code here, to run repeatedly:
  int x, y;

  x = analogRead(A0);
  y = analogRead(A1);

  Serial.print("X축 : ");
  Serial.print(x);
  Serial.print(", Y축 : ");
  Serial.print(y);
  Serial.print(", 스위치 : ");
  Serial.println(digitalRead(sw));

  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);

   //푸시스위치
  if(digitalRead(sw) == 0){
    digitalWrite(led9, HIGH);
  }
  else{
    digitalWrite(led9, LOW);
  }

  if(digitalRead(sw) == 0){
    digitalWrite(led9, HIGH);
  }
  else{
    digitalWrite(led9, LOW);
  }

  if(x < 256){
    digitalWrite(led1, HIGH);
    digitalWrite(led3, LOW);
  }
  else if(x > 768){
    digitalWrite(led1, LOW);
    digitalWrite(led3, HIGH);
  }
  else{
    digitalWrite(led1, LOW);
    digitalWrite(led3, LOW);
  }

  if(y < 256){
    digitalWrite(led2, HIGH);
    digitalWrite(led4, LOW);
  }
  else if(y > 768){
    digitalWrite(led2, LOW);
    digitalWrite(led4, HIGH);
  }
  else{
    digitalWrite(led2, LOW);
    digitalWrite(led4, LOW);
  }
  
  delay(100);
}

0개의 댓글