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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

make

make は、ビルド作業を自動化するツールです。さまざまなファイルの最終変更時刻を比較し、従属するファイルよりも「ターゲット」のファイルが古いことがわかったときユーザーが設定していた命令を実行する事が可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Arduino

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

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

2回答

4173閲覧

ProcessingからArduinoのサーボ2個とスピーカ1個を制御するのに混線してサーボの動きが不安定

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

make

make は、ビルド作業を自動化するツールです。さまざまなファイルの最終変更時刻を比較し、従属するファイルよりも「ターゲット」のファイルが古いことがわかったときユーザーが設定していた命令を実行する事が可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Arduino

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

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2017/07/07 15:06

編集2017/07/08 23:50

###前提・実現したいこと
Processingで数字の図形にカーソルが触れると、色が変わります。そして、Arduino側ではその数字と色に応じた音が鳴り、Processing上のカーソル位置に応じてサーボがロボットアームのように動くシステムです。

サーボモータはSG90を2個使っています。
SG90秋月電子
圧電スピーカはPKM13EPYH4000-A0を1個使っています。
圧電スピーカ秋月電子

###発生している問題・エラーメッセージ
下記のコードをArduinoに書き込み、Processingを立ち上げて操作しようとすると、サーボがスムーズに動かず、何か混線しているようです。念のため、ブレッドボードの回路図も上げておきます。

現状のサーボの動き
イメージ説明

###該当のソースコード

Processing

1import processing.serial.*; 2 3int spos=90; 4int wpos=90; 5 6Serial port; // The serial port 7ArrayList<MyShape> shapes = new ArrayList<MyShape>(); 8 9void setup() { 10 size(720, 720); 11 background(125); 12 frameRate(100); 13 14 println(Serial.list()); // List COM-ports 15 16 //select second com-port from the list 17 port = new Serial(this, Serial.list()[1], 9600); 18 19 //図形1を描く 20 MyShape ichi; 21 ichi = new MyRect(70, 140, 32, 200); 22 ichi.selectedFill = #CE2828; 23 shapes.add(ichi); 24 25 //図形2を描く 26 MyShape ni; 27 ni = new MyRect(170, 150, 100, 32); 28 ni.selectedFill = #1318F0; 29 shapes.add(ni); 30 ni = new MyRect(238, 182, 32, 43); 31 ni.selectedFill = #1318F0; 32 shapes.add(ni); 33 ni = new MyRect(170, 225, 100, 32); 34 ni.selectedFill = #1318F0; 35 shapes.add(ni); 36 ni = new MyRect(170, 257, 32, 43); 37 ni.selectedFill = #1318F0; 38 shapes.add(ni); 39 ni = new MyRect(170, 300, 100, 32); 40 ni.selectedFill = #1318F0; 41 shapes.add(ni); 42} 43 44void draw() { 45 update(mouseX, mouseY); 46 rect (310, 310, 100, 100); 47 line(360, 0, 360, 720); 48 line(0, 360, 720, 360); 49 noStroke(); 50 51 background(102); 52 for (MyShape shape : shapes) { 53 if (shape.contains(mouseX, mouseY)) { 54 fill(shape.selectedFill); 55 port.write('a'); 56 } else { 57 fill(204); 58 port.write('b'); 59 } 60 shape.draw(); 61 } 62} 63 64void update(int x, int y) 65{ 66 //Calculate servo1 postion from mouseX 67 spos= x/4; 68 69 //Output the servo1 position ( from 0 to 180) 70 port.write("s"+spos); 71 72 //Calculate servo2 postion from mouseY 73 wpos= (y/4)-10; 74 75 //Output the servo2 position ( from 0 to 180) 76 port.write("w"+wpos); 77} 78 79// 任意の図形を表す抽象クラス 80abstract class MyShape { 81 int selectedFill; 82 // 画面上へこの図形を描画するメソッド 83 abstract void draw(); 84 85 // 指定位置がこの図形に含まれるかどうか判定するメソッド 86 abstract boolean contains(float x, float y); 87} 88 89// 長方形を表すクラス 90class MyRect extends MyShape { 91 float x, y, w, h; 92 93 MyRect(float x, float y, float w, float h) { 94 this.x = x; 95 this.y = y; 96 this.w = w; 97 this.h = h; 98 } 99 100 void draw() { 101 rect(x, y, w, h); 102 } 103 104 boolean contains(float mx, float my) { 105 return mx >= x && mx <= (x + w) && my >= y && my <= (y + h); 106 } 107}

Arduino

1//servo 2#include <Servo.h> 3Servo servo1; Servo servo2; 4 5//sound 6int melo = 200; //音の長さを指定 7#define PIN 13 //ブザーを接続したピン番号 8 9 10void setup() { 11 12 pinMode(1, OUTPUT); 13 servo1.attach(10); 14 servo2.attach(9); 15 Serial.begin(9600); 16 17} 18 19void loop() { 20 //servo 21 static int v = 0; 22 23 if ( Serial.available()) { 24 char ch = Serial.read(); 25 26 switch (ch) { 27 case '0'...'9': 28 v = v * 10 + ch - '0'; 29 break; 30 case 'w': 31 servo1.write(v); 32 v = 0; 33 break; 34 case 's': 35 servo2.write(v); 36 v = 0; 37 break; 38 } 39 } 40 41 //sound 42 if (Serial.available() > 0) { 43 int data = Serial.read(); 44 //1 45 if (data == 'a') { 46 //図形1にカーソルが来たらドを鳴らす 47 tone(PIN, 262, 600); 48 delay(300); 49 } else if (data == 'b') { //何も鳴らさない 50 } 51 52 //2 53 else if (data == 'c') { 54 //図形2にカーソルが来たらソを鳴らす 55 tone(PIN, 392, 300); 56 delay(300); 57 } else if (data == 'd') { //何も鳴らさない 58 } 59 } 60} 61

###試したこと
上記の回路のまま、スピーカを鳴らすこととサーボ2個を動かすことは別々にできましたが、組み合わせるとサーボの動きが不安定になる問題が発生しています。音の制御はできているようです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

c++

1if ( Serial.available()) { 2 ... = Serial.read(); 3 ...//サーボ 4} 5if ( Serial.available()) { 6 ... = Serial.read(); 7 ...//ブザー 8} 9

となってますが、これだと複数文字からなる電文を送ったとき、1文字ごとに処理が捨てられます。
例えばサーボの方のifが終わったタイミングで、サーボへの指示"w12"を受信すると
ブザーでread()して、'w'が捨てられてしまいます。
次にサーボでread()して'1'を処理し、
次にブザーでread()して'2'が捨てられます

c++

1if ( Serial.available()) { 2 ... = Serial.read(); 3 ...//サーボ 4 ...//ブザー 5} 6

こうしましょう。

投稿2017/07/10 06:53

編集2017/07/10 07:01
ozwk

総合スコア13521

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

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

MasahikoHirata

2017/07/10 10:56

ozwk殿、的確なご回答に感服します。 仕事が数か月前から多忙でソースをじっくり解析できませんでした。 // // // arduinoの質問をされる方に参考に成ると考え、コメントしています。 まず何かの’マネ’をして動作を考え、それと異なる動きの場合は、切り分けて確認をしていきます。 本件の場合も同様で、思い込みが一番ミスを呼びます。 1つ1つを丁寧に動作確認。 processing以前に通信の可否を判断するためにシリアルモニターから送りたい文字列などをarduinoに送信。どのように処理したかを'可視化'するために'どこまで動いて、またどんなデータを受け取った'が分かるように返信します。これにより内部の動きが鮮明に見えてきます。 いきなり’絶対動くはず’は技術者経験で数少ないものです。 ’自分は絶対間違ってる。どこが間違っているかを知りたい’。 これが一番の勉強方法になります。 ozwk殿の回答をお借りして失礼しました。
退会済みユーザー

退会済みユーザー

2017/07/11 02:38

ご回答ありがとうございました。大変勉強になりました。
guest

0

写真のみでは結線の正誤は確認できませんが、気になるのはサーボ×2とブザーでの消費電力はいくら位ですか?それとポート13の使用については経験から起動時になぜかSetup()以前に信号が出力されています。これからsetup()の動作中に消費電力(突入電流)により不安定になる事が判明しています。
まずは全体の配線図が知りたいです。

投稿2017/07/08 14:07

MasahikoHirata

総合スコア3747

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

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

退会済みユーザー

退会済みユーザー

2017/07/08 14:56

コメントありがとうございます。回路図をアップロードさせていただきました。ポート12でも試してみましたが、やはり、サーボの動きが不安定でした。
退会済みユーザー

退会済みユーザー

2017/07/08 15:06

知識経験不足で消費電力はわからないので、各備品の秋月電子のページを追記しました。
退会済みユーザー

退会済みユーザー

2017/07/08 23:04

アドバイスありがとうございます。外部電源から供給してみても、状況は変わりませんでした。追加で現状の動画をアップしたので、確認いただけますと幸いです。
退会済みユーザー

退会済みユーザー

2017/07/09 00:04

あと、もう1つ懸念があるのはProcessingを立ち上げるとサーボの動きがおかしくなるのでシリアル通信で問題が起きている可能性もあると思いました。Arduinoにコードを書き込んだだけでは問題は起きていません。 Processingから位置をArduinoのサーボ2つへ送信 Processingからカーソルが図形に触れたかどうかをArduinoに送信 この2つを同時にやっているので、通信もビジーかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問