回答編集履歴

5

不備修正

2020/12/09 02:31

投稿

退会済みユーザー
test CHANGED
@@ -250,7 +250,7 @@
250
250
 
251
251
  時間をシード値とすることでグローバル変数が2つ増えてしまいますが
252
252
 
253
- アナログ入力端子を無駄にせずに実装できそうです。
253
+ アナログ入力端子を無駄にせずに実装できそうです。(下記thkanaさんのコメント参照)
254
254
 
255
255
 
256
256
 

4

追記

2020/12/09 02:31

投稿

退会済みユーザー
test CHANGED
@@ -42,11 +42,15 @@
42
42
 
43
43
 
44
44
 
45
- あと実際に確かめていないので間違ってるかもしれないですが
45
+ ~~あと実際に確かめていないので間違ってるかもしれないですが
46
46
 
47
47
  マイコンで乱数のシードはtime関数から取得しても
48
48
 
49
- 同じ値しか取れないのではないのでしょうか
49
+ 同じ値しか取れないのではないのでしょうか~~
50
+
51
+ 先程シリアル通信を使いtime関数の出力を観測してみましたが
52
+
53
+ 案の定いつまでたっても0しか吐きませんでした。
50
54
 
51
55
  なので開放状態のアナログ入力からのほうが良いかもしれません。
52
56
 
@@ -231,3 +235,209 @@
231
235
  }
232
236
 
233
237
  ```
238
+
239
+
240
+
241
+ ### 追記
242
+
243
+ 上記の方法ではアナログ入力端子を一つ無駄にしてしまうので
244
+
245
+ 下記の方法のほうが適切かと思われます。
246
+
247
+
248
+
249
+ 電源がonになり、プログラムが開始した直後からボタンが初めて押されるまでの
250
+
251
+ 時間をシード値とすることでグローバル変数が2つ増えてしまいますが
252
+
253
+ アナログ入力端子を無駄にせずに実装できそうです。
254
+
255
+
256
+
257
+ ```c++
258
+
259
+ #include"mbed.h"
260
+
261
+ #include"stdlib.h"
262
+
263
+ #include "stdint.h"
264
+
265
+
266
+
267
+ #define LED_NUM 4// LED数
268
+
269
+ #define PATTERN_NUM 4// 発光パターン数
270
+
271
+
272
+
273
+ //
274
+
275
+ // ここからグローバルな変数定義
276
+
277
+ //
278
+
279
+ PwmOut leds[LED_NUM] = {PwmOut(D1), PwmOut(D2), PwmOut(D3), PwmOut(D4)};
280
+
281
+ uint8_t pattern = 0;
282
+
283
+ Timer timer;
284
+
285
+ bool srand_flag = true;
286
+
287
+
288
+
289
+ //
290
+
291
+ // ここから発光パターン
292
+
293
+ //
294
+
295
+ void pattern1()
296
+
297
+ {
298
+
299
+ for(uint8_t i=0; i<LED_NUM; ++i)
300
+
301
+ {
302
+
303
+ for(float duty_rethio = 0.f; duty_rethio <= 1.f; duty_rethio += 0.000005f)
304
+
305
+ leds[i] = duty_rethio;
306
+
307
+
308
+
309
+ leds[i] = 0.f;
310
+
311
+ }
312
+
313
+ }
314
+
315
+
316
+
317
+ void pattern2()
318
+
319
+ {
320
+
321
+ uint8_t rand_index = rand() % LED_NUM;
322
+
323
+ leds[rand_index] = 1.f;
324
+
325
+ wait(0.1f);
326
+
327
+ leds[rand_index] = 0.f;
328
+
329
+ }
330
+
331
+
332
+
333
+ void pattern3()
334
+
335
+ {
336
+
337
+ float rand_duty;
338
+
339
+ for(uint8_t i=0; i<LED_NUM; ++i)
340
+
341
+ {
342
+
343
+ rand_duty = static_cast<float>(rand())/RAND_MAX;
344
+
345
+ leds[i] = rand_duty;
346
+
347
+ wait(0.5f);
348
+
349
+ leds[i] = 0.f;
350
+
351
+ }
352
+
353
+ }
354
+
355
+
356
+
357
+ void pattern4()
358
+
359
+ {
360
+
361
+ float rand_duty = static_cast<float>(rand())/RAND_MAX;
362
+
363
+ uint8_t rand_index = rand() % LED_NUM;
364
+
365
+ leds[rand_index] = rand_duty;
366
+
367
+ wait(0.5f);
368
+
369
+ leds[rand_index] = 0.f;
370
+
371
+ }
372
+
373
+
374
+
375
+ //
376
+
377
+ // 割り込み用コールバック
378
+
379
+ //
380
+
381
+ void push()
382
+
383
+ {
384
+
385
+ timer.stop();
386
+
387
+ if(srand_flag)
388
+
389
+ {
390
+
391
+ srand(timer.read_us());
392
+
393
+ srand_flag = false;
394
+
395
+ }
396
+
397
+ if(pattern >= PATTERN_NUM - 1) pattern = 0;
398
+
399
+ else ++pattern;
400
+
401
+ wait(0.15f);// 回路側でチャタリング防止を行っているならこの行は外してよい
402
+
403
+ }
404
+
405
+
406
+
407
+ //
408
+
409
+ // メイン関数
410
+
411
+ //
412
+
413
+ int main(){
414
+
415
+ InterruptIn sw(A1);
416
+
417
+ sw.rise(&push);
418
+
419
+ sw.mode(PullDown);
420
+
421
+
422
+
423
+ timer.start();
424
+
425
+
426
+
427
+ void(*pattern_list[PATTERN_NUM])() = {&pattern1, &pattern2, &pattern3, &pattern4};
428
+
429
+
430
+
431
+ while(true)
432
+
433
+ {
434
+
435
+ pattern_list[pattern]();
436
+
437
+ for(uint8_t i=0; i<LED_NUM; ++i) leds[i] = 0.f;
438
+
439
+ }
440
+
441
+ }
442
+
443
+ ```

3

アナログ入力端子の誤記

2020/12/09 02:26

投稿

退会済みユーザー
test CHANGED
@@ -208,7 +208,7 @@
208
208
 
209
209
 
210
210
 
211
- AnalogIn adc(p20);
211
+ AnalogIn adc(A0);
212
212
 
213
213
  srand(adc.read_u16());
214
214
 

2

改行追加

2020/12/08 22:25

投稿

退会済みユーザー
test CHANGED
@@ -1,5 +1,7 @@
1
1
  > エラーコードは出ないのですが、LEDが光りません。
2
2
 
3
+
4
+
3
5
  確かに上記コードのD1~D4をLED1~LED4にして動かしてみましたが
4
6
 
5
7
  光らないようですね。

1

不備修正

2020/12/08 22:21

投稿

退会済みユーザー
test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- 原因はy_waiwaiさんの仰る通りだと思われます
9
+ 原因はy_waiwaiさんやthkanaさんの仰る通りだと思われます
10
10
 
11
11
 
12
12