酒と薔薇の日々(その2)

好きなことだけ求めて生きるアスペ気味のINTJ人

[ MX1508 ] を使ってみた(TinyIRライブラリ受信とanalogWriteでモータ制御)

2024年04月24日 19時18分51秒 | マイコン(ESP32・Arduino等)
問題解決しました こちら
---------------------
既存のIR制御と接続してみた。
今までの基盤と同じ構成なので、繋ぎ変えただけ。
前よりモーターの勢いが強く感じる。

動くには動いたのだが、最近IRリモコンの命令を無視する挙動が多すぎる。
動き出したら停止や逆転が不可能になることが頻発。困った。
古い基盤ではそれが非常に起きにくいことが更に混乱に拍車をかけた。
結局、IRの受信とanalogWriteが割り込み競合しているのではないかと疑っている。
すべてをdigitalWriteで書いたらちゃんと動いた(ようだ)
(ポンコツリモコンのチャタリングも意味不明にしていたのかもしれない)
これは解決しました(2024/5/16)
TinyIRReceiverData.justWritten = false;
を各場所が間違ってました。


もうぐじゃぐじゃです。ハイ
いつもながら、疲れまくった。

/*  以下はちゃんと動いた修正後のソース
Arduino Unoで1モーター制御 Attiny85へ移行する前準備
IR受信はTinyライブラリ
2024/5/16
*/
//#include "Arduino.h"
//#include "PinDefinitionsAndMore.h"
#include "TinyIRReceiver.hpp"

#define LED_pin 13

const int A1A = A0; // PB0; // Pin5(PWM)
const int A1B = A1; // PB1; // Pin6(PWM)

int m_speed = 255; // モータパワー

void setup() {
Serial.begin(115200);
Serial.println("start IR motor control");
pinMode(LED_pin, OUTPUT);
//------ Motor -----------
pinMode(A1A, OUTPUT);
pinMode(A1B, OUTPUT);
// ------- IR ----------
if (!initPCIInterruptForTinyReceiver()) {
if(true){
// 無限ループ
digitalWrite(LED_pin,HIGH);
delay(200);
digitalWrite(LED_pin,LOW);
delay(200);
}
}else{
Serial.println("start IR read");
}
delay(100);
}

int cmd = 255;

void loop() {
if (TinyIRReceiverData.justWritten) {
Serial.print(F("Address=0x"));
Serial.print(TinyIRReceiverData.Address, HEX);
Serial.print(' ');
cmd = TinyIRReceiverData.Command;
Serial.print(cmd, HEX);
if (TinyIRReceiverData.Flags == IRDATA_FLAGS_IS_REPEAT) {
Serial.print(F(" Repeat"));
}
if (TinyIRReceiverData.Flags == IRDATA_FLAGS_PARITY_FAILED) {
Serial.print(F(" Parity failed"));
}
Serial.println();
}
// Serial.println(cmd,HEX);

//------- my code ---------
if (cmd == 0x00) {
digitalWrite(LED_pin, HIGH);
forward();
} else if (cmd == 0x02) {
digitalWrite(LED_pin, HIGH);
back();
} else {
digitalWrite(LED_pin, LOW);
stop();
}
TinyIRReceiverData.justWritten = false;  // ここに書く 重要!
delay(500);
}

void handleReceivedTinyIRData() {
printTinyReceiverResultMinimal(&Serial);
}

//--------停止----------
void stop() {
analogWrite(A1A, 0);
analogWrite(A1B, 0);
}
//--------後退----------
void back() {
analogWrite(A1A, m_speed);
analogWrite(A1B, 0);
}
//--------前進-----------
void forward() {
analogWrite(A1A, 0);
analogWrite(A1B, m_speed);
}


====== 以下は経過 =========
リモコンコマンドは左から01・02・03で、正転・停止・逆転としている。
良く観察すると
01、02までは一応OK。たまに反応が悪くなる
03が入るとかなりの確率で暴走する。
停止命令その他を送信しても何も受け付けなくなる。
あるいは03が入って回りだすと02が入ってきても03と認識する。
モータにコンデンサ付けても効果なし
意味わからん。
 :
少しわかった。
モーターが回転中だとIRレシーバの命令を上手く受け取れなくなる。
特に03の場合は全然ダメになる。
01,02はまだ受け取れてなんとか止まるんだけど。

ちなみにPWMパワーを下げすぎてモータが回れない電力になった場合は、すべてのIRコマンドを正しく認識している。
これは結局回路内の電力問題ではないのか???

ちゅうことで、元のモータードライバ基盤へ戻してみた。
ちゃんと動くではないか!!!!!!
くっそー、モータドライブ基盤がポンコツなのか???
それともニッケル水素2本でやってるのがマズイのか??
それではと、元のまともに動く基盤上で電池をニッケル水素3本直列の3.6Vにしてみた。
なんと、新基盤と同じ状態、メチャクチャ動作が不安定になる!!
をいをい・・・

風呂に入りながらふと思った。
う~ん、もしかするとPWM機能がIR受信を妨げているのか?
IR受信は割り込みを使って(?)パルスを読んでいるのでは?
PWMもTimer割り込みを使ってやってたかも。
そうするともしかすれば競合が発生するよなぁ

むむむっ 案外そうかもしれん・・・
で、すべてをdigitalWrite命令に置き換えてみた。
なんか上手くいってるっぽいが、リモコンのチャタリングが疑われる。
キーアサインを変えてみた。
いいじゃんか!

相変わらずLink挿入を連続して行うとパーになるGooBlog いい加減いせんか


この記事についてブログを書く
« MX1508 モータドライバ基盤の... | トップ | AliExなんでこんなに安くて早... »