2022年 SPRESENSE™ 活用コンテスト 」開催中!ローパワーでハイパフォーマンスなエッジコンピューティングを、あなたの手で活用してみませんか?

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

クレーンゲーム

クレーンゲーム

実際の動き

日本語バージョン 英語バージョン
ここに動画が表示されます
ここに動画が表示されます

経緯

コロナ禍でお店に遊びに行きにくいですが、これならお家でクレーンゲームが楽しめます。
夏休みの宿題で作りました。
配線図はFlitzingで初めて描いてみました!!!
ほかの作品の配線図も描きたいのですが、パーツがなくてかけないので残念です。
動画の英語バージョンはCoolest Projectに応募するために、英語を教えてもらいながら作りました。

外観

完成したところ
完成図です。

機構(構造)

1.前後左右の機構

上から見たところ
前後の機構]
下から見たところ
前後左右の機構です。
ラダーチェーンを使うことで前後左右に動かしていますが、夏休みの宿題で学校に持っていきたかったので、コンパクトにしようとしたため、可動域はあまり広くありません。

2.アームを下ろす機構

前から見たところ
タミヤのミニモーターでアームを上下させています。
ミニモーターを左右に動かすためのスライダーはカーテンレールを切って使いました。

3. アームの機構

アームの中身
完成図
3つのサーボモーターを同時に動かすためにPCA9685搭載16チャネル PWM/サーボ ドライバー (I2C接続)を使いました。
ボタンを押してアームの開閉をします。

配線

前後左右の配線 上下の動き・アームの開閉の配線

プログラム

前後左右のプログラム

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()
{
  Serial.begin(9600);
  pinMode(2, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
}
void loop()
{
  val_ud = analogRead(A4);
  val_lr = analogRead(A5);
  Serial.println(val_ud);
  delay(1);
  Serial.println(val_lr);
  delay(10);
  if (val_lr < 300) {
    l();
    delay(1);
  } else if (val_lr > 800) {
    r();
    delay(1);
  } else if (val_ud < 300) {
    u();
    delay(1);

  } else if (val_ud > 800) {
    d();
    delay(1);
  } else {
    s();
    delay(1);
  }
}

上下の動き・アームの開閉

int val_ud;
#include <Wire.h>
#include <PCA9685.h>           

PCA9685 pwm = PCA9685(0x40);    

#define SERVOMIN 120            
#define SERVOMAX 350            

void setup() {
  pwm.begin();                  
  pwm.setPWMFreq(50); 
  Serial.begin(9600);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
}
int n = 90;
int ch0 = 0;
int ch1 = 1;
int ch2 = 2;

void loop() {
  val_ud = analogRead(A4);
  Serial.println(val_ud);
  delay(200);
  if (val_ud < 300) {
    digitalWrite(10, HIGH);
    digitalWrite(11, LOW);
    delay(1);
  } else if (val_ud > 800) {
    digitalWrite(10, LOW);
    digitalWrite(11, HIGH);
    delay(1);
  } else {
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
    delay(1);
  } 
  //      servo_write(ch0,n);
  //  n=n-10;
  //  if(n<=40)n=100;
  //  delay(0);
  if (!digitalRead(7)) {
    catch1();
  }
  if (!digitalRead(8)) {
    serv(90);
  }
}
void servo_write(int ch, int ang) { 
  ang = map(ang, 40, 100, SERVOMIN, SERVOMAX); 
  pwm.setPWM(ch, 0, ang);
  delay(100);
}
void serv(int ang) { 
  ang = map(ang, 40, 100, SERVOMIN, SERVOMAX); 
  pwm.setPWM(0, 0, ang);
  pwm.setPWM(1, 0, ang);
  pwm.setPWM(2, 0, ang);
  delay(100);
}
void catch1() {
  serv(n);
  delay(50);
  serv(85);
  delay(50);
  serv(80);
  delay(50);
  serv(75);
  delay(50);
  serv(70);
  delay(50);
  serv(65);
  delay(50);
  serv(60);
  delay(50);
  serv(55);
  delay(50);
   serv(50);
  delay(50);
  delay(1500);
}
}

今後やっていきたいこと

クレーンゲームにBGMを付けたり、ライトで装飾したりしたいです。
今回は自動で初期位置に戻せなかったので
リミットスイッチを使い、自動で初期位置に戻すことができるようにしたいです。

材料


 制御ボックス(下部)
  1、30×15cm・・・2枚
  2、30.5×15cm・・・2枚
  3、30×30cm・・・3枚
  4、30×30㎝(内側をくり抜く)・・・1枚
  高さ(柱)
  5、2.5×2.5×45cm・・・4本
  制御ボックス(上部)
  6、7×30cm・・・4枚
  Arduino Uno・・・2台
 DCモーター・・・大2台(タミヤ)、ミニ1台(タミヤ)、モータードライバー
 サーボモーター 3台
 モータードライバー(TA77191p)
 ラダーチェーン&スプロケットセット(タミヤ)
 ユニバーサルプレート 
 ブレッドボード
 ジョイスティック
 タクトスイッチ
 ジャンパーコード

遊び方

電源を入れる。(上:1カ所、横:3カ所、9ボルト電池をスナップに付ける。)
 前後左右のジョイスティック(向かって左)🕹でアームの位置を決める。
 赤いボタンでアームを開く。
 上下のジョイスティック(向かって右)🕹でカプセルの上にアームを移動させる。
 青いボタンでカプセルをつかむ。
 上下のジョイスティックで少し上に移動させる。
 前後左右でカプセル取り出し口へ移動し、赤いボタンでカプセルを落とす。

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