{"id":1091,"date":"2013-05-07T18:59:21","date_gmt":"2013-05-07T16:59:21","guid":{"rendered":"http:\/\/ubik75.com\/?p=1091"},"modified":"2019-03-24T11:15:35","modified_gmt":"2019-03-24T09:15:35","slug":"bus-i2c-liaison-nxt-carte-arduino-partie-2","status":"publish","type":"post","link":"http:\/\/ubik75.com\/?p=1091","title":{"rendered":"Bus I2C, liaison NXT carte Arduino, partie 2."},"content":{"rendered":"<p>Apr\u00e8s avoir effectu\u00e9 un essai concluant, (voir article\u00a0pr\u00e9c\u00e9dent), je me suis lanc\u00e9 dans la lecture d&rsquo;une entr\u00e9e num\u00e9rique sur le NXT. Le principe reste le m\u00eame que pour les entr\u00e9es analogiques.<\/p>\n<p>A la fin de l&rsquo;article une petite surprise aboutit \u00e0 ce que je voulais faire avec la carte Arduino: l&rsquo;utiliser en capteur.<\/p>\n<p><!--more--><\/p>\n<p>Je vous joins les programmes Arduino et RobotC pour la lecture de l&rsquo;\u00e9tat d&rsquo;une entr\u00e9e num\u00e9rique.<\/p>\n<p><span style=\"text-decoration: underline;\">Code Arduino (version 1.0.3):<\/span><\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\n\/\/ A4 - SDA\r\n\/\/ A5 - SCL\r\n#include\r\nbyte read_register = 0x00;\r\nString valeur;\r\nchar buffer&#x5B;32];\r\nbyte pin8,pin9,pin10,pin11,pin12;\r\n\r\nvoid setup(){\r\n pinMode(8, INPUT);\r\n Wire.begin(0x0A); \/\/ Adresse carte Arduino\r\n Wire.onRequest(requestEvent); \/\/ Envoi data\r\n Wire.onReceive(receiveI2C); \/\/ Reception data\r\n}\r\n\r\nvoid loop(){\r\n valeur = String(digitalRead(8),DEC);\r\n valeur.toCharArray(buffer, 10);\r\n Serial.println(pin8);\r\n delay(100);\r\n}\r\n\/\/ Demande du NXT la proc\u00e9dure est lanc\u00e9e\r\nvoid receiveI2C(int bytesIn)\r\n{\r\n read_register = bytesIn;\r\n while(1 &lt; Wire.available())\r\n {\r\n read_register = Wire.read();\r\n }\r\n}\r\n\/\/ proc\u00e9dure envoie des valeurs ana A0 ou A1 au NXT pour affichage\r\nvoid requestEvent()\r\n{\r\n if(read_register == 0x01){\r\n Wire.write(buffer); \/\/ envoi de la r\u00e9ponse au NXT pour affichage\r\n }\r\n}\r\n\r\n<\/pre>\n<p><span style=\"text-decoration: underline;\">Code RobotC:<\/span><\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\n#pragma config(Sensor, S1,TIR,sensorI2CCustom)\r\n\r\n#define ARDUINO_ADDRESS 0x14 \/\/ adresse carte Arduino\r\n#define ARDUINO_PORT S1\r\n\r\nubyte I2Cmessage&#x5B;22];\r\nchar I2Creply&#x5B;20];\r\nstring str1;\r\nstring str2;\r\nstring str3;\r\nstring strtotal;\r\nint valeur = 0;\r\nvoid i2c_read_registers_text(ubyte register_2_read, int message_size, int return_size){\r\n memset(I2Creply, 0, sizeof(I2Creply));\r\n message_size = message_size+3;\r\n\r\nI2Cmessage&#x5B;0] = message_size;\r\n I2Cmessage&#x5B;1] = ARDUINO_ADDRESS;\r\n I2Cmessage&#x5B;2] = register_2_read;\r\n sendI2CMsg(S1, &amp;I2Cmessage&#x5B;0], return_size);\r\n wait1Msec(20);\r\n\r\nreadI2CReply(ARDUINO_PORT, &amp;I2Creply&#x5B;0], return_size);\r\n\r\nint i = 0;\r\n while(true){\r\n writeDebugStream(&quot;%c&quot;, I2Creply&#x5B;i]);\r\n str1 = I2Creply&#x5B;0]; \/\/ Mise en memoire des valeurs pour affichage\r\n wait1Msec(50);\r\n i++;\r\n\r\nif(I2Creply&#x5B;i] == 0){\r\n valeur = atoi(str1); \/\/ conversion string vers int avec atoi()\r\n nxtDisplayString(2, &quot;Input 8 etat:%2u&quot;, valeur); \/\/ affichage ecran NXT\r\n break;\r\n }\r\n }\r\n writeDebugStreamLine(&quot; &quot;);\r\n}\r\n\r\ntask main()\r\n{\r\n while(true){\r\n i2c_read_registers_text(0x01, 0,1); \/\/ Demande etat input 8\r\n wait1Msec(2000);\r\n }\r\n}\r\n\r\n<\/pre>\n<p style=\"text-align: justify;\">La principale diff\u00e9rence se situe, pour le programme Arduino, \u00e0 lire l&rsquo;\u00e9tat d&rsquo;une entr\u00e9e num\u00e9rique (0 ou 1). Le code RobotC reste pratiquement identique, il ne traite qu&rsquo;un seul octet \u00e0 afficher.<\/p>\n<p style=\"text-align: justify;\">Pour aller plus loin, l&rsquo;utilisation de la carte Arduino offrant de nombreuses\u00a0possibilit\u00e9s et l&rsquo;exploration de l&rsquo;I2C que j&rsquo;ai effectu\u00e9e me permettant d\u2019utiliser\u00a0celle ci comme capteur ou actionneur, j&rsquo;ai connect\u00e9 \u00e0 l&rsquo;Arduino un capteur de temp\u00e9rature DS18S20. Maintenant\u00a0le NXT est capable de relever la temp\u00e9rature et dans cet exemple, l&rsquo;Arduino est\u00a0utilis\u00e9\u00a0comme capteur.<\/p>\n<p><span style=\"text-decoration: underline;\">Sch\u00e9ma:<\/span><\/p>\n<p><a href=\"http:\/\/ubik75.com\/wp-content\/uploads\/2013\/05\/cablageDS18S20.jpg\" rel=\"lightbox\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1105\" data-permalink=\"http:\/\/ubik75.com\/?attachment_id=1105\" data-orig-file=\"http:\/\/ubik75.com\/wp-content\/uploads\/2013\/05\/cablageDS18S20.jpg\" data-orig-size=\"814,422\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;ubik&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1367927553&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}\" data-image-title=\"cablageDS18S20\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"http:\/\/ubik75.com\/wp-content\/uploads\/2013\/05\/cablageDS18S20-300x155.jpg\" data-large-file=\"http:\/\/ubik75.com\/wp-content\/uploads\/2013\/05\/cablageDS18S20.jpg\" class=\"aligncenter size-medium wp-image-1105\" title=\"cablageDS18S20\" src=\"http:\/\/ubik75.com\/wp-content\/uploads\/2013\/05\/cablageDS18S20-300x155.jpg\" alt=\"\" width=\"300\" height=\"155\" srcset=\"http:\/\/ubik75.com\/wp-content\/uploads\/2013\/05\/cablageDS18S20-300x155.jpg 300w, http:\/\/ubik75.com\/wp-content\/uploads\/2013\/05\/cablageDS18S20-500x259.jpg 500w, http:\/\/ubik75.com\/wp-content\/uploads\/2013\/05\/cablageDS18S20.jpg 814w\" sizes=\"auto, (max-width: 300px) 85vw, 300px\" \/><\/a><\/p>\n<p><span style=\"text-decoration: underline;\">Code Arduino (version 1.0.3):<\/span><\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\n\/\/ A4 - SDA\r\n\/\/ A5 - SCL\r\n#include &lt;Wire.h&gt;\r\n#include &lt;OneWire.h&gt;\r\n#include &lt;DallasTemperature.h&gt;\r\n#define ONE_WIRE_BUS 9 \/\/ 1-wire sur borne 9\r\nOneWire oneWire(ONE_WIRE_BUS);\r\nDallasTemperature sensors(&amp;oneWire);\r\n\/\/ adresses des capteurs de temperatures DS18S20\r\nDeviceAddress Temp3 = { 0x10, 0xD2, 0xAD, 0x71, 0x01, 0x08, 0x00, 0x74 };\r\n\r\nbyte read_register = 0x00;\r\nString valeur,valeur1;\r\nchar buffer&#x5B;32], buffer1&#x5B;32];\r\nfloat temp3;\r\nlong milliref1;\r\nint tempmod;\r\n\r\nvoid setup()\r\n{\r\n Wire.begin(0x0A); \/\/ Adresse carte Arduino\r\n Wire.onRequest(requestEvent); \/\/ Envoi data\r\n Wire.onReceive(receiveI2C); \/\/ Reception data\r\n Serial.begin(9600);\r\n sensors.begin(); \/\/ activation capteur de temp\u00e9rature\r\n sensors.setResolution(Temp3, 10);\r\n delay(1000);\r\n}\r\n\r\nvoid loop()\r\n{\r\n sensors.requestTemperatures(); \/\/ demande de mesure temp\u00e9rature\r\n temp3 = sensors.getTempC(Temp3); \/\/ r\u00e9cup\u00e9ration de la temp\u00e9rature\r\n temp3 = temp3 * 100;\r\n tempmod = (int) temp3; \/\/ valeur modifi\u00e9e pour transfert\r\n valeur = String(tempmod,DEC); \/\/ conversion int en string\r\n valeur.toCharArray(buffer, 10); \/\/ conversion string en char\r\n delay(5000);\r\n}\r\n\r\n\/\/ Demande du NXT la proc\u00e9dure est lanc\u00e9e\r\nvoid receiveI2C(int bytesIn)\r\n{\r\n read_register = bytesIn;\r\n while(1 &lt; Wire.available()){\r\n read_register = Wire.read();\r\n }\r\n}\r\n\/\/ proc\u00e9dure envoie de la temp\u00e9rature pour affichage sur le NXT\r\nvoid requestEvent()\r\n{\r\n if(read_register == 0x01){\r\n Wire.write(buffer); \/\/ envoi de la r\u00e9ponse au NXT pour affichage\r\n }\r\n}\r\n\r\n<\/pre>\n<p><span style=\"text-decoration: underline;\">Code RobotC:<\/span><\/p>\n<pre class=\"brush: css; title: ; notranslate\" title=\"\">\r\n\r\n#pragma config(Sensor, S1,TIR,sensorI2CCustom)\r\n#define ARDUINO_ADDRESS 0x14 \/\/ adresse carte Arduino\r\n#define ARDUINO_PORT S1\r\n\r\nubyte I2Cmessage&#x5B;22];\r\nchar I2Creply&#x5B;20];\r\nstring str1;\r\nstring str2;\r\nstring str3;\r\nstring str4;\r\nstring strtotal;\r\nint valeur = 0;\r\nfloat temp;\r\nvoid i2c_read_registers_text(ubyte register_2_read, int message_size, int return_size){\r\n memset(I2Creply, 0, sizeof(I2Creply));\r\n message_size = message_size+3;\r\n\r\nI2Cmessage&#x5B;0] = message_size;\r\n I2Cmessage&#x5B;1] = ARDUINO_ADDRESS;\r\n I2Cmessage&#x5B;2] = register_2_read;\r\n sendI2CMsg(S1, &amp;I2Cmessage&#x5B;0], return_size);\r\n wait1Msec(20);\r\n\r\nreadI2CReply(ARDUINO_PORT, &amp;I2Creply&#x5B;0], return_size);\r\n\r\nint i = 0;\r\n while(true){\r\n writeDebugStream(&quot;%c&quot;, I2Creply&#x5B;i]);\r\n str1 = I2Creply&#x5B;0]; \/\/ Mise en memoire des valeurs pour affichage\r\n str2 = I2Creply&#x5B;1]; \/\/ Mise en memoire des valeurs pour affichage\r\n str3 = I2Creply&#x5B;2]; \/\/ Mise en memoire des valeurs pour affichage\r\n str4 = I2Creply&#x5B;3]; \/\/ Mise en memoire des valeurs pour affichage\r\n wait1Msec(50);\r\n i++;\r\n\r\nif(I2Creply&#x5B;i] == 0){\r\n\r\nstrtotal = str1 + str2; \/\/ Mise en forme pour affichage\r\n strtotal = strtotal + str3; \/\/ Mise en forme pour affichage\r\n strtotal = strtotal + str4; \/\/ Mise en forme pour affichage\r\n valeur = atoi(strtotal); \/\/ conversion string vers int avec atoi()\r\n \/\/ Convertion int en float fonctionne pour 99C &gt; temperature &gt; 10C\r\n temp = valeur;\r\n temp = temp \/ 100; \/\/ conversion pour faire apparaitre temperature avec 2 chiffres apres virgules\r\n nxtDisplayCenteredBigTextLine(3, &quot;T:%2.2f&quot;, temp); \/\/ affichage ecran NXT\r\n break;\r\n }\r\n }\r\n writeDebugStreamLine(&quot; &quot;);\r\n}\r\n\r\ntask main()\r\n{\r\n while(true){\r\n i2c_read_registers_text(0x01, 0,4); \/\/ Demande valeur temperature 4 octets\r\n wait1Msec(30000);\r\n }\r\n}\r\n\r\n<\/pre>\n<p style=\"text-align: justify;\">Le code RobotC fonctionne pour une temp\u00e9rature comprise entre 10\u00b0C et 99\u00b0C. Au del\u00e0, il y a des probl\u00e8mes de mise en forme de la temp\u00e9rature pour affichage sur le NXT. Je ne l&rsquo;ai pas fait, car je voulais juste voir si ce que je voulais faire avec une carte Arduino et le NXT fonctionnait.<\/p>\n<div class=\"jetpack-video-wrapper\"><span class=\"embed-youtube\" style=\"text-align:center; display: block;\"><iframe loading=\"lazy\" class=\"youtube-player\" width=\"840\" height=\"473\" src=\"https:\/\/www.youtube.com\/embed\/G9GGWCbVShQ?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=fr-FR&#038;autohide=2&#038;wmode=transparent\" allowfullscreen=\"true\" style=\"border:0;\" sandbox=\"allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox\"><\/iframe><\/span><\/div>\n<p style=\"text-align: justify;\">En\u00a0conclusion, la carte Arduino peut apporter un plus au NXT de par sa facilit\u00e9 de mise en place (utilisation du bus I2C) et de par la multitudes de montages que l&rsquo;on peut faire avec cette carte.<\/p>\n","protected":false},"excerpt":{"rendered":"<img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"http:\/\/ubik75.com\/wp-content\/plugins\/thumbnail-for-excerpts\/tfe_no_thumb.png\" class=\"alignleft wp-post-image tfe\" alt=\"\" title=\"\" \/><p>Apr\u00e8s avoir effectu\u00e9 un essai concluant, (voir article\u00a0pr\u00e9c\u00e9dent), je me suis lanc\u00e9 dans la lecture d&rsquo;une entr\u00e9e num\u00e9rique sur le NXT. Le principe reste le m\u00eame que pour les entr\u00e9es analogiques. A la fin de l&rsquo;article une petite surprise aboutit \u00e0 ce que je voulais faire avec la carte Arduino: l&rsquo;utiliser en capteur.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[3,7,9],"tags":[54,109,131],"class_list":["post-1091","post","type-post","status-publish","format-standard","hentry","category-arduino","category-materiel","category-nxt","tag-arduino-2","tag-i2c","tag-nxt"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p2eCSX-hB","jetpack_likes_enabled":true,"_links":{"self":[{"href":"http:\/\/ubik75.com\/index.php?rest_route=\/wp\/v2\/posts\/1091","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/ubik75.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/ubik75.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/ubik75.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/ubik75.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1091"}],"version-history":[{"count":33,"href":"http:\/\/ubik75.com\/index.php?rest_route=\/wp\/v2\/posts\/1091\/revisions"}],"predecessor-version":[{"id":1711,"href":"http:\/\/ubik75.com\/index.php?rest_route=\/wp\/v2\/posts\/1091\/revisions\/1711"}],"wp:attachment":[{"href":"http:\/\/ubik75.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1091"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/ubik75.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1091"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/ubik75.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1091"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}