rin のすべての投稿

絶縁地震計

絶縁地震計
絶縁地震計

完成した。

ADR423はノイズが多いのでリファレンスには使えなかった。温度補償が必要な温度計向きかも知れない。

ADuM5401は有っても無くても測定値に影響は無かった。高ノイズ環境なら差が現れるかも知れない。

回路図
回路図

デジタル・アイソレータADuM5401

ADuM5401, ADS1247, ADR423, ADP150
ADuM5401, ADS1247, ADR423, ADP150

デジタル・アイソレータはパソコンなどのノイズ源からセンサーやADコンバータを絶縁して駆動するためのインターフェースらしい。以下に具体例が載っている。

Circuit Note CN-0066(Analog Devices)
Application Report SLOA123(Texas Instruments)
A-Dコンバータ活用 成功のかぎ(CQ出版)

そこでADuM5401を使って絶縁地震計を作ってみる。

IntelGalileoのシリアル出力でフリーズ

IntelGalileoでシリアルモニタを開かないでシリアル出力し続けるとフリーズする。

ソース:

int led = 13;
void setup() {                
  pinMode(led, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  digitalWrite(led, HIGH);
  delay(100);
  digitalWrite(led, LOW);
  for(int i=0;i<100;i++){
    Serial.println("test");
  }
}

結果:
IntelGalileo→約30秒間LED点滅してフリーズ
ArduinoUNO R3→フリーズしない

Intel Galileo — ADコンバータを接続する

加速度センサーの値を液晶に表示した
加速度センサーの値を液晶に表示した
回路図
回路図

Intel GalileoではI2C液晶モジュールACM1602NIはどうやっても動かなかった。前回の液晶を採用して16bitADコンバータADS1115を接続してみた。CPUの温度が50℃を超えた辺りから動作が怪しくなり遂に書き込みできなくなった。三端子レギュレータに使うヒートシンクとファンを設置すると安定した。温度計とヒートシンクは割り箸で固定した。

サンプリングレートはデフォルトのままで加速度センサーの測定値を液晶に表示した。ノイズは十分低いので計測震度の計算に利用できると思う。次はFFT処理をする。

スケッチ

// I2Cdev : https://github.com/jrowberg/i2cdevlib
// LiquidCrystal_I2C :
//   http://hmario.home.xs4all.nl/arduino/LiquidCrystal_I2C/

#include <Wire.h>
#include "ADS1115.h"
#include   <LiquidCrystal_I2C.h>

ADS1115 adc0(ADS1115_DEFAULT_ADDRESS); //ADDR:GND
LiquidCrystal_I2C lcd(0x20,8,2);//I2Cアドレス、8行x2

void setup() {                
    Wire.begin();  // I2C開始
    adc0.initialize(); // ADS1115 初期化
    lcd.init();       // 液晶初期化
    adc0.setMode(ADS1115_MODE_SINGLESHOT);//シングルショット・モード
    adc0.setGain(ADS1115_PGA_4P096);//フルスケール±4.096V
}

void loop() 
  {
    adc0.setMultiplexer(ADS1115_MUX_P3_NG);//マルチプレクサ設定
    lcd.setCursor(0,0);
    lcd.print("X:");
    lcd.print(adc0.getConversion());//変換
    adc0.setMultiplexer(ADS1115_MUX_P2_NG); 
    lcd.print("   ");
    lcd.setCursor(8,0);
    lcd.print("Y:");
    lcd.print(adc0.getConversion());  
    adc0.setMultiplexer(ADS1115_MUX_P1_NG); 
    lcd.print("   ");
    lcd.setCursor(0,1);
    lcd.print("Z:");
    lcd.print(adc0.getConversion());  
    lcd.print("   ");
    delay(10);    //待ち
  }
//I2Cdev.cpp
//min関数が無いと言われるので加える
int min(int a,int b){
    if(a<b){return a;}else{return b;}
}