日記一覧
当サイトに登録されている日記一覧
まずは現物から
- LPC1114FN28とFT232RL USB/serialコンバーターで、シリアル通信+サーボモーターを回してみる。 以下、準備から実際のプログラムソースまでメモっておきます。
まず頭に入れてくべきこと
- mbedオフィシャルサイト 全てはここから始まる。
- mbedとは:Wikiedia
- mbed と Arduino の違い
準備したもの
- mbed対応のマイコン。今回は、LPC1114FN28 を、秋月電子で購入。 1個たったの120円!(税込)
- USB-シリアル変換モジュール FT232RL 秋月で購入。
- Arduinoスターターキット SGK-ARD-KIT 千石電商で購入 arduino uno 付きで4,940円。 arduino unoの他に付属のセット品が色々入っていて、初めてには良いですね。 arduinoからいじり始めてみたものの、mbedを教えていただいたら断然そちらが面白くなってます。
配線
- 参考
- mbed LPC1114でLチカしてみた(1):しなぷすのハード製作記
マイコンとFT232RLの接続が参考になります。 プログラムを書き込んだあとリセットしなくても済みます。 なお、書き込みソフトはこのページの要領ではなく、LPC1114限定で下記ページのものが使いやすいです。 - mbed LPC1114でLチカしてみた(2):しなぷすのハード製作記
LPC1114限定で「LPCISP」というソフトを公開しておられます。USB/serialコンバーター経由で一発書き込み、即座にリセットが働くので、楽ちんです。
- mbed LPC1114でLチカしてみた(1):しなぷすのハード製作記
- ハード図
ブレッドボードを使うとテストは楽にできるけど、一度バラしたら再現するのが面倒になっちゃいますんで、ちゃんと図面を書くクセをつけたいですね。今回は資料への使いまわしがしやすいようにEXCELでこんな感じで書いてみました。- LPC1114のLED回路はソース出力(PNP)でプラスコモン、FT232RLのLEDモニタ回路は、シンク出力(NPN)でマイナスコモンになっているみたいで、ちょっと混乱します。
工業用制御部品に関していえば、日本国内やアジア圏ではシンク(NPN)でマイナスコモン、欧州ではソース出力(PNP)でプラスコモン が多いですが、欧州への輸出時にはCEマーク表示の関係で本質安全の考え方から必ずPNPにしないといけなくなるため、国内でもPNPへの変更が徐々に進んでいる・・ のかなあ?
組み込み部品での状況は全くわからずです。
- LPC1114のLED回路はソース出力(PNP)でプラスコモン、FT232RLのLEDモニタ回路は、シンク出力(NPN)でマイナスコモンになっているみたいで、ちょっと混乱します。
プログラム
mbedはarduinoと違い、ほぼ素のC/C++で書けます。 オンラインコンパイラでビルドが通ったプロジェクトをエクスポートして、外部のIDEで編集・コンパイルできることからもそれを実感できます。
とはいえまずはオンラインコンパイラで。
![]() |
使用ライブラリ
- Servo
mbedのオンラインコンパイラ上の「Import」でキーワード「Servo」で検索し、sford cstyles さんの mbed R/C Servo Libraryを試しに使ってみました。 - MySerial
自作ライブラリ MySerial です。mbed標準のRawSerialクラスを継承し、受信文字列のchar配列格納を簡単にできるようにしてみました。 現時点でのソースを貼っておきます。- GetString メソッドは、テンプレート化でオーバーロードしてあり、引数にポインタ変数指定でも char配列指定の参照でも使えるようにしました。
- Wait時間の設定を追加してあります。
その他APIは、こちらを参照。
- MySerial.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
- | | | | | | | | | ! - | | | | | | | | | | | | | | | | | | | | | ! - | | - | | | ! | | - | | | ! | | - | | | | ! | | - | | | | ! | - | ! | | | | | !
/** mbed Serial Library extend RawSerial * Copyright (c) 2014 Naoki Okino * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #ifndef MBED_MYSERIAL_H #define MBED_MYSERIAL_H #include "mbed.h" /** MySerial control class, based on a RawSerial * * Example: * @code * #include "mbed.h" * #include "MySerial.h" * * MySerial pc(USBTX,USBRX); //instance of MySerial Class * char cWord[16]; //receive chars or cWord[256], cWord[1024] etc.. * * void readbuf() * { * // int iRtn = pc.GetString(6,&cWord); //Serial received chars by pointer cWord * int iRtn = pc.GetString(6,cWord); //Serial received chars byref of cWord * } * int main() { * pc.baud(9600); //set baud rate * pc.format(8, MySerial::None, 1);//set bits for a byte, parity bit, stop bit * pc.SetRxWait(0.01, 0.001); //set wait getting chars after interrupted, each char * pc.attach( readbuf, MySerial::RxIrq ); //Set Interrupt by Serial receive * } * @endcode */ class MySerial : public RawSerial{ public: /** constructor to get chars received by serial * * @param PinName tx * @param PinName rx */ MySerial(PinName tx, PinName rx); /** set wait getting chars after interrupted * * @param float _fRxStartWait wait getting a 1st char after interrupted * @param float _fRxEachWait wait getting each char */ void SetRxWait(float _fRxStartWait, float _fRxEachWait); /** function to get chars after received chars by serial * * @param int size for get chars * @param *cWord returns got chars by pointer * @param returns success by 0 */ virtual int GetString(int size, char *cWord); /** overload function to get chars after received chars by serial * * @param int size for get chars * @param cWord returns got chars by ref * @param returns success by 0 */ template <class X> int GetString(int size, X cWord) { return GetString(size, &cWord); } protected: float fRxStartWait; float fRxEachWait; }; /* class MySerial */ #endif
- MySerial.h
- MySerial.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
- | | ! - | | ! - | | | | | | - - | ! | - | - ! | | ! !
#include "MySerial.h" MySerial::MySerial(PinName tx,PinName rx):RawSerial(tx,rx) //constructor { fRxStartWait = 0.01; //wait getting a 1st char after interrupted fRxEachWait = 0.001; //wait getting each char } void MySerial::SetRxWait(float _fRxStartWait, float _fRxEachWait) { fRxStartWait = _fRxStartWait; //wait getting a 1st char after interrupted fRxEachWait = _fRxEachWait; //wait getting each char } int MySerial::GetString(int size, char *cWord) //by pointer { int i=0; int ichar; memset(cWord, '\0', strlen(cWord)); //initialise chars wait(fRxStartWait); while(1) { if(!readable()) { break; } ichar = getc(); if(i<size) { cWord[i] =ichar; //putc(ichar); } i++; wait(fRxEachWait); } return 0; }
- MySerial.cpp
メイン
- シリアルコマンド
ただの実験なので、<STX><ETX>などの制御コマンドは一切無しです。(汗)- 「start」で開始
- 「pxxx」(xxxは角度)で位置決め
- 「stop」で停止
です。
- 受信の割り込みと、50ms定時タイマ割り込みを受けてメインで動作及びLチカさせてみました。
- 割り込みのIRQ変数名は、シリアルが「UART_IRQn」、定時タイマが「TIMER_16_0_IRQn」でしたので、割り込み優先度や割り込み禁止を個別に管理できます。 この辺の定義は、こちらに全部書いてありますね。
- まだ試していませんが、フロー制御を入れないと9600bps以外では取りこぼしが発生します。
- ソース
volatile のつけ方などわかっていないので、まだ適当です。- main.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
- | | ! - - ! ! - | | - ! | - | | - | | - | | | - | ! - | | ! ! - | | - | ! | | | | | | | | | | - | | | - | | | ! | | - | - | | ! | - ! ! !
#include "mbed.h" #include "Servo.h" #include "MySerial.h" Servo myservo(dp18); MySerial pc(USBTX,USBRX); //instance of MySerial Class Ticker timer; DigitalOut led2(LED2); //alive check LED volatile int cntRx=0; volatile int cntRx_old=0; volatile int timeUp=0; volatile int timeUp_old=0; char cWord[6]; //receive chars or cWord[256], cWord[1024] etc.. char *pCword = cWord; //pointer for cword const char ccStart[6] = "start"; const char ccStop[5] = "stop"; const char ccMove_[2] = "p"; int readSize = 5; int doStatus; int iDeg; void atRx() { NVIC_DisableIRQ(UART_IRQn); cntRx++; } void atTimer() { //NVIC_DisableIRQ(TIMER_16_0_IRQn); timeUp++; } void readbuf() { pCword = cWord; //pointer for cword //int iRtn = pc.GetString( readSize, &cWord[0] ); //Serial received chars by pointer of cWord int iRtn = pc.GetString( readSize, cWord ); //Serial received chars byref of cWord if(strcmp(cWord, ccStart)==0) { // start doStatus=1; printf("started\n"); } else if(strcmp(cWord, ccStop)==0) { // stop doStatus=0; printf("stopped\n"); } else if(cWord[0]==ccMove_[0]) { // 1st char matches pCword++; // increment pointer to get after 2nd chars iDeg = atoi( pCword ); printf("%d\n",iDeg); } else { //no action except for start/stop printf(" no match %s\n" , cWord); } if ((doStatus == 1) && (0 <= iDeg) && (iDeg <= 180)) { wait(0.01); // waits for the servo to get there myservo.position(iDeg - 83.0); } } int main() { pc.baud(9600); //set baud rate pc.format(8, MySerial::Odd, 1);//set bits for a byte, parity bit, stop bit //pc.format(8, MySerial::None, 1);//set bits for a byte, parity bit, stop bit //pc.set_flow_control(MySerial::RTSCTS,dp26,dp25); pc.SetRxWait(0.01, 0.001); //set wait getting chars after interrupted, each char wait(0.25); //startup wait pc.attach( &atRx, MySerial::RxIrq ); //Set Interrupt by Serial receive NVIC_SetPriority(UART_IRQn, 120); timer.attach( &atTimer, 0.05 ); NVIC_SetPriority(TIMER_16_0_IRQn, 10); myservo.calibrate(/* range */ 0.00099, /* angle +/- */ 90.0); while(1) { wait(0.01); if(cntRx != cntRx_old) { readbuf(); cntRx_old = cntRx; NVIC_EnableIRQ(UART_IRQn); } if(timeUp != timeUp_old) { if( 10 <= timeUp ) { led2 = !led2; timeUp=0; } timeUp_old = timeUp; //NVIC_EnableIRQ(TIMER_16_0_IRQn); } } }
- main.cpp
タグ PC ハード
メインノートパソコンを更新しました!!
今まではレッツノートを借用させていただいてましたが、自分で買うにはまずは安くないと無理。
総額税込10万円未満、これ大事な要件ですね。 がたいがデカイのはガマンガマン。。
ってことで、ドスパラのCritea DX4 のwindows8.1のカスタム、8GB,COREi5-4210M 2.6GHz 。
LCDは1366x768 なのだが遠視にはこのほうが吉。自宅では外付けディスプレイ使うしね。
早速、手持ちの1GB 7200rpmのHGST製ハードディスクに換装。
ホントはSSDにしたいけど、痛い目にあったばかりだから当分はこれで我慢します。
...
先日のインピーダンス測定後、ダクトの再チューニングを行い、周波数特性と合わせて確定版として再測定しました。
ついでに、先日のインピーダンス特性がグラフ縦軸がLOGスケールではなくリニアスケールになっていたのに気づいたのでそれも修正。
また、周波数特性もARTAのデュアルチャンネルで測定し、Speaker Workshop にインポート、インピーダンス特性グラフと並べてみました。
中域の共鳴があり、ダクトからの漏れによってモロに干渉をうけていますね。何とも荒々しい特性です。(汗) オフ会は吸音材の増量もせずにこのまま行きます。
オフ会の配布資料を書きました。
昨日F特測定したのですが、どうもRchの低域の伸びが今一つのようで、7年ぶりにインピーダンス測定にトライしてみました。
使用ソフトは、「ARTA」に付属の「LIMP」です。 「Myspeaker」でもインピーダンス測定は可能なのですが、アンプを介して行うため、バランス出力のアンプは使えなかったり、接触不良などで抵抗が外れたりするとPCのマイク入力が壊れたりするので、アンプを介さずに測定できる「LIMP」で今までも測定してきました。
- 参考にしたのは、当サイトのこちらの記事。 オヤさんのサイトがずいぶん前にクローズされてしまったのは痛かったですが、今なら他にも参考にできそうなサイトはググれば出てきますね。
- ARTAは、こちらからダウンロードできます。
- ケーブルの製作
- サウンドデバイス出力を100Ωセメント抵抗を介してスピーカーに接続し、抵抗手前からダイレクトにマイクRch入力に。 抵抗のスピーカー側からマイクLchに入力します。
- 実際に製作したケーブル。 (手持ちにあったものを流用したので、配線太さがまちまちですが)
イヤホン出力プラグ側はモノラルでもOKですが、マイク入力プラグはステレオミニプラグが必要です。
- LIMPの設定
- Setup / Audio Devices
製作したケーブルをイヤホン出力ジャック/マイク入力ジャックに差して、LIMPのメニューのSetup / Audio Devices で表示するウインドウ上で、使用するサウンドデバイスを選択します。 - Setup / Generator
スピーカーを接続し、LIMPのメニューのSetup / Generator で表示するウインドウ上で、「Test」を押すと、マイク入力レベルが表示されます。 出力レベル十分に高くしておくと、測定精度も高くなるそうです。
なお、この図のようにL側のレベルが高い場合は、L/Rが逆に接続されている可能性があります。 (その場合は、次の項目「Refference channel」を変更します。) - Setup / Measurement
LIMPのメニューのSetup / Measurementで表示するウインドウ上で、Measurement config 内で 「Refference channel」の「Left / Right」 を正しく選択します。 どちらか迷う場合は、ひとまず測定してみておかしければ逆にしてみる、という手順で大丈夫。 平均化などは必要に応じて試してみるとよいでしょう。
- Setup / Audio Devices
- 測定
- LIMPのメニューの Record / Start か、アイコンの「Start Rec」を選択すると、測定を開始します。
- 測定結果は、例えば下図のように出ます。グラフ縦軸スケールなどは、必要に応じて調整します。
- File / Export As で、「Plain .ZMA」形式データを生成しておきます。
- Speaker Workshop へのインポート
ARTAやLIMPの測定結果は、上の図のように単独表示で確認するところまで可能です。 その先、測定結果データの重ね合わせや、シミュレーションなどは Speaker Workshop へインポートして行うとフレキシブルに活用できます。- ダウンロードはこちらから。
- 左側のプロジェクトペインで右クリックし、「Import」を選択して、LIMPで生成した「.ZMA」データをインポートします。
- 2つのデータを重ね合わせたい時は、夫々のZMAデータをImportした上で
- スパイラルバスレフらしく、FsとF0'間の谷底の広さが広帯域の輻射(ロードがかかっている)状態を示しています。
- 400Hz付近に共振点があるようだけど、何かなあ。 第2空気室単独の共振? それとも気柱共鳴? 原因不明です。
- しかし予想通り、LchのFsが少し低いですね。 ダクトの捻りが強いかな。 修正しなくては・・
- Speaker Workshop は使いづらい面もあるのですが、慣れると本当に便利です。 これを機会に皆さんも始めてみてはいかがでしょう?
先日製作した、スター-Solのバッフル塗装とF特の測定をやってみました。
塗装は水性クリアニスを10回程度塗り。
測定のほうは、いつものように狭い部屋で適当に測定しているため、参考程度にしかなりませんが一応載せておきます。
- ユニット特性どおりのハイ上がり。 バッフルに15度の迎角が付けてあるためこの程度で収まっているが、軸上で測定したらもっと顕著に出る。
ツイーター付きは10KHz以上でほんの少しレベルが上がっている程度だが、聴感では指向性がブロードになるぶんSolの高域のきつさをマイルドに拡散してくれる感じ。
いつもの測定と異なり、PCの標準マイク端子に入れて測定したので高域が減衰しているが、実際にはもっと伸びていると思う。 - 星型バッフルは、ScanSpeakの付録ユニットの時はちょうどよかったけれども、中域の張っているFE103系では1~2KHz付近にピーク、いやむしろ丘ができてしまった。 これはヘッドを作り直さないと治らないから仕方ない。
- 低域は175Hzのfd2ピークは以前のスターでもあった通りで、本来なら押えたいところだが。 また、ダクト出口音圧では、ダクト面積を広げたことで中域の漏れがオリジナルのスターよりも増えてしまっている。
というところでハイ上がりは仕方ないとしても、 やはりベストな箱では無いなあ。 もっと時間をかけて新作すべきなのでしょう。
本日、バッフル切出し・削り込み、ユニット取り付け、スパイラルダクト調整を行いました。 ツイーターは昨日の予察のとおり、(Vifa) XT25SC50-04を無理やり組み込んでます。(ネジ止め未実施)
うん、いいですね。
中高域の能率が高いので低域が少し薄めかもと思いますが、50Hz以上はちゃんと出ていますし、質感や帯域内バランスとも維持されています。 スパイラルのディスクは、従来の6枚から4枚増やして、手持ちの10枚全てつぎ込んでます。 ダクト面積を大きくとるため、ディスク間のねじれ位相を小さめに調整、そのぶんディスク枚数を増やす必要があるのです。 本当はもっと増やしたいのですが、作るのが面倒。 
高域は予察のとおりですが、エージングがかかってきたのか少しずつ滑らかになってハイ上がりなのに耳触りではありません。
とにかく中高域の歪みが少なく、分解能が良いので、少し煩いめの曲をかけても聞いていられます。
持っているCDをとっかえひっかえ聞いていますが、今までで一番良い音で聴けています。 オフ会をお楽しみに。 
昨日、3D-subakoにセットしてユニットの音出し・エージングを開始したFE103-Sol
今日はツイーターを仮設してテストしてみました。
テストしたツイーターは、以下の2つ。
- (DAYTON AUDIO) ND16FA-6
- (Vifa) XT25SC50-04
なお、FE103-Sol側にコイルを入れると途端にダンピングが悪くなり、3Dスパイラルの良さが半減するのでその線に解はなく、当初よりツイーター側のハイパスフィルターのみとして計画する。
- (DAYTON AUDIO) ND16FA-6
DAYTON のツイーターは、過去にFE103Eとの親和性が良かったので期待。 しかしFE103-Solの高域が非常に伸びていてかつ能率が高く、却ってつながりにくい。
1μFの6dB落ちハイパスで繋いでみたが、能率的にも品位的にも、物足りない結果に終わった。 - (Vifa) XT25SC50-04
これも以前、FE103Eと使用して好結果を得ていたツイーターで、割と大人しめの音質で繋げやすく、 インピーダンスが4Ωなので能率的にも期待できる。
結果、1μFではFE103-Solの高域を汚してしまうので、0.47μFにしてみたが、これでも少々強めの印象。 オフ会はこの程度でよいかもしれない。
以上から、 (Vifa) XT25SC50-04 用にバッフルの設計を変更した。 今週末に製作に入る予定。
昨日届いた、Fostexの限定ユニット、FE103-Sol。 これをとりあえず 3D-subakoに仮付けして音出しを試みた。
- リヤのマグネット部分。フレーム裏側のはシリアルNoか?
- 横から
- 3D-subakoに仮止めしたFE103E-Sol。独特のフレーム色。
- 木ネジはメッキ仕様。
- 仕様
- 口径:10cm
- インピーダンス:8Ω、(16Ω仕様もある)
- 再生周波数帯域:f0~40kHz
- 出力音圧レベル:90dB/W/m
- 最大入力:15W(MUSIC)
- 最低共振周波数(f0):85Hz(8Ω)、88Hz(16Ω)
- 実効振動質量(m0):2.5g(8Ω)、2.4g(16Ω)
- 共振尖鋭度(Q0):0.44(8Ω)、0.54(16Ω)
- 実効振動半径(a):4.0cm
- マグネット重量:226g
- 総重量:0.65kg
- 音質
以下、3D-subakoのユニットをFE103Eから交換してみた感想。- 能率が高い。 数値上103Eよりも1dB高いうえにハイ上がり。
- 軸上での 高域はかなり伸びている。 質的にはFE103Eのようなしっとり感は低く、FE103Enに近い少し硬さのある高域。 しかしFE88ES-Rの刺さるような高域ほどキツくない。
また、弦を聞いてもフルレンジ特有のカサカサした紙っぽいさはおとなしくなって、悪くない。 ハイハットの金属感もわりとある。 - 中高域の透明感はかなり高い。
- 中域はまさにFE103系伝統の朗々と鳴るボーカル、サックス。
- 中低域・低域とも、Qが少し高めのせいか、よく出る。 そして3D-subakoの大径スパイラルを割としっかり駆動できている。
- 全体の音場は、奥に広がるよりも手前に出てくる明るい音質。 もう少ししっとり感があるのが好みなのだが、エージングで良くなるか。。
というところで、なにしろこれが標準のFE103En+2,000円程度で買えるのだから、お値打ちとしか言いようがない。
もちろんしっかり聞き込むには高域の繊細さなどはよく出来た2wayに及ばないが、普段BGM用に使うフルレンジとしてはコスト比を含めた評価で最強のランクに入れたい。
次は、ツイーターの追加テストと、スターの交換用バッフルを作ってそれに換装するテストを予定。 塩ビ管スピーカーのオフ会に間に合わせたい。
5月11日に迫ってきた、集まれ!塩ビ管スピーカーの2014関東オフ会に鳴らすスピーカー。 昨年の「スター」のユニットを交換して行く予定で、図面の変更を実施中。 
原作は、ユニットをバッフル中央から上側にオフセットしてバッフルステップ効果の低減を狙っていたのだけれど、どうも振動が大きくなる原因かもしないので、今回は中央に配置。
バッフルステップは強めに出てしまうけれども、それも音の味となればよいでしょう。
製作は18mmシナアピトン合板のバッフル板だけなので、始めれば早いと思われます。
しかし、肝心のFostexの限定ユニットFE103Solはいつ出荷開始するんだろう? 4月中旬ということだったのだが、全く音沙汰ない。。 
なお、図面は「DraftSight」というフリーのAutoCadLTほぼ互換の2次元CADを使っています。 この程度の作図ならこれで十分!
タグ ESXi PCIパススルー PuppyLinux ゼロクライアント デバイス ハード 自鯖
windowsXPのサポート終了に伴い、windows8.1にアップデートしたい。
けれどもうちのクライアントマシンは仮想マシンになっていて、そのホストであるVMWare ESXi5.0がまだwindows8をインストールできない状態だったので、ずっと放置していた。
ようやく重い腰を上げて、これにトライすることにした。 昨年の1月に構築してからすこぶる安定しているシステムなので、マイナーバージョンアップで何とかしたい。
夜中にサーバー止めて2晩ほど作業すれば終わるかな、くらいに思っていたのだが大間違い。 様々な問題が起こって都度対処し、気づけば1週間ほどの時間を費やしてしまった。
...










6





