回すだけ IQ2306 (2) コマンドを使う-1 ステータス
前回、ブラシレスDCモータIQ2306の概要を説明しました。MKRZEROには二つのUARTがあります。MKRZEROの13/14番UARTとモータをつないで、各種コマンドを実行します。
- シリアルコンソールはUSB-serial Serialでアクセス
- 13/14番のUARTとはSerial1でアクセス
コマンドの詳細はこちらにあります。
●マイコンの温度
Sub ID | Short Name | データ・ タイプ |
単位 | 備考 |
---|---|---|---|---|
0 | uc_temp | float | ℃ | マイコンの温度 |
1 | filter_fs | uint32 | Hz | ローパス・フィルタのサンプル周波数 |
2 | filter_fc | uint32 | Hz | ローパス・フィルタのカットオフ周波数 |
3 | otw | float | ℃ | 過熱警告。 モータのディレーティングが開始される |
4 | otlo | float | ℃ | 過熱ロックアウト。 この温度でモータのディレーティングが終了し、モータは完全に無効になる |
5 | derate | float | PU | モータに適用されるディレーティングの量[0 1] |
コマンドは上記のShort Nameの項目に書かれており、スケッチではShort Nameの最後にアンダスコアを追加します。
温度を表示するスケッチです。
#include <iq_module_communicaiton.hpp>
IqSerial ser(Serial1); // MKRZERO 13;Rx,14;Tx
TemperatureMonitorUcClient tmp(0);
void setup() {
Serial.begin(9600); // USB-serial console
Serial.println("Start ");
Serial1.begin(4800); // independent UART
ser.begin();
}
void loop() {
float temperature = 0.0f;
if(ser.get(tmp.uc_temp_,temperature))
Serial.println(temperature);
delay(1000);
}
実行例です。
●パワー・モニタ
モータ(モジュール)にかかる電圧や流れる電流を取得します。
Sub ID | Short Name | データ・ タイプ |
単位 | 備考 |
---|---|---|---|---|
0 | volts | float | V | モジュールへの入力電圧 |
1 | amps | float | A | モジュールへの入力電流 |
2 | watts | float | W | モジュールへの入力ワット数 |
3 | joules | float | J | モジュールによって消費される総エネルギー |
4 | reset_joules | - | - | ジュールをゼロに設定 |
5 | filter_fs | uint32 | Hz | ローパス・フィルタのサンプル周波数 |
6 | filter_fc | uint32 | Hz | ローパス・フィルタのカットオフ周波数 |
7 | volts_raw | uint16 | bit | |
8 | amps_raw | uint16 | bit | |
9 | volts_gain | float | V/bit | |
10 | amps_gain | float | A/bit | |
11 | amps_bias | float | bit |
上記の温度のスケッチに、電圧の表示を追加しました。
#include <iq_module_communicaiton.hpp>
IqSerial ser(Serial1); // MKRZERO 13;Rx,14;Tx
TemperatureMonitorUcClient tmp(0);
PowerMonitorClient pwr(0);
void setup() {
Serial.begin(9600); // USB-serial console
Serial.println("Start ");
Serial1.begin(4800); // independent UART
ser.begin();
}
void loop() {
float temperature = 0.0f;
float voltage = 0;
if(ser.get(tmp.uc_temp_,temperature))
Serial.println(String(temperature) + "'C");
if(ser.get(pwr.volts_,voltage))
Serial.println(String(voltage) + "V");
delay(1000);
}
実行例です。
●ブザー
モータに内蔵されているビープ音のコントロールをします。コントロールは標準のMIDIコマンドを模倣し、MIDIからブザー・コントロール・コマンドへの簡単な変換すると解説に書かれていますが、詳細不明です。
Sub ID | Short Name | データ・ タイプ |
単位 | 備考 |
---|---|---|---|---|
0 | ctrl_mode | uint8 | enum | no_change = -1, brake=0, coast=1, note=2, song=3 |
1 | ctrl_brake | - | - | ローパス・フィルタのサンプル周波数 |
2 | ctrl_coast | - | - | ローパス・フィルタのカットオフ周波数 |
3 | ctrl_note | - | - | 発生指令。事前に「hz」と「volume」を設定しておく |
4 | volume_max | float | V | 最大電圧 |
5 | hz | uint16 | Hz | 音の周波数 |
6 | volume | uint8 | 0~127 | 音量 |
7 | duration | uint16 | ms | 音の長さ。 設定ない場合、最大値(65535ms) |
前記のスケッチに音(tone)を出す部分を追加しました。
#include <iq_module_communicaiton.hpp>
IqSerial ser(Serial1); // MKRZERO 13;Rx,14;Tx
TemperatureMonitorUcClient tmp(0);
PowerMonitorClient pwr(0);
BuzzerControlClient buz(0);
void setup() {
Serial.begin(9600); // USB-serial console
Serial.println("Start ");
Serial1.begin(4800); // independent UART
ser.begin();
}
uint16_t oto = 440;
void loop() {
oto +=10;
float temperature = 0.0f;
float voltage = 0;
if(ser.get(tmp.uc_temp_,temperature))
Serial.println(String(temperature) + "'C");
if(ser.get(pwr.volts_,voltage))
Serial.println(String(voltage) + "V");
ser.set(buz.hz_,oto);
ser.set(buz.volume_,(uint8_t)127);
ser.set(buz.duration_,(uint16_t)500);
ser.set(buz.ctrl_note_);
delay(1000);
}