
###前提・実現したいこと
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個を動かすことは別々にできましたが、組み合わせるとサーボの動きが不安定になる問題が発生しています。音の制御はできているようです。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/10 10:56
退会済みユーザー
2017/07/11 02:38