goo blog サービス終了のお知らせ 

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

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

「TinyIRReceiver」ライブラリの「TinyIRReceiverData.justWritten」の位置が重要

2024年05月16日 11時49分20秒 | マイコン(ESP32・Arduino等)
「TinyIRReceiver」ライブラリ使用でなぜか信号を取りこぼす件(こちら
(←これはダメな例)
原因は「TinyIRReceiverData.justWritten = false;」の位置でした。

これは「次の信号の受取OK」という動作指定に使う命令だった。
標準「IRremote.h」の「receiver.resume(); 」相当(同じ命令にしろよ)

LEDの制御コードの終わった後でこの記述を書かないと、リモコン連打された場合、次の信号処理に入りたいが入れない状態になり結果信号を取り逃す。

あほですね。
ATtiny85はメモリが小さいからこのライブラリでないと動かんのよ。
これでダイソー電車制御も何とかなりそう。

調子こいて以前モーター暴走してた回路を組み直した。
まずはArduinoで。これはちゃんと動いってるぽかった。
続いてATTiny85に置き換え。
初めはちゃんと信号を受けてたが、しばらくあれこれやってるとまた暴走を始めた。
は???
M基盤の暴走か????
信号システムもイマイチ妙な反応をする。
ちっくしょう

もうやめた。
=======================
/*
  2024/4/16 
ATtiny85 にIRセンサーを付けて、Tiny:bitリモコンの
  IRはPB2に接続
*/

#include "TinyIRReceiver.hpp" // include the code
//#define IR_RECEIVE_PIN PB2
#define RED PB0
#define YELLOW PB3
#define GREEN PB4
//#define ENABLE_LED_FEEDBACK false tinyでは無効でした


void setup() {
pinMode(RED, OUTPUT);
pinMode(YELLOW, OUTPUT);
pinMode(GREEN, OUTPUT);
//pinMode(IR_RECEIVE_PIN, INPUT); // 記述不要

for (int i=0; i<4; i++){
digitalWrite(RED, HIGH); digitalWrite(YELLOW, HIGH); digitalWrite(GREEN, HIGH);
delay(300);
digitalWrite(RED, LOW); digitalWrite(YELLOW, LOW); digitalWrite(GREEN, LOW);
delay(300);
}
delay(3000);
if (!initPCIInterruptForTinyReceiver()) {
digitalWrite(RED, HIGH); digitalWrite(YELLOW, LOW); digitalWrite(GREEN, LOW);
if(true){
// 無限ループ
}
}
}

int cmd = 0xFF;

void loop() {
if (TinyIRReceiverData.justWritten) {
cmd = TinyIRReceiverData.Command;
if (cmd == 0x00){
digitalWrite( RED, HIGH );
digitalWrite( YELLOW, HIGH);
digitalWrite( GREEN, HIGH);
} else
if (cmd == 0x02){
digitalWrite( RED, LOW );
digitalWrite( YELLOW, LOW);
digitalWrite( GREEN, LOW);
} else
if (cmd == 0x10){
digitalWrite( RED, HIGH );
digitalWrite( YELLOW, LOW);
digitalWrite( GREEN, LOW);
} else
if (cmd == 0x11){
digitalWrite( RED, LOW );
digitalWrite( YELLOW, HIGH);
digitalWrite( GREEN, LOW);
} else
if (cmd == 0x12){
digitalWrite( RED, LOW );
digitalWrite( YELLOW, LOW);
digitalWrite( GREEN, HIGH);
} else{
digitalWrite(RED, LOW); digitalWrite(YELLOW, LOW); digitalWrite(GREEN, LOW);
}
TinyIRReceiverData.justWritten = false;  // ここな!
}
}

ATtiny85&開発ボード[ HW-260 ]まとめ

2024年05月16日 09時37分40秒 | マイコン(ESP32・Arduino等)


今までの経過をまとめてみた。

 IDEで使う関係ライブラリと、 
 HW-260基盤のUSB端子からプログラムコードを書込むためのデバイスドライバが必要(V-USBを使うため)

② ATtiny85にブートローダを書き込む
 DIPタイプで入手したチップにはV-USBで待ち受けるブートローダが必要になります。
 ArduinoUNOを書き込み器(ISP)にプログラムを入れ、それを使ってATtiny85へブートローダプログラムを書き込みます。
https://blog.goo.ne.jp/villanova555/e/df692b7e403e4b77db1e1ec4cf0c39e6

Attiny85を開発ボード[ HW-260 ]で使うメモ
 いよいよプログラミング開始
 その前に書くPINの機能、名称を整理しメモにしました。
 参考となるサイトのURLも掲載
https://blog.goo.ne.jp/villanova555/e/cb59c0c77d90d2b89190042a0f0fd432

ArduinoUnoで赤外線送受信のテスト(TinyReceiver使用)
 ATtiny85はメモリにあんまり余裕がないので、小型のIRライブラリを使ってArduino上で簡単なプログラムを作って動作検証してみました。
https://blog.goo.ne.jp/villanova555/e/dc9eb64513ea59508f40c39558008b54

各種赤外リモコンのボタン:値
 Arduino上のプログラムで、手持ちの赤外線リモコンの各ボタンがどういう数字を送っているのか確認しました。
https://blog.goo.ne.jp/villanova555/e/880402a26012c8719220060e7849c804

ATtiny85で赤外線リモコン信号を受けてLチカ
 Tiny:bitのリモコン信号でATtiny85に接続したLEDのON/OFFをやってみた。
https://blog.goo.ne.jp/villanova555/e/e5126228f3170bf0ff24b8d56362eb5f


⑦nanoを使った書き込みボード(なぜかエラーが出だした)
https://www.youtube.com/watch?v=NiMZWhrTfSA

⑧ArduinoISP書き込み自作シールド
https://www.youtube.com/watch?v=ajv5Q68vPY4

=========================
【番外編】
Arduinoから[ HW-260 ]基盤へICSPで書き込むPIN
https://blog.goo.ne.jp/villanova555/e/ec8fb3bb9bb0b61e1f61edc0bfb49dc6
インドのYoutuberさんのAttiny動画
https://www.youtube.com/playlist?list=PLss_FGfTlLAp_VmqrkfCl7b4BGmJXbFnJ

Copilotのやつは!

2024年05月15日 23時16分14秒 | マイコン(ESP32・Arduino等)
先日から赤外線リモコンで小型マイコンATtiny85を動かしてるが、うまく理解できない関数があって
それをどう使うのか色々Copilotに聞いたら・・・

論点をずらしたテキトーな答えが返ってきた挙げ句、要求もしていないのに示されたプログラムサンプルは・・・
私が書いているブログ内のソースとその解説だった。
(使ってる変数の命名規則で自身の物と判明 「m_speed」)
参照しているサイトは、トップに私のブログ記事、とGitとArduinoフォーラムの3個所だけ

(゚Д゚)ハァ?
テキトーなヤツだわ。やっぱり
でも世界中でこのライブラリを使ってる人が少ないことだけはわかったよ
もう昨日からの訳わからんバグ&トラブルで死ぬ
===========================


母艦PCでプログラム作成 -> ArduinoUnoで書き込み -> ATtiny85マイコン -> ATtiny85IC外して -> 動作用基盤へ差し替え -> 動作確認 -> NGでやり直し

PC上での開発と違ってデバッガが無いから、現時点ではLED点滅程度で動作を推定するしか無い。
更に効率アップのため作ったはずの書き込み基盤が、途中から意味不明のエラーを出しだして、これにも手を取られた。
Arduino基盤の数が限られてるのでここ数日、何回配線を組み直したのか(panic face)
赤外線通信の沼から抜け出せん。

ATtiny85で標準IRライブラリはでかすぎる orz

2024年05月15日 00時54分58秒 | マイコン(ESP32・Arduino等)
("TinyIRReceiver.hpp"ライブラリなら 20%使用でした。)

赤外線リモコンで連続コマンド送信するとメチャクチャ取りこぼす症状
なおらん・・・わからん

そもそも「tinyIRReceiver.hpp」では0xFFまでの「command」とか「value」が簡単に取得できてるんだが、標準ライブラリと互換性がない。
調べまくったらサンプル「」の中にやっと発見
int32_t cmd = IrReceiver.decodedIRData.command;
これな。

====================
こんどは取りこぼしの件
次の動作に入れないから取りこぼしてるんじゃないか?と疑っている。
なんとかネットで発見した「IrReceiver.resume();」を入れてみようと思った。
が、「tinyIRReceiver.hpp」にはresume()命令が無い。
しょうがないので標準ライブラリを使って見た。
そもそも「IRremote.h」ライブラリのサンプルはマクロオンパレード・ぐじゃグチャで、素人が読むような代物じゃない。
やっとこさ動いたのだが、ATTiny85ではメモリ不足で動かない。
寝るわ。
もう夕方から混乱しまくってウニになってます。
Pin番号がサンプル事に違ってたり、ISP設定を誤ったり、書き込み機が不調になったり、古いライブラリに嵌められたり・・・死ぬ

参考 さいと・・・ここ分かりやすいね。寝る前に気づいた。
  IRdata構造体はこちら
  IrReceiver.begin(11,true);  と書くと11pinで基盤LEDで受信が目で見えます。
     IrReceiver.begin(receiverPin,ENABLE_LED_FEEDBACK);
  受信データがFFFFFになる件 こちら  こちら
  古いライブラリを掴んでるのかも こちらでは4.2だと
  GitにTiny版のソース こちら

===================
/*
IRremoteを使いTinyIR と同等にキーだけ取り出すソース
   2024/5/14 やれやれ苦労したわ!「IrReceiver.decodedIRData.command」がわからんばかりに
*/
#include "IRremote.h"
const int IR_RECEIVE_PIN = 2; // 赤外線受信モジュール接続ピンをD2に
IRrecv irrecv(IR_RECEIVE_PIN);
decode_results results; // 赤外線受信結果を格納する

void setup() {
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(115200); // Status message will be sent to PC at 9600 baud

IrReceiver.enableIRIn(); // Start the receiver
// IrReceiver.blink13(true); // Enable feedback LED

Serial.print(F("--------------Ready to receive IR signals at pin "));
Serial.print(IR_RECEIVE_PIN);
Serial.print(F("--------------"));
}

uint32_t cmd = 0xFF;
void loop() {
//if (IrReceiver.decodedIRData.decodedRawData == 0x00000000) {
if (IrReceiver.decode()) { // Grab an IR code
cmd = IrReceiver.decodedIRData.command;
Serial.println(cmd);

IrReceiver.resume(); // 次の受信に備える
}
delay(200);
}


OLED(有機EL)関連記事まとめ

2024年05月14日 20時28分01秒 | マイコン(ESP32・Arduino等)
OLEDに関する過去実験記事を集めてみた。
ATTiny85で使うための復習用

1315チップ搭載OLED(U8g2ライブラリ)編
OLED 1513でバッファを使った文字&画像の表示まとめ(U8x8lib.h ライブラリ)

■腕時計型OLED



==================
クソGooBlog
・記事のバックアップがありますだと?バカ抜かすな
・連続してURLリンクを貼ると所々ですっ飛ばしやがる
相変わらずのクソ仕様
何年同じバグを抱えたままで運営しやがるんだ?

ATtiny85の書き込み基盤(ISP)を作った

2024年05月14日 13時57分03秒 | マイコン(ESP32・Arduino等)


昨晩ATtiny85でちょっとしたプログラムを作った。
せっかくなので、たちが悪い使っていなかったArduinoNanoをISPにしてブレッドボードへ組んで。



じゃがこのままにしておいても、脱線などろくな事にはならなので真面目に基盤へ作ってみることに。
18年前にPICをやってた頃買っていたZIFソケット+丸穴Pinソケットで下駄を履かせた豪華仕様なお作りで。(貧乏性でまだ使いまわしを考えてる)
どうせ机の中の肥やしを18年間努めてたのだから。
使わないほうがムダ
ヲヲヲ、現在は1000円ぐらいするんだな。

ArduinoUnoでは気づかなかったが、NANOのせいかコンデンサ無しでは妙な書き込み時のエラーが出るようになった。
ブレッドボードに戻しても、コンデンサなしではエラーになる事が判明
この基盤の配線問題ではない。


今回はきれいに作りたかったが・・・配線跨ぎが汚いね。
出来上がって気がついたが、思っていたのと配置が違う。
PCは左側にあるので、ICの1番ピンが逆の手前になってしまった。
今更直せん。ちっ
あれこれやったら3時間程度かかったようです。

======使い方=======

書き込み手順は
ターゲットMPUとCOMポートを選択し
ソースを書く


「Arduino as ISP」を選択し、



クロックを16NHzに設定し
Shift+CTRL+U (「書き込み装置を使って書き込む」)
で書き込む。



こんなエラーが出るのは、ICチップがちゃんと刺さっていないことが要因の一つ(そもそも老眼が元凶)

ArduinoとOLED1513とIRセンサーで物体の位置検知(ちょっとな・・)

2024年05月05日 21時35分28秒 | マイコン(ESP32・Arduino等)
スタックチャンみたいに、前にいる人物の方に視線を向けるプログラムをArduinoで作ってみようと。
使ったセンサーは余っている赤外線ユニット基盤
とりあえず基盤のピンで出力されるデジタル出力を使ってみた。
が、最大で10数cm程度までしかスキャンできない。
ちゅうことでこの計画は中止

「コインで自動販売機」に変身させるかな。
コインの高さを測って投入金額を計算させる。
規定金額になったら品物が出てくる。
お釣りは出さないよw


上記写真は縦位置を図る4個目のセンサーを付けている。(後で削除)

各基盤に5V電源を加えておいて、信号線を見る。
 何も検知しなければ通常はHIGHで、検知するとLOWになる。
デジタルピン3..5の3本を使って右、中央、左を監視



ダンボーくんで台座を組んでOLED1513へ状態表示してみた。
自分でOLEdプログラムを組みのは初めて。
気づき:clearLine()やclearDisplay()を使うと表示がチラつくので使えない。
 なので、空白を上書きするが吉。でなければバッファ転送かな。



左・中央センサー前に障害物を置いた。当然だけど反応してる。
何かこれだけ配線が整然としてると賢くなったような気がするw
とはいえ距離が出ないのでスタックチャンの視線切り替えには使えませんね。
OLEDのホルダを作ってやろう。つままれたままではかわいそうだ。
===========================
/*
赤外線センサー基盤を3個用意し、横一列に並べる
各センサーの状態をOLED 1513へ表示する
   2024/5/5
*/
#include "U8x8lib.h"
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);

#define RIGHT_PIN 3
#define MID_PIN 4
#define LEFT_PIN 5

void setup(void) {
pinMode(RIGHT_PIN, INPUT);
pinMode(MID_PIN, INPUT);
pinMode(LEFT_PIN, INPUT);
u8x8.begin();
// u8x8.setFont(u8x8_font_chroma48medium8_r); // 通常の小型文字
u8x8.setFont(u8x8_font_px437wyse700b_2x2_r); // 4倍角
}
#define right_ptr 2
#define mid_ptr 1
#define left_ptr 0
char sensor[ ] = "210";

void loop(void) {
if (digitalRead(RIGHT_PIN) == LOW) sensor[right_ptr] = '*'; else sensor[right_ptr] = '_';
if (digitalRead(MID_PIN) == LOW) sensor[mid_ptr] = '*'; else sensor[mid_ptr] = '_';
if (digitalRead(LEFT_PIN) == LOW) sensor[left_ptr] = '*'; else sensor[left_ptr] = '_';
u8x8.setCursor(0,2); u8x8.print(sensor);
}




OLED 1513でバッファを使った文字&画像の表示

2024年05月02日 18時23分35秒 | マイコン(ESP32・Arduino等)


【1315の説明】
https://wiki.seeedstudio.com/Grove-OLED-Display-0.96-SSD1315/

Grove - OLEDディスプレイ 0.96インチ(SSD1315)
Grove-OLEDディスプレイ0.96インチ(SSD1315)は、Grove I2Cインターフェースを備えたモノクロ(白)128×64ピクセルのパッシブディスプレイマトリックスモジュールです。

新しいSSD1315チップのおかげで、3.3Vで動作するため、高価なDC-DC昇圧回路が不要になりました。また、オンボードのレベルシフト回路により、新しいGrove-OLEDディスプレイ0.96インチは3.3Vおよび5Vプラットフォームで動作します。つまり、ArduinoのOLEDディスプレイやRaspberry PiのOLEDディスプレイなどとして簡単に使用できます。
特徴
3.3V/5V対応
変更可能なI2Cアドレス
低消費電力
モノクロ(白) 128×64 ピクセル
高コントラスト、高輝度
広い動作温度範囲:-40°C~+85°C
--------------
①文字だけなら「<U8x8lib.h>」ライブラリでバッファなし表示はOK
②あれこれやった結果、1315でグラフィックを使うには「U8g2lib」ライブラリ&描画バッファが必要なことがわかった。
 (②のサンプルソースはずっと下の方)

上記①②いずれも1306モードを流用して使ってる。
※U8x8libはU8g2libに含まれています。
全貌を理解するまで時間がかかり申した。

参考サイト様
https://lang-ship.com/blog/work/grove-beginner-kit-08-oled/
https://qiita.com/CoTechWorks/items/3b6ada2d0b5951b2e33c

ちなみに1306では「u8g2.firstPage()とu8g2.nextPage() 」を使ってグラフィックを描画してるみたいです。
DOWhileの間に描画命令を記述します。
u8g2.firstPage(); ← 描画開始
do {
  :
 描画命令
  :
} while (u8g2.nextPage()); 
こんな感じ。
でも、今回の1513では関係ないです。

①①①①①①①①①①①①①①①①①①①①①
① 文字だけ楽に書く U8x8ライブラリ ①
①①①①①①①①①①①①①①①①①①①①①

//====setup例======
#include <Arduino.h>
#include <U8x8lib.h>
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);
void setup(void) {
u8x8.begin();
u8x8.setFlipMode(1); // 上下反転モード
u8x8.setFont(u8x8_font_chroma48medium8_r);
}

//====事例 文字表示&上書き======
void loop(void) {
u8x8.setCursor(0, 0);     // 最下段は(0,7)
u8x8.print("Hello World!"); delay(3000);
u8x8.print("xxxxxxxxxxxx"); delay(3000);
u8x8.print("yyyyyyyyyy"); delay(3000);
u8x8.print("zzzzzzzzz"); delay(5000);
}
1行目で書き終えた次の位置からxxx・・が書かれて、改行なしにyyy・・,zzzが上書きされる。書き込む際には下側にあった文字は消去され重ね描きにはならない。

u8x8.setCursor(0, 0);
u8x8.print("Hello World!"); delay(3000);
u8x8.setCursor(0, 0);
u8x8.print("zzzz"); delay(5000);
結果は「zzzzoWorld!」が表示される

====事例 位置指定での文字表示======
u8x8.clearDisplay();   画面を全て消去する
u8x8.clearLine(3);    0..で始まる指定の行を消去する

void loop(void) {
u8x8.clearDisplay();
u8x8.setCursor(0, 0);
u8x8.print("Hello World!"); delay(3000);
u8x8.clearLine(0);

u8x8.setCursor(0, 3);
u8x8.print("HLine 3"); delay(3000);
u8x8.clearLine(3);
delay(5000);
}
====事例 フォントサイズ======
16*16 4倍角の文字
u8x8.setFont(u8x8_font_px437wyse700a_2x2_r);  // 太文字
u8x8.drawString(0, 0, "ABC defg");

u8x8.setFont(u8x8_font_px437wyse700b_2x2_r);  // 細文字
u8x8.drawString(0, 2, "ABC defg");
delay(2000);

u8x8.setFont(u8x8_font_inb33_3x6_n); 縦横15mm程度のフォント

====事例 反転文字======
結果はzzzzが通常文字で続けて[o world!]が反転で表示される

u8x8.setCursor(0, 0);
u8x8.setInverseFont(1); // 反転文字
u8x8.print("Hello World!"); delay(3000);

u8x8.setCursor(0, 0);
u8x8.setInverseFont(0); // 正常文字
u8x8.print("zzzz"); delay(5000);

====事例 書式付き文字表示======
 Escape文字、改行コード、.print / .println文
u8x8.clearDisplay();
u8x8.print("print \\n\n"); delay(500);
u8x8.println("println"); delay(500);
u8x8.println("done"); delay(1500);

====事例 数字の表示 ======
数字を表示する。桁合わせはせず長くなれば後ろへ伸びていく
for(int i = 0; i < 200; i++ )
{
u8x8.setCursor(0, 2);
u8x8.print(i); // Arduino Print function
delay(10);
}

====事例 0サプレス数値表示======
 先頭に0を埋めた数値を表示する
for(int i = 0; i < 100; i++ )
{
u8x8.drawString(0, 2, u8x8_u16toa(i, 5)); // U8g2 Build-In functions
delay(10);
}

====キー入力用関数======
OK/Cancelを選択させる4行の表示 OKは反転文字となる
u8x8.userInterfaceMessage("You selected the", "Cancel", "Button", " Ok ");

====事例 天候マークを描画する ======
u8x8.clearDisplay();
u8x8.drawString(0, 2, "Weather");
u8x8.setFont(u8x8_font_open_iconic_weather_4x4);
for(int c = 0; c < 6; c++ )
{
u8x8.drawGlyph(0, 4, '@'+c);
delay(300);
}
delay(5000);

※参考
https://github.com/olikraus/u8g2/wiki/fntgrpiconic

②②②②②②②②②②②②②②②②②②②
② バッファ利用のグラフィック描画 ②
②②②②②②②②②②②②②②②②②②②
/*
HiroCom777さんのサイトを参考にさせていただきました
  https://hirocom777.hatenadiary.org/entry/2020/11/14/233211

円やら矩形を描くサンプル
 2024/5/2  

*/
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* clock=*/SCL, /* data=*/SDA, /* reset=*/U8X8_PIN_NONE); // High speed I2C

void setup() {
u8g2.begin();
u8g2.setFlipMode(0);
u8g2.setFont(u8g2_font_ncenB08_tr); // フォントを選ぶ

u8g2.clearBuffer(); // バッファクリア
u8g2.setCursor(0, 15); // dot単位で左上が(0,0)で、文字非dリシタの座標を指定する
u8g2.print("Hello 1513 !");
u8g2.sendBuffer(); // バッファ表示
delay(3000);
}

void loop() {
for (int i = 0; i <= 7; i++) {
u8g2.clearBuffer(); // clear the internal memory
if (i == 0) { //線を描く
u8g2.drawLine(20, 5, 120, 50);
} else if (i == 1) { //四角形を描く
u8g2.drawFrame(50, 7, 42, 55);
} else if (i == 2) { //四角形を描く(塗りつぶし)
u8g2.drawBox(30, 2, 25, 50);
} else if (i == 3) { //円を描く
u8g2.drawCircle(50, 30, 30, U8G2_DRAW_ALL);
} else if (i == 4) { //三角形を描く(塗りつぶし)
u8g2.drawTriangle(20, 5, 27, 50, 120, 25);
} else if (i == 5) { //四角形を描く(角丸)
u8g2.drawRFrame(3, 7, 110, 25, 3);
} else if (i == 6) { //四角形を描く(角丸、塗りつぶし)
u8g2.drawRBox(3, 7, 100, 50, 5);
} else if (i == 7) { //楕円を描く
u8g2.drawEllipse(20, 25, 15, 10, U8G2_DRAW_ALL);
}
u8g2.sendBuffer();
delay(1000);
}
}



届いたOLEDは1315チップものだった

2024年04月26日 23時36分35秒 | マイコン(ESP32・Arduino等)

青いやつ
128*64でI2C接続



AliExから1315チップを使ったOLED基盤を送ってきた。
1個284円でした。+50円送料
3.3Vで動きます。



しか~し、なんじゃこりゃ。普通チップは1306だろ?
基盤裏を見ると「1315」と書いてある。
ま、しょうがない。説明書きには一切その手のことは書かれていなかった。
PIN端子まではんだ付けされている。
(当然)1306では動かなかったので1315ライブラリを探す、がライブラリマネジャでは発見できん!
が、「Lang-Ship」さん簡潔な記事を書いていただいていた。こちら
いつもありがとうございます!!!
あっさりと「Helloworld」動きました。
(とはいいつつ、ここまで来るのにあれこれ試行錯誤で結構時間かかってる)



今回は「U8g2」ライブラリを使いました。初回コンパイル遅い・・
「U8x8 」はテキストだけのようで軽いかな。
このライブラリは以前OLEDをSPIで使うため入れていた。
記事はこちら



簡単なテストサンプルがあったので記念にメモとして残させてくださいね。
LangShipさんからいただきました。
表示を「setFlipMode 」で逆に指定してあります。(通常は0です)

#include ”Arduino.h”
#include ”U8x8lib.h”

U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);

void setup(void) {
u8x8.begin();
u8x8.setFlipMode(1);
}

void loop(void) {
u8x8.setFont(u8x8_font_chroma48medium8_r);
u8x8.setCursor(0, 0);
u8x8.print("Hello World!");
}



[ 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 いい加減いせんか