マイコンArduinoを使って電光掲示板を作る。
続き
今回はタクトスイッチを使ってアクセルを追加していきます。
スピードのコントロールが出来るとよりゲームらしくなると思います。
衝突時のアクションの変更
// slx_5024
byte address = {5, 4, 3, 2}; // アドレスは扱いやすい様に配列で持つ
int count = 0;
int speed = 20;
int car_pos = 6;
int advance = 0;
boolean conflict = false;
//short car_data = {0x0000, 0x03c0, 0x03c0, 0x0180, 0x0180, 0x03c0, 0x03c0};
short car_data = {0x0000, 0x000f, 0x000f, 0x0006, 0x0006, 0x000f, 0x000f};
short road_data = {0xe007, 0xe007, 0xe007, 0xe007, 0xf003, 0xf003, 0xf003, 0xf003, 0xf801, 0xf801, 0xf801, 0xf801, 0xfc01, 0xfc01, 0xfc01, 0xfc01,
0xfe01, 0xfe01, 0xfe01, 0xfe01, 0xfc01, 0xfc01, 0xfc01, 0xfc01, 0xf801, 0xf801, 0xf801, 0xf801, 0xf003, 0xf003, 0xf003, 0xf003,
0xe007, 0xe007, 0xe007, 0xe007, 0xc00f, 0xc00f, 0xc00f, 0xc00f, 0x801f, 0x801f, 0x801f, 0x801f, 0x803f, 0x803f, 0x803f, 0x803f,
0x807f, 0x807f, 0x807f, 0x807f, 0x803f, 0x803f, 0x803f, 0x803f, 0x801f, 0x801f, 0x801f, 0x801f, 0xc00f, 0xc00f, 0xc00f, 0xc00f,
0xe007, 0xe007, 0xe007, 0xe007, 0xf003, 0xf003, 0xf003, 0xf003, 0xf801, 0xf801, 0xf801, 0xf801, 0xfc01, 0xfc01, 0xfc01, 0xfc01,
0xfe01, 0xfe01, 0xfe01, 0xfe01, 0xfc01, 0xfc01, 0xfc01, 0xfc01, 0xf801, 0xf801, 0xf801, 0xf801, 0xf003, 0xf003, 0xf003, 0xf003};
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で有効
}
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 ((road_data[k + advance] & 0x8000 >> i) != 0)
digitalWrite(6,HIGH); // GREEN 緑データ // データのセット
if (k < 7) {
if ((car_data[k] & 0x8000 >> i + car_pos) != 0)
digitalWrite(9,HIGH); // RED 赤データ // データのセット
if ((road_data[k + advance] & car_data[k] << car_pos) != 0)
conflict = true;
}
clock(); // クロック
}
write_ale_we(); // 書き込み操作 関数にまとめて有る
}
if (conflict) {
speed = 20;
conflict = false; // 衝突すると停止する
}
count++;
if (count > speed) {
count = 0;
if (speed < 20) // アクセルオンで再スタート
advance++;
if (advance > 64)
advance = 0;
// 車の位置
if (digitalRead(11) == 0)
if (car_pos < 12)
car_pos++;
if (digitalRead(12) == 0)
if (car_pos > 0)
car_pos--;
if (digitalRead(14) == 0) { // アクセル
speed--;
if (speed < 1)
speed = 1;
}
}
}
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();
}
アクセルで速度の調整が出来る。
速度を上げると直ぐにぶつかる。(難しい)
今回のゲームは如何だったでしょうか。
Arduinoは書き換えて直ぐに実行できるので色々試して下さい。
ゲームはここで一旦終了とさせて頂きます。
では、また。