-
Notifications
You must be signed in to change notification settings - Fork 1
/
m_012_matrix_led.py
339 lines (307 loc) · 9.71 KB
/
m_012_matrix_led.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
#!/usr/bin/env python3
# Filename: m_012_matrix_led
__author__ = "raspython"
__date__ = '2020/12/19 06:09'
import pigpio as pi
from time import sleep
# pin_noの定義
sw_b = 16
sw_w = 21
led_b = 18
# GPIOの初期設定
pi_g = pi.pi()
# 入力設定
pi_g.set_mode(sw_b, pi.INPUT)
pi_g.set_mode(sw_w, pi.INPUT)
# プルアップ設定(リストによる複数設定は不可)
pi_g.set_pull_up_down(sw_b, pi.PUD_UP)
pi_g.set_pull_up_down(sw_w, pi.PUD_UP)
# 出力設定
pi_g.set_mode(led_b, pi.OUTPUT)
# i2cの設定
# 1はbus番号、0x70はスレーブアドレス
ht16k33_adr = pi_g.i2c_open(1, 0x70)
# レジスタの設定(openの戻り値でDeviceの指定、reg_address, 値)
# 内部システム発信機の有効
pi_g.i2c_write_byte_data(ht16k33_adr, 0x21, 0x01)
# LEDの表示設定の有効
pi_g.i2c_write_byte_data(ht16k33_adr, 0x81, 0x01)
# 文字のマトリクス点灯パターンの辞書
# 下位bitが文字の左端
p_word = {"0": [0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000],
"あ": [0b00001000,
0b01111110,
0b00001000,
0b01111100,
0b10101010,
0b10011010,
0b01001100,
0b00000000],
"い": [0b00000000,
0b00100010,
0b01000010,
0b10000010,
0b11001010,
0b00001100,
0b00001000,
0b00000000],
"う": [0b00111100,
0b00000000,
0b00111100,
0b01000010,
0b01000000,
0b01000000,
0b00100000,
0b00011000],
"お": [0b00001000,
0b01011110,
0b10001000,
0b00111100,
0b01001010,
0b01001010,
0b00100100,
0b00000000],
"け": [0b00100010,
0b01111010,
0b00100010,
0b00100010,
0b00100010,
0b00100010,
0b00010000,
0b00000000],
"ご": [0b10100000,
0b01111100,
0b00100000,
0b00000000,
0b00000100,
0b00000010,
0b11111100,
0b00000000],
"ざ": [0b10100000,
0b11100000,
0b00111110,
0b01000000,
0b01111100,
0b00000010,
0b01111100,
0b00000000],
"し": [0b00000100,
0b00000100,
0b00000100,
0b00000100,
0b00000100,
0b01000100,
0b00111000,
0b00000000],
"す": [0b00110000,
0b11100000,
0b00111110,
0b00110000,
0b00101000,
0b00110000,
0b00100000,
0b00010000],
"て": [0b11111000,
0b00100110,
0b00010000,
0b00001000,
0b00001000,
0b00001000,
0b00010000,
0b01100000],
"で": [0b11111000,
0b00100110,
0b10010000,
0b01001000,
0b00001000,
0b00001000,
0b00010000,
0b01100000],
"と": [0b00000100,
0b00001000,
0b01101000,
0b00011000,
0b00000100,
0b00000010,
0b11111100,
0b00000000],
"ま": [0b00100000,
0b11111100,
0b00100000,
0b11111100,
0b00100000,
0b01111100,
0b10100010,
0b00011100],
"め": [0b01100000,
0b01000010,
0b01111110,
0b10100011,
0b10010101,
0b10001001,
0b01010110,
0b00000000],
"琴": [0b11101110,
0b01000100,
0b11101110,
0b00111000,
0b11000110,
0b00111000,
0b00100000,
0b00010000],
"葉": [0b00101000,
0b11111110,
0b00110100,
0b00000100,
0b11111100,
0b00111000,
0b01010100,
0b10010010],
"茜": [0b00100100,
0b11111111,
0b00100100,
0b11111111,
0b01100110,
0b01000010,
0b01111110,
0b00000000],
"終": [0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000]}
# 表示する文字のlist
word_l = ["あ", "け", "ま", "し", "て", "お", "め", "で",
"と", "う", "ご", "ざ", "い", "ま", "す", "0",
"琴", "葉", "0", "茜"]
def b_storing(l):
"""
二文字づつword_lから抜き出し、点灯派パターンを、与えられたリストの
要素の上位16bitに加算してそのリストを返す
@param l: バイナリリスト
@type length: list
@return:表示用のバイナリのリスト
@rtype: list
"""
global word_l
# 格納したい文字を逆から順にして処理していく
for i in range(2, 0, -1):
# rage(, , -1)のループ変数の最後を0にしたいので
# ループ変数を-1する
i -= 1
w_l = p_word[word_l[i]]
# print("リストに格納する文字: {}".format(word_l[i]))
# 8行分の処理
for j in range(8):
# print(bin(w_l[j]))
# 三文字目四文字目を32bitの値の上位16bitに加算。
tmp_bin = w_l[j] << (((i) * 8 + 16))
l[j] = l[j] | tmp_bin
"""
print("【{}】を格納した後の{}行目のバイナリデータ: {}"
.format(word_l[i], j + 1, bin(l[j]),))
"""
for i in range(2):
del word_l[0]
# print("格納した文字を削除後のリスト: {}".format(word_l))
return l
def eight_bit_divide(l):
"""
与えられたリストの中の32bitのバイナリデータの
下位16bitを8bit2つに分けてリストに入れて、それを返す。
@param p_b_l:
@type p_b_l:
@return:
@rtype:
"""
b_l = []
h_8b = 0b1111111100000000
l_8b = 0b11111111
# 8行分繰り返す
for i in range(len(l)):
# 下位8bitをリストに入れる
# 下位16~9bitを右へ8bitシフトしてリストに入れる
b_l.append(l[i] & l_8b)
b_l.append(((l[i]) & h_8b) >> 8)
# print(l)
return b_l
def matrix_led(l):
"""
与えられた点灯パターンでマトリクスLEDを点灯させる
@param l: マトリクスLEDの点灯パターンのリスト
@type l: list
"""
# マトリクスLED2つで16行
matrix_row = 16
for i in range(matrix_row):
pi_g.i2c_write_byte_data(ht16k33_adr, i, l[i])
def b_shift(l, c):
"""
与えられたリストを8it分割関数に渡し
そのリストを点灯用の関数に渡す
その後、与えられた値分リストの中の全バイナリを
1bitシフトさせながら点灯関数に渡す
@param l: 点灯パターンのリストgaa1q2w3e4r
@type l: list
@param c: bitシフトさせる回数
@type c: int
"""
for i in range(c):
bin_list = eight_bit_divide(l)
matrix_led(bin_list)
# 各行ごと1bitづつずらした値で上書き
for j in range(len(l)):
l[j] = l[j] >> 1
print(bin(l[j]))
sleep(0.01)
def main():
try:
binary_list = [0, 0, 0, 0, 0, 0, 0, 0]
while True:
# 黒のスイッチを押されたら処理開始。
if pi_g.read(sw_b) == 0:
# 青のLED点灯
pi_g.write(led_b, 1)
# 表示の準備
# 最初の2文字を格納
binary_list = b_storing(binary_list)
# 2文字分の表示が流れたらバイナリリストに次の2文字を
# 追加していくを繰り返す。
# ループ回数は残りの表示文字の1/2回の9回。
for i in range(9):
b_shift(binary_list, 16)
binary_list = b_storing(binary_list)
# 最後の文字を最後までスクロースさせる
b_shift(binary_list, 32)
break
# 白のスイッチを押されたらLEDを消灯してループを抜ける
if pi_g.read(sw_w) == 0:
break
except KeyboardInterrupt:
pass
# 青のLED消灯
pi_g.write(led_b, 0)
# マトリクスLEDの消灯
matrix_led(p_word["終"])
# pi.gpioの終了処理
pi_g.stop()
if __name__ == '__main__':
main()