Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Raspberry Pi Discussion :

De Python à C (sur Raspberry)


Sujet :

Raspberry Pi

  1. #1
    Nouveau Candidat au Club Avatar de ingéfou
    Homme Profil pro
    Rêveur Persévérant
    Inscrit en
    novembre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rêveur Persévérant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : novembre 2019
    Messages : 5
    Points : 1
    Points
    1
    Par défaut De Python à C (sur Raspberry)
    Bonjour,
    je code depuis plus d'un an en Python sur un Raspberry pi 3b+, et depuis peu sur un Zero. Et donc forcement c'est pas très rapide le Python dessus.
    le projet est une petite boite à rythme: Des boutons (sur les GPIO) et des fichier .wav à déclenché "rapidement" suite à l'appuis des boutons donc...

    En python ça marche mais y a une latence trop importante sur le Zero, sur le 3b+ ça passe encore, et je pense que si j'investi un 4 ça le fera.
    Mais le Zero est intéressant pour la petite taille

    Mes question ou demande d'aide sont:
    - pensez-vous qu'en codant en C la parti Bouton/lecture de .wav je gagnerai au niveau de la latence?

    - est-il possible de faire un script C utilisable avec mon script Python, comme Cython ou quelque chose de similaire..

    -j'aimerai aussi un petit coup de main sympa pour m'aider à faire un mini script C pour comparer la latence sur le Zero.
    en Python voila mon script:
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    from gpiozero import Button
    import pygame.mixer
     
    pygame.mixer.init()
     
    userCHANNEL1 = pygame.mixer.Channel(0) 
    userCHANNEL2 = pygame.mixer.Channel(1)
    userCHANNEL3 = pygame.mixer.Channel(2)
    userCHANNEL4 = pygame.mixer.Channel(3)
    snd1 = pygame.mixer.Sound('son1.wav')
    snd2 = pygame.mixer.Sound('son2.wav')
    snd3 = pygame.mixer.Sound('son3.wav')
    snd4 = pygame.mixer.Sound('son4.wav')
     
    def MakeSound():
        if pad1.is_pressed:userCHANNEL1.play(snd1)
        elif pad2.is_pressed:userCHANNEL2.play(snd2)
        elif pad3.is_pressed:userCHANNEL3.play(snd3)
        elif pad4.is_pressed:userCHANNEL4.play(snd4)
     
    pad1 = Button(23)
    pad2 = Button(18)
    pad3 = Button(24)
    pad4 = Button(15)
     
    pad1.when_pressed = MakeSound
    pad2.when_pressed = MakeSound
    pad3.when_pressed = MakeSound
    pad4.when_pressed = MakeSound

    je ne sais pas par ou commencer pour faire la même chose en C.
    J'utilise les lib GPIOzero et Pygame inclue dans Raspbian Buster par facilité.
    Donc je suppose qu'il me faut des lib pour le C, mais je suis perdu, sans compter que "C" pour google c'est pas très parlant^^
    voila si vous pouviez m'orienter sur des exemple ou tuto orienter spécifiquement pour Coder un petit test histoire de voir si en C le Raspberry Pi Zero peu faire tourner mon application.

    merci a vous pour votre aide, je suis totalement débutant donc il manque surement quelque information dans mon message, n'hésitez pas à me dire quoi pour avancer

  2. #2
    Membre éprouvé

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    novembre 2006
    Messages
    377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Transports

    Informations forums :
    Inscription : novembre 2006
    Messages : 377
    Points : 1 068
    Points
    1 068
    Par défaut
    Bonjour,

    Quelle question difficile!
    Je commence par Google: Utiliser 'programmer en c raspberry pi' donne des dizaines de réponses.

    Moi-même je n'ai jamais programmé en C sur le Raspberry Pi.
    Si je devais le faire, je le ferais évidemment en C++.

    Je suis aujourd’hui retraité et ma rente vient en grande partie de ma carrière professionnelle en C et C++.
    Pour faire du développement C et C++ sur une plateforme comme le Raspberry Pi, il faut un environnement solide (par exemple Eclipse) et sans doute depuis un PC.
    Ensuite développé en C/C++ demande de très bonnes connaissances dans ces langages.
    Finalement ce sont des langages difficiles à déboguer et peu productif pour des choses simples.

    Il y a une quinzaine d'années, j'ai passé à Java et je ne l'ai plus quitté.
    C'est génial, très productif, et un domaine où c'est facile de changer de job.

    Sur le Raspberry Pi, je travaille depuis des années avec Java, mais je ne le conseillerais pas forcément.
    Je fais de l'orientation objet OO depuis environ 30 ans, et c'est la raison principale de mon attachement à Java.
    Je n'ai jamais fait d'OO en Python, je n'ai pas suffisamment de maîtrise du langage ... et le temps.

    Quand à la latence que tu mentionnes, j'ai des doutes.
    Le Raspberry Pi, même un modèle plus léger, devrait pouvoir jouer un son .wav dans la dixième de seconde après, par exemple, la détection d'un mouvement par un détecteur, et tout cela en Python.
    Oui, je connais la librairie gpiozero, mais jamais vraiment utilisé. pygame.mixer: même chose. J'utilise la librairie RPi.GPIO.
    Je maîtrise assez bien le langage Python et tout va à 100 à l'heure: l'écriture du programme, les tests et la réactivité.
    Donc j'essayerais une autre librairie pour émettre mon son en Python.
    Le Bouton de la librairie gpiozero est peut-être aussi lent, essaies RPi.GPIO pour cette partie.

    Pour toutes les raisons écrites ici, je ne lâcherais pas Python trop vite.
    Donc chercher pourquoi et où c'est lent. Regardes donc Playing audio files with Python pour d'autres alternatives.

    Moi-même il m'arrive d'avoir des scripts Python ou des scripts shell qui marchent mieux et sont plus simples que s'il fallait écrire ces fonctions en Java.
    J'exécute alors du Python ou des scripts Raspbian depuis Java. Et c'est rapide.
    Donc pourquoi pas un os.system('mpg321 foo.mp3 &') en Python mentionné dans le lien ci-dessus.

    J'espère t'avoir donné quelques pistes.
    Cordialement

  3. #3
    Nouveau Candidat au Club Avatar de ingéfou
    Homme Profil pro
    Rêveur Persévérant
    Inscrit en
    novembre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rêveur Persévérant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : novembre 2019
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par boijea Voir le message
    Bonjour,

    Quelle question difficile!
    Je commence par Google: Utiliser 'programmer en c raspberry pi' donne des dizaines de réponses.

    Moi-même je n'ai jamais programmé en C sur le Raspberry Pi.
    Si je devais le faire, je le ferais évidemment en C++.

    Bonjour,
    mes questions semblent surement ridicule pour quelqu'un de ton expérience oui, mais elles n'sont pas 'comment trouver sur google un tuto C pour raspberry'.
    J'ai du mal m’exprimer, j'aurai voulu juste pouvoir faire une comparaison simplement ou avoir un retour d’expérience, en C ou C++, ou autre.
    Si c'est possible en Python c’est encore mieux!!

    Citation Envoyé par boijea Voir le message
    Je suis aujourd’hui retraité et ma rente vient en grande partie de ma carrière professionnelle en C et C++.
    Pour faire du développement C et C++ sur une plateforme comme le Raspberry Pi, il faut un environnement solide (par exemple Eclipse) et sans doute depuis un PC.
    Ensuite développé en C/C++ demande de très bonnes connaissances dans ces langages.
    Finalement ce sont des langages difficiles à déboguer et peu productif pour des choses simples.

    Il y a une quinzaine d'années, j'ai passé à Java et je ne l'ai plus quitté.
    C'est génial, très productif, et un domaine où c'est facile de changer de job.

    Sur le Raspberry Pi, je travaille depuis des années avec Java, mais je ne le conseillerais pas forcément.
    Je fais de l'orientation objet OO depuis environ 30 ans, et c'est la raison principale de mon attachement à Java.
    Je n'ai jamais fait d'OO en Python, je n'ai pas suffisamment de maîtrise du langage ... et le temps.
    Je comprend que tu me déconseille le C ou le C++ donc. Ce conseil est surement pertinent et il m'arrange^^,
    alors merci, je vais abandonner cette idée de coder en C ou C++.


    Citation Envoyé par boijea Voir le message
    Quand à la latence que tu mentionnes, j'ai des doutes.
    Le Raspberry Pi, même un modèle plus léger, devrait pouvoir jouer un son .wav dans la dixième de seconde après, par exemple, la détection d'un mouvement par un détecteur, et tout cela en Python.
    Oui, je connais la librairie gpiozero, mais jamais vraiment utilisé. pygame.mixer: même chose. J'utilise la librairie RPi.GPIO.
    Je maîtrise assez bien le langage Python et tout va à 100 à l'heure: l'écriture du programme, les tests et la réactivité.
    Donc j'essayerais une autre librairie pour émettre mon son en Python.
    Le Bouton de la librairie gpiozero est peut-être aussi lent, essaies RPi.GPIO pour cette partie.
    Un dixième de seconde dis comme ça, c'est peu oui!! Mais en musique
    les instruments électronique et les logiciel réagissent en millième de seconde. Et crois le ou non la différence est énorme,
    jouer un rythme, (ou meme du piano) avec une latence en dixième de seconde est beaucoup trop importante pour être viable.




    Citation Envoyé par boijea Voir le message
    Pour toutes les raisons écrites ici, je ne lâcherais pas Python trop vite.
    Donc chercher pourquoi et où c'est lent. Regardes donc Playing audio files with Python pour d'autres alternatives.

    Moi-même il m'arrive d'avoir des scripts Python ou des scripts shell qui marchent mieux et sont plus simples que s'il fallait écrire ces fonctions en Java.
    J'exécute alors du Python ou des scripts Raspbian depuis Java. Et c'est rapide.
    Donc pourquoi pas un os.system('mpg321 foo.mp3 &') en Python mentionné dans le lien ci-dessus.

    J'espère t'avoir donné quelques pistes.
    Cordialement
    je comprend pas tout ce que tu a dis, donc je vais aller creuser tout ça.
    j'ai testé pas mal de librairie python, sur PC, sur Rpi 3b+, mais ce qui fonctionne assez bien sur ses système, n'est pas performant sur le Rpi-Zero.
    la solution existe, car ça fait 40ans que la latence n'est pas un problème sur les instrument électronique.
    Je ne sais simplement comment y arriver moi même

    Merci

  4. #4
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    avril 2004
    Messages
    7 208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 7 208
    Points : 10 086
    Points
    10 086
    Par défaut
    bonjour ingéfou

    en lisant rapidement ton code, je me suis posé une question : est-il possible de charger en mémoire tes fichiers wav avant de les jouer ? Je me dis que tu pourrais gagner du temps. Je ne connais pas pygame.mixer mais dans mes recherches je suis tombé là dessus :
    https://pythonprogramming.net/adding...-music-pygame/

    Tu pourrais appeler la fonction load() pour tous tes fichiers wav avant les fonctions play(), ne vas-tu pas ainsi résoudre ton problème ? J'ai vu aussi qu'il existe le module pygame.mixer.music adapté aux gros fichiers wav. Peut-être est-ce plus adapté ?

  5. #5
    Nouveau Candidat au Club Avatar de ingéfou
    Homme Profil pro
    Rêveur Persévérant
    Inscrit en
    novembre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rêveur Persévérant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : novembre 2019
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Auteur Voir le message
    bonjour ingéfou

    en lisant rapidement ton code, je me suis posé une question : est-il possible de charger en mémoire tes fichiers wav avant de les jouer ? Je me dis que tu pourrais gagner du temps. Je ne connais pas pygame.mixer mais dans mes recherches je suis tombé là dessus :
    https://pythonprogramming.net/adding...-music-pygame/

    Tu pourrais appeler la fonction load() pour tous tes fichiers wav avant les fonctions play(), ne vas-tu pas ainsi résoudre ton problème ? J'ai vu aussi qu'il existe le module pygame.mixer.music adapté aux gros fichiers wav. Peut-être est-ce plus adapté ?
    Bonjour et merci pour ta réponse

    pygame.mixer.Sound() c'est en faite une fonction load, puis play puis viens pour jouer les sons.
    le code présenté est un simple test pour tester la latence. (mais ça marche bien avec des liste et tout aussi.)

    pygame.mixer.music n'est pas adapter, ou pas pour la même utilisation, disons.
    cela de jouer une musique de fond, alors que l'autre méthode permet de jouer 8 sons simultanément par dessus.

    bref je pense savoir me servir de la libraire pygame, je travail avec depuis 1ans.

    Pygame justement ne gère pas ça en python directement je crois, dans le package pygame, y a des fichier .py que l'on peu modifier ou reprendre en exemple pour faire sa propre API.
    mais ce qui concerne pygame.mixer est en .pyd
    Et la je suis plus assez compétant pour allez plus loin.

    J'ai testé la librairie Pyglet(avec beaucoup de mal), Wave et Pydub principalement sur le dernier mois.
    et pygame est le plus réactif à la latence sur Raspberry 3b+, c'est même utilisable, mon application avec un code pas super optimisé fonctionne.
    En revanche mon problème est que le Rpi-Zero ne suis pas du tout.
    Ce que je peu comprendre, mais je Reste persuadé que c'est possible. Les boite à rythme des année 80 y arrivai avec des machines bien moins puissante qu'un Raspberry Zero.

    Voila pourquoi je mettais en cause Python, et voulais m'orienter vers quelque chose comme le C/C++, ou autre...

    Je ne sais pas si cela peu résoudre mon soucis, mais je piétine sur ce détail dans mon petit projet sur Rpi-Zero
    Je suis débutant j'ignore beaucoup de chose, j'en suis conscient

  6. #6
    Nouveau Candidat au Club Avatar de ingéfou
    Homme Profil pro
    Rêveur Persévérant
    Inscrit en
    novembre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rêveur Persévérant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : novembre 2019
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par boijea Voir le message
    J'utilise la librairie RPi.GPIO.
    Le Bouton de la librairie gpiozero est peut-être aussi lent, essaies RPi.GPIO pour cette partie.
    Re,
    Apres un petit test,
    le résultat au niveau de la latence est identique.
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    import RPi.GPIO as GPIO
    import pygame.mixer
     
    pygame.mixer.init()
    GPIO.setmode(GPIO.BCM)
     
    pad1 = 23
    pad2 = 18
     
    GPIO.setup(pad1, GPIO.IN, pull_up_down = GPIO.PUD_UP)
    GPIO.setup(pad2, GPIO.IN, pull_up_down = GPIO.PUD_UP)
     
    userCHANNEL1 = pygame.mixer.Channel(0)
    userCHANNEL2 = pygame.mixer.Channel(1)
     
    snd1 = pygame.mixer.Sound('son1.wav')
    snd2 = pygame.mixer.Sound('son2.wav')
     
     
     
    while True:
        detect_pad1 = GPIO.input(pad1)
        detect_pad2 = GPIO.input(pad2)
     
        if detect_pad1 == False: userCHANNEL1.play(snd1) 
        if detect_pad2 == False: userCHANNEL2.play(snd2)

    D'ailleurs, je me rend bien compte que le problème viens bien de la lecture audio et pas de la gestion des GPIO, car si l'on rajoute un print, on le vois bien s'afficher avant d'entendre le son. ça se joue a rien, mais si on y prête attention c'est flagrant.
    la fonction print qui ne fais finalement pas grand chose, et quasi immédiate avec les 2 librairie.

    merci pour le conseil de test

    Sinon pour l'autre piste que tu conseil, elle concerne les .MP3, et pas les .wav d’après mes recherche. Le MP3 dans mon contexte est à bannir, c'est un format compressé qui aime pas du tout les traitement et autre effet codé en python. le son deviens vite dégueulasse

  7. #7
    Membre éprouvé

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    novembre 2006
    Messages
    377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Transports

    Informations forums :
    Inscription : novembre 2006
    Messages : 377
    Points : 1 068
    Points
    1 068
    Par défaut
    Ouais .... je commence à comprendre ton problème.

    Tes boutons seraient donc comme des touches de pianos. Ou bien!?

    Je crois que c'est déjà suggéré: avoir tous les sons préchargés.
    Ma suggestion: un thread pour les boutons et un autre pour jouer.

    Oh comme cela m'intéresse
    , il faut que je l'essaie en Java.

    Le problème, je suis retraité et surchargé: un article sur Flask (Python) pour le Pi en travail, un autre aussi sur mon nouvel hybride, répondre ici, dormir, etc.

    Je n'ai jamais utilisé la partie son du Pi: qu'est que tu as comme interface?

    J'ai une application dans la tête: ma femme vient d'acheter un chat (plaque métallique) à visser contre le mûr et j'aimerais jouer un "miaou" (un de mes Pi est juste à côté) quand on passe devant (je mettrais un PIR avec un ESP en communiquant avec le Pi). Un petit haut-parleur avec ampli, très bon marché, me suffirait.

  8. #8
    Nouveau Candidat au Club Avatar de ingéfou
    Homme Profil pro
    Rêveur Persévérant
    Inscrit en
    novembre 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rêveur Persévérant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : novembre 2019
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par boijea Voir le message
    Ouais .... je commence à comprendre ton problème.

    Tes boutons seraient donc comme des touches de pianos. Ou bien!?
    Oui c'est exactement ça.

    Citation Envoyé par boijea Voir le message
    Je crois que c'est déjà suggéré: avoir tous les sons préchargés.
    Ma suggestion: un thread pour les boutons et un autre pour jouer.
    Mon application à déjà un thread pour une autre fonction. Je me demande combien de thread peu supporter le Rpi-zero et dans quel mesure je vais gagner en rapidité.
    Je vais tester si j'arrive à le coder, (je suis pas très alaise avec les thread)


    Citation Envoyé par boijea Voir le message
    Oh comme cela m'intéresse, il faut que je l'essaie en Java.

    Le problème, je suis retraité et surchargé: un article sur Flask (Python) pour le Pi en travail, un autre aussi sur mon nouvel hybride, répondre ici, dormir, etc.
    pas de soucis, si tu tu le test en java un de ses jours, je veux bien que tu me partage ton expérience

    Citation Envoyé par boijea Voir le message
    Je n'ai jamais utilisé la partie son du Pi: qu'est que tu as comme interface?
    pour le moment une simple carte son USB bon marché acheter sur Amazon à 4€


    Citation Envoyé par boijea Voir le message
    J'ai une application dans la tête: ma femme vient d'acheter un chat (plaque métallique) à visser contre le mûr et j'aimerais jouer un "miaou" (un de mes Pi est juste à côté) quand on passe devant (je mettrais un PIR avec un ESP en communiquant avec le Pi). Un petit haut-parleur avec ampli, très bon marché, me suffirait.
    ça peut être drôle^^
    un petit random avec plusieurs fichier et tu peux surprendre plus d'une fois

Discussions similaires

  1. Python sur raspberry et POST
    Par joseph20480 dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 04/02/2018, 13h06
  2. Python sur raspberry et POST
    Par joseph20480 dans le forum Général Python
    Réponses: 0
    Dernier message: 04/02/2018, 01h34
  3. Programmer la logique floue sur Raspberry python
    Par basma2017 dans le forum Raspberry Pi
    Réponses: 6
    Dernier message: 30/06/2017, 16h20
  4. conseils pour serveur python sur raspberry
    Par nma dans le forum Raspberry Pi
    Réponses: 1
    Dernier message: 12/11/2016, 14h34
  5. [Associé] Développeur PYTHON / Django sur Marseille
    Par DMCboy dans le forum Autres
    Réponses: 0
    Dernier message: 26/03/2011, 20h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo