マイコンArduinoを使って電光掲示板を作る。
続き
今回は、定型文(5種類)を選択できるように改造していきます。
"こんにちは"
"おはよう"
"ありがとう"
"おやすみ"
"さようなら"
を切替表示出来るようにします。
それに合わせてブレッドボードにもう一つタクトスイッチを追加しました。
D14に接続、配線は他のタクトスイッチと同じ
切替表示の様子
今回のプログラム
// slx_5024
byte address[ ] = {5, 4, 3, 2}; // アドレスは扱いやすい様に配列で持つ
int pos = 0;
int count = 0;
int scroll = 0;
int scroll_speed = 0;
boolean toggle_high = false;
boolean toggle_low = false;
int s_s[] = {1, 10, 30, 70, 150};
int s_s_pos = 2;
short *data_hex;
byte *color;
int data_size;
int select = 1;
boolean toggle_select = false;
boolean change_flag = false;
// "こんにちは"
short data_hex_1[ ] = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x1ff8, 0x00e0, 0x0180, 0x0000, 0x0000, 0x1000,
0x1800, 0x2000, 0x2000, 0x2000, 0x3000, 0x1ffc, 0x0000, 0x0000,
0x0000, 0x0600, 0x0400, 0x0c00, 0x0c00, 0x0800, 0x1800, 0x1f80,
0x1882, 0x30c2, 0x30c6, 0x20c6, 0x60c4, 0x607c, 0x4030, 0x0000,
0x0000, 0x3000, 0x33fc, 0x33fc, 0x2000, 0x2000, 0x2000, 0x2000,
0x2300, 0x2200, 0x2200, 0x2300, 0x21fc, 0x30fc, 0x3000, 0x0000,
0x0000, 0x0400, 0x0400, 0x7ffe, 0x0400, 0x0400, 0x0ce0, 0x0ff8,
0x0c0c, 0x1804, 0x0004, 0x000c, 0x001c, 0x0ff8, 0x0fc0, 0x0000,
0x0000, 0x3020, 0x2020, 0x2020, 0x27fe, 0x2020, 0x2020, 0x6030,
0x6030, 0x63f0, 0x2638, 0x243c, 0x2426, 0x23e0, 0x2180, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};
// "おはよう"
short data_hex_2[ ] = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0618, 0x060c, 0x7fec, 0x0606, 0x0602, 0x07e0, 0x0ff8,
0x1e0c, 0x2606, 0x6606, 0x6606, 0x260c, 0x3ef8, 0x00e0, 0x0000,
0x0000, 0x3020, 0x2020, 0x2020, 0x27fe, 0x2020, 0x2020, 0x6030,
0x6030, 0x63f0, 0x2638, 0x243c, 0x2426, 0x23e0, 0x2180, 0x0000,
0x0000, 0x0180, 0x0180, 0x0180, 0x01fc, 0x0180, 0x0180, 0x0180,
0x0180, 0x1fc0, 0x31f0, 0x219c, 0x618e, 0x3f04, 0x1e00, 0x0000,
0x0000, 0x0fc0, 0x00f0, 0x0000, 0x0000, 0x1ff0, 0x3c18, 0x0008,
0x0008, 0x0008, 0x0008, 0x0018, 0x0030, 0x01e0, 0x0f80, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};
// "ありがとう"
short data_hex_3[ ] = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0600, 0x0600, 0x3ffc, 0x0600, 0x06c0, 0x0ff8, 0x1e4c,
0x36c6, 0x2286, 0x6386, 0x6306, 0x3e0c, 0x1cf8, 0x00c0, 0x0000,
0x0000, 0x0800, 0x18c0, 0x1bf0, 0x1610, 0x1c18, 0x1818, 0x1808,
0x1008, 0x1008, 0x1018, 0x0010, 0x0070, 0x0fe0, 0x0f00, 0x0000,
0x0004, 0x041a, 0x0c0a, 0x0c11, 0x7fc8, 0x084c, 0x0866, 0x0866,
0x1866, 0x1062, 0x1060, 0x3060, 0x2040, 0x67c0, 0x0100, 0x0000,
0x0000, 0x0200, 0x0200, 0x0200, 0x0200, 0x027c, 0x03e0, 0x0e00,
0x1800, 0x3000, 0x2000, 0x2000, 0x3000, 0x1ffc, 0x03fc, 0x0000,
0x0000, 0x0fc0, 0x00f0, 0x0000, 0x0000, 0x1ff0, 0x3c18, 0x0008,
0x0008, 0x0008, 0x0008, 0x0018, 0x0030, 0x01e0, 0x0f80, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};
// "おやすみ"
short data_hex_4[ ] = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0618, 0x060c, 0x7fec, 0x0606, 0x0602, 0x07e0, 0x0ff8,
0x1e0c, 0x2606, 0x6606, 0x6606, 0x260c, 0x3ef8, 0x00e0, 0x0000,
0x0000, 0x1180, 0x18c0, 0x1878, 0x0bfc, 0x1e66, 0x7c02, 0x4406,
0x0406, 0x06fc, 0x0600, 0x0200, 0x0300, 0x0300, 0x0300, 0x0000,
0x0000, 0x0040, 0x0040, 0x7ffe, 0x0040, 0x03c0, 0x0ec0, 0x0840,
0x0860, 0x0860, 0x0fe0, 0x0340, 0x00c0, 0x0780, 0x0e00, 0x0000,
0x0000, 0x3f80, 0x3f80, 0x0100, 0x010c, 0x010c, 0x010c, 0x1ff8,
0x331e, 0x621e, 0x4218, 0x4610, 0x6c20, 0x38e0, 0x0180, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};
// "さようなら"
short data_hex_5[ ] = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0080, 0x0080, 0x00c4, 0x7ffe, 0x0040, 0x0060, 0x0420,
0x0e30, 0x1018, 0x3000, 0x3000, 0x3000, 0x1ff8, 0x03f0, 0x0000,
0x0000, 0x0180, 0x0180, 0x0180, 0x01fc, 0x0180, 0x0180, 0x0180,
0x0180, 0x1fc0, 0x31f0, 0x219c, 0x618e, 0x3f04, 0x1e00, 0x0000,
0x0000, 0x0fc0, 0x00f0, 0x0000, 0x0000, 0x1ff0, 0x3c18, 0x0008,
0x0008, 0x0008, 0x0008, 0x0018, 0x0030, 0x01e0, 0x0f80, 0x0000,
0x0000, 0x0c00, 0x0c00, 0x7fbe, 0x0830, 0x0830, 0x1830, 0x1030,
0x1030, 0x33f0, 0x2638, 0x643e, 0x6432, 0x07e0, 0x01c0, 0x0000,
0x0000, 0x07e0, 0x00f0, 0x1800, 0x1000, 0x1000, 0x11f0, 0x171c,
0x180c, 0x1004, 0x0004, 0x000c, 0x001c, 0x1ff0, 0x0f80, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};
// カラーを配列で持つ
byte color_1[ ] = {1, 1, 1, 1, 1}; // 1,赤 2,緑 3,橙
byte color_2[ ] = {2, 2, 2, 2}; // 1,赤 2,緑 3,橙
byte color_3[ ] = {3, 3, 3, 3, 3}; // 1,赤 2,緑 3,橙
byte color_4[ ] = {2, 2, 2, 2}; // 1,赤 2,緑 3,橙
byte color_5[ ] = {3, 3, 3, 3, 3}; // 1,赤 2,緑 3,橙
void setup() {
for (int i = 0; i < 11; i++) {
pinMode(i, OUTPUT); // 各ピンの設定 全てアウトプット
}
pinMode(11, INPUT_PULLUP);
pinMode(12, INPUT_PULLUP);
pinMode(14, INPUT_PULLUP);
digitalWrite(0,LOW); // SE L 自動でRAM切り替わり
digitalWrite(1,LOW); // A/BB 書き込み用RAM選択
digitalWrite(6,LOW); // GREEN 緑データ
digitalWrite(7,LOW); // CLK クロック
digitalWrite(8,LOW); // WE 書き込み信号 Hで書き込み
digitalWrite(9,LOW); // RED 赤データ
digitalWrite(10,LOW); // ALE アドレスラッチ Hで有効
change(select);
}
void loop() {
for (int i = 0; i < 16; i++) { // アドレス0~15
for (int j = 0; j < sizeof(address); j++)
if ((i & 0x1 << j) != 0) // address[0]~address[3]にビットをセット
digitalWrite(address[j], HIGH);
else
digitalWrite(address[j], LOW);
for (int k = 0;k < 32;k++) {
digitalWrite(6,LOW); // GREEN 緑データ
digitalWrite(9,LOW); // RED 赤データ
if ((data_hex[k + scroll] & 0x8000 >> i) != 0) {
int color_pos = (k + scroll - 32) / 16;
if (color_pos < 0) color_pos = 0;
byte c = color[color_pos];
if (c & 1)
digitalWrite(9,HIGH); // RED 赤データ
if (c & 2)
digitalWrite(6,HIGH); // GREEN 緑データ
}
clock(); // クロック
}
write_ale_we(); // 書き込み操作 関数にまとめて有る
}
count++;
if (count > scroll_speed) {
count = 0;
scroll ++;
if (scroll > data_size - 32)
scroll = 0;
pos++;
if (pos > 15) {
pos = 0;
}
}
delay(s_s[s_s_pos]);
// スピード可変
if (digitalRead(11) == 0 && !toggle_high) {
toggle_high = true;
if (s_s_pos > 0)
s_s_pos--;
}
if (digitalRead(11) == 1) {
toggle_high = false;
}
if (digitalRead(12) == 0 && !toggle_low) {
toggle_low = true;
if (s_s_pos < 4)
s_s_pos++;
}
if (digitalRead(12) == 1) {
toggle_low = false;
}
if (digitalRead(14) == 0 && !toggle_select) {
toggle_select = true;
select++;
if (select > 5)
select = 1;
change(select);
scroll = 0;
delay(100);
}
if (digitalRead(14) == 1) {
toggle_select = false;
}
}
void write_ale_we() {
digitalWrite(10,HIGH); // ALE アドレスラッチ Hで有効
digitalWrite(8,HIGH); // WE 書き込み信号 Hで書き込み
digitalWrite(8,LOW); // WE 書き込み信号 Hで書き込み
digitalWrite(10,LOW); // ALE アドレスラッチ Hで有効
}
void clock() {
digitalWrite(7,HIGH); // クロック
digitalWrite(7,LOW); // クロック
}
void clock_n(int n) {
for (int i = 0;i < n;i++)
clock();
}
void change(int num) {
switch (num) {
case 1:
data_size = sizeof(data_hex_1) / 2;
data_hex = data_hex_1;
color = color_1;
break;
case 2:
data_size = sizeof(data_hex_2) / 2;
data_hex = data_hex_2;
color = color_2;
break;
case 3:
data_size = sizeof(data_hex_3) / 2;
data_hex = data_hex_3;
color = color_3;
break;
case 4:
data_size = sizeof(data_hex_4) / 2;
data_hex = data_hex_4;
color = color_4;
break;
case 5:
data_size = sizeof(data_hex_5) / 2;
data_hex = data_hex_5;
color = color_5;
break;
}
if (change_flag)
return;
short local_hex[data_size]; // sizeofの戻り値がバイト数なので2で割る
// データをクリア
for (int n = 0;n < data_size;n++) { // sizeofの戻り値がバイト数なので2で割る
local_hex[n] = 0; // ビット数は不要 0で16ビット全て0
}
for (int i = 0;i < data_size / 16;i++) { // 32バイトで1文字
for (int j = 0;j < 16;j++) { // 16はデーター数
for (int k = 0;k < 16;k++) { // 16はビット数
if ((data_hex[j + i * 16] & 0x8000 >> k) != 0) // 横データを
local_hex[k + i * 16] |= 0x8000 >> j; // 縦データに
}
}
}
for (int n = 0;n < data_size;n++) { // sizeofの戻り値がバイト数なので2で割る
data_hex[n] = local_hex[n]; // 元に戻す
}
if (num == 5)
change_flag = true;
}
太字が改造した部分
少し改造すれば1~5を順番に表示できる様にもなります。
このモジュールは連結して表示数を増やすことが簡単ですので2枚セットで4文字、4枚セットで8文字と本格的な電光掲示板にも増設出来ます。
一度トライしてみて下さい。
今回のシリーズは如何だったでしょうか?
面白そうだから作って見ようという気になって頂けたら幸いです。
次回からまた、新たにゲームを作るシリーズを始めます。
では、また。
マイコンArduinoを使って電光掲示板を作る。
続き
今回はスクロールスピードの可変に挑戦していきます。
ゲームの時に作ったプログラムを流用して完成させた。
作ったプログラム
// slx_5024
byte address[ ] = {5, 4, 3, 2}; // アドレスは扱いやすい様に配列で持つ
int pos = 0;
int count = 0;
int scroll = 0;
int scroll_speed = 5;
// 2文字では寂しいので5文字に変更 "あいうえお"
short data_hex[ ] = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0200, 0x0200, 0x3ffc, 0x0200, 0x03e0, 0x0e38, 0x1a2c,
0x3244, 0x22c4, 0x2384, 0x2304, 0x3e0c, 0x1878, 0x00e0, 0x0000,
0x0000, 0x0000, 0x2000, 0x2018, 0x2008, 0x200c, 0x2004, 0x2006,
0x2006, 0x3006, 0x3102, 0x3300, 0x1e00, 0x0e00, 0x0000, 0x0000,
0x0000, 0x0fc0, 0x00f0, 0x0000, 0x0000, 0x1ff0, 0x3818, 0x0018,
0x0008, 0x0018, 0x0018, 0x0030, 0x0070, 0x03c0, 0x0700, 0x0000,
0x0000, 0x0fe0, 0x00e0, 0x0000, 0x1fe0, 0x1ff0, 0x00c0, 0x0180,
0x03c0, 0x07c0, 0x0c40, 0x1840, 0x3040, 0x207e, 0x0000, 0x0000,
0x0000, 0x0200, 0x0218, 0x7fec, 0x0206, 0x0200, 0x0200, 0x0ff8,
0x1a0c, 0x2204, 0x6204, 0x6204, 0x220c, 0x3ef8, 0x0c00, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};
// カラーを配列で持つ
byte color[ ] = {1, 2, 3, 2, 1}; // 1,赤 2,緑 3,橙
void setup() {
for (int i = 0; i < 11; i++) {
pinMode(i, OUTPUT); // 各ピンの設定 全てアウトプット
}
pinMode(11, INPUT_PULLUP);
pinMode(12, INPUT_PULLUP);
digitalWrite(0,LOW); // SE L 自動でRAM切り替わり
digitalWrite(1,LOW); // A/BB 書き込み用RAM選択
digitalWrite(6,LOW); // GREEN 緑データ
digitalWrite(7,LOW); // CLK クロック
digitalWrite(8,LOW); // WE 書き込み信号 Hで書き込み
digitalWrite(9,LOW); // RED 赤データ
digitalWrite(10,LOW); // ALE アドレスラッチ Hで有効
change();
}
void loop() {
for (int i = 0; i < 16; i++) { // アドレス0~15
for (int j = 0; j < sizeof(address); j++)
if ((i & 0x1 << j) != 0) // address[0]~address[3]にビットをセット
digitalWrite(address[j], HIGH);
else
digitalWrite(address[j], LOW);
for (int k = 0;k < 32;k++) {
digitalWrite(6,LOW); // GREEN 緑データ
digitalWrite(9,LOW); // RED 赤データ
if ((data_hex[k + scroll] & 0x8000 >> i) != 0) {
int color_pos = (k + scroll - 32) / 16;
if (color_pos < 0) color_pos = 0;
byte c = color[color_pos];
if (c & 1)
digitalWrite(9,HIGH); // RED 赤データ
if (c & 2)
digitalWrite(6,HIGH); // GREEN 緑データ
}
clock(); // クロック
}
write_ale_we(); // 書き込み操作 関数にまとめて有る
}
count++;
if (count > scroll_speed) {
count = 0;
scroll ++;
if (scroll > sizeof(data_hex) / 2 - 32)
scroll = 0;
pos++;
if (pos > 15) {
pos = 0;
}
// スピード可変
if (digitalRead(11) == 0)
if (scroll_speed > 0)
scroll_speed--;
if (digitalRead(12) == 0)
if (scroll_speed < 10)
scroll_speed++;
}
}
void write_ale_we() {
digitalWrite(10,HIGH); // ALE アドレスラッチ Hで有効
digitalWrite(8,HIGH); // WE 書き込み信号 Hで書き込み
digitalWrite(8,LOW); // WE 書き込み信号 Hで書き込み
digitalWrite(10,LOW); // ALE アドレスラッチ Hで有効
}
void clock() {
digitalWrite(7,HIGH); // クロック
digitalWrite(7,LOW); // クロック
}
void clock_n(int n) {
for (int i = 0;i < n;i++)
clock();
}
void change() {
short local_hex[sizeof(data_hex) / 2]; // sizeofの戻り値がバイト数なので2で割る
// データをクリア
for (int n = 0;n < sizeof(data_hex) / 2;n++) { // sizeofの戻り値がバイト数なので2で割る
local_hex[n] = 0; // ビット数は不要 0で16ビット全て0
}
for (int i = 0;i < sizeof(data_hex) / 32;i++) { // 32バイトで1文字
for (int j = 0;j < 16;j++) { // 16はデーター数
for (int k = 0;k < 16;k++) { // 16はビット数
if ((data_hex[j + i * 16] & 0x8000 >> k) != 0) // 横データを
local_hex[k + i * 16] |= 0x8000 >> j; // 縦データに
}
}
}
for (int n = 0;n < sizeof(data_hex) / 2;n++) { // sizeofの戻り値がバイト数なので2で割る
data_hex[n] = local_hex[n]; // 元に戻す
}
}
イマイチです。
急激に変わりすぎて調整がし難い。
次に作ったのが
// slx_5024
byte address[ ] = {5, 4, 3, 2}; // アドレスは扱いやすい様に配列で持つ
int pos = 0;
int count = 0;
int scroll = 0;
int scroll_speed = 0;
boolean toggle_high = false;
boolean toggle_low = false;
int s_s[ ] = {1, 10, 30, 70, 150};
int s_s_pos = 2;
// 2文字では寂しいので5文字に変更 "あいうえお"
short data_hex[ ] = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0200, 0x0200, 0x3ffc, 0x0200, 0x03e0, 0x0e38, 0x1a2c,
0x3244, 0x22c4, 0x2384, 0x2304, 0x3e0c, 0x1878, 0x00e0, 0x0000,
0x0000, 0x0000, 0x2000, 0x2018, 0x2008, 0x200c, 0x2004, 0x2006,
0x2006, 0x3006, 0x3102, 0x3300, 0x1e00, 0x0e00, 0x0000, 0x0000,
0x0000, 0x0fc0, 0x00f0, 0x0000, 0x0000, 0x1ff0, 0x3818, 0x0018,
0x0008, 0x0018, 0x0018, 0x0030, 0x0070, 0x03c0, 0x0700, 0x0000,
0x0000, 0x0fe0, 0x00e0, 0x0000, 0x1fe0, 0x1ff0, 0x00c0, 0x0180,
0x03c0, 0x07c0, 0x0c40, 0x1840, 0x3040, 0x207e, 0x0000, 0x0000,
0x0000, 0x0200, 0x0218, 0x7fec, 0x0206, 0x0200, 0x0200, 0x0ff8,
0x1a0c, 0x2204, 0x6204, 0x6204, 0x220c, 0x3ef8, 0x0c00, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};
// カラーを配列で持つ
byte color[ ] = {1, 2, 3, 2, 1}; // 1,赤 2,緑 3,橙
void setup() {
for (int i = 0; i < 11; i++) {
pinMode(i, OUTPUT); // 各ピンの設定 全てアウトプット
}
pinMode(11, INPUT_PULLUP);
pinMode(12, INPUT_PULLUP);
digitalWrite(0,LOW); // SE L 自動でRAM切り替わり
digitalWrite(1,LOW); // A/BB 書き込み用RAM選択
digitalWrite(6,LOW); // GREEN 緑データ
digitalWrite(7,LOW); // CLK クロック
digitalWrite(8,LOW); // WE 書き込み信号 Hで書き込み
digitalWrite(9,LOW); // RED 赤データ
digitalWrite(10,LOW); // ALE アドレスラッチ Hで有効
change();
}
void loop() {
for (int i = 0; i < 16; i++) { // アドレス0~15
for (int j = 0; j < sizeof(address); j++)
if ((i & 0x1 << j) != 0) // address[0]~address[3]にビットをセット
digitalWrite(address[j], HIGH);
else
digitalWrite(address[j], LOW);
for (int k = 0;k < 32;k++) {
digitalWrite(6,LOW); // GREEN 緑データ
digitalWrite(9,LOW); // RED 赤データ
if ((data_hex[k + scroll] & 0x8000 >> i) != 0) {
int color_pos = (k + scroll - 32) / 16;
if (color_pos < 0) color_pos = 0;
byte c = color[color_pos];
if (c & 1)
digitalWrite(9,HIGH); // RED 赤データ
if (c & 2)
digitalWrite(6,HIGH); // GREEN 緑データ
}
clock(); // クロック
}
write_ale_we(); // 書き込み操作 関数にまとめて有る
}
count++;
if (count > scroll_speed) {
count = 0;
scroll ++;
if (scroll > sizeof(data_hex) / 2 - 32)
scroll = 0;
pos++;
if (pos > 15) {
pos = 0;
}
}
delay(s_s[s_s_pos]);
// スピード可変
if (digitalRead(11) == 0 && !toggle_high) {
toggle_high = true;
if (s_s_pos > 0)
s_s_pos--;
}
if (digitalRead(11) == 1) {
toggle_high = false;
}
if (digitalRead(12) == 0 && !toggle_low) {
toggle_low = true;
if (s_s_pos < 4)
s_s_pos++;
}
if (digitalRead(12) == 1) {
toggle_low = false;
}
}
void write_ale_we() {
digitalWrite(10,HIGH); // ALE アドレスラッチ Hで有効
digitalWrite(8,HIGH); // WE 書き込み信号 Hで書き込み
digitalWrite(8,LOW); // WE 書き込み信号 Hで書き込み
digitalWrite(10,LOW); // ALE アドレスラッチ Hで有効
}
void clock() {
digitalWrite(7,HIGH); // クロック
digitalWrite(7,LOW); // クロック
}
void clock_n(int n) {
for (int i = 0;i < n;i++)
clock();
}
void change() {
short local_hex[sizeof(data_hex) / 2]; // sizeofの戻り値がバイト数なので2で割る
// データをクリア
for (int n = 0;n < sizeof(data_hex) / 2;n++) { // sizeofの戻り値がバイト数なので2で割る
local_hex[n] = 0; // ビット数は不要 0で16ビット全て0
}
for (int i = 0;i < sizeof(data_hex) / 32;i++) { // 32バイトで1文字
for (int j = 0;j < 16;j++) { // 16はデーター数
for (int k = 0;k < 16;k++) { // 16はビット数
if ((data_hex[j + i * 16] & 0x8000 >> k) != 0) // 横データを
local_hex[k + i * 16] |= 0x8000 >> j; // 縦データに
}
}
}
for (int n = 0;n < sizeof(data_hex) / 2;n++) { // sizeofの戻り値がバイト数なので2で割る
data_hex[n] = local_hex[n]; // 元に戻す
}
}
これで速度変化が一定で使いやすくなります。
次回はタクトスイッチをもう一つ追加して定型文(5種類)を選択できるように改造していきます。
では、また。
マイコンArduinoを使って電光掲示板を作る。
続き
今回は個別に色指定が出来る様に改造していきます。
一文字一文字に色のデーターを持たせる様に配列にして見ました。
作ったプログラム
// slx_5024
byte address[ ] = {5, 4, 3, 2}; // アドレスは扱いやすい様に配列で持つ
int pos = 0;
int count = 0;
int scroll = 0;
int scroll_speed = 5;
// 2文字では寂しいので5文字に変更 "あいうえお"
short data_hex[ ] = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0200, 0x0200, 0x3ffc, 0x0200, 0x03e0, 0x0e38, 0x1a2c,
0x3244, 0x22c4, 0x2384, 0x2304, 0x3e0c, 0x1878, 0x00e0, 0x0000,
0x0000, 0x0000, 0x2000, 0x2018, 0x2008, 0x200c, 0x2004, 0x2006,
0x2006, 0x3006, 0x3102, 0x3300, 0x1e00, 0x0e00, 0x0000, 0x0000,
0x0000, 0x0fc0, 0x00f0, 0x0000, 0x0000, 0x1ff0, 0x3818, 0x0018,
0x0008, 0x0018, 0x0018, 0x0030, 0x0070, 0x03c0, 0x0700, 0x0000,
0x0000, 0x0fe0, 0x00e0, 0x0000, 0x1fe0, 0x1ff0, 0x00c0, 0x0180,
0x03c0, 0x07c0, 0x0c40, 0x1840, 0x3040, 0x207e, 0x0000, 0x0000,
0x0000, 0x0200, 0x0218, 0x7fec, 0x0206, 0x0200, 0x0200, 0x0ff8,
0x1a0c, 0x2204, 0x6204, 0x6204, 0x220c, 0x3ef8, 0x0c00, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};
// カラーを配列で持つ
byte color[ ] = {1, 2, 3, 2, 1}; // 1,赤 2,緑 3,橙
void setup() {
for (int i = 0; i < 11; i++) {
pinMode(i, OUTPUT); // 各ピンの設定 全てアウトプット
}
digitalWrite(0,LOW); // SE L 自動でRAM切り替わり
digitalWrite(1,LOW); // A/BB 書き込み用RAM選択
digitalWrite(6,LOW); // GREEN 緑データ
digitalWrite(7,LOW); // CLK クロック
digitalWrite(8,LOW); // WE 書き込み信号 Hで書き込み
digitalWrite(9,LOW); // RED 赤データ
digitalWrite(10,LOW); // ALE アドレスラッチ Hで有効
change();
}
void loop() {
for (int i = 0; i < 16; i++) { // アドレス0~15
for (int j = 0; j < sizeof(address); j++)
if ((i & 0x1 << j) != 0) // address[0]~address[3]にビットをセット
digitalWrite(address[j], HIGH);
else
digitalWrite(address[j], LOW);
for (int k = 0;k < 32;k++) {
digitalWrite(6,LOW); // GREEN 緑データ
digitalWrite(9,LOW); // RED 赤データ
if ((data_hex[k + scroll] & 0x8000 >> i) != 0) {
int color_pos = (k + scroll - 32) / 16;
if (color_pos < 0) color_pos = 0;
byte c = color[color_pos];
if (c & 1)
digitalWrite(9,HIGH); // RED 赤データ
if (c & 2)
digitalWrite(6,HIGH); // GREEN 緑データ
}
clock(); // クロック
}
write_ale_we(); // 書き込み操作 関数にまとめて有る
}
count++;
if (count > scroll_speed) {
count = 0;
scroll ++;
if (scroll > sizeof(data_hex) / 2 - 32)
scroll = 0;
pos++;
if (pos > 15) {
pos = 0;
}
}
}
void write_ale_we() {
digitalWrite(10,HIGH); // ALE アドレスラッチ Hで有効
digitalWrite(8,HIGH); // WE 書き込み信号 Hで書き込み
digitalWrite(8,LOW); // WE 書き込み信号 Hで書き込み
digitalWrite(10,LOW); // ALE アドレスラッチ Hで有効
}
void clock() {
digitalWrite(7,HIGH); // クロック
digitalWrite(7,LOW); // クロック
}
void clock_n(int n) {
for (int i = 0;i < n;i++)
clock();
}
void change() {
short local_hex[sizeof(data_hex) / 2]; // sizeofの戻り値がバイト数なので2で割る
// データをクリア
for (int n = 0;n < sizeof(data_hex) / 2;n++) { // sizeofの戻り値がバイト数なので2で割る
local_hex[n] = 0; // ビット数は不要 0で16ビット全て0
}
for (int i = 0;i < sizeof(data_hex) / 32;i++) { // 32バイトで1文字
for (int j = 0;j < 16;j++) { // 16はデーター数
for (int k = 0;k < 16;k++) { // 16はビット数
if ((data_hex[j + i * 16] & 0x8000 >> k) != 0) // 横データを
local_hex[k + i * 16] |= 0x8000 >> j; // 縦データに
}
}
}
for (int n = 0;n < sizeof(data_hex) / 2;n++) { // sizeofの戻り値がバイト数なので2で割る
data_hex[n] = local_hex[n]; // 元に戻す
}
}
あらまぁ簡単。数行の追加で実現できました。
次回はテニスゲームで追加したタクトスイッチを使ってスクロールスピードの可変に挑戦していきます。
では、また。
マイコンArduinoを使って電光掲示板を作る。
続き
今回は3色カラー表示に挑戦していきます。
ただ単にカラーを変えるだけなら
// 赤色表示
for (int k = 0;k < 32;k++) {
if ((data_hex[k + scroll] & 0x8000 >> i) != 0)
digitalWrite(9,HIGH); // RED 赤データ // データのセット
else
digitalWrite(9,LOW); // RED 赤データ // データのセット
を
// 緑色表示
for (int k = 0;k < 32;k++) {
if ((data_hex[k + scroll] & 0x8000 >> i) != 0)
digitalWrite(6,HIGH); // GREEN 緑データ // データのセット
else
digitalWrite(6,LOW); // GREEN 緑データ // データのセット
へ変えるか又は
// 橙色表示
for (int k = 0;k < 32;k++) {
if ((data_hex[k + scroll] & 0x8000 >> i) != 0) {
digitalWrite(6,HIGH); // GREEN 緑データ // データのセット
digitalWrite(9,HIGH); // RED 赤データ // データのセット
}
else {
digitalWrite(6,LOW); // GREEN 緑データ // データのセット
digitalWrite(9,LOW); // RED 赤データ // データのセット
}
で行えますが、出来たら文字単位でカラーを変えたい所です。
そこで最初に思いついたのが
// slx_5024
byte address[ ] = {5, 4, 3, 2}; // アドレスは扱いやすい様に配列で持つ
int pos = 0;
int count = 0;
int scroll = 0;
int scroll_speed = 5;
// 2文字では寂しいので5文字に変更 "あいうえお"
short data_hex[ ] = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0200, 0x0200, 0x3ffc, 0x0200, 0x03e0, 0x0e38, 0x1a2c,
0x3244, 0x22c4, 0x2384, 0x2304, 0x3e0c, 0x1878, 0x00e0, 0x0000,
0x0000, 0x0000, 0x2000, 0x2018, 0x2008, 0x200c, 0x2004, 0x2006,
0x2006, 0x3006, 0x3102, 0x3300, 0x1e00, 0x0e00, 0x0000, 0x0000,
0x0000, 0x0fc0, 0x00f0, 0x0000, 0x0000, 0x1ff0, 0x3818, 0x0018,
0x0008, 0x0018, 0x0018, 0x0030, 0x0070, 0x03c0, 0x0700, 0x0000,
0x0000, 0x0fe0, 0x00e0, 0x0000, 0x1fe0, 0x1ff0, 0x00c0, 0x0180,
0x03c0, 0x07c0, 0x0c40, 0x1840, 0x3040, 0x207e, 0x0000, 0x0000,
0x0000, 0x0200, 0x0218, 0x7fec, 0x0206, 0x0200, 0x0200, 0x0ff8,
0x1a0c, 0x2204, 0x6204, 0x6204, 0x220c, 0x3ef8, 0x0c00, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};
void setup() {
for (int i = 0; i < 11; i++) {
pinMode(i, OUTPUT); // 各ピンの設定 全てアウトプット
}
digitalWrite(0,LOW); // SE L 自動でRAM切り替わり
digitalWrite(1,LOW); // A/BB 書き込み用RAM選択
digitalWrite(6,LOW); // GREEN 緑データ
digitalWrite(7,LOW); // CLK クロック
digitalWrite(8,LOW); // WE 書き込み信号 Hで書き込み
digitalWrite(9,LOW); // RED 赤データ
digitalWrite(10,LOW); // ALE アドレスラッチ Hで有効
change();
}
void loop() {
for (int i = 0; i < 16; i++) { // アドレス0~15
for (int j = 0; j < sizeof(address); j++)
if ((i & 0x1 << j) != 0) // address[0]~address[3]にビットをセット
digitalWrite(address[j], HIGH);
else
digitalWrite(address[j], LOW);
for (int k = 0;k < 32;k++) {
digitalWrite(6,LOW); // GREEN 緑データ
digitalWrite(9,LOW); // RED 赤データ
if ((data_hex[k + scroll] & 0x8000 >> i) != 0)
if (k < 16)
digitalWrite(9,HIGH); // RED 赤データ
else
digitalWrite(6,HIGH); // GREEN 緑データ
clock(); // クロック
}
write_ale_we(); // 書き込み操作 関数にまとめて有る
}
count++;
if (count > scroll_speed) {
count = 0;
scroll ++;
if (scroll > sizeof(data_hex) / 2 - 32)
scroll = 0;
pos++;
if (pos > 15) {
pos = 0;
}
}
}
void write_ale_we() {
digitalWrite(10,HIGH); // ALE アドレスラッチ Hで有効
digitalWrite(8,HIGH); // WE 書き込み信号 Hで書き込み
digitalWrite(8,LOW); // WE 書き込み信号 Hで書き込み
digitalWrite(10,LOW); // ALE アドレスラッチ Hで有効
}
void clock() {
digitalWrite(7,HIGH); // クロック
digitalWrite(7,LOW); // クロック
}
void clock_n(int n) {
for (int i = 0;i < n;i++)
clock();
}
void change() {
short local_hex[sizeof(data_hex) / 2]; // sizeofの戻り値がバイト数なので2で割る
// データをクリア
for (int n = 0;n < sizeof(data_hex) / 2;n++) { // sizeofの戻り値がバイト数なので2で割る
local_hex[n] = 0; // ビット数は不要 0で16ビット全て0
}
for (int i = 0;i < sizeof(data_hex) / 32;i++) { // 32バイトで1文字
for (int j = 0;j < 16;j++) { // 16はデーター数
for (int k = 0;k < 16;k++) { // 16はビット数
if ((data_hex[j + i * 16] & 0x8000 >> k) != 0) // 横データを
local_hex[k + i * 16] |= 0x8000 >> j; // 縦データに
}
}
}
for (int n = 0;n < sizeof(data_hex) / 2;n++) { // sizeofの戻り値がバイト数なので2で割る
data_hex[n] = local_hex[n]; // 元に戻す
}
}
変数scroll_speedを追加
表示文字を"あいうえお"に変更
文字表示の様子
思っていたのと違う
更に手を加えて
for (int k = 0;k < 32;k++) {
digitalWrite(6,LOW); // GREEN 緑データ
digitalWrite(9,LOW); // RED 赤データ
if ((data_hex[k + scroll] & 0x8000 >> i) != 0)
if (k + scroll < 16 + 32) // 1文字目
digitalWrite(9,HIGH); // RED 赤データ
else if (k + scroll < 32 + 32) // 2文字目
digitalWrite(6,HIGH); // GREEN 緑データ
else { // 3文字目以降
digitalWrite(9,HIGH); // RED 赤データ
digitalWrite(6,HIGH); // GREEN 緑データ
}
clock(); // クロック
}
に変更
それらしくなって来ました。
しかしこの方法では文字に対しての色指定が出来ないので他の方法を探っていきます。
次回は個別に色指定が出来る様に改造していきます。
では、また。
マイコンArduinoを使って電光掲示板を作る。
続き
今回は、スクロール表示に改造していきます。
改造と言ってもこれまた前モジュールのプログラムを流用していきます。
前回の固定表示との違いは太字文字の部分のみ
// slx_5024
byte address[ ] = {5, 4, 3, 2}; // アドレスは扱いやすい様に配列で持つ
int pos = 0;
int count = 0;
int scroll = 0;
short data_hex[ ] = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0200, 0x0200, 0x3ff8, 0x0200, 0x0220, 0x03f0, 0x0628,
0x1a44, 0x1244, 0x2284, 0x2304, 0x260c, 0x3d18, 0x0070, 0x0000,
0x0000, 0x0000, 0x0000, 0x2010, 0x2018, 0x2008, 0x200c, 0x2004,
0x3004, 0x3004, 0x1186, 0x1106, 0x1b00, 0x0e00, 0x0400, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};
void setup() {
for (int i = 0; i < 11; i++) {
pinMode(i, OUTPUT); // 各ピンの設定 全てアウトプット
}
digitalWrite(0,LOW); // SE L 自動でRAM切り替わり
digitalWrite(1,LOW); // A/BB 書き込み用RAM選択
digitalWrite(6,LOW); // GREEN 緑データ
digitalWrite(7,LOW); // CLK クロック
digitalWrite(8,LOW); // WE 書き込み信号 Hで書き込み
digitalWrite(9,LOW); // RED 赤データ
digitalWrite(10,LOW); // ALE アドレスラッチ Hで有効
change();
}
void loop() {
for (int i = 0; i < 16; i++) { // アドレス0~15
for (int j = 0; j < sizeof(address); j++)
if ((i & 0x1 << j) != 0) // address[0]~address[3]にビットをセット
digitalWrite(address[j], HIGH);
else
digitalWrite(address[j], LOW);
for (int k = 0;k < 32;k++) {
if ((data_hex[k + scroll] & 0x8000 >> i) != 0)
digitalWrite(9,HIGH); // RED 赤データ // データのセット
else
digitalWrite(9,LOW); // RED 赤データ // データのセット
clock(); // クロック
}
write_ale_we(); // 書き込み操作 関数にまとめて有る
}
count++;
if (count > 20) {
count = 0;
scroll ++;
if (scroll > sizeof(data_hex) / 2 - 32) // - 32は前の2文字分
scroll = 0;
pos++;
if (pos > 15) {
pos = 0;
}
}
}
void write_ale_we() {
digitalWrite(10,HIGH); // ALE アドレスラッチ Hで有効
digitalWrite(8,HIGH); // WE 書き込み信号 Hで書き込み
digitalWrite(8,LOW); // WE 書き込み信号 Hで書き込み
digitalWrite(10,LOW); // ALE アドレスラッチ Hで有効
}
void clock() {
digitalWrite(7,HIGH); // クロック
digitalWrite(7,LOW); // クロック
}
void clock_n(int n) {
for (int i = 0;i < n;i++)
clock();
}
void change() {
short local_hex[sizeof(data_hex) / 2]; // sizeofの戻り値がバイト数なので2で割る
// データをクリア
for (int n = 0;n < sizeof(data_hex) / 2;n++) { // sizeofの戻り値がバイト数なので2で割る
local_hex[n] = 0; // ビット数は不要 0で16ビット全て0
}
for (int i = 0;i < sizeof(data_hex) / 32;i++) { // 32バイトで1文字
for (int j = 0;j < 16;j++) { // 16はデーター数
for (int k = 0;k < 16;k++) { // 16はビット数
if ((data_hex[j + i * 16] & 0x8000 >> k) != 0) // 横データを
local_hex[k + i * 16] |= 0x8000 >> j; // 縦データに
}
}
}
for (int n = 0;n < sizeof(data_hex) / 2;n++) { // sizeofの戻り値がバイト数なので2で割る
data_hex[n] = local_hex[n]; // 元に戻す
}
}
前モジュールに比べてあまりにも簡単です。
今回のモジュールでの新しい部分、次回は3色カラー表示に改造していきます。
では、また。
マイコンArduinoを使って電光掲示板を作る。
続き
今回は文字の表示に挑戦していきます。
と言っても前モジュールで経験済みです。
少し手を加えるだけで表示できるようになります。
違うのは太字の部分だけです。
以前、今回のモジュールの方が使いやすいと言いましたが
よりシンプルなプログラムで表示できます。
// slx_5024
byte address[ ] = {5, 4, 3, 2}; // アドレスは扱いやすい様に配列で持つ
int pos = 0;
int count = 0;
short data_hex[ ] = {
0x0000, 0x0200, 0x0200, 0x3ff8, 0x0200, 0x0220, 0x03f0, 0x0628,
0x1a44, 0x1244, 0x2284, 0x2304, 0x260c, 0x3d18, 0x0070, 0x0000,
0x0000, 0x0000, 0x0000, 0x2010, 0x2018, 0x2008, 0x200c, 0x2004,
0x3004, 0x3004, 0x1186, 0x1106, 0x1b00, 0x0e00, 0x0400, 0x0000};
void setup() {
for (int i = 0; i < 11; i++) {
pinMode(i, OUTPUT); // 各ピンの設定 全てアウトプット
}
digitalWrite(0,LOW); // SE L 自動でRAM切り替わり
digitalWrite(1,LOW); // A/BB 書き込み用RAM選択
digitalWrite(6,LOW); // GREEN 緑データ
digitalWrite(7,LOW); // CLK クロック
digitalWrite(8,LOW); // WE 書き込み信号 Hで書き込み
digitalWrite(9,LOW); // RED 赤データ
digitalWrite(10,LOW); // ALE アドレスラッチ Hで有効
change();
}
void loop() {
for (int i = 0; i < 16; i++) { // アドレス0~15
for (int j = 0; j < sizeof(address); j++)
if ((i & 0x1 << j) != 0) // address[0]~address[3]にビットをセット
digitalWrite(address[j], HIGH);
else
digitalWrite(address[j], LOW);
for (int k = 0;k < 32;k++) {
if ((data_hex[k] & 0x8000 >> i) != 0)
digitalWrite(9,HIGH); // RED 赤データ // データのセット
else
digitalWrite(9,LOW); // RED 赤データ // データのセット
clock(); // クロック
}
write_ale_we(); // 書き込み操作 関数にまとめて有る
}
count++;
if (count > 20) {
count = 0;
pos++;
if (pos > 15) {
pos = 0;
}
}
}
void write_ale_we() {
digitalWrite(10,HIGH); // ALE アドレスラッチ Hで有効
digitalWrite(8,HIGH); // WE 書き込み信号 Hで書き込み
digitalWrite(8,LOW); // WE 書き込み信号 Hで書き込み
digitalWrite(10,LOW); // ALE アドレスラッチ Hで有効
}
void clock() {
digitalWrite(7,HIGH); // クロック
digitalWrite(7,LOW); // クロック
}
void clock_n(int n) {
for (int i = 0;i < n;i++)
clock();
}
void change() {
short local_hex[sizeof(data_hex) / 2]; // sizeofの戻り値がバイト数なので2で割る
// データをクリア
for (int n = 0;n < sizeof(data_hex) / 2;n++) { // sizeofの戻り値がバイト数なので2で割る
local_hex[n] = 0; // ビット数は不要 0で16ビット全て0
}
for (int i = 0;i < sizeof(data_hex) / 32;i++) { // 32バイトで1文字
for (int j = 0;j < 16;j++) { // 16はデーター数
for (int k = 0;k < 16;k++) { // 16はビット数
if ((data_hex[j + i * 16] & 0x8000 >> k) != 0) // 横データを
local_hex[k + i * 16] |= 0x8000 >> j; // 縦データに
}
}
}
for (int n = 0;n < sizeof(data_hex) / 2;n++) { // sizeofの戻り値がバイト数なので2で割る
data_hex[n] = local_hex[n]; // 元に戻す
}
}
チョットだけ進化させました。
文字数を自動で判別できる様に変更
sizeof(data_hex) sizeofの戻り値がバイト数なので注意が必要
文字が大きくて明るい
赤色ですが緑色もデータセットを変えるだけ
次回はスクロール表示に改造していきます。
では、また。
マイコンArduinoを使って電光掲示板を作る。
続き
今回はゲームらしく難易度が上がって行くプログラムに書き換えていきます。
難易度を上げるにはまず思い付くのは速度を上げる。
もう一つはラケットを小さくするです。
今回はこの2つを実装していきます。
実装と言っても数行追加しただけです。
// slx_5024
byte address[ ] = {5, 4, 3, 2}; // アドレスは扱いやすい様に配列で持つ
int pos = 0;
int count = 0;
int x_pos = 0;
int y_pos = 0;
boolean x_dir = false;
boolean y_dir = false;
int speed = 10;
int racket_pos = 12;
int racket_size = 8;
void setup() {
for (int i = 0; i < 11; i++) {
pinMode(i, OUTPUT); // 各ピンの設定 全てアウトプット
pinMode(11, INPUT_PULLUP);
pinMode(12, INPUT_PULLUP);
}
digitalWrite(0,LOW); // SE L 自動でRAM切り替わり // A/BB書換えを使うのでHをセット
digitalWrite(1,LOW); // A/BB 書き込み用RAM選択 // その他は全てLをセット
digitalWrite(6,LOW); // GREEN 緑データ
digitalWrite(7,LOW); // CLK クロック
digitalWrite(8,LOW); // WE 書き込み信号 Hで書き込み
digitalWrite(9,LOW); // RED 赤データ
digitalWrite(10,LOW); // ALE アドレスラッチ Hで有効
}
void loop() {
for (int i = 0; i < 16; i++) { // アドレス0~15
for (int j = 0; j < sizeof(address); j++)
if ((i & 0x1 << j) != 0) // address[0]~address[3]にビットをセット
digitalWrite(address[j], HIGH);
else
digitalWrite(address[j], LOW);
for (int k = 0;k < 32;k++) {
if (k == x_pos && i == y_pos)
digitalWrite(9,HIGH); // RED 赤データ // データのセット
else
digitalWrite(9,LOW); // RED 赤データ // データのセット
if (i == 15) {
if (k < racket_size + racket_pos && k >= racket_pos)
digitalWrite(9,HIGH); // RED 赤データ // データのセット
}
clock(); // クロック
}
write_ale_we(); // 書き込み操作 関数にまとめて有る
}
count++;
if (count > speed) {
count = 0;
pos++;
if (pos > 15) {
pos = 0;
}
// ボールの位置 x軸
if (!x_dir)
x_pos++;
else
x_pos--;
if (x_pos > 30) {
x_dir = true;
}
if (x_pos < 1) {
x_dir = false;
}
// ボールの位置 y軸
if (!y_dir)
y_pos++;
else
y_pos--;
if (y_pos == 14 && x_pos < racket_size + racket_pos && x_pos >= racket_pos) {
y_dir = true;
}
if (y_pos < 1) {
y_dir = false;
speed--;
if (speed < 5) { // 5を小さくすると更に難しくなる
speed = 5; // 5を小さくすると更に難しくなる
racket_size--;
if (racket_size < 4) // 4を小さくすると更に難しくなる
racket_size = 4; // 4を小さくすると更に難しくなる
}
}
// ラケットの位置
if (digitalRead(11) == 0)
if (racket_pos > 0)
racket_pos--;
if (digitalRead(12) == 0)
if (racket_pos < 32 - racket_size)
racket_pos++;
}
}
void write_ale_we() {
digitalWrite(10,HIGH); // ALE アドレスラッチ Hで有効
digitalWrite(8,HIGH); // WE 書き込み信号 Hで書き込み
digitalWrite(8,LOW); // WE 書き込み信号 Hで書き込み
digitalWrite(10,LOW); // ALE アドレスラッチ Hで有効
}
void clock() {
digitalWrite(7,HIGH); // クロック
digitalWrite(7,LOW); // クロック
}
void clock_n(int n) {
for (int i = 0;i < n;i++)
clock();
}
太字の部分を追加
テニスゲームで遊んでいる様子
分かり易く進めたつもりですが如何でしたか?
少して手を加えるだけでブロック崩しにも出来そうです。
挑戦して見て下さい。
ゲームは今回で区切りを付けて次回からは文字の表示に移りたいと思います。
では、また。