[Arduino] dual thermal feedback

2025. 5. 22. 20:35·HCI/Arduino
728x90
반응형

오늘은 기기를 만들었습니다.

 

사용한 부품 및 장치

 

 

진동자: Hapcoil-one

가속도계: ADXL354

https://sillon-coding.tistory.com/632

 

[Haptics - Haptuator Single Frequency] Calibration Using NI DAQ and Python

1. 실험 개요진동자를 활용한 가속도 측정에서는 신호의 정확한 보정이 필수적입니다. 본 실험에서는 Single Frequency Calibration을 수행하여, 특정 주파수에서 입력 전압과 출력 가속도 값의 관계를

sillon-coding.tistory.com

펠티어모듈 : thermoREAL

서미스터(온도 측정)

아두이노 모터 드라이버 2A L298N / Arduino Motor driver

아두이노 우노

 

근데 뭔지는 안알려줄거임 ㅋ

 

개멋있어 강수연

 

회로는 아래와 같습니다

 

 

#include <PID_v1.h>

#define PWM 10
#define PHASE1 2
#define PHASE2 3

#define PWM2 11
#define PHASE3 4
#define PHASE4 5

int Vi = 1023;
float R1 = 22000;
float c1 = -1.185559046e-03;
float c2 = 5.505203063e-04;
float c3 = -9.653138374e-07;

// Sensor 1 (A0)
double input = 0, output = 0, prevInput = 0;
double init_setpoint = 32.5;
double setpoint = init_setpoint;

// Sensor 2 (A1)
double input2 = 0, output2 = 0, prevInput2 = 0;
double init_setpoint2 = 32.5;
double setpoint2 = init_setpoint2;

// PID Parameters
double Kp = 60, Ki = 0.6, Kd = 0.5;

PID myPID(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT);
PID myPID2(&input2, &output2, &setpoint2, Kp, Ki, Kd, DIRECT);

String serialBuffer = "";

void setup() {
  Serial.begin(115200);

  pinMode(PWM, OUTPUT);    pinMode(PHASE1, OUTPUT);    pinMode(PHASE2, OUTPUT);
  pinMode(PWM2, OUTPUT);   pinMode(PHASE3, OUTPUT);    pinMode(PHASE4, OUTPUT);

  myPID.SetMode(AUTOMATIC);
  myPID.SetOutputLimits(-255, 255);

  myPID2.SetMode(AUTOMATIC);
  myPID2.SetOutputLimits(-255, 255);

  Serial.println("READY");
}

void loop() {
if (Serial.available()) {
  String inputLine = Serial.readStringUntil('\n');
  inputLine.trim();  // 앞뒤 공백 제거

  int spaceIndex = inputLine.indexOf(' ');  // 공백 위치 찾기
  if (spaceIndex > 0) {
    String part1 = inputLine.substring(0, spaceIndex);
    String part2 = inputLine.substring(spaceIndex + 1);

    float delta1 = part1.toFloat();
    float delta2 = part2.toFloat();

    setpoint = init_setpoint + delta1;
    setpoint2 = init_setpoint2 + delta2;

    // 디버그 출력
    Serial.print("[INPUT OK] delta1: ");
    Serial.print(delta1);
    Serial.print(" → setpoint1: ");
    Serial.println(setpoint);

    Serial.print("[INPUT OK] delta2: ");
    Serial.print(delta2);
    Serial.print(" → setpoint2: ");
    Serial.println(setpoint2);
  } else {
    Serial.println("[ERROR] Input must be two space-separated numbers, like: 5 -3");
  }
}

  // Sensor 1
  double rawInput = ReadTemperature(A0);
  input = 0.4 * prevInput + 0.6 * rawInput;
  prevInput = input;

  // Sensor 2
  double rawInput2 = ReadTemperature(A1);
  input2 = 0.4 * prevInput2 + 0.6 * rawInput2;
  prevInput2 = input2;

  myPID.Compute();
  myPID2.Compute();

  SetOutputDirection(output, input, setpoint, PWM, PHASE1, PHASE2);
  SetOutputDirection(output2, input2, setpoint2, PWM2, PHASE3, PHASE4);

  // Pretty one-line status output
  Serial.print("CH1: ");
  Serial.print(input, 2);
  Serial.print("°C → ");
  Serial.print(setpoint, 2);
  Serial.print("°C | PWM: ");
  Serial.print(abs(output), 0);

  Serial.print("  ||  CH2: ");
  Serial.print(input2, 2);
  Serial.print("°C → ");
  Serial.print(setpoint2, 2);
  Serial.print("°C | PWM: ");
  Serial.println(abs(output2), 0);

  delay(100);  // 10Hz
}

double ReadTemperature(int pin) {
  int Vo = analogRead(pin);
  if (Vo <= 0) return -999.0;
  float R2 = R1 * (Vi / (float)Vo - 1.0);
  float logR2 = log(R2);
  return (1.0 / (c1 + c2 * logR2 + c3 * pow(logR2, 3))) - 273.15;
}

void SetOutputDirection(double out, double inTemp, double targetTemp,
                        int pwmPin, int ph1, int ph2) {
  double pwmVal = abs(out);
  digitalWrite(ph1, inTemp < targetTemp ? LOW : HIGH);
  digitalWrite(ph2, inTemp < targetTemp ? HIGH : LOW);
  analogWrite(pwmPin, pwmVal);
}

입력예시

3 -6

 

32.5 도가 기본 온도임

저렇게 입력하면 한쪽 펠티어에 32.5 + 3 = 35.5 도로 제어되고,

다른 한쪽에선 32.5 - 6 = 26.5도로 제어됨

728x90
반응형

'HCI > Arduino' 카테고리의 다른 글

[Arduino] Thermistor, Peltier module 을 활용해 Rising time과 Return Time 다항식 만들기 / 파이썬 / 아두이노  (0) 2025.04.16
[Arduino] Thermistor, Peltier module 을 활용해 Rising time과 Return Time 계산하기 / 파이썬 / 아두이노  (0) 2025.04.16
[Arduino] Thermistor 센서 값 받아 아두이노 출력 하기  (2) 2024.09.27
'HCI/Arduino' 카테고리의 다른 글
  • [Arduino] Thermistor, Peltier module 을 활용해 Rising time과 Return Time 다항식 만들기 / 파이썬 / 아두이노
  • [Arduino] Thermistor, Peltier module 을 활용해 Rising time과 Return Time 계산하기 / 파이썬 / 아두이노
  • [Arduino] Thermistor 센서 값 받아 아두이노 출력 하기
sillon
sillon
꾸준해지려고 합니다..
    반응형
  • sillon
    sillon coding
    sillon
  • 전체
    오늘
    어제
    • menu (614)
      • notice (2)
      • python (68)
        • 자료구조 & 알고리즘 (23)
        • 라이브러리 (19)
        • 기초 (8)
        • 자동화 (14)
        • 보안 (1)
      • coding test - python (301)
        • Programmers (166)
        • 백준 (76)
        • Code Tree (22)
        • 기본기 문제 (37)
      • coding test - C++ (5)
        • Programmers (4)
        • 백준 (1)
        • 기본기문제 (0)
      • 공부정리 (5)
        • 신호처리 시스템 (0)
        • Deep learnig & Machine lear.. (41)
        • Data Science (18)
        • Computer Vision (17)
        • NLP (40)
        • Dacon (2)
        • 모두를 위한 딥러닝 (강의 정리) (4)
        • 모두의 딥러닝 (교재 정리) (9)
        • 통계 (2)
      • HCI (23)
        • Haptics (7)
        • Graphics (11)
        • Arduino (4)
      • Project (21)
        • Web Project (1)
        • App Project (1)
        • Paper Project (1)
        • 캡스톤디자인2 (17)
        • etc (1)
      • OS (10)
        • Ubuntu (9)
        • Rasberry pi (1)
      • App & Web (9)
        • Android (7)
        • javascript (2)
      • C++ (5)
        • 기초 (5)
      • Cloud & SERVER (8)
        • Git (2)
        • Docker (1)
        • DB (4)
      • Paper (7)
        • NLP Paper review (6)
      • 데이터 분석 (0)
        • GIS (0)
      • daily (2)
        • 대학원 준비 (0)
      • 영어공부 (6)
        • job interview (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Python
    백준
    programmers
    소수
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
sillon
[Arduino] dual thermal feedback
상단으로

티스토리툴바