INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Brauche Hilfe bei Sainsmart TC3200 Farbsensor
03.06.2015, 13:53
Beitrag #1
Brauche Hilfe bei Sainsmart TC3200 Farbsensor
Hallo alle zusammen,
bin neu hier und hoffe diesen Thread an richtiger Stelle im Forum zu posten.
Ich beschäftige mich im Rahmen eines Schulprojektes jetzt einige Monate mit dem Arduino.

Ein Teil unseres Projektes (Zauberwürfel-Löser) besteht darin, mit einem Farbsensor die Seiten des Zauberwürfels zu scannen.
Dazu habe ich mir einen Sainsmart TCS3200 Farbsensor besorgt
Datasheet: http://www.mouser.com/catalog/specsheets...00-E11.pdf

Ein Besipielcode war in der amazon-Artikelbeschreibung enthalten:


[i]int s0=3,s1=4,s2=5,s3=6;
int out=2;
int flag=0;
byte counter=0;
byte countR=0,countG=0,countB=0;
void setup()
{
Serial.begin(115200);
pinMode(s0,OUTPUT);
pinMode(s1,OUTPUT);
pinMode(s2,OUTPUT);
pinMode(s3,OUTPUT);

}
void TCS()
{
flag=0;
digitalWrite(s1,HIGH);
digitalWrite(s0,HIGH);
digitalWrite(s2,LOW);
digitalWrite(s3,LOW);
attachInterrupt(0, ISR_INTO, CHANGE);
timer0_init();


void ISR_INTO()
{
counter++;
}
void timer0_init(void)
{
TCCR2A=0x00;
TCCR2B=0x07; //the clock frequency source 1024 points
TCNT2= 100; //10 ms overflow again
TIMSK2 = 0x01; //allow interrupt
}
int i=0;
ISR(TIMER2_OVF_vect)//the timer 2, 10ms interrupt overflow again. Internal overflow interrupt executive function
{
TCNT2=100;
flag++;
if(flag==1)
{
countR=counter;
Serial.print("red=");
Serial.println(countR,DEC);
digitalWrite(s2,HIGH);
digitalWrite(s3,HIGH);
}
else if(flag==2)
{
countG=counter;
Serial.print("green=");
Serial.println(countG,DEC);
digitalWrite(s2,LOW);
digitalWrite(s3,HIGH);
}
else if(flag==3)
{
countB=counter;
Serial.print("blue=");
Serial.println(countB,DEC);
Serial.println("\n");
digitalWrite(s2,LOW);
digitalWrite(s3,LOW);

}
else if(flag==4)
{
flag=0;
}
counter=0;
}
void loop()
{
TCS();
while(1);
}
Also habe ich den Sensor erstmal mit dem Arduino verbunden und den Code hochgeladen.
Funktioniert gut, allerdings nicht optimal für mein ProjektConfused
Die Scan-Funktion ( TCS() ) wird ununterbrochen durchgeführt, ich müsste sie aber immer unterbechen, um den Würfel weiterzudrehen zwischen den einzelnen Scan-Schritten.
d.h. Scannen -> nächste Farbfläche wird unter den Sensor bewegt -> Scannen.....usw.

Also müsste ich doch entweder den "flag"-counter bei 4 stoppen, oder die Funktion irgendwie in der void loop abbrechen?!
Sitze daran jetzt schon seit gestern und komme nicht wirklich weiterHuh
Wäre super, wenn mir jemand erklären könnte, wie das gehtBlush
Danke schonmal im vorrausWink
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.06.2015, 14:13
Beitrag #2
RE: Brauche Hilfe bei Sainsmart TC3200 Farbsensor
Hi,
ich glaube, dass das TCS() einfach ans Ende von setup() gehört und statt dem while(1) kannst Du dann Deinen Kram einfügen. Der aktuelle Farbwert steht wahrscheinlich immer in countR/G/B. Ansonsten würde ich die Serial-Aufrufe aus der Interruptroutine nehmen.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.06.2015, 15:03
Beitrag #3
RE: Brauche Hilfe bei Sainsmart TC3200 Farbsensor
(03.06.2015 14:13)Thorsten Pferdekämper schrieb:  Hi,
ich glaube, dass das TCS() einfach ans Ende von setup() gehört und statt dem while(1) kannst Du dann Deinen Kram einfügen. Der aktuelle Farbwert steht wahrscheinlich immer in countR/G/B. Ansonsten würde ich die Serial-Aufrufe aus der Interruptroutine nehmen.
Gruß,
Thorsten

Hallo Thorsten,
danke für die schnelle AntwortWink
Die Serial-Aufrufe aus der Interruptroutine nehmen würde heißen, dass ich Serial.print("farbe=");
Serial.println(countx,DEC);
aus der Interruptroutine lösche und sie in die Loop einfüge, wenn ichs sie brauche oder?

Das Problem ist leider, dass ich diese Werte am Ende nicht im Serial Monitor haben sollte.
Der Zauberwürfel hat 6 Farben, deren RGB-Zusmmenstellungen ich vorher in Variablen abspeichern würde.
Es würde am Ende heißen:
if( countR= Wert1 AND countG= Wert2 AND countB=Wert3)
{Farbe= Weiß/rot/grün/orange/gelb/blau}

Die TCS-Funktion sollte also im Optimalfall nur einmal durchlaufen pro gescannter Fläche, dann wird die nächste Fläche unter den Sensor bewegt.... so würde sie ja dauerhaft laufen oder?Huh

Sollte also irgendwie so gehen:
Scannen
Farbe speichern
Servo ansteuern-> nächste Fläche
Scannen
Farbe speichern
Servo ansteuern ->nächste Fläche
...

oder so:

TCS läuft dauerhaft durch
Servo bewegen
if( servo an position x)
{ Wert auslesen}
Servo bewegen
.....

Sorry bin gerade etwas verwirrtConfusedBig Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.06.2015, 15:13
Beitrag #4
RE: Brauche Hilfe bei Sainsmart TC3200 Farbsensor
Hi,
TCS() initialisiert nur. Deshalb gehört das auch in setup(). Da läuft nichts dauerhaft. Das Scannen wird durch die Interrupt-Routinen gemacht. Die sorgen dafür, dass in den Variablen countR/G/B ständig die entsprechenden Werte stehen. D.h. nach dem Bewegen des Servos musst Du einfach nur diese Variablen abfragen.
Den Serial-Kram würde ich auch in loop() machen, falls benötigt.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.06.2015, 15:35
Beitrag #5
RE: Brauche Hilfe bei Sainsmart TC3200 Farbsensor
Achso dann habe ich davor dieses ganze Interrupt-System nicht so richtig verstanden, Danke!
Habe den Code nun überarbeitet

int s0=3,s1=4,s2=5,s3=6;
int out=2;
int flag=0;
byte counter=0;
byte countR=0,countG=0,countB=0;
void setup()
{
Serial.begin(115200);
pinMode(s0,OUTPUT);
pinMode(s1,OUTPUT);
pinMode(s2,OUTPUT);
pinMode(s3,OUTPUT);

}
void TCS()
{
flag=0;
digitalWrite(s1,HIGH);
digitalWrite(s0,HIGH);
digitalWrite(s2,LOW);
digitalWrite(s3,LOW);
attachInterrupt(0, ISR_INTO, CHANGE);
timer0_init();

}
void ISR_INTO()
{
counter++;
}
void timer0_init(void)
{
TCCR2A=0x00;
TCCR2B=0x07; //the clock frequency source 1024 points
TCNT2= 100; //10 ms overflow again
TIMSK2 = 0x01; //allow interrupt
}
int i=0;
ISR(TIMER2_OVF_vect)//the timer 2, 10ms interrupt overflow again. Internal overflow interrupt executive function
{
TCNT2=100;
flag++;
if(flag==1)
{
countR=counter;
digitalWrite(s2,HIGH); //Grünfilter
digitalWrite(s3,HIGH);
}
else if(flag==2)
{
countG=counter;
digitalWrite(s2,LOW); //Blaufilter
digitalWrite(s3,HIGH);
}
else if(flag==3)
{
countB=counter;
digitalWrite(s2,LOW); //Rotfilter
digitalWrite(s3,LOW);

}
else if(flag==4)
{
flag=0;
}
counter=0;
TCS();
}
void loop()
{
delay(1000);
Serial.print("red=");
Serial.println(countR,DEC);
Serial.print("green=");
Serial.println(countG,DEC);
Serial.print("blue=");
Serial.println(countB,DEC);
Serial.println("\n");

}

Testweise lasse ich mir die Werte im Monitor ausgeben. Allerdings sind die Werte nun immer 0 Confused
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.06.2015, 15:45
Beitrag #6
RE: Brauche Hilfe bei Sainsmart TC3200 Farbsensor
Du sollst ja auch den Aufruf von TCS in die Funktion setup packen und nicht in den Handler für den Timer-Interrupt.
Die nächste Antwort von mir gibt's nur, wenn Du zumindest versuchst Code-Tags zu verwenden und zusätzlich den Code menschenwürdig formatierst.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.06.2015, 16:44 (Dieser Beitrag wurde zuletzt bearbeitet: 03.06.2015 17:00 von Leberwurst.)
Beitrag #7
RE: Brauche Hilfe bei Sainsmart TC3200 Farbsensor
Sorry, hatte den Code nur per Copy&Paste eingefügt und nicht mehr verbessert, da hat es die Formatierung gelöscht.Angel
War mit der Formatierung in Foren nicht so ganz vertraut

Ich hab wohl auch übersehen, dass die Klammer das setup ja vor den Funktionen schließt und diese nichtmehr zum setup gehören...

Hier der verbesserte Code:

Zitat:int s0=3,s1=4,s2=5,s3=6;
int out=2;
int flag=0;
byte counter=0;
byte countR=0,countG=0,countB=0;
  void setup()
    {
      Serial.begin(115200);
      pinMode(s0,OUTPUT);
      pinMode(s1,OUTPUT);
      pinMode(s2,OUTPUT);
      pinMode(s3,OUTPUT);
      TCS();
   }
  void TCS()
   {
      flag=0;
      digitalWrite(s1,HIGH);
      digitalWrite(s0,HIGH);
      digitalWrite(s2,LOW);
      digitalWrite(s3,LOW);
      attachInterrupt(0, ISR_INTO, CHANGE);
      timer0_init();

   }
  void ISR_INTO()
   {
      counter++;
   }
  void timer0_init(void)
   { 
      TCCR2A=0x00;
      TCCR2B=0x07; //the clock frequency source 1024 points
      TCNT2= 100; //10 ms overflow again
      TIMSK2 = 0x01; //allow interrupt
   }
  int i=0;
  ISR(TIMER2_OVF_vect)//the timer 2, 10ms interrupt overflow again. Internal overflow interrupt executive function
    {
      TCNT2=100;
      flag++;
      if(flag==1)
       {
          countR=counter;
          digitalWrite(s2,HIGH); //Grünfilter
          digitalWrite(s3,HIGH);
       }
      else if(flag==2)
       {
          countG=counter;
          digitalWrite(s2,LOW); //Blaufilter
          digitalWrite(s3,HIGH);
       }
      else if(flag==3)
       {
          countB=counter;
          digitalWrite(s2,LOW); //Rotfilter
          digitalWrite(s3,LOW);

       }
          else if(flag==4)
       {
          flag=0;
       }
             counter=0;

    }
   void loop()
      {
          delay(1000);
          Serial.print("red=");
          Serial.println(countR,DEC);
          Serial.print("green=");
          Serial.println(countG,DEC);
          Serial.print("blue=");
          Serial.println(countB,DEC);
          Serial.println("\n");

      }

Es werden nun Werte ausgeliefert. Ich denke, die könnten auch stimmen.
Was ist mit Code-Tags genau gemeint?Huh

Müsste aber so stimmen oder?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.06.2015, 18:34
Beitrag #8
RE: Brauche Hilfe bei Sainsmart TC3200 Farbsensor
(03.06.2015 16:44)Leberwurst schrieb:  Was ist mit Code-Tags genau gemeint?Huh
Du hast das Coding mit quote-Tags eingeschlossen. Nimm nächstes Mal einfach "code" statt "quote".

Zitat:Müsste aber so stimmen oder?
Ja.

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Brauche einen Sketch zum Testen HDT 12 268 22.06.2017 07:37
Letzter Beitrag: HDT
  Bitte um Hilfe Arduino Nano-MAX7219-PIR_Sensor Opa_Klaus 35 1.122 20.05.2017 21:11
Letzter Beitrag: Opa_Klaus
  Brauche Hilfe für meine Abfüllanlage/ millis() Slash96 8 402 10.05.2017 21:04
Letzter Beitrag: MicroBahner
Question Problem beim Hochladen auf AtTiny45. Hilfe -.- Jonas Lindenblatt 17 924 16.04.2017 12:58
Letzter Beitrag: Jonas Lindenblatt
  Brauche Zeitverzögerung delay/millis/timer? Spiecky 17 721 15.04.2017 09:41
Letzter Beitrag: hotsystems
  Zeitschaltuhr Hilfe für RTC Anfänger 4Jordy 4 286 24.03.2017 15:23
Letzter Beitrag: MicroBahner
  Hilfe bei Taster huber5093 11 483 14.02.2017 19:26
Letzter Beitrag: Tommy56
  Sainsmart 3,2" TFT Anzeigeproblem Badger1875 19 872 10.02.2017 19:05
Letzter Beitrag: rkuehle
  Hilfe: IR Remote Steuerung, MSGEQ7 + RGB-LED Streifen dastob 1 367 14.10.2016 21:40
Letzter Beitrag: hotsystems
Sad Ich brauche Hilfe Prosac 4 547 09.10.2016 18:39
Letzter Beitrag: Prosac

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste