2015年08月



f2816b9f.jpg



ac180c9d.jpg


Raspberry Pi 2 Model B秋月電子のUSB-DAC AKI.DAC-U2704 REV.Cでスマホから操作できる無線オーディオ再生機を作ってみました。

140359f0.jpg


AKI.DAC-U2704 REV.Cは1700円と非常に安価でありながらちょっと手を加えると値段以上の音を出してくれるそうです。


そのまま組み立ててるだけでは面白くないのでこちらサイトを参考にユニバーサル基板上にRCローパスフィルタ(LPF)回路を追加しました。MiniUSBコネクターを背面に回してraspberry piと接続させたかったのでキット付属のRCAコネクターは使わないで、ケースにパネルマウント型のRCAコネクターをとりつけています。
DACキット基板のRCAコネクタ用のパターンからスズメッキ線でユニバーサル基板上のLPF回路へと配線しています。

ee9a8d1c.jpg

0a614bae.jpg

積まれていたアルミケースを利用。横置きする配置スペースがなかったので、raspberry piは天板にねじ止め。

USBケーブルがはみ出してしまうためケースの背面はフルオープンです…


0f23aace.jpg

USB無線LAN子機をラズパイに差して無線化、ドライバインストールなどしなくても自動認識してくれます。Linuxも便利になったもんです。



9526d28a.jpg


OSはVolumioを採用。これがWebブラウザからGUIで全ての操作や設定ができる優れものです。
NASをマウントすることができるのでPCに保存してある曲をスマホから選んで再生できます。スマホをリモコン代わりにゴロゴロしながら曲を選べて本当に便利!

肝心の音質ですがとても細部まで精細に聞こえると思います。今まではBluetoothをつかってスマホから再生していたのですが、同じスピーカーでもラズパイから再生すると聞こえ方が良い方に変わりました。
オーディオ沼にはまりそうです。









XbeeやI2C関係などの3.3Vで動作するモジュールって多いですよね。
電源電圧を5Vと3.3Vの二通り用意してさらにレベル変換まで用意するとなると無駄に回路が大きくなってしまいます。このため3.3Vの部品を使う場合は全体を3.3V化してしまうことが多いのですが、困るのが、動作確認のための試作時にArduinoUNOを使うと3.3Vのモジュールと直接接続できないことです。
そんなわけで手元に3.3V動作するArduinoが一台欲しくなりました。そこで、購入してみたものの眠っていたGhz2000さんのユニバーサル基板付きArduino互換機のUnicersalnoを3.3V化してみました。
c27aafc7.jpg


Universalnoの解説ページにあるように標準添付の5Vレギュレーターを秋月電子で売っている低損失三端子レギュレーター 3.3V 500mA TA48MO033FFに変えるだけです。

1c746bfb.jpg


3.3V-16MHzはマイコンの仕様外になりますが、問題なく動作しています。これでArduinoUNOのスケッチをそのまま使えます。

8d122931.jpg

あと標準で取り付けることができるスイッチサイエンスFTDIのUSBシリアルアダプタを持っていなかったため、超小型USBシリアル変換モジュール
AE-FT234X取り付け用のソケットをつけてこれでスケッチの書き込みやシリアル通信できるようにしました。

75cb7f45.png

AE-FT234Xは1個600円と比較的安く、いつもお世話になっている秋月電子で入手できるので重宝しています。発売して間もないためかネット上での情報が少ないのが困ったものです。あと難点がありシリアル変換モジュールはシリアル通信時にTXdとRXdしか入出力できないため、スケッチ書き込み時に、コンパイルが終了したあたりでタイミングよくリセットスイッチを押してあげないとタイムアウトで書き込みエラーになります。






色々と工作をしていると試作用に可変電源が欲しくなりました。
可変電源キットは色々売られていますが、電子工作を始めたきっかけがオペアンプを使ったポテンショスタットの自作で、両電源高精度オペアンプOP-07DPを使用することが多かったため両電源が得られ、試作回路の消費電流も把握できる電流計付きの可変電源を作ろうと決心。

5fbc3f84.jpg

LEDに直接電圧をかけて光らせているところ。
ほぼ仕様書通りの電圧で20mA流れています。


主な仕様は下記です。
最大3A-15V
100Aレンジと3Aレンジの電流計付き
VccとGNDのちょうど半分の電位のimgGNDを電位を出力

b8859939.png

電圧は上の回路図のように可変電圧レギュレーターLM350Tで調整します。AC100VからDCにはACアダプタを使います。
最初組み立てたとき、LM350Tのまわりにつけた保護ダイオードが逆向きに実装してしまって電流リーク状態になってヒヤリとしました。

この可変電源で生成した電圧から単電源オペアンプLMC6484とトランジスタからなるレールスプリッタ回路で1/2の電圧を取り出してこれをImgGNDにします。


e547c562.jpg

組立後の内部はこんな感じで液晶まわりの配線などでもじゃもじゃ。
放熱フィンが小さいので大電流の連続運転は今のところ無理です。



0aece804.png


今回一番悩んだのが電流測定回路です。
電流測定はグランド側を測るローサイドとVcc側を測るハイサイドがあります。
ローサイド測定ではグランド配線に電流測定抵抗を入れることになるため、出力されるグランド電位と電源内部のグランド電位に差が出てしまいます。
一方でハイサイド測定する場合には、電源電圧すれすれのところを測定しなければいけないため、LM358Nといった汎用の単電源オペアンプでは測定と増幅が困難です。

2016/2/11追記 電流測定オペアンプのプラス入力端子とグランドの間の100kΩと470kΩの抵抗がシャント抵抗を通じて並列にグランドに落ちていました。このため計算通りに増幅できていません。Range selectスイッチは入側だけでなく出側も切れるようにすべきでした。スケッチでは電流を実際に流してみて無理やり合わせこんでいます。

そこで今回は電源電圧を直接入力でき、オフセット電圧も比較的少ないレールtoレールオペアンプLMC6484を使うことにしました。電流測定抵抗で発生するわずかな電圧ドロップをLMC6484による差動増幅回路で増幅してマイコンのアナログ入力で読み取ります。レールtoレールオペアンプなので電源電圧を直接取り扱うことができて簡便かつ比較的正確です。

cc67266d.jpg

上の写真の14ピンのICが今回の主役ともいえるLMC6484です。ImgGNDの生成、2レンジの電流測定、電圧測定を4役こなしてます。


5e1ee3d0.png

上図が全体の回路で、液晶表示と電流値の算出はArduino化したAtmega328PUが行います。
なるべく正確な出力電圧と電流を測定したかったので基準電圧をNJM1431AからとってAtmegaのArefに入れています。

使用したスケッチは以下です。
D7への入力電圧でレンジの切り替えを判断します。
高負荷運転時の温度変化も見たかったので、温度センサLM62BZを2か所仕込んでおり、
測定結果をシリアル出力できるようになってます。


========================================================
//定電圧電源スケッチ、電流測定機能付きVer2
const float AREF   = 2.465; //(単位V)
//変数の定義
float v = 5;
float currenthigh = 0;
float currentlow = 0;
float voltage = 0;
float temp = 0;
float valueA0 = 0;
float valueA1 = 0;
float valueA2 = 0;
float valueA3 = 0;
float tv = 0;
int sumA0 = 0;
int sumA1 =0;
int sumA2 =0;
int sumA3 =0;
int dataA0 = 0;
int dataA1 = 0;
int dataA2 = 0;
int dataA3 = 0;


//LCDライブラリの読み出し
#include <LiquidCrystal.h>


// initialize the library with the numbers of the interface pins

LiquidCrystal lcd(12, 11, 5, 2, 3, 4);

  
void setup() {

  

  analogReference(EXTERNAL);

  pinMode( 7, INPUT_PULLUP);

  

  lcd.begin(16, 2);

  lcd.setCursor(0, 1);

  lcd.print("Current:");

  lcd.setCursor(0, 0);

  lcd.print("Voltage:");


  Serial.begin(9600);

  while (!Serial) {}  

  Serial.print("Votage");

  Serial.print(",");  

  Serial.print("Current");

}


void loop() {

  //センサーピン0のHigh電流センサーの値を読み取る

  //センサーの値を50回読み取り平均化する

 sumA0 = 0;

 for (int i = 0; i < 50; i++) {

  dataA0 = analogRead(A0);

 sumA0 = sumA0 + dataA0;

 delay(2);

 } 

  valueA0 = sumA0 / 50;

  

  //読み取った値を電流値に変換(A)

  currenthigh = (valueA0 / 1023.0 * AREF) * 0.9 ;

  

  //センサーピン1のLow電流センサーの値を読み取る

  //センサーの値を50回読み取り平均化する

 sumA1 = 0;

 for (int i = 0; i < 50; i++) {

  dataA1 = analogRead(A1);

 sumA1 = sumA1 + dataA1;

 delay(2);

 } 

  valueA1 = sumA1 / 50;

  

  //読み取った値を電流値に変換(mA) 最後の括弧は校正値

  currentlow = (valueA1 / 1023.0 * AREF) * 100/1.2 ;

  

   //電圧入力端子A2の値を50読み取り平均化する

  sumA2 = 0;

 for (int i = 0; i < 50; i++) {

  dataA2 = analogRead(A2);

 sumA2 = sumA2 + dataA2;

 delay(2);

 } 

  valueA2 = sumA2 / 50;


   //読み取った値を電圧に換算 最後の括弧は校正値

    voltage = (valueA2 / 1023.0 * AREF) * (100 + 4.7) / 4.7 * (5 / 5.58);

    

  //センサーピンA3の温度センサーの値を読み取る

  //センサーの値を50回読み取り平均化する

 sumA3 = 0;

 for (int i = 0; i < 50; i++) {

  dataA3 = analogRead(A3);

 sumA3 = sumA3 + dataA3;

 delay(2);

 } 

 
valueA3 = sumA3 / 50;

//読み取った値を温度に換算
= valueA3 / 1023 * AREF ;

// センサー値を電圧に変換する
temp = (tv - 600) / 10 - 5 ;

// 電圧から温度に変換する

Serial.print(currenthigh);
Serial.print(",");
Serial.println(currentlow);
Serial.print(",");  
Serial.println(voltage);
Serial.print(",");
Serial.println(temp);

//A0端子に電圧がかかっている時(測定レンジHigh)はHigh電流センサーの値を表示

  //A0端子に電圧がかかっていない時(測定レンジLow)はLow電流センサーの値を表示

if (digitalRead(7) == HIGH){
lcd.setCursor(8, 1);
lcd.print(currenthigh);
lcd.setCursor(13, 1);
lcd.print("  A"); }
else{
lcd.setCursor(8, 1);
lcd.print(currentlow);
lcd.setCursor(13, 1);
lcd.print(" mA"); }
lcd.setCursor(8, 0);
lcd.print(voltage);
lcd.setCursor(13, 0);
lcd.print(" V ");
//次のループまで待つ
delay(100);







be4c09f4.jpg

電子工作をやっているとマイコンが欠かせません。生のAtmegaにブートローダーやスケッチを書き込むためのブートローダ/スケッチライタを作りました。

ちょうどUSBシリアル変換モジュールを持っていなかったため、超小型USBシリアルモジュールAE-FT234XをとりつけてこれでPCと通信します。
シナプスハード制作記さんの記事を参考に作った回路は以下です。一部のLEDは省略してます。
左側のマイコンがArduinoとして機能し、右側のマイコンにブートローダやスケッチを書き込みます。

2f3f24b9.png



超小型USBシリアルモジュールAE-FT234Xが下の写真のもので、一円玉より小さいです。
d7f51708.jpg


ユーティリティソフトのFT progを使えばCB0の出力内容を変えることができます。
今回はRX/TXが通信しているのがわかるようにLED点灯用の出力を出すようにして、すずめっき線をつけて、8ピンのICソケットに乗せています。
ただ、こいつは困った点がひとつだけあって、機能をしぼりすぎて、5V,GND,TxD,RxDとオマケのCB0しか端子がないです。Arduinoはシリアル通信を使ったスケッチ書き込み時にDTRをつかってリセットをかけているため、TxDとRxDだけでスケッチを書き込もうとすると自動でリセットがかからずエラーになってしまいます。これを回避するため、左側の親Atmegaにスケッチ書き込み時にタイミングよくリセットボタンを押す必要があります。


2c08b05a.jpg

あと、一度組み上げた作品のスケッチ修正の際に使える出力コネクタを設けてみたところとても便利でした。ターゲットなる作品のAtmegaにもResetとD11~D13に接続できるコネクタを用意しておけばこのコネクタを接続するだけで、Arduino IDEを使って、マイコンの取り外しをすることなくスケッチの修正が行えます。









記録的猛暑が続いてエアコンがガンガン稼働して電力使用状況が気になります。リアルタイムで使用状況を測定できたら面白いんじゃないかと思って、Arduinoで電力ロガーを作りました。b15f8a9a.jpg

試作1号機
Xbeeで測定データをPCにシリアル通信で送信してロギングします。
Xbeeシールドにまとめてみました。

84926689.png

測定回路はメーカーの技術情報を参考に、こんな感じで共立エレショップで買ったクランプセンサーCTL-10-CLSで交流電流測定し、ショットキーダイオードブリッジによる整流回路で直流化してからレールtoレールの単電源オペアンプNJU7043D(LMC64でも問題なかたです)で電圧を増幅してArduinoのアナログ入力で電圧を測定します。
メーカーの技術資料とにらめっこして、測定したい電流値と出力電圧からオペアンプの増幅率を決めます。

計測部分は割とすんなり動いたのですが、Xbeeの設定が一番苦労しました。
とにかく、PAN IDの設定やらなにやらなかなかうまく通信できずここに一番時間を採られてしまいました。
ネット上の情報が多かったためXbeeにしましたが、今思えばTWE-liteにすればよかったかもと思ってます。
あと、Xbee最初はシリーズ1のPCBアンテナを使用していましたが、1Fと2Fでは通信が安定しなかったため
後でシリーズ2のワイヤアンテナ型に変更しています。

12821853.png


11年前の冷蔵庫と2014年モデルの冷蔵庫の電力を測定してみた結果がこれです。
どちらも間欠動作をしてて、2014型では、わずかしか電力を消費しないアイドル時間が明らかに長くなってます。
消費電力量に直すと2014年型はだいたい550Wh/dayで11年前のものは1400Wh/dayと明らかに省電力化が進んでいることがわかりました。

スケッチはこんな感じです。
今回はArduino Leonardを使ったので、シリアル通信のところに Serial1.を使ってます。
ついでに温度計もつけてます。

---------------------------------------------------------------

const float AREF   = 5000.0;   /* 電源が3.3[V]のときは 3300.0 */

const int   OFFSET = 1508.0;   /* 30℃での出力電圧[mV] */

//センサーに接続したアナログピンの番号

float sensor1Pin = A1;

float sensor2Pin = A3;

//変数の定義

float v = 5;

float temp1 = 0;

float temp2 = 0;

float watt = 0;

float voltage = 0;

float value1 = 0;

float value2 = 0;

double value3 =0;

int sum = 0;

int sumv =0;

int data = 0;

int datav = 0;

//LCDライブラリの読み出し

#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

  

void setup() {

  lcd.begin(16, 2);

  lcd.setCursor(0, 0);

  lcd.print("Temp:");

  lcd.setCursor(0, 1);

  lcd.print("Watt:");

  Serial1.begin(9600);

  while (!Serial1) {}  

  Serial1.print("Temp");

  Serial1.print(",");  

  Serial1.print("Watt");

}

void loop() {

  //センサーピン1の温度センサーの値を読み取る

  //センサーの値を50回読み取り平均化する

 sum = 0;

 for (int i = 0; i < 50; i++) {

  data = analogRead(sensor1Pin);

 sum = sum + data;

 delay(2);

 } 

  value1 = sum / 50;

  

  //センサーピン1の値を読み取る

  value2 = analogRead(sensor1Pin);

  

  //読み取った値を温度に換算

  temp1 = 30.0 - (value1 / 1024.0 * AREF - OFFSET) / 8.0;

  temp2 = 30.0 - (value2 / 1024.0 * AREF - OFFSET) / 8.0;

  

   //電圧入力端子sensor2Pinの値を50読み取り平均化する

  sumv = 0;

 for (int i = 0; i < 50; i++) {

  datav = analogRead(sensor2Pin);

 sumv = sumv + datav;

 delay(2);

 } 

  value3 = sumv / 50;

  

   //sensor2Pinの値を電圧に変換

   voltage = ( datav / 1024.0 * AREF );

   //読み取った値を電力に換算

    watt = (value3 / 1024.0 * AREF * ( ( 30 * 1 ) / ( 0.9 *  4.7 ) * 100 / 1000 ));

  

  Serial1.print(temp1);

  Serial1.print(","); 

  Serial1.print(voltage);

  Serial1.print(","); 

  Serial1.println(watt);

  

  lcd.setCursor(6, 0);

  lcd.print(temp1);

  lcd.setCursor(11, 0);

  lcd.print(" deg.");

  

  lcd.setCursor(8, 1);

  lcd.print(watt);

  lcd.setCursor(12, 1);

  lcd.print(" W ");

  

  //次のループまで1秒待つ

  delay(1000);

}

------------------------------------------------------------------

本格的にロガーで記録を採り続けるとなると、Arduinoが一台取られてしまうのが勿体ないので、ATmega328PUを単体利用しArudino化して専用の基板を作ってみました。
IMG_20150813_091712192.jpg

e6646124.png


回路図はこんな感じです。
スマホの充電器が余っていたので電源はマイクロUSBから5Vをとって、レギュレーターで3.3Vとして全体に供給しています。
Xbeeが3.3Vで、5V駆動のAtmegaと電源回路を分けたりレベル変換したりするのは面倒だったのでAtmega328PUも3.3Vで動作させました。
3.3VではUNOと同じ16MHz駆動は仕様外となってしまいますが今のところ問題なく動いています。

c7f0af08.jpg

ケースに入れて液晶モジュールを付けたところ。


配電盤の空きスペースに取り付けます。



db42ba5c.jpg

受電側の赤のラインと黒のラインにクランプセンサを二つ取り付け。

3ca805aa.png

2月から6月までの測定結果はこんな感じです。
朝と夕方に二つのピークが現れており、電子レンジや洗濯機、あと食器洗い機の消費電力が大きなウェイトを占めていることが予想されます。また、冷暖房をほとんど使用しない5,6月は全体的に使用量が明確に減っていて面白いです。

電力の使用状況が見える化できて、どこでたくさん使っているかわかってきてなかなか有意義な工作でした。
現在も稼働中。

このデータ、Tera Termというソフトで1分ごとにタイムスタンプ付きタブ区切りテキストで記録されてます。
集計が地味に大変です。









↑このページのトップヘ