ラベル 電子工作 の投稿を表示しています。 すべての投稿を表示
ラベル 電子工作 の投稿を表示しています。 すべての投稿を表示

2016/01/19

イカ通話のためにオーディオミキサーを作った

最近ブログを放置してたのですが、久々に電子工作ネタができたので投稿します。
タイトルの通り、オーディオミキサーをつくってみました。


オーディオミキサーとは、複数の音声入力を合成して出力する装置です。
具体的に言うと、Splatoonのゲーム音と、Skype通話の音声と、WALKMANの音楽を一つのイヤホンで聞きたい人のための装置」です。

市販品でもミキサーは売ってますが、電子工作マンとしては自作したいところ。
というわけで回路図です。



オペアンプを使った加算回路で入力音声を合成して、出力しているだけです。
各チャンネルの音量調整のために、オーディオ用2連ボリュームを使ってます。(破線でつながっている可変抵抗器が1つのパッケージに入ってる)

上の加算回路だと出力が反転してしまうので、後段に反転増幅回路を設置してます。(利得は20dB)


金曜日の夜に思い立って設計して、土曜日の朝に秋葉原で部品を買い、午後からはんだづけカフェで製作しました。お手軽電子工作です。

実際に使ってみた感じだと、実用上問題ない感じです。(無音の時に若干ホワイトノイズが入っているのが少し気になるかも。)
別段音質を気にしない方なら、普通に使えると思います。

値段は全部合わせて1500円ぐらい。
スプラトゥーンをやってる人で電子工作ネタがない人は、ぜひ週末に部品を買い漁ってからはんだづけカフェへ行きましょう。

2014/10/12

【ジャイロセンサ、加速度センサ】ティーポッドを回す

台風19号が近づいて来てるせいか、風が強いです。
家が吹き飛びそうですが、なんとか生きています。


それはそうとして、以前このブログにも何回か載せた傾き検出を、分かりやすく可視化してみました。
OpenGLを使って、マイコンから得た傾きデータを元に、3Dティーポッドを動かしています。



今はピッチとロールだけしか反映させていません。
ヨーを反映させるなら地磁気センサの値を使ったほうがいいかもしれません。(ジャイロセンサだとドリフトが発生する)

2014/10/09

FETゲートドライバのIR2302を使ったモータドライバ

秋月に売ってるIR2302ゲートドライバを使ったNchFETフルブリッジモータドライバです。



FETは、IR社のIRFB4410PBF(100V 96A 250W)を使っています。

IR2302は、ハーフブリッジ用のゲートドライバです。
NchのみでHブリッジなどを組むと、ハイサイドFETの駆動電圧をどうやって上げるかが問題になりますが、このICではブートストラップ方式で昇圧を行い、ハイサイドFETの駆動を行っています。
ICでデッドタイムなども挿入してくれているらしいです。(540ns程度)

ロジック入力に入れるPWMの周波数は、10kHzまでは動作を確認しています。
モータに負荷をかけた状態や、回転方向の切り替えを短時間に何回も行った場合の動作確認をしていないので注意。(540モータを2つ同時にぶん回すことは可能)

このICは、モータ側の電源と、ロジック側の電源のGNDが共通になっています。
データシートにはちゃんと絶縁されていると書かれているので大丈夫とは思いますが、気になる方は、フォトカプラをつけるなり何なりお願いします。(僕は、マイコンのロジックを直接繋げてますが、壊れたことは無いです。)

ロジック入力

00 : ローサイドブレーキ
01 : 正転
10 : 逆転
11 : ハイサイドブレーキ(非推奨)


使うときの注意点


  • 最大定格電圧は、FET、ゲートドライバ、ダイオード、パスコンの定格電圧のうち、最も低いものになります。これを超えたら死にます。(回路図では、パスコンが一番低いので、50V)
  • ゲートドライバへの電源(回路図のVd)に20V以上かけると、もれなくゲートドライバとFETが死にます。
  • ロジック入力を長時間Highにしていると、ブートストラップコンデンサの電荷が放電されてしまい、モータが停止します。そのため、必ずPWM制御等でLowの時間を取るようにしてください。
  • パスコンを取り付けないとスパイクノイズがひどいので、必ず取り付けるように。
  • 最大定格電力を超えないようにしてください。
    (参考:http://abcdefg.jpn.org/elememo/swfet/cc.html



「100Aは雑魚」

という変態な人たちもいると思うので、そういう場合はFETをもっと強い奴にするかIGBT等に変えてください。

2014/06/20

RasPiで9軸センサーを動かす

Raspberry PiでI2Cを使って9軸センサー(MPU9150)を動かしてみました。
今後も使う可能性あるので自分メモです。

RasPiでI2Cを使うのに参考にした(丸パクリしたともいう)サイトは次のサイトです。
http://www.instructables.com/id/Raspberry-Pi-I2C-Python/all/?lang=ja


環境

実機 :Raspberry Pi Model.B
OS  :Raspbian
センサ:9 Degrees of Freedom Breakout - MPU-9150

1.RasPiのI2Cを有効化する。

RasPiのI2Cはなぜかデフォルトでは使えません。
/etc/modprobe.d/raspi-blacklist.conf にある設定ファイルを変えると有効化できます。

$ sudo vi /etc/modprobe.d/raspi-blacklist.conf

ファイルをエディタで開きます。

blacklist spi-bcm2708
blacklist i2c-bcm2708

blacklist i2c-bcm2708をコメントアウトします。

blacklist spi-bcm2708
#blacklist i2c-bcm2708

これでI2Cが有効化されました。

2.カーネルのI2Cモジュールを有効化する。

/etc/modulesを編集して、I2Cモジュールを読み込むようにします。

snd-bcm2835

の末尾に、i2c-devを追加します。

snd-bcm2835
i2c-dev

3.パッケージをインストールする。

apt-get updateを実行してから、i2c-toolsと、python-smbusをインストールします。

$ sudo apt-get update
$ sudo apt-get install i2c-tools
$ sudo apt-get install python-smbus

終わったら再起動します。

$ sudo reboot

再起動が終わったら、インストールしたソフトがちゃんと動いてるか確かめます。

$ sudo i2cdetect -y 1
    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

こんな感じの表示が出れば大丈夫です。

i2cdetectコマンドの引数は、RasPiのタイプ(?)によって違うのを用いるみたいです。
参考サイトでは引数を0にしていますが、今回用いたRasPi、Model.B(メモリが512MBのほう)では、引数を1にするとうまくいきました。

4.9軸センサを実際に接続してみる。

RasPiの外部端子と9軸センサを接続します。使うのは3.3V,GND,SDA,SCLのみです。
RasPiの端子配列は(http://elinux.org/RPi_Low-level_peripherals)を参考に。

9軸センサの端子は、センサボードごとに調べてください。

I2Cなので、SDAとSCLにプルアップ抵抗は必要です。
センサボードに搭載されてなければ、自分で抵抗を接続してください。

5.Pythonで通信するコードを書く。


import smbus
import time

class Mpu9150:
 
    def write(self, register, data):
        bus.write_byte_data(self.address, register, value)
        return 0

    def read(self, register):
        data = bus.read_byte_data(self.address, register)
        return data

    def __init__(self):
        self.bus = smbus.SMBus(1)
        self.address = 0x68

        #ここにセンサ初期化用の処理


if __name__ == '__main__':
    mpu = Mpu9150()
 
    while True:
        #何らかの処理

だいたいこんな感じです。
センサのI2Cスレーブアドレスは用いるセンサのマニュアルを参照してください。

このプログラムには例外を組み込んでないので通信が失敗したらクラッシュします。注意。



大体こんな感じでI2C通信ができました。
Pythonだと楽ですね。

今回はPythonのコードを書いてI2Cを行いましたが、シェル上からコマンドでI2Cすることも出来るようです。C言語でも同じようなコードが書けるようなので、知りたい方はグーグル先生へ。

では。


2014/05/05

ジャイロセンサで遊ぶ

ジャイロセンサ(9 Degrees of Freedom センサスティック)を使っていろいろ実験。
ゆくゆくはセグウェイもどきを作る予定。

実験方法

ジャイロセンサを地面に置いた状態を初期値とする。
ジャイロセンサを傾けてみて、元に戻す。
これを何回か繰り返す。

CPU : Arduino UNO
センサ : 9 Degrees of Freedom センサスティック

ジャイロセンサの設定

Sample rate :1000Hz
Digital LPF :47Hz

センサ値の取得は1軸のみ。


1.補正無し

ジャイロセンサから100ms間隔でデータ値を取る。このデータ値、つまり変化量は赤線で表す。
取得したデータ値を変数に加算していって積分する。このデータは現在角度で緑線で表す。


だんだんと誤差が増えていっている模様。


2.オフセット、平均補正を付加

起動時、センサの値を20ms間隔で5回取得し、この平均をオフセット値とする。

センサ値を20msで5回取得した平均を取ったものを変化量とする。変化量は赤線。
変化量を加算した(積分した)のが現在角度。角度は緑線。


補正よりはマシになった。何回か動かすだけならば問題ないみたい。



課題

オフセットと平均補正を取ったら改善はした。
が、どうしても少しずつズレていっているみたい。
これをどうにかする。

2014/01/20

電ちゃんのLEDアクリルプレートつくった


電ちゃんかわいい!!

アクリルプレートにいつぞやに描いた電ちゃんをレーザーで焼いてもらいました。
せっかく頂いたので、LEDアクリルプレートに改造。

回路は簡単。
単三電池4本に、抵抗と青色LEDセット5つを接続した回路を作るだけ。

プレート台は、パーティクルボード(5mm厚)を使用。
特に設計もせずにけがいて切り出したので、若干バランスが悪いです。


そしてアクリルプレートの上のほうに、接着面が銀色のテープを張ります。
こうすると、より綺麗にくっきりと線が光ります。


フルカラーLEDとかを使っても良かったんですが在庫がなかったのでとりあえず青色LEDを使いました。
マイコン載せてグラデーション制御してもよさそうですね。

2014/01/06

TWE-Liteモジュール使ってみた

秋月電子に半年前ぐらいに入荷してたTWE-LliteというZigBeeワイヤレスモジュールを使ってみました。
http://akizukidenshi.com/catalog/g/gK-06759/


お値段は1つで1500円程度。
XBeeの安いやつが秋月で1700円ぐらいだったので同じぐらいの値段ですね。

大きさは28ピンDIP(600mil)と同じです。
ピッチは2.54mm。XBeeは2mmピッチなので、こっちのほうが便利。


で、なんとこのモジュールは初期状態で通信ができます。
ディジタル信号を送信できたり、送信側のアナログ入力の電圧値からPWM波を出せたりします。

便利そうだし、XBeeより安いからという理由で買ってもらいました。(部費で)
が、結局使ってなかったので使ってみました。


とりあえずLEDリモコン。


ちゃんと通信できてるみたいです。
これはディジタル信号通信を使ってます。(付属説明書に書いてました)


調べてみると意外と高機能で、内部にマイコンがあって外部からプログラムを焼けるそうです。
つまりこのモジュールにモータドライバをつければ簡単なラジコンが出来ますね。


あと、モジュールの識別をどうやったらいいのか分からない等、色々分かってないので下級生の人たちに押し付けたいと思います。(

ここ最近ロボコンではリモコンも使わないし、ロボット同士の通信は禁止だしで、無線モジュールの使いどころは減ってるので寂しいところ。
イベント用などのロボットでは使ったりするので無用という訳ではないんですけどね。


ちなみに、面実装型のモジュール(http://akizukidenshi.com/catalog/g/gM-06896/)や、書き込み器(http://akizukidenshi.com/catalog/g/gK-06893/)も秋月にあります。


では、これぐらいで。

2013/12/24

電磁弁駆動回路メモ

エアシリンダーなどを駆動するとき、欠かせないのが電磁弁。
ロボコンでも使っているのをよく見かけます。


僕もロボコンでエアシリンダを使うことになったので回路を設計したのですが、それについて書きます。自分用メモの意味合いが強いので、あしからず。


電磁弁は「電磁」弁ですから、電気信号で制御できます。


うちで使っている電磁弁を例に挙げます。

「ミスミ 電磁弁5ポートタイプ シングルソレノイド DC24V」
(詳細はリンク先参照)


では、駆動回路の設計に入ります。

いきなりですが、回路図です。

図中のコイルは、電磁弁のソレノイドです。

カタログではDCの消費電力は1.6W。
24Vをかけたら66.7mA流れますね。(たぶん)

マイコンのGPIOでは電流不足なのでトランジスタで増幅してやります。
とりあえず2SC1815を使うことにします。
カタログ値ではhfeが25~100です。25として計算すると

Ib = Ic / 25 = 66.7 / 25 ≒ 2.7[mA]

なのでベース抵抗は、

R = (GPIOの電圧) / Ib = 3.3 / 0.0027 ≒ 1222[ohm]

近い値の1kΩを使うことにします。


念のため電力計算。
2SC1815の飽和Vceは0.25[V]なので、

P = 0.25 * 0.0667 = 16.7[mW]

たぶん大丈夫ですね!


これで駆動回路は完成です。

が、ここまで設計して、僕はあることに気づきました。

「電源24Vを用意するのめんどくさい!」

Ni-CdやLi-Po、Li-Feなど、24Vの電源なんてあんまりありません。
直列に接続すれば解決しますが重さの問題もあり、なんだかなぁ。

なので昇圧回路を使います。

LM2733 昇圧型DC-DCコンバータモジュール(12V~最大36V)
入力電源5V、出力電圧24Vの場合、電流は150mAまで流せるそうなので、きっと大丈夫です。

電圧の調整ですが、基板上の可変抵抗をドライバー等で回して出力を24Vに調整します。



こんな感じの回路を、今年のロボコンの回路に使いました。
特に問題なく動作したので大丈夫かと。

トランジスタの回路設計は基本中の基本なので、うちの部員なら問題なく出来るよね?
なのでこの記事は、オススメの昇圧回路があるよって話です。はい。


では、これぐらいで。

2013/10/10

AVRマイコンを使った簡単な音信号処理 -回路図-

どうも、Nekosanです。


前回の記事、AVRマイコンを使った簡単な音信号処理の続きです。

PCのフォルダをまさぐっていたら、回路図を発見したので載せます。

実際に作った回路とは少し違います(シリアル通信の端子が無かったり、LEDが無かったり)が、マイクアンプ周りは大体同じ、はずです。

グーグル先生で調べたサイトに載っていた回路図をパク...参考にして作りました。
単純な反転増幅回路ですね。
倍率は、OUT1と-1端子につながっている抵抗と-1端子からマイク側のコンデンサにつながっている抵抗との比率で求められたはずです。
反転増幅回路とググればきっと出ます。

たぶんここを参考にして作ったはずです。
https://www.marutsu.co.jp/user/mame/187.htm

よく分からず作りましたが、ちゃんと動いたので問題なしです。


使ったオペアンプはNJM2732Dです。
単電源でフルスイング入出力だったので採用しました。
秋月で売ってます。→http://akizukidenshi.com/catalog/g/gI-04723/


回路はこんなものですかね。
問題はプログラムですが、眠いので寝ます。

では。

2013/10/07

AVRマイコンを使った簡単な音信号処理

どうも、Nekosanです。

昨日、高専ロボコン九州大会がありました。

その大会に出場したロボットに積んでいた回路について、自分メモを兼ねて記事を書きます。


今年のロボコンは、コントローラー無しで、ロボットに触って操作してもいけないというルールです。
なので、笛を吹いて、その音を聞き分けることでロボットを操作しようと考えました。


そのためには音、今回は笛を使っているので、笛の音を聞き分けることができる回路が必要です。
で、作ったのがコレ

\デーン/


コンデンサマイクの信号をオペアンプで増幅して、マイコンのA/D変換ピンに接続してるだけ。
素晴らしく単純!!!

ただし、ただ音の大きさを調べるだけでは、歓声やロボットの動作音で誤動作する可能性が大きいです。
そこで、フーリエ変換という信号処理を行い、検出の精度を上げています。
フーリエ変換→http://d.hatena.ne.jp/Zellij/20120612/p1


マイコンはATMega328Pを使い、外部クロック16MHzで動作させてます。

信号をA/D変換した後、フーリエ変換で信号を周波数成分に分けます。
波形の中に、どの周波数がどれくらい在るかが分かるので、これを利用して笛を聞き分けてます。
笛の音の判別は、「どの周波数成分が強いか?」を調べて行っています。

フーリエ変換のアルゴリズムはここを参考にしました。
http://www.kurims.kyoto-u.ac.jp/~ooura/fftman/
http://www.kurims.kyoto-u.ac.jp/~ooura/fftman/ftmn1_2.html#sec1_2


実際にこの回路を使って出場しましたが、よく反応してくれて、歓声などの外乱もあまり影響を受けていないようでした。


詳しいことはまた別の記事に書こうかと思っているので、これぐらいで。

では。

2013/05/04

加速度センサで角度検出してみるの巻

【2014/10/12 記事更新】


前回の記事(http://nekolab.blogspot.jp/2013/05/arduino.html)で、加速度センサ(ADXL345)を動かしてみました。


今回は、センサから得た値の計算をして、センサの傾きを検出してみようと思います。


前回の記事で、加速度センサに傾き検出が~、と書いてましたが、加速度センサは重力加速度も検出するというコメントを頂きました。


と、いうことはですよ、重力がどの向きにかかっているのかを検出することで、センサがどれだけ傾いているかを検出できるということですね。

スマホの画面の向きが変わるやつとかはこれを利用してるのか...知らなかったです。
加速度センサで傾きが分かるとは思わなかったので。



デバイスはArduinoで、前回と大体同じです。


ちょこっとだけプログラムが変わっています。

センサの値を取得するのは前回の記事と変わりません。


このセンサの値ですが、重力加速度がそのまま出力されているわけではありません。

センサに設定してあるスケール(今回は±16g)の範囲で、13bitの分解能(高分解能モードの場合)で出力されます。

出力が1だけ変化したときの重力加速度の変化は、

(16 + 16) / 2^13 = 0.00390635

と、約3.9mgです。


センサ出力の値に0.0039を掛けると、重力加速度に変換できます。

ただしこれは、±16gのスケールと13bitの分解能の場合です。
センサの設定が違えば、この値も変わってきます。



センサの値を重力加速度に変換できたら、X軸の回転角と、Y軸の回転角を求めます。



上図で、OX向きをX軸の回転軸とします。同様にY軸もOYを回転軸とします。

OZは重力加速度で、常に1gの大きさがあります。

また、上図には書いてませんが、角OXZ、角OYZ、角XOYは直角です。


この図で、θxがXの回転軸の角度、θyがYの回転軸の角度です。

θx、θyを求めれば、センサがどれだけ傾いているかがわかります。



上図は、OXZの三角形を抜き出したものです。


これからθxを求めるには、OZとOYの大きさが分かっていれば求められます。

OZは重力加速度なので常に1です。

OYはY軸方向の加速度で、センサの出力から求められます。


よって、θxは、

θx = sin^-1(OY / 1)[rad]

で求められます。


sin^-1はアークサインで、直角三角形の斜辺と求めたい角に接しない辺の長さから、求めたい角の大きさを求める三角関数です。

また、この計算結果は弧度法(ラジアン)で与えられるため注意が必要です。(C言語のmath.hの場合)



同様に、θyについても計算を行うと、もう片方の軸の角度を求めることができます。



さて、これを実際にArduinoで実装してみます。


#include
#include

int acc_address = 0x53;
long acc_x, acc_y, acc_z;
double g_x, g_y, g_z;
double x_rol, y_rol;


void setup()
{
  Serial.begin(9600);
  
  Wire.begin();
  
  Wire.beginTransmission(acc_address);
  Wire.write(0x31);
  Wire.write(0x0B);
  Wire.endTransmission();
  
  Wire.beginTransmission(acc_address);
  Wire.write(0x2d);
  Wire.write(0x08);
  Wire.endTransmission();
  
  delay(1);
}

void loop()
{
  Wire.beginTransmission(acc_address);
  Wire.write(0x32);
  Wire.endTransmission();
  Wire.requestFrom(acc_address, 6);
  if(Wire.available() > 5){
    acc_x = Wire.read();
    acc_x = (Wire.read() << 8) | acc_x;
    acc_y = Wire.read();
    acc_y = (Wire.read() << 8) | acc_y;
    acc_z = Wire.read();
    acc_z = (Wire.read() << 8) | acc_z;
  }
  
  
  g_x = acc_x * 0.0039;
  g_y = acc_y * 0.0039;
  g_z = acc_z * 0.0039;
  
  x_rol = asin(g_y / 1) * (180 / 3.1415);
  y_rol = asin(g_x / 1) * (180 / 3.1415);
  
  Serial.println(g);
  Serial.print("X_rol:");Serial.println(x_rol);
  Serial.print("Y_rol:");Serial.println(y_rol);
  
  delay(100);
}


大体こんな感じです。

シリアル通信で、PCに傾きの値を送信しています。



しかし、この加速度センサは、静止状態では傾きが分かりますが、水平方向に加速度が働くと、正しい値を得られません。

逆に、傾いた状態で、水平方向の加速度を測定することもできません。


じゃあどうするか?

加速度センサ以外のセンサを使って、傾きを検知すればいいのではないか?と思います。


というわけで、ジャイロセンサと加速度センサを使って、傾きと加速度を検出できるようにしたいと思います。


でもまだやってないので、また今度です。


【2014/10/12追加】
加速度センサとジャイロセンサを使って、傾きを検出する方法を書きました。
https://sites.google.com/site/nekolabwiki/electronic/posturecontroll

以下、参考文献、またはサイト
http://www.geology.smu.edu/~dpa-www/robo/balance/inertial.pdf
https://sites.google.com/site/yamagajin/home/filter
http://www.slideshare.net/rogy01/6-32797657

2013/05/03

加速度センサーをArduino使って読み取ってみる

部の顧問の先生から、こんなモジュールを頂きました。


加速度センサ(ADXL345)と方位センサ(HMC5883L)とジャイロセンサ(ITG-3200)が一つの基板にまとめられたモジュールです。

ストロベリーリナックスで売られてました。
一個で一万円ぐらいします。

学生の自分にはなかなか手が出せませんね。


せっかく頂いたので、使ってみようじゃないかということで、使ってみました。


このモジュール、Arduinoを使えと言わんばかりに、Arduinoのシールドにはんだ付け済みでした。

手元にArduinoがあるので、これで動かしてみます。




今回は3つあるセンサのうちの一つ、加速度センサ「ADXL345」というセンサを使ってみます。
http://www.analog.com/static/imported-files/jp/data_sheets/ADXL345_jp.pdf




このセンサは、SPI通信か、I2C通信を用いて、通信をします。

センサは基板にはんだ付けされていて、このモジュールではI2C通信はできません。
そのため、I2C通信を使います。


ADXL345の使い方を簡単にまとめてみます。



・ADXL345を測定モードにする
POWER_CTL(0x2D)のD3をセット。


・測定レンジを変える
DATA_FORMAT(0x13)のD0,D1で測定レンジを変えられる。
D0 = 0, D1 = 0 : ±2g
D0 = 1, D1 = 0 : ±4g
D0 = 0, D1 = 1 : ±8g
D0 = 1, D1 = 1 : ±16g


・最大分解能モードにする
DATA_FORMAT(0x13)のD3をセット。


・サンプリング周波数を変える。
BW_RATE(0x2C)のD0:D3を変えることで、サンプリング周期を変えられる。


Rate (Hz)  Bandwidth (Hz)    Rate Code
3200         1600          1111
1600         800                    1110
800           400                    1101
400           200                    1100
200           100                    1011
100           50                     1010
50             25                     1001
25             12.5                   1000
12.5           6.25                   0111
6.25           3.13                   0110
3.13          1.56                    0101
1.56           0.78                   0100
0.78           0.39                   0011
0.39           0.20                   0010
0.20           0.10                   0001
0.10           0.05                   0000


・X,Y,Z方向の加速度を取得する。
0x32~0x37に、1軸につき2バイトずつ、データが格納されています。

データは2の補数で格納されています。

それぞれレジスタを読みだして、マスタ側で、加速度に変換してください。




他にもFIFOなど、機能がたくさんあるので、興味がある方はデータシートを参照してください。



それと、このセンサは、傾けても値が変化します。

前後左右に動かしても値が変化するので、平行移動で値が変化しているのか、回転したことで値が変化しているのかが分からなくなるので、どうすればいいのかを検討中です。

データシートを見た限りでは、傾きを検出しないようにする方法が分からなかったです。


加速度センサはどれもこういう感じなのかなぁ...?

ジャイロセンサがあるので、それで補正するようなことをしないといけないんですかね?
大変だなぁ...。

2013/05/01

FETモタドラ設計 その3 -モータノイズ編(アンダーシュート)-

どーも、Nekosanです。


今年の高専ロボコンのルール発表されましたね。結構前ですが。

今年はなかなか難しい課題な気がします、例年に比べて、ですが。

まあそれはいいのです。あんまりそのことをブログに書いちゃうとメンバーに怒られそうなのでこれぐらいで。



ロボコンのルールも発表されたので、モータドライバの開発も急がないといけません。

かといって、ロボコンのアイデアの考案もしないといけないので、ここ最近やってませんでしたが、そろそろ再開します。




前回は、ブートストラップコンデンサの容量を決定しました。

今回は、ブートストラップ方式で問題となる(らしい)、フローティング電源のアンダーシュートについて考えて、設計を進めたいと思います。


自己解釈が結構多いので、間違っている部分もあると思いますが、ご了承を。



IR社のアプリケーションノートをいろいろ見てみると、多くの資料で、Vs端子(ハイサイドFETのソース端子、ローサイドFETのドレイン端子)がアンダーシュートしやすいと書かれています。


アンダーシュートとは、波形が定常値(この場合はGND電位)よりも、下がってしまうことです。
また、下に突出してしまった波形のことを言ったりもします。

ちなみに、この逆、上方向に突出してしまった波形のことをオーバーシュートといいます。


このアンダーシュートが5Vを超えると、IR2110の出力が一時的にラッチ(入力を受け付けない状態)してしまいます。そういう仕様です。

また、アンダーシュートが定格を超えると、ICが破壊されてしまいます。


今まで、何回かICをぶっ壊してきましたが、もしかしたら原因がこれかもしれません。



このアンダーシュートは、通常動作、ショート、電源シャットダウンなどの高いストレスがかかった時で、かつ、di/dtが大きいこと(スイッチング速度が速い)で観測されます。



つまりは、電流が急激に変化したときに発生するということですかね。

負荷がモータなどの誘導性負荷なのが原因っぽい。


アプリケーションノートを見てみると、アンダーシュートが発生する原因について書かれているみたいです。
http://www.irf-japan.com/technical-info/designtp/dt97-3j_rev.pdf


これを参考に、アンダーシュートが発生する原因を考えたいと思います。
ここからは自己解釈が若干入っているので注意です。


ハイサイドFETがONで、モータに電流が流れている状態から、ハイサイドFETがオフになった状態を考えます。
すると、モータに電流が流れなくなります。

モータはコイルなので、電流が流れなくなると、電流を流そうとします。
そのため、今まで流れていた向きに電流を流そうとして、起電力が発生します。

いわゆる逆起電力ってやつですね!

もし、このときの回路にフリーホイールダイオード(FETのドレインソース間に並列に接続されているダイオードのこと)が無かったら、モータで発生した起電力を下げるために流す電流を流せないため、大きく電位差がモータ両端に発生します。

しかし、今回の回路では、フリーホイールダイオードをつけているため、モータ→ダイオードという電流の経路が確保できるため、電流の変化率が小さくなります。


これで、モータの逆起電力による電圧の変化を抑えることができます。


が!
これでは終わらないらしいです。

このフリーホイールダイオードには、逆起電力による負荷電流が流れます。

この電流が流れる経路は、導線なので、浮遊インダクタンスがあります。
小さなコイルが接続されているようなものです。だって導線だもの。

この浮遊インダクタンスによって、Vs端子の電位がGNDよりも小さくなってしまうとのことです。



と、ここまで書きましたが、ぶっちゃけよく分からないです。

なんとなくは分かりますが、いまいちパッとしない感じがしますけど、あんまり考えても設計が進まないので、こういうもんだと思うことにします、今は。



原理はいまいち分かりませんでしたが、原因は、配線の浮遊インダクタンスということです。

つまりは、その対策をすれば大丈夫だということ。


アプリケーションノートにも、対策が書かれています。

詳しくは先ほどのデータシートの第7項:一般的推奨条項に詳しく書かれています。
他のアプリケーションノートにも同じようなことが書かれています。


概要をまとめると、


1.寄生要素(配線のインダクタンスなど)を最小化する。

対策としては、
・パワー素子は太くて、まっすぐな線で繋ぐ。配線にループや分岐がないこと。
・電力回路内では相互接続したリンクを避けること。
・パワー素子の高さを低くして、リードインダクタンスの影響を抑えること。
・パワー素子を近接して配置すること。
が、書かれています。


2.制御ICの配線

・VsはローサイドFETのドレイン端子に近づけるように接続すること。
・COMはローサイドFETのソース端子に近づけるように接続すること。
・制御ICをパワー素子にできる限り近接して配置すること。


3.各所のカップリングの改善

・ブートストラップコンデンサの容量を0.47uF以上にすること。このとき、低ESRのコンデンサを最低でも一つは使用する。
・Vcc端子とCOM端子の間には低ESRのコンデンサを接続すること。容量はブートストラップコンデンサの10倍にすること。
・これらのデカップリングコンデンサはそれぞれのピンに直接接続すること。


これらを適用すれば、Vsのアンダーシュートによる影響は最小化できます。


これでもアンダーシュートが大きすぎる場合は、スイッチング速度を減らすしかありません。

スイッチング速度を減らすには、ゲート抵抗を大きくします。

ゲート抵抗については、次の記事に回したいと思います。
さすがに記事の量が多くなったので疲れました。



というわけで、今回は浮遊インダクタンスによるアンダーシュートのノイズについての記事でした。

これを元に、次の設計を進めたいと思います。



では、これぐらいで。
しーゆーあげいん!

2013/04/23

FETモタドラ設計 その2 -ブートストラップコンデンサ編-

どうも、Nekosanです。



モタドラ回路製作記事2回目です。


前記事ではドライバ回路の概要を記載したので、回路設計に入っていきます。

たくさんの数式が出てくるので、注意です。

言っても、四則演算ですが。



ドライバ回路の、ハーフブリッジを抜き出した図です。


ブートストラップ回路は比較的単純に構成できます。

使用部品は、

  R1、R2 : ゲート抵抗。
  R3、R4 : G-S抵抗。
  C1 : ブートストラップコンデンサ。
  C2 : IC用バスコン。
  D1 : ブートストラップダイオード。

です。


ここから、部品の選定です。

まずは、ブートストラップコンデンサから。

ブートストラップでは、ハイサイドのゲート駆動電圧を、ブートストラップコンデンサによって得るため、ゲート駆動に必要な電荷を貯めれるコンデンサを用いないといけません。

ブートストラップコンデンサの容量の決め方は、IR社の資料にありました。
http://www.irf-japan.com/technical-info/designtp/dt98-2j.pdf

ブートストラップによって供給される最小の電荷量をQbsとすると、

Qbs = 2Qg + (Iqbs / f) + Qls + (Icbslk / f)
Qg : ハイサイドFETのゲート電荷。
Iqbs : フローティング電源の静止電流
f : 周波数。
Icbslk : ブートストラップコンデンサのリーク電流。
Qls : 周期ごとに必要なICのレベルシフトチャージ。 IR2110は5nC。

で、求められます。

なぜ、ゲート電荷を2倍にして計算しているのかがよくわかりません...。誰か教えてください。


ブートストラップコンデンサは、この電荷を供給して、最大電圧を保たないといけません。

もし、この電荷量をギリギリ供給できる程度の容量なら、電圧がガッツリ下がって、ハイサイドを駆動することができなくなります。

そのため、コンデンサの電荷Qbsは、さっきの式の2倍は最低限必要です。


そのことを考慮して、コンデンサの容量を計算します。

C >= (2 * Qbs) / (Vcc - Vf - Vls)
Vcc : ドライバICの電源電圧。
Vf : ブートストラップダイオードの順方向電圧降下。
Vls : ローサイドFETの電圧降下

この容量のコンデンサが必要です。


ただし、この容量は最小限必要とされる値です。

小容量のコンデンサは過充電を引き起こす可能性があって、ICが損傷する場合もあります。

そのため、このコンデンサ容量は、最低限必要な容量の15倍程度にしたものを目安にします。


で、今回の例に当てはめてみます。

まず必要な電荷量Qbsを求めます。

使用するFETは、IRBF4410です。(図中は、IRFB3607と書いてますが、こちらを使う予定です。)
http://akizukidenshi.com/download/ds/ir/IRFB4410%20IRFS4410%20IRFSL4410.pdf

ゲート容量Qgは、180nCが最大値です。

ブートストラップコンデンサのリーク電流、、、わからん。
と、思ったら、これは電解コンデンサを使うときだけ考えればいいらしい。ひとまず0Aにします。

IqbsはIR2110のデータシートに載ってました。 230uA(max.)です。

動作周波数ですが、1kHz ~ 25kHzで動作させれたらいいなーと思っているので、1kHzと25kHz両方で計算します。

Qbs1 = 2 * 180 * 10 ^ -9 + (230 * 10 ^ -6 / 25000) + 5 * 10 ^ -9 + (0 / 25000) = 374nC
Qbs2 = 2 * 180 * 10 ^ -9 + (230 * 10 ^ -6 / 1000) + 5 * 10 ^ -9 + (0 / 1000) = 595nC



Cを求める式、(2 * Qbs) / (Vcc - Vf - Vls)の分母部分は、

Vcc : 12V
Vf : 0.7V
Vls : 0V

とします。


計算すると、

C1 = (2 * 374 * 10 ^ -9) / (12 - 0.7 - 0) = 66nF

C2 = (2 * 595 * 10 ^ -9) / (12 - 0.7 - 0) = 105nF


です。


この値の15倍ですから、1uF~1.5uFの容量が必要になります。


手元に、1uFのセラミックコンデンサがあるので、これを使いたいと思います。
http://psearch.murata.co.jp/capacitor/product/RDER71H105K2K1C03B.html

1uFで誤差10%ですから、0.9uF~1.1uFですね。

ギリギリですが...。うん。大丈夫でしょう。(おい


しかぁし、先ほどの資料の中に、「少なくとも一つは低ESRコンデンサをデカップリング」という文字を発見してしまいました。

このセラミックコンデンサのインピーダンス-周波数特性を見てみると、1k ~ 25kHzで、1Ω弱ぐらいのインピーダンスがあります。

この値で大丈夫なのかな、という心配がありますが、大丈夫だと思うことにします。



とりあえずこれでブートストラップコンデンサの選定が終わりました。


次はゲート抵抗です。たぶん。



では、しーゆーあげいん!

2013/04/22

FETモタドラ設計 その1 -設計概要編-

どうも、Nekosanです。


今まで何回かモータドライバについての記事を書いてましたが、回路設計メモを兼ねて、ブログ記事にしながら、設計をしようかと思います。


という訳で、第一号記事です。




まずは作ろうとしているモタドラの概要から。


概要
ブートストラップ方式によるNchMOSFETフルブリッジモータドライバ。

駆動対象:DCブラシモータ

電源電圧:12V~24Vより広範囲。

ドライブ電流:80A以上。

動作周波数:25kHz以上。

動作要件:燃えない。


こんな感じの目標を立てています。



ドライブ回路はFETでHブリッジ回路を用いて構成します。

FETをドライブするための回路には、市販のゲートドライバICを使用します。

使用ICはInternational Rectifier社の「IR2110」です。
http://www.irf.com/product-info/datasheets/data/ir2110.pdf

Nchフルブリッジを組んだ場合は、ハイサイドのFETの駆動方法が課題ですが、このICはブートストラップ方式を用いて昇圧することで、少数の部品でハイサイドのFETを駆動することが可能です。

ブートストラップ方式を用いると、PWMのデューティー比の制限や、ハイサイドをONにし続けれないという制限もありますが、簡単に作れるので、この方式を採用しています。


このICのロジック入力は、ハイサイド、ローサイド別々なので、その前にロジック回路を設けます。

マイコンのピン数を抑えるために、1本のPWM信号でハーフブリッジを駆動するように、ロジックを構成します。

そうすると、上下段の切り替えにデッドタイムが必要なので、その回路も追加します。



今まで設計してきた回路は、前記事にも載せていた回路図の通りです。

この記事の説明では、アナログ回路の部分のみ書きました。

マイコン等、デジタル回路の方はまた今度です。


アプリケーションノートを見ながら回路設計をしたつもりですが、メモを取っていなかったので、確認を兼ねて、記事を書いていきたいと思います。




最初ですので、これぐらいで。

しーゆあげいん。

















あっ、目標期日を決めるのを忘れていました。

もうロボコンもシーズンに入るので、設計終了の〆切を決めたいと思います。

〆切は!
5/19!!

です。


これまでに設計を終えないと、実質ロボコンで使うのは厳しいので、これを目標に。


では今度こそ。

しーゆーあげいん!

2013/04/18

ロボコンで使うモータドライバのお話

どーも、Nekosanです。

またもや学校が忙しかったり、部活が忙しかったり、資格の勉強が忙しかったり、眠かったり、鬱になってたりで間が空いてました。

まあ今後もこんな感じが続くかもです。

できるだけ続けて書くようにがんばります。


ここ最近、ロボコンで使うドライバを設計して、テストしたりしていました。

で、いろいろ試してみてから、本番でNchフルブリッジFETのモタドラを使うのはやっぱり怖い、と思って、別案をいろいろ考案中です。
去年のロボコンもモタドラが焼けて動かなかったというトラウマがあるので、怖いんです。はい。

で、とりあえず選択肢としては。。。

①設計しているNchフルブリッジモタドラを使う。
②ドライバの部分を市販のICに置き換える。
③リレーモタドラを使う。

こんな感じです。

①はさっき言った通り、ちゃんと壊れずに動けばいいんですけどね。
FETのドライブに使っているIR2110がよく壊れたり、スパイクノイズがひどかったりして、現状じゃ使えないなぁと。

②は、部室にあるモータなら十分使えるレベルの電流が流せるICがあったので、それを使おうかと。

③は、オムロンリレー使っている安定のモタドラ。

個人的には、せっかく作った自作モタドラがいいんですけど、プライド突き通して失敗するってのはもうやりたくないので、なかなか踏み出せない状況。

とはいえ、まだちょこっとだけ時間があるので、いろいろ改良を考えています。

回路図はこちら。諸事情によりPDF形式になっています。
https://docs.google.com/file/d/0BzWNJDooQAbFOVl4b3k0SzJUc0E/edit?usp=sharing

実験に使った回路との相違点は、
①ゲート抵抗の変更(10[Ω] -> 47[Ω])
②IR2110のブートストラップ用コンデンサを10uFから1uFに変更
③ゲート抵抗に並列にダイオードを追加。ゲートの電荷を逃がす為。
④デッドタイム回路のCR値を変更して、デッドタイム時間を500nsに変更。短い気がするので、今後変更する可能性大。
⑤逆起電力吸収用のダイオードをブリッジダイオードからディスクリートのショットキーバリアダイオードに変更。
⑥IR2110用の電源と、モータドライブ用の電源を分ける。

という感じ。
主に回路の定数の変更です。

また、IR社のアプリケーションノートによると、ハイサイド側のVs端子(モータ端子に接続されている)に、スパイク電圧が発生するらしく、対策が書かれていました。
http://www.irf-japan.com/technical-info/appnotes/AN-978.pdf

寄生成分の影響が結構あるらしいので、配線なども考えないと。。。


とりあえずこんな感じで、もう一度試作回路を作って実験しようと思っています。

もうすぐルール発表だし、早くしなければ...。


では、これぐらいで。
しーゆーあげいん。

2013/04/04

ロボコン部品ガイドブック

どーも、Nekosanでし!

実は昨日寝てなくて、ついさっき24時間起床を記録しました。
まあ記録ってほどのことじゃないですねw。
徹夜やったことないわけじゃないけど、体だるくなるのであんまりしたくないです。
でもきっと夜まで寝ません。がんばる。


今日は、朝から徹夜明けの体に鞭をいれて本屋さんに行ってきました。

いつも通り技術本のコーナーを漁っていたら、これはいいな、と思った本があったので中身確認して購入してきました。

それがコレ。
\デェーーーーーーーーーーーーーン/

「ロボコン部品ガイドブック」
出版:オーム社
価格:2310円

名前のとおり、ロボットコンテストに出場するようなロボットに使われている部品がたくさん載っています。
ロボット製作の初心者の方には是非読んでもらいたい本です。

長年、ロボット製作に携わっている人はほとんど分かると思いますが、こういう部品のリストが載っていると、なんとなく心がウキウキすると思います。(分かってくれる人がいるかな?)
もしかしたら知らない部品とかが載ってたりするかもしれませんよ?

ちなみに目次は、
 1.アクチュエータ
 2.機械要素部品
 3.コントローラ
 4.センサー
 5.電源配線部品
 6.電子部品
 7.入出力装置
 8.素材
となっています。

内容的には回路系のほうが多いです。
部品の数とかが圧倒的ので当たり前といえば当たり前なんですが。

特に、高専ロボコンをやろうと思っている新一年生の方には是非読んでいただきたい。
とりあえず部室に来たらこの本渡して、読んで来い、と言ってやろうかなw。

それと、現役のロボコニストにも読んでもらいたい本です。
特に機械班の方々。
回路のことを知ってるのと知らないのじゃ、大違いなので、せめてアクチュエータとセンサぐらいの知識は知っておいてほしいと思います。

きっと全国の書店にあると思います。
無ければAmazonでポチるんだっ!
http://www.amazon.co.jp/gp/product/toc/427421141X/ref=dp_toc?ie=UTF8&n=465392

というわけで、ロボコニスト向けのおすすめ書籍のお話でした。

ロボコニスト向けといいましたが、電子工作とかやってる人にもおすすめだと思います。
機械要素の知識が増えると、電子工作の幅が広がります、きっと。


他にもこんな書籍あるよ!などの情報があれば、ぜひ教えていただければなと思います。
ブログのコメでも、Twitter、Google+でも構いませんので~。


では、また次回!

2013/03/20

Raspberry Piを起動してみた

どうも、Nekosanです。
Raspberry Piを入手することができたので、起動を試みてみました。
「用意するもの」
・Raspberry Pi
・SDカード(4GB以上は必要な気がする)
・ディスプレイとコネクタ
・microUSBコネクタとUSB充電器(出力0.7A以上)
・USBキーボード&マウス
とりあえずこれだけあれば起動はできます。
というわけでやってみました。
詳しい方法は割愛。
ググればたくさん出てきます。
たとえばこれとか→( http://www.lifehacker.jp/a/2013/02/130226raspberry_pi_guide.html?r=www.google.co.jp
起動していろいろ弄くりたかったのですが、残念ながらキーボードが不調で思うように操作できなかったので、後日別のUSBキーボードを使おうと思います。
今回使ったキーボードが無線キーボードなのが原因かも。
有線のキーボードがあればそれを使うんですがね...。
Raspberry Piをどう活用していくか。
まだまだ考え中ですが、いろいろやってみようと思います。
では、これぐらいで。
しーゆーあげいんっ!

2013/03/16

Mikromediaに書き込めたらしい

どうも、Nekosanです。
昨日Mikromediaが動かないという記事を書きましたが、「JTAGICE3」を使ってみたところ、書き込むことができました。
以前までは「AVRISPMk.II」を使っていましたがどうしても書き込めませんでした。(正確に言うと途中までしか書き込めてない。)
まだ原因が分かっていません。
ファームウェアも最新のはずですし。
すっきりしませんが、とりあえず開発は進められそうなので良かったです。
一通りの機能を使ってみて、そのあとはMP3プレーヤーのようにしたりゲーム機のように使ったりできればなーと。
まあそこまでやる気が持てばの話ですが...w
ではこれぐらいで。
しーゆーあげいんっ!

mikromediaに書き込めぬえぇぇん

どうも、Nekosanです。
AVRのXmegaを搭載して、液晶タッチパネルやmp3デコーダが載っているmikromediaというマイコンボードに興味を持って、使ってみました。
http://www.mikroe.com/mikromedia/xmega/
元々、このマイコンにはブートローダーが書き込まれており、USBケーブルを繋ぐことでプログラムが書き込めます。
ちなみにブートローダーに書き込むためのソフトウェアはHPにてダウンロードできました。
また、製品に付属しているCDからもインストールできるはずです。
ブートローダーを使って、サンプルプログラムをいくつか書き込んだあと、AVRISP(AVRマイコンの書き込み器)でも書き込めるということらしい(付属資料に記述されていた)ので、それを使ってみようと思いました。
ブートローダーでは書き込み速度が遅いので書き込みに時間がかかってしまうのですが、AVRISPなら早く終わります。(たぶん)
...が、ここからが泥沼の始まり。
なんとプログラムを書き込んでみたところ、verifyでエラーが...。
マイコンに書き込まれているhexファイルを読み出してみたところ、途中までしか書き込まれてねーじゃん!? という事態に。
しかも途中まで書き込んだということはブートローダーを消してしまったということなので、ブートローダーを使っては書き込めない...
\(^o^)/
というわけでマイコンに書き込む手段がなくなってしまったのです。
mikromediaの値段もバカにならん...
いまだ解決できてないので結構ピンチです。
大人しくブートローダー使っとけばよかったかもです...
後悔先に立たず、ですけど。
マイコンから読み出したhexファイルは、毎回同じところで書き込みがストップしているようなので、マイコンが壊れている可能性は薄いと思うのですが...
AVRISPの書き込み範囲がおかしいのでしょうか。
持っているAVRISPはatmegaでは正常に書き込めます。
Xmegaを使うときに必要な設定とかがあるんですかね...
謎です。
とりあえず今日はこの辺で。
もし情報提供して頂ける方がいらっしゃれば、是非お願いします。
では、しーゆーあげいん!

人気の投稿