Comment on peut visualiser le mouvement/Myoungji KIM

Moteur à vibration

int moteur_vibration = 12; // Broche du moteur a virabtion
 
void setup() {
    pinMode(moteur_vibration, OUTPUT ); // On met la broche du moteur en sortie
}
 
void loop(){
    digitalWrite(moteur_vibration, HIGH); //On allume le moteur
    delay(1000); // On fait une pause d'une seconde
    digitalWrite(moteur_vibration, LOW); // On éteint le moteur
    delay(1000);
}

Capteur de temperature DHT11

// Capteur de temperature et d'humidite DHT11
// https://tutoduino.fr/
// Copyleft 2020

#include "DHT.h"

// Definit la broche de l'Arduino sur laquelle la
// broche DATA du capteur est reliee
#define DHTPIN 2

// Definit le type de capteur utilise
#define DHTTYPE DHT11

// Declare un objet de type DHT
// Il faut passer en parametre du constructeur
// de l'objet la broche et le type de capteur
DHT dht(DHTPIN, DHTTYPE);

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

// Initialise la capteur DHT11
dht.begin();

}

void loop() {

// Recupere la temperature et l'humidite du capteur et l'affiche
// sur le moniteur serie

Serial.println("Temperature = " + String(dht.readTemperature())+" °C");
Serial.println("Humidite = " + String(dht.readHumidity())+" %");

// Attend 10 secondes avant de reboucler
delay(10000);

}

Contrôler la puissance de lampe en fonction de la temperature

#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT11
#define LEDPIN 9

DHT dht(DHTPIN, DHTTYPE);
float currentBrightness = 0.0; // 0~255
float smoothing = 0.1; // 0.0(빠름) ~ 1.0(느림)

int gammaCorrect(int v) {
float g = 2.2; // 감마값 (사람 눈에 적당)
float norm = v / 255.0;
int out = int(pow(norm, g) * 255.0 + 0.5);
return constrain(out, 0, 255);
}

void setup() {
Serial.begin(9600);
dht.begin();
pinMode(LEDPIN, OUTPUT);
}

void loop() {
float t = dht.readTemperature();
if (isnan(t)) return;
// 온도 → 0~255 매핑 (원하는 범위로 조정)
float minT = 25.0, maxT = 30.0;
// 사람 손일 경우 온도 범위를 5도 정도로 해야 램프의 밝기 변화가 눈에 보임

int target = map(constrain((int)(t*10), (int)(minT*10), (int)(maxT*10)),
(int)(minT*10), (int)(maxT*10), 0, 255);
// 감마 보정 적용
int gammaVal = gammaCorrect(target);
// 부드럽게 변화 (exponential smoothing)

currentBrightness = currentBrightness * (1.0 - smoothing) + gammaVal * smoothing;
analogWrite(LEDPIN, (int)currentBrightness);
Serial.print("T:");
Serial.print(t);
Serial.print(" target:");
Serial.print(target);
Serial.print(" gamma:");
Serial.println((int)currentBrightness);

delay(200);
}

Contrôler la puissance de vibration en fonction de la temperature

#include "DHT.h"
#define DHTPIN 2 // DHT11 DATA 핀
#define DHTTYPE DHT11
#define MOTOR_PIN 9 // 진동 모터 PWM 핀

DHT dht(DHTPIN, DHTTYPE);

void setup() {
pinMode(MOTOR_PIN, OUTPUT);
Serial.begin(9600);
dht.begin();
}

void loop() {
float temp = dht.readTemperature(); // 섭씨 온도 읽기
if (isnan(temp)) { // 센서 오류 처리
Serial.println("DHT11 read error");
delay(1000);
return;
}

// 온도 -> 진동 세기(25~30도 범위 매핑)
int motorPower = map(temp, 25, 30, 50, 120); // 25도=50, 30도=120
motorPower = constrain(motorPower, 50, 120); // 최소/최대 범위 제한
// 모터에 PWM 출력 (연속 진동)
analogWrite(MOTOR_PIN, motorPower);
// 디버그 출력
Serial.print("Temp: "); Serial.print(temp);
Serial.print(" C | PWM: "); Serial.println(motorPower);
delay(200); // 센서 읽기 간격
}

Utiliser le moteur courant

Contrôler la vitesse de moteur DC par le controlleur

MoteurDC/ rouge-30e, noir-9h
Controlleur-derniers a/ rouge-30b 5v, orange-29e A0, noir-26c GND droite
Petit outil noir-8 9 10 f/ vert-10j ~9, rouge-8j GND gauche
10K-10g 15h
Un cable noir-15f, GND gauche

Arduino/file/example/servo/Knob
*Val = map(val, 0, 1023, 0, 255) ;

Modules Imprimés et Maquettes de support

Chaques modules créent des formes en volume. En fonctions de l’inclinaison, ils réagissent subtilement. On peut observer des formes s’élargissant, inattendue et brillantes avec la lumière.

Ces mouvements capturent l’attention, permettent de le regarder longtemps et enfin faire se concentrer. Cela devient un objet médiatif et hypnotique.

Le support est évolué pour s’adapter à la forme de la main. Il est conçu pour être tenu et controlé comme un large bowl en accueillant l’utilisateur devant le fond noir, ce qui met valeur la couleur de module sous la lumière. Il est également inspiré par le toupie.

Esquisse 1
Esquisse 2

Controler la vitesse de moteur DC par Accéléromètre

#include <Wire.h>
#include <MPU6050.h>

// MPU6050 객체 생성
MPU6050 mpu;

// 모터가 연결된 핀 (트랜지스터 없이 직접 연결한 경우에도 설정 유지)
const int motorPin = 9;

void setup() {
  // [중요] HTML의 baudRate 설정과 동일하게 115200으로 설정합니다.
  Serial.begin(115200);
  
  // I2C 통신 시작
  Wire.begin();
  
  // MPU6050 초기화
  mpu.initialize();

  // 모터 핀 출력 설정
  pinMode(motorPin, OUTPUT);
  
  // 연결 확인 (시리얼 모니터 대신 웹 앱 디버그창에서 확인 가능)
  if (!mpu.testConnection()) {
    // 센서 연결 실패 시 하드웨어 점검이 필요합니다.
  }
}

void loop() {
  // 1. 모터 작동 (테스트를 위해 상시 HIGH 유지)
  digitalWrite(motorPin, HIGH);

  // 2. 센서 데이터 읽기
  int16_t ax, ay, az, gx, gy, gz;
  mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

  // 3. 가속도 데이터를 이용해 간단한 각도(기울기) 계산
  // atan2 함수를 사용하여 라디안을 구하고 도(degree) 단위로 변환합니다.
  float angX = atan2(ay, az) * 180.0 / M_PI;
  float angY = atan2(ax, az) * 180.0 / M_PI;

  // 4. [중요] HTML 코드의 파싱 규칙에 맞게 데이터 전송
  // 형식: ACX:값|ACY:값|ANGX:값|ANGY:값
  Serial.print("ACX:");   Serial.print(ax);
  Serial.print("|ACY:");  Serial.print(ay);
  Serial.print("|ANGX:"); Serial.print(angX);
  Serial.print("|ANGY:"); Serial.print(angY);
  Serial.println(); // 한 줄의 끝(줄바꿈)을 알림

  // 5. 전송 주기 조절 (웹 시각화 속도에 맞춰 20ms~50ms 권장)
  delay(20);
}


Créer un effect graphic avec des donées de l’accéléromètre

Une fois les données sont transférées sur un navigateur, on peut réaliser des graphiques à partir de ces chiffres. Il suffit de faire de petits codes pour transformer les chiffres en visuels qui bougent.

Tandis que l’objet visualise le mouvement de poignée d’une manière plus analogue, cette expérimentation ouvre une autre manière qui est plutôt digitale. Les codes sont modifiés pour avoir le même gamme d’esthétique entre le graphique sur l’écran et l’objet à la main.