{"id":207484,"date":"2013-12-26T15:53:03","date_gmt":"2013-12-26T11:53:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=207484"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=207484","title":{"rendered":"<span class=\"post_title\">\u0412\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u0430 \u0438\u0437 \u043e\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043c\u044b\u0448\u0438<\/span>"},"content":{"rendered":"<div class=\"content html_format\"> \t\t\t\u0414\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u0432 \u043e\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043c\u044b\u0448\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u0430\u043c\u0435\u0440\u0430-\u0441\u0435\u043d\u0441\u043e\u0440. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441 \u044d\u0442\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440.<\/p>\n<p>  \u0414\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0441\u0442\u0430\u0440\u044b\u0439 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0442\u043e\u0440 Logitech RX 250 \u0441 \u0447\u0438\u043f\u043e\u043c ADNS-5020. \u042d\u0442\u043e\u0442 \u0441\u0435\u043d\u0441\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c 15&#215;15 \u0442\u043e\u0447\u0435\u043a, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e \u043e\u0441\u044f\u043c X-Y.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/1ba\/663\/7c9\/1ba6637c993f4cbe0adf85f1060cc942.jpg\"\/><\/p>\n<p>  \u0414\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f:<br \/>   \u2014 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 arduino<br \/>   \u2014 ethernet \u0448\u0438\u043b\u0434<br \/>   \u2014 \u043e\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043c\u044b\u0448\u044c \u0441 \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u043c ADNS-5020<br \/>   \u2014 \u0440\u0435\u0437\u0438\u0441\u0442\u043e\u0440 10 \u043a\u041e\u043c<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h6>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0445\u0435\u043c\u0443<\/h6>\n<p>  \u041e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u0435 \u043e\u0442 \u043f\u0435\u0447\u0430\u0442\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u044b \u043c\u044b\u0448\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u044b ADNS-5020: NRESET(3), NCS(4), SDIO(1), SCLK(8) \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0430\u044f\u043b\u044c\u043d\u0438\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u043a\u0443\u0441\u0430\u0447\u043a\u0430\u043c\u0438.<br \/>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/772\/815\/05f\/77281505f2dd94754c8ec0db6ad283b3.png\"\/><br \/>  \u041f\u0440\u0438\u043f\u0430\u044f\u0439\u0442\u0435 \u0440\u0435\u0437\u0438\u0441\u0442\u043e\u0440 10 \u043a\u041e\u043c \u043c\u0435\u0436\u0434\u0443 \u0432\u044b\u0432\u043e\u0434\u0430\u043c\u0438 NRESET \u0438 +5\u0412. \u041a \u0432\u044b\u0432\u043e\u0434\u0430\u043c NCS, DSIO, SCLK, +5V, GND \u043f\u0440\u0438\u043f\u0430\u044f\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u043e\u0434\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0439 \u0434\u043b\u0438\u043d\u044b (20 \u0441\u043c).<br \/>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u0430\u043a\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439:<br \/>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/8b4\/0ab\/d4d\/8b40abd4dbc5d6562479986d2c8ba63b.png\"\/><\/p>\n<p>  \u041f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u0435 Ethernet \u0448\u0438\u043b\u0434 \u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443 arduino \u0438 \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u0435 \u0435\u0433\u043e \u043a \u0441\u0435\u0442\u0438.<br \/>  \u0417\u0430\u0442\u0435\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u0435 \u0441\u0435\u043d\u043e\u0440 \u0441 arduino \u043a\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0438\u0436\u0435:<br \/>  +5V \u2014 Arduino +5V<br \/>  GND \u2014 Arduino GND<br \/>  NCS \u2014 Arduino digital pin 7<br \/>  SDIO \u2014 Arduino digital pin 6<br \/>  SCLK \u2014 Arduino digital pin 5<\/p>\n<h6>\u0421\u043a\u0435\u0442\u0447 \u0434\u043b\u044f Arduino<\/h6>\n<p>  \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u0435 \u0432 \u044d\u0442\u043e\u043c \u0441\u043a\u0435\u0442\u0447\u0435 IP \u0430\u0434\u0440\u0435\u0441 (192.168.1.102) \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430.<br \/>  \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0441\u043a\u0435\u0442\u0447 \u0432 arduino.<\/p>\n<pre><code class=\"cpp\">#include &lt;SPI.h&gt; #include &lt;Ethernet.h&gt; #include &lt;EthernetUdp.h&gt;  byte arduinoMac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress arduinoIP(192, 168, 1, 177); \/\/ desired IP for Arduino unsigned int arduinoPort = 8888;      \/\/ port of Arduino  IPAddress receiverIP(192, 168, 1, 102); \/\/ IP of udp packets receiver unsigned int receiverPort = 6000;      \/\/ port to listen on my PC  EthernetUDP Udp;  int SCLK = 5; int SDIO = 6; int NCS  = 7;  void setup() {   Serial.begin(9600);   Ethernet.begin(arduinoMac,arduinoIP);   Udp.begin(arduinoPort);      pinMode(SCLK, OUTPUT);   pinMode(SDIO, OUTPUT);   pinMode(NCS, OUTPUT);      mouse_reset();   delay(10); }  void loop() {   char img[225];   for (int i=0;i&lt;225;i++){       img[i]=readLoc(0x0b);       img[i] &= 0x7F;       img[i]+=1;\/\/if there is 0 value, part of udp package is lost       Serial.print(img[i], DEC);       Serial.print(&quot;,&quot;);       delay(2);   }     Serial.println();   Udp.beginPacket(receiverIP, receiverPort); \/\/start udp packet   Udp.write(img); \/\/write mouse data to udp packet   Udp.endPacket(); \/\/ end packet    delay(500); }  void mouse_reset(){   \/\/ Initiate chip reset   digitalWrite(NCS, LOW);   pushbyte(0x3a);   pushbyte(0x5a);   digitalWrite(NCS, HIGH);   delay(10);   \/\/ Set 1000cpi resolution   digitalWrite(NCS, LOW);   pushbyte(0x0d);   pushbyte(0x01);   digitalWrite(NCS, HIGH); }  unsigned int readLoc(uint8_t addr){   unsigned int ret=0;   digitalWrite(NCS, LOW);   pushbyte(addr);   ret=pullbyte();   digitalWrite(NCS, HIGH);   return(ret); }  void pushbyte(uint8_t c){   pinMode(SDIO, OUTPUT);   for(unsigned int i=0x80;i;i=i&gt;&gt;1){     digitalWrite(SCLK, LOW);     digitalWrite(SDIO, c & i);     digitalWrite(SCLK, HIGH);   } }  unsigned int pullbyte(){   unsigned int ret=0;   pinMode(SDIO, INPUT);   for(unsigned int i=0x80; i&gt;0; i&gt;&gt;=1) {     digitalWrite(SCLK, LOW);     ret |= i*digitalRead(SDIO);     digitalWrite(SCLK, HIGH);   }   pinMode(SDIO, OUTPUT);   return(ret); } <\/code><\/pre>\n<p>  \u041e\u0442\u043a\u0440\u044b\u0432 \u043e\u043a\u043d\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043e\u0442 \u043c\u044b\u0448\u0438:<br \/>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/5fd\/7a1\/ffb\/5fd7a1ffb0f66d03615d3be0f24b7ff1.png\"\/><\/p>\n<h6>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Node.js \u0438 Socket.IO<\/h6>\n<p>  \u0414\u043b\u044f \u043f\u043e\u043a\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 node.js \u0438 socket.io. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 node.js \u043e\u0442\u0441\u044e\u0434\u0430: <a href=\"http:\/\/nodejs.org\/\">nodejs.org<\/a> \u0438 \u043d\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435: <br \/>  <b>npm install socket.io<\/b><\/p>\n<h6>\u041a\u043e\u0434 \u0434\u043b\u044f \u0432\u0435\u0431\u0441\u0430\u0439\u0442\u0430 Node.js<\/h6>\n<p>  \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e udp \u043e\u0442 arduino \u0438 \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u043c \u0438\u0445 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0439 web \u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<pre><code class=\"java\">var dgram = require(&quot;dgram&quot;); var server = dgram.createSocket(&quot;udp4&quot;);  var io = require('socket.io').listen(8000); \/\/ server listens for socket.io communication at port 8000 io.set('log level', 1); \/\/ disables debugging. this is optional. you may remove it if desired.  server.on(&quot;message&quot;, function (msg, rinfo) { \/\/every time new data arrives do this:   \/\/console.log(&quot;server got: &quot; + msg + &quot; from &quot; + rinfo.address + &quot;:&quot; + rinfo.port);    \/\/console.log(&quot;server got:&quot; + msg);    io.sockets.emit('message', msg); });  server.on(&quot;listening&quot;, function () {   var address = server.address();   console.log(&quot;server listening &quot; + address.address + &quot;:&quot; + address.port); });  server.bind(6000); \/\/listen to udp traffic on port 6000  var http = require(&quot;http&quot;),     url = require(&quot;url&quot;),     path = require(&quot;path&quot;),     fs = require(&quot;fs&quot;)     port = process.argv[2] || 8888;  http.createServer(function(request, response) {    var uri = url.parse(request.url).pathname     , filename = path.join(process.cwd(), uri);    var contentTypesByExtension = {     '.html': &quot;text\/html&quot;,     '.css':  &quot;text\/css&quot;,     '.js':   &quot;text\/javascript&quot;   };    fs.exists(filename, function(exists) {    \tif(!exists) {       response.writeHead(404, {&quot;Content-Type&quot;: &quot;text\/plain&quot;});       response.write(&quot;404 Not Found\\n&quot;);       response.end();       return;     } \t     if (fs.statSync(filename).isDirectory()) filename += '\/index.html';      fs.readFile(filename, &quot;binary&quot;, function(err, file) {       var headers = {};       var contentType = contentTypesByExtension[path.extname(filename)];       if (contentType) headers[&quot;Content-Type&quot;] = contentType;       response.writeHead(200, headers);       response.write(file, &quot;binary&quot;);       response.end();     });   }); }).listen(parseInt(port, 10));  console.log(&quot;Static file server running at\\n  =&gt; http:\/\/localhost:&quot; + port + &quot;\/\\nCTRL + C to shutdown&quot;); <\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0432 \u0444\u0430\u0439\u043b: code.js<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432\u0435\u0431 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0449\u0443\u044e \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 socket.io \u0432 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 15&#215;15:  <\/p>\n<pre><code class=\"html\">&lt;html&gt; &lt;head&gt; \t&lt;style&gt; \t\t#wrapper { width:300px; height:300px; } \t\tdiv div { width:20px; height:20px; float:left; } \t&lt;\/style&gt; \t&lt;script type=&quot;text\/javascript&quot; src=&quot;\/\/localhost:8000\/socket.io\/socket.io.js&quot;&gt;&lt;\/script&gt; \t&lt;script&gt; \t\tvar socket = io.connect('http:\/\/localhost:8000'); \t\tsocket.on('connect', function () { \t\t\tsocket.on('message', function (msg) { \t\t\t\tdocument.getElementById('wrapper').innerHTML = ''; \t\t\t\tfor (var i = 0; i &lt; 225; i++) { \t\t\t\t\tpixDraw(Math.round((msg[i])*2.4)); \t\t\t\t} \t\t\t}); \t\t});\t \t\tfunction pixDraw(clr) { \t\t\tvar pixDiv = document.createElement('div'); \t\t\tpixDiv.style.backgroundColor = &quot;rgb(&quot;+clr+&quot;,&quot;+clr+&quot;,&quot;+clr+&quot;)&quot;; \t\t\tdocument.getElementById(&quot;wrapper&quot;).appendChild(pixDiv); \t\t} \t&lt;\/script&gt; &lt;\/head&gt; &lt;body&gt; \t&lt;div id=&quot;wrapper&quot;&gt;&lt;\/div&gt; &lt;\/body&gt; &lt;\/html&gt; <\/code><\/pre>\n<p>  \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435 \u043a\u0430\u043a index.html<\/p>\n<h4>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443!<\/h4>\n<p>  \u0414\u043b\u044f windows \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0430\u0440\u0445\u0438\u0432 download.zip \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u0432\u043d\u0438\u0437\u0443 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c runme.bat. \u0412 linux \u043d\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 node code.js \u0432 \u043e\u043a\u043d\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430.<br \/>  \u0412 \u043f\u043e\u043b\u0435 \u0430\u0434\u0440\u0435\u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 <a href=\"http:\/\/localhost:8888\/\">http:\/\/localhost:8888\/<\/a> \u0438 \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0435\u0435 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0442 \u0441\u0435\u043d\u0441\u043e\u0440\u0430 \u043c\u044b\u0448\u0438:<br \/>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/b51\/410\/6ef\/b514106ef6fddbc69632311990d316cc.png\"\/><br \/>  <a href=\"http:\/\/frenki.net\/2013\/12\/convert-optical-mouse-into-arduino-web-camera\/\">Franci Kapel<\/a><br \/>  <a href=\"http:\/\/frenki.net\/uploads\/mousecamera.zip\">mousecamera.zip<\/a> \t\t\t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/207484\/\"> http:\/\/habrahabr.ru\/post\/207484\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\"> \t\t\t\u0414\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u0432 \u043e\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043c\u044b\u0448\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u0430\u043c\u0435\u0440\u0430-\u0441\u0435\u043d\u0441\u043e\u0440. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441 \u044d\u0442\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440.<\/p>\n<p>  \u0414\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0441\u0442\u0430\u0440\u044b\u0439 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0442\u043e\u0440 Logitech RX 250 \u0441 \u0447\u0438\u043f\u043e\u043c ADNS-5020. \u042d\u0442\u043e\u0442 \u0441\u0435\u043d\u0441\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c 15&#215;15 \u0442\u043e\u0447\u0435\u043a, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e \u043e\u0441\u044f\u043c X-Y.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/1ba\/663\/7c9\/1ba6637c993f4cbe0adf85f1060cc942.jpg\"\/><\/p>\n<p>  \u0414\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f:<br \/>   \u2014 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 arduino<br \/>   \u2014 ethernet \u0448\u0438\u043b\u0434<br \/>   \u2014 \u043e\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043c\u044b\u0448\u044c \u0441 \u0441\u0435\u043d\u0441\u043e\u0440\u043e\u043c ADNS-5020<br \/>   \u2014 \u0440\u0435\u0437\u0438\u0441\u0442\u043e\u0440 10 \u043a\u041e\u043c  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-207484","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/207484","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=207484"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/207484\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=207484"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=207484"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=207484"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}