{"id":3716,"date":"2026-09-02T08:37:13","date_gmt":"2026-09-02T07:37:13","guid":{"rendered":"https:\/\/www.macerobotics.com\/?p=3716"},"modified":"2026-09-02T08:37:13","modified_gmt":"2026-09-02T07:37:13","slug":"robot-mr25-detecter-le-frappement-de-main-avec-le-microphone","status":"publish","type":"post","link":"https:\/\/www.macerobotics.com\/?p=3716","title":{"rendered":"Robot MR25 &#8211; D\u00e9tecter le frappement de main avec le microphone"},"content":{"rendered":"<p>On souhaite programmer le robot MR25 afin de contr\u00f4ler ces mouvements via la d\u00e9tection des frappements de main :<\/p>\n<p><strong>&#x1f44f; =&gt;\u00a0 Le robot MR25 avance<\/strong><\/p>\n<p><strong>&#x1f44f;&#x1f44f; =&gt;\u00a0 Le robot MR25 tourne \u00e0 gauche<\/strong><\/p>\n<p><strong>&#x1f44f;&#x1f44f;&#x1f44f; =&gt;\u00a0 Le robot MR25 tourne \u00e0 droite<\/strong><\/p>\n<p><strong>&#x1f44f;&#x1f44f;&#x1f44f;&#x1f44f; =&gt;\u00a0 Le robot MR25 s\u2019arr\u00eate<\/strong><\/p>\n<p>Le microphone d\u00e9tecte les frappements en analysant le <strong>niveau sonore<\/strong>.<\/p>\n<figure id=\"attachment_4073\" aria-describedby=\"caption-attachment-4073\" style=\"width: 517px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/fr.macerobotics.com\/wp-content\/uploads\/sites\/4\/2026\/09\/Capture-decran-2026-09-01-114750.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4073 size-full\" src=\"http:\/\/fr.macerobotics.com\/wp-content\/uploads\/sites\/4\/2026\/09\/Capture-decran-2026-09-01-114750.png\" alt=\"\" width=\"517\" height=\"758\" \/><\/a><figcaption id=\"caption-attachment-4073\" class=\"wp-caption-text\">Algorithme<\/figcaption><\/figure>\n<div class=\"ttfmake-embed-wrapper aligncenter\" style=\"max-width: 960px;\"><iframe loading=\"lazy\" title=\"Raspberry Pi 5 - MR25 mobile Robot - Hand-clapping control\" width=\"960\" height=\"540\" src=\"https:\/\/www.youtube.com\/embed\/JWlgRYxqbMY?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<p>Voici un exemple de programme pour contr\u00f4ler le robot avec le frappement de main :<\/p>\n<div class=\"code-embed-wrapper\"> <pre class=\"language-python code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-python code-embed-code\">import subprocess # permet de lancer le programme arecord pour r\u00e9cup\u00e9rer le son du microphone.<br\/>import numpy as np # permet de traiter les donn\u00e9es audio et de calculer le RMS.<br\/>import MR25<br\/>import time<br\/><br\/>DEVICE = &quot;hw:0,0&quot;<br\/>RATE = 48000<br\/>CHANNELS = 1<br\/>CHUNK = 1024<br\/><br\/>THRESHOLD = 0.01 # le seuil sonore.<br\/><br\/># Temps minimum entre deux frappes<br\/>DEBOUNCE_TIME = 0.20<br\/><br\/># Temps maximum pour regrouper les frappes<br\/>GROUP_TIMEOUT = 0.80<br\/># Le programme attend au maximum 0,8 seconde apr\u00e8s la derni\u00e8re frappe.<br\/><br\/>cmd = [<br\/>    &quot;arecord&quot;,<br\/>    &quot;-D&quot;, DEVICE,<br\/>    &quot;-f&quot;, &quot;S16_LE&quot;,<br\/>    &quot;-r&quot;, str(RATE),<br\/>    &quot;-c&quot;, str(CHANNELS),<br\/>    &quot;-t&quot;, &quot;raw&quot;,<br\/>    &quot;-&quot;<br\/>]<br\/><br\/>process = subprocess.Popen(<br\/>    cmd,<br\/>    stdout=subprocess.PIPE,<br\/>    stderr=subprocess.DEVNULL<br\/>)<br\/><br\/>nombre_frappes = 0<br\/>derniere_frappe = 0<br\/>dernier_signal = 0<br\/><br\/>print(&quot;\u00c9coute du microphone...&quot;)<br\/>print(&quot;1 frappe = LED rouge&quot;)<br\/>print(&quot;3 frappes = LED verte&quot;)<br\/>print(&quot;Ctrl+C pour arr\u00eater.\\n&quot;)<br\/><br\/>try:<br\/>    while True:<br\/><br\/>        data = process.stdout.read(CHUNK * 2)<br\/><br\/>        if len(data) != CHUNK * 2:<br\/>            break<br\/><br\/>        audio = np.frombuffer(data, dtype=np.int16)<br\/>        audio = audio.astype(np.float32) \/ 32768.0<br\/><br\/>        volume = np.sqrt(np.mean(audio ** 2))<br\/><br\/>        maintenant = time.time()<br\/><br\/>        # Affichage du volume<br\/>        bar = min(50, int(volume * 50))<br\/><br\/>        print(<br\/>            f&quot;\\rVolume : {volume:.3f} &quot;<br\/>            f&quot;[{&#039;#&#039; * bar:&lt;50}] &quot;<br\/>            f&quot;Frappes : {nombre_frappes}&quot;,<br\/>            end=&quot;&quot;,<br\/>            flush=True<br\/>        )<br\/><br\/>        # D\u00e9tection d&#039;une frappe<br\/>        if volume &gt; THRESHOLD:<br\/><br\/>            # \u00c9vite de compter plusieurs fois la m\u00eame frappe<br\/>            if maintenant - derniere_frappe &gt; DEBOUNCE_TIME:<br\/><br\/>                nombre_frappes += 1<br\/>                derniere_frappe = maintenant<br\/><br\/>                print(f&quot;\\n&gt;&gt;&gt; Frappe {nombre_frappes}&quot;)<br\/><br\/>        # Si le d\u00e9lai entre les frappes est d\u00e9pass\u00e9,<br\/>        # on analyse le nombre de frappes<br\/>        if (<br\/>            nombre_frappes &gt; 0<br\/>            and maintenant - derniere_frappe &gt; GROUP_TIMEOUT<br\/>        ):<br\/><br\/>            if nombre_frappes == 1:<br\/>                print(&quot;&gt;&gt;&gt; 1 FRAPPE : avancer&quot;)<br\/>                MR25.ledRGB(&quot;100&quot;)<br\/>                MR25.forward(30)<br\/>                time.sleep(0.5)<br\/>                MR25.ledRGB(&quot;000&quot;)<br\/><br\/>            elif nombre_frappes == 2:<br\/>                print(&quot;&gt;&gt;&gt; 2 FRAPPES : tourner \u00e0 gauche&quot;)<br\/>                MR25.ledRGB(&quot;010&quot;)<br\/>                MR25.turnLeft(30)<br\/>                time.sleep(0.5)<br\/>                MR25.ledRGB(&quot;000&quot;)<br\/><br\/>            elif nombre_frappes == 3:<br\/>                print(&quot;&gt;&gt;&gt; 3 FRAPPES : tourner \u00e0 droite&quot;)<br\/>                MR25.ledRGB(&quot;001&quot;)<br\/>                MR25.turnRight(30)<br\/>                time.sleep(0.5)<br\/>                MR25.ledRGB(&quot;000&quot;)<br\/><br\/>            elif nombre_frappes == 4:<br\/>                print(&quot;&gt;&gt;&gt; 4 FRAPPES : STOP&quot;)<br\/>                MR25.ledRGB(&quot;111&quot;)<br\/>                MR25.stop()<br\/>                time.sleep(0.5)<br\/>                MR25.ledRGB(&quot;000&quot;)<br\/><br\/>            else:<br\/>                print(f&quot;&gt;&gt;&gt; {nombre_frappes} frappes : aucune action&quot;)<br\/><br\/>            # R\u00e9initialisation<br\/>            nombre_frappes = 0<br\/><br\/>except KeyboardInterrupt:<br\/>    print(&quot;\\n\\nArr\u00eat du robot.&quot;)<br\/>    MR25.stop()<br\/><br\/>finally:<br\/>    process.terminate()<\/code><\/pre> <div class=\"code-embed-infos\"> <\/div> <\/div>\n<p>Fin du tuto !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>On souhaite programmer le robot MR25 afin de contr\u00f4ler ces mouvements via la d\u00e9tection des frappements de main : &#x1f44f; =&gt;\u00a0 Le robot MR25 avance &#x1f44f;&#x1f44f; =&gt;\u00a0 Le robot MR25 tourne \u00e0 gauche &#x1f44f;&#x1f44f;&#x1f44f; =&gt;\u00a0 Le robot MR25 tourne \u00e0 droite &#x1f44f;&#x1f44f;&#x1f44f;&#x1f44f; =&gt;\u00a0 Le robot MR25 s\u2019arr\u00eate Le microphone d\u00e9tecte les frappements en analysant le &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[105,46],"tags":[],"class_list":["post-3716","post","type-post","status-publish","format-standard","hentry","category-mr25-robot","category-robot"],"_links":{"self":[{"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=\/wp\/v2\/posts\/3716","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3716"}],"version-history":[{"count":1,"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=\/wp\/v2\/posts\/3716\/revisions"}],"predecessor-version":[{"id":3717,"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=\/wp\/v2\/posts\/3716\/revisions\/3717"}],"wp:attachment":[{"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3716"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3716"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.macerobotics.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3716"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}