SPI / 雷センサーAS3935 / 動作確認

pp.563ff.

テキストは、SPI接続のLEDドライバーMAX7221で7セグLEDを駆動しているが、ここでは雷センサーAS3935を試す。SparkFun社製ブレークアウトボードを使う。

SparkFun社製ブレークアウトボード (接続図)の注意点:

  • SPI専用。
  • 内蔵レギュレーターは未使用。したがって電源電圧は3.3 V専用。
  • IOは3.3 V。
  • ボード上にINTとあるが実際はHi有意。

そうそう都合よく雷は鳴ってくれないので、とりあえずチャッカマンで動作確認をする。火花を飛ばしたいだけである。一往何かを検出してはいる。
f:id:ti-nspire:20200804104025p:plain:w560

https://github.com/ti-nspire/AVR/tree/master/AS3935%231/test_C

#define F_CPU 8000000UL

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#include "USARTClass.h"
#include "SPIClass.h"

const uint8_t CS_port = 'B';
const uint8_t CS_pin  = 2;
SPIClass spi(128, 1, 'M', CS_port, CS_pin); // (分周比, モード, ?SBファースト, CSポート, CSピン)


volatile uint8_t detected = 0;
ISR(INT0_vect){
    detected = 1;
}

int main(){
    usart.init();
    spi.init();
    
    EIMSK |= (1 << INT0);                 // INT0 (外部割り込み要求0)を有効化する。
    EICRA |= (1 << ISC01) | (1 << ISC00); // rising edgeで割り込む。
    sei();                                // グローバル割り込みを有効化する。

    uint8_t occurences = 0;
    while(1){
        if(detected){                             // 雷が検知されたら
            spi.selectSlave(CS_port, CS_pin);
            spi.tradeByte(0b01 << 6 | 0x07);
            spi.tradeByte(0);
            spi.deselectSlave(CS_port, CS_pin);
            
            usart.printString("#");
            usart.printByte(occurences++);        // 何発目であるかを表示して、
            usart.printString("\n");
            usart.printString("distance (km): "); // 距離を表示して、
            usart.printByte(SPDR);
            usart.printString("\n");

            _delay_ms(3);
            spi.selectSlave(CS_port, CS_pin);
            spi.tradeByte(0b01 << 6 | 0x03);
            spi.tradeByte(0);
            spi.deselectSlave(CS_port, CS_pin);
            
            usart.printString("int source: ");
            usart.printByte(SPDR & 0b1111);       // 割り込み要因を表示する。
            usart.printString("\n\n");
            
            detected = 0;
        }
        
    }
    return 0;
}