質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.91%

Arduino:タクトスイッチでオンオフの切り替えをしたい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 341

Comm

score 3

実行したいこと

タクトスイッチによるオンオフの切り替え

タクトスイッチを1回押すと,スイッチがオンになり,motor_action関数を呼び出し,温度センサの出力値を読み込みサーボモータを動作させ,
タクトスイッチをもう一度押すと,スイッチがオフとなる動作を想定しています

今回作成したプログラムを実行した結果,スイッチが反応せず,サーボモータが動作を続ける結果となりました.
どこが間違っているか教えていただけないでしょうか.

作成したプログラム

#include<Servo.h>

const int THERMISTOR=0; //温度センサが接続されているピン
const int SERVO=9;      //サーボモータが接続されているピン
const int SWITCH=2;     //タクトスイッチが接続されているピン

int s;       //タクトスイッチの入力値
int old_s;   //1時刻前の入力値
int state=0; //現在の状態


Servo servo;       //サーボモータ

void setup() {
  pinMode(SWITCH,INPUT); //ピンを入力に設定
  pinMode(THERMISTOR,OUTPUT);
  servo.attach(SERVO);   //サーボモータをピンに接続
  pinMode(SERVO,OUTPUT);
  Serial.begin(9600);
}

void loop(){
  s=digitalRead(SWITCH);          //入力を読み取る
  if((s==HIGH) && (old_s==LOW)){  //
   state=1-state;                 //状態を変更(0なら1,1なら0へ変更)
   delay(30);       
  }
  old_s=s;          //1時刻前の入力として保存
  if(state==1){ //状態が1のとき
    digitalWrite(THERMISTOR,HIGH);
    digitalWrite(SERVO,HIGH);
    motor_action(); //関数呼び出し  
  }else{            //状態が0のとき
    digitalWrite(THERMISTOR,LOW);
    digitalWrite(SERVO,LOW);
  }
}

void motor_action() {
  int v;
  float temp;

  v=analogRead(THERMISTOR);
  temp=(v*5000.0/1024-500.0)/10.0; //温度に変換
  if(18.0<=temp && temp<=30.0){  //気温が18℃以上30℃以下の場合
    Serial.println(temp);
    delay(0);
    servo.write(0);
    delay(3000);
    servo.write(90);
    delay(3000);
  }else if(10.0<temp && temp<18.0){  //気温が10℃より高く18℃より低い場合
    Serial.println(temp);
    delay(0);
    servo.write(0);
    delay(2000);
    servo.write(90);
    delay(2000);
  }else if(30.0<temp && temp<=35.0){  //気温が30℃より高く35℃より低い場合
    Serial.println(temp);
    delay(2000);
    servo.write(0);
    delay(200);
    servo.write(90);
    delay(200);
    }else{                   //10℃より低いまたは35℃より高い場合
    Serial.println(temp);  //シリアル通信で値を送信
    delay(0);              //サーボモータ不動
    servo.write(0);
    delay(0);
  }
}


--追記--

温度センサの回路図

![イメージ説明](41db6a95577a5d341abcc34f1b403a01.png)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+3

1)温度センサーの使い方に関する疑問
質問のプログラムは温度センサーにつながるピンを、出力ピンに設定しています。

  pinMode(THERMISTOR,OUTPUT);


センサーは外部の状態(温度、湿度、電圧、圧力、等々)を電気信号に変える素子(もしくは装置)です。そこに出力して何の意味があるのでしょうか?
センサーからの信号を受け取らないと、センサーを接続している意味が無いです。

2)温度センサーの回路に関する疑問
ピンにつながっている温度センサーの回路は、どうなっているのでしょうか?
プログラムに「const int THERMISTOR=0; //温度センサが接続されているピン」と書かれているので、サーミスター(温度で抵抗値が指数的に変わる素子)が使われているのだろうと推測されます。
たとえば、下のような回路だと、Vtの電圧は温度が上がるにつれて高くなります(温度が上がると、サーミスターの抵抗が低くなるからです)。
イメージ説明

サーミスターの抵抗値の変化は、温度に対して指数的なので、Vtの電圧の変化も温度に対して指数的になります。
ところが、質問のプログラムでは温度が電圧と比例する式になっています。

v=analogRead(THERMISTOR);
temp=(v*5000.0/1024-500.0)/10.0; //温度に変換


なぜ、上記の式で温度が得られるのでしょうか?

==
ハードウェア(Arduinoのピンが接続されている電気回路)と、プログラムの両方に問題があるように思われますが、ハードウェアに関する情報が無いので、解決する方法を助言することができません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/15 22:58

    ご回答ありがとうございます.
    ピンに接続している温度センサの回路を追記させていただきました.
    使用している温度センサは,MCP9700-E/TOです.
    また,プログラム中の温度の計算式は,サンプルコードから引用しました.

    キャンセル

+2

時間待ちをすべてdelayで行ってますが、これではまずいです。
delayで時間待ちをしてる間は、全く処理は行いません。
スイッチの入力も行われない、ということになります。

つまりは、motor_actionを実行中の6秒間は、スイッチをどうしようと無視される、ということとなります

コードの各所に、動作状態を示すメッセージを出すようにして、コードがどういう動作をしているのか確認できるようにしておけばどうでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/16 01:00

    ご回答ありがとうございます
    動作状態を示すメッセージをシリアル通信で送信し,それを確認するという解釈でよろしいでしょうか.

    キャンセル

  • 2020/07/16 01:03

    それでいいです。
    メッセージを垂れ流ししておきましょう

    キャンセル

  • 2020/07/16 01:07

    お返事ありがとうございます

    キャンセル

checkベストアンサー

+1

お二方の返信で十分だとも思ったのですけど、まだ回答を求めている、という事なので・・・

const int THERMISTOR=0;//①

pinMode(THERMISTOR,OUTPUT);//②

Serial.begin(9600);//③

digitalWrite(THERMISTOR,HIGH);//④

digitalWrite(THERMISTOR,LOW);//⑤

v=analogRead(THERMISTOR);//⑥

まず、質問とは関係無い部分ですけど、これも重要なので、こっちから話します。
①で、THERMISTORは0です。
②で、「D0」ピンを出力にしています。しかし、直ぐに
③で、「D0」ピンはRXなので、入力に変えられます。
④⑤では「D0」ピンはプルアップあり/無しに変えられます。
⑥では「A0」ピンをアナログ入力しています。

※analogReadはGPIOでは無いので、②④⑤の処理は要りません。そして①は
const int THERMISTOR=A0;
あるいは
const int THERMISTOR=14;
が適当です。

で、似たような事をサーボにもしているのですけど、こちらの方のdigitalWriteはそうしたかったのか、
あるいは間違えたのかは不明です。
サーボの動きも含めて、ちゃんとやりたい動作を書いてください。
ぬるい質問にはぬるい返信で返すしかなくなります。

勿論、サーボが動作中にSWを受け付けない、という事は判ります。
問題は、サーボが動作中にSWを押した場合に、①直ぐに停止してホーム位置へ持っていくのか、②1サイクル行ってから戻すのか?です。
後者なら、そもそもタクトスイッチを使うのが悪い、とも言えます。
サイクルに最大6秒もかかるようなものだと、押したのか押していないのかが判りにくいものです。
ちゃんと状態のわかるオルタネイトスイッチの方が適当だと思います。
※ただし、③サーボが動作中に押した場合は「トグル動作」では無く、「オフにする」という仕様にすれば多少良くなります。

で、①②③のどれを教えたらいいのかが判らないと、聞かれてもいない部分でこちらが全部想定して答えるのもばからしいので
「サーボが動作中にSWを受け付けない」のポイントだけの返信(つまり、SWの状態をサーボ動作中も見ろ)になってしまいます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/22 19:37

    ご回答ありがとうございます

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る