初めてのオーディオアンプシミュレーションと自作基板【LTspice】

電力増幅回路

概要

「定本 トランジスタ回路の設計」第4章 ミニパワー・アンプの設計を参考に、0.5W出力のオーディオアンプを作る。

具体的な回路定数の決め方や回路の評価など、めちゃくちゃ丁寧に解説されている本です。おすすめ。

www.amazon.co.jp

設計仕様

  • 電圧利得 10倍(20dB)程度
  • 出力電力 0.5W以上(8Ω負荷)
  • 出力電圧  V_{out}=\sqrt{0.5\ \text W×8\ \text Ω}=2\ \text{Vrms}
  • 周波数特性 20~20kHz
  • ひずみ率 1%以下

    回路図

  • 電圧増幅段はQ1によるエミッタ接地増幅回路&Q2によるバイアス調整回路
  • 電流増幅段はQ3,Q4によるAB級プッシュプル回路

電力増幅回路の温度安定度

温度安定度については「定本 トランジスタ回路の設計」第4章の内容から抜粋し、要約した。

  • 電圧増幅回路(エミッタ接地など)に流れる電流は小さいので、ほとんど発熱はない。
  • 電流増幅回路(エミッタフォロワなど)は比較的大きな電流が流れるので、発熱が大きい。

この発熱によって、設計次第ではトランジスタが熱暴走してしまうことがある。

図(a)の回路はB級プッシュプル回路で、アイドリング(バイアス)電流が流れないが、波形の歪みがある。

図(b)の回路はAB級プッシュプル回路で、クロスオーバー歪みを解消するためにダイオードを挿入している。流す電流が小さければ問題ないが、大電流を流したときにトランジスタが発熱すると、トランジスタ V_{BE}は負の温度係数を持つので、小さくなる。(具体的には、40℃上昇すると約0.1V低下する) すると、 V_F \simeq V_{BE} の均衡が崩れ、 V_F>V_{BE} となるので、ベース電圧が増加し、コレクタのアイドリング電流が増加する。電流が増加するとさらにトランジスタの温度が上がる。これがトランジスタの熱暴走のメカニズムらしい。

図(c)のようにエミッタ抵抗をつけると、電流制限はできるものの、出力インピーダンスが大きくなるので、出力電圧が低下する。したがって、スピーカーのような低インピーダンス負荷は駆動できなくなる。

そこで、上のようにTr1をTr2とTr3のベース間バイアスとして使う。この回路では、3つのトランジスタ Tr1,Tr2,Tr3をヒートシンクで熱結合する。熱結合すると、3つのトランジスタの温度は殆ど等しくなる。つまり、温度特性が同じトランジスタなら、 V_{BE} が等しくなる。Tr1のCE間電圧( V_{CE} )は、BE間電圧に比例し、 V_{CE}=\frac{R_A+R_B}{R_B}V_{BE1} となる。したがって、 V_{CE} V_{BE1} に比例して温度変化する。  R_A を可変抵抗として調整することで、 V_{CE}\simeq V_{BE2}+V_{BE3} にできる。実際には、クロスオーバー歪みを解消するために、 V_{CE}\gt V_{BE2}+V_{BE3} として、Tr2,Tr3にコレクタバイアス(アイドリング)電流を10mA程度流す。したがって、信号入力がないときのTr2,Tr3の消費電力はおよそ15V×10mA=150mW。

熱結合の図

ヒートシンクには秋月電子17PB046-01025(46×25×17mm)を使い、放熱用シリコン接着剤 HY-910で接着した。

シミュレーション

オーディオ・アナライザとか持ってないので、LTspiceで補完。有名なフリーの回路シミュレーター。

入出力波形

.measコマンドで入出力電圧のPeak to Peak値と電圧増幅率 Avを調べてみる。

.meas tran vipp PP v(in)
.meas tran vipp PP v(out)
.meas tran Av AVG v(out)/v(in)

Error Logに出力された結果はこんな感じ(デフォルトだと t=27℃) 設計通り-9.76倍≒-10倍(=20dB)で増幅されている。

電圧増幅率の周波数特性

電圧増幅率 Av=Vout/Vin は、低周波では結合コンデンサと入出力インピーダンス、高周波ではトランジスタの寄生容量・等価抵抗によって利得が下がる。 このグラフは、.ac解析で概算できる。(.ac dec 50 1 10Meg)

結果はこんな感じ。 実線が5本あるが、これは温度ごとの利得の周波数特性。破線の方は位相差の周波数特性になっている。 温度解析を行うには、.tempコマンドを使い、.temp 20 30 40 50 60のように温度のリストを記述する。

なんだか過渡解析のときの(20dB)と比べて利得が下がっているが、これはLTspice側の問題らしい。過渡解析側の入力信号を小さくすると、周波数解析と一致する。

以下の動画で詳しく説明されていた。 【伝スパ】LTSpice TRAN解析とAC解析を比較する その1 - YouTube

温度が上がると利得が増える傾向がある。(周波数=1kHzで比較)

FFT(高速フーリエ変換)

増幅回路では、入力信号の周波数のn倍(n=1, 2, ...)の周波数を持つ波形が、出力側には現れる。n=1のものを基本波といい、それ以外(n≠2)をn次高調波という。もちろん出力したい波形は基本波だけで、高調波は出力信号が歪む原因となる。

出力信号に高調波成分がどれだけ含まれているかを調べるには、V(out)をフーリエ変換すれば分かる。LTspiceでは、過渡解析のデータをもとにFFTを計算してくれる。横軸が周波数で、縦軸は周波数成分をdBに変換した、振幅スペクトルである。確かに基本周波数のn倍の周波数成分が1kHzごとに現れている。

THD(歪み率)

出力波形の歪み率をTHD(Total Harmonic Distortion)といい、次の式で定義される。

 \displaystyle
THD=\frac{\sqrt{\sum_{i\ne1} V_i^2}}{V_1}×100 \ [\% ]

ただし、 V_i i 次高調波の実効値である。

LTspiceには、歪み率を計算してくれる.fourコマンドがある。やり方は【LTspice】フーリエ変換を実行する『.fourコマンド』の使い方 - Electrical Informationを参考にした。

  1. .tranで2msの過渡解析をする。

  2. .optionsで3つの変数を指定する。

    • maxstep...2ms/10000程度の刻み幅で解析する
    • plotwinsize=0...データ圧縮をしない
    • numdgt=7...倍精度で計算する
  3. .four 基本周波数 調べたい信号でフーリエ解析をする。

.tran 2m
.options maxstep=0.2u plotwinsize=0 numdgt=7
.four 1k V(out)

9次高調波までの歪み率(PHD)が2.05%, n次高調波までの歪み率(THD)が2.07%となった。参考元の「定本 トランジスタ回路の設計」p108の図11で、出力電圧3Vのとき歪み率が2%になっているので、大体合ってそう。

実際の動作

実験装置の外観

おもちゃみたいな実験装置(笑)だが、動作確認には最低限使える。

  • 赤い基板:信号発生器 KKHMF XR2206 (Vpp=0.58,1kHz)
  • 緑の基盤:パワー・アンプ
  • 右手前:オシロスコープ DSO-TC3
  • 右奥:安定化電源 DP100

入出力波形

入力波形はVpp=0.58V, f=992Hz

出力波形はVpp=5.94V, f=992Hz

したがって、利得は5.94/0.58=10.2倍(=20dB)になっている! 波形の歪みも目視では全く分からない。

基板の製作

初めての基盤製作なので、インストールが不要で、KiCadよりも比較的簡単なeasyEDAを使って基盤を製作し、JLCPCBで発注した。中国からの輸送なのにクーポン込みで500円。滅茶苦茶安い…配送は一番安いOCS NEPで1週間程度でした。(2SC1815のフットプリントを何故か間違えてたので、代わりに手元にあった2N3904を使ったり、ヒートシンク用固定穴の銅箔が薄くてはんだが乗りにくかったりしましたが…動いたのでAll OKです) 電源ラインはベタ塗りするとか…詳しいことは知らん

3DViewで概観を確認できる。真ん中の空いている部分にヒートシンクを配置して、トランジスタを熱結合&排熱する。

実際の基盤

回路の末端は何も考えずピンソケットにしたけど、もっといい方法がある気がする…

終わりに

自作基板を作るのは初めてだったので、まったく動作しないゴミが送られてこないか不安でしたが、ちゃんと動きました。歪み率が小さいので、普通のスピーカーと同じくらい音がいいです。まあ賃貸なので大音量で比較はできませんが…

アナログ回路のうまみは結構感じれたので、次は電源回路とかデジタル回路を作ってみたいですね~

Googleカレンダーに時間割を登録するGUIアプリを作った

概要

講義の予定をGoogleカレンダーに自動的に追加するようなGUIアプリケーションを作りたい!

(半年ぐらい前に書いたプログラムの修正版といったところ…)

すでにひな型があったのでCUIからGUIにするのに1日ぐらいで終わった。

具体的なプログラムのイメージ

検索

検索キーは講義番号とする。

スクレイピングシラバスから講義情報を取得してうまく表示させたい。

予定データの入出力

登録する講義情報をGUIに入力し、Googleカレンダーの予定データの形式に変換したい。

予定データの登録

入力された予定データをGoogleカレンダーに登録する。隔週ごとに登録できるとなお良い。

予定データの削除

現在登録されている予定を削除する機能。登録するより難しい気がする… ->うまく実装できる気がしない…

曜日振替

(たまに曜日振替がある…)けど気にしない

マニュアル登録

保留その2

完成したものがこちら

予定を追加したい講義の講義番号から検索をする。 Googleカレンダーに予定を追加ボタンを押すと、表示されている時刻に予定が追加される。一度に予定が一気に登録されるので、間違えると消すのはかなり面倒くさいので注意 ちゃんと予定が追加されると、こんな感じに表示される。

結構便利そう。.exeファイルにしたので、Githubからダウンロードして以下の設定をすれば誰でも使えるはずです。(Microsoft Defenderにはじかれる可能性もありそう)

github.com

zipファイルでダウンロードするのが楽だと思います。

GASの認証について

サービスアカウントと呼ばれるアカウントを発行してGoogleカレンダーにアクセスできるようにすれば、このプログラムが機能するようになります。サービスアカウントにまつわる認証情報は機密情報なので、ネットなどに公開するのはNGです。自己責任でよろしくお願いします。

サービスアカウントを使って認証する

認証ファイルを作成する手順は以下のサイトを参考にした。

Google Cloud Platform の鍵ファイルの作成 - IBM Documentation

Google Cloud プラットフォーム

Googleクラウドにアクセスする。

プロジェクトの選択->新しいプロジェクトをクリック

適当なプロジェクト名をつけてプロジェクトを作成

初めの画面に戻る。IAMと管理をクリック。

サービスアカウントをクリック。

サービスアカウントを作成をクリック。

適当に名前を付けて作成。

鍵を管理をクリック。

ファイル名をcredentials.jsonとして保存する。

もう一度初めの画面へ戻る。APIとサービスをクリックし、画面が遷移したら、APIとサービスを有効にするをクリック。

APIの検索画面からカレンダーを検索。

Google Calendar APIを有効化する。

今度はGoogleカレンダーを開く。

Google カレンダーを共有するには?公開範囲の制限や詳細の非表示・権限付与方法を紹介|ヨシヅミ-吉積情報株式会社|Google 認定プレミアパートナーより画像を引用

ユーザーを追加するを押し、「予定の変更」権限で、作成したサービスアカウントを登録する。

あと、タイムゾーンがずれている場合は日本標準時に変更してください。

認証ファイルを所定の位置に移動する

全体のファイル構成はこんな感じ

MySyllabus
├── Pipfile //ライブラリ管理
├── Pipfile.lock
├── README.md
├── config //学期と時限の設定ファイル
│   ├── period.csv
│   └── semester.csv
├── env //ユーザー設定フォルダ
│   ├── .env //メールアドレス
│   └── credentials.json //認証ファイル
└── src
    ├── MySyllabus.exe //実行ファイル
    ├── MySyllabus.ipynb
    ├── MySyllabus.py //ソースコード
    ├── MySyllabus.spec
    └── build

設定の必要があるのはsemester.csv, .env, credentials.jsonの3つだけ。

credentials.jsonはサービスアカウントを作成したときにダウンロードしたファイルで、envディレクトリの直下に保存する。

.envファイルには、Googleカレンダーと紐づいているメールアドレスを入力する必要がある。

semester.csvは学期の開始日と終了日が入力されているだけ。年に一回更新すればOK。

学期,開始,終了
1,2024/4/8,2024/6/6
2,2024/6/7,2024/8/5
3,2024/10/1,2024/11/28
4,2024/11/29,2024/2/7

デジタル時計とライブラリの自作【Arduino IDE】

DS1307(リアルタイムクロックモジュール)のクラスを自作して、温度表示機能付きのデジタル時計を作った。 調べた感じすでにライブラリが存在するらしい。

GitHub - makerhero/DS1307: Biblioteca DS1307 - Arduino

このライブラリは使わずにライブラリを自作する。

自分でクラスを作れば、必要最低限の機能が実装できる。

それから最近C++を勉強したので自分でクラスを作ってみたいという理由。

とりあえず単体で(自作ライブラリなしで)動くスケッチを作った。

github.com

Arduino IDEでライブラリを自作するには?

参考:

Arduino IDEの使い方(ライブラリの自作編) - NOBのArduino日記!

Arduinoの自作ライブラリを作成するには? – StupidDog's blog

Arduino用ライブラリを書く

今回作るライブラリ名はDS1307Libとする。

このライブラリはGithubにアップロードした。

github.com

  1. クラスをヘッダファイルに記述

    場所は~/Documents/Arduino/libraries/DS1307Lib

    ファイル名はDS1307Lib.h

  2. メンバ関数の定義をソースファイルに記述

    場所は~/Documents/Arduino/libraries/DS1307Lib

  3. 新たに定義した型や関数をハイライトするためのファイルを用意

    場所は~/Documents/Arduino/libraries/DS1307Lib

    ファイル名はkeywords.txt

  4. ライブラリを利用する

    自作したライブラリは、通常のライブラリと同じように、

    #include <DS1307Lib>で使えるようになる。

    なお、使用したOLEDはSSD1306

時刻と温度をOLEDに表示

DS1307のライブラリDS1307Lib.hとADT7410のライブラリADT7410Lib.hを自作して、SSD1306というOLEDディスプレイに表示するプログラムを作成した。あと、今更気づいたけどLCDは液晶のことでOLEDとは全然別物でした。修正が面倒なので放置...

github.com

左からDS1307,ADT7410,SSD1306

(I2Cアドレス0x68,0x48,0x3c)

詳細はそれぞれ別の記事にメモした。

DS1307のメモ - よもつひらさか

ADT7410のメモ - よもつひらさか

SSD1306のメモ - よもつひらさか

画面構成はshowDataLCD()内を変更すれば変えられる。 デジタル時計っぽく表示してみた

すべてI2Cなので回路構成はシンプル…かと思いきやDS1307が5Vじゃないと駆動しないので3.3Vを電源に使うには昇圧回路 or I2Cバスレベル変換が必要らしい。

昇圧回路の場合は3.3Vだけで駆動する。I2Cバスレベル変換の場合、3.3Vと5Vの両方必要。

モジュール 価格
3.3Vマイコン 1000
DS1307 560
ADT7140 600
5V昇圧コンバーター 300
SSD1306 500
2960

3000円の時計は高いだろ…マイコンが高い

PICを使えば回路も小型化できて安くもなるだろうけど

Arduinoのライブラリが使えないと現状厳しそう(能力的に)

PICのお勉強をするべきなんでしょうか…

DS1307のメモ

I2C RTCモジュール DS1307

秋月電子で購入

AE-DS1307 I2C RTCモジュール

モジュールのマニュアル

接続

SCL,SDAのプルアップ抵抗は内蔵されているので不要。

電源は5Vのみ。3.3Vでは動かない。

RTCモジュールで日時を表示するスケッチ

Arduino RTC DS1307のブログのコードをコピペして動かしてみた。

github.com

このコードを参考にしてDS1307の自作ライブラリを作成した。詳細は別の記事を参照。

yomaityan.hatenablog.com

ADT7410のメモ

ADT7410は16bit/13bitのI2C温度センサ。

16bitモード マスタリングWireライブラリ その7 温度センサADT7410 リピーテッド・スタート・コンディション - Arduinoクックブック

13bitモード Arduino と ADT7410とI2C通信で温度測定 | 計測ブログ Measurement Blog を参考にした。

とりあえずクラス部分(のちに自作ライブラリとなる部分)を作って単体で動くプログラムを作成する

#include <Wire.h>
class ADT7410{
  private:
    const uint8_t ADT7410_address=0x48; //ADT7410のI2Cアドレス
    const uint8_t Configuration_register = 0x03 ; //設定レジスタのアドレス
    int mode; //16bitモードか13bitモードかを指定する整数
    float temperature; //変換後の温度データ
  public:
    //コンストラクタ
    ADT7410(int Mode=16); //Mode=13 or 16を指定 デフォルトは16
    float getTempData();
    float convTempData(int tempSign);
    void showTempDataSerial(){Serial.println(temperature,2);}
};

ADT7410::ADT7410(int Mode){
  /*ADT7410のコンストラクタです*/
  Wire.beginTransmission(ADT7410_address); //ADT7410とI2C通信を開始
  mode=Mode;
  if(mode==16||mode==13){
    Wire.write(Configuration_register); //設定レジスタに書き込みを指示
    Wire.write(0x80); //設定レジスタに0x80を書き込み=>16bitモードへ
    delay(240); //設定が有効になるまで待機
  }
  else{
    Serial.println("エラー:");
    Serial.println("無効なモードが指定されました");
    Serial.println("ADT7410のコンストラクタの引数には13か16を指定してください");
  }
  Wire.endTransmission();
}

float ADT7410::getTempData(){
  /*ADT7410から16bitまたは13bitのデータを受信し、温度(℃)を返します*/ 
  Wire.requestFrom((uint8_t)ADT7410_address, (uint8_t)2); //ADT7410から2byteデータを受信
  int tempSign = (Wire.read()<<8) | Wire.read() ; //2byteを結合し16bitの温度データとして取得
  if(mode==16){
    return convTempData(tempSign);
  }
  else if(mode==13){
    tempSign=tempSign>>3; //13bit化
    return convTempData(tempSign);
  }
  else return (float) -1;
}

float ADT7410::convTempData(int tempSign){
  /*ADT7410から取得したデータを浮動小数表示に変換します*/ 
  if(mode==16){
    int temp = tempSign & 0x7fff; //符号ビットを除去
    if (tempSign & 0x8000 ) temp = -( (~temp & 0x7fff) +1); //温度が負の場合、2の補数をとる
    return temperature = temp * 0.0078 ; //128で割って0.0078℃/LSBの変換を行う
  }
  else if(mode==13){ 
    int temp = (tempSign & 0x1000) ? (tempSign - 0x2000) : tempSign; //符号判定した値を返す
    return temperature = temp * 0.0625; //16で割って0.0625℃/LSBの変換を行う
  }
  else return (float) -1;
}

void setup() {
    Wire.begin();
    Serial.begin(9600);
}
 
void loop() {
  //コンストラクタを作成
  static ADT7410 adt7410;
  //温度データを取得
  float temp=adt7410.getTempData();
  //温度データをシリアルモニタに表示
  adt7410.showTempDataSerial();
  delay(1000);
}

github.com

自作クラスを作成

場所はC:\Users\ユーザー名\Documents\Arduino\libraries\ADT7410Lib\ADT7410Lib.h

いい感じに表示できるようになった。

自作クラスを作成する手順は別の記事で説明する。

yomaityan.hatenablog.com

SSD1306のメモ

参考

単色OLEDモジュールを使う(SSD1306 / I2C) | たまねぎブログ

Arduino > OLED > adafruitライブラリ #Arduino - Qiita

電子工作 その15(OLEDディスプレイ:SSD1306の使い方)

OLED ディスプレイ SSD1306 (I2C) を使ってみる(Arduino) | 篠ん爺のさんぽ道 (遊び心の旅)

SSD1306の公式ライブラリ

GitHub - adafruit/Adafruit_SSD1306: Arduino library for SSD1306 monochrome 128x64 and 128x32 OLEDs

製品情報

SSD1306にはI2CモデルとSPIモデルがある。購入したのはI2Cモデル

Amazon.co.jp: VKLSVAN 2個 0.96" iic i2c ホワイトOLEDモジュール128×64 OLED LCDディスプレイArduinoに対応 : 産業・研究開発用品

Arduino IDEで使う場合

次のライブラリをArduino IDEでインストールする

Adafruit_GFX_Library
Adarfuit_SSD1306

I2Cアドレスは0x3Cらしい。基盤の裏の抵抗を取り除けば0x3dとして使えるとのこと。

接続はVCCを3.3Vにつなぐこと。5Vでも動くっぽい。 SCL,SDAはArduino Unoの場合はSCL,SDAの代わりにA5,A4につないでもよい。

Hello Worldを表示させるスケッチ

専用のクラスがあるので、それを利用する。

#include <Wire.h> 
#include <Adafruit_SSD1306.h> 

#define SCREEN_WIDTH 128 
#define SCREEN_HEIGHT 64 
#define OLED_RESET -1 

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  // ここにI2Cアドレスを設定
  display.begin(SSD1306_SWITCHCAPVCC,0x3C); 
  display.setTextColor(WHITE);  
  display.setTextSize(1);
  display.clearDisplay();
  display.clearDisplay(); 
}
 
void loop() {
  for(int i=0;i<64;i+=8){
  display.clearDisplay();    //画面クリア   
  display.setCursor(0,i);    //左上にカーソルを移動
  display.print(i);
  display.print(" ");
  display.println("Hello World");  //文字列挿入
  display.display();         //描画バッファの内容を画面に表示
  delay(1000);               //1秒間待ち
  }
}

github.com

こんな感じ。結構解像度が高くてきれい。

メソッド

  • setTextSize(整数を指定)で文字の大きさを指定できる。

最小サイズは1、最大サイズは9ぐらい。 最小サイズで縦8ピクセル、サイズが1増えるごとに縦ピクセルがサイズ倍になる。 - setCursor(x,y)

このモジュールの場合、 0\le x \le 128,\ 0\le y \le 64と考えていい。(x,y)は文字の左上のピクセルが表示される位置。x=128またはy=64だと画面外になるので、表示されなくなる。

  • setTextColor(文字色,背景色)

背景色はデフォルトでBLACK

通常はsetTextColor(WHITE)、色反転する場合はsetTextColor(BLACK, WHITE)

ObsidianとNotionの比較

ここ1年ぐらいNotionでメモを記録していたが、Obsidianに移行することにした。

NotionとObsidianで共通なところ

  • マークダウン記法に対応している。

Obsidianはローカル(オフライン)で.mdファイルを編集し、それらをリンクやタグなどで管理する。これはNotionは.mdファイルの代わりにページと呼ばれるだけで、殆ど同じ。ブログ・Wikiを非公開で作る感覚に近い。

地味だけど重要。Linuxに対応しているのはObsidianだけ。

Notionのいいところ

  • データベース機能が優秀
  • Chrome拡張のウェブクリッパーが優秀

これらを組み合わせると、簡単に膨大なブックマークを一括管理できる。これは画期的だった。 サイト名・URL・ブックマークした日付は自動的にデータベースに挿入される。 ↑最近はめんどくさくてタグ全然つけてない

さらに、Notionはページとページをリンクでき、ブックマークを参考文献として一発で呼び出せる。

例:Notionで「Obsidian」というページに「Obsidian AnotatorでPDFにメモを残そう」というページをリンクしているところ

  • オンライン上で同期できる

別の端末やスマホでログインすれば簡単に同期できる。画像のアップロードは容量に制限(5MB)があるものの、無料の範囲で十分使える。

  • 複数人で共同編集する機能がある。

編集権限・編集日時・誰が編集したか・編集者の連絡先などなど、専用の機能が充実している。

Notionのよくないところ

ここ1年ほどNotionでメモなんかを記録していたが、オンライン上のため重い&遅いのが煩わしい。

Obsidianのいいところ

  • ローカル(オフライン上)なのでサクサク書ける。

Obsidianにはローカルに実体があるので、サービスが終了しても殆ど問題が発生しないというメリットもある。

PDFにメモしたり、ObsidianのGit管理を自動化したりできる。

Obsidianのよくないところ

  • とっつきにくい

慣れている人からすれば設定の自由度の高さ=便利さだが、PC初心者には難しいと思う。

  • ドキュメントが英語

Notionは日本語ドキュメントが豊富だし、解説動画や記事もたくさんある。

  • オンラインで同期するには課金が必要

現在月額$8らしい。スマホでとるメモを重要視していないのであまり関係ない。

  • まだ使い始めて浅いのであまり欠点は出てこない。

まとめ

比較していいのか?ってくらい全然別物なので、それぞれいいところを併用すれば幸せになれると思います。