質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

580閲覧

1つのスケッチで8つのM5stackを動作させたい。どのようにコーディングすればいいかわからないです。

AyTfield

総合スコア2

M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2023/12/06 14:48

実現したいこと

特定の物資の場所に誘導するためのアニメーションをM5stackとIRを使って行いたい。

前提

8つのM5stack(gray)を使用し、M5stackがリモコンから目的のものがある場所のIRコードを受信したら、
そこへM5stackのLCDで誘導するということをしたいのです。
1つのスケッチをすべてのM5stackに書き込んで動作するようにしたい。
手ごろな価格でやりたいので受信だけのモジュールを使っています。
イメージ説明

発生している問題・エラーメッセージ

どのようなシステムを組めばいいか悩んでいます。
主に33行目の identifyM5stackです。
(自分がどのM5stackの場所でリモコンのIRコードを送信したかは重要で、
どのようなプログラムを書いたらいいか調べてみましたが見当がつきません。)

該当のソースコード

C++

1#include <M5Stack.h> 2#define LGFX_USE_V1 3#define LGFX_AUTODETECT 4#include <LovyanGFX.hpp> 5#include <LGFX_AUTODETECT.hpp> 6#include <IRremote.h> 7 8//M5stack判別用 9#define M5STACK_1_IR_CODE 0x68B47 10#define M5STACK_2_IR_CODE 0xA50 11#define M5STACK_3_IR_CODE 0xA90 12#define M5STACK_4_IR_CODE 0xA8B47 13#define M5STACK_5_IR_CODE 0x66B47 14#define M5STACK_6_IR_CODE 0xE6B47 15#define M5STACK_7_IR_CODE 0x16B47 16#define M5STACK_8_IR_CODE 0x96B47 17 18int RECV_PIN = 21; 19IRrecv irrecv(RECV_PIN); 20decode_results results; 21 22static LGFX lcd; // LGFXのインスタンス 23static LGFX_Sprite sprite(&lcd); // LGFX_Spriteのインスタンス 24 25int spriteX = 320; //アニメーション用X座標 26int spriteY = 240; //アニメーション用Y座標 27int framesB = 0; 28int framesR = 0; 29int framesL = 0; 30 31//自分がどのM5かをそれぞれと照らし合わせて探索する 32//int currentM5stack は現在地を特定 33int identifyM5Stack(unsigned long irCode, int currentM5stack) { 34 // 受信した信号をもとに、どのM5Stackからの信号かを判別 35 36} 37 38void codeNotFound() { 39 lcd.clear(); 40 lcd.setTextColor(WHITE); 41 lcd.setTextSize(3); 42 lcd.setCursor(30, 120); 43 lcd.println("code not found"); 44} 45 46//横向きの矢印 47void drawSpriteArrowX() { 48 sprite.clear(); 49 sprite.setColor(lcd.color332(255, 255, 255)); 50 sprite.fillTriangle(160,30, 160,210, 290,120, WHITE); //三角 3点 51 sprite.fillRect(30,90, 130, 60, WHITE); //四角 x, y, w, h, color 52} 53//縦向きの矢印 54void drawSpriteArrowY() { 55 sprite.clear(); 56 sprite.setColor(lcd.color332(255, 255, 255)); 57 sprite.fillTriangle(160,20, 91,130, 229,130, WHITE); //三角 3点 58 sprite.fillRect(130,120, 60, 110, WHITE); //四角 x, y, w, h, color 59} 60 61void moveR() { 62 if (framesR > 0) { 63 drawSpriteArrowX(); 64 sprite.setRotation(0); 65 sprite.pushSprite(spriteX, 0); 66 67 // スプライトを右に移動させる 68 spriteX += 5; // 移動距離 69 70 // スプライトが画面外に出たら初期位置に戻す 71 if (spriteX > 320) { 72 spriteX = -320; 73 } 74 framesR --; //フレームを移動 75 } 76} 77 78void moveL() { 79 if (framesL > 0) { 80 drawSpriteArrowX(); 81 sprite.setRotation(2); 82 sprite.pushSprite(spriteX, 0); 83 84 // スプライトを左に移動させる 85 spriteX -= 5; // 移動距離 86 87 // スプライトが画面外に出たら初期位置に戻す 88 if (spriteX < -320) { 89 spriteX = 320; 90 } 91 framesL --; //フレームを移動 92 } 93} 94 95void moveB() { 96 if (framesB > 0) { 97 drawSpriteArrowY(); 98 sprite.setRotation(4); 99 sprite.pushSprite(0, spriteY); 100 101 // スプライトを上から下に移動させる 102 spriteY += 5; // 移動距離 103 104 // スプライトが画面外に出たら初期位置に戻す 105 if (spriteY > 240) { 106 spriteY = -240; 107 } 108 framesB --; //フレームを移動 109 } 110} 111 112void setup(void) { 113 M5.begin(); 114 delay(100); 115 WiFi.begin(ssid, password); 116 Serial.begin(115200); 117 irrecv.enableIRIn(); 118 lcd.init(); 119 120 lcd.setBrightness(200); 121 122 sprite.setPsram(true); 123 sprite.setColorDepth(8); 124 sprite.createSprite(320, 240); 125 126 lcd.println("Successed"); 127 server.begin(); 128 lcd.clear(); 129} 130 131void loop(void) { 132 if (irrecv.decode(&results)) { 133 irCode = results.value; 134 if (currentM5stack == 1) { 135 switch (irCode) { 136 case M5STACK_1_IR_CODE: 137 /* 138 target時の動作 139 */ 140 break; 141 case M5STACK_2_IR_CODE: 142 case M5STACK_3_IR_CODE: 143 case M5STACK_4_IR_CODE: 144 framesR = 360; 145 break; 146 case M5STACK_5_IR_CODE: 147 case M5STACK_6_IR_CODE: 148 case M5STACK_7_IR_CODE: 149 case M5STACK_8_IR_CODE: 150 framesB == 240; 151 break; 152 default: 153 codeNotFound(); 154 } 155 } 156 if (currentM5stack == 2) { 157 switch (irCode) { 158 case M5STACK_2_IR_CODE: 159 /* 160 target 161 */ 162 break; 163 case M5STACK_1_IR_CODE: 164 framesL = 360; 165 break; 166 case M5STACK_3_IR_CODE: 167 case M5STACK_4_IR_CODE: 168 framesR = 360; 169 break; 170 case M5STACK_5_IR_CODE: 171 case M5STACK_6_IR_CODE: 172 case M5STACK_7_IR_CODE: 173 case M5STACK_8_IR_CODE: 174 framesB = 240; 175 break; 176 default: 177 codeNotFound(); 178 } 179 } 180 if (currentM5stack == 3) { 181 switch (irCode) { 182 case M5STACK_3_IR_CODE: 183 /* 184 target 185 */ 186 break; 187 case M5STACK_1_IR_CODE: 188 case M5STACK_2_IR_CODE: 189 framesL = 360; 190 break; 191 case M5STACK_4_IR_CODE: 192 framesR = 360; 193 break; 194 case M5STACK_5_IR_CODE: 195 case M5STACK_6_IR_CODE: 196 case M5STACK_7_IR_CODE: 197 case M5STACK_8_IR_CODE: 198 framesB = 240; 199 break; 200 default: 201 codeNotFound(); 202 } 203 } 204 if (currentM5stack == 4) { 205 switch (irCode) { 206 case M5STACK_4_IR_CODE: 207 /* 208 target 209 */ 210 break; 211 case M5STACK_1_IR_CODE: 212 case M5STACK_2_IR_CODE: 213 case M5STACK_3_IR_CODE: 214 framesL = 360; 215 break; 216 case M5STACK_5_IR_CODE: 217 case M5STACK_6_IR_CODE: 218 case M5STACK_7_IR_CODE: 219 case M5STACK_8_IR_CODE: 220 framesB = 240; 221 break; 222 default: 223 codeNotFound(); 224 } 225 } 226 if (currentM5stack == 5) { 227 switch (irCode) { 228 case M5STACK_5_IR_CODE: 229 /* 230 target時の動作 231 */ 232 break; 233 case M5STACK_1_IR_CODE: 234 case M5STACK_2_IR_CODE: 235 case M5STACK_3_IR_CODE: 236 case M5STACK_4_IR_CODE: 237 framesB = 240; 238 break; 239 case M5STACK_6_IR_CODE: 240 case M5STACK_7_IR_CODE: 241 case M5STACK_8_IR_CODE: 242 framesL == 360; 243 break; 244 default: 245 codeNotFound(); 246 } 247 } 248 if (currentM5stack == 6) { 249 switch (irCode) { 250 case M5STACK_6_IR_CODE: 251 /* 252 target時の動作 253 */ 254 break; 255 case M5STACK_1_IR_CODE: 256 case M5STACK_2_IR_CODE: 257 case M5STACK_3_IR_CODE: 258 case M5STACK_4_IR_CODE: 259 framesB = 240; 260 break; 261 case M5STACK_5_IR_CODE: 262 framesR = 360; 263 break; 264 case M5STACK_7_IR_CODE: 265 case M5STACK_8_IR_CODE: 266 framesL == 360; 267 break; 268 default: 269 codeNotFound(); 270 } 271 } 272 if (currentM5stack == 7) { 273 switch (irCode) { 274 case M5STACK_7_IR_CODE: 275 /* 276 target時の動作 277 */ 278 break; 279 case M5STACK_1_IR_CODE: 280 case M5STACK_2_IR_CODE: 281 case M5STACK_3_IR_CODE: 282 case M5STACK_4_IR_CODE: 283 framesB = 240; 284 break; 285 case M5STACK_5_IR_CODE: 286 case M5STACK_6_IR_CODE: 287 framesR = 360; 288 break; 289 case M5STACK_8_IR_CODE: 290 framesL == 360; 291 break; 292 default: 293 codeNotFound(); 294 } 295 } 296 if (currentM5stack == 8) { 297 switch (irCode) { 298 case M5STACK_8_IR_CODE: 299 /* 300 target時の動作 301 */ 302 break; 303 case M5STACK_1_IR_CODE: 304 case M5STACK_2_IR_CODE: 305 case M5STACK_3_IR_CODE: 306 case M5STACK_4_IR_CODE: 307 framesB = 240; 308 break; 309 case M5STACK_5_IR_CODE: 310 case M5STACK_6_IR_CODE: 311 case M5STACK_7_IR_CODE: 312 framesR = 360; 313 break; 314 default: 315 codeNotFound(); 316 } 317 } 318 irrecv.resume();//信号待機 319 } 320 //sprite移動 321 moveB(); 322 moveR(); 323 moveL(); 324}

補足情報

wifiや送受信モジュールを使用したほうがいいのでしょうか?
また、コードがおかしなところがあればご指摘お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

「ものを作る」という観点からみて、順番がめちゃくちゃです。

なんで、どうすればいいのかわかっていないのにプログラムが書けるのでしょう/書き始めてしまうのでしょう?
プログラムは、コンピュータに対して「こうしなさい」という命令です。コンピュータはあなたが命令した通りにしか動きません/動けません。あなた自身が「どのようなシステムを組めばいいか悩んでいます。」という状態であるなら、そんなあなたが書いたコードがまともな動作をすることはほぼあり得ないです。

プログラムは「こうする」というのが決まってから書きましょう。
もちろん、「上手くいくかどうかわからないけど、これを試してみよう」という行為はあり得ます。が、それはそのレベルで「こうする」が決まっているわけで、「これで上手くいく」「こういう問題があったから改善しよう」とか「この方法はダメだから考え直し」という決断をするための手段です。決して「わからない」と頭を抱え続けるためのものではありません。

「こういうことをやりたいがどうしたら」というレベルの質問であればまた別の回答となりますが、その場合には「何をやりたいのか」の説明がちゃんと為されていることが重要です。今回であれば倉庫?の広さ(=送受信機間の距離)とか。
IRリモコンも、M5Stackの電波モノも多分数メートルしか届かない、と考えたほうが安全かと思います。それは倉庫の広さに対して十分なのでしょうか?
また、「手頃な価格でやりたい」と言って多分数十円の赤外線LEDをケチろうとして、それでいて数千円のM5Stack Grayを8個もつかおうというのもどう解釈してよいのかわかりません(Grayはすでに完了品ですから在庫なのかも知れませんが)。

私が作るなら例えば IR受信モジュールは1番のM5Stackだけに設けて、あとは無線(多分ESP-Now)でつないで、マルチホップ的に(1->2,3,4, 3->5,6, 6->7,8)へリレー送信。スケッチは共通にしても、個体識別はあらかじめspiffsで個別にデータとして持っておく、なんていうあたりの構成にしそうな気がします。マルチホップができるかどうかはちょっと実験確認が必要ですが。(安く仕上げたければM5Stackは使わないでAtomかな)

投稿2023/12/06 23:24

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AyTfield

2023/12/07 13:45

ありがとうございます。構成の目安がつきました。試してみたいと思います。
guest

0

自分がどのM5stackの場所でリモコンのIRコードを送信したか

これは装置毎にプログラムで指定する(=別のプログラムを載せる)のでなければ、勝手に判定する方法はありませんので、何らかの方法で設置場所を教える必要があります。

1つめは、起動時にボタンを使うなどして、設置場所を設定するようにプログラムすることです。
ボタンを押すたびに番号が変わるなどいろいろな動作が考えられます。

ただ、これだと、電源を入れるたびに設定しなければなりません。

2つめは
汎用ポートにDIPスイッチなどを付けて、そのスイッチの状態で場所を指定するものです。

3回路のDIPスイッチなら、8個のM5stackを区別できます。
https://akizukidenshi.com/catalog/g/gP-09992/

投稿2023/12/07 01:12

編集2023/12/07 06:28
TakaiY

総合スコア13687

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AyTfield

2023/12/07 13:49

ありがとうございます。手軽さを重視したいのでWiFiで試してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問