モーター内蔵のエンコーダーからPico外部割り込みを使って回転数を計測してみます。以前Arduinoで行った内容と同じことのPico版です。
使用するモーターはこれ
以前アリエクから入手したブラシレスDCモーター。
駆動ドライバとエンコーダーが内蔵されているのでArduinoなどと直接つないで割と簡単に制御できます。今回はこの内蔵エンコーダーの情報をPicoで読み取って回転数を計測してみます。まずはスリットの数を確認してみます。
void setup() { attachInterrupt(10, CALL_ENC1A, RISING); } void loop() { } void CALL_ENC1A() { enc1_count++; }
直接スリットの数を数えるのはきついので信号から読み取ってみます。エンコーダーから出ている線の1本をPico10ピンに接続、ピンがHighになる回数を割り込みを使ってカウントしているだけのソースです。
かなりアバウトな測定ですが、おそらく1週で100カウント(100スリット)のようです。またエンコーダーからの信号は2本あるようですので一般的なA/B相でのカウントになっているようです。
とりあえず単純にA相の立ち上がりエッジで割り込みを発生させて回転速度を測定してみます。
void setup() {
attachInterrupt(10, CALL_ENC1A, RISING);
}
void loop() {
currentTime = micros();
if (currentTime - mainLoopTime >= 100000) { //100ms 10Hz
mainLoopTime = micros();
motor1_rpm = 10.0 * 60.0 * (float)enc1_count / 100.0;
enc1_count = 0;
dt = micros() - mainLoopTime;
}
}
void CALL_ENC1A() {
gpio_get(11) == 0 ? enc1_count++ : enc1_count--;
}
A相に10ピン、B相に11ピンを割り当て。割り込み時(A相立ち上がり時)にB相のHIGH/LOWを確認して、カウントを増減してます。メインループでは100ms毎にカウント数から回転数(rpm)に変換してます。
手動で適当にモーター廻して、回転速度[rpm]をシリアルモニタしてます。若干解像度が粗いですが問題無く計測できそう。
A相/B相でそれぞれでピン変化割り込みを使用したパターンです。
void setup() { attachInterrupt(10, CALL_ENC1A, CHANGE); attachInterrupt(11, CALL_ENC2B, CHANGE); } void loop() { currentTime = micros(); if (currentTime - mainLoopTime >= 100000) { //100ms 10Hz mainLoopTime = micros(); motor1_rpm = 10.0 * 60.0 * (float)enc1_count / 400.0; enc1_count = 0; dt = micros() - mainLoopTime; } } void CALL_ENC1A() { if (gpio_get(10) == 1) gpio_get(11) == 0 ? enc1_count++ : enc1_count--; if (gpio_get(10) == 0) gpio_get(11) == 1 ? enc1_count++ : enc1_count--; } void CALL_ENC2B() { if (gpio_get(11) == 1) gpio_get(10) == 1 ? enc1_count++ : enc1_count--; if (gpio_get(11) == 0) gpio_get(10) == 0 ? enc1_count++ : enc1_count--; }
今回は回転方向とだいたいの相対速度が分かればいいのでこれで行きます。
コメント