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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

1回答

3422閲覧

Arduino:タクトスイッチを押してる間だけサーボモータを動作させたいです

Comm

総合スコア3

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2020/07/24 16:52

#実行したいこと

現在、温度センサの出力値によってサーボモータの動作が変わるプログラムを作成し次に,タクトスイッチを押している間だけ,loop関数内の温度センサの出力値によってサーボモータの動作が変わるプログラムが動くようにしたいです.

サーボモータの動作は,気温が18℃以上30℃以下の場合は,サーボモータの角度が0°→180°→140°→0°→180°→140°と動作し,
気温が10℃より高く18℃より低い,または気温が30℃より高く35℃より低い場合はサーボモータの角度が0°→180°→140°と動作し,
それ以外の気温では動作しない

といったものです.

タクトスイッチを押していない間は,温度センサの出力値によってサーボモータの動作が変わるプログラムは動作せず,押している間だけ温度センサの出力値によってサーボモータの動作が変わるプログラムを動作し,サーボモータの動作中にタクトスイッチを押している指を離すと,動作が停止し,ふりだしに戻るようにしたいのですが,どのように書けばよいかわかりません.

自分ひとりの力では解決できないので,どなたか教えていただけないでしょうか.

#include<Servo.h> const int THERMISTOR=A0; const int SERVO=9; CONST int SWITCH=2; Servo servo; //サーボモータ void setup() { servo.attach(SERVO); //サーボモータをピンに接続 Serial.begin(9600);  pinMode() } void loop() { 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(2000); Serial.println("2 sec_elapsed"); Serial.println("Ready for feeding"); servo.write(0); Serial.println("0 degree"); delay(2000); Serial.println("2 sec_elapsed"); servo.write(180); Serial.println("180 degree"); delay(2000); Serial.println("2 sec_elapsed"); servo.write(140); Serial.println("140 degree"); delay(2000); Serial.println("Second lap"); servo.write(0); Serial.println("0 degree"); delay(2000); Serial.println("2 sec_elapsed"); servo.write(180); Serial.println("180 degree"); delay(2000); Serial.println("2 sec_elapsed"); servo.write(140); Serial.println("140 degree"); delay(5000); Serial.println("5 sec.elapsed"); }else if(10.0<temp && temp<18.0){ //気温が10℃より高く18℃より低い場合 servo.write(0); Serial.println("0 degree"); delay(2000); Serial.println("2 sec_elapsed"); servo.write(180); Serial.println("180 degree"); delay(2000); Serial.println("2 sec_elapsed"); servo.write(140); Serial.println("140 degree"); delay(5000); Serial.println("5 sec.elapsed"); }else if(30.0<temp && temp<=35.0){ //気温が30℃より高く35℃より低い場合 servo.write(0); Serial.println("0 degree"); delay(2000); Serial.println("2 sec_elapsed"); servo.write(180); Serial.println("180 degree"); delay(2000); Serial.println("2 sec_elapsed"); servo.write(140); Serial.println("140 degree"); delay(5000); Serial.println(5sec.elapsed"); }else{ //10℃より低いまたは35℃より高い場合 Serial.println(temp);//シリアル通信で値を送信 delay(1000); //サーボモータ不動 servo.write(0); Serial.println("Servo does not feed"); delay(5000); Serial.println("5 sec.elapsed"); } }

#回路図
イメージ説明

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SHOMI

2020/07/24 18:05 編集

プログラム云々以前に抵抗が入っていないのでタクトスイッチを押すと5VとGNDがショートして電源壊れますよ。 pinMode(SWITCH, INPUT_PULLUP);でD2を内部プルアップありにして、D2-スイッチ-GNDと繋げば外付けの抵抗はいりません。押してないときがHIGHになりますが。
Comm

2020/07/25 03:06

ご指摘ありがとうございます.
guest

回答1

0

ベストアンサー

タクトスイッチは、D2-sw-GNDです。5Vには繋ぎません。

で、前回、「サーボを動かしながらもスイッチを確認する」の様な事を言ったと思います。
良くある方法は、millisを使う方法(開始時間を記録して、経過時間とスイッチを見ながら動作を行う)と
細かい時間単位をカウントする方法です。
※とにかく、長いdelayを使うのは駄目です。

で、後者だと、↓のような感じです。
※シリアル送信部分は、記述するとポイントが判りにくくなるのと、面倒なのとで、省略しました。

arduino

1#include <Servo.h> 2 3const int THERMISTOR=A0; 4const int SERVO=9; 5const int SWITCH=2; 6 7Servo servo; //サーボモータ 8 9void setup() { 10 servo.attach(SERVO); //サーボモータをピンに接続 11 Serial.begin(9600); 12 pinMode(SWITCH,INPUT_PULLUP); 13 servo.write(0); 14} 15 16 17void loop() { 18 static word cnt=0,mode=0; 19 static float temp; 20 int v; 21 22 if(cnt==0) { 23 v=analogRead(THERMISTOR); 24 temp=(v*5000.0/1024-500.0)/10.0; 25 Serial.println(temp); 26 27 if(temp<10)mode=0; 28 else if(temp<18)mode=1; 29 else if(temp<30)mode=2; 30 else if(temp<35)mode=3; 31 else mode=0; 32 cnt=0; 33 } 34 35 if(digitalRead(SWITCH)==LOW && mode) { 36 if(mode==1 || mode==3) { 37 if(cnt==0)servo.write(0); 38 else if(cnt==200)servo.write(180); 39 else if(cnt==400)servo.write(140); 40 else if(cnt>=900) { 41 cnt=0; 42 return; 43 } 44 45 } else if(mode==2) { 46 if(cnt==200)servo.write(0); 47 else if(cnt==400)servo.write(180); 48 else if(cnt==600)servo.write(140); 49 else if(cnt==800)servo.write(0); 50 else if(cnt==1000)servo.write(180); 51 else if(cnt==1200)servo.write(140); 52 else if(cnt==1400)servo.write(180); 53 else if(cnt>=1900) { 54 cnt=0; 55 return; 56 } 57 } 58 59 } else { 60 if(cnt>=2000)cnt=0; 61 servo.write(0); 62 } 63 cnt++; 64 delay(10); 65} 66 67

投稿2020/07/24 20:31

nac_tnk

総合スコア463

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Comm

2020/07/25 03:12

ご丁寧にコードまで作成していただき,ありがとうございます. プログラムの動作を動作を確認できました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問