Changes between Version 1 and Version 2 of super-directional-speaker


Ignore:
Timestamp:
Apr 14, 2015 5:01:30 PM (9 years ago)
Author:
rumi
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • super-directional-speaker

    v1 v2  
    11== Making the direction of super directional speaker remotely adjustable ==
    22
     3サーボモーターを使って動かせる[https://www.switch-science.com/catalog/1842/ 超指向性超音波スピーカーキット]の土台を作ってみました。[[BR]]
     4
     5超音波スピーカーの展示を行ったところ、スピーカーを固定してしまうと設置角度によって音が聞こえる人と聞こえない人が出てしまいした。[[BR]]
     6それが超音波スピーカーの特性なので、聞こえる人と聞こえない人が出て当然なのですが、音が出ていることに気が付いてもらえないと話しにならないので、[[BR]]
     7スピーカーの向きを変えられるようにしました。[[BR]]
     8
     9I made a base with servo motors for[https://international.switch-science.com/catalog/1842/ the super directional speaker] to make the speaker face different directions.Some of you may have seen it at our booth during the Maker Faire Tokyo 2014.[[BR]]
     10
     11We actually brought this speaker to the MFT2013, but it was not clear to the visitors how this speaker was super directional. Super directional ultrasonic speaker sends the sound only straight out, meaning you can hear the audio only if you are right in front of the speaker. To feel this effect clearly, I made the remote controlled base so that the speaker can face different directions.[[BR]
     12
     13[[Image(s-SDspeaker.jpg)]]
     14
     15筐体はSDプリンタで出力しました。使用したフィラメント素材はABSです。
     16
     17使用した部品のリストです。(スイッチサイエンスで入手可能なものにはリンクがあります。)
     18 * [https://www.switch-science.com/catalog/1842/ 超指向性超音波スピーカーキット] x 1セット
     19 * [https://www.switch-science.com/catalog/1234/ Arduino Esplora] x 1個
     20 * [https://www.switch-science.com/catalog/946/ Arduino Pro Mini 328 5V 16MHz] x 1個
     21 * OKL-T/6-W12N-C使用 小型高効率DCDCコンバータ可変電源キット(降圧) x 1個
     22 * ユニバーサル基板(C基板) x 1枚
     23 * サーボモータ FUTABA S3003 x 2個
     24 * ステレオミニジャック(パネル取り付けタイプ) x 2個
     25 * ステレオミニプラグ(ケーブル付き) x 2本
     26 * DCジャック(2.1mm パネル用)
     27 * DCプラグ(2.1mm ケーブル付き) x 1本
     28 * 滑り止めゴムシート x 4枚
     29 * カグスベール x 1枚
     30 * フランジブッシュ(80F-1003) x 1個
     31 * プラネジ (M3x15) x 7本
     32 * プラナット M3 x 7個
     33 * 皿ネジ(M2x10) x 8本
     34 * ナベネジ(M2x8) x 4本
     35 * ナベネジ(M3x8) x 6本
     36 * 電源用ケーブル(赤黒) 数十センチ分
     37 * 通信用ケーブル(赤黒白) 数十センチ分
     38 * 3pin コネクタ x 2個
     39 * 3pin ピンヘッダ x 3個
     40 * スズメッキ線
     41 * ABSボンド
     42
     43まず最初に超音波スピーカーをとめるための固定板を3Dプリンタで出力しました。
     44
     45[[Image(s-SD_speaker.jpg)]]
     46[[Image(s-SD_speaker2.jpg)]]
     47
     483Dプリンタのフィラメント消費を抑えるために2枚に分けて出力して、それぞれをABSボンドで接着しました。[[BR]]
     49
     50[[Image(s-SD_speaker10.jpg)]]
     51
     52サーボモータと超音波スピーカーとアンプを板に取り付けます。
     53
     54[[Image(s-SD_speaker3.jpg)]]
     55[[Image(s-SD_speaker9.jpg)]]
     56
     57スピーカーの支えを作り、サーボホーンとフランジブッシュを取り付けます。[[BR]]
     58底面にはカグスベールをはって、サーボホーンを取り付けました。
     59
     60[[Image(s-SD_speaker8.jpg)]]
     61
     62[[Image(s-SD_speaker4.jpg)]]
     63[[Image(s-SD_speaker11.jpg)]]
     64
     65土台にもサーボを取り付けます。[[BR]]
     66
     67
     68組み立てるとこのようになります。
     69
     70[[Image(s-SD_speaker5.jpg)]]
     71[[Image(s-s-SD_speaker7.jpg)]]
     72
     73土台の中身です。[[BR]]
     74超音波スピーカーの電源電圧はDC12Vです。Arduino Pro Miniとサーボモータは5Vで動作させるので12Vから5Vを作るためのDCDCコンバータを搭載しています。[[BR]]
     75[[Image(s-SDspeaker2_.jpg)]]
     76
     77
     78写真の上部にある2つのコネクタがDCジャックとステレオミニジャックです。DCジャックにはDC12Vを入力して、超音波スピーカーのアンプ基板とDCDCコンバータに電源を供給します。[[BR]]
     79ステレオミニジャックはそのまま超音波スピーカーのアンプ基板の信号入力に接続されています。[[BR]]
     80写真の下部にあるステレオミニジャックはArduino Esploraとの通信用に使いました。[[BR]]
     81
     82
     83== スケッチ ==
     84
     85ArduinoEsploraからのコマンドをArduinoProMiniで受け取ってサーボモータを動かしています。[[BR]]
     86Esploraのスライダの位置でジョイスティックで動かすモードと加速度センサで動かすモードを切り替えられるようにしました。[[BR]]
     87
     88=== Arduino Pro Mini用 ===
     89{{{
     90#include <Servo.h>
     91Servo myservo[2];
     92char rcvData = 0;
     93int servo_angle[2];
     94void setup()
     95{
     96    myservo[0].attach(3);
     97    myservo[1].attach(7);
     98    Serial.begin(9600);
     99    myservo[0].write(90);
     100    myservo[1].write(90);
     101}
     102
     103void loop()
     104{
     105    servo_angle[0] = 0;
     106    servo_angle[1] = 0;
     107    if(Serial.available() > 0){
     108        rcvData = Serial.read();
     109        if(rcvData == 'x'){
     110            while(!Serial.available()){}
     111            rcvData = Serial.read() - '0';
     112            servo_angle[0] = rcvData * 100;
     113            while(!Serial.available()){}
     114            rcvData = Serial.read() - '0';
     115            servo_angle[0] += rcvData * 10;
     116            while(!Serial.available()){}
     117            rcvData = Serial.read() - '0';
     118            servo_angle[0] += rcvData;
     119           
     120            if(servo_angle[0] >= 0 && servo_angle[0] <= 180){
     121                myservo[0].write(servo_angle[0]);
     122                Serial.print("SERVO X ");
     123                Serial.print(servo_angle[0]);   
     124            }
     125        }
     126        else if(rcvData == 'y'){
     127            while(!Serial.available()){}
     128            rcvData = Serial.read() - '0';
     129            servo_angle[1] = rcvData * 100;
     130            while(!Serial.available()){}
     131            rcvData = Serial.read() - '0';
     132            servo_angle[1] += rcvData * 10;
     133            while(!Serial.available()){}
     134            rcvData = Serial.read() - '0';
     135            servo_angle[1] += rcvData;
     136           
     137            if(servo_angle[1] >= 0 && servo_angle[1] <= 180){
     138                myservo[1].write(servo_angle[1]);
     139                Serial.print("SERVO Y ");
     140                Serial.println(servo_angle[1]);
     141            }
     142        }   
     143    }
     144}
     145
     146}}}
     147
     148
     149=== Arduino Esplora用 ===
     150{{{
     151#include <Esplora.h>
     152#include <SoftwareSerial.h>
     153
     154SoftwareSerial mySerial(11,3);
     155
     156unsigned long x_angle = 90;
     157unsigned long y_angle = 90;
     158int x_stick = 90;
     159int y_stick = 90;
     160int x_trim = 20;
     161int y_trim = 0;
     162double x_temp = 0.0;
     163double y_temp = 0.0;
     164int x_stick2 = 90;
     165int y_stick2 = 90;
     166int x_demo = 90;
     167int y_demo = 90;
     168int add = 1;
     169int demo_speed = 100;
     170void setup()
     171{
     172    Serial.begin(9600);
     173    mySerial.begin(9600);
     174}
     175
     176void loop()
     177{
     178    int i = 0;
     179   
     180    int x_axis = Esplora.readAccelerometer(X_AXIS);
     181    int y_axis = Esplora.readAccelerometer(Y_AXIS);
     182    int value = Esplora.readSlider();
     183    int x_joy = Esplora.readJoystickX();
     184    int y_joy = Esplora.readJoystickY();
     185    int uButton = Esplora.readButton(SWITCH_UP);
     186    int dButton = Esplora.readButton(SWITCH_DOWN);
     187    int rButton = Esplora.readButton(SWITCH_RIGHT);
     188    int lButton = Esplora.readButton(SWITCH_LEFT);
     189
     190    if(value > 812){
     191   
     192        x_axis = map(x_axis, -180,180,0,180);
     193        y_axis = map(y_axis, -180,180,0,180);
     194   
     195        x_angle = (x_angle * 3 + x_axis) / 4;
     196        y_angle = (y_angle * 3 + y_axis) / 4;
     197               
     198   
     199        Serial.print("x");
     200        if(x_angle < 10){
     201            Serial.print("00");
     202            Serial.print(x_angle);
     203        }
     204        else if(x_angle < 100){
     205            Serial.print("0");
     206            Serial.print(x_angle);   
     207        }
     208        else{
     209            Serial.print(x_angle);   
     210        }
     211        Serial.print("y");
     212        if(y_angle < 10){
     213            Serial.print("00");
     214            Serial.println(y_angle);
     215        }
     216        else if(y_angle < 100){
     217            Serial.print("0");
     218            Serial.println(y_angle);   
     219        }
     220        else{
     221            Serial.println(y_angle);   
     222        }
     223   
     224        mySerial.print("x");
     225        if(x_angle < 10){
     226            mySerial.print("00");
     227            mySerial.print(x_angle);
     228        }
     229        else if(x_angle < 100){
     230            mySerial.print("0");
     231            mySerial.print(x_angle);   
     232        }
     233        else{
     234            mySerial.print(x_angle);   
     235        }
     236        mySerial.print(",");
     237   
     238   
     239        mySerial.print("y");
     240       
     241        if(y_angle < 10){
     242            mySerial.print("00");
     243            mySerial.println(y_angle);
     244        }
     245        else if(y_angle < 100){
     246            mySerial.print("0");
     247            mySerial.println(y_angle);   
     248        }
     249        else{
     250            mySerial.println(y_angle);   
     251        }
     252        mySerial.print(",");
     253        delay(20);
     254    }
     255   
     256   
     257    else if(value < 212){
     258        x_joy = map(x_joy,-512,511,180,0);
     259        y_joy = map(y_joy,-512,511,180,0);
     260        x_stick = (x_stick * 3 + x_joy)/4;
     261        y_stick = (y_stick * 3 + y_joy)/4;
     262       
     263        if(x_stick > 85 && x_stick < 95) x_stick = 90;
     264        if(y_stick > 85 && y_stick < 95) y_stick = 90;
     265       
     266        x_temp = x_temp + (x_stick - 90) / 50.0;
     267        y_temp = y_temp + (y_stick - 90) / 50.0;
     268       
     269        if((x_temp + 90) >= 180) x_temp = 90.0;
     270        else if((x_temp + 90) <= 0) x_temp = -90.0;
     271        if((y_temp + 90) >= 180) y_temp = 90.0;
     272        else if((y_temp + 90) <= 0) y_temp = -90.0;
     273       
     274        x_stick2 = x_temp + 90;
     275        y_stick2 = y_temp + 90;               
     276       
     277        mySerial.print("x");
     278        Serial.print("x");
     279        if(x_stick2 < 10){
     280            mySerial.print("00");
     281            mySerial.print(x_stick2);
     282            Serial.print("00");
     283            Serial.print(x_stick2);
     284        }
     285        else if(x_stick2 < 100){
     286            mySerial.print("0");
     287            mySerial.print(x_stick2); 
     288            Serial.print("0");
     289            Serial.print(x_stick2); 
     290        }
     291        else{
     292            mySerial.print(x_stick2);
     293            Serial.print(x_stick2); 
     294        }
     295        mySerial.print("y");
     296        Serial.print("y");
     297        if(y_stick2 < 10){
     298            mySerial.print("00");
     299            mySerial.println(y_stick2);
     300            Serial.print("00");
     301            Serial.println(y_stick2);
     302        }
     303        else if(y_stick2 < 100){
     304            mySerial.print("0");
     305            mySerial.println(y_stick2);
     306            Serial.print("0");
     307            Serial.println(y_stick2);
     308        }
     309        else{
     310            mySerial.println(y_stick2);
     311            Serial.println(y_stick2);
     312        }
     313        delay(20);       
     314       
     315    }
     316   
     317    else{
     318        if(x_demo >= 150) add = -1;
     319        else if(x_demo <= 50) add = 1;
     320       
     321        x_demo += add;
     322        delay(demo_speed);
     323
     324        if(uButton == LOW){
     325            while(1){
     326                uButton = Esplora.readButton(SWITCH_UP);
     327                if(uButton == HIGH) break;
     328            }
     329            y_demo += 5;
     330            if(y_demo >= 180) y_demo = 180;   
     331        }
     332        if(dButton == LOW){
     333            while(1){
     334                dButton = Esplora.readButton(SWITCH_DOWN);
     335                if(dButton == HIGH) break;
     336            }
     337            y_demo -= 5;
     338            if(y_demo <= 0) y_demo = 0;   
     339        }
     340        if(rButton == LOW){
     341            while(1){
     342                rButton = Esplora.readButton(SWITCH_RIGHT);
     343                if(rButton == HIGH) break;
     344            }
     345            demo_speed += 10;
     346            if(demo_speed >= 200) demo_speed = 200;
     347               
     348        }
     349        if(lButton == LOW){
     350            while(1){
     351                lButton = Esplora.readButton(SWITCH_LEFT);
     352                if(lButton == HIGH) break;
     353            }
     354            demo_speed -= 10;
     355            if(demo_speed <= 20) demo_speed = 20;
     356        }
     357        mySerial.print("x");
     358        Serial.print("x");
     359        if(x_demo < 10){
     360            mySerial.print("00");
     361            mySerial.print(x_demo);
     362            Serial.print("00");
     363            Serial.print(x_demo);
     364           
     365        }
     366        else if(x_demo < 100){
     367            mySerial.print("0");
     368            mySerial.print(x_demo);   
     369            Serial.print("0");
     370            Serial.print(x_demo);
     371        }
     372        else{
     373            mySerial.print(x_demo);
     374            Serial.print(x_demo);
     375        }
     376        mySerial.print("y");
     377        Serial.print("y");
     378        if(y_demo < 10){
     379            mySerial.print("00");
     380            mySerial.println(y_demo);
     381            Serial.print("00");
     382            Serial.println(y_demo);
     383        }
     384        else if(y_demo < 100){
     385            mySerial.print("0");
     386            mySerial.println(y_demo);
     387            Serial.print("0");
     388            Serial.println(y_demo);
     389        }
     390        else{
     391            mySerial.println(y_demo);
     392            Serial.println(y_demo);
     393        }
     394        delay(20);     
     395    }
     396}
     397}}}
     398
     399
     400=== STLファイル ===
     401[http://doc.switch-science.com/mft2014/SD_speaker1.stl SD_speaker1.stl]
     402[http://doc.switch-science.com/mft2014/SD_speaker2.stl SD_speaker2.stl]
     403[http://doc.switch-science.com/mft2014/SD_speaker3.stl SD_speaker3.stl]
     404[http://doc.switch-science.com/mft2014/SD_speaker1.stl SD_speaker4.stl]