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
  Hilfe: IR Remote Steuerung, MSGEQ7 + RGB-LED Streifen dastob 1 123 14.10.2016 21:40
Letzter Beitrag: hotsystems
Sad Ich brauche Hilfe Prosac 4 235 09.10.2016 18:39
Letzter Beitrag: Prosac
  at24c256 Hilfe Gandalf 6 249 29.08.2016 18:59
Letzter Beitrag: MKc
Smile Progammier Neuling Codeschloss bittet um Hilfe Donalonso 2 287 27.08.2016 18:23
Letzter Beitrag: Binatone
  Hilfe gesucht. Webserver Statsiche und Dynamische HTMl Seite b3ta 11 453 22.08.2016 08:07
Letzter Beitrag: b3ta
  Hilfe: Mega2560 - ENC 28J60 - MYSQL Gandalf 1 181 28.07.2016 16:30
Letzter Beitrag: Gandalf
  SainSmart 3.2 TFT + 5" TFT/SD Shield + Due SAM3X8E ARM (Arduino Due) Techniker_UE 13 3.234 24.07.2016 14:34
Letzter Beitrag: Eichner
  Selbstfahrender Roboter Programm änderung hilfe ? arekklone 11 549 06.07.2016 14:59
Letzter Beitrag: Binatone
  Hilfe beim Arduino Shield reimundko 6 459 05.06.2016 11:28
Letzter Beitrag: rpt007
  Brauche etwas Hilfe bei der Umsetzung einer Idee raspido 3 535 23.04.2016 10:26
Letzter Beitrag: rkuehle

Gehe zu:


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