サンプルコード集

作る機会の多い関数のサンプルを集めました

参考にしてもらって構いませんが、まずは自分で考えることが大事です

また、このサンプルのピンは Arduino MEGA を前提としているので、 UNO(小さいほう)を使うときは逐次書き換えてください

クロック

ステッピングモーターDCモーターを回転させるときに使うクロックです

void clock() {
    digitalWrite(5, 1);
    delay(5);
    digitalWrite(5, 0);
}

delay の秒数を指定できるバージョン

void clock(int ms) {
    digitalWrite(5, 1);
    delay(ms);
    digitalWrite(5, 0);
}

ステッピングモーター

ステッピングモーターを回転させる関数です

二次元配列をパターンに使用した例

void stepper() {
  const int PTN[4][4] = {
    { 1, 1, 0, 0 },
    { 0, 1, 1, 0 },
    { 0, 0, 1, 1 },
    { 1, 0, 0, 1 }
  };
  for (int i = 0; i < 4; i++) {
    for (int pin = 12; pin <= 15; pin++) {
      digitalWrite(pin, PTN[i][pin - 12]);
    }
    clock();
  }
}

ビットでパターンを作成した例 (暗記はしやすいかもしれない)

void stepper() {
  const int PTN[4] = { 12, 6, 3, 9 }; // 二進数に変換すると意味が分かる
  for (int p : PTN) {
    for (int j = 0; j < 4; j++) {
      digitalWrite(j + 6, (p >> j) & 1);
    }
    clock();
  }
}

7セグメント

7セグメントを光らせるためのいろいろな関数です

// 点灯パターン
const int SEG_PTN[][7] = {
  { 1, 1, 1, 1, 1, 1, 0 },  // 0
  { 0, 1, 1, 0, 0, 0, 0 },  // 1
  { 1, 1, 0, 1, 1, 0, 1 },  // 2
  { 1, 1, 1, 1, 0, 0, 1 },  // 3
  { 0, 1, 1, 0, 0, 1, 1 },  // 4
  { 1, 0, 1, 1, 0, 1, 1 },  // 5
  { 1, 0, 1, 1, 1, 1, 1 },  // 6
  { 1, 1, 1, 0, 0, 1, 0 },  // 7
  { 1, 1, 1, 1, 1, 1, 1 },  // 8
  { 1, 1, 1, 1, 0, 1, 1 },  // 9
  { 0, 0, 0, 0, 0, 0, 0 },  // 空白(リセット用)
};

// 信号だけ送る関数
void seg(int num) {
  for (int i = 12; i <= 18; i++) {
    digitalWrite(i, SEG_PTN[num][i - 12]);
  }
}

// 左側だけ光らせる関数
void segL(int num) {
  seg(10);  //残像防止
  digitalWrite(2, 1);
  digitalWrite(3, 0);
  seg(num);
}

// 右側だけ光らせる関数
void segR(int num) {
  seg(10);  //残像防止
  digitalWrite(2, 0);
  digitalWrite(3, 1);
  seg(num);
}

// 両方を指定した時間光らせる関数
void segW(int l, int r, int duration) {
  for (int i = 0; i <= duration; i++) {
    if (i % 2 == 0) {
      segL(l);
    } else {
      segR(r);
    }
    delay(1);
  }
}

ステッピングモーターと7セグメント

県大会レベルでは一番の難関だと思うので、あえてここにはコードを書きませんが、ヒントは

  • ステッピングモータのクロックの前に余計な信号を入れないこと
  • ステッピングモータのクロックの間も7セグメントを点灯させること

です

どうしてもコードが見たければ以下のリポジトリに書いてあるので見てください https://github.com/jinnosukeKato/Monokon-Kanagawa-2022

押して離されたら(バンプ)

const int SW = 22;

void loop() {
  while(digitalRead(SW) == 1) {
    // ここに押されている間の待機動作
    if(digitalRead(SW) != 1) {
      // ここには離されたときに動作する内容
    }
  }
}