インバータ音の出るコントローラーの製作
ここではVVVFインバータの音(現時点ではE233系3000番台日立製インバータのみ)のような音が出る鉄道模型のコントローラーの製作方法について書いていきます。
右の動画はそのコントローラーで鉄道模型からインバータの音を出した時の様子になります。
用意するもの
・Arduino UNO x1 ※arduinoに搭載されたマイコンATMega328の機能を利用しているためarduino UNO以外のarduinoでは動かないものもあります。
・IRFB4410(NチャネルMOSFET) x2
・抵抗 10Ωx2、10kΩx2
・可変抵抗(100kΩ) x1
・可変抵抗(Bタイプ) 100kΩx1
・ACアダプター (12V・1A) x1
・積層セラミックコンデンサ 10μF x1、0.1μF x2
・DCプラグ x1
・電解コンデンサ 10μF x1
・ポリヒューズ x1
・ピンソケット
・基板 (10x15以上を推奨)x1
・ジャンパワイヤ
・ゲートドライバIC irs2108 x1
※元々5インチゲージ用に製作したものなので大電力が流せるものを使用していますが、MOSFETを電圧、電流ともに低い仕様に変更すると安く仕上がります
回路図

制御プログラム
arduinoのスケッチは次のものになります。今回のものはE233-3000に搭載の日立製のインバータ音のみが出るプログラムです。A0で可変抵抗の値を読み取り、10番ピンからpwm信号を出力
#include<avr/io.h>
#include<math.h>
int vale;
float frq,frqt;
float duty;
float val=0;
void setup() {
pinMode(3,INPUT_PULLUP);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(2,INPUT);
pinMode(11,INPUT);
pinMode(8,INPUT);
pinMode(13,OUTPUT);
digitalWrite(13,HIGH);
pinMode(12,OUTPUT);
TCCR1A = 0b01100001; //ATmega328のpwm設定1
TCCR1B = 0b00010010; //ATmega328のpwm設定2
}
void loop() {
//モータの回転速度に関する変数***********************************************
//vale:ボリュームの読み取り値の格納
//val:モータ回転にかかわる内部変数(duty比をどれくらいにするかの変数)
vale=analogRead(A0);//ボリュームの値の読み取り
if(vale>=val){
val=val+0.0078; //加速度のの設定、数字を変えると加速度が変化
}
if(vale<=5&&vale>=0){
if(val>=0){
val=val-0.0078;
}
}
duty=(float)val/1024; //duty比計算
//ここからインバータ音の動作に関して
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 音の変更はこの枠より下を書き換え
// 音タイプ公開中:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(vale>=val){ //減速しているのか加速しているのかを内部変数によって判定
if(val>=0&&val<=10){ //モータ回転にかかわる内部変数(val)によって音を出す範囲を指定
frq=random(820,1280);//モーターから出す音の周波数(ここでは820~1280Hzの間でランダム,直接数値を入れてもその周波数の音が出ます)
}
if(val>=10&&val<180){
duty=0.85*duty+0.12; //モーターのリアクタンスの影響による急激な加減速を軽減するための計算。先に計算したduty比の補正
frq=random(820,1280);
}
if(val>=180&&val<270){
duty=0.94*duty+0.05;
frqt=random(850*pow(val/180,1.53),1250*pow(val/180,1.135));//音が徐々に変化するときの計算(1次関数等に近似)+計////
//算結果をfrqtに格納
//計算式:(最初の周波数-最後の周波数)×val - (音の開始時のval×最後の周波数ー音の終了時のval×最初の周波数)
// ーーーーーーーーーーーーー ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
// 音の最初のval-音の最後のvall 音の最初のval-音の最後のvall
frq=frqt;
}
if(val>=270&&val<=1024){
duty=0.6*duty;
frq=-(float)val*2*1.3*(660-1000)/754+405840/754;
}
}else{
if(val>=0&&val<3){
duty=duty;
frq=400;
}
if(val>=3&&val<20){
duty=duty+0.05;
frq=400;
}
if(val>=20&&val<180){
duty=0.9*duty+0.07;
frq=random(2.8*val+344,5.3*val+294);
}
if(val>=180&&val<270){
duty=duty;
frq=random(850*pow(val/180,1.53),1250*pow(val/180,1.135));
}
if(val>=270&&val<=1024){
duty=0.5*duty+0.05;
frq=-(float)val*2*1.3*(660-1000)/754+405840/754;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 音の変更はこの枠より上を書き換え
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
OCR1A = (unsigned int)(1000000 / frq);
OCR1B = (unsigned int)(1000000 / frq * duty);
}
E233系3000番台以外の音タイプも下記のボタンのリンク先より公開しています。興味があれば↓よりどうぞ。



