1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

がじぇるねGRAdvent Calendar 2021

Day 9

女子美術大学にロボットアームを使ってもらった結果(2班、3班)

Last updated at Posted at 2021-12-08

がじぇるねと女子美のコラボネタです。
前回からの続きをお楽しみください。

2班:MUS+(ミューズプラス)

2.png

ロボットアームで美術館のイメージアップ計画。
美術館ってちょっとネガティブなイメージがありませんか?前知識がないと観賞の楽しみ方が分からなかったり、堅苦しい感じもします。集客に課題があり、若い世代は伝統的なものに手を出しづらい印象もあります。ターゲットユーザーは20代~30代の若者。ユーザ参加型、明るく楽しい、ポップな印象をもってもらいたい。今までのMuseamにプラスのイメージを「MUS+(ミューズプラス)」で変えたい。これまで音声ガイドや解説ツアーはあった。3軸アームの動きを利用してもっと魅力的に、ユーザーと一体となって観賞できるようにする。美術を好きになってもらいたい、うん、美大生ならではの発想と想いでしたね!

商品としては声や液晶でそれぞれのMUS+の性格を表現することを想定してましたが、プロトタイプでは振向き、おじぎ、おどる、うなずくの4動作のみを実装しました。デモ用に4つのスイッチでそれぞれの動作を行いました。

3班:kushguroom(くすぐるーむ)

3.png

ペルソナは田端楓25歳。大学生一人暮らし。最近の趣味は部屋に花や植物を飾ったり音楽を聴くなど。週末は割と元気でコスメのショッピングや友達と美術館に行ったりするが、ついつい夜更かしして週明けの課題やアルバイトに疲れる日々を過ごしている。彼女は一人暮らしを寂しいと感じており、癒しが欲しい、帰っても部屋は暗い。そういったちょっとした不安を癒しに変えるプロダクトとして「kushguroom」を提案する。くすぐる、マッシュルームを掛け合わせた言葉。ロボットアームを初めて見たとき、思ったより小さく、ぐねぐね動くのがくすぐられているときの動作に似ていた。くすぐったら反応してくれるものがあったら、癒されると感じた。おしゃれなものを好むペルソナに「壁にかけたくなるインテリア」「触りたくなるキノコ」を掛け合わせたものを考えた。インテリアとして馴染む大人っぽさ、媚びない存在感、シュールさ、動いた時のダイナミックさ、こういった要素として様々な案からキノコを選択した。
4キャラのキノコ。明るく元気な男の子のエノキダケ、ツンデレで気品のある女性アンズダケ、親切で信頼できる800歳のおばあちゃんベニテングダケ、恥ずかしがりやの10歳女の子ササクレヒトヨタケ。

壁から生えているインテリアきのこ、実に斬新ですね!「くすぐると動く」というのは導電糸を使いましたが、糸が短い内はよかったのですが、長くなると感知しにくくなり、最終的にエノキダケにぐるぐる巻いた状態ではきちんと動きませんでした。3班の皆様にはご苦労おかけしました、すみません!

コード(2班)

#include <ICS.h>

#define KRS_MIN 3500
#define KRS_MAX 11500
#define KRS_ORG 7500
#define KRS_FREE 0
#define SERVO_MIN -135
#define SERVO_MAX 135

IcsController ICS(Serial1);
IcsServo servo[3];

void krs_setfree(IcsServo* servo){
  servo->setPosition(KRS_FREE);
}

int krs_getposition(IcsServo* servo){
  return map(servo->getPosition(), KRS_MIN, KRS_MAX, SERVO_MIN, SERVO_MAX);
}


void krs_setposition(IcsServo* servo, float radian){
  int angle = radian * 180 / PI;
  int pos = map(angle, SERVO_MIN, SERVO_MAX, KRS_MIN, KRS_MAX);
  if(pos > KRS_MIN && pos < KRS_MAX){
    servo->setPosition(pos);
    delay(1);
  }
}

void krs_setposition_angle(IcsServo* servo, int angle){
  int pos = map(angle, SERVO_MIN, SERVO_MAX, KRS_MIN, KRS_MAX);
  if(pos > KRS_MIN && pos < KRS_MAX){
    servo->setPosition(pos);
    delay(1);
  }
}

float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
{
  return (float)(x - in_min) * (out_max - out_min) / (float)(in_max - in_min) + out_min;
}

void setup() {
  Serial.begin(9600);
  ICS.begin();
  for(int i = 0; i < 3; i++){
    servo[i].attach(ICS, i+1); // id1 to id3
    servo[i].setStretch(100);
    delay(1);
    servo[i].setSpeed(50);
    delay(1);
    krs_setposition(&servo[i], 0);
    delay(1);
  }
}

void loop() {
  static unsigned long time = millis();
  int pressure = analogRead(10);
  Serial.println(pressure);
  if( 1990 < pressure && pressure < 2010){
    krs_setposition_angle(&servo[0], 90);
    krs_setposition_angle(&servo[2], -45);
    delay(2000);
    krs_setposition_angle(&servo[0], 0);
    krs_setposition_angle(&servo[2], 0);
  } 
  else if(2100 < pressure && pressure < 2150){
    krs_setposition_angle(&servo[1], 45);
    delay(1000);
    krs_setposition_angle(&servo[1], 0);
  } 
  else if(2230 < pressure && pressure < 2260){
    for(int j=0; j<20; j++){
      for(int i = 0; i < 3; i++){
        int angle = random(-45, 45);
        float radian = angle * PI / 180;
        krs_setposition(&servo[i], radian);
        delay(1);
      }
      delay(100);
    }
    for(int i = 0; i < 3; i++){
      krs_setposition(&servo[i], 0);
      delay(1);
    }
  } 
  else if(2420 < pressure && pressure < 2480){
    krs_setposition_angle(&servo[2], 60);
    delay(1000);
    krs_setposition_angle(&servo[2], 0);
  }
  delay(100);
}





コード(3班)

#include <ICS.h>

#define KRS_MIN 3500
#define KRS_MAX 11500
#define KRS_ORG 7500
#define KRS_FREE 0
#define SERVO_MIN -135
#define SERVO_MAX 135

#define DEF 150
IcsController ICS(Serial1);
IcsServo servo[3];

void krs_setfree(IcsServo* servo){
  servo->setPosition(KRS_FREE);
}

int krs_getposition(IcsServo* servo){
  return map(servo->getPosition(), KRS_MIN, KRS_MAX, SERVO_MIN, SERVO_MAX);
}


void krs_setposition(IcsServo* servo, float radian){
  int angle = radian * 180 / PI;
  int pos = map(angle, SERVO_MIN, SERVO_MAX, KRS_MIN, KRS_MAX);
  if(pos > KRS_MIN && pos < KRS_MAX){
    servo->setPosition(pos);
    delay(1);
  }
}

void krs_setposition_angle(IcsServo* servo, int angle){
  int pos = map(angle, SERVO_MIN, SERVO_MAX, KRS_MIN, KRS_MAX);
  if(pos > KRS_MIN && pos < KRS_MAX){
    servo->setPosition(pos);
    delay(1);
  }
}

float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
{
  return (float)(x - in_min) * (out_max - out_min) / (float)(in_max - in_min) + out_min;
}

void setup() {
  Serial.begin(9600);
  analogRead(10); // dummy
  ICS.begin();
  for(int i = 0; i < 3; i++){
    servo[i].attach(ICS, i+1); // id1 to id3
    servo[i].setStretch(50);
    delay(1);
    servo[i].setSpeed(50);
    delay(1);
  }
  krs_setposition(&servo[0], 0);
  delay(1);
  krs_setposition(&servo[1], 50);
  delay(1);
  krs_setposition(&servo[2], 0);
  delay(100);
}

void loop() {
  static int previous = 0;
  static bool touch = false;
  
  int temp = 0;
  for(int i = 0; i < 10; i++){
    temp += analogRead(10);
    delay(1);
  }
  int sensor = temp/10;
  Serial.println(sensor);
  
  if(previous == 0){
    previous = sensor;
  }
  if(abs(previous - sensor) > DEF || sensor > 4000){
    int rand = random(30, 120);
    for(int i = 0; i < 3; i++){
      servo[i].setSpeed(rand);
      delay(1);
    }
    int setting2 = map(rand, 30, 120, 60, 30);
    int setting1 = map(rand, 30, 120, 30, 10);
    int setting0 = map(rand, 30, 120, 60, 30);
    for(int i = 0; i < 360; i+=5){
      krs_setposition_angle(&servo[2], mapfloat(sin(i * PI / 180), -1, 1, -1*setting2, setting2));
      krs_setposition_angle(&servo[1], mapfloat(cos(i * PI / 180), -1, 1, -1*setting1, setting1)+50);
      krs_setposition_angle(&servo[0], mapfloat(sin(i * PI / 180), -1, 1, -1*setting0, setting0));
      delay(10);
    }
  }
  previous = sensor;
  

#if 0
  static unsigned long start = millis();
  int temp = 0;
  for(int i = 0; i < 100; i++){
    temp += analogRead(10);
  }
  int th = temp/100;
  int temp_s = analogRead(10);
  int sensor = abs(TH - temp_s);
  Serial.println(sensor);
  Serial.println(temp_s);
  if(sensor > DEF){
    int rand = random(30, 120);
    for(int i = 0; i < 3; i++){
      servo[i].setSpeed(rand);
      delay(1);
    }
    int setting2 = map(rand, 30, 120, 60, 30);
    int setting1 = map(rand, 30, 120, 30, 10);
    int setting0 = map(rand, 30, 120, 60, 30);
    for(int i = 0; i < 360; i+=5){
      krs_setposition_angle(&servo[2], mapfloat(sin(i * PI / 180), -1, 1, -1*setting2, setting2));
      krs_setposition_angle(&servo[1], mapfloat(sin(i * PI / 180), -1, 1, -1*setting1, setting1));
      krs_setposition_angle(&servo[0], mapfloat(cos(i * PI / 180), -1, 1, -1*setting0, setting0));
      delay(10);
    }
  }
#endif
}








1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?