Arduinoカラーソーターの作り方:TCS3200とサーボを使ったシンプルガイド
この記事では、Arduinoカラーソーターの作り方を紹介します。以下の動画を見るか、記事を読み進めてください。 このArduinoプロジェクトに必要なのは、カラーセンサー(TCS3200)とホビーサーボモーター2つだけです。シンプルながらも作って楽しいプロジェクトです。まず、Solidworks 3Dモデリングソフトを使ってカラーソーターを設計しました。その動作原理は以下の通りです: ここから3Dモデルや、このArduinoプロジェクトの構築に必要な全寸法入りの図面をダウンロードできます。 この3DモデルはThangsで見つけてダウンロードしたり、ブラウザで探索したりできます。 Thangsでアセンブリ3Dモデルをダウンロード。 以下の図面は、ケースの全パーツをレーザーカットするために使用できます: このプロジェクトには3mm厚のファイバーボードを使用しました。図面に従ってファイバーボードにパーツを書き写し、小型の手ノコで全パーツを切り出しました。 全パーツが揃ったら組み立てを開始します。まず外側のパーツをグルーガンで接着します。 次に、万能接着剤で2つのサーボモーターをそれぞれのプラットフォームに固定し、アセンブリに取り付けます。 さらに接着剤で、ガイドレールを下部サーボモーターに、サポートと上部サーボモーター用プラットフォームを取り付けます。 次に、スイッチとパワージャックを取り付けて5VアダプターでArduinoに電源供給し、3番目のプラットフォームにカラーセンサーを取り付けます。 以下の回路図に従ってコンポーネントを接続します。 このArduinoプロジェクトに必要なコンポーネントは以下のリンクから入手できます: この時点で、まずArduinoをプログラミングしてから組み立てを完了します。Arduinoコードは以下の通りです: コードの説明: 「Servo.h」ライブラリをインクルードし、カラーセンサーの接続ピンを定義、サーボオブジェクトを作成し、プログラムに必要な変数を宣言します。setupセクションではピンを入出力として定義し、カラーセンサーの周波数スケーリングを設定、サーボピンを定義し、シリアル通信を開始してカラー読み取り結果をシリアルモニターに表示します。 loopセクションでは、プログラムが上部サーボモーターをスキットルチャージャーの位置に移動させることから始まります。この115という値は私のパーツとサーボモーターに適したものなので、ご自身の構築に合わせてこの値や続くサーボモーターの値を調整してください。 次に「for」ループを使ってサーボを回転させ、スキットルをカラーセンサーの位置まで運びます。「for」ループを使うことで、ループ内のdelay時間を変更して回転速度を制御できます。 さらに0.5秒遅延させた後、自作関数readColor()を使ってスキットルの色を読み取ります。こちらがカスタム関数のコードです。カラーセンサーの4つの制御ピンと周波数出力ピンを使ってスキットルの色を読み取ります。センサーは各スキットルについて赤、緑、青の3つの異なる値を読み取り、これらの値に基づいて実際の色を判定します。TCS3200カラーセンサーの詳細な仕組みについては、以前の詳細チュートリアルをご覧ください。 こちらが各スキットルについてセンサーから得られたRGB値です。センサーが常に正確とは限らないため、これらの値は変動する可能性があります。そのため、「if」文を使って特定の色のテスト値に対して約±5の誤差を許容しています。例えば赤いスキットルの場合、最初の「if」文が真となり、変数「color」に値1が入ります。これがreadColor()カスタム関数の役割です。その後、「switch-case」文を使って下部サーボを特定の位置に回転させます。最後に上部サーボモーターをさらに回転させてスキットルをガイドレールに落とし、再び初期位置に戻してプロセスを繰り返します。 コードをアップロードした後、グルーガンでArduinoボードを固定します。 次に、透明なペットボトルでチャージャーを作り、上部パーツと一緒にグルーガンでアセンブリに接着してプロジェクトを完成させます。 ご質問があれば、下のコメント欄でお気軽にお尋ねください。設計


Arduinoカラーソーターの組み立て





Arduinoカラーソーターのソースコード
/* Arduino Project - Color Sorting Machine
* by Dejan Nedelkovski, www.HowToMechatronics.com
*/
#include <Servo.h>
#define S0 2
#define S1 3
#define S2 4
#define S3 5
#define sensorOut 6
Servo topServo;
Servo bottomServo;
int frequency = 0;
int color=0;
void setup() {
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);
// 周波数スケーリングを20%に設定
digitalWrite(S0, HIGH);
digitalWrite(S1, LOW);
topServo.attach(7);
bottomServo.attach(8);
Serial.begin(9600);
}
void loop() {
topServo.write(115);
delay(500);
for(int i = 115; i > 65; i--) {
topServo.write(i);
delay(2);
}
delay(500);
color = readColor();
delay(10);
switch (color) {
case 1: bottomServo.write(50); break;
case 2: bottomServo.write(75); break;
case 3: bottomServo.write(100); break;
case 4: bottomServo.write(125); break;
case 5: bottomServo.write(150); break;
case 6: bottomServo.write(175); break;
case 0: break;
}
delay(300);
for(int i = 65; i > 29; i--) {
topServo.write(i);
delay(2);
}
delay(200);
for(int i = 29; i < 115; i++) {
topServo.write(i);
delay(2);
}
color=0;
}
// カスタム関数 - readColor()
int readColor() {
// 赤フィルターのフォトダイオードを読み取り設定
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
// 出力周波数を読み取り
frequency = pulseIn(sensorOut, LOW);
int R = frequency;
// シリアルモニターに出力
Serial.print("R= ");//名前を出力
Serial.print(frequency);//赤色周波数を出力
Serial.print(" ");
delay(50);
// 緑フィルターのフォトダイオードを読み取り設定
digitalWrite(S2, HIGH);
digitalWrite(S3, HIGH);
// 出力周波数を読み取り
frequency = pulseIn(sensorOut, LOW);
int G = frequency;
// シリアルモニターに出力
Serial.print("G= ");//名前を出力
Serial.print(frequency);//赤色周波数を出力
Serial.print(" ");
delay(50);
// 青フィルターのフォトダイオードを読み取り設定
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
// 出力周波数を読み取り
frequency = pulseIn(sensorOut, LOW);
int B = frequency;
// シリアルモニターに出力
Serial.print("B= ");//名前を出力
Serial.print(frequency);//赤色周波数を出力
Serial.println(" ");
delay(50);
if(R<45 & R>32 & G<65 & G>55){ color = 1; // 赤 }
if(G<55 & G>43 & B<47 &B>35){ color = 2; // オレンジ }
if(R<53 & R>40 & G<53 & G>40){ color = 3; // 緑 }
if(R<38 & R>24 & G<44 & G>30){ color = 4; // 黄 }
if(R<56 & R>46 & G<65 & G>55){ color = 5; // 茶 }
if (G<58 & G>45 & B<40 &B>26){ color = 6; // 青 }
return color;
}
設計の仕上げ


製造プロセス
- Arduinoで作るモニター用Ambilightシステム:没入感アップの自作ガイド
- Arduino UNOとOLEDディスプレイでクラシックPongゲームを自作:ステップバイステップチュートリアル
- Arduinoオーディオ周波数検出器 – 高感度サウンドモジュールで最大音量ピークの周波数を測定
- Arduinoで作る自作デジタルペット「Tamaguino」─ 3Dプリンター製ケース付き完全ガイド
- スマートワイヤレス照明スイッチコントローラー:Arduinoで物理スイッチを遠隔操作
- Arduino三目並べ:MAX7219 LEDマトリクスと段ボールケースで自作
- Arduino Nanoで作るスマートな動体検知水鉄砲
- SparkFun 7セグメントディスプレイで作る信頼性の高いArduinoカウントダウンタイマー
- Arduino RGB LEDカラーミキサー:初心者向けDIYプロジェクト
- Arduino向日葵:太陽を追尾する電子ヒマワリの製作
- Arduinoで自作RCポルシェカー:ステップバイステップガイド