前回の#3での、モーター出力確認を行ったPGについて簡単に触れておきます。
使用するモーター・マイコン
以下ブラシレスモーターとマイコンを使用します。前回記事#2、3と同様のものです。念のため使用した電源とESC(コントローラ)のURLも載せておきます。
○ブラシレスモーター
○マイコン(Arduino uno)
○電源
○ESC
回路イメージ
回路イメージを載せておきます。#2のものと同じ
※電源線は流れる電流値に合わせて、電源線を選んでください。『許容電流 電線径』と調べればすぐに出てくると思います。
PWMの出力ピンは以下コードでは6番ピンに設定してますので6番ピンと接続。
確認用のコード
ではここからコードの紹介です。Arduinoは専用コンパイラ(兼エディタ)がありますので、そちらを活用します。(活用方法は別途要望があれば載せます。)
今回の目的は動作確認用のコードで、『PWM値を変更して動作確認』することだけを目的としたコードです。
まずは全文を載せます。
#define VAL_MIN 0
#define VAL_MAX 100
#define PWMpin 6
int val;
void setup(){
Serial.begin(9600);
val = 10;
// Wait for input
while (!Serial.available());
analogWrite(PWMpin,VAL_MAX);
delay(100);
analogWrite(PWMpin,VAL_MIN);
}
void loop(){
delay(100);
analogWrite(PWMpin,val);
while (Serial.available() > 0){
char sp = Serial.read();
Serial.println(sp);
delay(500);
switch (sp){
case '1':
val = 10;
Serial.print("val = ");
Serial.println(val);
break;
case '2':
val = 20;
Serial.print("val = ");
Serial.println(val);
break;
case '3':
val = 30;
Serial.print("val = ");
Serial.println(val);
break;
case '4':
val = 40;
Serial.print("val = ");
Serial.println(val);
break;
case '5':
val = 50;
Serial.print("val = ");
Serial.println(val);
break;
case '6':
val = 60;
Serial.print("val = ");
Serial.println(val);
break;
case '7':
val = 70;
Serial.print("val = ");
Serial.println(val);
break;
case '8':
val = 80;
Serial.print("val = ");
Serial.println(val);
break;
case '0':
val = 0;
Serial.print("val = ");
Serial.println(val);
break;
}
delay(500);
val = min(VAL_MAX, val);
val = max(VAL_MIN, val);
}
}
※一部は以下URLを参考にしてます。
ライブラリを使えば簡単かもしれませんが、理解の確認も兼ねてライブラリは使用してません。今後は使っていきたいと思います。
以下少しずつ解説していきます。
#define VAL_MIN 0
#define VAL_MAX 100
#define PWMpin 6
int val;
プロトタイプ宣言というところです。
PWMの最大値、最小値の定義と、6番ピンを定義してます。また、int型で「val」を定義してます。
void setup(){
Serial.begin(9600); //通信レート、シリアルモニタと合わせる
val = 10; //初期値設定 10 or 0とか小さめで
// Wait for input
while (!Serial.available()); //入力されるまで待機
analogWrite(PWMpin,VAL_MAX); //最大値をPWM出力
delay(100); //0.1秒待機
analogWrite(PWMpin,VAL_MIN); //最小値をPWM出力
}
void setup() の関数はArduino起動後一度だけ読み込まれます。この関数の中身は、シリアルモニタに入力されたら、ブラシレスモーターに、ブラシレスモーターに最大値と最小値のPWM信号を送ります。
先ほど紹介した参考URLを確認すると、ESCを使用するには、最大と最小のPWM信号を送る必要があるみたいなので、そのようにしてます。
void loop(){
delay(100);
analogWrite(PWMpin,val); //val値でPWM出力 1回目はsetup関数の10
while (Serial.available() > 0){ //何か入力されたら以下コード演算
char sp = Serial.read(); //char型 で シリアル入力読み込み
Serial.println(sp); //入力された文字を出力
delay(500);
switch (sp){ //switch文 入力された文字でパターン分け
case '1': //文字[1]の場合
val = 10; //valに10を代入
Serial.print("val = "); //[val=]という文字をシリアルモニタに出力
Serial.println(val); //valの数値をシリアルモニタに出力 ⇒『val=○○』と出る
break;
case '2': //文字[2]の場合、以下一緒
val = 20;
Serial.print("val = ");
Serial.println(val);
break;
~~~~~~~~~~~~~~~~~長いのでカット~~~~~~~~~~~~~~~~~~~~~~
case '7':
val = 70;
Serial.print("val = ");
Serial.println(val);
break;
case '8':
val = 80;
Serial.print("val = ");
Serial.println(val);
break;
case '0':
val = 0;
Serial.print("val = ");
Serial.println(val);
break;
}
delay(500);
val = min(VAL_MAX, val); //[VAL_MAX]と[val]で小さい方をvalに代入
val = max(VAL_MIN, val); //[VAL_MIN]と[val]で大きい方をvalに代入
}
}
void roop()関数では、setup()関数とは違い、繰り返し演算が行われます。
このroop()関数では、入力された数字によって、valの値が0~80(10刻み)で変更できるようにしています。
入力された数値と言いましたが、シリアルモニタでの入力は文字扱いになってます。なのでchar型で格納して、switch文のcaseは文字にする必要がありました。文字にするには””で囲めばOK。
最後のval = min(VAL_MAX, val) 、val = max(VAL_MIN, val) は保険です。
『val』の値が最大値を超えても『VAL_MAX』になり、最小値以下でも『VAL_MIN』になるようなスクリプトになってます。
以上が簡単に試したコードの紹介です。
コメント