皆さんは、普段色付きチョコレートを色分けしたくなることはありませんか?(そんなことあるわけないか(笑))

今回は、ふとした思い付きから自動で色付きチョコレートを色分けするマシーンを作ってみました。

使用したものは以下です。

  • 色付きチョコレート(明治マーブルチョコレートを使いました。)
  • ELEGOO uno(aruduino unoの互換品)
  • サーボモーター×2
  • カラーセンサー(TCS34725というやつです。)
色分けしたチョコレート(7色あります)

今回考えた処理の流れは、以下です。

  1. チョコレートのセッティング
  2. 回転台を回転し、カラーセンサーのもとに
  3. カラーセンサーでチョコレートの色を識別
  4. 識別した色情報をもとに滑り台を回転
  5. 回転台を回転

まず、画像のペットボトル部分にチョコレートを入れると、下の回転台にセッティングされます。下の台が回転するようになっており、チョコレートの設置場所を決める役割を果たします。次に、回転台上でカラーセンサーをの真下にチョコレートを配置し、色を判別します。そして、その判別した色情報に対応した位置に滑り台を回転させます。最後に回転台を回転させ、滑り台にチョコレートを動かします。

実際に作ったものは下画像になります。

作ったチョコレート色分けマシーン

試してみましたが、数回に一回は色の判別に失敗していました。これは、周囲の光の状況で、カラーセンサーが認識する色が変わってしまうことが原因のようです。

特にピンクと赤と茶色とを見間違えやすく、コード上の閾値を微調整することで失敗回数を減らすことはできましたが、完全に失敗をなくすことはできませんでした。

下の画像は色分けが上手くできたときのものです。

作ったチョコレート色分けした結果

見ていて面白く、原理がシンプルで簡単に作れますし、段ボールなどでも作れますので、小学生夏休みの自由研究にもおすすめです。

チョコレートを色分けしている様子は、こちらの動画にまとめましたので、もし興味があればご覧ください。

今回使用したコードはこちら↓


#include <VarSpeedServo.h>
#include <Wire.h>
#include "Adafruit_TCS34725.h"
//#include <Servo.h>      // Include Servo library
 
 VarSpeedServo myservo;          
 const int SV_PIN = 7;   // Set the servo motor to digital pin 7

 VarSpeedServo myservo2;          
 const int SV_PIN2 = 6;   // Set the servo motor to digital pin 6

 Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_1X);

 void setup(){
 
  myservo.attach(SV_PIN); 
  myservo2.attach(SV_PIN2);
  
  Serial.begin(9600);
 
  if (tcs.begin()) {
  Serial.println("Found sensor");
  }
  else {
  Serial.println("No TCS34725 found ... check your connections");
  while (1);
  }
}

 
 void loop(){
  rot_servo(180);
  delay(1000);
  rot_servo(90);
  
//  rot_servo(180);
rot_servo2(90);

//カラーセンサーで色を認識
  int cnum[3],R,G,B;
  color_detector(cnum);
  R = cnum[0]; 
  G = cnum[1]; 
  B = cnum[2]; 

  color_judge(R,G,B);
  if(color_judge(R,G,B)==0){
//  rot_servo2(90);
  rot_servo(0);
  }
  }

  
  //もし赤だったら
  //回転滑り台を回転
//RGBの値と色を定義
//0<R<64,0<G<64,0<B<64 brown
//65<R<125,0<G<64,0<B<64red
//126<R<164,70<G<89,50<B<80 pink
//126<R<192,40<G<89,0<B<50 orange
//165<R<255,9<G<170,0<B<80 yellow
//65<R<119,65<G<192,0<B<64 green
//80<R<140,80<G<140,65<B<192 blue


//カラーセンサーの値から色を識別※光の具合で色の認識され方が変わるため、調整が必要
int color_judge(int R,int G,int B){
  //(0,G,B)
  if(0<=R && R<=64 && 0<=G && G<=64 && 0<=B && B<=64){
    Serial.print("brown");
    rot_servo2(12);
    return 0;
    }
    else if(65<=R && R<=125 && 0<=G && G<=64 && 0<=B && B<=64){
    Serial.print("red");
    rot_servo2(36);
    return 0;
    }
    else if(126<=R && R<=164 && 70<=G && G<=89 && 51<=B && B<=80){
    Serial.print("pink");
    rot_servo2(60);
    return 0;
    }
    else if(126<=R && R<=192 && 40<=G && G<=89 && 0<=B && B<=50){
    Serial.print("orange");
    rot_servo2(84);
    return 0;
    }
    else if(165<=R && R<=255 && 90<=G && G<=170 && 0<=B && B<=80){
    Serial.print("yellow");
    rot_servo2(108);
    return 0;
    }
    else if(65<=R && R<=119 && 65<=G && G<=192 && 0<=B && B<=64){
    Serial.print("green");
    rot_servo2(132);
    return 0;
    }
    else if(80<=R && R<=140 && 80<=G && G<=140 && 65<=B && B<=192){
    Serial.print("blue");
    rot_servo2(156);
    return 0;
    }
    else {
    Serial.print("other");
    rot_servo2(175);
    return 0;
    }
  
}
//サーボモーターの回転を定義
void rot_servo(int deg){

   myservo.write(deg);    // Move the servo motor to the 0 degree position
   delay(1000);

//   myservo.write(deg,90,true);    // Move the servo motor to the 0 degree position
//   delay(1000);

}

void rot_servo2(int deg){

   myservo2.write(deg);    // Move the servo motor to the 0 degree position
   delay(1000);
}

//カラーセンサーによる色の取得
void color_detector(int list[3]){

uint16_t r, g, b, c, colorTemp, lux;
 
tcs.getRawData(&r, &g, &b, &c);
colorTemp = tcs.calculateColorTemperature(r, g, b);
lux = tcs.calculateLux(r, g, b);
 
Serial.print("Color Temp: "); Serial.print(colorTemp, DEC); Serial.print(" K - ");
Serial.print("Lux: "); Serial.print(lux, DEC); Serial.print(" - ");
Serial.print("R: "); Serial.print(r, DEC); Serial.print(" ");
Serial.print("G: "); Serial.print(g, DEC); Serial.print(" ");
Serial.print("B: "); Serial.print(b, DEC); Serial.print(" ");
Serial.print("C: "); Serial.print(c, DEC); Serial.print(" ");
Serial.println(" ");

list[0] = r;
list[1] = g;
list[2] = b;

}