Hallo
Ich möchte mit einem Farnsensor TCS230/3200 einen Servo ansteuern, welcher mir die gelesene Farbe auf einer Scheibe anzeigen kann. Leider funktioniert der Servo nur im oberen Void Setup Teil. Dort kann ich die Startposition des Servos bestimmen, was problemlos geht. Im Loop Teil reagiert dann der Servo nicht mehr auf die Programmbefehle.
Ich habe hier im Forum einige Hinweise über solche Probleme gelesen. Leider hat mir das nicht weiter geholfen. Da angeblich libraries von der Servo und dem TCS 230 einen Timer1 Konflikt haben, habe ich versucht den Timer2 für den TCS zu initialisieren. Hat auch nicht funktioniert.
Was funktioniert ist nur die Anzeige der LED, welche mir die Farbe rot oder grün bestätigt.
Den Code abgeschaut habe ich hier:
Kann mir jemand mit seinem Wissen weiter helfen? Danke!
Hier der Code:
// Libraries einbinden
#include <Servo.h>
#include <FreqCount.h>
#include <MD_TCS230.h>
#include <Wire.h>
#define S2_OUT 12
#define S3_OUT 13
#define OE_OUT 8 // LOW = ENABLED
// Out auf Pin 5 und VCC auf 5V
// Servo-Positionen in Grad für Farben,
const int redPos = 160;
const int orangePos = 130;
const int yellowPos = 100;
const int greenPos = 70;
const int bluePos = 30;
const int nonePos = 0; // Kein Objekt erkannt
// Servo-Objekt initialisieren
Servo myservo;
// Color Sensor-Objekt initialisieren
MD_TCS230 CS(S2_OUT, S3_OUT, OE_OUT);
/////////////////////////////////////////////////////////////////////////////////////
// setup() wird einmal beim Start des Arduino ausgeführt
void setup() {
Serial.begin(57600);
CS.begin();
//Der Servo hängt am PWM-Pin 3
myservo.attach(9);
//Servo in Grundstellung fahren
myservo.write(0);
delay(1000);
//LED
pinMode(2, OUTPUT);
digitalWrite(2, LOW);
pinMode(6, OUTPUT);
digitalWrite(6, LOW);
}
//////////////////////////////////////////////////////////////////////////////////////
void TCS ()
{
timer2_init();
}
void timer2_init(void)
{
TCCR2A = 0x00;
TCCR2B = 0x07; //the clock frequency source 1024 points
TCNT2 = 100; //10 ms overflow again
TIMSK2 = 0x01; //allow interrupt
}
///////////////////////////////////////////////////////////////////////////////////////
void readsensor()
{
static bool waiting;
if (!waiting)
{
CS.read();
waiting = true;
}
else
{
if (CS.available())
{
colorData rgb;
CS.getRGB(&rgb);
Serial.print("RGB [");
Serial.print(rgb.value[TCS230_RGB_R]);
Serial.print(",");
Serial.print(rgb.value[TCS230_RGB_G]);
Serial.print(",");
Serial.print(rgb.value[TCS230_RGB_B]);
Serial.println("]");
waiting = false;
}
}
}
///////////////////////////////////////////////////////////////////////////////////
void loop() {
// put your main code here, to run repeatedly:
readsensor ();
colorData rgb;
CS.getRGB(&rgb);
int r = rgb.value[TCS230_RGB_R];
int g = rgb.value[TCS230_RGB_G];
int b = rgb.value[TCS230_RGB_B];
// Versuch der Farbfeststellung anhand der r,g,b-Werte.
if ((r > 78) && (g < 50) && (b < 68)) {
Serial.print("\tROT");
myservo.write(redPos);
digitalWrite(2, HIGH);
}
else if ((r < 77) && (g > 54) && (b < 82)) {
Serial.print("\tGRUEN");
myservo.write(greenPos);
digitalWrite(6, HIGH);
}
else if ((r < 84) && (g < 63) && (b > 90)) {
Serial.print("\tBLAU");
myservo.write(bluePos);
}
// Zeilenwechsel ausgeben
Serial.println("");
// Wartezeit anpassen für serielles Debugging (Geschwindigkeit beim Lesen der Farbe)
delay(200);
//LED Zurücksetzen
digitalWrite(2, LOW);
digitalWrite(6, LOW);
}
Farbsensor_mit_Servo_Original.ino (2.78 KB)