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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

M5Stack

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

C++

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

Q&A

解決済

1回答

243閲覧

M5Core2を用いた実験のLEDのPWM制御について

yamatttt

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

M5Stack

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

C++

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

0グッド

0クリップ

投稿2024/04/18 15:25

編集2024/04/18 22:53

実現したいこと

M5Core2に付属しているLEDを蛍のように光らせるプログラムを作りたい。

発生している問題・分からないこと

自分なりにwhile文やif文を使ってプログラムを作成してみたが、思うように動かなかった。

該当のソースコード

vs

1#include <M5Core2.h> 2void setup() { 3 M5.begin(true, true, true, true); 4 M5.Lcd.setTextSize(3); 5 M5.Lcd.setCursor(0, 0); 6 M5.Lcd.printf("LED PWM2"); 7} 8 9#define PERIOD 10000 // PWMの周期10000μs 10int ontime = 0; // LEDがONの時間 グローバル変数 11 12void loop() { 13 ontime += 50; // 毎回ontimeを増やす 14 if (ontime > PERIOD) { ontime = 0; } // PERIODを超えたら0に戻す 15 16 M5.Axp.SetLed(true); // LED ON 17 delayMicroseconds(ontime); //待機 マイクロ秒単位 18 M5.Axp.SetLed(false); // LED OFF 19 delayMicroseconds(PERIOD - ontime); //待機 マイクロ秒単位 20}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果
コード #include <M5Core2.h> void setup() { M5.begin(true, true, true, true); M5.Lcd.setTextSize(3); M5.Lcd.setCursor(0, 0); M5.Lcd.printf("LED PWM2"); } #define PERIOD 10000 // PWMの周期10000μs int ontime = 0; // LEDがONの時間 グローバル変数 void loop() { if (ontime == 0) { while (ontime == PERIOD) { ontime += 50; M5.Axp.SetLed(true); // LED ON delayMicroseconds(ontime); //待機 マイクロ秒単位 M5.Axp.SetLed(false); // LED OFF delayMicroseconds(PERIOD - ontime); //待機 マイクロ秒単位 } } if(ontime == PERIOD) { while (ontime == 0) { ontime -= 50; M5.Axp.SetLed(true); // LED ON delayMicroseconds(ontime); //待機 マイクロ秒単位 M5.Axp.SetLed(false); // LED OFF delayMicroseconds(PERIOD - ontime); //待機 マイクロ秒単位 } } }

補足

上記のように変更してみました。上記のプログラムでやりたかったこととしてはまず、ontimeが最初は0なのでloopの中のif(ontime==0)のほうが選択され、ontimeがPERIODの値になるまで50ずつ光らせながら増加させます。次にif(ontime==PERIOD)のほうに処理が向かい、今度は10000から50ずつontimeが0になるまで、光らせながら減少させます。これをvoid loop()の中で繰り返し行えば蛍のように光ると思ったのですが、うまくいきまでんでした。初心者なのでwhile文とif文をこのように使ってよいのかもわかりません。エラーは出なかったので、LEDを光らせる部分のプログラムが悪かったのかもしれないと思いました。
例えば、void loop()の中で0から100まで一定の数ずつ増加させ、そのあと100から0まで一定の数ずつ減少させるのを繰りかえすプログラムができれば実現できるのではないかと思いました。

追記
現状はLEDが真っ暗なままで無反応です。どういうふうにしたいかと言われると、LEDを蛍みたいに光らせたいです。

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

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

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

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

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

y_waiwai

2024/04/18 22:43

で、現状はどういうふうに動いてるのでしょうか。 そして、それをどういうふうにしたいのか、質問文を編集して追記しましょう
yamatttt

2024/04/18 22:54

現状はLEDが真っ暗なままで無反応です。どういうふうにしたいかと言われると、LEDを蛍みたいに光らせたいです。
guest

回答1

0

ベストアンサー

デバイスを持っていないので LED の操作は分かりませんが、 c のプログラムとしての while が変なのは分かります。

while の条件は、"成立したら終わり"ではなく"成立しなかったら終わり"です。
while( 条件 ) { 処理 } と書いたとき、実行される順は
① 条件が成立しなかったら終わる
② 処理
③ 条件が成立しなかったら終わる
④ 処理
(以下略)

です。

while文を使った繰り返し処理

従って

if (ontime == 0) { while (ontime == PERIOD) {

では、 if が成立したときは while が成立しませんので、 while 内の処理は行われません。

先ずはパソコンようのプログラムを作ることで c の基本的な勉強をされては如何でしょうか。


該当のソースコード のほうのコードで動作しているのでしたら、 ontime を増やしている "50" というのを変数にして限界値になったら符号を反転させることで、大して変更せずに済むと思います。

(loop部分のみ)

c

1#define PERIOD 10000 // PWMの周期10000μs 2int ontime = 0; // LEDがONの時間 グローバル変数 3int delta = 50; // ontime の増減量 4 5void loop() { 6 ontime += delta; // 毎回ontimeを増やす/減らす 7 if (ontime >= PERIOD || ontime <= 0) { delta *= -1; } // 限界値になったら増減を反転する 8 9 M5.Axp.SetLed(true); // LED ON 10 delayMicroseconds(ontime); //待機 マイクロ秒単位 11 M5.Axp.SetLed(false); // LED OFF 12 delayMicroseconds(PERIOD - ontime); //待機 マイクロ秒単位 13}

投稿2024/04/18 16:36

編集2024/04/18 17:09
jimbe

総合スコア12659

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

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

yamatttt

2024/04/18 22:45

回答ありがとうございます。whileについての認識がそもそも間違っていたんですね。50の符号を反転させるのは思いつきませんでした。Cの基本的な勉強からやり直そうと思います。ありがとうございました。
jimbe

2024/04/19 06:07

符号を反転させるやり方は、ゲームで壁に当たったら跳ね返るといった場合等でよく使われます。 条件がどう作用するのかは間違えやすくコンパイルエラーにもなりませんので、慣れるまでは常に怪しんでおくと良いかと思います。 お疲れさまでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問