Wave Shield + IR Kit

Parlez nous de vos projets et de vos idées, imaginez des applications

Wave Shield + IR Kit

Message non lude dam » Dim 22 Jan 2012 22:52

Bonsoir à tous,
Je viens de recevoir le wave shield adafruit ainsi qu'un kit de communication IR.

Après avoir monté le shield, je l'ai testé avec l'exemple suivant qui utilise la librairie waveHC
http://www.ladyada.net/media/wavshield/daphc.pde
Ensuite j'ai testé la fabriquation d'une barrière IR grace au tuto de la section kit IR
http://www.arcfn.com/2010/03/detecting-ir-beam-break-with-arduino-ir.html

Tout fonctionne sans problème.
Maintenant j'aimerai utiliser cette barrière pour déclencher un son via le wave shield.
À chaque fois qu'une personne coupe le faisceau infrarouge, le waveshield déclenche un son aléatoirement choisit sur la carte SD contenant 5 fichiers waves (1.WAV, 2.WAV…) Le son est joué entièrement même si une autre personne coupe le faisceau. Après lecture, un autre son est joué si une autre personne est detectée…

Du coup je pensait utiliser cette partie de code, en utilisant les PIN 6 et 7 pour les capteurs (les autres étant utilisées par le waveshield),
Code: Tout sélectionner
#include <IRremote.h>

#define PIN_IR 7
#define PIN_DETECT 6
#define PIN_STATUS 13

IRsend irsend;
void setup()
{
  pinMode(PIN_DETECT, INPUT);
  pinMode(PIN_STATUS, OUTPUT);
  irsend.enableIROut(38);
  irsend.mark(0);
}

void loop() {
  digitalWrite(PIN_STATUS, !digitalRead(PIN_DETECT));
}


Ici l'action déclenchée par la coupure du faisceau est l'allumage de la LED 13, dans mon cas ça serait la lecture d'un son sur le waveshield, mais la je sèche :(
dam
 
Messages: 17
Inscription: Mer 4 Jan 2012 17:14

Re: Wave Shield + IR Kit

Message non lude dam » Lun 23 Jan 2012 19:55

J'ai trouvé un sketch pour une application similaire à la mienne à cette addresse
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1272995447

Code: Tout sélectionner
#include <AF_Wave.h> //You will need the AF Wave library
#include <avr/pgmspace.h>
#include "util.h"
#include "wave.h"

AF_Wave card;
File f;
Wavefile wave;     

#define redled 9

uint16_t samplerate;

int Power = 19;

void setup() {
  Serial.begin(9600);           // set up Serial library at 9600 bps
  Serial.println("Wave test!");



  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(redled, OUTPUT);
  pinMode(Power, OUTPUT);
 
  if (!card.init_card()) {
    putstring_nl("Card init. failed!"); return;
  }
  if (!card.open_partition()) {
    putstring_nl("No partition!"); return;
  }
  if (!card.open_filesys()) {
    putstring_nl("Couldn't open filesys"); return;
  }

 if (!card.open_rootdir()) {
    putstring_nl("Couldn't open dir"); return;
  }

  putstring_nl("Files found:");
  ls();
}

void ls() {
  char name[13];
  int ret;
 
  card.reset_dir();
  putstring_nl("Files found:");
  while (1) {
    ret = card.get_next_name_in_dir(name);
    if (!ret) {
       card.reset_dir();
       return;
    }
    Serial.println(name);
  }
}

uint8_t tracknum = 0;

void loop() {
 int sensor = 0;
 int sensorPin = 0;
  sensor = analogRead(sensorPin);
  uint8_t i, r;
   char c, name[15];


   card.reset_dir();
   // scroll through the files in the directory
 
//------------------------------------------------ 
   // THIS IS THE BUTTON IF STATEMENT!!!!
  //
 
    digitalWrite(Power, LOW);  //This turns the Speaker system
                              //Off using a powerSwitchTail relay
                             // when no music is playing.
                             // You don't need this if you
                             // want to leave your speakers on
 
   if (sensor > 300){    // 300 is for the IR distance sensor,
                         // you can change that number depending
                         // on the type of sensor you use.
                         // This sensor is on pin Analog 0.
 
  digitalWrite(Power, HIGH);  //This turns the speakers ON using
                                //the powerswitchtail Relay
   for (i=0; i<tracknum+1; i++) {
     r = card.get_next_name_in_dir(name);
     if (!r) {
       // ran out of tracks! start over
       tracknum = 0;
       return;
     }
   }
   putstring("\n\rPlaying "); Serial.print(name);
   // reset the directory so we can find the file
   card.reset_dir();
   playcomplete(name);
   tracknum++;
}
  }
void playcomplete(char *name) {
  uint16_t potval;
  uint32_t newsamplerate;
 
  playfile(name);
  samplerate = wave.dwSamplesPerSec;
  while (wave.isplaying) {   
   // you can do stuff here!
   delay(500);
   }
  card.close_file(f);
}

void playfile(char *name) {
   f = card.open_file(name);
   if (!f) {
      putstring_nl(" Couldn't open file"); return;
   }
   if (!wave.create(f)) {
     putstring_nl(" Not a valid WAV"); return;
   }
   // ok time to play!
   wave.play();
}
 


Cependant j'aimerai l'adapter à la librairie waveHC car avec la librairie de chez adafruit ça ne marche pas (Cart int. failed)
Je rajoute donc en début de void loop la partie capteur :
Code: Tout sélectionner
void loop() {
 int sensor = 0;
 int sensorPin = 0;
  sensor = analogRead(sensorPin);


J'aimerai maintenant faire en sorte que si le capteur ne détecte plus la LED infrarouge, alors le waveshield se met en route…
dam
 
Messages: 17
Inscription: Mer 4 Jan 2012 17:14

Re: Wave Shield + IR Kit

Message non lude Lionel » Mar 24 Jan 2012 09:57

Bonjour,

il vaudrait mieux s'inspirer de l'exemple "player audio 6 boutons" du site de ladyada, situé ici
http://www.ladyada.net/make/waveshield/ ... play6.html

Il déclenche des sons en fonctions d'appui sur des boutons,

Les modifications seront plus simples a apporter.
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: Wave Shield + IR Kit

Message non lude dam » Mar 24 Jan 2012 19:17

question débile
ladyada utilise les analog input 14, 15, 16, 17, 18 et 19
j'imagine donc qu'elle utilise une arduino mega ?
dam
 
Messages: 17
Inscription: Mer 4 Jan 2012 17:14

Re: Wave Shield + IR Kit

Message non lude Lionel » Mar 24 Jan 2012 19:26

Question pas débile :)

non elle n'utilise pas de mega, elle utilise un uno ou un duemilanove,
mais elle choisit d'utiliser les entrées analogiques comme entrées/sortie digitale, c'est possible !!! et d'ailleurs, c'est prévu :)

donc :
A0 = D14
A1 = D15
...
A5 = D19
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: Wave Shield + IR Kit

Message non lude dam » Mar 24 Jan 2012 20:00

Merci pour l'info :D
Du coup j'ai récupérer le code. Étant donné que la lecture sera enclenchée par un seul "boutton" j'ai donc modifié le case 1 afin d'enclencher un son aléatoirement

Code: Tout sélectionner
void loop() {
  //putstring(".");           
  switch (check_switches()) {
        case 1:
    {
   int Song = random(0, 4);  // choose a random song
   switch (Song)
   {
      case 0: playcomplete("1.WAV"); break;
      case 1: playcomplete("2.WAV"); break;
      case 2: playcomplete("3.WAV"); break;
      case 3: playcomplete("4.WAV"); break;
   }
}
      break;
  }
}


Pas de problème ca fonctionne,
maintenant il faut que je remplace le boutton par la barrière infrarouge.
Pensez vous qu'il est possible de ne pas passer par la librairie IR, mais d'utiliser le detecteur comme un bouton, et d'alimenter la diode séparement ?
dam
 
Messages: 17
Inscription: Mer 4 Jan 2012 17:14

Re: Wave Shield + IR Kit

Message non lude Lionel » Mar 24 Jan 2012 20:23

Le souci c'est que ce détecteur infrarouge est prévu pour détecter un signal sur une porteuse a 38kHz,
alors, ça a l'air embêtant comme ça, mais c'est utilisé comme "antiparasite", c'est à dire pour éviter d'être perturbé par des sources infrarouge extérieures, genre soleil, tubes fluorescents..

Donc il vaut mieux fusionner votre condition avec du code dans le genre de celui de ken shiriff que vous citez plus haut
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: Wave Shield + IR Kit

Message non lude dam » Mar 24 Jan 2012 20:31

Le problème c'est que la librairie IRremote utilise la pin 3 qui est déjà utilisée par le waveshield :cry:
dam
 
Messages: 17
Inscription: Mer 4 Jan 2012 17:14

Re: Wave Shield + IR Kit

Message non lude dam » Mar 24 Jan 2012 20:47

et j'ai essayé de remplacer la pin 3 par la pin 9 dans le fichier IRremote.cpp
Code: Tout sélectionner
  pinMode(9, OUTPUT);
  digitalWrite(9, LOW); // When not sending PWM, we want it low

mais ça ne marche pas :/
dam
 
Messages: 17
Inscription: Mer 4 Jan 2012 17:14

Re: Wave Shield + IR Kit

Message non lude Lionel » Mar 24 Jan 2012 21:14

Hmmm,

peut être êtes vous chanceux, en fait, le waveshield de ladyada permet de changer les pin utilisées pour les signaux
alors effectivement, par défaut c'est ça :
2 -> LCS
3 -> CLK
4 -> DI
5 -> LAT
10 -> CCS

mais il devrait suffire de changer le strap de la pin 3 (CLK) et de l'envoyer vers la pin 9
votre pin 3 sera donc disponible (pour que la librairie Irremote change allègrement la valeur des registres timer pour générer son 38kHz)

évidemment, dans la librairie, il faudra remplacer l'affectation de la pin 3 par la 9
c'est à dire dans dac.h, remplacer
Code: Tout sélectionner
#define DAC_CLK_PORT PORTD
#define DAC_CLK_DDR DDRD
#define DAC_CLK PIND3


par
Code: Tout sélectionner
#define DAC_CLK_PORT PORTB
#define DAC_CLK_DDR DDRB
#define DAC_CLK PIND9


et ne pas oublier de remplacer le 3 par un 9 dans votre sketch
Code: Tout sélectionner
  pinMode(3, OUTPUT);
devient
Code: Tout sélectionner
  pinMode(9, OUTPUT);


Pas garanti, mais ça se tente :)
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: Wave Shield + IR Kit

Message non lude dam » Mar 24 Jan 2012 21:39

Et es-ce que vous avez une idée avec la librairie waveHC ? ;)
dam
 
Messages: 17
Inscription: Mer 4 Jan 2012 17:14

Re: Wave Shield + IR Kit

Message non lude Lionel » Mar 24 Jan 2012 21:41

Je ne comprends pas votre question, c'est de celle ci dont je parle :?
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: Wave Shield + IR Kit

Message non lude dam » Mar 24 Jan 2012 21:52

Et bien le fichier dac.h existe dans la librairie adafruit (AF_Wave)
mais pour ce programme j'utilise la libraire waveHC http://code.google.com/p/wavehc/
il n'y a donc pas de fichier dac.h
dam
 
Messages: 17
Inscription: Mer 4 Jan 2012 17:14

Re: Wave Shield + IR Kit

Message non lude Lionel » Mar 24 Jan 2012 22:06

AAAaaaaaah oui pardon, me suis emmêlé les pinceaux là
donc pour waveHC, à l'aveugle je dirais le fichier WavePinsDef.h

remplacer
Code: Tout sélectionner
// pin 3 is DAC serial clock
/** Data direction register for DAC clock. */
#define MCP_DAC_SCK_DDR  PIN3_DDRREG
/** Port register for DAC clock. */
#define MCP_DAC_SCK_PORT PIN3_PORTREG
/** Port bit number for DAC clock. */
#define MCP_DAC_SCK_BIT  PIN3_BITNUM


par
Code: Tout sélectionner
// pin 9 is DAC serial clock
/** Data direction register for DAC clock. */
#define MCP_DAC_SCK_DDR  PIN9_DDRREG
/** Port register for DAC clock. */
#define MCP_DAC_SCK_PORT PIN9_PORTREG
/** Port bit number for DAC clock. */
#define MCP_DAC_SCK_BIT  PIN9_BITNUM


et me raconter si ça marche :)
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: Wave Shield + IR Kit

Message non lude dam » Mar 24 Jan 2012 23:05

Yes ! ça marche super !
du coup j'ai aussi remplacer la pin 2 avec la 7

Le test de la barrière marche donc sur le waveshield
Code: Tout sélectionner
#include <IRremote.h>

#define PIN_IR 3
#define PIN_DETECT 7
#define PIN_STATUS 13

IRsend irsend;
void setup()
{
  pinMode(PIN_DETECT, INPUT);
  pinMode(PIN_STATUS, OUTPUT);
  irsend.enableIROut(38);
  irsend.mark(0);
}

void loop() {
  digitalWrite(PIN_STATUS, !digitalRead(PIN_DETECT));
}


Il me reste plus qu'a trouver comment l'intégrer dans mon programme et ça devrait le faire :)
dam
 
Messages: 17
Inscription: Mer 4 Jan 2012 17:14

Re: Wave Shield + IR Kit

Message non lude Lionel » Mer 25 Jan 2012 09:53

Bonjour,

content que ça fonctionne, n'hésitez pas à nous tenir informé de l'évolution de votre montage (photos, code etc) et à nous le présenter en situation une fois fini !!
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: Wave Shield + IR Kit

Message non lude dam » Mer 25 Jan 2012 11:40

donc pour fusionner le code je m'y prend de la manière suivante :
importer les librairies + les defines

Code: Tout sélectionner
#include <FatReader.h>
#include <SdReader.h>
#include <avr/pgmspace.h>
#include "WaveUtil.h"
#include "WaveHC.h"
#include <IRremote.h>


SdReader card;    // This object holds the information for the card
FatVolume vol;    // This holds the information for the partition on the card
FatReader root;   // This holds the information for the filesystem on the card
FatReader f;      // This holds the information for the file we're play

WaveHC wave;      // This is the only wave (audio) object, since we will only play one at a time

#define DEBOUNCE 100  // button debouncer
#define PIN_IR 3
#define PIN_DETECT 7
#define PIN_STATUS 13

IRsend irsend;


au niveau du void setup je rajoute après les pinMode du DAC
Code: Tout sélectionner
  pinMode(2, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(PIN_DETECT, INPUT);
  pinMode(PIN_STATUS, OUTPUT);
  irsend.enableIROut(38);
  irsend.mark(0);



Voila maintenant sur l'ancien code on avait ça en début de void_loop :
Code: Tout sélectionner
void loop() {
  //putstring(".");            // uncomment this to see if the loop isnt running
  switch (check_switches()) {
        case 1:
    {
   int Song = random(0, 4);  // choose a random song
   switch (Song)
   {
      case 0: playcomplete("1.WAV"); break;
      case 1: playcomplete("2.WAV"); break;
      case 2: playcomplete("3.WAV"); break;
      case 3: playcomplete("4.WAV"); break;
      case 4: playcomplete("5.WAV"); break;
   }
}
      break;
    case 2:
      playcomplete("2.WAV");
      break;
    case 3:
      playcomplete("3.WAV");
      break;
    case 4:
      playcomplete("4.WAV");
      break;
    case 5:
      playcomplete("5.WAV");
      break;
    case 6:
      playcomplete("6.WAV");
  }
}

byte check_switches()
{
  static byte previous[6];
  static long time[6];
  byte reading;
  byte pressed;
  byte index;
  pressed = 0;

  for (byte index = 0; index < 6; ++index) {
    reading = digitalRead(14 + index);
    if (reading == LOW && previous[index] == HIGH && millis() - time[index] > DEBOUNCE)
    {
      // switch pressed
      time[index] = millis();
      pressed = index + 1;
      break;
    }
    previous[index] = reading;
  }
  // return switch number (1 - 6)
  return (pressed);
}


J'imagine donc que je peut virer tout la partie byte check_switches() car cette variable ne sert plus à rien, et de dire que si la valeur digitalRead de PIN_DETECT vaut zéro -> switch (Song)…
Qu'en pensez vous ?
dam
 
Messages: 17
Inscription: Mer 4 Jan 2012 17:14

Re: Wave Shield + IR Kit

Message non lude Lionel » Mer 25 Jan 2012 15:06

Essayez :)
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: Wave Shield + IR Kit

Message non lude dam » Mer 25 Jan 2012 15:23

j'ai essayé comme ça, ça a l'air de fonctionner

Code: Tout sélectionner
void loop() {
  //putstring(".");            // uncomment this to see if the loop isnt running

   int Song = random(0, 4);  // choose a random song
   int Coupure = digitalRead(PIN_DETECT);
   if (Coupure == LOW) {
   switch (Song)
   {
      case 0: playcomplete("1.WAV"); break;
      case 1: playcomplete("2.WAV"); break;
      case 2: playcomplete("3.WAV"); break;
      case 3: playcomplete("4.WAV"); break;
      case 4: playcomplete("5.WAV"); break;
   }
}
}
dam
 
Messages: 17
Inscription: Mer 4 Jan 2012 17:14

Re: Wave Shield + IR Kit

Message non lude dam » Mer 25 Jan 2012 15:30

C'est officiel ça marche :D
dam
 
Messages: 17
Inscription: Mer 4 Jan 2012 17:14

Suivante

Retourner vers Vos projets, vos idées

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 4 invités

cron