Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - Benoit92

Pages: 1 2 [3] 4 5 ... 14
31
Composants / Re : Teensy 3.1, 3.2 - Sonorisation locomotive
« 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()) {
         }
        }

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






    32
    Composants / Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « le: juin 02, 2018, 07:28:49 pm »
    Si je change la fréquence sur une Pin, est ce que je change également la fréquence des Pins associées au même Timer suivant le tableau suivant ?:
    Teensy 3.2
    Timer                          Pin              Default Frequency
    FTM0   5, 6, 9, 10, 20, 21, 22, 23          488.28 Hz
    FTM1   3, 4                                            488.28 Hz
    FTM2   25, 32                                        488.28 Hz

    33
    Composants / Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « le: juin 02, 2018, 06:19:14 pm »
    Concernant la commande moteur, cela semble à priori assez simple : pas besoin de modifier un timer (FTM0, FTM1 ou FTM2).

     void setup() {
          analogWriteFrequency(pin, frequency);// frequency in Hz
         analogWrite(pin, x) // 0<x<256 (0-100%) with analogWriteResolution(8); (8 = default value)
        }

    34
    Composants / Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « le: juin 02, 2018, 12:07:21 am »
    Je peux donc mettre le signal DCC  sur l'entrée 2 du Teensy 3.2 (il n y a rien suivant le schémas Teensy 3.2 pinout).
    Ce qui donnerait : Dcc.pin(2, 2, 0);

    NmraDcc::pin( uint8_t ExtIntNum, uint8_t ExtIntPinNum, uint8_t EnablePullup)


    35
    Composants / Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « le: juin 01, 2018, 11:35:03 am »
    Si je comprends bien :
    NmraDcc. cpp
    void NmraDcc::pin( uint8_t ExtIntNum, uint8_t ExtIntPinNum, uint8_t EnablePullup)
    Dans mon sketch 'locomotive.ino', je dois donc ajouter la ligne suivante dans le setup.
    Locomotive.ino
    setup()
    // Setup which External Interrupt, the Pin it's associated with that we're using and enable the Pull-Up
    Dcc.pin(0, 1, 0);

    36
    Composants / Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « le: mai 31, 2018, 10:35:34 pm »
    A priori, le signal Dcc doit être branché sur la pin 1 (TX1) du Teensy 3.2 ?
    Extrait de NmraDcc.cpp
     #elif defined(__arm__) && (defined(__MK20DX128__) || defined(__MK20DX256__))
            // Teensys 3.x
            #define MODE_TP1 pinMode( A1,OUTPUT )   // A1= PortC, Bit0
            #define SET_TP1  GPIOC_PSOR = 0x01
            #define CLR_TP1  GPIOC_PCOR = 0x01
            #define MODE_TP2 pinMode( A2,OUTPUT )   // A2= PortB Bit0
            #define SET_TP2  GPIOB_PSOR = 0x01
            #define CLR_TP2  GPIOB_PCOR = 0x01
            #define MODE_TP3 pinMode( A3,OUTPUT )   // A3 = PortB Bit1
            #define SET_TP3  GPIOB_PSOR = 0x02
            #define CLR_TP3  GPIOB_PCOR = 0x02
            #define MODE_TP4 pinMode( A4,OUTPUT )   // A4 = PortB Bit3
            #define SET_TP4  GPIOB_PSOR = 0x08
    #define CLR_TP4 GPIOB_PCOR = 0x08

    37
    Composants / Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « le: mai 30, 2018, 11:55:52 pm »

    Je donne les liens car :
    Le message dépasse la limite de caractères autorisée (20000 caractères permis).

    NmraDcc.h
    https://github.com/mrrwa/NmraDcc/blob/master/NmraDcc.h

    NmraDcc.cpp
    https://github.com/mrrwa/NmraDcc/blob/master/NmraDcc.cpp

    38
    Composants / Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « le: mai 30, 2018, 11:47:27 pm »
    Ok, Merci.
    Si je reste sur l'option Teensy, il faudrait que je regarde dans la bibliothèque NmraDcc quelles sont les instructions qui sont différentes de celle de l'Arduino.
    Je pense que cela va concerner principalement les instructions relatives aux interruptions ? et aux modifications des timers (nécessaire pour piloter le pont en H).
    Le code suivant semble compiler sans erreur avec le teensy.
    #include <NmraDcc.h>
    #include <Servo.h>
    void setup() {
      // put your setup code here, to run once:
    }
    void loop() {
      // put your main code here, to run repeatedly:

    }

    Ci-joint, pour information (en deux envois), NmraDcc.h et NmraDcc.cpp.

    NmraDcc.h
    //------------------------------------------------------------------------
    //
    // Model Railroading with Arduino - NmraDcc.h
    //
    // Copyright (c) 2008 - 2105 Alex Shepherd
    //
    // This source file is subject of the GNU general public license 2,
    // that is available at the world-wide-web at
    // http://www.gnu.org/licenses/gpl.txt
    //
    //------------------------------------------------------------------------
    //
    // file:      NmraDcc.h
    // author:    Alex Shepherd
    // webpage:   http://mrrwa.org/
    // history:   2008-03-20 Initial Version
    //            2011-06-26 Migrated into Arduino library from OpenDCC codebase
    //            2014 Added getAddr to NmraDcc  Geoff Bunza
    //            2015-11-06 Martin Pischky (martin@pischky.de):
    //                       Experimental Version to support 14 speed steps
    //                       and new signature of notifyDccSpeed and notifyDccFunc
    //
    //------------------------------------------------------------------------
    //
    // purpose:   Provide a simplified interface to decode NMRA DCC packets
    //   and build DCC MutliFunction and Stationary Decoders
    //
    //------------------------------------------------------------------------

    // Uncomment the following Line to Enable Service Mode CV Programming
    #define NMRA_DCC_PROCESS_SERVICEMODE

    // Uncomment the following line to Enable MutliFunction Decoder Operations
    #define NMRA_DCC_PROCESS_MULTIFUNCTION

    // Uncomment the following line to Enable 14 Speed Step Support
    //#define NMRA_DCC_ENABLE_14_SPEED_STEP_MODE

    #if defined(ARDUINO) && ARDUINO >= 100
    #include "Arduino.h"
    #else
    #include "WProgram.h"
    #endif

    #include "EEPROM.h"

    #ifndef NMRADCC_IS_IN
    #define NMRADCC_IS_IN

    #define MAX_DCC_MESSAGE_LEN 6    // including XOR-Byte

    typedef struct
    {
    uint8_t Size ;
    uint8_t PreambleBits ;
    uint8_t Data[MAX_DCC_MESSAGE_LEN] ;
    } DCC_MSG ;

    //--------------------------------------------------------------------------
    //  This section contains the NMRA Assigned DCC Manufacturer Id Codes that
    //  are used in projects
    //
    //  This value is to be used for CV8
    //--------------------------------------------------------------------------

    #define MAN_ID_JMRI             0x12
    #define MAN_ID_DIY              0x0D
    #define MAN_ID_SILICON_RAILWAY  0x21

    //--------------------------------------------------------------------------
    //  This section contains the Product/Version Id Codes for projects
    //
    //  This value is to be used for CV7
    //
    //  NOTE: Each Product/Version Id Code needs to be UNIQUE for that particular
    //  the DCC Manufacturer Id Code
    //--------------------------------------------------------------------------

    // Product/Version Id Codes allocated under: MAN_ID_JMRI
     
    // Product/Version Id Codes allocated under: MAN_ID_DIY

    // Standard CV Addresses
    #define CV_ACCESSORY_DECODER_ADDRESS_LSB       1
    #define CV_ACCESSORY_DECODER_ADDRESS_MSB       9

    #define CV_MULTIFUNCTION_PRIMARY_ADDRESS       1
    #define CV_MULTIFUNCTION_EXTENDED_ADDRESS_MSB 17
    #define CV_MULTIFUNCTION_EXTENDED_ADDRESS_LSB 18

    #define CV_VERSION_ID                          7
    #define CV_MANUFACTURER_ID                     8
    #define CV_29_CONFIG                          29

    #if defined(ESP8266)
    #include <spi_flash.h>
    #define MAXCV     SPI_FLASH_SEC_SIZE
    #elif defined( __STM32F1__)
    #define MAXCV (EEPROM_PAGE_SIZE/4 - 1) // number of storage places (CV address could be larger
    // because STM32 uses virtual adresses)
    #else
    #define MAXCV    E2END      // the upper limit of the CV value currently defined to max memory.
    #endif

    typedef enum {
        CV29_LOCO_DIR            = 0b00000001, /** bit 0: Locomotive Direction: "0" = normal, "1" = reversed */
        CV29_F0_LOCATION         = 0b00000010, /** bit 1: F0 location: "0" = bit 4 in Speed and Direction instructions, "1" = bit 4 in function group one instruction */
        CV29_APS = 0b00000100, /** bit 2: Alternate Power Source (APS) "0" = NMRA Digital only, "1" = Alternate power source set by CV12 */
        CV29_ADV_ACK             = 0b00001000, /** bit 3: ACK, Advanced Acknowledge mode enabled if 1, disabled if 0 */
        CV29_SPEED_TABLE_ENABLE  = 0b00010000, /** bit 4: STE, Speed Table Enable, "0" = values in CVs 2, 4 and 6, "1" = Custom table selected by CV 25 */
        CV29_EXT_ADDRESSING      = 0b00100000, /** bit 5: "0" = one byte addressing, "1" = two byte addressing */
        CV29_OUTPUT_ADDRESS_MODE = 0b01000000, /** bit 6: "0" = Decoder Address Mode "1" = Output Address Mode */
        CV29_ACCESSORY_DECODER   = 0b10000000, /** bit 7: "0" = Multi-Function Decoder Mode "1" = Accessory Decoder Mode */
    } CV_29_BITS;

    typedef enum {
    #ifdef NMRA_DCC_ENABLE_14_SPEED_STEP_MODE
        SPEED_STEP_14 = 15, /**< ESTOP=0, 1 to 15 */
    #endif
        SPEED_STEP_28 = 29, /**< ESTOP=0, 1 to 29 */
        SPEED_STEP_128 = 127 /**< ESTOP=0, 1 to 127 */
    } DCC_SPEED_STEPS;

    typedef enum {
        DCC_DIR_REV = 0,     /** The locomotive to go in the reverse direction */
        DCC_DIR_FWD = 1,     /** The locomotive should move in the forward direction */
    } DCC_DIRECTION;

    typedef enum {
        DCC_ADDR_SHORT,      /** Short address is used. The range is 0 to 127. */
        DCC_ADDR_LONG,       /** Long Address is used. The range is 1 to 10239 */
    } DCC_ADDR_TYPE;

    typedef enum
    {
    FN_0_4 = 1,
    FN_5_8,
    FN_9_12,
    FN_13_20,
    FN_21_28,
    #ifdef NMRA_DCC_ENABLE_14_SPEED_STEP_MODE
      FN_0 /** function light is controlled by base line package (14 speed steps) */
    #endif 
    } FN_GROUP;

    #define FN_BIT_00 0x10
    #define FN_BIT_01 0x01
    #define FN_BIT_02 0x02
    #define FN_BIT_03 0x04
    #define FN_BIT_04 0x08

    #define FN_BIT_05 0x01
    #define FN_BIT_06 0x02
    #define FN_BIT_07 0x04
    #define FN_BIT_08 0x08

    #define FN_BIT_09 0x01
    #define FN_BIT_10 0x02
    #define FN_BIT_11 0x04
    #define FN_BIT_12 0x08

    #define FN_BIT_13 0x01
    #define FN_BIT_14 0x02
    #define FN_BIT_15 0x04
    #define FN_BIT_16 0x08
    #define FN_BIT_17 0x10
    #define FN_BIT_18 0x20
    #define FN_BIT_19 0x40
    #define FN_BIT_20 0x80

    #define FN_BIT_21 0x01
    #define FN_BIT_22 0x02
    #define FN_BIT_23 0x04
    #define FN_BIT_24 0x08
    #define FN_BIT_25 0x10
    #define FN_BIT_26 0x20
    #define FN_BIT_27 0x40
    #define FN_BIT_28 0x80

    //#define DCC_DBGVAR
    #ifdef DCC_DBGVAR
    typedef struct countOf_t {
        unsigned long Tel;
        unsigned long Err;
    }countOf_t ;

    extern struct countOf_t countOf;
    #endif

    class NmraDcc
    {
      private:
        DCC_MSG Msg ;
       
      public:
        NmraDcc();

    // Flag values to be logically ORed together and passed into the init() method
    #define FLAGS_MY_ADDRESS_ONLY 0x01 // Only process DCC Packets with My Address
    #define FLAGS_OUTPUT_ADDRESS_MODE 0x40  // CV 29/541 bit 6
    #define FLAGS_DCC_ACCESSORY_DECODER 0x80  // CV 29/541 bit 7
    void pin( uint8_t ExtIntNum, uint8_t ExtIntPinNum, uint8_t EnablePullup);
      void init( uint8_t ManufacturerId, uint8_t VersionId, uint8_t Flags, uint8_t OpsModeAddressBaseCV );
      void initAccessoryDecoder( uint8_t ManufacturerId, uint8_t VersionId, uint8_t Flags, uint8_t OpsModeAddressBaseCV );
      uint8_t process();
      uint8_t getCV( uint16_t CV );
      uint8_t setCV( uint16_t CV, uint8_t Value);
    uint8_t isSetCVReady( void );
    uint16_t getAddr(void);

    // #define DCC_DEBUG
    #ifdef DCC_DEBUG
    uint8_t getIntCount(void);
    uint8_t getTickCount(void);
    uint8_t getBitCount(void);
    uint8_t getState(void);
      uint8_t getNestedIrqCount(void);
    #endif

    };

    /************************************************************************************
        Call-back functions
    ************************************************************************************/

    #if defined (__cplusplus)
    extern "C" {
    #endif

    extern void notifyDccReset(uint8_t hardReset ) __attribute__ ((weak));
    extern void notifyDccIdle(void) __attribute__ ((weak));

    extern void notifyDccSpeed( uint16_t Addr, DCC_ADDR_TYPE AddrType, uint8_t Speed, DCC_DIRECTION Dir, DCC_SPEED_STEPS SpeedSteps ) __attribute__ ((weak));
    extern void notifyDccSpeedRaw( uint16_t Addr, DCC_ADDR_TYPE AddrType, uint8_t Raw) __attribute__ ((weak));

    extern void notifyDccFunc( uint16_t Addr, DCC_ADDR_TYPE AddrType, FN_GROUP FuncGrp, uint8_t FuncState) __attribute__ ((weak));

    extern void notifyDccAccState( uint16_t Addr, uint16_t BoardAddr, uint8_t OutputAddr, uint8_t State ) __attribute__ ((weak));
    extern void notifyDccAccTurnoutBoard( uint16_t BoardAddr, uint8_t OutputPair, uint8_t Direction, uint8_t OutputPower ) __attribute__ ((weak));
    extern void notifyDccAccTurnoutOutput( uint16_t Addr, uint8_t Direction, uint8_t OutputPower ) __attribute__ ((weak));

    extern void notifyDccSigState( uint16_t Addr, uint8_t OutputIndex, uint8_t State) __attribute__ ((weak));

    extern void    notifyDccMsg( DCC_MSG * Msg ) __attribute__ ((weak));

    extern uint8_t notifyCVValid( uint16_t CV, uint8_t Writable ) __attribute__ ((weak));
    extern uint8_t notifyCVRead( uint16_t CV) __attribute__ ((weak));
    extern uint8_t notifyCVWrite( uint16_t CV, uint8_t Value) __attribute__ ((weak));
    extern uint8_t notifyIsSetCVReady(void) __attribute__ ((weak));
    extern void    notifyCVChange( uint16_t CV, uint8_t Value) __attribute__ ((weak));
    extern void    notifyCVResetFactoryDefault(void) __attribute__ ((weak));

    extern void    notifyCVAck(void) __attribute__ ((weak));

    #if defined (__cplusplus)
    }
    #endif

    #endif


    39
    Composants / Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « le: mai 30, 2018, 05:46:10 pm »
    J'ai 2 possibilités :
    1) Soit tout mettre sur un Arduino :
     - Librairie NmraDcc --> Ok
     - Commande Moteur 125 Hz par modification du Timer 2 -->Ok,
     - Feux éclairage Ok,
     - Bruitage en PWM Ok,
    mais je ne sais pas si j'arriverai à gérer en même temps le bruitage et le décodage de la trame DCC (asynchrone).

    2) Soit tout mettre sur un Teensy
     - Librairie NmraDcc --> NOk
    - Commande Moteur -> Il faut que je puisse régler le PWM à 125 Hz (après essais, il s'avère que le moteur répond bien à cette fréquence) ,
     - Feux éclairage Ok,
     - Bruitage en TRW (wave avec header simplifié) -->Ok),

    40
    Composants / Re : Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « le: mai 30, 2018, 01:24:15 pm »
    Le Teensy 3.2 (18x36 mm) est plus petit qu’un Nano donc pour gagner de la place...
    Le Pro Mini a une taille équivalente (18x33 mm) et la partie USB n’est plus nécessaire une fois le projet terminé.

    Mais côté mémoire je vois mal comment se contenter de 32k de flash (AtMega328) par rapport aux 256k du Teensy, surtout pour la Ram (2k contre 64k).
    C'est vrai, mais la bibliothèque NmraDcc (qui permet de décoder les trames DCC) n'est pas compatible avec le Teensy.
    Donc, je suis obligé de rester sur Arduino pour assurer le décodage de la trame DCC.
    J'ai déjà monté l'Arduino Nano sur une locomotive mais je n'assure que les fonctions commande moteur (pont H), éclairages et feux.

    ESP32 ou Arduino Nano : je n'ai pas de préférence : j'ai déjà  5 Nano acheté pour 10,00 € chez Aliexpress.

    41
    Composants / Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « le: mai 29, 2018, 11:55:44 pm »
    Je vais essayer avec la librairie Teensy Audio.h : on ne sait jamais !
    Sinon, je pense utiliser le principe suivant : (j'avais comparé plusieurs techniques plus avant dans ce sujet) :
    2) Arduino + EncodeAudio + Bibliothèque <PCM.h> + sortie PWM
    Avantages :
    Qualité de son moyenne mais acceptable pour réaliser du bruitage (8 bits – 8kHz)
    Fichiers « son » codé avec EncodeAudio -> fichiers « son » de petite taille
    Inconvénients :
    Essentiellement lié au fait que l’arduino ne possède que peu de mémoire (Flash ou RAM)

    Les"sons" seront chargés dans une  SPI Flash Winbond 25Q64BVSIG (8 Mo).
    Je pourrais essayer d'augmenter la résolution et la fréquence d'échantillonnage.
    Je vais essayer également de tout faire tenir sur un Arduino Nano (commande moteur, éclairages diverses, bruitage) car même en travaillant à l'échelle 1, il n'y a pas tellement de place (en particulier sur la BR80= petite locomotive à vapeur 030).
    Il faut que je case dans la locomotive :

     1 - Un Arduino Nano
     2 - Un pont en H (pour les moteurs)
     3 - une minicarte avec la SPI Flash Winbond 25Q64BVSIG
     4 - Une petite carte amplificatrice (son)
     5 - Un haut-parleur
     6 - Une carte de décodage Dcc + alimentation 5V + alimentation 16 V (pour les moteurs)




    42
    Composants / Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « le: mai 29, 2018, 09:50:58 pm »
    Bonjour,
    Si j'utilise à la place du Teensy, un arduino pour lire des fichiers "son" à partir d'une SPI Flash,
    comment devrais-je procéder pour :
     - Écrire dans la SPI Flash à partir d'un fichier "son" qui est situé sur le PC
     - Lire ce fichier "son" sur l'arduino (à partir de son nom de fichier)
    Merci

    43
    Composants / Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « le: mai 24, 2018, 09:12:46 pm »
    Bon, voilà, ça marche bien. C'est un peu béton, mais ça marche.
    Je pense que ce code pourrait être transcrit pour un Arduino en utilisant des fichiers codés en PWM.
    Pour l'instant, je n'utilise pas encore le mixage de deux fichiers "son": Il faut que je regarde sur le site PRJC Teensy.
    #include <Audio.h>
    #include <Wire.h>
    #include <SPI.h>
    #include <SD.h>
    #include <SerialFlash.h>

        //A0A8B14.TRW = 'a' Engine start - Pantograph up
        //A1AB814.TRW = 'z' Compressor + air release
        //A2AB814.TRW = 'e' Horn
        //A3AB814.TRW = 'r' Start driving
        //A4AB814.TRW = 't' Driving
        //A5AB814.TRW = 'y' Brake
        //A6AB814.TRW = 'u' Compressor - Air release + engine start
        //A7AB814.TRW = 'i' Uncoupling
        //A8AB814.TRW = 'o' Stop driving
        //A9AB814.TRW = 'p' Stand-by engine

    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 lu;     // Données lu liaison série
    int Oldlu;  // Données lu liaison série

    void setup() {
        Serial.begin(9600); // Initialisation liaison série
        while (!Serial && millis()<500 );
        AudioMemory(50);// Réservation espace mémoire
        analogReference(EXTERNAL);//Configurer Amplitude 3,3V pour le 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)// Fonction lecture fichier audio
        {
          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() ) {
        lu = Serial.read();
        Serial.println(lu);
      }
      else {
        Serial.println("Rien");
      }

    switch (lu) {
       case 'a':{  // Fichier à lire en boucle 
         Oldlu = 'a';   
         playFile1("A0AB814.TRW");
         break;
       }
       case 'z':{  // Fichier à lire en boucle 
          Oldlu = 'z';  // Lecture en boucle 
          playFile1("A1AB814.TRW");
          break;
       }   
               case 'e':{   // Fichier à lire une seule fois   
               playFile1("A2AB814.TRW");
               lu=Oldlu; // reprise fichier précédent
               Serial.println(lu);
               break;
               }
        case 't':{  // Fichier à lire en boucle 
         Oldlu = 't';
         playFile1("A4A814.TRW");
         break;
        }   
        case 'y':{  // Fichier à lire en boucle 
         Oldlu = 'y';
         playFile1("A5AB814.TRW");
          break;
        }   
        case 'u':{  // Fichier à lire en boucle 
          Oldlu = 'u'; 
          playFile1("A6AB814.TRW");
         break;
        }       
        case 'i':{  // Fichier à lire en boucle   
          Oldlu = 'i';
          playFile1("A7AB814.TRW");
          break;
        }   
        case 'o':{  // Fichier à lire en boucle 
          Oldlu = 'o'; 
          playFile1("A8AB814.TRW");
          break;
        } 
        case 'p':{  // Fichier à lire en boucle 
          Oldlu = 'p'; 
          playFile1("A9A814.TRW");
          break;
       }     
      }
    }

    44
    Composants / Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « le: mai 23, 2018, 09:04:41 pm »
    Ok, merci Jean-Luc.

    45
    Composants / Re : Teensy 3.1, 3.2 - Sonorisation locomotive
    « le: mai 22, 2018, 11:29:03 pm »
    Bonjour,
    Le code ci-dessous fonctionne bien.
    Il est possible de jouer en boucle le son sélectionné en appuyant sur les touches "a", "z", "e"," r", "t", "y", "u", "i", "o", ou "p" à partir du moniteur série.
    Le son tourne en boucle tant que je n'ai pas appuyé sur une autre touche.

    Je souhaiterai que lorsque j'appuie sur la touche : 'e' Horn, ce fichier soit lu une seule fois et qu'ensuite, le fichier lu précédemment soit repris en boucle.
    Exemple :
    1) 't' Driving en boucle (par appui sur 't')
    2) 'e' Horn (par appui sur 'e') : Ce fichier ne doit être lu qu'une seule fois.
    3) Reprise de la lecture du fichier précédent en boucle, c'est à dire 't'Driving dans cet exemple, mais cela peut être un autre fichier.

    Je ne vois pas trop par quel mécanisme, je pourrai obtenir ce résultat ?

    #include <Audio.h>
    #include <Wire.h>
    #include <SPI.h>
    #include <SD.h>
    #include <SerialFlash.h>
        //A0A8B14.TRW = 'a' Engine start - Pantograph up
        //A1AB814.TRW = 'z 'Compressor + air release
        //A2AB814.TRW = 'e 'Horn
        //A3AB814.TRW = 'r' Start driving
        //A4AB814.TRW = 't' Driving
        //A5AB814.TRW = 'y' Brake
        //A6AB814.TRW = 'u' Compressor - Air release + engine start
        //A7AB814.TRW = 'i' Uncoupling
        //A8AB814.TRW = 'o' Stop driving
        //A9AB814.TRW = 'p' Stand-by engine

    const int FLASH_CHIP_SELECT = 10; 
    // 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 lu;

    void setup() {
        Serial.begin(9600);
        while (!Serial && millis()<500 );
        AudioMemory(50);
        analogReference(EXTERNAL);

    //************************************
    //  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 playFile(const char *filename)
    {
      SerialFlashFile ff = SerialFlash.open(filename);
      Serial.print("Playing file: ");
      Serial.println(ff);

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

    void loop() {
    if ( Serial.available() ) {
        lu = Serial.read();
        Serial.println(lu);
      }
      else {
        Serial.println("Rien");
      }

    switch (lu) {
      case 'a':{
        playFile("A0AB814.TRW");
        break;
       }
      case 'z':{ 
        playFile("A1AB814.TRW");
        break;
       }   
      case 'e':{   
        playFile("A2AB814.TRW");
        break;
       }
      case 't':{ 
        playFile("A4A814.TRW");
        break;
       }   
      case 'y':{ 
        playFile("A5AB814.TRW");
        break;
       }   
      case 'u':{ 
        playFile("A6AB814.TRW");
        break;
       }       
      case 'i':{ 
        playFile("A7AB814.TRW");
        break;
       }   
      case 'o':{ 
        playFile("A8AB814.TRW");
        break;
       } 
      case 'p':{ 
        playFile("A9A814.TRW");
        break;
       }     
        //  default:
        // statements
      }
    }

    Nota : A0A8B14.TRW est un fichier "son" avec l'extension "TRW" compatible avec la bibliothèque du Teensy.

    Pages: 1 2 [3] 4 5 ... 14