高校生用の講座。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);
}
}