LEGOTARO が 2021年02月13日11時31分30秒 に編集
初版
タイトルの変更
立体迷路(惑星探検迷路)
タグの変更
秋葉原2021
Arduino
LED
フォトリフレクター
LCD1602Module
メイン画像の変更
本文の変更
## 経緯 夏休みの宿題で作りました。 少し前の作品で、動画を撮り忘れていました・・・。残念です。 分解して、クレーンゲームに作りかえてしまったので、もう現物がありません。 分かりにくいかもしれませんが、がんばって説明してみます! ちょっと家の人に相談したりして書きました。 ## 外観と遊び方 ![完成したところ](https://cdn.discordapp.com/attachments/800373049882574878/808309095882686474/9a768faec0b63913.png) 1. 9v電池を3個Arduinoにさします。(下部の箱に電池ボックスがある) 2. ジョイスティックを上下左右に動かすと迷路盤(上部)が前後左右に傾きます。 3. (時間を計りたい人)は緑のボタンを押します。 4. ボールをスタートからゴールまで転がします。 迷路盤をジョイスティックを操作して、前後左右に傾けることによって、 ボールを転がしてゴールを目指します。 途中で、妨害装置があるので、それをよけるのが、ちょっと難しいです。 5. 時間を計った人は、ゴールと同時に赤いボタンをおします。 ストップウォッチが止まって、何分かかったか分かります。 赤と緑を両方おすとリセットします。 6. 9v電池を抜いて終了です。 ## 構造 ### 上部 ![上から見た写真](https://cdn.discordapp.com/attachments/797838739581042741/808825054741790760/73bd81e27ecbf354.png) コースを決めて、迷路盤をつくります。 迷路盤に宇宙っぽい絵を描きました。だから作品名が惑星探検迷路です。 迷路盤の裏側の中心部にキャスターをつける。 キャスターのコロコロ部分によって、いろんな方向に迷路盤が傾きます。 左上の角がスタートで、左下の角がゴールです。 ![キャスターの写真](https://cdn.discordapp.com/attachments/800371015192281089/809038359598727168/IMG_20210209_124358.jpg) ![キャプションを入力できます](https://camo.elchika.com/00f6ff0412c8b481adbdbffbfbe1830eed4ca25d/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f33616432383564312d356665362d346339312d393937332d6662313165643232343835312f31323935646462392d626339622d343939372d386137632d396263383661386334393635/) ### 仕掛け(2種類) 1.妨害装置 ![上から見た写真](https://cdn.discordapp.com/attachments/800371015192281089/808825662194450432/f0aeb7f539a4907f.jpg) ![下から見た写真](https://cdn.discordapp.com/attachments/800371015192281089/808825664042958868/8c2bba09884988df.png) 後ろに付けたサーボモータにより羽が動いて、ボールを跳ね返したり、違う場所へ誘導する妨害装置です。 タイミングを見計らってボールを通過させないといけないです。 2. LED点灯装置 写真がないのですが、迷路盤の2か所に穴が開いていて、後ろからLEDとフォトリフレクタが差し込んであります。 フォトリフレクタの上をボールが通過すると、感知して、LEDが光るようにしました。 ### ストップウォッチ タクトスイッチとLCDが使ってみたかったので、時間を計ることにしました。 操作盤に LCD、緑スイッチ(スタート)赤(ストップ)ボタンをつけました。 LCDの画面調整用に可変抵抗器をつけました。 配線のときに、線がモーターの近くにあると、時間計測のときに、LCDに宇宙人からのメッセージみたいな文字がいっぱい出てきてびっくりしました。これがノイズなのかなと思いました。 ![ストップウォッチ](https://cdn.discordapp.com/attachments/800373049882574878/809382225799675915/2018123__-_Word_2021_02_11_20_10_11.png) 画素が悪くてすみません。 ### クランク機構(迷路盤を前後左右に傾ける機構) ![クランクのパーツ](https://cdn.discordapp.com/attachments/800371015192281089/808825662856495114/af92a6e941f8e298.png) 中の茶色の木とモーターを接続して、上下させます。 茶色の木の上のヒートンに迷路盤の横に打ったくぎを引っかけて固定します。 ![クランクを配置した時の様子](https://cdn.discordapp.com/attachments/800373049882574878/808302960207331358/07818c6ef6a122cc.png) 同じものを2か所に配置しています。 モーターを回転させることによって、クランクが上下します。 モーターの回転運動をクランクにつなげることによって、直線運動(上下運動)させているので、モーターが回転し続け、ギアが180度以上回ると、操作盤とジョイスティックが逆の動きになるので、要注意です。 (タミヤ楽しい工作シリーズNo.110(ギア比 5402:1)) ※後で、もうちょっと早く動くようにしてもよかったかなーと思いました。 ## 配線 前後左右の配線 ![前後左右の動きの配線](https://cdn.discordapp.com/attachments/800373049882574878/809387985974853652/shuntaromazemotor_.png) 妨害装置の配線 ![妨害装置の配線](https://cdn.discordapp.com/attachments/800373049882574878/809385903117959208/619433cd7a505ce4.jpg) ![シールド・フォトリフレクタの配線](https://cdn.discordapp.com/attachments/798892554799546438/809700732541599794/LCD.png) ## プログラム ### 妨害装置のプログラム ```arduino: #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); } ``` ### 前後左右のプログラム ```arduino: 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が光るプログラム ```arduino: #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(シールド) フォトリフレクタ タクトスイッチ キャスター タクトスイッチ ジャンパーコード フォトリフレクター ジョイスティック🕹 輪ゴム ピン📌 モーター ギアボックス 鉄のねじ棒(シャフト) 鉄球