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

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1168
    • Voir le profil
Re : Teensy 3.1, 3.2 - Sonorisation locomotive
« Réponse #90 le: mars 14, 2018, 09:09:17 am »
Les branchements utilisés pour le test hardware qui rapporte un succès sont ok. Il n’y a visiblement aucun soucis entre la Teensy et la flash.

Concernant les broches alternatives, elles existent effectivement mais ce ne sont as n’importe lesquelles. Je suis très surpris que la classe SPI du Teensy permette de spécifier n’importe quelle broche. En aucun cas on ne peut placer le SPI n’importe où.

Python est a la version 2.7 sur ta machine. L’erreur se produit à l’intérieur de PySerial, pas dans le script rawfile_uploader.py. Donc il n’y a pas d’incompatibilité de version entre le script et python.

Je pense que sous Windows tu peux avoir un état de ce qui est branché sur l’USB. Si tu branches le Teensy et que tu regardes cet état qu’est ce qu’on y lit ? Y a t il des droits associés aux ports série virtuels ?

Benoit92

  • Full Member
  • ***
  • Messages: 169
    • Voir le profil
Re : Teensy 3.1, 3.2 - Sonorisation locomotive
« Réponse #91 le: mars 15, 2018, 12:02:00 am »
Je vais voir cela.
Auparavant, j'avais tout rechargé (IDE Arduino + add-on teensy + Python 2.7 + Pyserial) sur un autre PC (PC fixe +Windows 7).
Je travaille normalement sur un portable ASUS 550C avec Windows 10.
J'ai exactement les mêmes messages d'erreur dans l'écran de commande Windows que ce soit avec Windows 7 ou 10 .
J'ai l'impression que c'est la ligne 80 :
ser.write("".join(encoded))du script "rawfile-uploader.py" qui semble poser des problèmes à windows
« Modifié: mars 15, 2018, 12:27:39 am par Benoit92 »

msport

  • Sr. Member
  • ****
  • Messages: 375
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Re : Teensy 3.1, 3.2 - Sonorisation locomotive
« Réponse #92 le: mars 15, 2018, 10:31:19 am »
Aucune compétence sur le sujet lui-même, mais cela mérite de regarder dans le Gestionnaire de périphériques les ports COM ouverts et de désactiver provisoirement ceux qui ne servent pas. J'ai eu un problème du même genre avec processing qui n'utilisait pas le bon.
Cordialement

Benoit92

  • Full Member
  • ***
  • Messages: 169
    • Voir le profil
Re : Teensy 3.1, 3.2 - Sonorisation locomotive
« Réponse #93 le: mars 16, 2018, 10:41:57 am »
Merci,
J'ai vérifié le formalisme du langage Python et j'ai modifié les lignes suivantes :
f = open(filename, "rb") --> f = open(filename, 'rb')et
ser.write("".join(encoded)) --> ser.write("".(encode())
Le script rawfile-uploader.py ne plante plus et indique :
All files uploaded (s'il le dit ?!)

Maintenant, il reste à vérifier que la SPI Flash se charge bien.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1168
    • Voir le profil
Re : Re : Teensy 3.1, 3.2 - Sonorisation locomotive
« Réponse #94 le: mars 16, 2018, 02:07:35 pm »
J'ai vérifié le formalisme du langage Python et j'ai modifié les lignes suivantes :
f = open(filename, "rb") --> f = open(filename, 'rb')

Soit, mais je pense que c'est la même chose. Python ne fait pas la différence entre quotes simples et doubles pour les chaines pourvu qu'on ne les mélange pas.

Citer
et
ser.write("".join(encoded)) --> ser.write("".(encode())
Le script rawfile-uploader.py ne plante plus et indique :
All files uploaded (s'il le dit ?!)

Maintenant, il reste à vérifier que la SPI Flash se charge bien.

Là par contre c'est complètement différent.

"".join(encoded)
concatène à la chaine vide l'agglomération des données de la liste encoded (qui est une variable initialisé à la liste vide à la ligne 54 et donc chaque élément est un octet à envoyer au sketch).

"".(encode()
encode la chaine vide. En l'absence d'argument, l'encodage n'est pas changé. Par conséquent la chaine vide est écrite. Comme il y a fort à parier que ser.write implémente une boucle où chaque caractère de la chaine est écrit sur le port série, la boucle ne s'exécute pas (étant donné que la chaine ne contient rien) et aucun caractère n'est envoyé ce qui explique qu'il n'y ait pas d'erreur.

Benoit92

  • Full Member
  • ***
  • Messages: 169
    • Voir le profil
Re : Teensy 3.1, 3.2 - Sonorisation locomotive
« Réponse #95 le: mars 16, 2018, 11:31:55 pm »
Merci Jean-Luc pour tes remarques pertinentes.
Je me retrouve donc avec le même problème de write out.
Je me demande si le fichier "AABR99.TRW" (en majuscule) est bien placé dans l'arborescence (c:\Python27\ ) pour être trouvé et lu par le script?

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1168
    • Voir le profil
Re : Teensy 3.1, 3.2 - Sonorisation locomotive
« Réponse #96 le: mars 17, 2018, 07:56:17 am »
Je pense qu’il est trouvé et lu. Sinon une erreur se produirait à la ligne où est situé le open.

Un test simple, déplace le fichier et lance le script pour voir cette erreur.

C’est l’écriture sur le port série qui pose problème

Benoit92

  • Full Member
  • ***
  • Messages: 169
    • Voir le profil
Re : Teensy 3.1, 3.2 - Sonorisation locomotive
« Réponse #97 le: mars 17, 2018, 06:31:28 pm »
Je suis coincé :
1) Le fichier à charger "AABR99.TRW" est bien placé.
2) J'ai interchangé les ports USB souris et liaison USB Teensy.
3) J'ai monté la configuration IDE Arduino + add-on teensy + Python 2.7 + Pyserial 3.4) sur un autre PC (PC fixe +Windows 7) -> même message de write out.
4) je suis allé sur le "Gestionnaire de périphériques" :à priori, rien d'étrange le port "COM4" est reconnu (voir ci-après).

C:\Python27>python -c "import serial, sys; print(sys.platform, serial.VERSION)"
('win32', '3.4')

C:\Python27>python -m serial.tools.list_ports
COM4
1 ports found

C:\Python27>Python "rawfile-uploader.py" "COM4" "AABR99.TRW"
Uploading 1 files...
1: AABR99.TRWTraceback (most recent call last):
  File "rawfile-uploader.py", line 81, in <module>
    ser.write("".join(encoded))
  File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 323, in write
    raise writeTimeoutError
serial.serialutil.SerialTimeoutException: Write timeout

C:\Python27>Pause
Appuyez sur une touche pour continuer...


Je ne sais plus quoi tester !

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1168
    • Voir le profil
Re : Teensy 3.1, 3.2 - Sonorisation locomotive
« Réponse #98 le: mars 17, 2018, 06:40:51 pm »
Peux tu poster le code autour de la ligne 323 de C:\Python27\lib\site-packages\serial\serialwin32.py ?

Benoit92

  • Full Member
  • ***
  • Messages: 169
    • Voir le profil
Re : Teensy 3.1, 3.2 - Sonorisation locomotive
« Réponse #99 le: mars 17, 2018, 08:21:42 pm »
 Ligne 301
def write(self, data):
        """Output the given byte string over the serial port."""
        if not self.is_open:
            raise portNotOpenError
        #~ if not isinstance(data, (bytes, bytearray)):
            #~ raise TypeError('expected %s or bytearray, got %s' % (bytes, type(data)))
        # convert data (needed in case of memoryview instance: Py 3.1 io lib), ctypes doesn't like memoryview
        data = to_bytes(data)
        if data:
            #~ win32event.ResetEvent(self._overlapped_write.hEvent)
            n = win32.DWORD()
            success = win32.WriteFile(self._port_handle, data, len(data), ctypes.byref(n), self._overlapped_write)
            if self._write_timeout != 0:  # if blocking (None) or w/ write timeout (>0)
                if not success and win32.GetLastError() not in (win32.ERROR_SUCCESS, win32.ERROR_IO_PENDING):
                    raise SerialException("WriteFile failed ({!r})".format(ctypes.WinError()))

                # Wait for the write to complete.
                #~ win32.WaitForSingleObject(self._overlapped_write.hEvent, win32.INFINITE)
                win32.GetOverlappedResult(self._port_handle, self._overlapped_write, ctypes.byref(n), True)
                if win32.GetLastError() == win32.ERROR_OPERATION_ABORTED:
                    return n.value  # canceled IO is no error
                if n.value != len(data):
Ligne 323                    raise writeTimeoutError
                return n.value
            else:
                errorcode = win32.ERROR_SUCCESS if success else win32.GetLastError()
                if errorcode in (win32.ERROR_INVALID_USER_BUFFER, win32.ERROR_NOT_ENOUGH_MEMORY,
                                 win32.ERROR_OPERATION_ABORTED):
                    return 0
                elif errorcode in (win32.ERROR_SUCCESS, win32.ERROR_IO_PENDING):
                    # no info on true length provided by OS function in async mode
                    return len(data)
                else:
                    raise SerialException("WriteFile failed ({!r})".format(ctypes.WinError()))
        else:
            return 0

Benoit92

  • Full Member
  • ***
  • Messages: 169
    • Voir le profil
Re : Teensy 3.1, 3.2 - Sonorisation locomotive
« Réponse #100 le: mars 17, 2018, 09:32:49 pm »
J'ai vu éventuellement quelque chose sur la ligne de "serialwin32.py" ------>            n = win32.DWORD().
Dans l'aide Windows :
https://support.microsoft.com/fr-fr/help/817900/usb-port-may-stop-working-after-you-remove-or-insert-a-usb-device
Il propose de modifier le registre :
Si l'entrée de Registre DisableSelectiveSuspend est présente, double-cliquez dessus.
Si elle ne l'est pas, créez l'entrée.
Pour créer l'entrée, procédez comme suit :

    Dans le menu Edition, pointez sur Nouveau, puis cliquez sur DWORD.
    Tapez DisableSelectiveSuspend, puis appuyez sur ENTRÉE.
    Dans le menu Edition, cliquez sur Modifier.

Dans le champ Données de la valeur, tapez 1 pour désactiver la fonction de suspension sélective, puis cliquez sur OK.

Qu'en penses-tu ?
Cela n'a peut-être rien à voir ?

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1168
    • Voir le profil
Re : Teensy 3.1, 3.2 - Sonorisation locomotive
« Réponse #101 le: mars 18, 2018, 12:14:16 am »
Concernant la dernière question juste au dessus, je ne sais pas

Essaye ceci:

Ligne 41, tu as

ser = serial.Serial(sys.argv[1])

Met à la place

ser = serial.Serial(sys.argv[1], write_timeout=0)

pour voir

Benoit92

  • Full Member
  • ***
  • Messages: 169
    • Voir le profil
Re : Teensy 3.1, 3.2 - Sonorisation locomotive
« Réponse #102 le: mars 18, 2018, 01:08:51 am »
C:\Python27>python -m serial.tools.list_ports
COM4
1 ports found

C:\Python27>Python "rawfile-uploader.py" "COM4" "AABR99.TRW"
Uploading 1 files...
1: AABR99.TRW (1613.34 KB/s)
All files uploaded

C:\Python27>Pause
Appuyez sur une touche pour continuer...

Merci Jean-Luc. Cela semble fonctionner. il faut que je regarde ce qu'il y a d'écrit dans la Flash.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1168
    • Voir le profil
Re : Teensy 3.1, 3.2 - Sonorisation locomotive
« Réponse #103 le: mars 18, 2018, 09:01:50 am »
Ah super  :)

1: AABR99.TRW (1613.34 KB/s)
All files uploaded

J’avais lu dans un message de Paul que l’émulation série négligeait la vitesse spécifiée et fonctionnait à la vitesse maximum possible. 1,6 MB/s c’est pas mal :)

Ca veut dire qu’en lecture de la flash  tu au moins pouvoir atteindre ce débit. Si mon compte est bon (16 bits, 44kHz)  ça permet de lire jusqu’à 18 fichiers en parallèle.

Benoit92

  • Full Member
  • ***
  • Messages: 169
    • Voir le profil
Re : Teensy 3.1, 3.2 - Sonorisation locomotive
« Réponse #104 le: mars 18, 2018, 02:50:44 pm »
Pour l'instant, j'essaie de voir si le fichier a été chargé dans la "Flash" avec "ListFiles.ino"
ListFiles.ino
#include <SerialFlash.h>
#include <SPI.h>

//#define FlashChipSelect  6   //6
const int FlashChipSelect = 10 ; // digital pin for flash chip CS pin
//const int FlashChipSelect = 21; // Arduino 101 built-in SPI Flash

void setup() {
  //uncomment these if using Teensy audio shield
  //SPI.setSCK(14);  // Audio shield has SCK on pin 14
  //SPI.setMOSI(7);  // Audio shield has MOSI on pin 7

  //uncomment these if you have other SPI chips connected
  //to keep them disabled while using only SerialFlash
//  pinMode(4, INPUT_PULLUP);
//  pinMode(10, INPUT_PULLUP);
//************************************
//  Set up SPI Teensy without audio Card
  SPI.setMOSI(11);  // uncomment these if using the alternate pins
  SPI.setMISO(12);// 12
  SPI.setSCK(14); //14

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

  Serial.begin(9600);

  // wait for Arduino Serial Monitor
  while (!Serial) ;
  delay(100);
  Serial.println("All Files on SPI Flash chip:");

//  if (!SerialFlash.begin(FlashChipSelect)) {
//    error("Unable to access SPI Flash chip");
//  }

  SerialFlash.opendir();
  while (1) {
    char filename[64];
    uint32_t filesize;

    if (SerialFlash.readdir(filename, sizeof(filename), filesize)) {
      Serial.print("  ");
      Serial.print(filename);
      spaces(20 - strlen(filename));
      Serial.print("  ");
      Serial.print(filesize);
      Serial.print(" bytes");
      Serial.println();
    } else {
      break; // no more files
    }
  }
}

void spaces(int num) {
  for (int i=0; i < num; i++) {
    Serial.print(" ");
  }
}

void loop() {
}

void error(const char *message) {
  while (1) {
    Serial.println(message);
    delay(2500);
  }
}

Résultat sur le moniteur arduino/Teensy :
All Files on SPI Flash chip:

--> aucun fichier n'est présent dans la Flash !