【M5stickV】ランダムな10色に光らせる方法 ~ライト編~

M5stickV LED

こんにちは、けいです。
M5stickVのLEDの制御の方法について解説します。

以前の記事の内容の説明を踏まえた上で解説するので、まだ読んでない方はぜひ下のリンクより読んでみて下さい。

LEDについて

実際の動作

結果から、見てみましょう。
Youtubeでは実際にランダムに色が変わっていいく様子が分かると思います。

ピンの種類

M5stickV LED

M5stickVには4種類のLEDが付属しています。

ハードウェア的にはすでに繋がっているので、プログラムを書くだけで制御することができます。

  • W:白色光
  • R:赤色
  • G:緑色
  • B:青色

LEDを制御する方法

制御コード

import utime
from Maix import GPIO
from fpioa_manager import *
import sys
import random

fm.register(board_info.LED_W, fm.fpioa.GPIO3)
fm.register(board_info.LED_R, fm.fpioa.GPIO4)
fm.register(board_info.LED_G, fm.fpioa.GPIO5)
fm.register(board_info.LED_B, fm.fpioa.GPIO6)

led_w = GPIO(GPIO.GPIO3, GPIO.OUT)
led_r = GPIO(GPIO.GPIO4, GPIO.OUT)
led_g = GPIO(GPIO.GPIO5, GPIO.OUT)
led_b = GPIO(GPIO.GPIO6, GPIO.OUT)

dic = []
dic.append(led_w)
dic.append(led_r)
dic.append(led_g)
dic.append(led_b)


def color():
    for i in range(4):
	dic[i%4].value(0)
	utime.sleep(1)
	dic[(i+1)%4].value(0)
	utime.sleep(1)
	dic[i%4].value(1)
	

def shufful():
    sh = []
    for i in range(4):
	sh.append(random.randrange(0, 4))
    while sh[1]==sh[0]:
	sh[1] = random.randrange(0, 4)
    while sh[2]==sh[0] or sh[2]==sh[1]:
	sh[2] = random.randrange(0, 4)
    while sh[3]==sh[0] or sh[3]==sh[1] or sh[3]==sh[2]:
	sh[3] = random.randrange(0, 4)
    return sh

def sort_array(ary):
    new_dic = []
    for i in ary:
	if i == 0:
	    new_dic.append(led_w)
	elif i == 1:
	    new_dic.append(led_r)
	elif i == 2:
	    new_dic.append(led_g)
	else:
	    new_dic.append(led_b)
    return new_dic
	   

try:
    while True:
	color()
	a = shufful()
	print(a)
	dic = sort_array(a)
	print(dic)
	
except:
    sys.exit()

LEDの初期化

fm.register(board_info.LED_W, fm.fpioa.GPIO3)
fm.register(board_info.LED_R, fm.fpioa.GPIO4)
fm.register(board_info.LED_G, fm.fpioa.GPIO5)
fm.register(board_info.LED_B, fm.fpioa.GPIO6) 

led_w = GPIO(GPIO.GPIO3, GPIO.OUT)
led_r = GPIO(GPIO.GPIO4, GPIO.OUT)
led_g = GPIO(GPIO.GPIO5, GPIO.OUT)
led_b = GPIO(GPIO.GPIO6, GPIO.OUT)

この文で、GPIOの割り当てを行っています。
fm.register関数は、第一引数にピン番号、第二引数にピン機能が入ります。
この部分は前回の記事で解説したので、詳細は省きます。

配列の順番で色を表す

dicという配列にそれぞれのGPIOインスタンスを格納します。
color関数が色の表示を決めている関数です。
dicの順番に一個目、一個目と二個目、二個目、・・・というように、単色の後、二色という発光を繰り返します。

しかし、このままでは単に毎回同じ順番で8パターンを繰り返すことになります。
それではつまらないので、配列の順番をシャッフルする関数をつくります。

※Pythonにはsortという便利な関数がありすが、MicroPythonにはないので、自分で作る必要があります。

配列をシャッフルする

MicroPythonにも乱数を発生する関数があったので、それを使います。
shufful関数の中で0~3の数字を乱数で順番に格納します。
数字が被ると色も被るので、バラバラになるまで繰り返します。
返り値としてランダムな順番の配列を返します。

sort_array関数で番号の配列を渡すと、番号に対応した色のオブジェクトを配列で返します。

参考にさせて頂いたサイト