LEDCUBEとは、LEDを立方体状に並べ、光らせるものです。
今回は8x8x8のLEDCUBEを作りました。
本当は8x8x8を完成させて展示させる予定だったのですが、間に合わず、3x3x3の展示と8x8x8の途中までの展示となっています。3x3x3だと、シフトレジスタ (後で出てきます)を使わないだけで基本的な仕組みは同じです。
ここでは8x8x8で解説を行なっています。
参考にしたのは以下のURLです。
https://www.youtube.com/watch?v=T5Aq7cRc-mU&
LEDCUBEは、
の3つのパーツからできています。
このそれぞれのパーツの特徴を紹介します。
まず、「LEDの繋がったもの」はレイヤーで分けられます。今回は8x8x8なのでレイヤーは8つあります。これらのレイヤー同士とその中身は「ダイナミック点灯方式」という点灯方式に沿った繋げ方をされています。これの特徴は少ない導線で大量のLEDを制御できるということです。今回のLEDCUBEは8x8x8=512個のLEDを使うので、これを一つ一つArduinoにつなげることはできません。なので、LEDCUBEでは少ない導線で大量のLEDを制御できる工夫がなされています。
「ダイナミック点灯方式」は工夫の一つなのですが、もう一つの工夫が「シフトレジスタ 」です。シフトレジスタ は、たった3本の信号用の導線(電源を除く)でLEDをいくらでも制御できる部品です。これを回路に組み込むことで大量のLEDを簡単に制御することができます。
多くのLEDCUBEはArduinoから制御できるのですが、今回はRaspberryPiから制御しています。これは、今後音楽と合わせてLEDCUBEを光らせたいと思い、それにはArduinoよりもRaspberryPiの方が向いていると思うからです。
Raspberry Piのコードは以下をクリックまたはタップすると展開されます。(とても長いです)
interval_time = 0.1 loop_num = 3
SCK = 19 RCK = 13 SI = 21
GPIO.setmode(GPIO.BCM)
GPIO.setup(SCK, GPIO.OUT) GPIO.setup(RCK, GPIO.OUT) GPIO.setup(SI, GPIO.LOW)
def reset(): GPIO.output(SCK, GPIO.LOW) GPIO.output(RCK, GPIO.OUT) GPIO.output(SI, GPIO.OUT)
def shift(PIN_NUM): GPIO.output(PIN_NUM, GPIO.HIGH) GPIO.output(PIN_NUM, GPIO.LOW)
def send_bits(data): for d in data: if d == 0: GPIO.output(SI, GPIO.LOW) else: GPIO.output(SI, GPIO.HIGH)
xxxxxxxxxx
21shift(SCK)
2shift(RCK)
def lighting(): reset()
xxxxxxxxxx
51datas = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
2for data in datas:
3send_bits(data)
4time.sleep(interval_time)
5send_bits([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
for num in range(loop_num): lighting()
send_bits([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ,1, 1, 1, 1]) time.sleep(3) send_bits([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) GPIO.cleanup() def render_all_layers(data): for dd in data: send_bits(dd)
xxxxxxxxxx
11</details>
8x8x8 LED CUBE WITH ARDUINO UNO -Youtube
LEDCUBEを作るのはとても大変でしたが、その分やりがいも大きかったです。
これからも頑張っていこうと思います。
長くなってしまいましたが、読んでくださりありがとうございました。