{"id":463,"date":"2025-01-26T01:42:39","date_gmt":"2025-01-26T01:42:39","guid":{"rendered":"https:\/\/marcjuneau.ca\/?p=463"},"modified":"2025-01-26T03:00:31","modified_gmt":"2025-01-26T03:00:31","slug":"__trashed","status":"publish","type":"post","link":"https:\/\/marcjuneau.ca\/?p=463","title":{"rendered":"Contr\u00f4le d&rsquo;un GPIO du Raspberry Pi 5 en Python et C++"},"content":{"rendered":"\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"GPIO du Raspberry Pi 5 en Python et C++\" width=\"1440\" height=\"810\" src=\"https:\/\/www.youtube.com\/embed\/gENGgG4XVTg?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>\n<\/div><\/figure>\n\n\n\n<p>Dans ce tutoriel, nous allons contr\u00f4ler une LED avec le GPIO 17 du Raspberry Pi 5. Nous allons tester diff\u00e9rentes librairies en Python et en C++ pour voir les performances qu&rsquo;elles nous offrent.<\/p>\n<p>Les codes des exemples sont tous \u00e0 la fin de l&rsquo;article.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"685\" src=\"https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/montagegpuio17-1024x685.png\" alt=\"\" class=\"wp-image-465\" srcset=\"https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/montagegpuio17-1024x685.png 1024w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/montagegpuio17-300x201.png 300w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/montagegpuio17-768x514.png 768w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/montagegpuio17-1536x1028.png 1536w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/montagegpuio17-2048x1371.png 2048w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/montagegpuio17-465x311.png 465w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/montagegpuio17-695x465.png 695w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n\n\n<p>Le premier code est r\u00e9alis\u00e9 en Python dans l&rsquo;application Thonny. Cette application est disponible dans la section \u00ab\u00a0programming\u00a0\u00bb<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"809\" src=\"https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/menuPiProg-1024x809.jpg\" alt=\"\" class=\"wp-image-467\" style=\"width:500px\" srcset=\"https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/menuPiProg-1024x809.jpg 1024w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/menuPiProg-300x237.jpg 300w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/menuPiProg-768x607.jpg 768w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/menuPiProg-465x367.jpg 465w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/menuPiProg-633x500.jpg 633w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/menuPiProg.jpg 1172w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Le code importe LED pour contr\u00f4ler en sortie le GPIO 17. Il y a aussi une pause dans le code initiale mais on les retire pour mesurer la vitesse de commutation maximale. La fr\u00e9quence mesur\u00e9e est de 120kHz. Ce qui est tr\u00e8s d\u00e9cevant si l&rsquo;on consid\u00e8re le mat\u00e9riel utilis\u00e9.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"329\" src=\"https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-1-1024x329.png\" alt=\"\" class=\"wp-image-468\" srcset=\"https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-1-1024x329.png 1024w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-1-300x96.png 300w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-1-768x247.png 768w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-1-465x149.png 465w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-1-695x223.png 695w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-1.png 1232w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>La seconde librairie \u00e9valu\u00e9e en Python est LGPIO. Elle est particuli\u00e8rement int\u00e9ressante car elle fonctionne dans Python et C++. Avec celle-ci, la fr\u00e9quence augmente \u00e0 460 kHz, ce qui demeure quand m\u00eame d\u00e9cevant.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"316\" src=\"https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-2-1024x316.png\" alt=\"\" class=\"wp-image-469\" srcset=\"https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-2-1024x316.png 1024w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-2-300x93.png 300w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-2-768x237.png 768w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-2-465x144.png 465w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-2-695x215.png 695w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-2.png 1247w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Pour ajouter la librairie lgpio \u00e0 votre installation, utilisez les commandes suivantes :<\/p>\n\n\n\n<pre>wget http:\/\/abyz.me.uk\/lg\/lg.zip<br \/>unzip lg.zip<br \/>cd lg<br \/>make<br \/>sudo make install<\/pre>\n\n\n\n<p>Pour les tests en C\/C++, nous allons utiliser Geany, aussi disponible dans le menu \u00ab\u00a0programming\u00a0\u00bb.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"557\" height=\"422\" src=\"https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-6.png\" alt=\"\" class=\"wp-image-474\" srcset=\"https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-6.png 557w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-6-300x227.png 300w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-6-465x352.png 465w\" sizes=\"auto, (max-width: 557px) 100vw, 557px\" \/><\/figure>\n\n\n\n<p>Le premier code en C\/C++ utilise la librairie LGPIO que nous avons utilis\u00e9e dans le test pr\u00e9c\u00e9dent en Python. Le r\u00e9sultat est plus rapide, avec cette fois 765 kHz. Pour la m\u00eame librairie, nous avions obtenu 460kHz avec Python.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"455\" src=\"https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-7-1024x455.png\" alt=\"\" class=\"wp-image-475\" srcset=\"https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-7-1024x455.png 1024w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-7-300x133.png 300w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-7-768x341.png 768w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-7-465x206.png 465w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-7-695x309.png 695w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-7.png 1225w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Une autre librairie qui fonctionne actuellement pour le Pi 5 est la librairie WiringPi. Voici les commandes pour l&rsquo;ajouter \u00e0 votre installation :<\/p>\n<pre>sudo apt install git<br \/>git clone https:\/\/github.com\/WiringPi\/WiringPi.git<br \/>.\/build debian<br \/>mv debian-template\/wiringpi_3.12_arm64.deb .<br \/>sudo apt install .\/wiringpi_3.12_arm64.deb<\/pre>\n\n\n\n<p>Le r\u00e9sultat est encore plus rapide, avec environ 900kHz. \u00c7a demeure toujours d\u00e9cevant, mais c&rsquo;est presque le double que le meilleur r\u00e9sultat en Python.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"367\" src=\"https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-8-1024x367.png\" alt=\"\" class=\"wp-image-476\" srcset=\"https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-8-1024x367.png 1024w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-8-300x107.png 300w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-8-768x275.png 768w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-8-465x167.png 465w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-8-695x249.png 695w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-8.png 1240w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Une question que vous pourriez vous poser est, est-ce que c&rsquo;est uniquement pour les GPIO ou Python est en g\u00e9n\u00e9ral plus lent que C++. Et bien pour r\u00e9pondre, voici un autre test o\u00f9 l&rsquo;on fait un compteur dans les deux approches et o\u00f9 l&rsquo;on mesure le temps d&rsquo;ex\u00e9cution. Comme vous pouvez le voir, c&rsquo;est 30 fois plus rapide en C++!<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"489\" src=\"https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-9-1024x489.png\" alt=\"\" class=\"wp-image-478\" srcset=\"https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-9-1024x489.png 1024w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-9-300x143.png 300w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-9-768x367.png 768w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-9-465x222.png 465w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-9-695x332.png 695w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-9.png 1198w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Pourquoi Python est si lent ? Il y a plusieurs raisons et je vous pr\u00e9sente les 5 principales selon moi :<\/p>\n<p>1.<b>Langage interpr\u00e9t\u00e9 vs compil\u00e9<\/b><\/p>\n<ul>\n<li>Le programme Python est interpr\u00e9t\u00e9 au moment de son ex\u00e9cution<\/li>\n<li>C++ est d\u00e9j\u00e0 compil\u00e9 et il est directement ex\u00e9cut\u00e9<\/li>\n<\/ul>\n<p>2.<b>Typage dynamique<\/b><\/p>\n<ul>\n<li>Avec Python le type des variables est d\u00e9termin\u00e9 \u00e0 l\u2019ex\u00e9cution ce qui ajoute au traitement<\/li>\n<\/ul>\n<p>3.<b>Optimisation<\/b><\/p>\n<ul>\n<li>L\u2019optimisation avec Python est r\u00e9duite du fait qu\u2019il est interpr\u00e9t\u00e9 \u00e0 l\u2019ex\u00e9cution<\/li>\n<\/ul>\n<p>4.<b>Gestion de la m\u00e9moire<\/b><\/p>\n<ul>\n<li>L\u2019approche avec le \u00ab\u00a0garbage collector\u00a0\u00bb de Python affecte parfois les performances<\/li>\n<\/ul>\n<p>5.<b>Biblioth\u00e8ques et abstraction<\/b><\/p>\n<ul>\n<li><b>Le C++ permet de travailler plus pr\u00e8s du mat\u00e9riel<\/b><\/li>\n<\/ul>\n\n\n\n<p>Pour les curieux, il est possible de faire beaucoup mieux en C\/C++. Dans un autre tutoriel, nous ferons un programme qui va acc\u00e9der directement au mat\u00e9riel et atteindre 20MHz. Voici un petit extrait.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"438\" src=\"https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-11-1024x438.png\" alt=\"\" class=\"wp-image-480\" srcset=\"https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-11-1024x438.png 1024w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-11-300x128.png 300w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-11-768x329.png 768w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-11-465x199.png 465w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-11-695x297.png 695w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2025\/01\/image-11.png 1232w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Codes des exemples en Python :<\/p>\n<pre># Exemple 1<br \/><br \/>from gpiozero import LED<br \/>from time import sleep<br \/>led = LED(17)<br \/>while True:<br \/>  led.on()<br \/>  sleep(1)<br \/>  led.off()<br \/>  sleep(1)<br \/><br \/># Exemple 2<br \/> <br \/>import lgpio<br \/>OUT=17<br \/><br \/>h = lgpio.gpiochip_open(0)<br \/>lgpio.gpio_claim_output(h, OUT)<br \/><br \/>while True:<br \/>  lgpio.gpio_write(h, OUT, 0)<br \/>  lgpio.gpio_write(h, OUT, 1)<br \/>  lgpio.gpio_write(h, OUT, 0)<br \/>  lgpio.gpio_write(h, OUT, 1)<br \/>  lgpio.gpio_write(h, OUT, 0)<br \/>  lgpio.gpio_write(h, OUT, 1)<br \/><br \/># Exemple 3<br \/><br \/>counter = 0<br \/>while (counter &lt; 100000000):<br \/>  counter+=1<br \/><br \/>  print(counter)<\/pre>\n\n\n\n\n\n<p>Codes des exemples en C\/C++:<\/p>\n<pre>\/\/ Exemple 1<br \/>#include &lt;lgpio.h&gt;<br \/>int main(void)<br \/>{<br \/>  int h;<br \/>  h = lgGpiochipOpen(0);<br \/>  lgGpioClaimOutput(h,0,17,0);<br \/>  while(1)<br \/>  {<br \/>    lgGpioWrite(h,17,1);<br \/>    lgGpioWrite(h,17,0);<br \/>    lgGpioWrite(h,17,1);<br \/>    lgGpioWrite(h,17,0);<br \/>    lgGpioWrite(h,17,1);<br \/>    lgGpioWrite(h,17,0);<br \/>    lgGpioWrite(h,17,1);<br \/>    lgGpioWrite(h,17,0); <br \/>    lgGpioWrite(h,17,1);<br \/>    lgGpioWrite(h,17,0); <br \/>  }<br \/>}<br \/>\/\/ Exemple 2<br \/><br \/>#include &lt;stdio.h&gt;<br \/>#include &lt;wiringPi.h&gt;<br \/><br \/>int main()<br \/>{<br \/>  wiringPiSetupSys() ;<br \/>  while(1)<br \/>  {<br \/>    digitalWrite (17, HIGH) ; \/\/ On<br \/>    digitalWrite (17, LOW) ; \/\/ Off<br \/>    digitalWrite (17, HIGH) ; \/\/ On<br \/>    digitalWrite (17, LOW) ; \/\/ Off<br \/>    digitalWrite (17, HIGH) ; \/\/ On  <br \/>    digitalWrite (17, LOW) ; \/\/ Off<br \/>    digitalWrite (17, HIGH) ; \/\/ On<br \/>    digitalWrite (17, LOW) ; \/\/ Off<br \/>  }<br \/>  return 0;<br \/>}<br \/><br \/>\/\/ Exemple 3<br \/>#include &lt;iostream&gt;<br \/>int main() <br \/>{ <br \/>  uint32_t counter = 0;<br \/>  while (counter &lt; 100000000)<br \/>    counter++;<br \/>  std::cout &lt;&lt; counter &lt;&lt; std::endl;<br \/>  return 0;<br \/>}<\/pre>\n<p>\u00a0<\/p>\n\n\n","protected":false},"excerpt":{"rendered":"<p>Dans ce tutoriel, nous allons contr\u00f4ler une LED avec le GPIO 17 du Raspberry Pi 5. Nous allons tester diff\u00e9rentes librairies en Python et en C++ pour voir les performances qu&rsquo;elles nous offrent. Les codes des exemples sont tous \u00e0 la fin de l&rsquo;article. Le premier code est r\u00e9alis\u00e9 en<span class=\"more-link\"><a href=\"https:\/\/marcjuneau.ca\/?p=463\">Continue Reading<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,8],"tags":[],"class_list":["entry","author-mjuneau","post-463","post","type-post","status-publish","format-standard","category-cc","category-raspberry-pi"],"_links":{"self":[{"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/posts\/463","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=463"}],"version-history":[{"count":5,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/posts\/463\/revisions"}],"predecessor-version":[{"id":483,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/posts\/463\/revisions\/483"}],"wp:attachment":[{"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=463"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=463"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=463"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}