コメントで要望があった自己保持を複数行う方法についてご紹介します。
Arduinoで自己保持する方法については、
以前の記事で紹介しています。
その時の記事はこちら↓↓↓
今回のポイントとなるのは、
自己保持の数が1~9と複数あること。
状態遷移で前回は解説しましたが、
フラグ管理での実現がベストと判断したので
フラグで解説をしていきます。
それでは早速始めていきましょう。
Youtubeチャンネルにさまざまな動画を上げています。
↓↓↓こちらからYoutubeチャンネルにアクセス!! ↓↓↓
本ブログはアフィリエイトを用いた広告を掲載しています。
まずはコンセプトを考える
条件は以下の通りです。
一番大事なのは、自己保持を正しく書けること。
同じボタンを何度も押されたところで、ピンの出力を何度もONにしないことです。
Arduinoとボタンの配線関係を準備する。
今回実験に使用するのは、
Arduino Nano Every、ボタンはプッシュスイッチにしました。
ボタンは10個用意するのは面倒だったので、
とりあえず4個用意し、3個は自己保持用、1個はリセット用としています。
数を増やして、10個のスイッチとしたところで、
やることはあまり変わりません。配線を増やすだけです。
もしArduino側でポートが足りない。なんていうことが発生するならば、
MCP23017でもMCP23S17でもIOエキスパンダという
便利なICがありますので、そちらで増設してみるのもいいでしょう。
かつて紹介したIOエキスパンダに関する記事はこちら↓
実際に用意した配線
今回はArduino Nano Everyを使用して、
D2~D4にスイッチ1~3を接続しています。
D5にはリセット用のスイッチを接続しています。画像一番右のスイッチ。
内部でプルアップを指定するので、抵抗は不要です。
ちなみにスイッチが大量に必要だと感じたら、
わたしも使っていますがこんなのも通販でゲットできるので検討してみるのもいいでしょう。
今回の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つのスイッチの状態をそこに反映させると言いましたが、
そもそも状態遷移のバリエーションが膨大になるので、
今回はフラグでスイッチごとの管理としました。
コメント
樹のパパです
できました
ありがとうございました
コメントありがとうございます。
ご要望の動きができたとのことでよかったです。
またわからないところ、解説してもらいたい内容がありましたら、遠慮なくコメントしてくださいね。