Auteur Sujet: Teensy 3.1, 3.2 - Sonorisation locomotive  (Lu 10056 fois)

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1265
    • Voir le profil
Re : Teensy 3.1, 3.2 - Sonorisation locomotive
« Réponse #150 le: juin 02, 2018, 07:33:47 pm »
Ça dépend comment c’est fait. Essaye  8)

Benoit92

  • Full Member
  • ***
  • Messages: 185
    • Voir le profil
Re : Teensy 3.1, 3.2 - Sonorisation locomotive
« Réponse #151 le: juin 24, 2018, 01:07:53 am »
J’essaye de faire cohabiter sur le Teensy 3.2 :
    • 1) la fonction décodage trame et la fonction pilotage moteur + (Leds éclairage et feux),
    • 2) la fonction son,
    Les deux codes fonctionnent séparément.
    J'ai donc rapproché les deux codes.
    Le résultat est le suivant (vu sur le moniteur série) :
    Dés que j'active le son (en appuyant sur la touche F1 de la MS2), le décodage de la trame DCC s'arrête durant les 5 secondes que dure le bruitage,
    puis le décodage de la trame DCC reprend au début et s'arrête avant d'avoir décoder toute la trame,
    puis le bruitage reprend et ainsi de suite ...
    J'ai l'impression qu'il doit y avoir un conflit au niveau des ressources CPU.
    Les signaux DCC arrive sur la patte RX1 (pin0) du Teensy
    Cette pin est déclarée comme recevant une interruption (signal DCC) :   
    [/list][/list]Dcc.pin(0, 0, 0);// Pin 0= Interrupt 0
    Je ne vois pas quelle méthode utilisée pour que la fonction "son" ne vienne pas bloquer le décodage trame DCC.
    Ci-après le code correspondant au problème ci-dessus :
    #include <NmraDcc.h>
    #include <Audio.h>
    #include <Wire.h>
    #include <SPI.h>
    #include <SD.h>
    #include <SerialFlash.h>

    #define This_Decoder_Address 3
    const int FLASH_CHIP_SELECT = 10;  // SPI Flash Chip Select (CS)
    // GUItool: begin automatically generated code (Audio.h)
        AudioPlaySerialflashRaw  playFlashRaw1;  //xy=228,273
        AudioOutputAnalog        dac1;           //xy=751,337
        AudioConnection          patchCord1(playFlashRaw1, 0, dac1, 0);
    // GUItool: end automatically generated code

    struct CVPair
    {
      uint16_t  CV;
      uint8_t   Value;
    };
    CVPair FactoryDefaultCVs [] =
    {
    // // The CV Below defines the Short DCC Address
      {CV_MULTIFUNCTION_PRIMARY_ADDRESS, This_Decoder_Address},

      // These two CVs define the Long DCC Address
      {CV_MULTIFUNCTION_EXTENDED_ADDRESS_MSB, 0},
      {CV_MULTIFUNCTION_EXTENDED_ADDRESS_LSB, This_Decoder_Address},

    // ONLY uncomment 1 CV_29_CONFIG line below as approprate
      {CV_29_CONFIG,                                      0}, // Short Address 14 Speed Steps
      {CV_29_CONFIG,                       CV29_F0_LOCATION}, // Short Address 28/128 Speed Steps

      {CV_29_CONFIG, CV29_EXT_ADDRESSING | CV29_F0_LOCATION}, // Long  Address 28/128 Speed Steps 
    };

    NmraDcc  Dcc ;
    uint8_t FactoryDefaultCVIndex = 0;

    void notifyCVResetFactoryDefault()
    {
    //   Make FactoryDefaultCVIndex non-zero and equal to num CV's to be reset
    //   to flag to the loop() function that a reset to Factory Defaults needs to be done
      FactoryDefaultCVIndex = sizeof(FactoryDefaultCVs)/sizeof(CVPair);
    };

    // Uncomment the #define below to print all Speed Packets
    #define NOTIFY_DCC_SPEED
    #ifdef  NOTIFY_DCC_SPEED
    void notifyDccSpeed( uint16_t Addr, DCC_ADDR_TYPE AddrType, uint8_t Speed, DCC_DIRECTION Dir, DCC_SPEED_STEPS SpeedSteps )
    {
      Serial.print("notifyDccSpeed: Addr: ");
      Serial.print(Addr,DEC);
      Serial.print( (AddrType == DCC_ADDR_SHORT) ? "-S" : "-L" );
      Serial.print(" Speed: ");
      Serial.print(Speed,DEC);
      Serial.print(" Steps: ");
      Serial.print(SpeedSteps,DEC);
      Serial.print(" Dir: ");
      Serial.println( (Dir == DCC_DIR_FWD) ? "Forward" : "Reverse" );
    };
    #endif

    // Uncomment the #define below to print all Function Packets
    #define NOTIFY_DCC_FUNC
    #ifdef  NOTIFY_DCC_FUNC
      void notifyDccFunc(uint16_t Addr, DCC_ADDR_TYPE AddrType, FN_GROUP FuncGrp, uint8_t FuncState)
      {

          Serial.print("notifyDccFunc: Addr: ");
          Serial.print(Addr,DEC);
          Serial.print( (AddrType == DCC_ADDR_SHORT) ? 'S' : 'L' );
          Serial.print("  Function Group: ");
          Serial.print(FuncGrp,DEC);

        switch( FuncGrp ){
       {
          #ifdef NMRA_DCC_ENABLE_14_SPEED_STEP_MODE   
               case FN_0:
               Serial.print(" FN0: ");
               Serial.println((FuncState & FN_BIT_00) ? "1  " : "0  ");
               break;
          #endif
     
         case FN_0_4:
           if(Dcc.getCV(CV_29_CONFIG) & CV29_F0_LOCATION) // Only process Function 0 in this packet if we're not in Speed Step 14 Mode
           {
             Serial.print(" FN 0: ");
             Serial.print((FuncState & FN_BIT_00) ? "1  ": "0  ");
           }
       }
             Serial.print("FuncState:");
             Serial.print(FuncState);
             Serial.print("FN_BIT_00:");
             Serial.print(FN_BIT_00);

     //   Test Sound       
                   if( (FuncState & FN_BIT_01) == 1){
                   Serial.print("CabinLight:");
                   playFile1("A0AB814.TRW");

                  }
    //               else
    //              analogWrite(CabinLight,0);

            Serial.print(" FN 1-4: ");
            Serial.print((FuncState & FN_BIT_01) ? "1  ": "0  ");
            Serial.print((FuncState & FN_BIT_02) ? "1  ": "0  ");
            Serial.print((FuncState & FN_BIT_03) ? "1  ": "0  ");
            Serial.println((FuncState & FN_BIT_04) ? "1  ": "0  ");
           break;
         
         case FN_5_8:
             Serial.print(" FN 5-8: ");
             Serial.print((FuncState & FN_BIT_05) ? "1  ": "0  ");
            Serial.print((FuncState & FN_BIT_06) ? "1  ": "0  ");
            Serial.print((FuncState & FN_BIT_07) ? "1  ": "0  ");
            Serial.println((FuncState & FN_BIT_08) ? "1  ": "0  ");
           break;
       
         case FN_9_12:
           Serial.print(" FN 9-12: ");
           Serial.print((FuncState & FN_BIT_09) ? "1  ": "0  ");
           Serial.print((FuncState & FN_BIT_10) ? "1  ": "0  ");
           Serial.print((FuncState & FN_BIT_11) ? "1  ": "0  ");
           Serial.println((FuncState & FN_BIT_12) ? "1  ": "0  ");
           break;

         case FN_13_20:
           Serial.print(" FN 13-20: ");
           Serial.print((FuncState & FN_BIT_13) ? "1  ": "0  ");
           Serial.print((FuncState & FN_BIT_14) ? "1  ": "0  ");
           Serial.print((FuncState & FN_BIT_15) ? "1  ": "0  ");
           Serial.print((FuncState & FN_BIT_16) ? "1  ": "0  ");
           Serial.print((FuncState & FN_BIT_17) ? "1  ": "0  ");
           Serial.print((FuncState & FN_BIT_18) ? "1  ": "0  ");
           Serial.print((FuncState & FN_BIT_19) ? "1  ": "0  ");
           Serial.println((FuncState & FN_BIT_20) ? "1  ": "0  ");
           break;
     
         case FN_21_28:
           Serial.print(" FN 21-28: ");
           Serial.print((FuncState & FN_BIT_21) ? "1  ": "0  ");
           Serial.print((FuncState & FN_BIT_22) ? "1  ": "0  ");
           Serial.print((FuncState & FN_BIT_23) ? "1  ": "0  ");
           Serial.print((FuncState & FN_BIT_24) ? "1  ": "0  ");
           Serial.print((FuncState & FN_BIT_25) ? "1  ": "0  ");
           Serial.print((FuncState & FN_BIT_26) ? "1  ": "0  ");
           Serial.print((FuncState & FN_BIT_27) ? "1  ": "0  ");
           Serial.println((FuncState & FN_BIT_28) ? "1  ": "0  ");
           break; 
        }
    }

    #endif

    // Uncomment the #define below to print all DCC Packets
    #define NOTIFY_DCC_MSG
    #ifdef  NOTIFY_DCC_MSG
        void notifyDccMsg( DCC_MSG * Msg)
        {
            Serial.print("notifyDccMsg: ");
            for(uint8_t i = 0; i < Msg->Size; i++)
            {
              Serial.print(Msg->Data[i], HEX);
              Serial.write(' ');
            }
            Serial.println();
        }

    #endif

    void setup()
    {
        Serial.begin(9600); // Serial setup
        while (!Serial && millis()<500 );
        AudioMemory(50);//
        analogReference(EXTERNAL);// 3,3V
        Serial.println("NMRA Dcc Multifunction Decoder - Teensy - Spi Flash");
     
    //********Set up SPI Teensy without audio Card*******************
      SPI.setMOSI(11); //7
      SPI.setMISO(12);
      SPI.setSCK(14);
        delay(2000);
         if (!SerialFlash.begin(FLASH_CHIP_SELECT)) {
            while (1){
                Serial.println ("Cannot access SPI Flash chip");
                delay (10000);
            }
        }
        // Setup which External Interrupt, the Pin it's associated with that we're using and enable the Pull-Up
      Dcc.pin(0, 0, 0);// Pin 0= Interrupt 0
     
      // Call the main DCC Init function to enable the DCC Receiver
      Dcc.init( MAN_ID_DIY, 10, FLAGS_MY_ADDRESS_ONLY, 0 );

      // Uncomment to force CV Reset to Factory Defaults
      notifyCVResetFactoryDefault();
       }

    void loop()
    {
      // You MUST call the NmraDcc.process() method frequently from the Arduino loop() function for correct library operation
      Dcc.process();

      if( FactoryDefaultCVIndex && Dcc.isSetCVReady())
      {
        FactoryDefaultCVIndex--; // Decrement first as initially it is the size of the array
        Dcc.setCV( FactoryDefaultCVs[FactoryDefaultCVIndex].CV, FactoryDefaultCVs[FactoryDefaultCVIndex].Value);
      }
    }
    // ***********Spi Soundfile Read Function***************
        void playFile1(const char *filename)// Play audio file function
        {
          SerialFlashFile ff = SerialFlash.open(filename);
          Serial.print("Playing file1: ");
          Serial.println(ff);
          playFlashRaw1.play(filename);
         // Simply wait for the file to finish playing.
         while (playFlashRaw1.isPlaying()) {
         }
        }

    // ********************************************





    « Modifié: juin 25, 2018, 10:07:07 pm par Benoit92 »

    Benoit92

    • Full Member
    • ***
    • Messages: 185
      • Voir le profil
    Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « Réponse #152 le: juillet 19, 2018, 11:32:36 pm »
    J'ai trouvé sur Ebay Allemagne une petite locomotive diesel de triage rouge (Echelle 1) pour une trentaine d'€.
    J'ai changé le stator bobiné d'origine pour un rotor aimant permanent de chez ESU (+ charbons + Bandages adhérants +nettoyage complet du moteur).
    J'ai récupéré certains sons sur "ESU Project".
    Afin d'obtenir une grande réactivité pour la génération des sons (16 bits - 44kHz), certains fichiers son ne durent qu'environ 1 s.
    Il existe certes,  des petits claquements à reprise de lecture. Je pense régler cela avec un condensateur, à moins qu'il existe une solution logicielle ?
    La commande du moteur et des leds sera effectuée à partir d'un Arduino Nano.
    Celui-ci enverra les ordres de lecture de son ('a', 'z', 'e', 'r', 't', 'y', 'u', 'i') avec la ligne Serial (Tx Rx).
    Le Teensy 3.2 recevra les ordres de lecture de son sur la ligne Serial (Tx1 Rx1) (qui est indépendante de sa ligne Serial Tx Rx de la liaison USB - PC : avantage du Teensy).
    Ci-joint, le code de génération du son du Teensy :
    // Diesel Henschel DHG 500
    // Teensy 3.2 + SPI Flash + Serial1(Arduino Nano)
    #include <Audio.h>
    #include <Wire.h>
    #include <SPI.h>
    #include <SD.h>
    #include <SerialFlash.h>

        //'*' Type on Serial Monitor
        //DHG_STA.TRW = 'a' Engine start
        //DHG_STO.TRW = 'z' Stop Engine
        //DHG_HOR.TRW = 'e' Horn
        //DHG_SPE.TRW = 'r' Driving
        //DHG_BRA.TRW = 't' Brake
        //DHG_IDL.TRW = 'y' Idle
        //DHG_UNC.TRW = 'u' Uncoupling
        //DHG_ACC.TRW = 'i' Acceleration

    const int FLASH_CHIP_SELECT = 10; 
    #include <Audio.h>
    #include <Wire.h>
    #include <SPI.h>
    #include <SD.h>
    #include <SerialFlash.h>

    // GUItool: begin automatically generated code
    AudioPlaySerialflashRaw  playFlashRaw1;  //xy=228,273
    AudioOutputAnalog        dac1;           //xy=751,337
    AudioConnection          patchCord1(playFlashRaw1, 0, dac1, 0);
    // GUItool: end automatically generated code

    int Data;     // Read serial data
    int PrevData;  // Read previous serial data
    int i = 0;

    void setup() {
        Serial.begin(9600); // Serial setup
        while (!Serial && millis()<500 );
        AudioMemory(50);//
    //    analogReference(EXTERNAL);// 3,3V Amplitude DAC

    //************************************
    //  Set up SPI Teensy without audio Card
      SPI.setMOSI(11); //7
      SPI.setMISO(12);
      SPI.setSCK(14);
    //************************************
        delay(2000);
        if (!SerialFlash.begin(FLASH_CHIP_SELECT)) {
            while (1){
                Serial.println ("Cannot access SPI Flash chip");
                delay (10000);
            }
        }
    }
        void playFile1(const char *filename)// Play audio file function
        {
          SerialFlashFile ff = SerialFlash.open(filename);
          Serial.print("Playing file1: ");
          Serial.println(ff);
          playFlashRaw1.play(filename);
         // Simply wait for the file to finish playing.
         while (playFlashRaw1.isPlaying()) {
         }
        }
       
    void loop() {
      if ( Serial.available() ) {
        Data = Serial.read();
        Serial.println(Data);
      }
      else {
        Serial.println("Nothing");
      }

      switch (Data) {
           case 'a':{  // Play Soundfile in loop : Start
                playFile1("DHG_STA.TRW");
                                  Serial.println("DHG_STA.TRW");
                Data = 'y';
                playFile1("DHG_IDL.TRW");
                                  Serial.println("DHG_IDL.TRW");
            break;
           }
          case 'z':{  // Play Soundfile in loop : Stop

               playFile1("DHG_STO.TRW");
                                  Serial.println("DHG_STO.TRW");
               Data = 'o';
          break;
          }   
          case 'e':{   // Play Soundfile only once : Horn 
               playFile1("DHG_HOR.TRW");
                                  Serial.println("DHG_HOR.TRW");
               Data=PrevData; // Continue with previous soundfile
               Serial.println(Data);
          break;
               }
         case 'r':{  // Play Soundfile in loop : Full Speed
               PrevData = 'r';
               playFile1("DHG_SPE.TRW");
                                  Serial.println("DHG_SPE.TRW");
         break;
        }   
         case 't':{  // Play Soundfile in loop : Brake 
               PrevData = 't';
               playFile1("DHG_BRA.TRW");
               Data = 'y';
               playFile1("DHG_IDL.TRW");
         break;
        } 
         case 'y':{  // Play Soundfile in loop : Idle
             PrevData = 'y';
             playFile1("DHG_IDL.TRW");
                                 Serial.println("DHG_IDL.TRW");
         break;
        }
         case 'u':{  // Play Soundfile in loop : Uncoupling
             PrevData = 'u';
             playFile1("DHG_UNC.TRW");
                                 Serial.println("DHG_UNC.TRW");
             Data = 'y';
             playFile1("DHG_IDL.TRW");
                                  Serial.println("DHG_IDL.TRW");
         break;
        }
         case 'i':{  // Play Soundfile in loop : Uncoupling
             PrevData = 'i';
             playFile1("DHG_ACC.TRW");
                                 Serial.println("DHG_UNC.TRW");
             Data = 'r';
             playFile1("DHG_IDL.TRW");
                                  Serial.println("DHG_IDL.TRW");
         break;
        }
     }
    }

    Dominique

    • Global Moderator
    • Hero Member
    • *****
    • Messages: 1452
    • 100% Arduino et N
      • Voir le profil
    Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « Réponse #153 le: juillet 20, 2018, 01:40:09 pm »
    Échelle 1 !!!!

    Ça doit prendre de la place dans le salon  ;D

    Benoit92

    • Full Member
    • ***
    • Messages: 185
      • Voir le profil
    Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « Réponse #154 le: juillet 20, 2018, 06:58:27 pm »
    En fait, j'ai commencé le modélisme ferroviaire il y a près de 50 ans avec un train Märklin  en HO.
    Depuis, j'ai acheté de nombreuses locomotives, wagons, rails, caténaires ... pour réaliser des réseaux fixes.
    Maintenant, je n'ai plus la place de faire un réseau fixe en HO.
    Donc j'ai décidé de me mettre à l'échelle 1 et d'essayer de fabriquer le maximum de chose moi-même (partie électronique, informatique et mécanique).
    L'intégration de l'électronique (Arduino, L238, Teensy, Ampli, haut parleur, alimentation, éclairages et feux) dans du HO est en effet plus compliquée (sans parler du N et du Z) par manque de place dans la locomotive.
    Pour la partie mécanique, on se rapproche de l'horlogerie même en HO.

    Donc je joue "à l'ancienne" : montage et démontage des rails dans le salon.
    On peut aussi l'installer dans un jardin : Mon rêve si j'avais un jardin !
    Si on veut laisser les rails en place, il vaut mieux utiliser les rails LGB qui sont plus résistants que les Märklin (qui sont plus réalistes).
    Sinon, je pourrais également faire circuler ma 2D2 sur un réseau de club bien qu'en France contrairement de l’Allemagne et à la Suisse, l'échelle 1 soit peu développée (au profit de l'échelle O).
    Le marché allemand (Ebay.de) à l'échelle 1 est assez développé et pas trop cher si on attend les bonnes opportunités.

    Pour l'instant, j'ai avancé sur la partie électronique et logicielle, mais pas trop sur la partie mécanique de mon projet de 2D2.
    Il faut dire que pour réaliser les roues (diamètre 60 mm), il faut que j'usine de l'inox (304L pour les connaisseurs : le 303 est plus usinable, mais introuvable) et les fraises cassent comme à Gravelotte.



    Benoit92

    • Full Member
    • ***
    • Messages: 185
      • Voir le profil
    Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « Réponse #155 le: juillet 25, 2018, 12:13:07 am »
    J'essaye de faire dialoguer l'Arduino Nano avec le Teensy 3.2 avec une liaison série.
    Mais, je ne récupère rien sur le moniteur série monté sur le Teensy via la liaison USB -PC.
    De plus, je récupère le message suivant :
    Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space

    Code coté Arduino Nano (pin 7 et 8 )
    #include <SoftwareSerial.h>
    SoftwareSerial mySerial(7, 8); // RX, TX
    void setup()
    {
      Serial.begin(9600); // USB moniteur série
      mySerial.begin (9600);// liaison série vers Teensy
    }
    void loop()
    {
    mySerial.write('a');// son démarrage moteur
    }

    Code coté Teensy (pin Rx1, Tx1)
    #include <SoftwareSerial.h>
    int Data
    void setup() {
        Serial.begin(9600); // USB-PC
        while (!Serial && millis()<500 );
       Serial1.begin(9600); // liaison série vers Arduino
        while (!Serial1 && millis()<500 );
    }

    void loop() {
      if ( Serial1.available() ) {
        Data = Serial1.read();
        Serial.println(Data);
    }

    Nota : Je branche sur le PC soit la prise USB vers Arduino, soit USB vesr Teensy

    Jean-Luc

    • Global Moderator
    • Hero Member
    • *****
    • Messages: 1265
      • Voir le profil
    Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « Réponse #156 le: juillet 25, 2018, 10:53:18 am »
    Bonjour,

    C'est toi qui bloque le CPU dans playFile1 en attendant que le son finisse de jouer :

         // Simply wait for the file to finish playing.
         while (playFlashRaw1.isPlaying()) {
         }

    Benoit92

    • Full Member
    • ***
    • Messages: 185
      • Voir le profil
    Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « Réponse #157 le: juillet 25, 2018, 11:16:35 am »
    Merci Jean-Luc,
    Par contre, je ne sais pas trop comment faire sur le Teensy  pour "et en même temps":
     - Jouer le son : playFlashRaw1
     - Recevoir les commandes de son (provenant de l'arduino) via SoftwareSerial mySerial(7, 8 ); // RX, T (sur le teensy)

    Nota :
    Quand je branche directement le Teensy sur le PC (liaison USB) et que je tape les commande 'a', 'z', ....... cela marche très bien.
    « Modifié: juillet 25, 2018, 01:15:45 pm par Benoit92 »

    Jean-Luc

    • Global Moderator
    • Hero Member
    • *****
    • Messages: 1265
      • Voir le profil
    Re : Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « Réponse #158 le: juillet 25, 2018, 03:05:42 pm »
    Merci Jean-Luc,
    Par contre, je ne sais pas trop comment faire sur le Teensy  pour "et en même temps":
     - Jouer le son : playFlashRaw1
     - Recevoir les commandes de son (provenant de l'arduino) via SoftwareSerial mySerial(7, 8 ); // RX, T (sur le teensy)

    Tout d'abord il faut enlever le while qui attend la fin du son et qui bloque la réception des commandes

    Ensuite que veux tu faire ?

    Une nouvelle commande doit-elle être mise en attente en attendant que le son termine ou bien le son en cours (si il y en a un) doit-il s'arrêter pour laisser la place au nouveau ?

    Benoit92

    • Full Member
    • ***
    • Messages: 185
      • Voir le profil
    Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « Réponse #159 le: juillet 25, 2018, 06:36:20 pm »
    1) J'ai essayé d'enlever le while, mais le son est catastrophique (cela donne un grésillement).

    2) J'ai généré des sons globalement d'une durée de 1 à 2 s et donc je peux choisir l'option :
    "Une nouvelle commande doit-elle être mise en attente en attendant que le son termine"

    3) je vois sur certains exemples (pas tous) , que l'instruction "pinMode" est utilisée (je ne l'ai pas mise dans mon code) :
    Ci-joint un exemple avec "pinMode"
    // include the SoftwareSerial library so you can use its functions:
    #include <SoftwareSerial.h>

    #define rxPin 00
    #define txPin 1

    // set up a new serial port
    SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

    void setup()  {
      // define pin modes for tx, rx:
      pinMode(rxPin, INPUT);
      pinMode(txPin, OUTPUT);
      // set the data rate for the SoftwareSerial port
      mySerial.begin(9600);
      Serial.begin(9600);
    }

    void loop() {
      if (mySerial.available()>0){
      Serial.print(mySerial.read());
    }
      if (Serial.available()>0){
      mySerial.print(Serial.read());
    }
    }

    Benoit92

    • Full Member
    • ***
    • Messages: 185
      • Voir le profil
    Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « Réponse #160 le: juillet 25, 2018, 10:37:45 pm »
    Bon, maintenant, cela marche (petite inversion de fil).
    Vu avec un oscilloscope USB que je sors quand j'ai un "gros" problème.
    La liaison série entre l'Arduino Nano et le Teensy 3.2 est maintenant debuggé.

    J'ai ajouté également "Serial1.clear();" car sinon, le Teensy ne voit pas les changements de commande de lecture de fichier (il reste toujours sur le même fichier).

    Donc, ci-joint, le code du Teensy qui fonctionne :

    // Diesel Henschel DHG 500
    // Teensy 3.2 + SPI Flash + Serial1(-> Arduino Nano)
    #include <Audio.h>
    #include <Wire.h>
    #include <SPI.h>
    #include <SD.h>
    #include <SerialFlash.h>
    #include <SoftwareSerial.h>

        //'*' Type on Serial Monitor
        //DHG_STA.TRW = 'a' Engine start
        //DHG_STO.TRW = 'z' Stop Engine
        //DHG_HOR.TRW = 'e' Horn
        //DHG_SPE.TRW = 'r' Driving
        //DHG_BRA.TRW = 't' Brake
        //DHG_IDL.TRW = 'y' Idle
        //DHG_UNC.TRW = 'u' Uncoupling
        //DHG_ACC.TRW = 'i' Acceleration

    //SoftwareSerial mySerial(0, 1); // RX, TX

    const int FLASH_CHIP_SELECT = 10; 
    #include <Audio.h>
    #include <Wire.h>
    #include <SPI.h>
    #include <SD.h>
    #include <SerialFlash.h>

    // GUItool: begin automatically generated code
    AudioPlaySerialflashRaw  playFlashRaw1;  //xy=228,273
    AudioOutputAnalog        dac1;           //xy=751,337
    AudioConnection          patchCord1(playFlashRaw1, 0, dac1, 0);
    // GUItool: end automatically generated code

    char Data;     // Read serial data
    char PrevData;  // Read previous serial data
    int i = 0;
    int Led13 = 13;

    void setup() {
        digitalWrite(Led13, HIGH);
        pinMode(Led13, OUTPUT);
        Serial.begin(9600); // Serial setup
        while (!Serial && millis()<500 );
        Serial.println("Diesel Henschel DHG 500");
       
        Serial1.begin(9600); // Serial1 setup
        while (!Serial1 && millis()<500 );
        AudioMemory(50);//
    //    analogReference(EXTERNAL);// 3,3V Amplitude DAC

    //************************************
    //  Set up SPI Teensy without audio Card
      SPI.setMOSI(11); //7
      SPI.setMISO(12);
      SPI.setSCK(14);
    //************************************
        delay(2000);
        if (!SerialFlash.begin(FLASH_CHIP_SELECT)) {
            while (1){
                Serial.println ("Cannot access SPI Flash chip");
                delay (10000);
            }
        }
    }
        void playFile1(const char *filename)// Play audio file function
        {
          SerialFlashFile ff = SerialFlash.open(filename);
          Serial.print("Playing file1: ");
          Serial.println(ff);
          playFlashRaw1.play(filename);
         // Simply wait for the file to finish playing.
         while (playFlashRaw1.isPlaying()) {
         }
        }
       
    void loop() {

      if ( Serial1.available() ) {
        Data = Serial1.read();
        Serial1.clear();
        Serial.println(Data);
      }
      else {
        Serial.println("Nothing");
      }

      switch (Data) {
           case 'a':{  // Play Soundfile in loop : Start
                playFile1("DHG_STA.TRW");
                                  Serial.println("DHG_STA.TRW");
                Data = 'y';
                playFile1("DHG_IDL.TRW");
                                  Serial.println("DHG_IDL.TRW");
            break;
           }
          case 'z':{  // Play Soundfile in loop : Stop

               playFile1("DHG_STO.TRW");
                                  Serial.println("DHG_STO.TRW");
               Data = 'o';
          break;
          }   
          case 'e':{   // Play Soundfile only once : Horn 
               playFile1("DHG_HOR.TRW");
                                  Serial.println("DHG_HOR.TRW");
               Data=PrevData; // Continue with previous soundfile
               Serial.println(Data);
          break;
               }
         case 'r':{  // Play Soundfile in loop : Full Speed
               PrevData = 'r';
               playFile1("DHG_SPE.TRW");
                                  Serial.println("DHG_SPE.TRW");
         break;
        }   
         case 't':{  // Play Soundfile in loop : Brake 
               PrevData = 't';
               playFile1("DHG_BRA.TRW");
               Data = 'y';
               playFile1("DHG_IDL.TRW");
         break;
        } 
         case 'y':{  // Play Soundfile in loop : Idle
             PrevData = 'y';
             playFile1("DHG_IDL.TRW");
                                 Serial.println("DHG_IDL.TRW");
         break;
        }
         case 'u':{  // Play Soundfile in loop : Uncoupling
             PrevData = 'u';
             playFile1("DHG_UNC.TRW");
                                 Serial.println("DHG_UNC.TRW");
             Data = 'y';
             playFile1("DHG_IDL.TRW");
                                  Serial.println("DHG_IDL.TRW");
         break;
        }
         case 'i':{  // Play Soundfile in loop : Uncoupling
             PrevData = 'i';
             playFile1("DHG_ACC.TRW");
                                 Serial.println("DHG_UNC.TRW");
             Data = 'r';
             playFile1("DHG_IDL.TRW");
                                  Serial.println("DHG_IDL.TRW");
         break;
        }
     }
    }