2つスイッチ&サーボ→5つスイッチ&サーボへ

Arduino に関するご質問などはこちらへ。

2つスイッチ&サーボ→5つスイッチ&サーボへ

投稿記事by nas.iron » 2014年7月10日(木) 21:10

初めて質問させて頂きます。

スイッチ2つでサーボを2つ駆動するコードは動作確認ができています。
それを改良して【5つのスイッチをそれぞれ対応させた5つのサーボを駆動】するコードを作りたいのですが、setup以降のloop内の条件分岐で困っております。

二つサーボ用のコードを載せさせて頂きます。ご教授お願いします。(抜本的にもっとシンプルなコードなどがあれば教えて頂ければと思います。)
よろしくお願い致します。

int out1 = 1; //サーボ1=1PIN
int out2 = 2; //サーボ2=2PIN
int out3 = 3; //サーボ3=3PIN 追加行
int out4 = 4; //サーボ4=4PIN 追加行
int out5 = 5; //サーボ5=5PIN 追加行

int in1 = 8; //サーボ1用スイッチ=8PIN
int in2 = 9; //サーボ2用スイッチ=9PIN
int in3 = 10; //サーボ3用スイッチ=10PIN 追加行
int in4 = 11; //サーボ4用スイッチ=11PIN 追加行
int in5 = 12; //サーボ5用スイッチ=12PIN 追加行

void setup(){
//パルス出力ピンの設定
pinMode(out1,OUTPUT);
pinMode(out2,OUTPUT);
pinMode(out3,OUTPUT);//追加行
pinMode(out4,OUTPUT);//追加行
pinMode(out5,OUTPUT);//追加行

// デジタル入力のプルアップ抵抗を有効にする
pinMode(in1, INPUT_PULLUP);
pinMode(in2, INPUT_PULLUP);
pinMode(in3, INPUT_PULLUP); //追加行
pinMode(in4, INPUT_PULLUP); //追加行
pinMode(in5, INPUT_PULLUP); //追加行
}

//以下 2つのサーボバージョンです
void loop(){

int val1;
int val2;
if (digitalRead(in1) == HIGH) {
val1 = 1750; //サーボ1のON位置設定
}
else {
val1 = 250; //サーボ1のOFF位置設定
}
if (digitalRead(in2) == HIGH) {
val2 = 1750; //サーボ2のON位置設定
}
else {
val2 = 250; //サーボ2のON位置設定
}
//パルス:HIGHを出力
digitalWrite(out1,HIGH);
digitalWrite(out2,HIGH);
if (val2 < val1) { //サーボ2の方が早い
delayMicroseconds(val2+500);
digitalWrite(out2,LOW); //サーボ2を先に出力
delayMicroseconds(val1-val2);
digitalWrite(out1,LOW); //サーボ1を後に出力
val2 = val1; //遅い方をセット
}
else {
delayMicroseconds(val1+500);
digitalWrite(out1,LOW); //サーボ1を先に出力
if (val1 < val2) { //サーボ1の方が早い(同時の場合は飛ばす)
delayMicroseconds(val2-val1);
}
digitalWrite(out2,LOW); //サーボ2を後に出力
}
//HIGHの継続時間を差引いて周期を20000usに調整
delayMicroseconds(10000-(val2+500));
delayMicroseconds(10000);
}
nas.iron
 
記事: 8
登録日時: 2014年7月10日(木) 20:45

Re: 2つスイッチ&サーボ→5つスイッチ&サーボへ

投稿記事by yamaguch » 2014年7月11日(金) 10:18

nas.iron さん、こんにちは、

どのように動くのかはスケッチから推測しろということかもしれませんが、できれば、二つのスイッチで二つのサーボをどのように制御しようとしているのかを文章にしてもらえませんか?

山口
yamaguch
 
記事: 482
登録日時: 2010年7月06日(火) 17:37

Re: 2つスイッチ&サーボ→5つスイッチ&サーボへ

投稿記事by nas.iron » 2014年7月11日(金) 11:23

山口さん
ご丁寧にありがとうございます。
スイッチが押されている間は90度を保ち、話すと0度になります。
2つのスイッチはそれぞれ別々なタイミングで動作します。
そのスイッチとサーボのペアの数を5つにしたいと考えています。
よろしくお願いいたします。
nas.iron
 
記事: 8
登録日時: 2014年7月10日(木) 20:45

Re: 2つスイッチ&サーボ→5つスイッチ&サーボへ

投稿記事by yamaguch » 2014年7月11日(金) 16:02

nas.iron さん、

サーボは Servo クラスを使うと簡単に制御できます。
ピン2 にサーボを、ピン7にスイッチをつないだ場合だとこんな感じです。

コード: 全て選択
#include <Servo.h>

Servo servo;

void setup() {
    servo.attach(2);
    pinMode(7, INPUT_PULLUP);
}

void loop() {
    servo.write(digitalRead(7) == LOW ? 90 : 0);
    delay(10);
}


それから、ピン0, ピン1 はパソコンとにシリアル通信で使用するので、スイッチやサーボの接続にはピン2 以降を使うのがいいと思います。

山口
yamaguch
 
記事: 482
登録日時: 2010年7月06日(火) 17:37

Re: 2つスイッチ&サーボ→5つスイッチ&サーボへ

投稿記事by nas.iron » 2014年7月11日(金) 17:31

山口さん ピン1ピン2についてご指摘ありがとうございます。
2つのサーボについては、既に可動を確認できていまして、3つや、一応最終的には5つのサーボとスイッチを個々に制御したいと考えております。
山口さん、3つ以上の場合についてもご指南お願い致します。
nas.iron
 
記事: 8
登録日時: 2014年7月10日(木) 20:45

Re: 2つスイッチ&サーボ→5つスイッチ&サーボへ

投稿記事by yamaguch » 2014年7月12日(土) 01:04

nas.iron さん、

山口さん、3つ以上の場合についてもご指南お願い致します。


動いた時の感動を奪いたくなかったのですが... :roll:

先のスケッチは1個の場合です。
2個の場合は、サーボの変数を servo2, servo3 とすると

コード: 全て選択
#include <Servo.h>

Servo servo2, servo3;

void setup() {
    servo2.attach(2);
    servo3.attach(3);
    pinMode(7, INPUT_PULLUP);
    pinMode(8, INPUT_PULLUP);
}

void loop() {
    servo2.write(digitalRead(7) == LOW ? 90 : 0);
    servo3.write(digitalRead(8) == LOW ? 90 : 0);
    delay(10);
}


3 つ以上も同様です。配列を使うと少し短くなります。

山口
yamaguch
 
記事: 482
登録日時: 2010年7月06日(火) 17:37

Re: 2つスイッチ&サーボ→5つスイッチ&サーボへ

投稿記事by nas.iron » 2014年7月12日(土) 01:47

山口さん 涙が出そうになりました。。。

かなり頑張って、サーボライブラリを使って随分簡単に処理ができることはわかってきてました。
ですがこんなまとまって書けるとは・・・

特に、servo2.write(digitalRead(7) == LOW このあと
の書式・・不慣れで、初めて見たまとめ方です。
本当にありがとうございました。
nas.iron
 
記事: 8
登録日時: 2014年7月10日(木) 20:45

個別設定した複数サーボのスピード調整

投稿記事by nas.iron » 2014年7月14日(月) 00:47

山口さん 皆様 先日は1つ解決頂きありがとうございました。
複数サーボの同時制御・・・角度指定は、servoライブラリでも、パルス派を20msで並べるやり方もマスターできました。
しかし、また壁に当たってしまいました。

それは複数サーボのスピードの調整です。

単独のサーボであれば、for文の中で、delay()を使いながら、パルス波の長さをだんだん増やしたり減らしたりしていく事で実現はできました。
しかし、複数サーボで、それぞれの「基本角」「目標角」「速度」を設定して、それぞれを同時に動かすのはとても難しく、困っております。

よいアイデアがあれば教えて頂ければと思います。
ちなみに、パルス派でサーボを複数制御するコードを載せます。(自作なので見づらいかもしれません)

よろしくお願い致します。

int out1 = 2; //サーボ1=2PIN
int out2 = 3; //サーボ2=3PIN
int in1 = 8; //ポイント1スイッチ=8PIN
int in2 = 9; //ポイント2スイッチ=9PIN

int s1off = 600; //サーボ1のOFF位置設定
int s1on = 1500; //サーボ1のON位置設定
int s2off = 1500; //サーボ2のOFF位置設定
int s2on = 2100; //サーボ2のON位置設定

void setup(){
//パルス出力ピンの設定
pinMode(out1,OUTPUT);
pinMode(out2,OUTPUT);
// デジタル入力のプルアップ抵抗を有効にする
pinMode(in1, INPUT_PULLUP);
pinMode(in2, INPUT_PULLUP);
int s1cnt;
int s2cnt;
}

void loop(){
//パルス:LOWを出力 4000Microseconda/1サーボごとにタイミング
digitalWrite(out1,LOW);
digitalWrite(out2,LOW);

if (digitalRead(in1)==HIGH){ //1番ピンのスイッチ押された時の動作 こちらはスピード調整を導入(未完)
static int s1cnt = s1off; //パルス波を段々変化させるために使用するcnt変数にoff時の波を代入
if(s1cnt<s1on){目標のs1on角に満たないとき
digitalWrite(out1,HIGH);
delayMicroseconds(s1cnt); //cnt変数分波をつくる
digitalWrite(out1,LOW);
delayMicroseconds(4000-s1cnt); //動いた残りをディレイ
s1cnt=s1cnt+1; //波長を1長くする・・・ここが速過ぎて効果無し。
}
}
else { //1番ピンのスイッチ押されていない時の波(s1off分)を生成
digitalWrite(out1,HIGH);
delayMicroseconds(s1off);
digitalWrite(out1,LOW);
delayMicroseconds(4000-s1off);
}
if (digitalRead(in2)==HIGH){ //2番ピンの動作 こちらは通常のパルス波生成
digitalWrite(out2,HIGH);
delayMicroseconds(s2on);
digitalWrite(out2,LOW);
delayMicroseconds(4000-s2on);
}
else {
digitalWrite(out2,HIGH);
delayMicroseconds(s2off);
digitalWrite(out2,LOW);
delayMicroseconds(4000-s2off);
}
delayMicroseconds(12000);//2つのサーボ合計8000microsecondsなので残り12000
}
nas.iron
 
記事: 8
登録日時: 2014年7月10日(木) 20:45

Re: 2つスイッチ&サーボ→5つスイッチ&サーボへ

投稿記事by yamaguch » 2014年7月14日(月) 11:01

こんにちは、

別の問題ですね。
こういう時は、新しいトピックにした方がいいですよ。
どんな問題なのかがよくわかるようなトピックにしてください。

山口
yamaguch
 
記事: 482
登録日時: 2010年7月06日(火) 17:37

Re: 2つスイッチ&サーボ→5つスイッチ&サーボへ

投稿記事by nas.iron » 2014年7月14日(月) 12:14

山口さん ご指摘ありがとうございました。
別で立てさせて頂きますね。
nas.iron
 
記事: 8
登録日時: 2014年7月10日(木) 20:45


Return to Arduino 質問箱

cron