第2回

ステッピングモーター

ステッピングモーターは、電気信号を入力することで一定の角度だけ回転するモーター。
回転数だけでなく、角度も制御することができる。

ChatGPTを使い、暗くなったらLEDが点滅し、モーターも回るようにすることで営業中ということを知らせる看板を再現してみた。

プログラム


            const int DIR  = 8;
const int STEP = 9;
const int LIGHT_PIN = A1;
const int LED_PIN = 13;   // LED追加

int threshold = 200;

bool ledState = false;
unsigned long previousMillis = 0;
int interval = 750; // 点滅間隔(ms)

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

  pinMode(DIR, OUTPUT);
  pinMode(STEP, OUTPUT);
  pinMode(LED_PIN, OUTPUT);

  digitalWrite(DIR, LOW);
  digitalWrite(STEP, LOW);
}

void loop() {
  int val = analogRead(LIGHT_PIN);
  Serial.println(val);

  if (val > threshold) {
    // モーター回転
    digitalWrite(DIR, HIGH);
    stepMotor(7500);

    // LED点滅(時間で制御)
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= interval) {
      previousMillis = currentMillis;
      ledState = !ledState;
      digitalWrite(LED_PIN, ledState);
    }

  } else {
    // 明るいときはLED消灯
    digitalWrite(LED_PIN, LOW);
  }
}

void stepMotor(int delaytime){
  digitalWrite(STEP, HIGH);
  delayMicroseconds(delaytime);
  digitalWrite(STEP, LOW);
  delayMicroseconds(delaytime);
}
        
bool ledState = false;
・LEDの現在の状態を保持
unsigned long previousMillis = 0;
・前回LEDを切り替えた時間を記録
unsigned long currentMillis = millis();
・現在の経過時間を取得
if (currentMillis - previousMillis >= interval)
・前回の切り替えからinterval以上経過しているか確認
previousMillis = currentMillis;
・時間を更新
ledState = !ledState;
・LEDの状態を反転
void stepMotor(int delaytime){
・モーターを1ステップ動かす関数。delaytimeはパルスの間隔。

振り返り

今回は生成AIを使ってプログラムを作ってもらいましたが、一瞬で新しいプログラムを作ってくれるのは凄いです。
他の人の作品には自分では思いつかなかったものもありましたが、そのような作品を見ると別の角度からの考え方を養える気がします。