LEGOTAROのアイコン画像
LEGOTARO 2021年02月13日作成 (2021年02月15日更新)
製作品 製作品 閲覧数 640
LEGOTARO 2021年02月13日作成 (2021年02月15日更新) 製作品 製作品 閲覧数 640

立体迷路(惑星探検迷路)

立体迷路(惑星探検迷路)

経緯

夏休みの宿題で作りました。
少し前の作品で、動画を撮り忘れていました・・・。残念です。
分解して、クレーンゲームに作りかえてしまったので、もう現物がありません。
分かりにくいかもしれませんが、がんばって説明してみます!
ちょっと家の人に相談したりして書きました。

外観と遊び方

完成したところ
1. 9v電池を3個Arduinoにさします。(下部の箱に電池ボックスがある)

2. ジョイスティックを上下左右に動かすと迷路盤(上部)が前後左右に傾きます。

3. (時間を計りたい人)は緑のボタンを押します。

4. ボールをスタートからゴールまで転がします。
  迷路盤をジョイスティックを操作して、前後左右に傾けることによって、
  ボールを転がしてゴールを目指します。
  途中で、妨害装置があるので、それをよけるのが、ちょっと難しいです。

5. 時間を計った人は、ゴールと同時に赤いボタンをおします。
  ストップウォッチが止まって、何分かかったか分かります。
  赤と緑を両方おすとリセットします。

6. 9v電池を抜いて終了です。

構造

上部

上から見た写真
コースを決めて、迷路盤をつくります。
迷路盤に宇宙っぽい絵を描きました。だから作品名が惑星探検迷路です。
迷路盤の裏側の中心部にキャスターをつける。
キャスターのコロコロ部分によって、いろんな方向に迷路盤が傾きます。
左上の角がスタートで、左下の角がゴールです。
キャスターの写真
キャプションを入力できます

仕掛け(2種類)

1.妨害装置
上から見た写真
下から見た写真
後ろに付けたサーボモータにより羽が動いて、ボールを跳ね返したり、違う場所へ誘導する妨害装置です。
タイミングを見計らってボールを通過させないといけないです。

2. LED点灯装置
写真がないのですが、迷路盤の2か所に穴が開いていて、後ろからLEDとフォトリフレクタが差し込んであります。
フォトリフレクタの上をボールが通過すると、感知して、LEDが光るようにしました。

ストップウォッチ

タクトスイッチとLCDが使ってみたかったので、時間を計ることにしました。
操作盤に LCD、緑スイッチ(スタート)赤(ストップ)ボタンをつけました。
LCDの画面調整用に可変抵抗器をつけました。
配線のときに、線がモーターの近くにあると、時間計測のときに、LCDに宇宙人からのメッセージみたいな文字がいっぱい出てきてびっくりしました。これがノイズなのかなと思いました。
ストップウォッチ
画素が悪くてすみません。

クランク機構(迷路盤を前後左右に傾ける機構)

クランクのパーツ
中の茶色の木とモーターを接続して、上下させます。
茶色の木の上のヒートンに迷路盤の横に打ったくぎを引っかけて固定します。
クランクを配置した時の様子
同じものを2か所に配置しています。
モーターを回転させることによって、クランクが上下します。
モーターの回転運動をクランクにつなげることによって、直線運動(上下運動)させているので、モーターが回転し続け、ギアが180度以上回ると、操作盤とジョイスティックが逆の動きになるので、要注意です。
(タミヤ楽しい工作シリーズNo.110(ギア比 5402:1))
※後で、もうちょっと早く動くようにしてもよかったかなーと思いました。

配線

前後左右の配線
前後左右の動きの配線
妨害装置の配線
妨害装置の配線
シールド・フォトリフレクタの配線
2つつながっているものはフォトリフレクタです。

プログラム

妨害装置のプログラム

#include <Servo.h>
Servo myservo9;
void setup()
{
  myservo9.attach(9);
 }
void loop()
{
  myservo9.write(180);
  delay(300);
  myservo9.write(90);
  delay(2000);
  myservo9.write(180);
  delay(1000);
}

前後左右のプログラム

int val_ud;
int val_lr;
void u() {
  digitalWrite(2, HIGH);
  digitalWrite(4, LOW);
}
void d() {
  digitalWrite(2, LOW);
  digitalWrite(4, HIGH);
}
void r() {
  digitalWrite(7, HIGH);
  digitalWrite(8, LOW);
}
void l() {
  digitalWrite(7, LOW);
  digitalWrite(8, HIGH);
}
void s() {
  digitalWrite(2, LOW);
  digitalWrite(4, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
}
void setup()
{
  pinMode(2, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
}

void loop()
{
  val_ud = analogRead(A4);
  val_lr = analogRead(A5);
  if (val_lr < 300) {
    l();
  } else if (val_lr > 800) {
    r();
  } else if (val_ud < 300) {
    u();
  } else if (val_ud > 800) {
    d();
  } else {
    s();
  }
}

ストップウォッチとLEDが光るプログラム

#include <LiquidCrystal.h>
  LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
  int A0pin = 0;
  int pinLED13 = 13;
  int A1pin = 1;
  int pinLED12 = 12;
  void setup()
  {
   lcd.begin(16, 2);
   lcd.clear();
   pinMode(pinLED12, OUTPUT);
   pinMode(pinLED13, OUTPUT);
   Serial.begin(9600);
   pinMode(8, INPUT);
   digitalWrite(8, HIGH);
   pinMode(9, INPUT);
   digitalWrite(9, HIGH);
   pinMode(10, INPUT);
   digitalWrite(10, HIGH);
 }
 double i = 0;
 double a = millis();
 double c ;
 void loop()
 {
   lcd.clear();
lcd.print("PUSH GREEN START");
   lcd.setCursor(0,1);
   lcd.print("    ENJOY!!");
   photoRefrectora();
   photoRefrectorb();
   delay(100);  
   if (digitalRead(8) == LOW)
   { 
  { lcd.clear();
    a = millis();
    while (digitalRead(9) == HIGH)
    { photoRefrectora();
      photoRefrectorb();
      c = millis();
      i = (c - a) / 1000;
      lcd.print(i);
      lcd.setCursor(10,0);
      lcd.print("Second");
      lcd.setCursor(0,1);
      lcd.print(" DO YOUR BEST !!");
      lcd.setCursor(0,0);
      Serial.println(c);
      Serial.println(a);
      Serial.println(i);
      Serial.println("......");
      delay(100);
    }
    if (digitalRead(9) == LOW)
    { while (digitalRead(8) == HIGH)
      { photoRefrectora();
        photoRefrectorb();
        lcd.setCursor(0, 0);
        lcd.print(i);
        lcd.setCursor(10, 0);
        lcd.print("Second");
        lcd.setCursor(0, 0);
        delay(100);
      }
    }
   }
 }
void photoRefrectora() {
int aval;
aval = analogRead(A0pin) ;   Serial.println(aval) ;      
if (aval < 800) {
digitalWrite(pinLED13,HIGH);   }
else {
digitalWrite(pinLED13, LOW);   }
}
void photoRefrectorb() {
int bval;
bval = analogRead(A1pin) ;   Serial.println(bval) ;
if (bval < 800) {
digitalWrite(pinLED12,HIGH);   }
else {
digitalWrite(pinLED12, LOW);   }
 }
}

材料

arduino
木材

ねじ
LCD(シールド)
フォトリフレクタ
タクトスイッチ
キャスター
タクトスイッチ
ジャンパーコード
フォトリフレクター
ジョイスティック🕹
輪ゴム
ピン📌
モーター
ギアボックス
鉄のねじ棒(シャフト)
鉄球

LEGOTAROのアイコン画像
こんにちは。電子工作が好きな中学生です。分からないことは、CoderDojoのメンターさんやお父さんに協力してもらって、作っています。よろしくお願いします。
ログインしてコメントを投稿する