{"id":3622,"date":"2013-05-25T18:08:34","date_gmt":"2013-05-25T17:08:34","guid":{"rendered":"http:\/\/www.blaess.fr\/christophe\/?p=3622"},"modified":"2013-06-05T22:01:03","modified_gmt":"2013-06-05T21:01:03","slug":"entrees-analogiques-du-beagle-bone-black","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2013\/05\/25\/entrees-analogiques-du-beagle-bone-black\/","title":{"rendered":"Entr\u00e9es analogiques du Beagle Bone Black"},"content":{"rendered":"<p style=\"text-align: justify;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/05\/BeagleBoneBlack-analogique.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-3659\" alt=\"BeagleBone Black Entr\u00e9es Analogiques\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/05\/BeagleBoneBlack-analogique.png\" width=\"300\" height=\"225\" \/><\/a>Le nouveau BeagleBone Black est compatible avec son pr\u00e9d\u00e9cesseur blanc en ce qui concerne les ports d&rsquo;entr\u00e9es-sorties, ce qui lui permet d&rsquo;h\u00e9riter de ses fameuses \u00ab\u00a0<strong>capes<\/strong>\u00a0\u00bb (les cartes d&rsquo;extension que l&rsquo;on peut empiler afin d&rsquo;ajouter de nouvelles fonctionnalit\u00e9s). Pour commencer \u00e0 explorer le BeagleBone Black, je me suis int\u00e9ress\u00e9 \u00e0 ses entr\u00e9es analogiques, comme @HuguesSert me l&rsquo;avait sugg\u00e9r\u00e9 sur Twitter.<\/p>\n<p>\n<!--more-->\n<\/p>\n<p style=\"text-align: justify;\">Le BeagleBone Black propose <strong>7 entr\u00e9es analogiques<\/strong> dans l&rsquo;intervalle de tension [0, +1.8V] initialement con\u00e7ues pour supporter un \u00e9cran tactile d&rsquo;o\u00f9 le \u00ab\u00a0TSC\u00a0\u00bb (<em>Touchscreen<\/em>) que l&rsquo;on trouvera dans le nom du driver, mais on peut parfaitement les utiliser pour d&rsquo;autres applications. Ces canaux se trouvent sur le connecteur P9 (celui situ\u00e9 du c\u00f4t\u00e9 de l&rsquo;alimentation +5V). Les entr\u00e9es A0 \u00e0 A6 se situent respectivement sur les broches 39, 40, 37, 38, 33, 36 et 35 de P9, la masse analogique \u00e9tant sur la broche 34 et sur la broche 32 on peut trouver une tension de r\u00e9f\u00e9rence \u00e0 +1.8V.<\/p>\n<p style=\"text-align: justify;\">Attention \u00e0 ne surtout pas d\u00e9passer la tension de r\u00e9f\u00e9rence, sur une entr\u00e9e analogique. Je ne me suis pas risqu\u00e9 \u00e0 v\u00e9rifier s&rsquo;il y a des protections efficaces, mais le <em>System Reference Manual du BeagleBone Black<\/em> pr\u00e9cise cette limite explicitement (p.27).<\/p>\n<p><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/05\/Connecteur-P9-Analogique.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3643\" alt=\"Entr\u00e9es analogiques BeagleBoard Black\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/05\/Connecteur-P9-Analogique.png\" width=\"271\" height=\"289\" \/><\/a><\/p>\n<h1 style=\"text-align: justify;\">Broches d&rsquo;alimentation en 1.8V<\/h1>\n<p style=\"text-align: justify;\">La m\u00e9thode la plus simple pour fournir une valeur ne d\u00e9passant jamais 1,8V est encore de fournir en entr\u00e9e un signal obtenu par division de cette tension de r\u00e9f\u00e9rence. Nous pouvons v\u00e9rifier qu&rsquo;elle est bien pr\u00e9sente entre les broches 34 (GND_ADC) et 32 (V_ADC).<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/05\/BeagleBone_Tension_Analogique.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3649\" alt=\"Tension Analogique du BeagleBone\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/05\/BeagleBone_Tension_Analogique.png\" width=\"400\" height=\"350\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/05\/BeagleBone_Tension_Analogique.png 400w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/05\/BeagleBone_Tension_Analogique-300x262.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<h1>Entr\u00e9es analogiques<\/h1>\n<p style=\"text-align: justify;\">Sur le pr\u00e9c\u00e9dent BeagleBone (je n&rsquo;en ai plus d&rsquo;exemplaire sous la main, je n&rsquo;ai pas v\u00e9rifi\u00e9 ceci), il suffisait pour lire l&rsquo;\u00e9tat d&rsquo;une des entr\u00e9es analogiques de consulter&nbsp;: <code>\/sys\/devices\/platform\/tsc\/ain&lt;numero&gt;<\/code> ou <code>\/sys\/devices\/platform\/omap\/tsc\/ain&lt;numero&gt;<\/code> sur les noyaux r\u00e9cents. Ceci ne fonctionne plus sur le nouveau BeagleBone Black.<\/p>\n<p style=\"text-align: justify;\">Avec ce dernier, nous sommes encourag\u00e9s \u00e0 utiliser un nouveau sous-syst\u00e8me du kernel&nbsp;: <strong><code>IIO<\/code><\/strong> (<em>Industrial I\/O Subsystem<\/em>) qui est d\u00e9di\u00e9 aux convertisseurs analogiques-&gt;num\u00e9riques (<em>ADC<\/em>, en entr\u00e9e) et dans une moindre mesure aux convertisseurs num\u00e9riques-&gt;analogiques (<em>DAC<\/em>, en sortie).<\/p>\n<p style=\"text-align: justify;\">Nous allons devoir activer la gestion des IIO en utilisant le module <strong><em>Cape Manager<\/em><\/strong> du kernel.<\/p>\n<p style=\"text-align: justify;\">D\u00e9marrons un BeagleBone Black sur la distribution Angstr\u00f6m incluse dans la carte eMMC, puis interrogeons le module <em>Cape Manager<\/em> pour voir quelles capes il a d\u00e9tect\u00e9es.<\/p>\n<pre>root@beaglebone:~# <strong>ls \/sys\/devices\/<\/strong>\n44e10800.pinmux  ARMv7 Cortex-A8  bone_capemgr.8  breakpoint  fixedregulator.9\tocp.2  platform  soc.0\tsoftware  system  tracepoint  virtual\nroot@beaglebone:~#<\/pre>\n<p>&nbsp;<\/p>\n<pre>root@beaglebone:~# <strong>cat \/sys\/devices\/bone_capemgr.8\/slots<\/strong>\n 0: 54:PF--- \n 1: 55:PF--- \n 2: 56:PF--- \n 3: 57:PF--- \n 4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G\n 5: ff:P-O-L Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI\nroot@beaglebone:~#<\/pre>\n<p style=\"text-align: justify;\">Pour le moment, seules deux pseudo-capes sont pr\u00e9sentes, pour impl\u00e9menter le support du connecteur HDMI et de la m\u00e9moire flash eMMC. Les supports de capes (nomm\u00e9s <em>Device Tree Fragments<\/em>) se trouvent dans le r\u00e9pertoire <code>firmware\/cape<\/code> du kernel apr\u00e8s application des patches pour BeagleBone (je reviendrai sur ce sujet dans un prochain article). En voici la liste pour le noyau 3.8.13.<\/p>\n<pre>[kernel]$ <strong>ls firmware\/capes\/<\/strong>\nam33xx_pwm-00A0.dts        bone_pwm_P9_16-00A0.dts\nBB-BONE-AUDI-01-00A0.dts   bone_pwm_P9_21-00A0.dts\nBB-BONE-CAM3-01-00A2.dts   bone_pwm_P9_22-00A0.dts\nBB-BONE-eMMC1-01-00A0.dts  bone_pwm_P9_28-00A0.dts\nBB-BONE-GPEVT-00A0.dts     bone_pwm_P9_29-00A0.dts\nBB-BONE-LCD4-01-00A0.dts   bone_pwm_P9_31-00A0.dts\nBB-BONE-LCD4-01-00A1.dts   bone_pwm_P9_42-00A0.dts\nBB-BONE-LCD7-01-00A2.dts   cape-bone-2g-emmc1.dts\nBB-BONE-LCD7-01-00A3.dts   cape-bone-adafruit-lcd-00A0.dts\nBB-BONE-LCD7-01-00A4.dts   cape-bone-adafruit-rtc-00A0.dts\nBB-BONELT-BT-00A0.dts      cape-boneblack-hdmi-00A0.dts\nBB-BONE-PRU-01-00A0.dts    cape-bone-dvi-00A0.dts\nBB-BONE-PRU-02-00A0.dts    cape-bone-dvi-00A1.dts\nBB-BONE-PWMT-00A0.dts      cape-bone-dvi-00A2.dts\nBB-BONE-RS232-00A0.dts     cape-bone-exptest-00A0.dts\nBB-BONE-RST-00A0.dts       cape-bone-geiger-00A0.dts\nBB-BONE-RST2-00A0.dts      cape-bone-hexy-00A0.dts\nBB-BONE-SERL-01-00A1.dts   cape-bone-iio-00A0.dts\nbone_pwm_P8_13-00A0.dts    cape-bone-lcd3-00A0.dts\nbone_pwm_P8_19-00A0.dts    cape-bone-lcd3-00A2.dts\nbone_pwm_P8_34-00A0.dts    cape-bone-mrf24j40-00A0.dts\nbone_pwm_P8_36-00A0.dts    cape-bone-nixie-00A0.dts\nbone_pwm_P8_45-00A0.dts    cape-bone-pinmux-test-00A0.dts\nbone_pwm_P8_46-00A0.dts    cape-bone-tester-00A0.dts\nbone_pwm_P9_14-00A0.dts    cape-bone-weather-00A0.dts\n[kernel]$<\/pre>\n<p style=\"text-align: justify;\">Celle qui va nous int\u00e9resser pour le moment est <code>cape-bone-iio<\/code>. Demandons au <em>Cape Manager<\/em> d&rsquo;en assurer le support.<\/p>\n<pre>root@beaglebone:~# <strong>echo cape-bone-iio &gt; \/sys\/devices\/bone_capemgr.8\/slots<\/strong>\nroot@beaglebone:~#<\/pre>\n<p style=\"text-align: justify;\">V\u00e9rifions \u00e0 nouveau les capes g\u00e9r\u00e9es.<\/p>\n<pre>root@beaglebone:~# <strong>cat \/sys\/devices\/bone_capemgr.8\/slots<\/strong> \n 0: 54:PF--- \n 1: 55:PF--- \n 2: 56:PF--- \n 3: 57:PF--- \n 4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G\n 5: ff:P-O-L Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI\n 6: ff:P-O-L Override Board Name,00A0,Override Manuf,cape-bone-iio\nroot@beaglebone:~#<\/pre>\n<p style=\"text-align: justify;\">Un nouveau r\u00e9pertoire <code>helper.11<\/code> (le driver s&rsquo;appelle <em>TSC AM335x IIO Helper<\/em>) est alors apparu dans <code>\/sys\/devices\/ocp.2\/<\/code>. Voyons son contenu.<\/p>\n<pre>root@beaglebone:~# <strong>ls -l \/sys\/devices\/ocp.2\/helper.11\/<\/strong>\ntotal 0\n-r--r--r-- 1 root root 4096 Jan  1 01:35 AIN0\n-r--r--r-- 1 root root 4096 Jan  1 01:35 AIN1\n-r--r--r-- 1 root root 4096 Jan  1 01:35 AIN2\n-r--r--r-- 1 root root 4096 Jan  1 01:35 AIN3\n-r--r--r-- 1 root root 4096 Jan  1 01:35 AIN4\n-r--r--r-- 1 root root 4096 Jan  1 01:35 AIN5\n-r--r--r-- 1 root root 4096 Jan  1 01:35 AIN6\n-r--r--r-- 1 root root 4096 Jan  1 01:35 AIN7\nlrwxrwxrwx 1 root root    0 Jan  1 01:35 driver -&gt; ..\/..\/..\/bus\/platform\/drivers\/bone-iio-helper\n-r--r--r-- 1 root root 4096 Jan  1 01:35 modalias\ndrwxr-xr-x 2 root root    0 Jan  1 01:35 power\nlrwxrwxrwx 1 root root    0 Jan  1 00:40 subsystem -&gt; ..\/..\/..\/bus\/platform\n-rw-r--r-- 1 root root 4096 Jan  1 00:40 uevent\nroot@beaglebone:~#<\/pre>\n<p style=\"text-align: justify;\">Les fichiers <strong><code>AIN0<\/code><\/strong> \u00e0 <strong><code>AIN6<\/code><\/strong> repr\u00e9sentent les <strong>entr\u00e9es analogiques<\/strong> que nous allons tester. L&rsquo;entr\u00e9e <code>AIN7<\/code> est utilis\u00e9e me semble-t-il pour la r\u00e9gulation de la tension d&rsquo;alimentation.<\/p>\n<p style=\"text-align: justify;\">Relions la broche 36 (entr\u00e9e analogique 5) \u00e0 la broche 34 (GND_ADC) et demandons le contenu du fichier <code>AIN5<\/code>.<\/p>\n<pre>root@beaglebone:~# <strong>cat \/sys\/devices\/ocp.2\/helper.11\/AIN5<\/strong>\n340\nroot@beaglebone:~# <strong>cat \/sys\/devices\/ocp.2\/helper.11\/AIN5<\/strong> \n0\nroot@beaglebone:~# <strong>cat \/sys\/devices\/ocp.2\/helper.11\/AIN5<\/strong> \n0\nroot@beaglebone:~# <strong>cat \/sys\/devices\/ocp.2\/helper.11\/AIN5<\/strong> \n0\nroot@beaglebone:~# <strong>cat \/sys\/devices\/ocp.2\/helper.11\/AIN5<\/strong> \n0\nroot@beaglebone:~#<\/pre>\n<p style=\"text-align: justify;\">La premi\u00e8re valeur (340) \u00e9tait un peu surprenante. Maintenant, relions la broche 36 \u00e0 la broche 32 (VDD ADC).<\/p>\n<pre>root@beaglebone:~# <strong>cat \/sys\/devices\/ocp.2\/helper.11\/AIN5 <\/strong>\n0\nroot@beaglebone:~# <strong>cat \/sys\/devices\/ocp.2\/helper.11\/AIN5 <\/strong>\n1799\nroot@beaglebone:~# <strong>cat \/sys\/devices\/ocp.2\/helper.11\/AIN5 <\/strong>\n1799\nroot@beaglebone:~# <strong>cat \/sys\/devices\/ocp.2\/helper.11\/AIN5 <\/strong>\n1799\nroot@beaglebone:~# <strong>cat \/sys\/devices\/ocp.2\/helper.11\/AIN5 <\/strong>\n1798\nroot@beaglebone:~# <strong>cat \/sys\/devices\/ocp.2\/helper.11\/AIN5 <\/strong>\n1799\nroot@beaglebone:~#<\/pre>\n<p style=\"text-align: justify;\">Plusieurs remarques s&rsquo;imposent&nbsp;:<\/p>\n<ul>\n<li style=\"text-align: justify;\">La valeur fournie par le fichier AIN est donc <strong>la tension mesur\u00e9e en millivolts<\/strong>. Le convertisseur ADC du processeur AM3559 offre une r\u00e9solution de 12 bits, mais le driver Linux se contente donc de 11 bits (intervalle [0-2047]) \u00e0 cause de la limitation \u00e0 +1.8V.<\/li>\n<li style=\"text-align: justify;\">Visiblement, \u00e0 chaque lecture du fichier AIN, le driver nous renvoie la derni\u00e8re valeur qu&rsquo;il avait d\u00e9j\u00e0 mesur\u00e9e puis relance une nouvelle acquisition. <strong>La premi\u00e8re valeur lue de chaque s\u00e9rie n&rsquo;est donc pas valide<\/strong>. C&rsquo;est important d&rsquo;en tenir compte dans les applications qui \u00e9chantillonnent un signal.<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Je branche maintenant sur la broche AIN5 (36) le point-milieu d&rsquo;un potentiom\u00e8tre dont les deux extr\u00e9mit\u00e9s sont reli\u00e9es aux broches 32 (VDD_ADC) et 34 (GND_ADC). Je place le potentiom\u00e8tre \u00e0 peu pr\u00e8s \u00e0 mi-course.<\/p>\n<p><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/05\/BeagleBone_Potentiometre.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3650\" alt=\"BeagleBone et Potentiometre\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/05\/BeagleBone_Potentiometre.png\" width=\"400\" height=\"400\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/05\/BeagleBone_Potentiometre.png 400w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/05\/BeagleBone_Potentiometre-150x150.png 150w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2013\/05\/BeagleBone_Potentiometre-300x300.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><\/p>\n<pre>root@beaglebone:~# <strong>cat \/sys\/devices\/ocp.2\/helper.11\/AIN5 <\/strong>\n1799\nroot@beaglebone:~# <strong>cat \/sys\/devices\/ocp.2\/helper.11\/AIN5 <\/strong>\n791\nroot@beaglebone:~# <strong>cat \/sys\/devices\/ocp.2\/helper.11\/AIN5 <\/strong>\n791\nroot@beaglebone:~#<\/pre>\n<p style=\"text-align: justify;\">Nous avons confirmation que la premi\u00e8re valeur est fausse (c&rsquo;est l&rsquo;acquisition faite juste apr\u00e8s la derni\u00e8re lecture de l&rsquo;exp\u00e9rience pr\u00e9c\u00e9dente).<br \/>\nOn peut voir varier dynamiquement la valeur d&rsquo;entr\u00e9e analogique alors que je tourne le potentiom\u00e8tre alternativement d&rsquo;une but\u00e9e \u00e0 l&rsquo;autre.<\/p>\n<pre>root@beaglebone:~# <strong>while true; do cat \/sys\/devices\/ocp.2\/helper.11\/AIN5 ; done<\/strong>\n[...]\n0\n0\n0\n10\n87\n280\n561\n987\n1460\n1728\n1796\n1799\n1798\n[...]\n1799\n1798\n1778\n1728\n1578\n1331\n967\n621\n359\n221\n116\n61\n13\n0\n0\n[...]\n<strong>(<em>Contr\u00f4le-C<\/em>)<\/strong>\nroot@beaglebone:~#<\/pre>\n<p style=\"text-align: justify;\">La boucle du shell n&rsquo;\u00e9tant pas tr\u00e8s rapide, nous voyons peu de valeurs durant la phase interm\u00e9diaire entre les deux but\u00e9es. La documentation du processeur AM3359 du BeagleBone Black pr\u00e9cise qu&rsquo;il peut r\u00e9aliser 200.000 \u00e9chantillonnages par seconde. V\u00e9rifions ceci avec un petit programme C qui va lire en boucle l&rsquo;entr\u00e9e AIN indiqu\u00e9e.<\/p>\n<pre><strong>read-ain.c:<\/strong>\n#include &lt;fcntl.h&gt;\n#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;string.h&gt;\n#include &lt;unistd.h&gt;\n\n#define BUFFER_SIZE 128\n#define HELPER_NAME \"cape-bone-iio\\n\"\n\nint main(int argc, char * argv[])\n{\n\tint num;\n\tint fd;\n\tchar buffer[BUFFER_SIZE];\n\tint i;\n\tint nb_samples;\n\tint * values;\n\tint n;\n\n\tif ((argc &lt; 3)\n\t || (sscanf(argv[1], \"%d\", &amp; num) != 1)\n\t || (sscanf(argv[2], \"%d\", &amp; nb_samples) != 1)) {\n\t\tfprintf(stderr, \"usage: %s analog-input-number nb-samples\\n\", argv[0]);\n\t\texit(EXIT_FAILURE);\n\t}\n\tif ((num &lt; 0) || (num &gt; 6)) {\n\t\tfprintf(stderr, \"wrong analog input number: %d\\n\", num);\n\t\texit(EXIT_FAILURE);\n\t}\n\tvalues = calloc(nb_samples, sizeof(int));\n\tif (values == NULL) {\n\t\tperror(argv[0]);\n\t\texit(EXIT_FAILURE);\n\t}\n\n\tstrcpy(buffer, \"\/sys\/devices\/bone_capemgr.8\/slots\");\n\tfd = open(buffer, O_WRONLY);\n\tif (fd &lt; 0) {\n\t\tperror(buffer);\n\t\texit(EXIT_FAILURE);\n\t}\n\twrite(fd, HELPER_NAME, strlen(HELPER_NAME));\n\tclose(fd);\n\n\tsnprintf(buffer, BUFFER_SIZE, \"\/sys\/devices\/ocp.2\/helper.11\/AIN%d\", num);\n\tfd = open(buffer, O_RDONLY);\n\tif (fd &lt; 0) {\n\t\tperror(buffer);\n\t\texit(EXIT_FAILURE);\n\t}\n\tfor (i = 0; i &lt; nb_samples; i ++) {\n\t\tlseek(fd, 0, SEEK_SET);\n\t\tn = read(fd, buffer, BUFFER_SIZE);\n\t\tif (n &lt; 0) {\n\t\t\tperror(\"read\");\n\t\t\texit(EXIT_FAILURE);\n\t\t}\n\t\tbuffer[n] = '\\0';\n\t\tif (sscanf(buffer, \"%d\", &amp; (values[i])) != 1) {\n\t\t\tfprintf(stderr, \"unreadable value: %s\\n\", buffer);\n\t\t\texit(EXIT_FAILURE);\n\t\t}\n\/\/\t\tusleep(1000);\n\t}\n\tfor (i = 0; i &lt; nb_samples; i ++) {\n\t\tfprintf(stdout, \"%d\\n\", values[i]);\n\t}\n\n\tclose (fd);\n\treturn EXIT_SUCCESS;\n}<\/pre>\n<p style=\"text-align: justify;\">Ce programme lit en boucle l&rsquo;entr\u00e9e analogique indiqu\u00e9e en premier argument et stocke les valeurs dans un tableau dont la dimension est fournie en second argument. Puis il affiche le r\u00e9sultat. Compilons-le, et ex\u00e9cutons-le avec peu d&rsquo;it\u00e9rations pour commencer.<\/p>\n<pre>root@beaglebone:~# <strong>gcc read-ain.c -o read-ain -Wall<\/strong>\nroot@beaglebone:~# <strong>time  .\/read-ain 5 32<\/strong>\nroot@beaglebone:~# .\/read-ain 5  32\n669\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n1555\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\n-1270740598\nroot@beaglebone:~#<\/pre>\n<p style=\"text-align: justify;\">Nous nous apercevons alors que le driver nous renvoie des valeurs erron\u00e9es si nous lisons l&rsquo;entr\u00e9e analogique trop vite. En effet, <strong>il ne v\u00e9rifie pas<\/strong> (ce qui est probablement une erreur) <strong>si la lecture pr\u00e9c\u00e9dente est termin\u00e9e avant d&rsquo;en relancer une nouvelle<\/strong>. Un patch est apparemment en cours d&rsquo;int\u00e9gration pour le driver de l&rsquo;ADC AM335x, mais en attendant, le plus simple est d&rsquo;ajouter une petite attente apr\u00e8s chaque lecture bien que ce ne soit qu&rsquo;un palliatif in\u00e9l\u00e9gant. Empiriquement, j&rsquo;ai vu qu&rsquo;un sommeil de 900 \u00e0 1000 microsecondes semble suffire (c&rsquo;est la ligne en commentaire dans l&rsquo;exemple ci-dessus).<\/p>\n<h1>Conclusion<\/h1>\n<p style=\"text-align: justify;\">Les entr\u00e9es analogiques accessibles par l&rsquo;interm\u00e9diaire du port P9 sont initialement pr\u00e9vues pour la gestion d&rsquo;un \u00e9cran tactile. En l&rsquo;\u00e9tat actuel, le driver ne permet pas d&rsquo;obtenir directement depuis l&rsquo;espace utilisateur des valeurs d&rsquo;acquisition \u00e0 une fr\u00e9quence sup\u00e9rieure \u00e0 1kHz environ, ce qui est plut\u00f4t faible en traitement du signal.<\/p>\n<p style=\"text-align: justify;\">Ces entr\u00e9es sont donc bien adapt\u00e9es pour participer \u00e0 l&rsquo;IHM d&rsquo;un syst\u00e8me embarqu\u00e9 (en lisant la valeur d&rsquo;un potentiom\u00e8tre par exemple), mais pas pour des v\u00e9ritables acquisitions de donn\u00e9es analogiques. Nous pouvons esp\u00e9rer que l&rsquo;\u00e9volution du driver pour le convertisseur A\/N am\u00e9liorera cette situation.<\/p>\n<p>&nbsp;<\/p>\n<p>Sources&nbsp;:<br \/>\n<a title=\"http:\/\/www.ti.com\/product\/am3359\" href=\"http:\/\/www.ti.com\/product\/am3359\" target=\"_blank\">Sitara AM335x Datasheet<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Le nouveau BeagleBone Black est compatible avec son pr&eacute;d&eacute;cesseur blanc en ce qui concerne les ports d&rsquo;entr&eacute;es-sorties, ce qui lui permet d&rsquo;h&eacute;riter de ses fameuses &laquo;&nbsp;capes&nbsp;&raquo; (les cartes d&rsquo;extension que l&rsquo;on peut empiler afin d&rsquo;ajouter de nouvelles fonctionnalit&eacute;s). Pour commencer &agrave; explorer le BeagleBone Black, je me suis int&eacute;ress&eacute; &agrave; ses entr&eacute;es analogiques, comme @HuguesSert [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18,5,8,10],"tags":[],"class_list":["post-3622","post","type-post","status-publish","format-standard","hentry","category-beagleboneblack","category-embarque","category-linux-2","category-microprocesseur"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/3622","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/comments?post=3622"}],"version-history":[{"count":38,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/3622\/revisions"}],"predecessor-version":[{"id":3668,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/3622\/revisions\/3668"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=3622"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=3622"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=3622"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}