趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。
RSS icon
  • KXP84+SCP1000

    投稿日 2011年 5月 3日 コメントはありません

    KXP84-2050は一応動くようになったのですが、稀におかしなデータを吐くので困っています。

    連続でXYZの各データを読みつづけると、静止状態にも関わらず突然X方向に大きくずれた値を出力します。しかもYZは何事もなかったかの様に動作しつづけますし、その後X方向も元の値に戻ってしまいます。SPIでのデータ転送時のビット抜けかとも思いましたが、YZには影響がなかったり、ビット抜けパターンには合致しなかったりするので、ビット抜けではないようです。パスコンは写真の通り秋月モジュールなので0.1uFと4.7uFのセラミックコンデンサ(目視ではわかりませんけど)がついていますので、そうそう問題ではないはずです。

    時々誤動作する加速度センサでは困りますので、KXM52-1050の方に切り替えようかと思っています。

    一方、SCP1000の方ですが、こちらは上手くいっています。

    5/1の深夜から5/2の午前中にかけての室内の温度変化です。窓を少し開けて寝ましたので、明け方に温度が下がっているのがわかります。

    同様に気圧の変化です。約2サンプル/秒のものを強引にgnuplotでグラフ化しましたが、適切にサンプリングするようにすれば面白そうです。


  • SCP1000とKXP84を同時に動かす

    投稿日 2011年 5月 2日 コメントはありません

    タイトルの通りです。

    CSを別々にして両方のデバイスをSPIにぶら下げただけです。

    ただ、加速度計の方は周期的にデータを取りたいので一捻りしています。Arduinoで無理やりタイマ割り込みを設定し、割り込み処理ルーチン内でSPIにアクセスにいった上に浮動小数点演算までやるという無茶なことをしています。当然、SCP1000のSPIアクセスや非割り込み処理部分での浮動小数点演算と干渉しますので、SCP1000にアクセスに行くときや浮動小数点演算を行う箇所では割り込みを禁止しています。

    以下に主要部分を記載します。

    #include <avr/interrupt.h>
    #ifndef cbi
    #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
    #endif
    #ifndef sbi
    #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
    #endif
    
    volatile unsigned long timer1_count = 0;
    //////////////////////////////////////////////
    // Timer1 Interrupt
    SIGNAL(TIMER1_COMPA_vect)  // See voctor list sec.11-4
    {
       timer1_count++;
       IntAccProc(); <--割り込み処理で呼びたい関数
    }
    
    // Initialize Timer1 as Interval Timer
    void InitTimer1(unsigned long int cycle_in_ns){
      double t;
      TCCR1A = 0;
      TCCR1B = 0;
      // set timer 1 prescale factor to 64
      sbi(TCCR1B, CS11);
      sbi(TCCR1B, CS10);
      // Change mode 8bit-pwm to 16bit
      sbi(TCCR1B,WGM12); 
      // Set Cycle (10000000ns / 125ns) 
    #if F_CPU >= 16000000L
      t = cycle_in_ns/62.5;
    #else
      t = cycle_in_ns/125.0; // 
    #endif
      OCR1A = (unsigned int)(t/64.0);
      // Enable Timer0 OCIE1A interrupt
      sbi(TIMSK1,OCIE1A);
    }

    反則技だと思いますが、やっぱり割り込みは使いたいですからね。
    そうそう、干渉しそうな場所は cli()で割り込みを禁止し、必要がなくなったら sei()で割り込みを許可してやる必要があります。


  • A/D内蔵KXP84-2050を試す

    投稿日 2011年 5月 1日 コメントはありません

    SCP1000のExampleをベースにSPIの動作確認ができたところで、A/D内蔵の加速度センサKXP84-2050を接続してみました。KXP84-2050は3.3V動作ですので、接続するArduinoも3.3Vタイプでなければなりません。3.3Vタイプは液晶モジュールとの共存が難しいので頭が痛いところですが・・・。

    それはさておき、Arduinoとの端子接続は以下の通りです。

    • モジュールの1ピン(VDD):ArduinoのVcc(3.3V)
    • モジュールの2ピン(GND):ArduinoのGND
    • モジュールの3ピン(MOT):オープン
    • モジュールの4ピン(FF):オープン
    • モジュールの5ピン(SCL/SCLK):Arduinoの13ピン
    • モジュールの6ピン(IO_VDD):ArduinoのVcc(3.3V)
    • モジュールの7ピン(SDA/SDO):Arduinoの12ピン
    • モジュールの8ピン(RESET):ArduinoのRESET
    • モジュールの9ピン(ADDR0/SDI):Arduinoの11ピン
    • モジュールの10ピン(CS):Arduinoの7ピン

    で、SCP1000のExampleをベースにスケッチを作成したところ、あっさり動作しました。

    参考になるかわかりませんがアップロードしておきます。→KXP84_2050.zip