PR

Arduinoで自己保持をしてストラックアウト風の制御をしてみる話

arduino-multiple-self-holding-circuits-eyecatch

コメントで要望があった自己保持を複数行う方法についてご紹介します。
Arduinoで自己保持する方法については、
以前の記事で紹介しています。

その時の記事はこちら↓↓↓

以前投稿したArduinoで自己保持する方法について紹介した記事。

今回のポイントとなるのは、
自己保持の数が1~9と複数あること。

状態遷移で前回は解説しましたが、
フラグ管理での実現がベストと判断したので
フラグで解説をしていきます。

それでは早速始めていきましょう。

この記事を読むことでわかること

自己紹介

サラリーマンしてます。

主に工場(生産現場)で使用する検査装置のアプリケーション開発してます。

ヒトの作業を自動化して簡略化するアプリケーションを日々開発中。

2022年5月に転職。現役バリバリの技術者です。
現在は超大手企業の新規事業分野で装置の研究・開発をしています。

Youtubeチャンネルにさまざまな動画を上げています

↓↓↓こちらからYoutubeチャンネルにアクセス!! ↓↓↓

注意

本ブログはアフィリエイトを用いた広告を掲載しています。

まずはコンセプトを考える

条件は以下の通りです。

  • ボタン(入力)を10個用意する。
  • ボタン1~9までは、押されたら自己保持する。
  • ボタン10を押したら、ボタン1~9の自己保持を解除する。(リセットする)
  • ボタンを押したときフラグをONにするだけで、直接的にピンをHIGHにしない。
  • 1度自己保持をONにしたボタンは、
    何度押されてもピンのHIGH/LOWには影響させない。

一番大事なのは、自己保持を正しく書けること。
同じボタンを何度も押されたところで、ピンの出力を何度もONにしないことです。

Arduinoとボタンの配線関係を準備する。

今回実験に使用するのは、
Arduino Nano Every、ボタンはプッシュスイッチにしました。

ボタンは10個用意するのは面倒だったので、
とりあえず4個用意し、3個は自己保持用、1個はリセット用としています。

数を増やして、10個のスイッチとしたところで、
やることはあまり変わりません。配線を増やすだけです。

もしArduino側でポートが足りない。なんていうことが発生するならば、
MCP23017でもMCP23S17でもIOエキスパンダという
便利なICがありますので、そちらで増設してみるのもいいでしょう。

かつて紹介したIOエキスパンダに関する記事はこちら↓

raspberryPiでの解説ですが、I2Cを使うところは一緒です。Arduinoでも同じように実行可能です。

実際に用意した配線

今回はArduino Nano Everyを使用して、
D2~D4にスイッチ1~3を接続しています。

D5にはリセット用のスイッチを接続しています。画像一番右のスイッチ。

strackout-line
arduino nano everyを4つのボタンと接続した状態

内部でプルアップを指定するので、抵抗は不要です。

ちなみにスイッチが大量に必要だと感じたら、
わたしも使っていますがこんなのも通販でゲットできるので検討してみるのもいいでしょう。

今回のArduinoに書き込むスケッチについて

それではスケッチをお見せします。
このスケッチを実行することで、自己保持がかけられていることが
シリアルのウィンドウで確認することが可能です。

LEDなんかの光物を使用することも可能でしたが、
やることはSerial.printlnの行を、DigitalWriteに書き換えることに
気づければLEDやほかのモノの制御も可能ということがわかっていただけると思います。

// フラグ関係をgloval変数で宣言。
bool pin2ONOFF;
bool pin3ONOFF;  
bool pin4ONOFF;
bool pin5ONOFF;
bool pin2hold;
bool pin3hold;
bool pin4hold;
bool pin5hold;
// setup関数
void setup(){
  bool pin2Flg = false;
  bool pin3Flg = false;
  bool pin4Flg = false;
  bool pin5Flg = false;
  pinMode(2,INPUT_PULLUP);
  pinMode(3,INPUT_PULLUP);
  pinMode(4,INPUT_PULLUP);
  pinMode(5,INPUT_PULLUP);
  Serial.begin(115200);
}
// loop関数
void loop(){ 
  // ここでスイッチの状態を読む。
  pin2ONOFF = digitalRead(2);
  pin3ONOFF = digitalRead(3);
  pin4ONOFF = digitalRead(4);
  pin5ONOFF = digitalRead(5);
  // ここからスイッチの状態で判別する。
  if(!pin2ONOFF)
  {
    // もしpin2につながったスイッチが初回のONだった場合はifの中に入る。
    if(!pin2hold)
    {
      // ここでholdのフラグをONにすることで、
      // 2回目以降はリセットされるまでここには入らない。
      pin2hold = true;
      // ここではシリアルで文字を出しているが、好きなものに変更すれば良い。
      Serial.println("2hold");
    }
  }
  if(!pin3ONOFF)
  {
    if(!pin3hold)
    {
      pin3hold = true;
      Serial.println("3hold");
    }
  }
  if(!pin4ONOFF)
  {
    if(!pin4hold)
    {    
      pin4hold = true;
      Serial.println("4hold");
    }
  }
  if(!pin5ONOFF)
  {
    delay(1000);
    pin2hold = false;
    pin3hold = false;
    pin4hold = false;
    Serial.println("reset");
  }
}

今回のまとめ

今回は、複数のスイッチを使用した
複数の自己保持について解説しました。

自己保持単体で1つのスイッチの場合は前回ご覧いただいたように
状態遷移が良いですが、スイッチが多くなってくると、
それぞれにフラグを付与してそれを確認するほうが間違いが無くてよいかなと思っています。

ただ、この処理を書くのが少々面倒なので、(9個分作るのがだるい)
関数にしたり、もっとうまい方法が必ずあると思います。

コメント欄では0b000000000のように、スイッチごとにビットを割り当てて、
1つ1つのスイッチの状態をそこに反映させると言いましたが、
そもそも状態遷移のバリエーションが膨大になるので、
今回はフラグでスイッチごとの管理としました。

コメント

  1. 杉山かつき より:

    樹のパパです
    できました
    ありがとうございました

    • hobbyhappy hobbyhappy より:

      コメントありがとうございます。
      ご要望の動きができたとのことでよかったです。
      またわからないところ、解説してもらいたい内容がありましたら、遠慮なくコメントしてくださいね。

タイトルとURLをコピーしました