リニアの内部回路とプログラムの説明
1,基盤の各種部品の説明
1,1 ”主な”使用部品
① ドライバIC(IR4427)
② MOSFET(2SK4017)
③ 抵抗(30Ω)
④ コンデンサ(3μF,500μF)
⑤ 可変抵抗(500Ω)
⑥ arduino
1,2 それぞれの部品の説明
① MOSFETを制御する部品です。
② トランジスタの一種。ドレイン、ゲート、ソースの3つのピンがあって、ゲートに電圧をかけるとドレインに電流が流れます。
③ 流れる電流を制限する部品です。
④ 電気を蓄え、必要な時に放出する部品です。
⑤ 抵抗器の一種。つまみを回すことで抵抗値が変わります。
2,前提知識と基盤の簡単な説明
2,1 三相交流とは
皆さんは直流とか交流とかいう言葉を耳にしたことがあるのではないでしょうか?まず直流というのは時間によって電圧と電流が変化しない電気のことです。次に交流というのは周期的に電圧や電流が変化する電気のことです。
![](https://assets.st-note.com/img/1694246716483-4P9HejeE4L.png)
よく三相交流は上の図のように表されます。しかしこれではよくわからないと思うので波について説明します。
2,2 波について
ここで説明する波は皆さんがよく知っているであろう波とは違います。上の図のようなやつです。まず波には周期というものがあります。「0→最大値→最小値→0」で1周期です。
ちなみに横軸は °で表されています。これは、波というのは簡単に言えばxy平面に円を固定して円の中心を軸に半直線を回していったとき、円と半直線の交点のy座標を抽出していっています。なので横軸は半直線がどれだけ回ったかということで °で表されているわけです。
次に位相というものについて説明します。位相はある時に波が縦軸でいうどこにいるかということです。
さて、最後に位相差というものについて説明します。位相差というのは2つの周期が同じ(周波数が同じ)波があったとき、波の始まりの点は違う場合もあります。その始まりの点の間隔のことです。
2,3 三相交流について
皆さんは波について理解されたと思うのでもう三相交流の図について分かったかもしれませんが説明します。三相交流はある周期の位相差が120°の波が3つあるということです。
あと説明しなければならないのは縦軸についてでしょうか。縦軸は電圧です。でも電圧と電流は抵抗値が同じならば比例するので電流ととらえてもらっても構いません。
ちなみに図にPhase1とか書いてありますがこれは1つ目の波という意味です。
2,4 そもそもこの基盤は何をしているの?
この基盤は簡単に言うと直流電流から三相交流に変換しています。それだけです。
3,基盤の各種部品の詳細な説明
不必要な部分は難しい言葉使っていますが流して読んでください。
3,1 トランジスタ
まずはこの回路で最も重要なものであるトランジスタについて説明します。
この回路に使っているトランジスタはMOSFETという種類です。
MOSFETには、ドレイン、ゲート、ソースという3つのピンがあります。MOSFETと普通のトランジスタ(バイポーラトランジスタ)の違う点は主にMOSFETは電圧駆動でバイポーラトランジスタは電流駆動という点です。
また、バイポーラトランジスタは増幅回路に適していて、MOSFETはスイッチングが高速、大電流を扱えるなど様々な特性があります。
そして今回使用しているMOSFETはエンハンスメント型というものです。これは簡単に言うとゲートに電圧を加えるとドレインに電流が流れ始めます。
3,2 Arduino
Arduinoはマイクロコンピューターの一種です。今回使用したのはArduino UNOです。
Arduinoの基本的な役割は事前に書き込まれたプログラムの通り出力したり、センサーなどから送られてきた値を読み込んだりすることです。今回は主に出力の方について説明します。出力の形式は、デジタルとアナログの2種類です。
まずデジタル出力というのはHIGH(電気を流す)かLOW(電気を流さない)の2種類だけで信号を送る形式です。
次にアナログ出力というものです。これも実はHIGHとLOWの2種類だけで信号を送っています。しかし、アナログ出力はPWM制御という方式で、これはHIGHかLOWかを高速で切り替えることで平均の電力を入力しているのとほぼ同じになります。だから電気を流す、流さない以上の細かい電力の調整ができます。
Arduinoのプログラムの説明は後でします。
3,3 ドライバIC
今回使っているドライバICはゲートドライバという種類です。型番はIR4427です。
このゲートドライバは主にMOSFETを制御する役割で使用されます。
ただ、鋭い人は「ドライバICなんか通さずに直接ArduinoからMOSFETを制御してしまえばいいのでは」と思うかもしれません。今までの説明だけであれば、それでもいいのですが、Arduinoから送られてくる制御信号は弱いです。しかしMOSFETにはある程度大きい電力が必要です。そこで、Arduinoから送られてくる制御信号をゲートドライバを使って増幅しているわけです。
実はゲートドライバの中にもトランジスタが入っていて、そのトランジスタで増幅しています。
3,4 コンデンサ
コンデンサもいろんな種類がある部品です。
その中で今回使ったコンデンサはセラミックコンデンサと電解コンデンサという2種類です。とりあえず種類は置いといてコンデンサの役割を説明します。
コンデンサの一番知られている役割は電気(正確に言うと電気ではなく電荷)を貯めたり放出したりできるということです。この役割はカメラのフラッシュのように一瞬だけ大量の電気を流すという用途にも使えますが、それだけではなく電圧を一定に保つことにも使えます。どういうことかというと電圧が高い時には蓄電して、電圧が低いときに放出するということです。
もう一つの役割は、直流は通さず、交流のみ通すという役割です。この役割を利用することで直流電流に含まれるノイズを除去する(ノイズは交流なのでそれをコンデンサで分離する)ことなどに使用されています。
役割が分かったところで今回使ったコンデンサの種類を紹介します。
1つ目はセラミックコンデンサです。これはかける電圧を増やしていくと容量が増えていきます。あと比較的小型です。
2つ目は電解コンデンサです。特徴としては容量もサイズも大きいです。
ちなみにコンデンサの容量の単位はF(ファラッド)です。
3,5 可変抵抗
可変抵抗はその名の通り抵抗値が変わります。
ただ今回の回路での役割は少し特殊なのであとで説明します。
4,基盤の説明
![](https://assets.st-note.com/img/1694246601893-sSbzoLUz2K.jpg?width=1200)
上の回路には実は致命的な欠陥があるのですがこの写真しかなかったのでご容赦ください。
本当はこの回路のグラウンド(-)の部分を全部繋げます。
5,プログラム
プログラムの中の //のあとにそれぞれの用語についての説明があります
int U1=3;
int U2=5;
int V1=6;
int V2=9;
int W1=10;
int W2=11;
int tsumamiPin = 0;
//ここまではピンの名前を定義する。例)int U1=3 は3番ピンをU1と定義している。 だからここからU1などがでてきたらそれに対応するピンだと思えばよい。
int sinw[360]; //sinw[0]~sinw[359]という変数を作成。変数は数値を格納するための名前のついている箱だと思えばいい。
int U = 0;
int V = 120;
int W = 240; //U,V,Wという変数を作成&初期化(初期化とは最初に変数に数値を格納すること。)
int ang,MODE,mag; //and,MODE,magという変数を作成
double f, d; //f,dという変数を作成
double KahenTeikou = 1; //出力電圧の振幅の大きさの倍率
//int,double,longというのの違いは格納できる数値の容量と種類(整数なのか実数なのか)
void setup() {
t1=millis(); //t1の値を指定
Serial.begin(9600); //シリアルモニタの作成
mag=96; //magという変数を初期化
for(ang=0;ang<360;ang=ang+1){
sinw[ang]=mag*(sin(ang * 3.14/180)+1);
}//angという変数の値を角度に見立て、0~359のそれぞれの整数値でsinw[ang]という名前の変数を作る。また、それぞれに対応するsinの値で初期化する。
pinMode(3, OUTPUT);
pinMode(5,OUTPUT);
pinMode(6, OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11, OUTPUT); //それぞれのピンをOUTPUT用のピンに指定
}
void loop() {
Serial.print(f);
Serial.println("Hz");//シリアルモニタへの出力
f = (double)analogRead(tsumamiPin) * 0.0076;//可変抵抗の値から周波数を計算する。fを定義
if(f >= 0.001){//もし周波数の値が0.001以上なら
d = 1.0/(f * 360);//dの値を定義する。
}
else if(f < 0.001){//もしそうでなければ
d = 0.01;//dを0.01にする。
}
if(analogRead(tsumamiPin) > 256){ //tumamiPinの値を読み込んでそれが256以上ならこの動作に入る。
KahenTeikou = analogRead(tsumamiPin)/1023; //KahenTeikouの値の書き換え
}
else{//もしそうでなければ
KahenTeikou = 0.25;//KahenTeikouの値を0.25にする。
}
analogWrite(U1, sinw[U] * KahenTeikou);
analogWrite(V1, sinw[V] * KahenTeikou);
analogWrite(W1, sinw[W] * KahenTeikou);
analogWrite(U2, sinw[U] * KahenTeikou);
analogWrite(V2, sinw[V] * KahenTeikou);
analogWrite(W2, sinw[W] * KahenTeikou); //出力ピンから電圧を出力する
W = update_phase(W);
V = update_phase(V);
U = update_phase(U);//U,V,Wの角度を進める
if(d * 1000000> 16383){//もしdの値が一定以上なら
delay(d * 1000); //設定した周波数に応じて遅延させる
}
else{//そうでなければ
delayMicroseconds(d * 1000000);//設定した周波数に応じで遅延させる。 if{}とelse{}の違いは遅延させる長さ
}
}
int update_phase(int Inductor){ //関数を定義。
Inductor = Inductor+1; //Inductorという変数を1進める。ここではInductorは角度
if(Inductor>=360) Inductor=0; //もしInductorの値が360以上になったら0にする。
return Inductor; //変数の値を返す。
}