エラーコードは出ないのですが、LEDが光りません。
確かに上記コードのD1D4をLED1LED4にして動かしてみましたが
光らないようですね。
原因はy_waiwaiさんやthkanaさんの仰る通りだと思われます
恐らくボタンが押されるたびに
ゆっくり順番にLEDがゆっくり明るくなる動作を実行
↓
デジタルな明るさでにバラバラな順序でLEDが点滅
↓
決まった順序でバラバラな明るさにLEDが点滅
↓
パラバラな順序でバラバラな明るさでLEDが点滅
という動作を繰り返すプログラムが作りたかったとするのなら
発光パターンを関数でまとめてそれを関数ポインタの配列で管理し、
グローバル変数で今実行すべき関数のインデックスを保管しておき、
GPIO割り込み発生で今実行すべき関数のインデックスを変更しするような
処理にすればよいかと思われます。
あと実際に確かめていないので間違ってるかもしれないですが
マイコンで乱数のシードはtime関数から取得しても
同じ値しか取れないのではないのでしょうか
先程シリアル通信を使いtime関数の出力を観測してみましたが
案の定いつまでたっても0しか吐きませんでした。
なので開放状態のアナログ入力からのほうが良いかもしれません。
尚手元にあったmbedがNucle-f303k8ではなくLPC1768だったので
LPC1768でしか動作確認は行っていません。
c++
1#include"mbed.h"
2#include"stdlib.h"
3#include "stdint.h"
4
5#define LED_NUM 4// LED数
6#define PATTERN_NUM 4// 発光パターン数
7
8//
9// ここからグローバルな変数定義
10//
11PwmOut leds[LED_NUM] = {PwmOut(D1), PwmOut(D2), PwmOut(D3), PwmOut(D4)};
12uint8_t pattern = 0;
13
14//
15// ここから発光パターン
16//
17void pattern1()
18{
19 for(uint8_t i=0; i<LED_NUM; ++i)
20 {
21 for(float duty_rethio = 0.f; duty_rethio <= 1.f; duty_rethio += 0.000005f)
22 leds[i] = duty_rethio;
23
24 leds[i] = 0.f;
25 }
26}
27
28void pattern2()
29{
30 uint8_t rand_index = rand() % LED_NUM;
31 leds[rand_index] = 1.f;
32 wait(0.1f);
33 leds[rand_index] = 0.f;
34}
35
36void pattern3()
37{
38 float rand_duty;
39 for(uint8_t i=0; i<LED_NUM; ++i)
40 {
41 rand_duty = static_cast<float>(rand())/RAND_MAX;
42 leds[i] = rand_duty;
43 wait(0.5f);
44 leds[i] = 0.f;
45 }
46}
47
48void pattern4()
49{
50 float rand_duty = static_cast<float>(rand())/RAND_MAX;
51 uint8_t rand_index = rand() % LED_NUM;
52 leds[rand_index] = rand_duty;
53 wait(0.5f);
54 leds[rand_index] = 0.f;
55}
56
57//
58// 割り込み用コールバック
59//
60void push()
61{
62 if(pattern >= PATTERN_NUM - 1) pattern = 0;
63 else ++pattern;
64 wait(0.15f);// 回路側でチャタリング防止を行っているならこの行は外してよい
65}
66
67//
68// メイン関数
69//
70int main(){
71 InterruptIn sw(A1);
72 sw.rise(&push);
73 sw.mode(PullDown);
74
75 AnalogIn adc(A0);
76 srand(adc.read_u16());
77
78 void(*pattern_list[PATTERN_NUM])() = {&pattern1, &pattern2, &pattern3, &pattern4};
79
80 while(true)
81 {
82 pattern_list[pattern]();
83 for(uint8_t i=0; i<LED_NUM; ++i) leds[i] = 0.f;
84 }
85}
追記
上記の方法ではアナログ入力端子を一つ無駄にしてしまうので
下記の方法のほうが適切かと思われます。
電源がonになり、プログラムが開始した直後からボタンが初めて押されるまでの
時間をシード値とすることでグローバル変数が2つ増えてしまいますが
アナログ入力端子を無駄にせずに実装できそうです。(下記thkanaさんのコメント参照)
c++
1#include"mbed.h"
2#include"stdlib.h"
3#include "stdint.h"
4
5#define LED_NUM 4// LED数
6#define PATTERN_NUM 4// 発光パターン数
7
8//
9// ここからグローバルな変数定義
10//
11PwmOut leds[LED_NUM] = {PwmOut(D1), PwmOut(D2), PwmOut(D3), PwmOut(D4)};
12uint8_t pattern = 0;
13Timer timer;
14bool srand_flag = true;
15
16//
17// ここから発光パターン
18//
19void pattern1()
20{
21 for(uint8_t i=0; i<LED_NUM; ++i)
22 {
23 for(float duty_rethio = 0.f; duty_rethio <= 1.f; duty_rethio += 0.000005f)
24 leds[i] = duty_rethio;
25
26 leds[i] = 0.f;
27 }
28}
29
30void pattern2()
31{
32 uint8_t rand_index = rand() % LED_NUM;
33 leds[rand_index] = 1.f;
34 wait(0.1f);
35 leds[rand_index] = 0.f;
36}
37
38void pattern3()
39{
40 float rand_duty;
41 for(uint8_t i=0; i<LED_NUM; ++i)
42 {
43 rand_duty = static_cast<float>(rand())/RAND_MAX;
44 leds[i] = rand_duty;
45 wait(0.5f);
46 leds[i] = 0.f;
47 }
48}
49
50void pattern4()
51{
52 float rand_duty = static_cast<float>(rand())/RAND_MAX;
53 uint8_t rand_index = rand() % LED_NUM;
54 leds[rand_index] = rand_duty;
55 wait(0.5f);
56 leds[rand_index] = 0.f;
57}
58
59//
60// 割り込み用コールバック
61//
62void push()
63{
64 timer.stop();
65 if(srand_flag)
66 {
67 srand(timer.read_us());
68 srand_flag = false;
69 }
70 if(pattern >= PATTERN_NUM - 1) pattern = 0;
71 else ++pattern;
72 wait(0.15f);// 回路側でチャタリング防止を行っているならこの行は外してよい
73}
74
75//
76// メイン関数
77//
78int main(){
79 InterruptIn sw(A1);
80 sw.rise(&push);
81 sw.mode(PullDown);
82
83 timer.start();
84
85 void(*pattern_list[PATTERN_NUM])() = {&pattern1, &pattern2, &pattern3, &pattern4};
86
87 while(true)
88 {
89 pattern_list[pattern]();
90 for(uint8_t i=0; i<LED_NUM; ++i) leds[i] = 0.f;
91 }
92}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/08 23:23 編集
退会済みユーザー
2020/12/09 02:28 編集
2020/12/10 21:49
退会済みユーザー
2020/12/10 23:26 編集
2020/12/11 07:01