VocalFusion スピーカー開発キットから SG90 サーボモータもコントロールする

XMOS社から発売されている VocalFusion スピーカー開発キット (XVF-3000) と、Raspberry Pi 3 (RPi3 Model B) を使用して、音楽再生&音声録音を行いながら、SG90 サーボモータもコントロールするデモをご紹介します。


VocalFusion スピーカー開発キット (XVF-3000) のビデオは、以下のページからも紹介しています。
https://www.xmos.com/products/voice/vfusion


  1. VocalFusion スピーカー開発キット (XVF-3000) :
    • 4つの Digital MEMS Microphone と、USB-PHY / PDM マイク インターフェース / Voice DSP / スピーカーインターフェース (I2S) を搭載した XVF-3000 ボイス・プロセッサ による、Voice User Interface 評価ボード
  2. Raspberry Pi 3
    • ARMプロセッサーを搭載したシングルボード・コンピュータ
  3. SG90 サーボモータ
    • 非常に安価なサーボモータ



XVF-3000 デバイス上では、各種音声信号処理が行われています。一方、XMOSのデバイスはマルチコアですので、未使用のCPUがあれば、音声信号処理とは独立して別の仕事もこなせます。

この例では、空いているCPUを使用して、SG90 サーボモータを、XVF3000デバイスがコントロールしています。

XVF-3000 では、音声の到来方向を検出できますので、その機能と組み合わせることで、音声の方向に、サーボモーターを向ける動作を行っています。


(1) VocalFusion スピーカー開発キット (XVF-3000) と Raspberry Pi を USB 接続しています。

(2) VocalFusion スピーカー開発キット (XVF-3000) とスピーカーが接続されています。

(3) Raspberry Pi から音楽を再生しています。VocalFusion スピーカー開発キット (XVF-3000) に接続されているスピーカーから音が出力されています。

(4) Raspberry Pi カメラモジュールの出力を HDMIモニターに出力しています。

(5) XVF3000 デバイスでは、登録されたキーワード ”Hello Blue Genie” とその方向を検出します。そして、(PWMを出力して)SG90サーボモータを制御しています。SG90サーボモータに接続しているカメラの向きを変えています。




SG90 サーボモータをコントロールする XC コードは、非常に簡単です。以下はあくまで一例です。他の記述方法でも、実現できます(select/case文)。

===============
on tile[0]: out port pPWM  = XS1_PORT_1G;

#define ZERODEGREE       1450  //us
#define PLUS90DEGREE    2400  //us
#define MINUS90DEGREE    500  //us

#define PULSEWIDTH   (XS1_TIMER_MHZ * 20000) //pulsewidth 20ms
#define PULSECNT 100


void SG90_PWM(int inDegree)
{

    timer t;
    unsigned tstart, tout1, tout0;
    float targetDeg;

    targetDeg = inDegree; //(0 - 359)
    if (targetDeg > 180) targetDeg = 180;

    //flip for demo
    targetDeg = 180 - targetDeg;

    unsigned PulseHigh_us   = ((SG90_PLUS90DEGREE - SG90_MINUS90DEGREE) * (targetDeg/180)) + SG90_MINUS90DEGREE;
    unsigned newPosition = XS1_TIMER_MHZ * PulseHigh_us; //unit: us


    for(int i=0; i<SG90_PULSECNT; ++i)
    {
        t :> tstart;

        pPWM <: 1;

        tout1 = tstart + newPosition;
        tout0 = tout1  + (SG90_PULSEWIDTH - newPosition);

        t when timerafter(tout1) :> tout1;

        pPWM <: 0;

        t when timerafter(tout0) :> tout0;
    }//
}
===============


(その他の投稿については、右上の「ページ」をご確認ください)


0 件のコメント:

コメントを投稿