日別アーカイブ: 2025/11/08

Arduinoで振動を出す

高校生用の講座。Arduino開発環境は1.8.19を入れるのが良い。
インストール手順の動画

購入した振動デバイスはこれ↓

PWMは振動の強さで段階を表現。→やってみたがわかりにくい。
Burstは振動の時間で段階を表現。→こちらが無難か。

/*
PWM_shaker.ino  
PWM出力を8段階で徐々に強くするスケッチ(シリアル出力付き)
  出力ピン: 11番
  各段階: 2秒出力 → 1秒休止
  シリアル通信: 115200 bps
*/

const int pwmPin = 11;
const int numSteps = 8;
const int maxPWM = 255;
const int delayOn = 2000;  // 出力時間(ms)
const int delayOff = 1000; // 休止時間(ms)

void setup() {
  pinMode(pwmPin, OUTPUT);
  Serial.begin(115200);
  Serial.println("PWM gradual output start");
}

void loop() {
  for (int i = 0; i < numSteps; i++) {
    int pwmValue = map(i, 0, numSteps - 1, 0, maxPWM);
    analogWrite(pwmPin, pwmValue);

    Serial.print("Step ");
    Serial.print(i + 1);
    Serial.print(" / ");
    Serial.print(numSteps);
    Serial.print(" : PWM = ");
    Serial.println(pwmValue);

    delay(delayOn);   // 2秒間出力
    analogWrite(pwmPin, 0);
    delay(delayOff);  // 1秒休止
  }
}
/*
  Burst_shaker.ino
  振動モーター制御:傾き0〜8段階(1〜8でOFFが900→0msに減少)
  出力ピン: 11
  シリアル: 115200 bps
  各段階: 4秒動作 + 1秒休み
  ON中のPWMは常に255
*/

const int pwmPin = 11;
const int numLevels = 9;                 // 0〜8
const int onMs = 100;                    // ON時間は固定100ms
const unsigned long runWindow = 4000;    // 各段階の動作時間(ms)
const unsigned long pauseWindow = 1000;  // 段階間の休止(ms)

void setup() {
  pinMode(pwmPin, OUTPUT);
  analogWrite(pwmPin, 0);
  Serial.begin(115200);
  Serial.println("Vibration feedback (OFF 900->0ms) start");
}

void loop() {
  for (int level = 0; level < numLevels; level++) {
    unsigned long start = millis();

    if (level == 0) {
      // 無振動
      Serial.println("Level 0: No vibration (4000ms silence)");
      analogWrite(pwmPin, 0);
      while (millis() - start < runWindow) delay(10);

    } else {
      // 1〜8段階:OFF時間 900→0ms
      int offMs = map(level, 1, 8, 900, 0);

      Serial.print("Level ");
      Serial.print(level);
      Serial.print(": ");
      Serial.print(onMs);
      Serial.print("ms ON / ");
      Serial.print(offMs);
      if (offMs == 0) Serial.print("ms OFF (ほぼ連続)");
      Serial.println();

      while (millis() - start < runWindow) {
        // ON
        analogWrite(pwmPin, 255);
        delay(onMs);

        // OFF(offMs==0のときは極短時間で次のONへ)
        analogWrite(pwmPin, 0);
        if (offMs > 0) delay(offMs);
      }
    }

    // 段階間休止
    analogWrite(pwmPin, 0);
    Serial.println("Pause 1000ms\n");
    delay(pauseWindow);
  }
}