Go Down

Topic: Speakjet(audio) et detection de couleur (Read 3023 times) previous topic - next topic

durnik59

Bonjour je vient sur le forum pour avoir votre aide/conseil , En effet je doit faire un projet pour le  bac et l'échéance arrive mais pas la fin du projet ....

Se projet consiste a créer un détecteur de couleur pour les personne aveugle leur permettant d'avoir une tenue harmonieuses en toutes circonstances.

Pour se projet j'ai utiliser : Arduino UNO
-TCS3200 (color sensor)http://www.robotshop.com/eu/capteur-couleurs-tcs3200-dfrobot.html
-VoiceBoxShield + Speakjet PIC (https://www.sparkfun.com/products/9799 +https://www.sparkfun.com/products/9811)

J'ai repris un programme sur le forum auquel j'ai aporter des petite modification ( je ne l'est pas encor developer pour toute les couleur vues qu'il n'est deja pas opérationel pour une --')

Code: [Select]
// speakjet IC
#include <SoftwareSerial.h>
#define txPin 2
#define rxPin 3
SoftwareSerial speakJet =  SoftwareSerial(rxPin, txPin);

char pingSound[] = {20, 96, 21, 114, 22, 88, 23, 5, 252};
char sayThis[] = {20, 96, 21, 120, 22, 120, 23, 12, 148, 135, 165, 151, 8, 148, 135, 165, 151};

int outPin1 = 5;
int outPin2 = 6;
int val=0;

int inPin=A0;

void setup()
{
  Serial.begin(9600);                           
 
  pinMode(txPin, OUTPUT);
  speakJet.begin(9600);
  delay(1000);
 
  pinMode(outPin1, OUTPUT);
  pinMode(outPin2, OUTPUT);
}


void loop()
{
  digitalWrite (outPin1, HIGH);
  digitalWrite (outPin2, HIGH);

  val=pulseIn(inPin,HIGH);
  Serial.println (val) ;
  if(val <=10)
  {
  speakJet.print(sayThis);
  Serial.print ("parle");
  delay (1000);
  }
 

}


La vous pouvez voir le resultat du programme en route :



Comme on peut l'aperçevoir le detecteur detecte bien la couleur blanche et du fait envoie la donner aux shield voix vers l'enceinte , j'ai rajouter le print de "parle" en seriel pour vérifier que le programme est bien entrain de detecter la couleur et qu'il émet bien le signal à l'enceinte.
Mais aucun sons ne sort ....

Je pense /penche plutot sur les soudure qui sont peut être mal placer , j'ai fait cela par moi même le prof n'été et n'est pas sur de celles-ci ( en vraies dire j'ai plutot due être auto didacte sur l'année).



J'ai suivie se tutoriel pour faire les soudure https://www.sparkfun.com/tutorials/166 mais comme vous pouvez le voir je n'est pas ues la même revision de shield peut être que cela a changer certaines entrer/sortie.

Je vous remercie d'avance pour vos réponses et si besoin est d'avoir plus de renseignement n'hésitez pas.

lve123

Bonjour
C'est quoi ce circuit intégré au milieu du shield ?  Un avr ? Pourquoi avoir soudé directement sur le circuit intégré ?
Ce shield utilise des phonèmes, ce ne sera pas facile pour synthétiser un message.
A+

skywodd

Bonjour,

Fait une photo DE FACE de ton câblage, ta photo en vue de dessus sur le côté c'est franchement pas pratique ...
Sinon truc bête fait lui dire "hello" au lieu de "parle", c'est un synthétiseur de voix ANGLAISES et non françaises.


C'est quoi ce circuit intégré au milieu du shield ?  Un avr ? Pourquoi avoir soudé directement sur le circuit intégré ?
Ce shield utilise des phonèmes, ce ne sera pas facile pour synthétiser un message.

C'est un chipset Cypress qui contient un convertisseur mots -> phonèmes.
Il est prévu pour contrôler le Speakjet directement, pour le montage sur la shield c'est la façon un peu bourrin de faire de Sparkfun.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

lve123

Bonjour
Il est peut-être trop tard, mais personnellement j'utilise un RMP3 de Rogue Robotic. On enregistre les messages  sur une carte SD avec son PC; l'Arduino envoie le nom du message avec le chemin (ex: s/son/message01.mp3) et la rmp3 sort le message sur une prise jack pouvant alimenter directement sur 2 haut parleurs de 16 ohms.
Seul bémol: son prix.
A+

durnik59

@Lve123:
Comme le dit skywood c'est un chipset cypress "spécialement" conçues pour le shield , mais j'ai souder tout comme le tutoriel le l'indiquer et le but étant de faire le plus serrer possible j'ai trouver cela recevable.

@Skywood:
J'ai mit parle dans le sens que sur la liaisons seriel j'ai l'indication qu'il doit parler normalement , mais la c'été un codage d'exemple que j'ai modifier donc il ne devait pas avoir de probléme.
Par contre l'inconvénient que tu réléve est déjà à ma connaissance mais avec les connaissances et le budget que j'ai je ne pouvait choisir de module plus fidéle ^^' ( je vait devoir jouer avec les phonèmes), cela me permet aussi d'utiliser le point négatif de parler en anglais en point positif car j'ai aussi un oral en anglais sur se projet( donc le faire fonctionner avec ennonciation anglaises).

@Lve123:
Je vient de voir ton shield il est franchement utile et plus pratique aux niveaux de la creation sonore , mais comme tu le dit il est tard pour moi j'y penserais pour des projet personelle ^^'.

Mais tout sa pour dire que j'ai trouver les problémes , ont le voie pas la à causes du fil qui passe sur la photo mais aux niveaux de RX-TX il y a un petit carrée  ou il fallait à l'origine souder un fil , mon pote la brancher directement sur la pin 2 sans me faire montrer qu'il avait foirer sa soudure sur cette partie et détruit partiellement les pastille...Aprer sa j'ai regarder plusieur endroit de plus prés et j'ai decider de commander une autre carte à la place ( heuresement qu'il y a livraisons expres) Je la reçoie bientot je vous tiendrais aux courant si c'été bien cela.

J'ai aussi décider de ne pas travailler avec le chipset (compliquer à installer avec mon matos) et pour le peut de temps que j'avait pues expérimenter avec il n'y avait pas réelement de changement de fidélité.

Je vous remercie quand même de vos réponses en esperant ne pas vous avoir trop déranger.


durnik59

Bonjour,

je revient vers vous aprer plusieur journée sans sucée de recherche --'

J'ai avancer dans mon programme dans le fait que j'ai reusit a faire la detection de couleur ( et fonctionelle) et faire parler le voicebox , mais tout sa séparément en effet j'ai un gros probléme comme vous allez le voir en desous les deux utilise les même entrer/sortie et pour le capteur de couleur les branchement ne peuvent changer (du mois j'ai changer et modifié le code et sa n'a pas marcher).

Donc la je vous montre le programme de detection de couleur simple ( envoie seriel vers l'ordi et pas de voicebox):
Code: [Select]



int s0=3,s1=4,s2=5,s3=6;
int flag=0;
int counter=0;
int countR=0,countG=0,countB=0;
void setup()
{
 delay(100);

 
Serial.begin(115200);
pinMode(s0,OUTPUT);
pinMode(s1,OUTPUT);
pinMode(s2,OUTPUT);
pinMode(s3,OUTPUT);
}
void TCS()
{
  digitalWrite(s1,HIGH);
  digitalWrite(s0,LOW);
  flag=0;
  attachInterrupt(0, ISR_INTO, CHANGE);
  timer2_init();
}
void ISR_INTO()
{
  counter++;
}
void timer2_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)
 {
   counter=0;
 }
else if(flag==2)
  {
   digitalWrite(s2,LOW);
   digitalWrite(s3,LOW);
   countR=counter/1.051;
   Serial.print("red=");
   Serial.println(countR,DEC);
   digitalWrite(s2,HIGH);
   digitalWrite(s3,HIGH);  
  }
else if(flag==3)
   {
    countG=counter/1.0157;
   Serial.print("green=");
   Serial.println(countG,DEC);
    digitalWrite(s2,LOW);
    digitalWrite(s3,HIGH);
 
   }
else if(flag==4)
   {
    countB=counter/1.114;
   Serial.print("blue=");
   Serial.println(countB,DEC);
    digitalWrite(s2,LOW);
    digitalWrite(s3,LOW);
    }
else
    {
    flag=0;
     TIMSK2 = 0x00;
    }
    counter=0;
    delay(2);
}
void loop()
{
 delay(10);
 TCS();


Ici on peut voir le cablâge correspondant aux programme http://wiki.dfrobot.com.cn/images/thumb/5/5c/TCS3200.png/500px-TCS3200.png

Ensuite le programme d'énonciation sonore ( c'est un programme de test simple mais qui marche):
Code: [Select]

#include <SoftwareSerial.h>

#define txPin 2  
#define RES  3  

byte in;


SoftwareSerial speakjet = SoftwareSerial(0, txPin);

void setup()
{
 Serial.begin(9600);  
 speakjet.begin(9600);  

 
 speakjet.begin(9600);    


 pinMode(RES, OUTPUT);

 digitalWrite(RES, LOW);
 delay(100);
 digitalWrite(RES, HIGH);    
 
 // This says "Try it now", generated from the PhrasALator and just pasting it in.   Add a 0 at the end to null-terminate
 char message[] = {20, 30, 21, 114, 22, 120, 23, 5, 8, 191, 7, 148, 155, 8, 129, 8, 191, 142, 163,0};
 speakjet.print(message);
}

void loop() {
 
 if (Serial.available()) {
   in=Serial.read();
   speakjet.print((char)in);
 }
}



J'ai essayer à partir des deux programme de faire un rassemblement qui donne sa:
Code: [Select]
#include <SoftwareSerial.h>

#define RDY  13
#define RES  3
#define SPK  4

#define txPin  2

SoftwareSerial speakjet = SoftwareSerial(0, txPin);

char black[] = {20,96,21,114,22,88,23,5,175,152,4,196};
char purple[] = {20,96,21,114,22,88,23,5,128,131,146,137};
char grey[] = {20,96,21,114,22,88,23,5,8,179,7,198,154};
char orange[] = {20,96,21,114,22,88,23,5,153,141,165};
char yellow[] = {20,96,21,114,22,88,23,5,128,131,146,137};
char red[] = {20,96,21,114,22,88,23,5,148,8,131,176};
char green[] = {20,96,21,114,22,88,23,5,8,179,7,148,8,124,141};
char pink[] = {20,96,21,114,22,88,23,5,198,7,128,143,196};
char blue[] = {20,96,21,114,22,88,23,5,171,7,146,162};
char brown[] = {20,96,21,114,22,88,23,5,171,7,148,161,141};
char white[] = {20,96,21,114,22,88,23,5,185,155,191};

int s0=3,s1=4,s2=5,s3=6;
int flag=0;
int counter=0;
int countR=0,countG=0,countB=0;
void setup()
{
    pinMode(txPin, OUTPUT);
 pinMode(SPK, INPUT);
 
 speakjet.begin(9600);    
 
 pinMode(RDY, INPUT);
 
 pinMode(RES, OUTPUT);
     
 for(int i=E0; i<=E7; i++)
 {
   pinMode(i, OUTPUT);
   digitalWrite(i, LOW);
 }
 
 digitalWrite(RES, LOW);
 delay(100);
 digitalWrite(RES, HIGH);
 
Serial.begin(115200);
pinMode(s0,OUTPUT);
pinMode(s1,OUTPUT);
pinMode(s2,OUTPUT);
pinMode(s3,OUTPUT);
}
void TCS()
{
  digitalWrite(s1,HIGH);
  digitalWrite(s0,LOW);
  flag=0;
  attachInterrupt(0, ISR_INTO, CHANGE);
  timer2_init();
}
void ISR_INTO()
{
  counter++;
}
void timer2_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)
 {
   counter=0;
 }
else if(flag==2)
  {
   digitalWrite(s2,LOW);
   digitalWrite(s3,LOW);
   countR=counter/1.051;
   Serial.print("red=");
   Serial.println(countR,DEC);
   digitalWrite(s2,HIGH);
   digitalWrite(s3,HIGH);  
  }
else if(flag==3)
   {
    countG=counter/1.0157;
   Serial.print("green=");
   Serial.println(countG,DEC);
    digitalWrite(s2,LOW);
    digitalWrite(s3,HIGH);
 
   }
else if(flag==4)
   {
    countB=counter/1.114;
   Serial.print("blue=");
   Serial.println(countB,DEC);
    digitalWrite(s2,LOW);
    digitalWrite(s3,LOW);
    }
else
    {
    flag=0;
     TIMSK2 = 0x00;
    }
    counter=0;
    delay(2);
}
void loop()
{
 delay(10);
 TCS();
   if((countR<=10) && (countG<=10) && (countB<=10))
   {  
           Serial.print("Black");
           Serial.print("\n");
           speakjet.print(black);
           delay(3000);
      }
   
 if((countR>10)||(countG>10)||(countB>10))
  {
    if((countR >=25 && countR <=40) && (countG >=25 && countG<=40) && (countB >=25 && countB<=40))
   {
           Serial.print("grey");
           Serial.print("\n");
           speakjet.print(grey);

           delay(3000);
   }
        else if((countR >=10 && countR <=15) && (countG >=10 && countG<=15) && (countB >=10 && countB<=15))
{
           Serial.print("Orange");
           Serial.print("\n");
           speakjet.print(orange);
           delay(3000);
}
        else if((countR >=20 && countR <=30) && (countG >=50 && countG<=60) && (countB >=20 && countB<=30))
{
           Serial.print("yellow");
           Serial.print("\n");
           speakjet.print(yellow);
           delay(3000);
}
        else if((countR >=15 && countR <=20) && (countG >=10 && countG<=15) && (countB >=15 && countB<=20))
{
           Serial.print("Rose");
           Serial.print("\n");
           speakjet.print(pink);
           delay(3000);
}
        else if((countR >=10 && countR <=15) && (countG >=5 && countG<=15) && (countB >=5 && countB<=15))
{
           Serial.print("brown");
           Serial.print("\n");
           speakjet.print(brown);
           delay(3000);
}
        else if((countR >=80) && (countG >=80) && (countB >=80))
{
           Serial.print("white");
           Serial.print("\n");
           speakjet.print(white);
           delay(3000);
}
     else if((countR>countG)&&(countR>countB))
      {
           Serial.print("red");
           Serial.print("\n");
           speakjet.print(red);
           delay(3000);
      }
     else if((countG>=countR)&&(countG>countB))
      {
           Serial.print("green");
           Serial.print("\n");            
           speakjet.print(green);
           delay(3000);
      }
    else if((countB>countG)&&(countB>countR))
     {
           Serial.print("blue");
           Serial.print("\n");          
           speakjet.print(blue);
          delay(3000);
     }
   }
 else
 {
    delay(3000);      
 }
}


Pour vous aider , se n'est pas le codage des char qui est faux car j'ai tester cela par un programme de bouton poussoir , comme on voit aux debut du programme le shield communique par le 2 et 3 , j'avoue que j'ai du mal à comprendre mais c'est comme sa.
J'ai deja tester de changer de position les branchement de mon TCS mais aucun n'été concluant , néanmoins si vous trouvez une solutions pour les branchement dites le moi.

Je vous remercie de votre futur aide a tousse

Coordialement,

Go Up