利用したパーツ
(秋月電子)
ブレッドボード2枚 200円x2
赤色ドットマトリックス8x8ドット(OSL641501-ARA) 200円
ジャンパーワイヤ オスオスセット60本以上 220円
カーボン抵抗1kΩ100本セット 100円
(千石電商)
ジャンパーワイヤ メスメスセット50本 650円
まずOSL641501-ARAを200円のブレッドボード2枚に挿します。
秋月電子でマニュアルを探して
<画像参考>
赤色ドットマトリクスLED 8x8ドット OSL641501-ARA
COLをドットマトリックスパーツの上(画面左)
ROWをドットマトリックスパーツの下(画面右)に番号順に揃えます。
LEDのアノード側(COLの方)には1KΩの抵抗もつけます。
PINの番号はパーツをLED正面(パーツの番号が書いているほうを下)からみて左下から左上まで反時計まわりです。
(こんな感じです。)
16 15 14 13 12 11 10 9
1 2 3 4 5 6 7 8
そしてRaspberry Pi3にそれぞれつなげていきます。
COLを2から右にGPIO 2, 3, 4, 17, 27, 22, 10, 9
LOWを24から右にGPIOの24, 25, 8, 7, 12, 16, 20, 21
に接続してハード側は完成です。(接続先は、わかりやすいと思ってこんな感じにしてます)
プログラムは2本、スクロール、ランダムで適当なキャラクターをつくるものです。
LEDのコントロールはなんか癖があるようで、まだ今ひとつのような気もしています。
あと発色は赤なのですが、スマホのカメラで取るとなぜか輝度をあげている時に黄色になってます。
import RPi.GPIO as GPIO import time d=[] # 123456789012345678901234567890 d+=["000880000000888880000008888800"] d+=["008080000008000008000080000080"] d+=["000080000000000008000000000800"] d+=["000080000000000008000000888000"] d+=["000080000000000880000000000800"] d+=["000080000000088000000000000080"] d+=["000080000000800000000000000080"] d+=["008888880008888888880088888800"] f=[] f+=["113567788888888645423223342111"] f+=["113566677788888854433335664111"] f+=["124577766678888875554567775111"] f+=["124676556788888887752123676211"] f+=["224542211577888888642354367211"] f+=["234424523557788887544455667411"] f+=["234555666777788887777777777511"] f+=["235677777777778888888888887611"] GPIO.setmode(GPIO.BCM) def pinSet(pin_num,sw): if pin_num in [2,3,4,17,27,22,10,9,24,25,8,7,12,16,20,21]: if sw==0: GPIO.setup(pin_num, GPIO.OUT) GPIO.output(pin_num, GPIO.LOW) if sw==1: GPIO.setup(pin_num, GPIO.OUT) GPIO.output(pin_num, GPIO.HIGH) def allLight(): high=[2,3,4,17,27,22,10,9] low=[24,25,8,7,12,16,20,21] for p in high: pinSet(p,1) for p in low: pinSet(p,0) def allFree(): high=[2,3,4,17,27,22,10,9] low=[24,25,8,7,12,16,20,21] for p in high: pinSet(p,0) for p in low: pinSet(p,0) def dataCut(px): px=px%len(d[0]) r=[] for i in d: r+=[(i+i)[px:px+8].replace("8","1")] #print(r) return r def dataCutB(px): px=px%len(d[0]) r=[] for i in f: r+=[(i+i)[px:px+8]] return r def patLight(pat,lineTime,times): high=[2,3,4,17,27,22,10,9] low=[24,25,8,7,12,16,20,21] allFree() highDat=[0,0,0,0,0,0,0,0] for t in range(times): for y in range(8): for x in range(8): if pat[y][x]=="1": if highDat[x]==0:pinSet(high[x], 1) highDat[x]=1 else: if highDat[x]==1:pinSet(high[x], 0) highDat[x]=0 pinSet(low[y], 0) time.sleep(lineTime) pinSet(low[y], 1) def patLightRate(pat,lineTime,times): high=[2,3,4,17,27,22,10,9] low=[24,25,8,7,12,16,20,21] allFree() highDat=[0,0,0,0,0,0,0,0] for t in range(times): for y in range(8): for x in range(8): if int(pat[y][x])>t: if highDat[x]==0:pinSet(high[x], 1) highDat[x]=1 else: if highDat[x]==1:pinSet(high[x], 0) highDat[x]=0 pinSet(low[y], 0) time.sleep(lineTime) pinSet(low[y], 1) def main(): #p1 allLight() time.sleep(1) #p2 pat=["11111111"]+["10000001"]*6+["11111111"] patLight(pat,0.001,200) #p3 pat=(["10101010"]+["01010101"])*4 patLight(pat,0.001,200) #scroll 123 for i in range(60): patLight(dataCut(i),0.001,10) patLight(dataCut(0),0.001,100) #scroll eye for i in range(240): for j in range(10): patLightRate(dataCutB(i),0.00001,8) GPIO.cleanup() main()
import RPi.GPIO as GPIO import time import random GPIO.setmode(GPIO.BCM) def pinSet(pin_num,sw): if pin_num in [2,3,4,17,27,22,10,9,24,25,8,7,12,16,20,21]: if sw==0: GPIO.setup(pin_num, GPIO.OUT) GPIO.output(pin_num, GPIO.LOW) if sw==1: GPIO.setup(pin_num, GPIO.OUT) GPIO.output(pin_num, GPIO.HIGH) def allFree(): high=[2,3,4,17,27,22,10,9] low=[24,25,8,7,12,16,20,21] for p in high: pinSet(p,0) for p in low: pinSet(p,0) def dataSet(d): r=[] for i in d: r+=[i+i[::-1]] return r def dataCreate(): r=[] for i in range(8): o="" for j in range(4): o+=str(random.randint(0,4)*2) r+=[o] return r def dataCreateB(): r=[] for i in range(8): o="" for j in range(4): o+=str(random.randint(0,1)*8) r+=[o] return r def patLightRate(pat,lineTime,times): high=[2,3,4,17,27,22,10,9] low=[24,25,8,7,12,16,20,21] allFree() highDat=[0,0,0,0,0,0,0,0] for t in range(times): for y in range(8): for x in range(8): if int(pat[y][x])>t: if highDat[x]==0:pinSet(high[x], 1) highDat[x]=1 else: if highDat[x]==1:pinSet(high[x], 0) highDat[x]=0 pinSet(low[y], 0) time.sleep(lineTime) pinSet(low[y], 1) def main(): #scroll eye for i in range(100): d=dataCreateB() print(d) d=dataSet(d) for j in range(20): patLightRate(d,0.00001,8) GPIO.cleanup() main()