<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8516057646005806683</id><updated>2026-03-11T18:16:18.415+08:00</updated><category term="Arduino"/><category term="AVR"/><category term="USB"/><category term="紅外線"/><category term="LabVIEW"/><category term="PIC"/><category term="Arduino Integration"/><category term="MISC"/><category term="Bluetooth"/><category term="IRRemote Library"/><category term="Android"/><category term="OpenWrt"/><category term="Cloud"/><category term="Python"/><category term="Dropbox"/><category term="Flash/Flex"/><category term="I2C"/><category term="LIRC/WinLIRC"/><category term="Lua"/><category term="Firmata"/><category term="Fritzing"/><category term="C#"/><category term="Embeda"/><category term="Processing"/><category term="Proteus"/><category term="Tcl"/><category term="C"/><category term="DokuWiki"/><category term="Electronics"/><category term="Networking"/><category term="Scripting"/><category term="Zigbee"/><category term="ASP.NET"/><category term="Arduino DIY"/><category term="Arduino Libraries"/><category term="Raspberry Pi"/><category term="Video Workshop"/><category term="JavaScript"/><category term="Virtualization"/><title type='text'>Cooper Maa</title><subtitle type='html'>一家烤肉萬家香，開放分享才會快樂</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>353</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-5801322697624035168</id><published>2013-11-04T21:54:00.001+08:00</published><updated>2015-01-29T09:49:56.835+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Lua"/><title type='text'>Introduction to Corona SDK 簡報上線</title><content type='html'>九月初玩了一下 Corona SDK，當時整理了一份筆記，筆記簡報檔現在已經放到線上，與君分享，希望對有需要的人有所幫助。 &lt;p&gt;  &lt;iframe style=&quot;margin-bottom: 5px; max-width: 100%; border-top: #ccc 1px solid; border-right: #ccc 1px solid; border-bottom: #ccc 1px solid; border-left: #ccc 1px solid&quot; height=&quot;355&quot; marginheight=&quot;0&quot; src=&quot;//www.slideshare.net/slideshow/embed_code/27885186&quot; frameborder=&quot;0&quot; width=&quot;425&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt; &lt;/iframe&gt;  &lt;div style=&quot;margin-bottom: 5px&quot;&gt;&lt;strong&gt;&lt;a title=&quot;Introduction to corona sdk&quot; href=&quot;//www.slideshare.net/coopermaa/introduction-to-corona-sdk&quot; target=&quot;_blank&quot;&gt;Introduction to corona sdk&lt;/a&gt; &lt;/strong&gt;from &lt;strong&gt;&lt;a href=&quot;//www.slideshare.net/coopermaa&quot; target=&quot;_blank&quot;&gt;馬 萬圳&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/5801322697624035168/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/5801322697624035168?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/5801322697624035168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/5801322697624035168'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/11/introduction-to-corona-sdk.html' title='Introduction to Corona SDK 簡報上線'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-1221429764340026207</id><published>2013-09-07T22:41:00.001+08:00</published><updated>2013-09-10T17:04:45.067+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript"/><title type='text'>Chart.js: 一個簡單的 JS Chart Library</title><content type='html'>&lt;p&gt;&lt;a href=&quot;http://www.chartjs.org/&quot;&gt;Chart.js&lt;/a&gt; 是一個 Open Source 的 JavaScript Chart Library。它一共有 6 種 Chart，全都是 HTML5 based。&lt;/p&gt;  &lt;p&gt;底下是 Chart.js 所提供的 6 種 Charts:&lt;/p&gt;  &lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;400&quot; border=&quot;0&quot;&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;&lt;strong&gt;Line Chart&lt;/strong&gt;           &lt;br /&gt;          &lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8ZEL6uxjlhL-Qmj1Que2ZlWVeqE4FqEqlwWyZ3_4wwKB0Efz2wzzrQoRwK5evmaRilHf-1QcwHpvLgYkdEeT_FjlaacXhYCo16nN4zQUEc6co50HiJjQfoBiJtno79QNu_1gKBKB0LNf7/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE7REUaebWRiHOF6UXF2RVyrxNw_wvLdXb6dxvjgqSF4AG3hRqfuFGd2fpfqc-YqVCTxqFPkVuVwdPqCG81I0VAeF1u4U2pgkLx6dJC9WIIfPgnSCz9m3Ampqqb8OaQ-GIBJq_PetscFX1/?imgmax=800&quot; width=&quot;422&quot; height=&quot;316&quot; /&gt;&lt;/a&gt;           &lt;br /&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;&lt;strong&gt;Bar Chart&lt;/strong&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibQcXz57ag7YlW3qrOO0gCQfXJ35LNc9bX23LMMXPYcWla-3PAvjxB4MLNALY8plc5g3RgFzJsd8FpxszcdbcmWcZejb8ykZ-MmYn29vD63HR8sFiZHuCn_RjiuFfdOAOohbXHPk-P-_rz/s1600-h/image%25255B11%25255D.png&quot;&gt;            &lt;br /&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3RDyp5vBYU9ulxrxZA5_oCXdAYUkaLd-GkYsCG6IyLHcl7iFYeUSSXFbi_1XGEhKcHYUaeYOEmt28b6wE0XoMfIH8Zo2nZqxdD8sRtn2-stqkyLjielOX4-tD9Y_3ldOfb91iII0bnRvA/?imgmax=800&quot; width=&quot;421&quot; height=&quot;318&quot; /&gt;&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;&lt;strong&gt;Radar Chart&lt;/strong&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_eEfiQ0khyphenhyphenuDLMa8t-PfuqY0vK8N_7rqtD-Pioo9knvISi3eZPGfg-dJvlZyo0rlWEsyzKMujx86iqt78Tzx3U4oZuLKKBFF77cjebN6IcDuKB3_PPcJpZxbq7UJaO-c1TXdslM20HQfT/s1600-h/image%25255B14%25255D.png&quot;&gt;            &lt;br /&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJakTzWmFoAKBXQ4NrU0zPgY2YxgEgPUAydh44kU9sx-0JbeuzK60AGXVYKfXVd7eIdN6pI2hJrU55uMyxITcJjFwXI2TgP-3xT0DU9xu5GxbGTltGTWcMkx-YPUs5G43LmI9ng6Gatf0r/?imgmax=800&quot; width=&quot;361&quot; height=&quot;330&quot; /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;&lt;strong&gt;Pie Chart&lt;/strong&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRQhVED4_grzUd9d24tSLjUjqWZzijtwz7w93fvHbmTRZ4OoDQT031PvGHTVf7fW8E4mlNtqUqeVb3PzLP8lNG5QA1f5cZRXcktU6hZyu_l_7xlmc6pD2BO8GwVOojN8Edbqeff_lRcD_T/s1600-h/image%25255B17%25255D.png&quot;&gt;            &lt;br /&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX2EZjTufAIYvDgcLAIenXSLuErtzktpjPXFnJlAGAKmhaEc6_L66PIuvk7O3CdrX23hrCZjwllxL_vfvbySrWuBnldu50bY-d70lUT8k9mlfDjeUzUL2EYe_24esyGwnsRbo3GTYDJQiV/?imgmax=800&quot; width=&quot;312&quot; height=&quot;305&quot; /&gt;&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;&lt;strong&gt;Polar Area Chart&lt;/strong&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbT0JSdk1otSnK1HAzsuFD4jAjc1ZJ6mLUcYp5GS25TxEkspQinTqH6bwYqrtcaFt14ocOFaPxR6S96JHpCVem2vtXyGXIoTj3VuRQ7nXK1Wp8dcxo2ZcI1SRnvWI72Qq6bX3bACfmiUMY/s1600-h/image%25255B20%25255D.png&quot;&gt;            &lt;br /&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9J41Ijb7oR8_qDuF5vs6KFA5VHWbxSdmqNQWJ-1x4_Z1cQjUEMjtsTZxR621jaOeB1xpMj1CYjC5ZsIM4y1HNUr-LlBVtxgoMGrCbbJAXkx399kSlvl9E4yn9AwaQTUM3UWzaKYv40Qz_/?imgmax=800&quot; width=&quot;304&quot; height=&quot;311&quot; /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;&lt;strong&gt;Doughnut Chart&lt;/strong&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgovHJ-unoAfB6-f1xrO_eO-nSIA0lUg5c5WXI1VLXJ9KHaTDCOIAnw3xo1k5PjDYuS2FmULrxSYPuXPwJ95r79oXbVg4PfLZKibThssVptoFULTZIf5IFnRB9gVwZZKDdkEMGHs3iETLez/s1600-h/image%25255B23%25255D.png&quot;&gt;            &lt;br /&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxMsGJ2SCR7AYftTQd_306otStVBy-jVG56H-GMWx90Um-B1ZZflOmLddrVMIqTmj0pp6W8dIZmaN9N-lDBFFskw7ggOqbf1fL804xnUXJEZ-g9B-6DAGXbhwFjIjGZObjGlxsTj3ex8Ie/?imgmax=800&quot; width=&quot;318&quot; height=&quot;319&quot; /&gt;&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;h5&gt;快速上手&lt;/h5&gt;  &lt;p&gt;你可以到 github 下載 Chart.js: &lt;a href=&quot;https://github.com/nnnick/Chart.js&quot;&gt;https://github.com/nnnick/Chart.js&lt;/a&gt;。Chart.js 只需要一個 .js 檔，你可以選擇一般版的 Chart.js，也可以選擇瘦身版的 Chart.min.js。&lt;/p&gt;  &lt;p&gt;從 github 下載後，在 samples 資料夾就有 6 種 Chart 的範例。比如打開 samples/line.html 後，瀏覽器馬上就會畫出這樣一張 Line Chart:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVmVQGUun81yNw7GeasHDtbI8EDZvFLlVOt0dGxEDhNKURNEZiJG1BxpAUjttsnGE0cGEVOPgQis0NctUiGRZ1U5Ff9a491ir1l8UX3sX60-iIm3eVWuxAsuSIVdTG12ZO5AnBShY6bVGw/s1600-h/image%25255B26%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwFSmkEjHb_mTrqfsV1lPtj3VT2ouT1E7n1fh6uxsm4uEgGMNo5wDrO81ZY8COfk41QLD_-8eTuBFT4Y6m-C_J8VaWpjVnJylRH8PgxXeR4nRxlx5x26sVloJtRoSDaTjYJDdWdBG0WQKK/?imgmax=800&quot; width=&quot;588&quot; height=&quot;469&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;line.html 的內容如下 (JavaScript 部份):&lt;/p&gt;  &lt;p&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: javascript&quot;&gt;&lt;![CDATA[&lt;br /&gt;  var lineChartData = {&lt;br /&gt;      labels : [&quot;January&quot;,&quot;February&quot;,&quot;March&quot;,&quot;April&quot;,&quot;May&quot;,&quot;June&quot;,&quot;July&quot;],&lt;br /&gt;      datasets : [&lt;br /&gt;        {&lt;br /&gt;          fillColor : &quot;rgba(220,220,220,0.5)&quot;,&lt;br /&gt;          strokeColor : &quot;rgba(220,220,220,1)&quot;,&lt;br /&gt;          pointColor : &quot;rgba(220,220,220,1)&quot;,&lt;br /&gt;          pointStrokeColor : &quot;#fff&quot;,&lt;br /&gt;          data : [65,59,90,81,56,55,40]&lt;br /&gt;        },&lt;br /&gt;        {&lt;br /&gt;          fillColor : &quot;rgba(151,187,205,0.5)&quot;,&lt;br /&gt;          strokeColor : &quot;rgba(151,187,205,1)&quot;,&lt;br /&gt;          pointColor : &quot;rgba(151,187,205,1)&quot;,&lt;br /&gt;          pointStrokeColor : &quot;#fff&quot;,&lt;br /&gt;          data : [28,48,40,19,96,27,100]&lt;br /&gt;        }&lt;br /&gt;      ]     &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;  var myLine = new Chart(document.getElementById(&quot;canvas&quot;).getContext(&quot;2d&quot;)).Line(lineChartData);&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;/p&gt;  &lt;h5&gt;如何動態增加資料點？&lt;/h5&gt;  &lt;p&gt;Chart.js 沒有提供動態增加資料點的方法，這實在有點可惜。不過，我花了點時間研究了一下，發現還是有解。我的方法是這樣：在修改 datasets 的內容後，就再呼叫 new Chart() 重新產生 Chart。程式碼範例如下：&lt;/p&gt;  &lt;p&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: javascript&quot;&gt;&lt;![CDATA[&lt;br /&gt;  var lineChartData = {&lt;br /&gt;    labels: [&quot;Jan&quot;, &quot;Feb&quot;, &quot;Mar&quot;, &quot;Apr&quot;, &quot;May&quot;, &quot;Jun&quot;,&lt;br /&gt;            &quot;Jul&quot;, &quot;Aug&quot;, &quot;Sep&quot;, &quot;Oct&quot;, &quot;Nov&quot;, &quot;Dec&quot;],&lt;br /&gt;    datasets: [&lt;br /&gt;      {&lt;br /&gt;        fillColor: &quot;rgba(151,187,205,0.5)&quot;,&lt;br /&gt;        strokeColor: &quot;rgba(151,187,205,1)&quot;,&lt;br /&gt;        pointColor: &quot;rgba(151,187,205,1)&quot;,&lt;br /&gt;        pointStrokeColor: &quot;#fff&quot;,&lt;br /&gt;        data: [28, 48, 40, 19, 96, 27, 100, 78, 62, 77, 88, 98]&lt;br /&gt;      }&lt;br /&gt;    ]&lt;br /&gt;  };&lt;br /&gt;  &lt;br /&gt;  var ctx = document.getElementById(&quot;canvas&quot;).getContext(&quot;2d&quot;);&lt;br /&gt;  var myLine = new Chart(ctx).Line(lineChartData);&lt;br /&gt;  &lt;br /&gt;  setInterval(function() {&lt;br /&gt;    var opts = {&lt;br /&gt;      animation: false&lt;br /&gt;    };&lt;br /&gt;	&lt;br /&gt;    lineChartData.datasets[0].data.shift();&lt;br /&gt;    rnd = Math.round(Math.random() * 90) + 10;&lt;br /&gt;    lineChartData.datasets[0].data.push(rnd);&lt;br /&gt;    myLine = new Chart(ctx).Line(lineChartData, opts);&lt;br /&gt;  }, 1000);&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;有一點要特別注意，因為 Chart.js 在畫圖時會有動畫，所以必須把 animation 設成 flase 把動畫關掉。&lt;/p&gt;  &lt;p&gt;然後就可以動態增加資料點囉：&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh71xmkIR7mQhB3sgpRMc-47r6xMU-us8z-Mfn6OYCjXwRW3WHpQsaPSXGyfoDXbV9hDiHwlC3WN4wC2szK5iwpEzS4-SyJXWJme1rAv4h6PNlS81S7bzO-RY2Jaws7MdTqFVpsvtdBDScf/s1600-h/image%25255B29%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqzSWCrXi38zj8TNk_JBqjaUwwTsBl921C8cfsVK5jOQMbn7rzCaY7vDEsxEINxVrrncrOrbGaKi4v6DAwIDvgjkq1u4Pj3m6-mt1WzUtdtM8sBbgEAmGFjghw-tuJEtEdv88wcW4Q1qNn/?imgmax=800&quot; width=&quot;616&quot; height=&quot;513&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/1221429764340026207/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/1221429764340026207?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/1221429764340026207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/1221429764340026207'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/09/chartjs-js-chart-library.html' title='Chart.js: 一個簡單的 JS Chart Library'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE7REUaebWRiHOF6UXF2RVyrxNw_wvLdXb6dxvjgqSF4AG3hRqfuFGd2fpfqc-YqVCTxqFPkVuVwdPqCG81I0VAeF1u4U2pgkLx6dJC9WIIfPgnSCz9m3Ampqqb8OaQ-GIBJq_PetscFX1/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-9036064440726255293</id><published>2013-09-07T21:09:00.001+08:00</published><updated>2013-09-10T17:05:04.333+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arduino"/><title type='text'>關閉 Arduino UNO 的 auto reset</title><content type='html'>&lt;p&gt;在某些特殊情況下，你可能需要把 Arduino 的 auto reset 功能關掉。舉個例子，假設 Arduino 正在跑這段讓 LED 恆亮的 code:&lt;/p&gt;  &lt;p&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: cpp&quot;&gt;&lt;![CDATA[&lt;br /&gt;int led = 13;&lt;br /&gt;&lt;br /&gt;void setup() {                &lt;br /&gt;  pinMode(led, OUTPUT);     &lt;br /&gt;  digitalWrite(led, HIGH);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void loop() {&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;假如這時用 echo 指令傳資料給 Arduino:&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; $ echo &amp;quot;Hello&amp;quot; &amp;gt; /dev/ttyACM0&lt;/p&gt;  &lt;p&gt;你會發現 Arduino 的 LED 會突然閃爍幾下，然後又恢復恆亮。這是因為在開啟 serial port 時會觸發 Arduino 的 auto reset，Arduino 重新開機了，所以 LED 才會閃爍幾下 (開機時 bootloader 叫它閃爍的)。&lt;/p&gt;  &lt;p&gt;要關閉 Arduino 的 auto reset，方法很簡單。以 UNO 而言，只要在 RESET 跟 GND 針腳之間放個 10uF 的電容就好 (短腳要接 GND):&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsB34OZDF5g0ff2chI3Gd_vztVOMOCKSxonM9Yw-V5QB2TId-j7K5US6NR901HS6AMghZXILCOKzuM7zQTlZrX_5MxTIpv5eCB52pha9v7IaOGyafTTsXknaSulx5u-YiNYBTp78gAPFco/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJTf3rQbC-eqeHQU_XCapFOZUYBrZkGsJNBIEOVOTodXUJ__2KcEP7P6TykQp1hyyj1KdInZE1KLnT2ULegTnI9PEaFlm857Qrj08adnKVnrFdxW-alryKRhYz5yWEl32qQnVClZfu8lZj/?imgmax=800&quot; width=&quot;522&quot; height=&quot;477&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;其它板子我沒試過。不過，如果接電容的方法無效，據網路上的資料，可以在 5V 跟 RESET 針腳間放個 120 ohm 的電阻 (120 ohm 電阻還真不好找，可能要組合一下才行)。&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRZueQ-_yu5Ig_GPCn_sYJr9tqH_FgEhNTHD90VZUcBqB_rlBX-aYCdzdRTildkuy5SJKn626sMXy2UywXUIiq3XBVKimdF7jDoszIEb7mtEG9dITGOPdtDI5U6_8MRHFOalHm1Yxzxj7a/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLXri46gUAFAa7Gj1x7mrDV9B7CQBbOz1-pt7kcKLAbvdn5l5OZGNswR8bfFwWU5QceaqSJ004uAfAjZWvgyqTx5lSFTjhBn9ztV_23xseU0CaK5mHT-E52TsCZxkFnunottDRZVGLt_ec/?imgmax=800&quot; width=&quot;606&quot; height=&quot;484&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;至於 Leonardo 的話就不需要了，因為 Leonardo 的硬體線路跟 UNO 不一樣，不會在 serial port 連線時 reset，所以應該沒這方面的困擾 (&lt;font color=&quot;#008080&quot;&gt;補充: 當以1200 鮑率開個 serial port 時，Leonardo 就會重置&lt;/font&gt;)。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;參考資料&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href=&quot;http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection&quot;&gt;DisablingAutoResetOnSerialConnection&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://yehnan.blogspot.tw/2013/09/arduinoleonardouno.html&quot;&gt;葉難: Leonardo與Uno的差異比較&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/9036064440726255293/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/9036064440726255293?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/9036064440726255293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/9036064440726255293'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/09/arduino-uno-auto-reset.html' title='關閉 Arduino UNO 的 auto reset'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJTf3rQbC-eqeHQU_XCapFOZUYBrZkGsJNBIEOVOTodXUJ__2KcEP7P6TykQp1hyyj1KdInZE1KLnT2ULegTnI9PEaFlm857Qrj08adnKVnrFdxW-alryKRhYz5yWEl32qQnVClZfu8lZj/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-4275858878691927751</id><published>2013-09-03T17:05:00.001+08:00</published><updated>2013-09-10T17:06:26.630+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="OpenWrt"/><title type='text'>Facebook 「讚」電子顯示器」Again</title><content type='html'>&lt;p&gt;我把昨天製作的 &lt;a href=&quot;http://coopermaa2nd.blogspot.tw/2013/09/facebook.html&quot;&gt;Facebook 「讚」電子顯示器&lt;/a&gt; (簡稱 fblikes) 做了一些調整，現在 fblikes 比較好安裝，有一個 LuCI 設定介面，而且也可以安排到 OpenWRT 開機時自動執行了。fblikes 現在放在 github 上，repo 路徑是:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href=&quot;https://github.com/coopermaa/fblikes&quot;&gt;https://github.com/coopermaa/fblikes&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;安裝方法在 github 上可以找到。不過，底下還是稍微說明一下:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; 所需器材: 可跑 OpenWrt 的無線路由器 (我用 TL-WR703N。FWR171-3G 也是可以的)、Arduino，以及 &lt;a href=&quot;http://coopermaa2nd.blogspot.tw/2013/09/tm1638-led-display.html&quot;&gt;TM1638 LED Display&lt;/a&gt;。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; 連接 Arduino 與 TM1638，上傳 arduino 資料夾裏的 fblikesDemo sketch 到 Arduino 板子上&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; 連接 Arduino 與 OpenWrt。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; 上傳 install.sh 與 files 整個資料夾到 OpenWrt，輸入以下指令:&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; $ chmod +x install.sh    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $ ./install.sh&lt;/p&gt;  &lt;p&gt;這個動作會把 fblikes 相關檔案 (Init Script, configuration file, LuCI module, Lua Script 等) 裝到預設的目地的。&lt;/p&gt;  &lt;p&gt;接著，先確定 OpenWrt 可以連上 Internet，然後輸入以下指令啟動 fblikes:&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; $ /etc/init.d/fblikes start&lt;/p&gt;  &lt;p&gt;如果你希望 fblikes 在 Linux 開機時便自動執行，那麼就輸入以下指令:&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; $ /etc/init.d/fblikes enable&lt;/p&gt;  &lt;p&gt;底下是一個範例。這是 Fablab Taipei 的&lt;a href=&quot;https://www.facebook.com/FablabTPE&quot;&gt;粉絲頁&lt;/a&gt; (&lt;a title=&quot;https://www.facebook.com/FablabTPE&quot; href=&quot;https://www.facebook.com/FablabTPE&quot;&gt;https://www.facebook.com/FablabTPE&lt;/a&gt;):&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAB-TNve6bHQJgrdkqpdllD0FElk79QVq3jNQcJeFzsjbn-SY8T2wUHGaqFvgrHvW4e9piTjpnDYRXl9LF9UPVcilFsQYT0dom0t2DAA2PFETZAeO4mqjco4vppyWlWpWPl3Y-_kEUCkA9/s1600-h/2013-09-03_16h28_42%25255B6%25255D.png&quot;&gt;&lt;img title=&quot;2013-09-03_16h28_42&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;2013-09-03_16h28_42&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAy-ottyRnvcxfoeia7Gjo5XWptnq2uCD4Lu2sthM6J7SOT1nciYqVirLof2PWm5-6EXvW2KBUxzZRb92bjepjkE7CQnW8EZZDMAvxw8dKjBUfEH5O3pLx10zS9pN3A72R8z6SuvVAzup5/?imgmax=800&quot; width=&quot;846&quot; height=&quot;528&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;這是 Fablab Taipei 的 Facebook 「讚」電子顯示器 (器材是 Arduino + TM1638 LED Display):&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIhEnw0_L-PKORfbokPgcHLl6yjfbSjmy75Wv7sVAV2inFUJFNObFBaPiLqMKDuDgdvSttolrh_IUNk5FYBzRdwXbY9woioa6fANc2zi97Yw0pcmXVijC5W7zsHt5z5d2xGLWg6qYzJGGN/s1600-h/2013-09-03%25252016.28.36%25255B3%25255D.jpg&quot;&gt;&lt;img title=&quot;2013-09-03 16.28.36&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;2013-09-03 16.28.36&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbM-_0vK05KndT3qgFyNQrXIEl7YUis2sVMpzeT7tchhTV2FppuyvqlAwsHcKSRn-x5ltzHP2GNaCxJ4kgrDWiDqk17DLHxm0UsqYkl8C7bDK49xxfr3uJEupPi7FZvbITz4Cz-WmssFe2/?imgmax=800&quot; width=&quot;794&quot; height=&quot;596&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;如果你想修改 fblikes 的參數，比如 Facebook 粉絲專頁的 URL (Facebook URL)，多久更新一次電子顯示器 (Refresh Interval) 等，只要瀏覽 http://&amp;lt;IP of OpenWrt&amp;gt;/cgi-bin/luci/fblikes 連入 LuCI 設定介面就可以進行操作: &lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb5sp6SogeoLNJMADmyaXfaeGWy0zlTwaqSrKlcfXxex83nvDw_OcXJnuYJJWro6DBXFbXDfeFsu8XlmMptNY6Y0lEAnRl8JPaZop1yq5OCiINKMKArbSVilTWRqKRtF-E_3FWcLlQ08GU/s1600-h/2013-09-03_16h39_22%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;2013-09-03_16h39_22&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;2013-09-03_16h39_22&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaw4ITtarQr924fCYyqNdWtlxlHEOPetl5iAWJZVqkmiAhI__uZ95-eYrojkV3QG8-GMssnNAgZnMWFUwsGSVpcz2W-On15JYeOXQzjRPd6qe_lJEzV5mKrxyMmMZnprwBSCRsaOMksjjc/?imgmax=800&quot; width=&quot;589&quot; height=&quot;570&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/4275858878691927751/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/4275858878691927751?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/4275858878691927751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/4275858878691927751'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/09/facebook-again.html' title='Facebook 「讚」電子顯示器」Again'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAy-ottyRnvcxfoeia7Gjo5XWptnq2uCD4Lu2sthM6J7SOT1nciYqVirLof2PWm5-6EXvW2KBUxzZRb92bjepjkE7CQnW8EZZDMAvxw8dKjBUfEH5O3pLx10zS9pN3A72R8z6SuvVAzup5/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-7039357816252353557</id><published>2013-09-03T12:32:00.001+08:00</published><updated>2013-09-10T17:07:07.901+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="OpenWrt"/><title type='text'>寫個 OpenWrt Init Scripts</title><content type='html'>&lt;p&gt;在看過 &lt;a href=&quot;http://wiki.openwrt.org/doc/techref/initscripts&quot;&gt;OpenWrt: Init Scripts&lt;/a&gt; 這篇後，我發現 OpenWrt Init Scripts 很簡單。舉個例子，寫個 /etc/init.d/fblikes 如下:&lt;/p&gt;  &lt;p&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: shell&quot;&gt;&lt;![CDATA[&lt;br /&gt;#!/bin/sh /etc/rc.common&lt;br /&gt;# Init Script for fblikes&lt;br /&gt;# Save this file to /etc/init.d/fblikes&lt;br /&gt;&lt;br /&gt;START=10&lt;br /&gt;STOP=15&lt;br /&gt;&lt;br /&gt;start() {&lt;br /&gt;  fblikes &gt; /dev/null 2&gt;&amp;1 &amp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;stop() {&lt;br /&gt;  killall -9 fblikes&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color=&quot;#008080&quot;&gt;註：fblikes 是我昨天貼的 &lt;a href=&quot;http://coopermaa2nd.blogspot.tw/2013/09/facebook.html&quot;&gt;Facebook 「讚」電子顯示器&lt;/a&gt;&lt;/font&gt;&lt;font color=&quot;#008080&quot;&gt;&lt;/font&gt;&lt;font color=&quot;#008080&quot;&gt;，我事先已經把 fblikes 存到 /usr/bin/fblikes&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;建立 /etc/init.d/fblikes 後，執行 &amp;quot;&lt;code&gt;/etc/init.d/fblikes enable&lt;/code&gt;&amp;quot;，就會在 /etc/rc.d 裏產生一個 symbolic link。START=10 代表會建立 /etc/rc.d/S10fblikes，10 是指 S10fblikes 的執行順序，在系統開機時數字愈小的 script 會優先執行，OS 會呼叫 script 的 start()。 而 STOP=15 是 optional 的，它會建立 /etc/rc.d/K15fblikes，一樣，15 是指 K15fblikes 的執行順序，在系統關機時數字愈小的 script 會優先執行，OS 會呼叫 script 的 stop()。&lt;/p&gt;  &lt;p&gt;OpenWrt 每支 Init Script 都有下列指令可以使用：&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;code&gt;/etc/init.d/example        &lt;br /&gt;/etc/init.d/example enable         &lt;br /&gt;/etc/init.d/example boot         &lt;br /&gt;/etc/init.d/example start         &lt;br /&gt;/etc/init.d/example restart         &lt;br /&gt;/etc/init.d/example stop         &lt;br /&gt;/etc/init.d/example disable&lt;/code&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;簡單地說，如果你想啟動 fblikes，只管輸入以下指令:&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &lt;code&gt;$ /etc/init.d/fblikes start&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;如果你要停止 fblikes，只管輸入以下指令:&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &lt;code&gt;$ /etc/init.d/fblikes stop&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;如果要想讓 fblikes 在開機時自動執行，就輸入以下指令：&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &lt;code&gt;$ /etc/init.d/fblikes enable&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;反之，不想讓 fblikes 在開機時自動執行，那就用 disable 指令把它取消：&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &lt;code&gt;$ /etc/init.d/fblikes disable&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;disable 指令會把 /etc/rc.d/S10fblikes 和 /etc/rc.d/K15fblikes 兩個 symbolic links 移除掉。&lt;/p&gt;  &lt;h5&gt;參考資料:&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href=&quot;http://wiki.openwrt.org/doc/techref/initscripts&quot;&gt;OpenWRT: Init Scripts&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/7039357816252353557/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/7039357816252353557?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/7039357816252353557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/7039357816252353557'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/09/openwrt-init-scripts.html' title='寫個 OpenWrt Init Scripts'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-6013081068194882565</id><published>2013-09-02T23:09:00.001+08:00</published><updated>2013-09-10T17:08:02.546+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Lua"/><title type='text'>Facebook 「讚」電子顯示器</title><content type='html'>&lt;p&gt;有自己的粉絲專頁還不夠酷，Facebook 粉絲專頁上都有個「讚」計數器，如果可以把它搬到實體的電子顯示器上，那才叫酷！&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiib5Wver9zxCvuTbFM7r-wv0xcxs0hff4O-HKl-kMylxqYgUuVm4vIzNZU21F6td55Am0pahe55ji_4FMwkgArRCqsYPaICmiQykWsABNg5YYZt13cx2E_aJ1hktu6h8rCa2e0YoZYJ_dG/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilIPv4sVrjzY8mzhnE8BZtGWvt4l6_7v1QhK6fBzEGcW6AX3CYmah0W03YNQzG2G-gJsRzIw6SYRdC1ELRqobpn9RtKT_zvDAYrXca3XWDqbt99U05-P5G-yqS_QNPy2WIhafstudJY15f/?imgmax=800&quot; width=&quot;800&quot; height=&quot;511&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;江湖一點訣，說穿不值一文錢。要取得 Facebook 頁面「讚」次數，其實很簡單，只要在網址列上輸入：&lt;a href=&quot;http://api.facebook.com/restserver.php?method=links.getStats&amp;amp;urls&quot;&gt;http://api.facebook.com/restserver.php?method=links.getStats&amp;amp;urls=&lt;/a&gt;，然後加上想要看的 Facebook 頁面，就會得到一個像底下這樣的 XML 格式的回應，比如 &lt;a title=&quot;http://api.facebook.com/restserver.php?method=links.getStats&amp;amp;urls=https://www.facebook.com/cutespring&quot; href=&quot;http://api.facebook.com/restserver.php?method=links.getStats&amp;amp;urls=https://www.facebook.com/cutespring&quot;&gt;https://www.facebook.com/cutespring&lt;/a&gt; 這個粉絲專頁：&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9IDq_j6HAQgbrRnep17oumgPuX1hmKq8KtkZciq2kEwjrO-30sG4B1_HaKb5SZiXk91zPEq65WgS52QJ8NufJTUFFHctlhYLxIaJ7qypoBB8Av0LN40Krham9FwxrPdCD2kFr3gwPB31N/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT4LecsZ1Ty3YwfEqFLxnxtHuRnRZI4tBNGa1bC1QIcAURXVqHVK2WfVR6Iyzi1v1xfxwxkMj_rTqCc3tWNmoYBIL2TZrtob-p1zpadNNgsQZLJM6K7lLDmMc7pcBUquqetlFSQ_TCwELA/?imgmax=800&quot; width=&quot;600&quot; height=&quot;469&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;其中 total_count 就是「讚」的次數了。(PS: 按 Facebook &lt;a href=&quot;https://developers.facebook.com/docs/reference/fql/link_stat/&quot;&gt;這裏&lt;/a&gt;的說明，totaol_count 是 like_count + comment_count + share_count 的總合，按道理來說，「讚」次數應該是 like_count 才對，不過咱們不是 Facebook 工程師，沒必要那麼深入)。&lt;/p&gt;  &lt;p&gt;知道怎麼取得 Facebook 「讚」的數目後，接下來是把它搬電子顯示器上。&lt;/p&gt;  &lt;p&gt;其實在 Maker Faire Taipei 2013 的工作坊上，&lt;a href=&quot;http://ben6.blogspot.tw/&quot;&gt;Ben6&lt;/a&gt; 就用 OpenWrt + Arduino + &lt;a href=&quot;http://coopermaa2nd.blogspot.tw/2013/09/tm1638-led-display.html&quot;&gt;TM1638 LED Display&lt;/a&gt; 搭配 Bash Shell Script &lt;a href=&quot;http://ben6.blogspot.tw/2013/05/maker-faire-2013-facebook-like.html&quot;&gt;示範&lt;/a&gt;過了。因為想練習 Lua，所以底下我便用 Lua 重新改寫了程式。簡單說明一下步驟：&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; 首先，連接 Arduino 與 TM1638 (本例將 DIO, CLKC, STB1 分別接到 Arduino 的 8, 7, 6 接腳)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; 到 &lt;a href=&quot;https://code.google.com/p/tm1638-library/&quot;&gt;https://code.google.com/p/tm1638-library/&lt;/a&gt; 下載並安裝 tm1638 library&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; 上傳底下的程式到 Arduino:&lt;/p&gt;  &lt;p&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: cpp&quot;&gt;&lt;![CDATA[&lt;br /&gt;#include &lt;TM1638.h&gt;&lt;br /&gt;// define a module on data pin 8, clock pin 7 and strobe pin 6&lt;br /&gt;TM1638 module(8, 7, 6);&lt;br /&gt;&lt;br /&gt;static unsigned long num = 0;&lt;br /&gt;static unsigned long display_num = 0;&lt;br /&gt;&lt;br /&gt;void setup() {&lt;br /&gt;  Serial.begin(57600);&lt;br /&gt;  // Display number 1 with no dots set and no leading zeros &lt;br /&gt;  module.setDisplayToDecNumber(1, 0, false); &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void loop() {&lt;br /&gt;  if (Serial.available()) {&lt;br /&gt;    int ch = Serial.read();&lt;br /&gt;    if (ch &gt;= &#39;0&#39; &amp;&amp; ch &lt;= &#39;9&#39;)  num = num * 10 + (ch - 0x30);&lt;br /&gt;    if (ch == &#39;.&#39;) {&lt;br /&gt;      display_num = (num &lt; 100000000) ? num : num % 100000000;&lt;br /&gt;      module.setDisplayToDecNumber(display_num, 0, false);        &lt;br /&gt;      num = 0; &lt;br /&gt;    }&lt;br /&gt;  }   &lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;程式說明：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;使用 TM1638 module(8, 7, 6) 定義 TM1638 物件，DIO 接在 pin 8, CLK 接在 pin 7, STB1 接在 pin 6 &lt;/li&gt;    &lt;li&gt;使用 module.setDisplayToDecNumber(1, 0, false) 讓 LED Display 一開始顯示數字 1，第二和第三個參數的意思是不要顯示小數點也不要 Leading Zero。 &lt;/li&gt;    &lt;li&gt;在 Loop() 函式中，不斷讀取輸入的數值，小數點 &#39;.&#39; 字元代表封包結束，所以遇到小數點時便把收到的「讚」數目搬到 TM1638 顯示器上 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; 把底下的 Lua script 存檔為 fblikes.lua，傳到 OpenWrt 上並改為可執行:&lt;/p&gt;  &lt;p&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: python&quot;&gt;&lt;![CDATA[&lt;br /&gt;#!/usr/bin/lua&lt;br /&gt;require &#39;nixio&#39;&lt;br /&gt;require &#39;luci.util&#39;&lt;br /&gt;&lt;br /&gt;-- 臉書讚數目專頁&lt;br /&gt;source_url=&quot;https://www.facebook.com/cutespring&quot;&lt;br /&gt;&lt;br /&gt;local serialPort = &quot;/dev/ttyACM0&quot;&lt;br /&gt;local baud_rate = 57600&lt;br /&gt;local sleepInterval = 5 -- in seconds&lt;br /&gt;local DEBUG = 1&lt;br /&gt;&lt;br /&gt;url = &quot;http://api.facebook.com/restserver.php?method=links.getStats&amp;urls=&quot; .. source_url&lt;br /&gt;cmd = &quot;wget -qO - &#39;&quot; .. url .. &quot;&#39; | grep total_count&quot;&lt;br /&gt;&lt;br /&gt;function get_fblikes()&lt;br /&gt;  -- output 會是 &quot; &lt;total_count&gt;44830&lt;/total_count&gt;&quot; 之類的字串&lt;br /&gt;  output = luci.util.exec(cmd)&lt;br /&gt;  likes = string.match(output, &quot;%d+&quot;)  -- 取出字串中的數字&lt;br /&gt;  return likes&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;-- Open Serial Port&lt;br /&gt;local cmd = string.format(&quot;stty -F %s cs8 %s ignbrk -brkint -icrnl -imaxbel -opost &quot; ..&lt;br /&gt;                          &quot;-onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl &quot; ..&lt;br /&gt;                          &quot;-echoke noflsh -ixon -crtscts &gt; /dev/null 2&gt;&amp;1&quot;&lt;br /&gt;                          , serialPort, baud_rate)&lt;br /&gt;os.execute(&quot;stty -F &quot; .. serialPort .. &quot; raw speed &quot; .. baud_rate .. &quot; &gt; /dev/null 2&gt;&amp;1&quot;)&lt;br /&gt;local flags = nixio.open_flags(&quot;rdwr&quot;)&lt;br /&gt;local mySerial = nixio.open(serialPort, flags)&lt;br /&gt;assert(mySerial)&lt;br /&gt;&lt;br /&gt;while true do&lt;br /&gt;  local likes = get_fblikes()&lt;br /&gt;  &lt;br /&gt;  if likes ~= nil and tonumber(likes) &gt; 0 then    &lt;br /&gt;    mySerial:write(likes .. &quot;.&quot;)   -- a dot &#39;.&#39; is for packet end    &lt;br /&gt;    if DEBUG ~= 0 then print(&quot;Likes: &quot; .. likes) end&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  nixio.nanosleep(sleepInterval)&lt;br /&gt;end&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;完成後，啟動 fblikes.lua 程式。過幾秒鐘後...&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5R6LHVVNj76aptIlrte9aLw4w-JVpDQPAfN0zHN-QXgY7N26hFTXEkWWRpLuE3d3z7q-LQ4orZNPxPxTYiOpfqS47u6sa4Q-ln9i-eOGd6G3MFHBspHJVDvn9BgUSL1SSTNU9iTb6AoZc/s1600-h/image%25255B7%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUZ4RD_fJuz5AYJjxyl-X_506ao9EmySxf87nQzr7Ze07a_rS8dlWT4yidN0eIEnAvoffVyiigvVvP6Ej24LN2EEHo3OLmBRmbyycXTZ5hql5T8H-1r9JjPXRkfEqL1jjYx0cl9fRl_L1t/?imgmax=800&quot; width=&quot;800&quot; height=&quot;592&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;耶！大功告成！&lt;/p&gt;  &lt;h5&gt;參考資料&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;OSSLab: &lt;a href=&quot;http://www.osslab.com.tw/Hardware/Open_Embedded_System/MIPS/Atheros/WR-703N/OSSLAB_firmware/Facebook&quot;&gt;利用 OpenWRT, Arduino 和 TM1638 製作 Facebook 按讚次數的顯示器&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;英倍達國際: &lt;a href=&quot;http://www.embeda.com.tw/tw/?p=4314&quot;&gt;本篇能有多少個讚?&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://coopermaa2nd.blogspot.tw/2013/09/tm1638-led-display.html&quot;&gt;TM1638 LED Display&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/6013081068194882565/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/6013081068194882565?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/6013081068194882565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/6013081068194882565'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/09/facebook.html' title='Facebook 「讚」電子顯示器'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilIPv4sVrjzY8mzhnE8BZtGWvt4l6_7v1QhK6fBzEGcW6AX3CYmah0W03YNQzG2G-gJsRzIw6SYRdC1ELRqobpn9RtKT_zvDAYrXca3XWDqbt99U05-P5G-yqS_QNPy2WIhafstudJY15f/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-7139108051015075005</id><published>2013-09-02T19:54:00.001+08:00</published><updated>2013-09-10T17:08:28.741+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arduino"/><title type='text'>TM1638 LED Display</title><content type='html'>&lt;p&gt;TM1638 是一款 8 位數的 7 段顯示器，板子上有 8 顆雙色 LED (紅和綠)，以及 8 顆按鈕。依 7 段顯示器的顏色來區別，TM1638 分成紅色和綠色兩種款式。TM1638 還可以串聯 (daisy-chained)，最多可以串 6 組。TM1638 是大陸深圳天微這家公司做的。&lt;/p&gt;  &lt;p&gt;這是 TM1638 的正面照:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNLjFMlkwPK5FU-WdSDGRFDIEWATpspUdnXHeuE8CmsPHmQNeI4lsRMFtZAj0fMZGxSR7gXIX0AOCWpJuzVNGLUf5FNaghAD5vvrF9gAgRvVcSC8ONkdpsCTraqQ3i3PBA7TK4r_ERLwhM/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipFAZEg8813F1Ob5fsq44m5Rpdsmio2Uc-IjvvxCqYPcgie_BCXYG3SnkExYs2T-mQ4RILDEEdtqx1ubJTjIdlshpnLdU_LaOsy8oZEuJD1zj-K7aWuAcXWbPJUku5nX5NeBer2EF1AJ3B/?imgmax=800&quot; width=&quot;800&quot; height=&quot;418&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;如果有需要，可以用 cable 把 TM1638 串聯起來，最多可同時串 6 組 (賣家通常會提供 cable):&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6p1qpQfM-7N2WZ_wdMvO99MYlOclSXnj8abSZotDOIevvZe7Otf79EvXEU9V6Ph2sxbKJRWKPguGMi5crPOJWPmCDxdSHumR4-6H03zupfKCvUI-EMDzF0eVTrinNLw62UcI99yOFcC7w/s1600-h/image%25255B17%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvFG78bQjQ8_k7S2xsCIrvEiznBdh9D79IaqKo_IRNUZIpRyQ933ZgY8oWQEyBVtgdjLJLdmAMVkQbO-_x9PB1KFGmBL7mbQdISmh4iigwHeIgPRHlhZQoGh8Z6zUvx9kwVg035zVYrRS0/?imgmax=800&quot; width=&quot;800&quot; height=&quot;409&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;TM1638 的腳位圖印在板子背面:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSQCWFePQMr80_BMIqcIZD34MR0GkNEkfwlBKBNET1mOACcjzVubGWxpaBDpQgnCF9f581jZMRKle60JXTx1PrGdGoI0vISc0XHm_VR84eKaU97QflpqLMUt2FULGNLrM6l_2-QNSxmrp9/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifYzr6KfJ8ZPd2qB9lbteO-NAOhOeXzkhBjrrzlCN0jgfPTDrdWubpF3bzCrY6FuH6xVQyauvLdbw95_UIHD_KEjy4noMyBvH6hpqDqVzpwGpYXQTFtl18bGha7SXhGs39nniT-ddcFTRr/?imgmax=800&quot; width=&quot;800&quot; height=&quot;427&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;TM1638 的接線很簡單。如果只有一組 TM1638，只需要 5 根跳線就可以跟 Arduino 連接起來，分別是 VCC 與 GND 兩支電源接線，另外再用 Arduino 三支 GPIO 接腳接到 DIO, CLK 和 STB1 就可以了。&lt;/p&gt;  &lt;h5&gt;實測&lt;/h5&gt;  &lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; 首先，連接 Arduino 與 TM1638 (本例將 DIO, CLKC, STB1 分別接到 Arduino 的 8, 7, 6 接腳)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2. &lt;/strong&gt;到 &lt;a href=&quot;https://code.google.com/p/tm1638-library/&quot;&gt;https://code.google.com/p/tm1638-library/&lt;/a&gt; 下載並安裝 tm1638 library&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; 點按 &lt;strong&gt;Sketchbook &amp;gt; libraries &amp;gt; TM1638 &amp;gt; tm1638_one_module_example&lt;/strong&gt; 打開 TM1638 library 提供的範例程式。完整程式碼如下:&lt;/p&gt;  &lt;p&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: cpp&quot;&gt;&lt;![CDATA[&lt;br /&gt;#include &lt;TM1638.h&gt;&lt;br /&gt;&lt;br /&gt;// define a module on data pin 8, clock pin 7 and strobe pin 6&lt;br /&gt;TM1638 module(8, 7, 6);&lt;br /&gt;&lt;br /&gt;void setup() {&lt;br /&gt;  // display a hexadecimal number and set the left 4 dots&lt;br /&gt;  module.setDisplayToHexNumber(0x1234ABCD, 0xF0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void loop() {&lt;br /&gt;  byte keys = module.getButtons();&lt;br /&gt;&lt;br /&gt;  // light the first 4 red LEDs and the last 4 green LEDs as the buttons are pressed&lt;br /&gt;  module.setLEDs(((keys &amp; 0xF0) &lt;&lt; 8) | (keys &amp; 0xF));&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;程式說明:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;使用 TM1638 module(8, 7, 6) 定義 TM1638 物件，DIO 接在 pin 8, CLK 接在 pin 7, STB1 接在 pin 6 &lt;/li&gt;    &lt;li&gt;使用 module.setDisplayToHexNumber() 顯示16 進位數字，第二個參數可設定打開七段顯示器的小數點 &lt;/li&gt;    &lt;li&gt;要顯示 10 進位數字的話，把 module.setDisplayToHexNumber() 這行換掉，改成呼叫 module.setDisplayToDecNumber() 就行了 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;上傳程式到 Arduino 後…&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0JQwLJT6FXsiggbRXkDMRoXIls-4CiZvC_UlekeJux5iRfYNsVWVxRmUBWQwrMwwBP4q-R3GN3himlzGrn0kKOfw8G4skoGZ70gQt5kZjL7cs8saQDAeSJBiq6aBvZuPYvteO4jYFxDj0/s1600-h/image%25255B13%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_i1B6RibcINs_PG430Ka0_SnS_aBYkZXDNMsZA1LUavBXqgdfSpIG9z5IwKUaHMkthZHx1UIfluI1Q3Gs04cH2MpTYB1jlh4HMDQdFoq9zO1xqAaRKVZcPkUa0uNBdMrzmeYHZQOBr-ET/?imgmax=800&quot; width=&quot;800&quot; height=&quot;591&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;耶，成功囉！&lt;/p&gt;  &lt;h5&gt;參考資料&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;OSSLab: &lt;a href=&quot;http://www.osslab.com.tw/Hardware/Open_Embedded_System/MIPS/Atheros/WR-703N/OSSLAB_firmware/Facebook&quot;&gt;利用 OpenWRT, Arduino 和 TM1638 製作 Facebook 按讚次數的顯示器&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/7139108051015075005/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/7139108051015075005?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/7139108051015075005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/7139108051015075005'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/09/tm1638-led-display.html' title='TM1638 LED Display'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipFAZEg8813F1Ob5fsq44m5Rpdsmio2Uc-IjvvxCqYPcgie_BCXYG3SnkExYs2T-mQ4RILDEEdtqx1ubJTjIdlshpnLdU_LaOsy8oZEuJD1zj-K7aWuAcXWbPJUku5nX5NeBer2EF1AJ3B/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-6098915982826255357</id><published>2013-09-02T13:29:00.001+08:00</published><updated>2013-09-10T17:08:17.147+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arduino"/><title type='text'>Arduino Ethernet Shield 簡介</title><content type='html'>&lt;p&gt;Arduino Ethernet Shield 可以讓 Arduino 控制板連到 LAN 或 Internet。&lt;/p&gt;  &lt;p&gt;這塊板子用的 Ethernet 晶片是 WIZnet 5100:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtcNaZN13eT5N4VKMxt4QuaeOorV2o4bzFBX3dnT2zGjCVPJkVzfGZE_C-OfkxmG0qPE_djuFwrfvsWz_pWb6T8z9ZgfMjj7ACmGA90qeam0Kvd97XJgcZmEnsnE6lljCtVaKyd4U0s56y/s1600-h/20120712_22h03_591.png&quot;&gt;&lt;img title=&quot;2012-07-12_22h03_59&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;2012-07-12_22h03_59&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdkMH6JPhUa_FIjFiuK1fupvQMeIOUT19s9ogdVd0H7HbXr8QOks08c0HKlhceuh4f90WYEiLW_-PKzVZr16U76fcCxIW1XDuJ0GaGWHatkVBykaRpwGWI1880fO0kfSHALEeFBGRMsaTT/?imgmax=800&quot; width=&quot;450&quot; height=&quot;324&quot; /&gt;&lt;/a&gt;     &lt;br /&gt;▲ Ethernet Shield 正面照&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLwu5-UeBwYiSy-bPXW6OGFU0I2nsQHcO38iEBrjjt7w500uHxRA9euG3QKUT6VSsQSz8ODtlH3sEJyU_nqnqerxDxhZmpz6k-za9HhEIEnbA7Hw-D-EuwVtmnglnBmFks-fH7ivkycoDr/s1600-h/20120712_22h04_301.png&quot;&gt;&lt;img title=&quot;2012-07-12_22h04_30&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;2012-07-12_22h04_30&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggmUD2iF3XWWUrAy9y9KaNINRxOz8wxI-7ZbII8g4iEkrOCZenywqKwsJomEBSygsBT6rFZtMyq73eVoVA87-z3PhqjA0g36DqhT4N5qy54u5s_DddBu4sf4FGsbf00ciOqia6jkyMLF6w/?imgmax=800&quot; width=&quot;380&quot; height=&quot;505&quot; /&gt;&lt;/a&gt;     &lt;br /&gt;▲ Ethernet Shield 背面照 (標籤上印的是 Ethernet MAC Address)&lt;/p&gt;  &lt;p&gt;WIZnet 5100 主要特色:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;- Support Hardwired TCP/IP Protocols TCP, UDP, ICMP, IPv4 ARP, IGMP, PPPoE, Ethernet      &lt;br /&gt;- 10BaseT/100BaseTX Ethernet PHY embedded       &lt;br /&gt;- Support Auto Negotiation (Full-duplex and half duplex)       &lt;br /&gt;- Support Auto MDI/MDIX       &lt;br /&gt;- Support ADSL connection (with support PPPoE Protocol with PAP/CHAP Authentication mode)       &lt;br /&gt;- Supports 4 independent sockets simultaneously       &lt;br /&gt;- Not support IP Fragmentation       &lt;br /&gt;- Internal 16Kbytes Memory for Tx/Rx Buffers       &lt;br /&gt;- 0.18 µm CMOS technology       &lt;br /&gt;- 3.3V operation with 5V I/O signal tolerance       &lt;br /&gt;- Small 80 Pin LQFP Package       &lt;br /&gt;- Lead-Free Package       &lt;br /&gt;- Support Serial Peripheral Interface(SPI MODE 0, 3)       &lt;br /&gt;- Multi-function LED outputs (TX, RX, Full/Half duplex, Collision, Link, Speed)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;(資料來源: &lt;a href=&quot;http://www.wiznet.co.kr/Sub_Modules/en/product/Product_Detail.asp?cate1=5&amp;amp;cate2=7&amp;amp;cate3=26&amp;amp;pid=1011&quot;&gt;WIZnet W5100 Product page&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;下圖是 W5100 的 Block Diagram:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimbMNHq5Id7WVuhdEcHdyPX320WKuSnPi7esTCgw5IXDsAtEyp0ca0H6p8isukNux0BVLSEheE9H2cn1EKze8xoiK7poctqAhBp_LEitj0cEJM7yxWNsCDacF0dluZEcActYtYYMfXFjSW/s1600-h/image8.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; float: none; margin-left: auto; display: block; border-top-width: 0px; margin-right: auto&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCSAC3W8XPz437tH0AomzCwOqRdBd5Im23iGSK4fTTA7e10UfCcf7yMFNxj-GwAXGvortWRG8AxgTuCG_jiuTxYJFLOtpXOCY9RazKzQM-8BtRnHHRFfgjOrZnZjbwFjLEwDmgRTpuL4ab/?imgmax=800&quot; width=&quot;310&quot; height=&quot;483&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;W5100 主要特色是把 TCP/IP Protocols (TCP, UDP, ICMP, IPv4 ARP, IGMP, PPPoE, Ethernet) 做在硬體電路上，減輕了 MCU 的負擔 (也就是 Arduino 的負擔)。不過 W5100 也不是沒有缺點，因為它有一個限制，就是最多只允許同時 4 個 socket 連線。Arduino 程式只要使用 &lt;a href=&quot;http://arduino.cc/it/Reference/Ethernet&quot;&gt;Ethernet Library&lt;/a&gt; 便可以輕易完成連至 internet 的動作。&lt;/p&gt;  &lt;p&gt;Arduino Ethernet Shield 使用加長型的 Pin header (如下圖一)，可以直接插到 Arduino 控制板上 (如下圖二)，而且原封不動地保留了 Arduino 控制板的 Pin Layout，讓使用者可以在它上面疊其它的擴充板。&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrbggCJdYIaS6yqwn9zuI8dKVSMMwdx8ZNClsuQEthdEuKs4teuD5QbuK0TqBGFEpRNG4ouEvC4hll59eCyFb2TS8JyD3A8aRD_y3FMTWdv2OupI-Wddoyf0AMvwt0y_3SCDWEdak7fUGZ/s1600-h/20120712_22h03_252.png&quot;&gt;&lt;img title=&quot;2012-07-12_22h03_25&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;2012-07-12_22h03_25&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZX5pd8ImRMf6MzUmfiCP_Trnxk0QlyURuyEd6FRpLb5aElzL3NJTHYPvVi7EygA0gctbMQwZi3ROoh-qm-qEeae-v_N9hjvU526wkJhf6GrXA7cxhS1P2WYtTkNgh08WfvacfVOuAaYnb/?imgmax=800&quot; width=&quot;574&quot; height=&quot;466&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTjQ4BYYrMhVzDlYnfnf6ziwVNjE9Xt8qRoLXwt55kYYyei3TBhKU66N4K-G7HK2mWSxm106aefN1mKpU1lOoLGL6sOmeRdKZcU6oyHHXCqfnJQHicOeq8tbz5RbYmUIswocnfdmaRTLwV/s1600-h/20120712_23h33_212.png&quot;&gt;&lt;img title=&quot;2012-07-12_23h33_21&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;2012-07-12_23h33_21&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilUduat1bKaD06MyFjb5inydv47a6lLWojVGIynBPT6aeifqvi1xLAeWLLycRgv87BhyphenhyphentQE0H0bsb0dOT9W_FzsjNTXRB19RoUr-oZnQLVqcDkveFHML3gWGOCfjvuNF1dBBZvfald9Grc/?imgmax=800&quot; width=&quot;489&quot; height=&quot;406&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;比較新的 Ethernet Shield 增加了 micro-SD card 插槽，可以用來儲存檔案，你可以用 Arduino 內建的 SD library 來存取板子上的 SD card。(&lt;font color=&quot;#008000&quot;&gt;註:雖然 microSD 一張只要幾百塊台幣，不過現在全球經濟不景氣，而且當紅的雲端服務喊得震天價聲，網路上有一堆免費的 Cloud Storage 可用，我懷疑有多少人會願意再花錢去買 microSD :D &lt;/font&gt;)。&lt;/p&gt;  &lt;p&gt;Ethernet Shield 相容於 UNO 和 Mega 2560 控制板。&lt;/p&gt;  &lt;p&gt;Arduino 控制板跟 W5100 以及 SD card 之間的通訊都是透過 SPI bus (通過 ICSP header)。以 UNO 而言，SPI bus 腳位位於 pins 11, 12 和 13，而 Mega 2560 則是 pins 50, 51 和 52。UNO 和 Mega 2560 都一樣，pin 10 是用來選擇 W5100，而 pin 4 則是用來選擇 SD card。這邊提到的這幾支腳位都不能拿來當 GPIO 使用。&lt;/p&gt;  &lt;p&gt;另外，在 Mega 2560 上，pin 53 是 hardware SS pin，這支腳位也必須保持為 output，不然 SPI bus 就不能動作。&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX-v92R1zs-gbpX7CYpH3z5ZEDjQcdjg-9TbaRG5ZvM-cDKRi33221nTyixVu6504lUyF7r2mSAPYcOBMGOHniPRfJr6MetX_vnh37FlXHMBPbt5N6SQMqNzcBfK3WsQ2jgE0xygwHFb_s/s1600-h/image2.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitAZ1bVKfNWzWJod6_sYHGv8j0lTAGDDVahhLZkE_6V4Lz2RY5dW53yGr4vPbvNwQSBANznQwg65nUyVN2hg5BEykqHNTq1JMmBBiRH8HEjgDQCj9BoSeOKw80p4Ks2QxXaPDA0kRQ7Jmx/?imgmax=800&quot; width=&quot;500&quot; height=&quot;431&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY74mFdyMpi723Rf1ihzr4N5vP2JDSna1gfoWnGidsv-bDQZzktsWlyFqcLJxbTsF_lUTYCtoqxnLuRzKJ2EufGOOF97Lr785mKdMPf05o7wiyQUsDJxcL-A5mrVlOghlPJF1R4wb9QWZM/s1600-h/image5.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMSZIUrRl27kbb_gBXmKec6wY93K7Rt5sn_tMdu4vIYoTor2RtNSijwEQ8a9oBFgCnkRltlMaPpEFS0HMGw9O5noQkvEN2st5AmSZcV9HduqiAQyIBLS74BYr37m9fk36wqPAG8SF8wQ6d/?imgmax=800&quot; width=&quot;800&quot; height=&quot;339&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;在使用的時候要注意一件事，因為 W5100 和 SD card 共享 SPI bus，所以在同一個時間只能使用其中一個設備。如果你程式裏會用到 W5100 和 SD card 兩種設備，那在使用對應的 library 時就要特別留意，要避免搶 SPI bus 資源的情形。&lt;/p&gt;  &lt;p&gt;假如你確定不會用到其中一個設備的話，你可以在程式裏明白地指示 Arduino，方法是: 如果不會用到 SD card，那就把 pin 4 設置成 output 並把狀態改為 high，如果不會用到 W5100，那麼便把 pin 10 設置成 output 並把狀態改為 high。&lt;/p&gt;  &lt;p&gt;Ethernet Shield 上有幾顆狀態指示燈 (LEDs):&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;PWR: 表示 Arduino 控制板和 Ethernet Shield 已經上電 &lt;/li&gt;    &lt;li&gt;LINK: 網路指示燈，當燈號閃爍時代表正在傳送或接收資料 &lt;/li&gt;    &lt;li&gt;FULLD: 代表網路連線是全雙工 &lt;/li&gt;    &lt;li&gt;100M: 表示網路是 100 MB/s (相對於 10 Mb/s) &lt;/li&gt;    &lt;li&gt;RX: 接收資料時閃爍 &lt;/li&gt;    &lt;li&gt;TX: 傳送資料時閃爍 &lt;/li&gt;    &lt;li&gt;COLL: 閃爍時代表網路上發生封包碰撞的情形 (network collisions are detected) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAXbfLrMRp2toPb2FAJH6Tz6baHt6hCPaDX2z6XTZJtey4zVYpD9SR3g6VIFQDLucN5zlUsTgEZINeFWDCxIjWNDNysLHop4NAsi0gL2YjAlCDttJ7SRoItTRp4wV6TE5ijM10XQ3lXiDK/s1600-h/ArduinoEthernetShield5.jpg&quot;&gt;&lt;img title=&quot;ArduinoEthernetShield&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;ArduinoEthernetShield&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh5k5opdn3BPn2q-k194vK_iSTRk3sNFhgsrpcQArx1nYitpMcZuZl2k1ton2BpDlgW2q2T85h9Q3isISJqFMJ-CvlHSwOEuglyFnWRH1llXwTA2x-YfQ4J0z50zDWpL9USWS9QlJb0Eg4/?imgmax=800&quot; width=&quot;649&quot; height=&quot;488&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;參考資料&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href=&quot;http://arduino.cc/en/Main/ArduinoEthernetShield&quot;&gt;Arduino Ethernet Shield&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://arduino.cc/en/Guide/ArduinoEthernetShield&quot;&gt;Arduino Ehternet Shield Getting Started&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://arduino.cc/it/Reference/Ethernet&quot;&gt;Ethernet Library&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://www.wiznet.co.kr/Sub_Modules/en/product/Product_Detail.asp?cate1=5&amp;amp;cate2=7&amp;amp;cate3=26&amp;amp;pid=1011&quot;&gt;WIZnet W5100 Product page&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://www.aroboto.com/shop/goods.php?id=294&quot;&gt;藝科 Arduino Ethernet Shield R3&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/6098915982826255357/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/6098915982826255357?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/6098915982826255357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/6098915982826255357'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/09/arduino-ethernet-shield.html' title='Arduino Ethernet Shield 簡介'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdkMH6JPhUa_FIjFiuK1fupvQMeIOUT19s9ogdVd0H7HbXr8QOks08c0HKlhceuh4f90WYEiLW_-PKzVZr16U76fcCxIW1XDuJ0GaGWHatkVBykaRpwGWI1880fO0kfSHALEeFBGRMsaTT/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-9049845799278986046</id><published>2013-09-02T12:50:00.001+08:00</published><updated>2013-09-10T17:09:04.953+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="OpenWrt"/><title type='text'>TL-WR703N 刷機成 OpenWrt</title><content type='html'>&lt;p&gt;TL-WR703N 刷 OpenWrt 的步驟如下：&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; 用 Ethernet cable 直接把 TL-WR703N 接到 PC，PC 端要設定 192.168.1.x 網段的固定 IP (不能用 192.168.1.1，不然會跟 TL-WR703N 衝到)，例如 192.168.1.2，subnet mask: 255.255.255.0 &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; 連到 &lt;a href=&quot;http://192.168.1.1/%20&quot;&gt;http://192.168.1.1/&lt;/a&gt; 登入 TL-WR703N 的管理介面，以使用者名稱 admin 和密碼 admin 登入&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; 在左手邊的選單找出軟件升級頁面，或是直接連到 &lt;a href=&quot;http://192.168.1.1/userRpm/SoftwareUpgradeRpm.htm&quot;&gt;http://192.168.1.1/userRpm/SoftwareUpgradeRpm.htm&lt;/a&gt;，升級介面如下:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7KuwV_YxXm0soD4aNJVbxHE5oQdgfvG4Qjba5RqXtj9FvkzDtw0CAgslar5jM_5OEsTAQO4iHgsssh4qJY6ugb9CPCqtBagDxj9RVm14-46wSpCFi6pf54BUrZRG7OqNKWjJmI3uN51f7/s1600-h/image10.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ_8yFAnYFZlhYipH1jOBjtNMhoquiEpAmNKa2rwOlqtokCIGkcpeHnFVpyksDbawOs4Yb8cH-TpoGscHcfogsaIYKlRgfQi3xM7_l8bEcWeL31PAGzp-7Ln4NWTgmFulUeKjDfyDDOwRJ/?imgmax=800&quot; width=&quot;521&quot; height=&quot;276&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; 下載最新版 &lt;a href=&quot;http://downloads.openwrt.org/snapshots/trunk/ar71xx/openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin&quot;&gt;OpenWrt snapshot&lt;/a&gt; 並上傳到 TL-WR703N&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;5.&lt;/strong&gt; 等大概 3 到 4 分鐘，直到藍色 LED 不再閃爍時，升級程序便完成了 &lt;/p&gt;  &lt;p&gt;刷機後，可以 telnet 192.168.1.1 登入 TL-WR703N (不用輸入密碼)，應該會看到 OpenWrt prompt:&lt;/p&gt;  &lt;h5&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDY0d1EI36M8lYoWEqo_orcjQcHMtCMPbOeNp6UmzwrICdb8ryt9RqpU3Q_N214EQludRTi23Mwy21IvZp8vE19zloJD_OxtSJXTNnrEOwIeBFm21O8i1HEDHMrVmBu6Ece4xKHIiP-W_C/s1600-h/image13.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhopd91VUHVG8GGZ2L3BWHzywA32N3B9WIfndNtFvUeW0limeLsVGL6Gt7ry76h-SVjfe2Hkhny8dXYBYltXY6DGczoBfk6S0PLyo82lgzaEY0LEIfMtvaZdzkEj5PVMYPZxRbVBKDhapB2/?imgmax=800&quot; width=&quot;669&quot; height=&quot;454&quot; /&gt;&lt;/a&gt; &lt;/h5&gt;  &lt;p&gt;下個 cat /proc/cpuinfo 指令看看 TL-WR703N 的 CPU 資訊:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf5558_3v73YSwI9O4d86LjIRPRbIkFVb-IjCRUsPLFRW85xUAjTMiHZ1cxNU7RF4ceAQjVvjElslO2Glu4iZxXB6eafj5Z3b0vLUY9-VuMCo1bSoZUdKFDWlWxWmd7dgjr_kDyVlTI4jh/s1600-h/20120628_21h52_192.png&quot;&gt;&lt;img title=&quot;2012-06-28_21h52_19&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;2012-06-28_21h52_19&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-stoIUshu1MtEy8nEdfG7WFgRaR4qi-0xjOkzF1M-Y690rz9FO7qZWfgvpTQLkPTgGHVpWEDgFAd0TXMPO5SC1S9pTSNl-wAZBJNr0eabcFn0fzGA3YnjOnlQoZZpRDANXjSs5Nq0EmAg/?imgmax=800&quot; width=&quot;669&quot; height=&quot;374&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;啟動 SSH / 關閉 telnet&lt;/h5&gt;  &lt;p&gt;telnet 到 TL-WR703N 後下 passwd 指令設定密碼，設定完成後，便可以與 TL-WR703N 建立 SSH 連線，OpenWrt 會自動關閉 telnet 功能。&lt;/p&gt;  &lt;h5&gt;參考資料&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href=&quot;http://www.tp-link.com.cn/product_225.html&quot;&gt;TP-LINK TL-WR703N&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://wiki.openwrt.org/toh/tp-link/tl-wr703n&quot;&gt;OpenWrt Wiki: TP-LINK TL-WR703N&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://wiki.openwrt.org/doc/howto/luci.essentials&quot;&gt;http://wiki.openwrt.org/doc/howto/luci.essentials&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/9049845799278986046/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/9049845799278986046?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/9049845799278986046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/9049845799278986046'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/09/tl-wr703n-openwrt.html' title='TL-WR703N 刷機成 OpenWrt'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ_8yFAnYFZlhYipH1jOBjtNMhoquiEpAmNKa2rwOlqtokCIGkcpeHnFVpyksDbawOs4Yb8cH-TpoGscHcfogsaIYKlRgfQi3xM7_l8bEcWeL31PAGzp-7Ln4NWTgmFulUeKjDfyDDOwRJ/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-7717129779898014898</id><published>2013-08-31T18:20:00.001+08:00</published><updated>2013-09-10T17:09:29.069+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Lua"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenWrt"/><title type='text'>寫個 LuCI 介面設定 Serial Port 的 baud rate</title><content type='html'>&lt;p&gt;OpenWrt 很多設定檔都是透過 UCI 介面 (Unified Configuration Interface) 來進行大部份的系統設定，包括 network, wireless, dhcp, firewall, dropbear (SSH Server) 以及跟網頁開發有關的 uhttpd 和 luci 都是。&lt;/p&gt;  &lt;p&gt;UCI 的檔案格式是一致的。以 /etc/config/system 為例，它的內容如下:&lt;/p&gt;  &lt;p&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: text&quot;&gt;&lt;![CDATA[&lt;br /&gt;config system&lt;br /&gt;        option hostname &#39;OpenWrt&#39;&lt;br /&gt;        option zonename &#39;UTC&#39;&lt;br /&gt;        option timezone &#39;GMT0&#39;&lt;br /&gt;        option log_size &#39;16&#39;&lt;br /&gt;        option conloglevel &#39;8&#39;&lt;br /&gt;        option cronloglevel &#39;8&#39;&lt;br /&gt;&lt;br /&gt;config timeserver &#39;ntp&#39;&lt;br /&gt;        list server &#39;0.openwrt.pool.ntp.org&#39;&lt;br /&gt;        list server &#39;1.openwrt.pool.ntp.org&#39;&lt;br /&gt;        list server &#39;2.openwrt.pool.ntp.org&#39;&lt;br /&gt;        list server &#39;3.openwrt.pool.ntp.org&#39;&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;在 LuCI 的 Web 管理介面上，有一頁是系統設定的操作介面，這個介面正是用來管理 /etc/config/system 設定檔:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl6Zou4R6aze7Ykgvy5cTAWutmCP9ZLetJXQPMVtDIPV1ZAn0qFeqF5jp48-Q4gn_qTD3R-mtRBgY54VaI9WcsBGdLZDTu8TH9c69Ztn7NunwE-pZZJPYMxhauT-9O-AjysD6mzYgDImTZ/s1600-h/image%25255B12%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmu2y5PLQCAcToR2c4AJdDBCksbu88kG8qDbfA70KQqoS9WKzcrkYPJ0_dnxphv2VgXCtnIbXD9st_5t0z5xBz5cJu9YF5H0UKcUBHZSntOMX-wYYtKb0xnmq3dFt9XgmQ8A7FFGOfBcDj/?imgmax=800&quot; width=&quot;565&quot; height=&quot;610&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;LuCI 便是透過 UCI 程式介面來讀寫 /etc/config/system 設定檔。&lt;/p&gt;  &lt;p&gt;我們也可以用 LuCI 來讀寫與管理自己的 UCI 設定檔。&lt;/p&gt;  &lt;h5&gt;Serial Port 的 baud rate 設定介面&lt;/h5&gt;  &lt;p&gt;來做個練習。首先編輯 /etc/config/arduino，輸入以下內容:&lt;/p&gt;  &lt;p&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: text&quot;&gt;&lt;![CDATA[&lt;br /&gt;config core &#39;main&#39;&lt;br /&gt;        option serialport &#39;/dev/ttyACM0&#39;&lt;br /&gt;        option baud_rate &#39;9600&#39;&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;接著寫段程式碼 (arduino.lua，請存至 /usr/lib/lua/luci/model/cbi/myapp/arduino.lua):&lt;/p&gt;  &lt;p&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: python&quot;&gt;&lt;![CDATA[&lt;br /&gt;-- Save this to /usr/lib/lua/luci/model/cbi/myapp/arduino.lua&lt;br /&gt;local fs = require &quot;nixio.fs&quot;&lt;br /&gt;require &quot;luci.sys&quot;&lt;br /&gt;local m = nil&lt;br /&gt;&lt;br /&gt;if fs.access(&quot;/etc/config/arduino&quot;) then &lt;br /&gt;  m = Map(&quot;arduino&quot;, &quot;Arduino&quot;, &lt;br /&gt;            &quot;Configure the basic aspects of Arduino&quot;) &lt;br /&gt;            &lt;br /&gt;  s = m:section(NamedSection, &quot;main&quot;, translate(&quot;Main Settings&quot;))&lt;br /&gt;  o = s:option(Value, &quot;serialport&quot;, translate(&quot;Serial Port&quot;))&lt;br /&gt;    &lt;br /&gt;  local bauds = {9600, 19200, 28800, 38400, 57600, 115200}  &lt;br /&gt;  o = s:option(ListValue, &quot;baud_rate&quot;, translate(&quot;Baud Rate&quot;))&lt;br /&gt;  for i = 1,#bauds do o:value(bauds[i]) end &lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;return m&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;其中，以 Map 對應 /etc/config/arduino，然後以 NamedSection 對應 /etc/config/arduino 設定檔中的 main 這個 section，然後建立兩個物件分別對應 serialport 與 baud_rate 這兩個 options。Value 屆時會在網頁上產生 TextBox，而 ListValue 則會在網頁上產生 Dropdown List (HTML 的 &amp;lt;select&amp;gt;&amp;lt;option&amp;gt;…)&lt;/p&gt;  &lt;p&gt;我們還要準備個 Controller 模組 (index.lua, 請存至 /usr/lib/lua/luci/controller/myapp/index.lua):&lt;/p&gt;  &lt;p&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: python&quot;&gt;&lt;![CDATA[&lt;br /&gt;-- Save this to /usr/lib/lua/luci/controller/myapp/index.lua&lt;br /&gt;-- Browse to: /cgi-bin/luci/myapp/&lt;br /&gt;&lt;br /&gt;module(&quot;luci.controller.myapp.index&quot;, package.seeall)&lt;br /&gt;&lt;br /&gt;function index()&lt;br /&gt;  -- 定義節點, request 時會呼叫 model/cbi/myapp/arduino.lua&lt;br /&gt;  page = entry({&quot;myapp&quot;}, cbi(&quot;myapp/arduino&quot;))&lt;br /&gt;  page.dependent = false&lt;br /&gt;  &lt;br /&gt;  -- 必須以 root 身分登入&lt;br /&gt;  page.sysauth = &quot;root&quot;&lt;br /&gt;  page.sysauth_authenticator = &quot;htmlauth&quot;    &lt;br /&gt;  &lt;br /&gt;  -- 定義節點, request 時會呼叫 action_logout 函式&lt;br /&gt;  entry({&quot;myapp&quot;, &quot;logout&quot;}, call(&quot;action_logout&quot;), &quot;Logout&quot;)&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;function action_logout()&lt;br /&gt;  local dsp = require &quot;luci.dispatcher&quot;&lt;br /&gt;  local sauth = require &quot;luci.sauth&quot;&lt;br /&gt;  if dsp.context.authsession then&lt;br /&gt;  	sauth.kill(dsp.context.authsession)&lt;br /&gt;  	dsp.context.urltoken.stok = nil&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  luci.http.header(&quot;Set-Cookie&quot;, &quot;sysauth=; path=&quot; .. dsp.build_url())&lt;br /&gt;  -- redirect to /cgi-bin/luci/myapp&lt;br /&gt;  luci.http.redirect(luci.dispatcher.build_url() .. &quot;/myapp&quot;)&lt;br /&gt;end&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;完成後，瀏覽 /cgi-bin/luci/myapp，便會看到如下畫面:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSwQkm8wJJjNbcYiB5_gABmfoT8jWHzZche9NRzjWW6QGSRGXszggUssGr-uk7rWpWc_SL8os4pq2p6rIXHoBzXAVlcBIoYwnRnduaVG5-uZrVSM3ZSQql2hTugXuyg7zTATL7421Bh4Eb/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPu71qQqSBM-0MuXIw87q7ZpUcXYMEa3vtnhjOyUBd9_0N1KsqIwaSvoLj_mBTltIAWcP45RurJSGCSiF3BzvuN27bE5nEQ-ZuwAu6qwvf0TIU7aF93pP5y4-yZ-0x9ib6tHGbReqTP3LL/?imgmax=800&quot; width=&quot;564&quot; height=&quot;486&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;這是 LuCI 自動產生的介面，可以讓使用者管理 /etc/config/arduino 這個設定檔的內容，當你在 UI 上做好設定，點按 [Save &amp;amp; Apply] 後，/etc/config/arduino 的檔案內容就會自動更新。&lt;/p&gt;  &lt;h5&gt;再進一步&lt;/h5&gt;  &lt;p&gt;前一個版本只是方便管理 /etc/config/arduino 這個設定檔。現在，讓我們進一步做件事「當使用者改變 baud rate 時，便呼叫 stty 指令改變 serial port 的 baud rate」：&lt;/p&gt;  &lt;p&gt;將 arduino.lua 修改成這樣:&lt;/p&gt;  &lt;p&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: python&quot;&gt;&lt;![CDATA[&lt;br /&gt;-- Save this to /usr/lib/lua/luci/model/cbi/myapp/arduino.lua&lt;br /&gt;local fs = require &quot;nixio.fs&quot;&lt;br /&gt;require &quot;luci.sys&quot;&lt;br /&gt;local m = nil&lt;br /&gt;&lt;br /&gt;if fs.access(&quot;/etc/config/arduino&quot;) then &lt;br /&gt;  m = Map(&quot;arduino&quot;, &quot;Arduino&quot;, &lt;br /&gt;            &quot;Configure the basic aspects of Arduino&quot;) &lt;br /&gt;            &lt;br /&gt;  s = m:section(NamedSection, &quot;main&quot;, translate(&quot;Main Settings&quot;))&lt;br /&gt;  o = s:option(Value, &quot;serialport&quot;, translate(&quot;Serial Port&quot;))&lt;br /&gt;    &lt;br /&gt;  local bauds = {9600, 19200, 28800, 38400, 57600, 115200}  &lt;br /&gt;  o = s:option(ListValue, &quot;baud_rate&quot;, translate(&quot;Baud Rate&quot;))&lt;br /&gt;  for i = 1,#bauds do o:value(bauds[i]) end &lt;br /&gt;  &lt;br /&gt;  function o.write(self, section, value)&lt;br /&gt;    local serialport = m.uci:get(&quot;arduino&quot;, &quot;main&quot;, &quot;serialport&quot;)&lt;br /&gt;    local str = string.format(&quot;stty -F %s raw speed %s &gt;/dev/null 2&gt;&amp;1&quot;,&lt;br /&gt;                serialport, value)&lt;br /&gt;    os.execute(str)                &lt;br /&gt;    m.uci:set(&quot;arduino&quot;, &quot;main&quot;, &quot;baud_rate&quot;, value)&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;return m&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;現在，當使用者在 Web 管理介面上改變 baud rate 時，就會同時呼叫 stty 去修改 serial port 的 baud rate 囉。你可以利用 stty –F &amp;lt;serial port&amp;gt; 來確認 baud rate 是否有改變:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxJloLLWJciVaPSXzuj3Mncs_TA5Qtey8xFQgJJiRCRWz9f9NQmgOYxtTVnpfbXoSzh9Qa6Rz1b6K0MfgHxETkE2ZV9J9Bo0OkjTV-45C-ihXnFiW8lMwho31ApRw8UgBBXcV0QmY8XaO3/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFhrWINhv5_XIkL7Zu2fJf1S0AqjDDLIuzBiNB0ANLXxveeYBqS8mlm1up9QpDnxL1RikKzMF8qVnsFjXUOOM2tm5jrlKqmtNMSIm0F1DcShygZs8nD_ruoDO3Y2B1pqoihElPxox6aIAM/?imgmax=800&quot; width=&quot;659&quot; height=&quot;232&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/7717129779898014898/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/7717129779898014898?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/7717129779898014898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/7717129779898014898'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/08/luci-serial-port-baud-rate.html' title='寫個 LuCI 介面設定 Serial Port 的 baud rate'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmu2y5PLQCAcToR2c4AJdDBCksbu88kG8qDbfA70KQqoS9WKzcrkYPJ0_dnxphv2VgXCtnIbXD9st_5t0z5xBz5cJu9YF5H0UKcUBHZSntOMX-wYYtKb0xnmq3dFt9XgmQ8A7FFGOfBcDj/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-4035201389927707930</id><published>2013-08-31T13:29:00.001+08:00</published><updated>2013-09-10T17:09:59.088+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Lua"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenWrt"/><title type='text'>寫個 LuCI 模組</title><content type='html'>&lt;p&gt;LuCI (Lua Configiration Interface) 是 OpenWRT 的 Web 管理介面。LuCI 是一個 MVC (Model View Controller) framework，所以我們可以在 LuCI 的基礎上寫 Web 的應用程式。&lt;/p&gt;  &lt;h5&gt;第一個 controller 模組&lt;/h5&gt;  &lt;p&gt;假設我們想做一件事:「當使用者瀏覽 /cgi-bin/luci/myapp/mymodule/time.htm 時，便在網頁上顯示 OpenWRT 目前的系統時間」。那麼可以寫一段程式碼如下 (mymodule.lua):&lt;/p&gt;  &lt;p&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: python&quot;&gt;&lt;![CDATA[&lt;br /&gt;-- Save this to /usr/lib/lua/luci/controller/myapp/mymodule.lua&lt;br /&gt;-- Browse to: /cgi-bin/luci/myapp/mymodule/time.htm&lt;br /&gt;&lt;br /&gt;module(&quot;luci.controller.myapp.mymodule&quot;, package.seeall)&lt;br /&gt;&lt;br /&gt;function index()&lt;br /&gt;  -- 定義節點, request 時會呼叫 action_time&lt;br /&gt;  page = entry({&quot;myapp&quot;, &quot;mymodule&quot;, &quot;time.htm&quot;}, call(&quot;action_time&quot;))&lt;br /&gt;  &lt;br /&gt;  -- 沒有上層節點&lt;br /&gt;  page.dependent = false       &lt;br /&gt;  -- 假如是葉節點, 就設成 true 避免錯誤&lt;br /&gt;  page.leaf = true&lt;br /&gt;end&lt;br /&gt; &lt;br /&gt;function action_time()&lt;br /&gt;  luci.http.prepare_content(&quot;text/html&quot;)    &lt;br /&gt;  luci.http.write(&quot;&lt;h1&gt;Hello LuCi&lt;/h1&gt;&quot;)&lt;br /&gt;  luci.http.write(&quot;&lt;h2&gt;Current time: &quot; .. os.date(&quot;%D %T&quot;) .. &quot;&lt;/h2&quot;)&lt;br /&gt;end&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;其中，以 entry() 定義了一個節點，作用是「當使用者瀏覽 /cgi-bin/luci/myapp/mymodule/time.htm 時，便會呼叫 action_time() 函式」，而 action_time() 函式則會負責產生一個顯示目前系統時間的網頁。&lt;/p&gt;  &lt;p&gt;把 mymodule.lua 放到 /usr/lib/lua/luci/controller/myapp/mymodule.lua，然後瀏覽 /cgi-bin/luci/myapp/mymodule/time.htm，就會看到底下的結果:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgggJWZQqQtBZ1HzkYQFaSAh_rKsOsRFoX43UajeiRYILAcNPiTpS3hL5NIkY5JQoQ80LOZ-WWG76qaFPffeHH5lTDQu8A-Q8Xd6ar_yLgQtpB8QzxgqtTvGd4BhtnilzlPYGRTAzi0nhsD/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkwrPOSA1sKg-TDP20wKrYIlA-GmDHQ36jNeMdAuLDpC0FTGrganYr2FyEJR3TFpC7EJ1FU8gRQMRGsgyH6zDkN-OD-M65N0a7vDsPKiCm3jmkVkLQMJs1PKjEhoYAkU1HYMKaRFoCzv68/?imgmax=800&quot; width=&quot;656&quot; height=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;建立 VIEW&lt;/h5&gt;  &lt;p&gt;跟 PHP, ASP.NET, JSP 一樣，LuCI 也有 template 的功能，可以在 HTML 裏混用 Lua Script 產生動態網頁。底下做個示範。&lt;/p&gt;  &lt;p&gt;首先，建立了一個 template 檔如下，並把它存到 /usr/lib/lua/luci/view/myapp_mymodule/time.htm:&lt;/p&gt;  &lt;p&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: xml&quot;&gt;&lt;![CDATA[&lt;br /&gt;&lt;!-- Save this to /usr/lib/lua/luci/view/myapp_mymodule/time.htm --&gt;&lt;br /&gt;&lt;%+header%&gt;&lt;br /&gt;&lt;h1&gt;Hello LuCI&lt;/h1&gt;&lt;br /&gt;&lt;h2&gt;Current Time: &lt;%= os.date(&quot;%D %T&quot;)%&gt;&lt;/h2&gt; &lt;br /&gt;&lt;%+footer%&gt;&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;接著寫個 controller 模組如下，把它存到 /usr/lib/lua/luci/controller/myapp/mymodule.lua:&lt;/p&gt;  &lt;p&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: python&quot;&gt;&lt;![CDATA[&lt;br /&gt;-- Save this to /usr/lib/lua/luci/controller/myapp/mymodule.lua&lt;br /&gt;-- Browse to: /cgi-bin/luci/myapp/mymodule/&lt;br /&gt;&lt;br /&gt;module(&quot;luci.controller.myapp.mymodule&quot;, package.seeall)&lt;br /&gt;&lt;br /&gt;function index()&lt;br /&gt;  -- 定義節點, 當作 myapp.mymodule.time.htm 的別名&lt;br /&gt;  page = entry({&quot;myapp&quot;, &quot;mymodule&quot;}, &lt;br /&gt;               alias(&quot;myapp&quot;, &quot;mymodule&quot;, &quot;time.htm&quot;), &quot;My Module&quot;)&lt;br /&gt;  page.dependent = false&lt;br /&gt;&lt;br /&gt;  -- 定義節點, request 時會 render view/myapp_mymodule/time.htm&lt;br /&gt;  page = entry({&quot;myapp&quot;, &quot;mymodule&quot;, &quot;time.htm&quot;}, &lt;br /&gt;               template(&quot;myapp_mymodule/time&quot;), &quot;Time&quot;)    &lt;br /&gt;  page.dependent = false; page.leaf = true        &lt;br /&gt;end&lt;br /&gt; &lt;br /&gt;]]&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;其中，程式以 entry() 定義了兩個節點。先說第二個節點，它的作用是「當使用者瀏覽 /cgi-bin/luci/myapp/mymodule/time.htm 時，會 描繪呈現 (render) /usr/lib/lua/luci/view/myapp_mymodule/time.htm 這個 template 的內容 」，而第一個節點只是第二個節點的別名，所以你可以瀏覽 /usr/lib/lua/luci/view/myapp_mymodule/time.htm，也可以簡寫成 /usr/lib/lua/luci/view/myapp_mymodule 這樣就好，兩者結果都是一樣的。當你執行這支程式時，會看到這樣的結果:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhF_s4_bm1sPtAFcC4iTxyaLynm4rXeSwo1UJGlNqRLTuectrLKLTdCEJuSol9foqPPjoQwaEWOFa3SdScBZpwpMdC3K-zQKHnt4zVGr4-KBHjjjCoVfl1frzOlLnEVMVYGNnyE9qh5q6wu/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJjfPTSfrkYNUMa9vWhyphenhyphen8zmCSEt_vF3M2TXSaWTlBiyzWsUIOUJ1cHKbavtrakjnYZE0DLZRM14HCFq-VvNnObbIGAjKJtJY0Pb4S2Q_k1v03GphGTEpvWiD1D152qTHFsASKTJTs7DT9_/?imgmax=800&quot; width=&quot;707&quot; height=&quot;324&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;LuCI 現在預設都是用 bootstrap CSS frontend，time.htm 引入了 header template，因此享受 bootstrap 的好處，變得比較美觀了。&lt;/p&gt;  &lt;h5&gt;暫除 LuCI 模組暫存檔&lt;/h5&gt;  &lt;p&gt;在學習寫 LuCI 模組時，有件特別注意的事。由於 LuCI 會把 module 暫存起來，就算你寫的 module 有做過變動，LuCI 也不會跑更新過後的版本。所以當你更新 module 時，記得刪除 LuCI 的模組暫存檔，這樣 LuCI 才會跑新版本的模組。&lt;/p&gt;  &lt;p&gt;刪除 LuCI 模組暫存檔的指令為:&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&amp;#160; rm /tmp/luci-indexcache /tmp/luci-modulecache/*&lt;/code&gt;&lt;/p&gt;  &lt;h5&gt;參考資料&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href=&quot;http://luci.subsignal.org/trac/wiki/Documentation/ModulesHowTo&quot;&gt;HOWOT: Write Modules&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/4035201389927707930/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/4035201389927707930?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/4035201389927707930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/4035201389927707930'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/08/luci.html' title='寫個 LuCI 模組'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkwrPOSA1sKg-TDP20wKrYIlA-GmDHQ36jNeMdAuLDpC0FTGrganYr2FyEJR3TFpC7EJ1FU8gRQMRGsgyH6zDkN-OD-M65N0a7vDsPKiCm3jmkVkLQMJs1PKjEhoYAkU1HYMKaRFoCzv68/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-3923278987446875036</id><published>2013-08-24T23:40:00.001+08:00</published><updated>2013-09-10T17:10:32.685+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Lua"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenWrt"/><title type='text'>寫個 uhttpd 的 CGI</title><content type='html'>&lt;p&gt;uhttpd 是一個小型的 HTTP Server，支援 TLS, CGI, Lua。OpenWRT 的 Web 管理介面 LuCI (Lua Configuration Interface) 一般都是搭配 uhttpd 使用。底下是一張 LuCI 的畫面截圖。新版 LuCI 現在預設都用 twitter bootstrap 當作佈景主題 (Theme)，非常美觀，看起來很舒服。&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnlcwVm70TTevzvalUpJkAy3rc889b7KGTcItHYcXf_WptWuygrr51az8MVarem7Y5PEbzPpxCmQvS2ZbTjzVNFrwCTqMyL9sWnZ4LFj1YSYK4NJljlsoG3vUgpwdn_JSJvVlHsutr0DeC/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg07fHBb_xU5TLR3a_LiSNWdDRqUMA0cPHcwjKzCratvZy3Iz358E1OZFBm4rK7MMrYK7PTow9WLEFQJXUAO_6wUKYqggaRZDoDYyYDspqqvZUB_u8xfpHXvoQ5uLhjmWdrw80kERSc6hyk/?imgmax=800&quot; width=&quot;668&quot; height=&quot;571&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;uhttpd 的 Docuement Root 預設是在 /www，而 /cgi-bin/luci 則是預設的 CGI Gateway。&lt;/p&gt;  &lt;p&gt;我們可不可以自己也寫個 CGI？當然可以，舉個例子，用 Lua 寫段簡單的程式碼如下：&lt;/p&gt;  &lt;p&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: python&quot;&gt;&lt;![CDATA[&lt;br /&gt;#!/usr/bin/lua&lt;br /&gt;&lt;br /&gt;-- HTTP header&lt;br /&gt;print(&quot;Content-Type: text/html&quot;)&lt;br /&gt;print(&quot;&quot;)          -- An empty line&lt;br /&gt;&lt;br /&gt;-- body&lt;br /&gt;print(&quot;&lt;h1&gt;Hello CGI&lt;/h1&gt;&quot;)&lt;br /&gt;print(&quot;&lt;h2&gt;Current time: &quot; .. os.date(&quot;%D %T&quot;) .. &quot;&lt;/h2&quot;)&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;檔名取為 helloCGI，把它存到 /www/cgi-bin/helloCGI，接著把檔案屬性改為可執行：&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&amp;#160; chmod +x /www/cgi-bin/helloCGI&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;然後瀏覽 http://&amp;lt;OpenWrt’ IP Address&amp;gt;/cgi-bin/helloCGI，會得到這樣的結果：&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHSkxq2lOgDAwezkBmAvPvUQNkNw6QyGW0jNfbBavgOsXLBVbPFezSqOs82zLduZN42N8d7_3bhlL_k9Tli4Ul7OUNGB1l-d7USOIQhUqGKGA6gjnAu3Hj3e2Wyiwd_MDhyvqqViJ_wVLO/s1600-h/image%25255B6%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOva3i8y15C5wjrdeLNgNzTcYQxEHqKmxvq1ZP3JH2hxbJLzYv0aOy7_gHNyrQ4Yrto2qyXV52CgygiSSTQ3CWmdlKVQ05_3dS59N51xc9_pC3aQMZs6ZSADgmfECnLkyPgNSAVwRn4kLd/?imgmax=800&quot; width=&quot;547&quot; height=&quot;234&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;這就是一個簡單的 uhttpd 的 CGI 程式了。&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/3923278987446875036/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/3923278987446875036?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/3923278987446875036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/3923278987446875036'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/08/uhttpd-cgi.html' title='寫個 uhttpd 的 CGI'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg07fHBb_xU5TLR3a_LiSNWdDRqUMA0cPHcwjKzCratvZy3Iz358E1OZFBm4rK7MMrYK7PTow9WLEFQJXUAO_6wUKYqggaRZDoDYyYDspqqvZUB_u8xfpHXvoQ5uLhjmWdrw80kERSc6hyk/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-2190865682581076804</id><published>2013-08-24T16:05:00.001+08:00</published><updated>2013-09-10T17:11:03.792+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Lua"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenWrt"/><title type='text'>uloop: 一個簡單的 Event Loop implementation</title><content type='html'>&lt;p&gt;我在 OpenWrt 裏找到一個小工具 uloop，一個簡單的 Event Loop Implementation，藏身在 libubox 裏。&lt;/p&gt;  &lt;p&gt;uloop() 主要提供兩個功能，一個是簡單的 timer，可以設定在 timeout 後自動執行指定的 function，另一個是類似 exec 指令，可以執行外部程式，後面這個功能好像沒多大用處。uloop() 有 lua binding，所以可以在 lua 程式裏套用。&lt;/p&gt;  &lt;p&gt;底下的程式示範 uloop()&amp;#160; timer 的使用方法 (timer_demo.lua):&lt;/p&gt;  &lt;p&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: jscript&quot;&gt;&lt;![CDATA[&lt;br /&gt;#!/usr/bin/env lua&lt;br /&gt;&lt;br /&gt;local uloop = require(&quot;uloop&quot;)&lt;br /&gt;uloop.init()&lt;br /&gt;&lt;br /&gt;-- timer example 1&lt;br /&gt;function t1()&lt;br /&gt;  print(&quot;1000 ms timer run&quot;);&lt;br /&gt;  print(&quot;t1 runs only once&quot;);&lt;br /&gt;end&lt;br /&gt;uloop.timer(t1, 1000)&lt;br /&gt;&lt;br /&gt;-- timer example 2&lt;br /&gt;local timer&lt;br /&gt;function t2()&lt;br /&gt;  print(&quot;2000 ms timer run&quot;);&lt;br /&gt;  timer:set(2000)&lt;br /&gt;end&lt;br /&gt;timer = uloop.timer(t2)&lt;br /&gt;timer:set(2000)&lt;br /&gt;&lt;br /&gt;-- timer example 3, cancelled, will not run&lt;br /&gt;uloop.timer(function() print(&quot;3000 ms timer run&quot;); end, 3000):cancel()&lt;br /&gt;&lt;br /&gt;uloop.run()&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;執行結果如下:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij0L2kIDAelZn-nhpqLayWKSkQmjLpXLaz1ZwspK-Fz_JkKxPnhHwVDbqa6q7W6URRYuE9KUWpzbKwfIBwg2uBgAP2QUEXSdYclNfF1ezYgNQhTC90C-KfzwmTVeYarlLuDCKq2VMRPCq1/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTJjhUVektzfRZoxNJQTYb9GJvop6Ktd_Zt6T5tnGMewmAHE5kMQLojRwHV32VBi7cDIimrsjN-gxLxS_Ue0uFPCZ5ZjTXqRCS8CIoZ7JUTCVtRsVnpY4idqMBmu3ktQ674axyALMMc774/?imgmax=800&quot; width=&quot;539&quot; height=&quot;280&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;其中，t1 只跑一次，t2 每兩秒跑一次，而 t3 則不會跑，因為它被取消了。&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/2190865682581076804/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/2190865682581076804?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/2190865682581076804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/2190865682581076804'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/08/uloop-event-loop-implementation.html' title='uloop: 一個簡單的 Event Loop implementation'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTJjhUVektzfRZoxNJQTYb9GJvop6Ktd_Zt6T5tnGMewmAHE5kMQLojRwHV32VBi7cDIimrsjN-gxLxS_Ue0uFPCZ5ZjTXqRCS8CIoZ7JUTCVtRsVnpY4idqMBmu3ktQ674axyALMMc774/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-5545078570244413900</id><published>2013-08-20T13:18:00.001+08:00</published><updated>2013-08-20T15:43:03.707+08:00</updated><title type='text'>scp for Windows</title><content type='html'>&lt;p&gt;在 Linux 上，要在兩台電腦之間傳輸檔案，最簡單的方法是用 scp (Secure Copy) 指令，例如「把 README 傳到 Arduino-Wrt 的 /tmp 資料夾下」:&lt;/p&gt; &lt;code&gt;&amp;#160;&amp;#160; coopermaa@ubuntu:~$&lt;/a&gt; scp README root@Arduino-Wrt:/tmp &lt;/code&gt;  &lt;p&gt;如果想要複製目錄，那麼只要加個 -r 選項。&lt;/p&gt;  &lt;p&gt;Windows 上也有 scp 指令可用。我找到兩個，一個是 &lt;a href=&quot;http://msysgit.github.io/&quot;&gt;msysgit&lt;/a&gt; (Git for Windows)，msysgit 打包了很多 Linux 的指令，包括了 scp。另一個是 &lt;a href=&quot;http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html&quot;&gt;pscp&lt;/a&gt; (Putty Secure Copy)。這兩個工具的 scp 指令用法和 Linux 版本幾乎一模一樣。&lt;/p&gt;  &lt;p&gt;除了指令列工具，你也可以用 &lt;a href=&quot;http://winscp.net/&quot;&gt;WinSCP&lt;/a&gt;。WinSCP 是 GUI 的介面，用滑鼠就可以操作:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1)&lt;/strong&gt; 安裝好 WinSCP 後，登入你的 Linux (Raspberry Pi or Openwrt or whatever):&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_tltRvmDXsIqJ6Ws-US4pi2QDFp4x8TCUNL0NaGuWnPoLaLtTjxYbRByp1dDPLalGlDh3tdi5CQH00i9JGoP09YwAsOrEZF36OXBfjgPdbe_2AuaQaRPqj8TO0E5-0FinKhLQfqYzGTgY/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg01Pon7D3BXGVjPT25WB2mJmWzSQW52PKUzwjN6C7h5WCMrGQet3Mi6PF9golfzZwdpE9BU3gkpXIT49iWEbbyy3qBmHXfgwAj-N0OxQ350hnmi4iUHChnG7nayTDOmJHEgwT-nb8W7nMC/?imgmax=800&quot; width=&quot;529&quot; height=&quot;470&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2)&lt;/strong&gt; 登入後，會看到 WinSCP 的管理介面，左邊是你的 PC，右邊則是你 Linux 的檔案系統。你只要用滑鼠拖放就可以傳輸檔案。&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjQu43ZJoD3cu0_1zCtkM9mTwLkvf2qp77f2pA98GtN15iXpEimtmxHLChurK9ix1uvaxU0YKLBMPyqdwQDQQRgBZwR7oJS9rN4i6zjiQsDGZ9pgSAvNyQb6_Wx8EO7EGt80Ji6Wd6nG1I/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1EbUPFkyqoZlFBjkdANS_JTe7QBzAm47_rdLu0iuRIuxUaA3CmzSqWh_x8wHx4dOs_d3OIjrrF1eqrLkvk6XNEedPOpLxHxjWY2-Kh6kdbfTVm0As6m_jXNZDo7Fj2nkB8wRmNV1HQuvB/?imgmax=800&quot; width=&quot;732&quot; height=&quot;512&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/5545078570244413900/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/5545078570244413900?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/5545078570244413900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/5545078570244413900'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/08/scp-for-windows.html' title='scp for Windows'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg01Pon7D3BXGVjPT25WB2mJmWzSQW52PKUzwjN6C7h5WCMrGQet3Mi6PF9golfzZwdpE9BU3gkpXIT49iWEbbyy3qBmHXfgwAj-N0OxQ350hnmi4iUHChnG7nayTDOmJHEgwT-nb8W7nMC/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-2001105500545131935</id><published>2013-07-19T20:26:00.001+08:00</published><updated>2013-09-10T17:12:05.970+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arduino"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenWrt"/><title type='text'>Virtual Serial Port</title><content type='html'>&lt;p&gt;ser2net 是把 serial port 轉成 TCP Socket (請參考我寫的 &lt;a href=&quot;http://coopermaa2nd.blogspot.tw/2013/07/ser2net-for-openwrt.html&quot;&gt;ser2net for OpenWrt&lt;/a&gt; 一文) ，而 Virtual Serial Port 則剛好相反，會反過來把 TCP Socket 轉換變成系統上的一個 Serial Port。這篇將介紹 Virtual Serial Port 的使用方法。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; 先連到底下的網站下載 HW VSP Singleport:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href=&quot;http://www.hw-group.com/products/hw_vsp/index_en.html&quot;&gt;http://www.hw-group.com/products/hw_vsp/index_en.html&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUx2KT32f3XVd5zvNg7tDCEjmk9m60HsUvFEKpyAcXyR3sAgCpYDw1lQ6slWBlxwurryuI8Mp-c6vY_Mm-1kP5W95gwEP6NO4cxyLscO5mg2AwAv8Kd6pJwa9p1IFyinJyRrImxFwXcZQV/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhELcp0aDU4krpHeaqNuRxhFT7xY-tz9jClt3QDEtUq7fR2j-C2DyL-pZYdSHMm6YJhqgYTKlgjW3Junjbvb_Q5aBehb7-0VN29dwo8YdsEfnf1UgbjFow5mpzmxVSCoWa0jqy-1x6mWOwA/?imgmax=800&quot; width=&quot;280&quot; height=&quot;230&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;HW VSP 有兩種版本，Singleport 是免費的版本，Multiport 則是商用版本。這裏請下載 Singleport 的版本。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; 執行安裝程式&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDxwYKMhGzNIwqgDCGI_Sum-uWg-yRdKhNXzgEEYkIOs1318PIT3piUMEeD3fHcI7socDOl42QQ_Cf4I5bKOLRAv6ZgmstF8C67wOqgrkiihRgDlgjiSdqhpUH1_dXbk2rLC1kKU7_AgbP/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6zJTxSow5aUXvZtEIcAMDE2Yw1UGKqFogsuFDZxwM42w0GgEvrTIw0LCk5Li0ZiT0bDQMaY78jg1Js1WddGcrkXXb2Z6kxPwJxyOKjoR86buXeUDhaknNS-N4QBnMlJOCtsIPBVSZUZ4W/?imgmax=800&quot; width=&quot;513&quot; height=&quot;398&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;安裝程序最後一步會跳出底下視窗，問你要不要把程式加到防火牆的例外清單，請按 [是(Y]:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiys84SmCwAraKMaX5ULs3mWhV7Bb_ePhbqx89i-u3zUabL2mpe3Iv_NRk0-FuxdLU-UQa5EXOXEV9ps7LYk3baf_mCZ8qYIAltcLteHsfOyhuImD1fkd0a4jfwOLeXKuNh520fuDXoqROf/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiyrGrwbGhrro4Rm_RgoLYGCoWkPeTYiJdAJZOGwVyU4ntqhp2IO5fnY5TcfzpnJPh-oMZOP8vrbn6JJnF2G9SDGV155s1hQuMTJQRIYSNJFxmg3osTefd0Ir1XV26Ui9BacADPeF2_-pA/?imgmax=800&quot; width=&quot;482&quot; height=&quot;178&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; 打開 HW Virtual Serial Port&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihYcsyfH0UFD-7ShbX1iWK3FytR3q46rdQ8eyQw5FmNbqNWalq79mdVhzoqlbuo5kKBbbxhyHJZANqiKqf9x2oglEpvAp6Mq9gdoJDnFOBSICdBBkmrz-bqTHNFh9SEkr0DkF5jSns23yt/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdmk-Wm7iLJb-QPh7l01mzPx7QE1is8ynL4_njXqSGuZl63FW-t9W2p2eO3hSOyPcGXg4WLTAUIVuwCmhmQzfvDQPvD0z7yZC6rxLgaEo-jTcjApBUlKNHUwHf5tOvOFtfoJPJ55mZaV7e/?imgmax=800&quot; width=&quot;603&quot; height=&quot;490&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;要先登入，請點一下右手邊的 Login，跳出底下視窗後，直接按下 OK 鈕:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgADXK9miZXCSdo5ldsqsf7wmMZpu2nh8Y5-O2ATsQw1MtMjvw6unirfYE9gHpQi7OrDZ96y9nMa5NBQZcQix9A2cA5vDvWWFjtGKM2LZtCANn8UxZOyq8WcfYRi6q5vE1d6ExGc9KOozH0/s1600-h/image%25255B14%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkaPiBAIl9OFeuOLBfDAPQtScfaR_hg_ebDmk0eOvH0gpa59pYqbya6N-he72GdnfYRv7N1NH1FnGn_kDs6YiQn64q4scPEkP5iFJnVN-Lt6dw8XKwq2-wb5QtB34k12lSq2HSl46GFLox/?imgmax=800&quot; width=&quot;306&quot; height=&quot;176&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; 假設要為 192.168.10.1:2001 建立一個 Virtual Serial Port (我在 &lt;a href=&quot;http://coopermaa2nd.blogspot.tw/2013/07/ser2net-for-openwrt.html&quot;&gt;ser2net for OpenWrt&lt;/a&gt; 一文中建立的 Socket Port) ，那麼就照底下視窗填好相關欄位，然後按下 Create COM 鈕:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCbxo9vQ6FrCfs9iaOgZSiH6P5q0q767DtOYna0CVp7x4OTwLPnJMDEtgoesviccWNMneyZmk-8vYddOEl58p3O4sYF0zLD3tAKX_rG8sxgGXKt7IwGwHHA86LTsSf9Y7IDUQ3fAgeDQOg/s1600-h/image%25255B17%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe8wnW5LltvKoyvxsAKdamn8FP-CqNS8P4lcIlt3ZhIaco9dBqlWxB7sy5rHmMWS8uzutmgvNKJO5H_P0sTllS7vxfra0aydwxWCA9_r96L9TMNXKe-PfwrIrBP8UaQzQPGMvV-mzd9Vsq/?imgmax=800&quot; width=&quot;603&quot; height=&quot;490&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;過幾秒鐘後，在裝置管理員裏就會多出一個 COM3 的 Serial Port:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmN3nke0_HAfHAzLuLCFi5BZVzTeQOYy5HaQDU5nNwcKaa4NlUKhABNmjEVjR6BFOb752rnUDyIlinCBTZXz_L9PcxHP-K4lghDAyQ4H1-IBEbxPzzzoAnJzp3tlHcnWwuxf0Pkwnhojxe/s1600-h/image%25255B20%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmdJOY33mEtWTb1MhB5kXrv2JFClo8IV7MdpcIxLIdgmQ-s_qcPhyphenhyphenPn-NGRNrnRihX-DkO06YTdJPsyu6_qceIzZnPsFb7fjoAX6zCS5vD2llxNSl_A9GfuKNzkSakYrmT7wWd3pjoG0_-/?imgmax=800&quot; width=&quot;615&quot; height=&quot;502&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;接下來我們就可以把這個 COM3 當作是一般的 Serial Port 來使用囉。&lt;/p&gt;  &lt;p&gt;例如我在筆電上建立了一個 COM3 的 Vritual Serial Port，我可以用 Arduino Software 的 Serial Monitor 收 Arduino 的資料:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVWrxquxDdhdNloBoDybM8ACesF5u6ElmmCkExCARTIWNTLbksjUcwqmPV6eLI3HCQJPyqvD9NQsqtnXBhcDbEDUu2ZIIj-aMPDBEXFGSiQuJ48f__UoOOKWxBxcTqQUt0qYjKjTyeCbhN/s1600-h/image%25255B26%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPHSF7-0z3deNFvBBM_PnjW1w0W74TdjIfyzmtJErIO-wyZiA8iInUfJx7moEv1PO6x36rdvYROD-Oyvf1sMDFTzUjRvfV9ng-oDblh8qHbY5G79MZi18jVs2msDgw2YFvVggRYpbu37kr/?imgmax=800&quot; width=&quot;500&quot; height=&quot;468&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;要知道，這個 COM3 其實是 OpenWrt 上以 ser2net 轉成 TCP port 2001 的網路服務。&lt;/p&gt;  &lt;p&gt;&lt;font color=&quot;#ff0000&quot;&gt;&lt;strong&gt;注意！&lt;/strong&gt;&lt;/font&gt;雖然可以用 Serial Monitor 開啟 Virtual Serial Port，但是 Virtual Serial Port 有一個限制：「我們不能透過 Virtual Serial Port 上傳 Arduino 的 Sketch」，這一點要切記，因為畢竟 Virtual Serial Port 跟一般的 Serial Port 是不一樣的。&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/2001105500545131935/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/2001105500545131935?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/2001105500545131935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/2001105500545131935'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/07/virtual-serial-port.html' title='Virtual Serial Port'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhELcp0aDU4krpHeaqNuRxhFT7xY-tz9jClt3QDEtUq7fR2j-C2DyL-pZYdSHMm6YJhqgYTKlgjW3Junjbvb_Q5aBehb7-0VN29dwo8YdsEfnf1UgbjFow5mpzmxVSCoWa0jqy-1x6mWOwA/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-3661529303032736449</id><published>2013-07-19T17:02:00.001+08:00</published><updated>2013-09-10T17:11:34.888+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arduino"/><category scheme="http://www.blogger.com/atom/ns#" term="OpenWrt"/><title type='text'>ser2net for OpenWrt</title><content type='html'>&lt;p&gt;&lt;a href=&quot;http://ser2net.sourceforge.net/&quot;&gt;ser2net&lt;/a&gt; 可以把 Serial port 的通訊轉成 TCP Socket 的通訊。大部份的 Arduino 都是用 USB 介面接到筆電、Raspberry Pi 或是 OpenWrt，只能走 Serial 通訊，底下說明如何用 ser2net 把 Arduino 的 Serial 通訊轉成 TCP Socket 通訊:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; 上傳 [&lt;strong&gt;File &amp;gt; Examples &amp;gt; 01. Basics &amp;gt; AnalogReadSerial&lt;/strong&gt;] 到 Arduino 板子上，我們將用這支程式示範:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLKiwbI3Ka0f82GJhu42Fc9OdWysr4n4oihTI0tIEV242LSH9NEzUToigFPA1bo1iUhy4HR56obbFtXiYrEzqwGuwsJRxmsvq9nQ44AoerzgQSs3eGameybLhfSosXUqS1ycenrC-C5WIq/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik8dJSyVruq6UdlCRQnMCNoJARZwz20X8J1d4J-Bij6Qbi0wandTgHeSEI-9VIC080rr3zt9WdN-fedkdjvbwgGZ9WlctLwtCMebglQsJlR3VRELqNKKB4R84mhI_ECo-aebNxj1KVKOZJ/?imgmax=800&quot; width=&quot;500&quot; height=&quot;524&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2)&lt;/strong&gt; 登入到你的 OpenWrt，以底下指令安裝 ser2net (若使用 Raspberry Pi 等 Debian Linux，請用 apt-get 安裝):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;code&gt;opkg update        &lt;br /&gt;opkg install ser2net &lt;/code&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvM1fXTUECT0NgaMWgvKThTaS2t7i7mDFyTV2EltRhrh7e46LwgnY-r6tAtj6G1iMV6W2m-cGjzkbPFX4vNSDKL8l9W-aZuK5HbIF1Tics5TWolrhvQV8xAJpsgfB-NrprT7Nt5Ez9c41C/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVT0e8XIYvJCAadm6d2crSNpIynqOEiIbZL2Vzt_iT_etZeF6CFlDzgIdS3V14ecBwI4rNT3-2j4dLtpEWohluHKOf63FuNow4UCcR5bCk1U6bBKi0Tm2uLRMrnCJuWmVS_CflkhUsJDhC/?imgmax=800&quot; width=&quot;675&quot; height=&quot;280&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3)&lt;/strong&gt; 以指令 vi /etc/ser2net.conf 編輯設定檔，設定 Arduino 所在的 serial port 與 baud rate:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;2001:raw:600:/dev/ttyACM0:9600 NONE 1STOPBIT 8DATABITS XONXOFF LOCAL –RTSCTS&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;此例 Arduino 接在 /dev/ttyACM0，baud rate 是 9600。&lt;/p&gt;  &lt;p&gt;接著輸入底下指令啟動 ser2net:&lt;/p&gt;  &lt;blockquote&gt;&lt;code&gt;     &lt;p&gt;ser2net&lt;/p&gt;   &lt;/code&gt;&lt;/blockquote&gt;  &lt;p&gt;執行後，ser2net 會把 Arduino 的通訊轉成網路 port 2001。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;4)&lt;/strong&gt; 用 Putty 或 Telnet 工具連入 OpenWrt:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFoPvPdSiMJ1iXp5B0w5tXr47ZBFP_0leCl-zq4ESQCoWm4XssL3qkTgdjf1hgT0zpYI7bLecCY1MsC8OrdOn-owRFVVdahRtqGpCyU1BrfveFXoVcAgjc2Y6HPu67QA7XfOVe7TAk2Zs6/s1600-h/image%25255B14%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhL-GQKIwQosvcCgHqVK-dte4NRrHhZcMRfEMTp7e1NVpeFZxiP-EpW7pjU11dOZ_MTr-s3nMOUZ8Hr16T8lChcVWkZyR5jVz_JYxh8eucmIeCE8hBgnL_J-lehV9Uv9oPaYwVvQp_FA9g/?imgmax=800&quot; width=&quot;466&quot; height=&quot;448&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;其中:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;IP Address 是你 OpenWrt 或 Raspberry Pi 的網路位址 &lt;/li&gt;    &lt;li&gt;Port 要與 ser2net 的設定一樣，此例為 2001 &lt;/li&gt;    &lt;li&gt;Connection type 要選擇 Telnet &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;最後按下 [Open] 連線，在 Putty 視窗上就會看到 Arduino 模擬輸入 (Analog Input) 的讀值囉:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdux55VpprakLn8ohHSJDVVuWR8_nB-sS7YEpQ119Vlnu10i0Djp2k3PREsFAN9znKdT2lEPDAPhYSxeoknjxeO27gZwr9ymt6wd4DkmUetPLLosQiRXbsk1BDr6mRLXP7jJ3gjhs8G2k_/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgT4YidQzjBXCSOGCC1su12a_HUcol0We7zC5HKr3J7xh1MVIpC-CK_oI2RDCrNw3UfGcPw-1KE7CprIrfHqUgnVNSlubu2kjFN72pT3RfQoBRS8IIFnZUIXzDmCoW5hnUKtfGf7x-Mn1xr/?imgmax=800&quot; width=&quot;675&quot; height=&quot;424&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/3661529303032736449/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/3661529303032736449?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/3661529303032736449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/3661529303032736449'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/07/ser2net-for-openwrt.html' title='ser2net for OpenWrt'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik8dJSyVruq6UdlCRQnMCNoJARZwz20X8J1d4J-Bij6Qbi0wandTgHeSEI-9VIC080rr3zt9WdN-fedkdjvbwgGZ9WlctLwtCMebglQsJlR3VRELqNKKB4R84mhI_ECo-aebNxj1KVKOZJ/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-7791995757416614653</id><published>2013-06-01T18:47:00.001+08:00</published><updated>2013-06-01T22:47:07.185+08:00</updated><title type='text'>RawCap + Wireshark 截取 loopback 封包</title><content type='html'>&lt;p&gt;在 Windows 上跑 Wireshark，居然沒辦法截取 loopback address 127.0.0.1 的網路封包，&lt;a href=&quot;http://www.hsc.fr/ressources/articles/win_net_srv/missing_loopback.html&quot;&gt;據說&lt;/a&gt;是 Windows 的 TCP/IP stack 沒實作 loopback interface 的關係。真相究竟為何，實在沒辦法沒能力也沒空繼續看下去。幸好，剛發現有支叫 &lt;a href=&quot;http://www.netresec.com/?page=RawCap&quot;&gt;RawCap&lt;/a&gt; 的工具可以抓 Windows 上 localhost 的網路封包，所以還是有解的，只要以 RawCap 抓到封包後，再用 Wireshark 來呈現與分析封包就行了。&lt;/p&gt;  &lt;p&gt;RawCap 可以在底下的網址取得:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href=&quot;http://www.netresec.com/?page=RawCap&quot;&gt;http://www.netresec.com/?page=RawCap&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;我們必須用 Administrator 的身分執行 RawCap，以 &lt;code&gt;rawcap --help &lt;/code&gt;指令看使用說明，rawcap 同時會列出所有可用的 interfaces:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn3meY_GXSPOKOpxKMZn5wkItF0H9LOJa2YGaknKCZLvmfwuy9QpkiraWBBfHIbpkmePieKGcwpOyF7Aqc3IoYevOtI9xmtwlYHioqybJh-2sIxUEC-zz8NHvU0xWqh2etg7w-kGnidNMb/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGBtAZHn9EFkpYENHfQfiAonzR1NXAAIZcbSPriG6reK-gZ7W2_JOPyzxg2NJdKOAddhSSp5Eq9M7XIj_BzPGobapjdUkErFzvVuopV4C3722lufQTwEQERV-GaTDg-GfuesJWPc4OawUe/?imgmax=800&quot; width=&quot;677&quot; height=&quot;602&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;要抓 loopback 的網路封包，只要輸入以下指令:&lt;/p&gt; &lt;code&gt;   &lt;p&gt;&amp;#160; rawcap 127.0.01 dumpfile.pcap&lt;/p&gt; &lt;/code&gt;  &lt;p&gt;截取到網路封包後，再用 Wireshark 開啟資料檔 dumpfile.pcap 就可以分析囉:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpg5HO1_XUtMVRGQdzUhrDlPa0rXFxNbNlEfkGAFhEtdo2IipWPYxz76ViFthEjmrseyUY7nt1J-uNi1eIJz4jynDGmxAe9dQkmFkSDgoZ6mdbi-8I3lO-74yCAOSL8JKKdRDWg3RzS4uf/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6uT2lvJ5m_qZQ8DlKjwIyh8Cw_LqRgDagrbwexXOFQNOWZwUS4CaMTLuIGJvkvioSdPSHcKl4Tcu8X08VeccRF2OygzmKkQ0CyS9dJJ0yqe8_BHOtrMqBZjFPbyX9461juVBM1Dke2BfQ/?imgmax=800&quot; width=&quot;731&quot; height=&quot;604&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/7791995757416614653/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/7791995757416614653?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/7791995757416614653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/7791995757416614653'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/06/rawcap-wireshark-loopback.html' title='RawCap + Wireshark 截取 loopback 封包'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGBtAZHn9EFkpYENHfQfiAonzR1NXAAIZcbSPriG6reK-gZ7W2_JOPyzxg2NJdKOAddhSSp5Eq9M7XIj_BzPGobapjdUkErFzvVuopV4C3722lufQTwEQERV-GaTDg-GfuesJWPc4OawUe/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-5082457019716535759</id><published>2013-05-28T20:42:00.001+08:00</published><updated>2013-09-10T17:05:20.996+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Raspberry Pi"/><title type='text'>Putty 自動登入 Raspberry Pi</title><content type='html'>&lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwb1U_GWSKVwJQc9BgcOLxLiTrdcdisAVctnmKXS9wi3iFubo0Au9eW4Y6LrR8NDkd4eD5ZAtkz90uhvfRZcvOohl1vOxr5FgRtW4uu6V7UqR1crGRZwEmA7I_TM40gkw7E2h9dfiRW1Bp/s1600-h/image%25255B29%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJMHOlytGjHaBbMCLMLkn7bVYDhgChxfElXmKgMBB_MvO17UMIEBTWYug1HwCNMu7kiSvmkqBeCXfTXOOpNP4tyX8QhG8XnY1MLEnF-dOvRmSSrYPUMMvadOEOoH1wK-hDe1hkltEvliXF/?imgmax=800&quot; width=&quot;675&quot; height=&quot;136&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;每次登入 Raspberry Pi 都要輸入密碼，實在有點麻煩，來做個設定讓 Putty 自動登入 Raspberry Pi 吧。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 1. 產生 SSH Keys&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;下載 &lt;a href=&quot;http://the.earth.li/~sgtatham/putty/latest/x86/puttygen.exe&quot;&gt;puttygen&lt;/a&gt; 然後執行程式。啟動後，點一下 Generate 鈕產生 SSH Keys:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2rZUNqTNKvbwYxjS9Lk17mhdQKL4MywloL0mFbscjorq1_6vady1Exvce8rKvidazsdkLnkazx2TYqAlcnBKObrK0Xye-bIRnY8O1mtEAXn5XYt1u6zNmrJY-euQXrcnLrMRP8EN5x_1D/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmEGup6PjP7Mre6eoT386s8xZS-TRRZkw2TFj7XgIl08LOo2u5JmquF2fduBdz8Vsvu01Hzo1iidL4EH3xkdANvwwlWAZPYZUqmYvbfEFhpkJ30w4qjiIPCpw47rXPy3-RU-sJe8VdoSg0/?imgmax=800&quot; width=&quot;493&quot; height=&quot;477&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;按下 Generate 鈕後，要在視窗空白區域動一動滑鼠，好讓 puttygen 根據滑鼠的軌跡隨機產生亂數值:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEH_vhSZOSzWT_p9QMA0WMMPtziKOo3-dFpAdMdNfYtXI7uYJk59xqqh1FZhKZbTbJf19C_0aCrV_4TgoQfeUu01x3CWLVVmP1ElKekjnH48l5bzJ48gyz9_hT0vZaNkvT5-cfd0-kKjJ5/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibqiNu3A42HfaXfub-d_z2ceNVoNb1aFcp8JD2ttvEx-93i8SPG87PahKcXDJ0b6NORKHg_2bjW-oIlOZcxje2H1MVAXPHveqWgovBH0DzCUqQuDJYsNZUI_H_2_uvTrDI6fXlctnU9Pjh/?imgmax=800&quot; width=&quot;493&quot; height=&quot;477&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;SSH Keys 建立完成囉。接著點一下 Save Private Key 把 Private Key 存起來，檔案要放哪裏隨你高興:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUb3cSPQKCq9EQ2uqjO7WFDXPw0AdEkuYH8EwJpBHRPvQbm5f4hmRjQkMIeQ2KenRUsxoHH4MCdoKouhWVITDMWFHKqJSu0s_JDRdyrgkCMVKlxWcHmRhyKd-hUOk3mV3iHhEwfBPcEQQP/s1600-h/image%25255B8%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-ayYLphuPqpwckCZ5nhlU6qO3mESkXj34Hl64x4QujK3LV_HeglV0BrZsRFRQX04RXQexPynGLQ1Hbn8vGuqBWg7QkTFf4NlgJ51cmNOrhTOgFAsHmneC1nMUdTQHV8qli4rcB-i7SpxU/?imgmax=800&quot; width=&quot;493&quot; height=&quot;477&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;過程中會出現底下這個警告訊息，不理它，按下 Y 就對了:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1cz4oxtNrchpk_X442nfVmMFmMx0wLvALC39N-sOo3AUzQJvwGBjIcn2wWsQNEsKYUlrj_Ck-iPNKxlg093-PMZvG7TFI8t8C3Xulf5UDavlh6l8ZNaF3ujiBo69PgfqNuvOHbCKLb6dI/s1600-h/image%25255B11%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-PZVZUfiS5m4HeKqCJ1j8V-q6kng1cUfeeFWmSgRzB281rjdFEHAPg2Q22qF0xRe5RLpQ53rgy_90YtR0EEHi7WSmruNJzaT0jf2hcEyWkyQ31nNqnR0BnjZ7sR4RvtrM8udGuofe03Hb/?imgmax=800&quot; width=&quot;329&quot; height=&quot;178&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 2. 複製 Public key 到 Raspberry Pi&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;下一步要把 Public key 放到 Raspberry Pi，先用 Putty 登入 Raspberry Pi，然後輸入底下指令編輯 .ssh/authorized_keys 這個檔案:&lt;/p&gt; &lt;code&gt;   &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; $ mkdir .ssh      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $ vi .ssh/authorized_keys&lt;/p&gt; &lt;/code&gt;  &lt;p&gt;接著把 Puttygen 產生的 Publich Key 複製並貼到 vi 的編輯視窗，存檔後即可登出 Raspberry Pi:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxddUMxUiX_7XUBPe7QGxw5JyT-M6oXX71AEYgdQbsshEZR90Imb4tMjUj6jbKdVpwvs52UTOoYzhgTJNOmVCMboTTw-GuvUOkMmYqNVdDEkO-KmkHheWmnBO12iAW-zvSQMM891GlTDMs/s1600-h/image%25255B14%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMp8py1TdAOcV_30sxlQBF2ZMpBD5w3ltIapep70TYvWtBOcbHPoGCTZ24Xmca8QxeZ2HXUe1Pejrr87zOd0__qwf5B_9ge0PVG-ikDSigbA3ZUHw0MQD7GX_153d4YEPWRHCJSS0FLLwe/?imgmax=800&quot; width=&quot;725&quot; height=&quot;642&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Step 3. 設定 Putty&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;最後一步是設定 Putty。&lt;/p&gt;  &lt;p&gt;打開 Putty，輸入 Raspberry Pi 的 IP address，確定所用的 Connection type 是 SSH:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXf-tNsnTZN47bwHFL6VZCUhFWDYN8Vx_TPLiICmCJwU6AVbHuQBcA3q_9GLIeNaf2qoYhrpEZ9PS0XTyA7FO7bJcZ5mVTTA1V8_PJUiNHjLEggE-inkHI71jMx-_NYmzLT6BhhCAl3QBM/s1600-h/image%25255B17%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQyfQrB9UtzX21Cb0Gu4AA1IFlp_rizqMJ7qYzWqtrxSGMqDOsiRKvdsMHPVOzHRAiY4TOKeewPxn6GJe7S7Jqr5FBbhbZjba6sDFOlDV1yfhklfx8bwzq4A2VeTjt9wiMeZq52DL4si61/?imgmax=800&quot; width=&quot;466&quot; height=&quot;448&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;切到 Connection &amp;gt; SSH &amp;gt; Auth 頁面，在 Private Key for authentication 這個欄位輸入剛剛在第一步所儲存的 Private Key 檔路徑:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYvZDlL0pQ-I8ubj0bjCYXuhsaNXR-O9EUN2MfhrtQ6oQezfi9CofyainR5ZAu_pgQfjQIn4FEuXcu7AP7wMFjfxxn1L4liRkuYU0aTjY9Y8uTEgFjYsWefxe3tV3kWnvFRuO_f1Z6DRwm/s1600-h/image%25255B20%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoRK_C6So6RPIejt8Hgsvl6AKt4ts_X78ElMKptCuCN6b-NRHJQn4_kmuI8EjAv8fwioW0xN1prhxw6egupepgHDNSrRPHu6QpRTsllg5ZWFcGUbVl27CHoCesXrjdjGVXdwakC3yK_nqn/?imgmax=800&quot; width=&quot;466&quot; height=&quot;448&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;跟著切到 Connection &amp;gt; Data 頁面，在 Auto-login username 欄位上輸入 pi:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNsSZPQTPq8WFuSVNtXPfziES8F6oeSfSHElnvQuqPBUvPqKYNjNSN1qm8MU3O-S3gQsyRhQhwapGZx4mK0YjOEkNpiPthwmCZ9jP0qaSnBU73OztSwmIy3aL9fPDYWbnLUfz3b9mKY2u0/s1600-h/image%25255B23%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiHu9-8QvuYUCherzxAcJrxronI4qvM5eaBxiPhZQxt7K0UfV_hwO7Dr_v1JDHXKpYg3fWFO9MJCbaUgwHa-liuWlaKwHCwrWgtPaSXHSn3cBHf7rpgKtAiBtBj2vT9b2018wm98KT0JbL/?imgmax=800&quot; width=&quot;466&quot; height=&quot;448&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;回到 Session 主畫面，把這個 Session 存起來:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA80PQmHN3Wxam5ilmcssbBGZ4VEZ9OanQK6uZHiev-_pyc1YY_hCqyg-bvcumWCwaTrxWn3TJnBZEwpCWFcSxMwAHe8wPe592d-4rPPdwXt5jUXskQxLP_uu9LXi2cZ3ns15wuMf9S0Vu/s1600-h/image%25255B32%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjK2tiA5jHXy9XRWN0-XvVeIjwWXEMZqDSXj12NthM_oroJyI3qSKwCNL4VDKd_dfTNd9e5U3DMcWSKG5bPNTajFr5MtJz44DRgJ9avaNZp9Z3xHfO8grmnG3t91HpLFAnLyb3Ywcgn75aA/?imgmax=800&quot; width=&quot;466&quot; height=&quot;448&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;最後，按下 Open…&lt;/p&gt;  &lt;p&gt;耶！成功囉！&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ8zN1jFrxbZe8GVEczYjW4asbkCeOYGN8v-6fuOqcsNc4zR0-0RC49aAFWd7akeSKTOEiE16tEVNPnKLHXWTf4aXxdz9RD0sOT-_AQR6d7ocpOadD5fQompvzDh0dLt6vewrFjr7q2lDP/s1600-h/image%25255B36%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAjIW8RJpE-ArmLpR4mDrCu_v76NwX2irDImyQtqGdkFWA_y1KOGnaJE5P143yVzp0j-q_kWuH8vcxFpuF9uH2JHWafrV1VFK3W3J5gLDLVnWrkO2CJaCNh7qaZR8Ba3LjmR6RwTAhUx0u/?imgmax=800&quot; width=&quot;675&quot; height=&quot;312&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;以後 Putty 就會自動登入 Raspberry Pi 了。&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/5082457019716535759/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/5082457019716535759?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/5082457019716535759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/5082457019716535759'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/05/putty-raspberry-pi.html' title='Putty 自動登入 Raspberry Pi'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJMHOlytGjHaBbMCLMLkn7bVYDhgChxfElXmKgMBB_MvO17UMIEBTWYug1HwCNMu7kiSvmkqBeCXfTXOOpNP4tyX8QhG8XnY1MLEnF-dOvRmSSrYPUMMvadOEOoH1wK-hDe1hkltEvliXF/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-8973563180036787756</id><published>2013-05-19T17:31:00.001+08:00</published><updated>2013-05-19T17:32:20.171+08:00</updated><title type='text'>Maker Faier Taipei 2013 – Workshop</title><content type='html'>&lt;p&gt;Maker Faier Taipei 2013 第二天的參觀，突然想到應該拍幾張照片留念。今年人潮真多，我實在不習慣在人群裏穿梭穿梭去，因此一直待在工作坊區附近，所以便就近拍了幾張 Workshop 的照片。&lt;/p&gt;  &lt;p&gt;下午第一場工作坊，Ben6 介紹雲端智慧車與粉絲人氣顯示器:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib2IDzBeZD005PBkpRaSRa8eCUkmOSe8l4e90dr_axbrZ8_YJd_Vy1w8oZ8tsoV_8yQyxoojYfF0bZ_ADoXuFflbkzFyL1C5BSuU4Bi43tMGWqbD8bP2FPjyGFbHrU_vfPCvyQcBecZnwk/s1600-h/2013-05-19%25252013.10.06%25255B4%25255D.jpg&quot;&gt;&lt;img title=&quot;2013-05-19 13.10.06&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;2013-05-19 13.10.06&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjdeuxeZJ3139QIIYj40HBc_T9-RHLoCpXYMy-8rkZbAauy45dAtV3kpsW-a2LQdjL_NZVCSmx-1ayWcrkVHIx2mNks_l4_uklFjjHd1yALSdZOKDW-fU2nkmNju7PHLAkiTr4CobC1_0F/?imgmax=800&quot; width=&quot;640&quot; height=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht2hqjRcUtt0cItYWWOrU5JRX7y_V5top-Ujvx2jJXbDsauFcAnFvnTR470FFIkOzqRNVFBa3sPHNoA4Fw33ROnkvhPwtFyEgiWRo02jxePjO_1MFSoNCYOC2BpeSRRNPNRPh7jHSvVRl1/s1600-h/2013-05-19%25252013.13.32%25255B4%25255D.jpg&quot;&gt;&lt;img title=&quot;2013-05-19 13.13.32&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;2013-05-19 13.13.32&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgT9HxL4dw4dkdgdz19HqKpgQPLQxbXt8_HFNIBgmu6kZTuYcaIZIyqFbT8Swun4e5_nLswL6kArRJlJGCvpkgz5hazfRBbvtQNSKaFd7KSyOIduYpsHQbvi3E4M42edGhLtv0HMYFxDIdK/?imgmax=800&quot; width=&quot;640&quot; height=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;現場的學生和助教:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvuHoycikeglfPIAb9LQ8WTK1VnV6WVMu_EUL5m-kyKs_48DrYH0e8ha98qs06qHpLYsATIYw0z1nLXZRsp4cps7x1myFOMHyjNVfXUHuY-bp3B8Nij63r0BoWP6Mdo3nZ3buDDgmswazm/s1600-h/2013-05-19%25252013.37.03%25255B4%25255D.jpg&quot;&gt;&lt;img title=&quot;2013-05-19 13.37.03&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;2013-05-19 13.37.03&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI2e9RKYuyAfNfTWaA6xjpg_o2NE9dPsPWVqAgXChc_9FY6Kq9_i4DpGNXIdAHRd_cQp8q-9l_QXXNu2171I-Y4mImePP_yNIPbDyB8VJEUp65A-0xX9E9sC8t9-K_eyugAUSryE5XKYBR/?imgmax=800&quot; width=&quot;640&quot; height=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHXxUyqnq8UjEfhWsR0Ac2Fpf7nj-sYq_1qkcQ4mEnNjdVCxwEUc54w3t1d3mCMXiowaf9q3z8WMxBQymoslbaEKkHvOfMwcup_grQYHeyUSpsEs1ZiVXUfdqv9Sgxujt8itdqZG8CVdby/s1600-h/2013-05-19%25252013.36.40%25255B4%25255D.jpg&quot;&gt;&lt;img title=&quot;2013-05-19 13.36.40&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;2013-05-19 13.36.40&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhINHQReMMol_ugpE-zaYB7DTpf0eNjGLuMR2kAFQ8PGjcOf-BldjwqnynCjL2MQvUJQ8GKiC-RMYVRZodH9VGO3ZdbpsE9NGdkeJc6fSKvlx_kF4yVeLXJUdkPOOXxYFA3oDF04tL9IHut/?imgmax=800&quot; width=&quot;360&quot; height=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;第二場是今村謙之先生介紹「大人的科學之電子積木」:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSof01A7nkQpmLYz7LOQFVgCaU6Wsvg6rKkTMZias8wK_t9I9lYYJD1rNLA46wzcNFKk3TwnhDGwwALLmNG5KHaLyqqcYbheYu22zQzpoD0YBKdjxqx1RRw6Fy618iFN090YrCUqb-g4Dt/s1600-h/2013-05-19%25252014.47.27%25255B4%25255D.jpg&quot;&gt;&lt;img title=&quot;2013-05-19 14.47.27&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;2013-05-19 14.47.27&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXvU5YKGchg1YEN1dyreiUENNC1jJ_UBpJP5wC-sbUOVbiQ0UxXYKtsznTdBpfx2UQJlV2gxZ3w8WQE3CfgPMiJ8dl1_EUU-vHOOg8mcqIqyV8detlF4po0laRz0MJvSDXqZ_zmlijFUvr/?imgmax=800&quot; width=&quot;640&quot; height=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;這是電子積木:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiR2_swEsynu79JmrieET4-mRtrtiYsf9DfoFg-vh44KFsE86W3d_5F8_EUZGwMayd6bxgICfKLRkk8H_SxBea5-QA8Sm9aPvcf7A4JxtpzF2g-PzjWXXeokttJuDeA1wUdzlTVFSDcOp6/s1600-h/2013-05-19%25252014.46.05%25255B8%25255D.jpg&quot;&gt;&lt;img title=&quot;2013-05-19 14.46.05&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;2013-05-19 14.46.05&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8RSgHyqLA5BIEjIn11AEL_YFEClUibVVkuAQRLFBP0XmgWHLRHRZmp8RSM3brL-yEs8sppl6h0gE6Xwpf9wayB-g2fdfFH7OlcoXYqS9vm_rBBqkjkKKLhTOKx8OWsBLSMS24AbOa6E6C/?imgmax=800&quot; width=&quot;640&quot; height=&quot;480&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvRIEYgvlN7bojkOFMaOd2YPIwjLqenNTA-oxUiFMstGxQJwAAvDw3x2m01iw7XPgABXsJEW8F2qKu0c03Km9pKBXavFxEUDcCsYXxVtBItOG68nKOLG6zsojUsKCsXh_8NRHgMpgtae7t/s1600-h/2013-05-19%25252014.57.43%25255B4%25255D.jpg&quot;&gt;&lt;img title=&quot;2013-05-19 14.57.43&quot; style=&quot;border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px&quot; border=&quot;0&quot; alt=&quot;2013-05-19 14.57.43&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidwt64LgiEEJ9jMIcXjLHP7Lhn_MjaIA3aZ0S4nYNPE8DhMfoTYUna6ch2tcSjEi38HGagGq1UA2Gfrevm3_XZG_9A7W_3OsQViBK5WYNT5iRHQWbMEfAsjVYGbNTUdLI2CPOaZasmF-15/?imgmax=800&quot; width=&quot;640&quot; height=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/8973563180036787756/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/8973563180036787756?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/8973563180036787756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/8973563180036787756'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/05/maker-faier-taipei-2013-workshop.html' title='Maker Faier Taipei 2013 – Workshop'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjdeuxeZJ3139QIIYj40HBc_T9-RHLoCpXYMy-8rkZbAauy45dAtV3kpsW-a2LQdjL_NZVCSmx-1ayWcrkVHIx2mNks_l4_uklFjjHd1yALSdZOKDW-fU2nkmNju7PHLAkiTr4CobC1_0F/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-7828793244571100140</id><published>2013-04-29T01:19:00.001+08:00</published><updated>2013-05-27T22:07:56.732+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arduino"/><title type='text'>node-webduino</title><content type='html'>&lt;p&gt;I have just released node-webduino - A web FrontEnd for Arduino. Node-webduino will let you do real-time I/O monitoring and controlling in your browser. See README.md on the repo for more information:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href=&quot;https://github.com/coopermaa/node-webduino&quot;&gt;https://github.com/coopermaa/node-webduino&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Here is a screenshot of node-webduino. &lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAZS8mymnxiEHIdTfWO29Fjb8_w8ZURfJe94HGkXfeoltzmHUU0v2_8QOG9gInVnK63jCMUxz1WlsYmbJkZwnF__yjIHfPBkxZTsXFrUllVdgP5UAPrq8oyPunqhwxlToUW6NOPvVcBkvQ/s1600-h/687474703a2f2f6269742e6c792f58487461336d%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;687474703a2f2f6269742e6c792f58487461336d&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;687474703a2f2f6269742e6c792f58487461336d&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrI4HH-c3rJ7-DBx_zhUOuoyhdLFfHi5JsM3mpi7Y3PiS0QGj2Z-ErpOULoGt92K8oYT5IRkN3qZMlh7-mkUTRwsa3Hm2V0bZVFXH_Kq5_y9PbdZOsOvBTYJOjiAtyetb9HWu6rOKc_iW9/?imgmax=800&quot; width=&quot;678&quot; height=&quot;783&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;2013/04/30: Here is a demo video:&lt;/p&gt;  &lt;div id=&quot;scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:5c4f7ed7-cfcb-4121-a983-a2784fce9d66&quot; class=&quot;wlWriterEditableSmartContent&quot; style=&quot;float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px&quot;&gt;&lt;div id=&quot;1e32f270-d791-4be7-a600-37ca4fadb488&quot; style=&quot;margin: 0px; padding: 0px; display: inline;&quot;&gt;&lt;div&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=W_gz78ovBE4&quot; target=&quot;_new&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgNGg5iyuskOyp_hQRiouw8xSPlC3nebl9x7b3H4E0uIujQFfagxUrhsgJT3yHxI461SyTkBdAmfDZz8tFcwEHswrNpoBTjNOkOtfOwSpg74O71n_oRWk4aKSz3JHZLtc4OFE44kB0F4zc/?imgmax=800&quot; style=&quot;border-style: none&quot; galleryimg=&quot;no&quot; onload=&quot;var downlevelDiv = document.getElementById(&#39;1e32f270-d791-4be7-a600-37ca4fadb488&#39;); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;602\&amp;quot; height=\&amp;quot;338\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/W_gz78ovBE4?hl=en&amp;amp;hd=1\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/W_gz78ovBE4?hl=en&amp;amp;hd=1\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;602\&amp;quot; height=\&amp;quot;338\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/7828793244571100140/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/7828793244571100140?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/7828793244571100140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/7828793244571100140'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/04/webduino.html' title='node-webduino'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrI4HH-c3rJ7-DBx_zhUOuoyhdLFfHi5JsM3mpi7Y3PiS0QGj2Z-ErpOULoGt92K8oYT5IRkN3qZMlh7-mkUTRwsa3Hm2V0bZVFXH_Kq5_y9PbdZOsOvBTYJOjiAtyetb9HWu6rOKc_iW9/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-452516996303093942</id><published>2013-04-27T16:30:00.001+08:00</published><updated>2013-04-27T21:15:03.637+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arduino"/><title type='text'>ABC – Arduino Basic Connections</title><content type='html'>&lt;p&gt;&lt;a href=&quot;https://plus.google.com/u/0/108783946679541011308/posts&quot;&gt;Alberto Piganti&lt;/a&gt;，就是那位畫了很多超棒的 &lt;a href=&quot;http://coopermaa2nd.blogspot.tw/2013/04/arduino-pinout-diagrams.html&quot;&gt;Arduino pinout diagrams&lt;/a&gt; 的義大利人，最近他又畫了好多精美的電路圖，這次的創作叫作 &lt;a href=&quot;http://www.pighixxx.com/abc-arduino-basic-connections/&quot;&gt;Arduino Basic Connections&lt;/a&gt;，有關 Arduino 如何連接各種電子零件，所有你想知道的，全都在這本畫冊中。&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.pighixxx.com/abc-arduino-basic-connections/&quot;&gt;Arduino Basic Connections&lt;/a&gt; 畫冊以集合為單位，每個集合有三張卡片。這本畫冊還在持續進行中，我三月份看到的時候，當時只看到 15 張，現在已經畫到第 14 集合了。&lt;/p&gt;  &lt;p&gt;據我所知，為了方便查閱，大部份硬體工程師都會準備一本記載著基本而常用的電路的筆記本。&lt;a href=&quot;https://plus.google.com/u/0/108783946679541011308/posts&quot;&gt;Alberto Piganti&lt;/a&gt; 真的很佛心，常用的電子零件怎麼接，在這本畫冊中幾乎都找的到，而且電路圖畫得真的很漂亮。底下這張是 Card 3 中的繼電器電路:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLsYSu3M_03XG5jbhmpa6aHkTPfucV2A8jzyiVD3AwsbfKGpRmCh_2NdXbsra4kIDzu3DN6trCKkBhNwB8aYRynW52ERgasGIXW0FpVD3lVp-SDtvoWrzE9jCbn1kLsJFduC8TltMnMQyt/s1600-h/image%25255B4%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAVomTrZGz2dlL7Clt6KZNOkQv_lUy5V6YJDAkbwZaJS9IAadgli255Nz_N6bULcuRZ4Wgt41AH91yY5RurWlUtjM0vlUZvYk0WcYqcROaF4bRRBHwm-eNVwbW6SUFbY2_eaFeeNFQwoQj/?imgmax=800&quot; width=&quot;730&quot; height=&quot;537&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;如下，在寫&lt;a href=&quot;http://coopermaa2nd.blogspot.tw/2011/03/blog-post_26.html&quot;&gt;繼電器簡介&lt;/a&gt;這篇時，我自己也畫了張控制繼電器的電路圖，圖是用 Visio 畫的。我不是學硬體出身的，也不是學設計的，當時可以畫出這樣一張圖，覺得很佩服自己，現在想想，跟 &lt;a href=&quot;https://plus.google.com/u/0/108783946679541011308/posts&quot;&gt;Alberto Piganti&lt;/a&gt; 畫的圖比起來，實在是不能比，我只能告訴自己：「工程師真的需要培養一些美感啊！」&lt;/p&gt;  &lt;p&gt;&lt;img alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBzeuBATF9hZ7trji1E8ykffaMp1Jhm9PM0SbVN9Zag0J0OGvCOb5yKtqF5K1jjxa_9Rn9zxpoiqsZbdRVjQovD8aR8FWksc640tJEu4aHwrNejXmAs9cwFm0Ja1Si2hx1gbIpYCtq-Y0P/?imgmax=800&quot; /&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.pighixxx.com/abc-arduino-basic-connections/&quot;&gt;Arduino Basic Connections&lt;/a&gt; 這本畫冊有 PDF 檔可以下載，或者也可以到 &lt;a href=&quot;http://www.flickr.com/photos/28521811@N04/8671264345/in/photostream/&quot;&gt;Flickr&lt;/a&gt; 取得 PNG 圖檔。&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/452516996303093942/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/452516996303093942?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/452516996303093942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/452516996303093942'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/04/abc-arduino-basic-connections.html' title='ABC – Arduino Basic Connections'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAVomTrZGz2dlL7Clt6KZNOkQv_lUy5V6YJDAkbwZaJS9IAadgli255Nz_N6bULcuRZ4Wgt41AH91yY5RurWlUtjM0vlUZvYk0WcYqcROaF4bRRBHwm-eNVwbW6SUFbY2_eaFeeNFQwoQj/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-3590012672224849334</id><published>2013-04-25T23:46:00.001+08:00</published><updated>2013-04-26T01:51:26.793+08:00</updated><title type='text'>在 PC 上玩 Flipboard</title><content type='html'>&lt;p&gt;我的手機應該有感覺，自從前陣子裝了 Flipboard 後，我變了，以前不常打招呼，如果有打開來用的話，通常也只是對它指指點點，很不溫柔，現在只要一到休閒時刻就來找它玩，常常在它身上滑來滑去的。確實，我的閱讀習慣似乎正在改變，我現在都用 Flipboard 來看新聞、部落格和網站，Flipboard 讓我有一種「在翻閱雜誌」的感覺。Flipboard 也可以連結 Facebook, Twitter, Google+, Google Reader 等社群網路，所有資訊都可以匯流到 Flipboard 裏，所以現在我不需要打開那麼多 App，既不必學習各個 App 的操作方式，又可以節省手機的電力，而且還可以把社群網站當成雜誌來翻閱，感覺很特別。&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzBpDB3TvLHeH1hQjxkZxn7L4G597wdpgPAVQ2jDqzRQuT0PBg2ugO0_hinV571Lb6k7ktdq_6EIH5Ik8TAUUa1BsHJgiRj5M-F6l_uyanUA7CvPMf1_e-gTK-Sa9zi1JjT0yVxLo07vKx/s1600-h/2013-04-25%25252022.55.13%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;2013-04-25 22.55.13&quot; style=&quot;display: inline&quot; alt=&quot;2013-04-25 22.55.13&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigmWgXSOK4ym5LLWputtnIV90OEokaHrw83QRd0jXEuBRLn-2DfQH5EmTypSWD66iCncdWHk3CPJoAaXBXRu0kgYNtYHm5rbeXQ4W-Tl1Bl-BVfViRXdMkmdaELCHfKLYQbAorXj6IO7Wx/?imgmax=800&quot; width=&quot;300&quot; height=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;我還有一台 Nexus 7 平板電腦，在七吋的平板上翻 Flipboard 雜誌，感覺更棒，我相信用 iPad Mini 或是螢幕尺寸更大的 iPad 玩 Flipboard 應該會更過癮。那麼，能不能在 PC 上跑 Flipboard 呢?&lt;/p&gt;  &lt;p&gt;行，只要裝個 &lt;a href=&quot;http://www.bluestacks.com/&quot;&gt;Bluestacks&lt;/a&gt; 就可以在 PC 上跑 Flipboard 等各種 Android Apps。Bluestacks 支援 Windows 和 Mac 作業系統。我在 Windows 上裝了 Bluestacks，以我的 Google 帳號登入，然後安裝了 Flipboard，結果:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwh3kYE0N9GdCqbD6L3zAzGgpDxh3e7YESr6rJsGDIi2clHGvXT_GbNzkjMhTlMhXCX5uwBXWB-aYB0x_ERRdeKR9nJquUJO04ZI5_jmz4gaiJq0DKwsvcLcOMQ5UYST1zClJHixvqGnv6/s1600-h/image%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2jK5QoEHZlaomkmK9EHC1PhYfxkXHgl2-Y31NMFnuwEexZ6nhhxMoGx-bNMX0rhgPcbjnqeFolnACuPZQOugHqKjzHnRkB1l4XQ_4PTnT_fO9ebYG6B-gTeWKMmyiHgQeF73eaPp6WiYY/?imgmax=800&quot; width=&quot;730&quot; height=&quot;446&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;哇嗚！成功了，現在我在 PC 上也可以玩 Flipboard 了！&lt;/p&gt;  &lt;p&gt;所有 Flipboard 的功能都可以正常使用，而且用自己的帳號登入後 Flipboard 會自動跟你手機上的設定同步，PC 和手機上訂閱的雜誌兩邊都看得到。&lt;/p&gt;  &lt;p&gt;對了，你還可以建立一個 Flipboard 的捷徑。方法是切到 C:\Users\Public\Libraries\Apps.library-ms 資料夾:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGIZgLnDyNVTc-oQVWWw5AulfYhIeDpNxRDRbNL4-2y5NLJXYZ5KPsf7xL5PLfuurChO80Lq9oJhg8hzkMaW8iihs4PnSZQE8F4xdk-yOUd5vTTLZBVEGKQx_7aG8CzSm2XE8zpDCSkHiT/s1600-h/image%25255B7%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyJcW0KVUpwUypQThgzqcZyMM07SJ852cpS5qpQ364rc4DI2_BdJDAwDmxPshRIUnomQslfefNpupLbGSDEP3NX3eB-ie8SUJgFQL6vhrYvAJrp9hHILYTSw1-2dnbDJzb2xAYmJ4m7SK5/?imgmax=800&quot; width=&quot;730&quot; height=&quot;462&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;然後你會看到 Fliboard 的圖示，只要建個捷徑把它放到桌面上就好了：&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDKlghXBv2ifJwC43xAnBSZ_m2dcFsVjOpbE8g0q1IOe35VIIlY0jRfTQBIaADvMFelrHIAFUEnUJfuQ_PHrb1YVOposZH50asW_adllRdvbwaKzGNRHEX6XvWIDC4lQejrFA3IcCtXfEr/s1600-h/image%25255B10%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbkg2Nb7-BqTaPwUZCTgz-MO5bscJ9ZBMf2HaoZoMcdI8G50c9zoH-xBwbetAffXf3kDis2fsxN8TcItU57WpPO0s2pUwsKhcIzXYrzg-WZnXKe38dDd3skxbjgJATqW85ZUEGvreCMuu5/?imgmax=800&quot; width=&quot;275&quot; height=&quot;212&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;參考資料&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href=&quot;http://briian.com/?p=8135&quot;&gt;重灌狂人 – BlueStacks 免買手機、平板電腦，直接在電腦玩 Android 遊戲、App&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/3590012672224849334/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/3590012672224849334?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/3590012672224849334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/3590012672224849334'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/04/pc-flipboard.html' title='在 PC 上玩 Flipboard'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigmWgXSOK4ym5LLWputtnIV90OEokaHrw83QRd0jXEuBRLn-2DfQH5EmTypSWD66iCncdWHk3CPJoAaXBXRu0kgYNtYHm5rbeXQ4W-Tl1Bl-BVfViRXdMkmdaELCHfKLYQbAorXj6IO7Wx/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-4620761156615876245</id><published>2013-04-15T21:32:00.000+08:00</published><updated>2013-04-15T21:34:52.414+08:00</updated><title type='text'>GPIO_UGLY for Cubieboard</title><content type='html'>&lt;p&gt;在&lt;a href=&quot;http://coopermaa2nd.blogspot.tw/2013/04/cubieboard.html&quot;&gt;快速認識 Cubieboard&lt;/a&gt; 後，我們知道 Cubieboard 背面有 96 支擴充針腳，我們可以利用這些 GPIO 針腳連接各種電子零件，譬如 LED、開關、馬達、光敏電阻、溫度感測器等等，藉以擴充 Cubieboard 的功能，製作各種電子專題。可惜的是，目前 Cubieboard 的 Linux 作業系統，其提供的 Kernel 大部份都還沒支援 GPIO 控制（官方比較新版的 Kernel 似乎已經有 GPIO 的 kernel module，不過我還沒試），所以如果你想使用 GPIO 針腳，也許可以試試 GPIO_UGLY 這個 Kernel module。&lt;/p&gt;  &lt;h5&gt;安裝&lt;/h5&gt;  &lt;p&gt;首先，請下載這兩個檔案：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href=&quot;http://bit.ly/XKMqCy&quot;&gt;kernel_a10_aufs.img&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://bit.ly/116tKdy&quot;&gt;script.bin&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;kernel_a10_aufs.img 是給 Cubieboard 用的 Linux Kernel，我已經把 GPIO_UGLY 這個 Kernel module 編譯進去，適用於&lt;a href=&quot;http://coopermaa2nd.blogspot.tw/2013/04/berryboot-cubieboard.html&quot;&gt;使用 berryboot 刷機&lt;/a&gt;的系統。Kernel 的版本是 3.4.24，我用 &lt;a href=&quot;http://sourceforge.net/projects/berryboot/files/?source=navbar&quot;&gt;berryboot-cubieboard-beta6&lt;/a&gt; 測試過，可以正常運作。&lt;/p&gt;  &lt;p&gt;下載後，把 SD Card 插到電腦 USB Port，然後把兩個檔案複製到 SD Card 覆蓋掉 berryboot 原來的版本，如果你擔心這個動作失敗從此開不了機，那麼可以把原始檔改個名字備份起來。完成後，把 SD Card 插回 Cubieboard，然後上電，開機。&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8vVnUvl76fb0ldc0mbG41_LLqqdjLls_gg3uYKz299HOU6R8nFKq4otUwNAMOZi9iV-Zv_2M-jAd60H8_usmqUiCop44bYyh0FEOrhILozG7eAGPTP6ZPcZFdNQlekImfwPOVuiyuJylD/s1600-h/image%25255B23%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN_TtyPy5H1czEBX7_NTfmDj5NyD6JeOAC5FY-_H9WrdpHUi6A9f3ormMAUavgc4RWg5B5J7BfxpBzvXmkCxSoyZuqiJXtezDSu_2lrW4nFF-nlqlI6s3foGMbDnI3kmxYNzNtv5oz4gO1/?imgmax=800&quot; width=&quot;774&quot; height=&quot;445&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;使用說明&lt;/h5&gt;  &lt;p&gt;更新好 Kernel 後，就可以開始使用 GPIO 針腳了。&lt;/p&gt;  &lt;p&gt;首先，先看看可以用的 GPIO 針腳有哪些:&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; $ ls /sys/devices/virtual/misc/sun4i-gpio/pin&lt;/p&gt;  &lt;p&gt;看到的結果應該會是:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPfy6hmqAm_HEiS52kgIzMwWsArCzd4b9O-1t6CUERajJ4dykuq3U-ySBfk-kwV_lVyG7KRRAARm13fFOJfCMulXPG7IlyiHFAhhMxL3SdFhDf1Eo93UC3H5FOjoXn_j9oXJk16Fwcy3wZ/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQyxOlju1erSyXSFKeYFIGjJp4TI7wlOow2o33RAq_U9tkQfnrWulMQlTynZg9DK4K3kWkwXcjKa4HKyexawQB_ble2ZIODYbJOdaObng3JBWg_yuxxpHA6jNZfCYhvJMUyaAqcmfRkhJu/?imgmax=800&quot; width=&quot;643&quot; height=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;算一算，總共有 67 支針腳可用。雖說有 96 支針腳，但其實有很多針腳是 PWR, GND 等電源針腳，還有一些針腳不能用，可能有特殊用途吧。&lt;/p&gt;  &lt;p&gt;接著，我們選一支針腳來玩，但是要怎麼知道針腳的對應關係呢？方法是查 &lt;a href=&quot;http://linux-sunxi.org/Cubieboard#Expansion_ports&quot;&gt;Cubieboard Expansion ports&lt;/a&gt;，總共有兩張對應表，一張是靠近 SATA 介面的兩排針腳的對應表，另一張是介於 Ethernet port 與 USB port 之間的兩排針腳的對應表。&lt;/p&gt;  &lt;p&gt;以 SATA 介面的兩排針腳的對應表為例：&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggXQAoXNdfQn-2hFPEnqopaZnq1VR_m7RItT054tjDcMqnKvUh3P2Hl2_0kWrlhqW-q8yyHwSEe6JmBfRlhpF0B4SdQtnM1R_9yKhkUwBYRRxgU-yCzZKMUR3kJ3R_Udct3kvR6CwgzDdb/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_UuZZ7I4huChVUPG3onvId5GLFmNQ7LpSUiXUAqWULMKdIJvED8ya4nn0lLvD24lgnO0nxCty7WJKZ0BRJNlNz-xMqm4Cj_AygihZzWd8l06qfxv4kkvlODo9YwjXWWx0CelSC6YmviVB/?imgmax=800&quot; width=&quot;464&quot; height=&quot;738&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;查表後，可知 Pin 1 是 PD0，而 Pin 2 是 GND：&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2xV6sxTN5KIH7XgCC48BjhoLZ_2dH349oALeQguhTeq4cvs3hST-UrLwY0ye9FbXgshyVHong1X0WRecnpWQZ-GDGFCEIfBgaGtqSQ7-81EsXaKs4vne9lrXTN2NW-k0wpZjM-u3Hyjsa/s1600-h/image9%25255B1%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd4VBe0VnmI8pSnLmsjgFJXvQMD73Y0H4b0bOLcsfx0d-IevDOn4f095Wbo8A_4LZ5KYJKmyGrdTvbWUX_JeH78MwT1dwfmKsAewErDqz7ThtiWG8SkUNevx0WWQArLObB6VChZzsIf93V/?imgmax=800&quot; width=&quot;730&quot; height=&quot;423&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;好，PD0，就是你了，出列吧，誰叫你要排最前面啊。^o^&lt;/p&gt;  &lt;p&gt;現在，在 PD0 上接一顆 LED，LED 接法是長腳接 PD0，短腳接 GND。&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhyphenhyphenX7N71nRhgBb08ezoKupx3IVvTx5xKUbV1SR9iBnXdIq9i_Ox3ZMfAonIUHU9oxKgAvbttMEtdg5cUV_B4HyzgtvURccHkO2bggiXFYVaGSUSMABHID3gRaZ1JnyzgVQcxvsMEOsK1jE/s1600-h/image25%25255B1%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz76v5WVDiavxzkPJvXX9InSmoH71RPWdFRLtmjBlWVCiYTT2QJ5b6dtNDYh1yuo3ItW1Nd8MM3d4WlLWamm_uKNOUmQ7gH1tjoMFX0Bli1EZlP0JHkTJY2z3hh411yThMdCVn7R1vagxv/?imgmax=800&quot; width=&quot;730&quot; height=&quot;544&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-1pgbHgKVLCfOQi4Oi43KUxxC1GUmPIF1vgizZiaitmn6bP22k-ac04zVXWFl76DDOuJuOiXTqxvgU-eI9AVumpBY4SWjbMieeX7201GYvSuLPHGeVw5yRRzut1TD2ZMNNN7T_ppcUftB/s1600-h/image%25255B31%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj34vU_PrUFHLdcVeAzJu8AszBkTMHLJgqdB5DQFLzV936X45y5rK2jMbiEdCFcWEtvZA_xOzcwAAbbPdRCI7g5VY729f7IiX9E5Y9WFUWfnWGJk8YXeZ2WeW5pCDUruKgyFtadf4cYk8sp/?imgmax=800&quot; width=&quot;500&quot; height=&quot;676&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;然後以底下的指令控制 LED 的明滅：&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; $ echo 1 &amp;gt; /sys/devices/virtual/misc/sun4i-gpio/pin/pd0      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $ echo 0 &amp;gt; /sys/devices/virtual/misc/sun4i-gpio/pin/pd0 &lt;/code&gt;&lt;/p&gt;  &lt;p&gt;耶！完成囉！&lt;/p&gt;  &lt;p&gt;也可以寫個簡單的 Shell Script 控制 LED 的明滅，例如底下的 blink.sh：&lt;/p&gt;  &lt;p&gt;&lt;script type=&quot;syntaxhighlighter&quot; class=&quot;brush: bash&quot;&gt;&lt;![CDATA[&lt;br /&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;# IMPORTANT! To run this script, you have to be root&lt;br /&gt;#&lt;br /&gt;#  sudo ./blink.sh&lt;br /&gt;&lt;br /&gt;LED=/sys/devices/virtual/misc/sun4i-gpio/pin/pd0 &lt;br /&gt;&lt;br /&gt;ON=1&lt;br /&gt;OFF=0&lt;br /&gt;&lt;br /&gt;# We will play the blue one here&lt;br /&gt;while true; do&lt;br /&gt;  echo $ON &gt; $LED&lt;br /&gt;  sleep 1&lt;br /&gt;  echo $OFF &gt; $LED&lt;br /&gt;  sleep 1&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;/p&gt;  &lt;p&gt;以 sudo ./blink.sh 執行後，接在 PD0 的 LED 燈就會亮一下，滅一下，不斷地循環。&lt;/p&gt;  &lt;h5&gt;參考資料&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href=&quot;http://coopermaa2nd.blogspot.tw/2013/04/cubieboard.html&quot;&gt;快速認識 Cubieboard&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://coopermaa2nd.blogspot.tw/2013/04/berryboot-cubieboard.html&quot;&gt;用 Berryboot 刷 Cubieboard&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://my.oschina.net/lanybass/blog/107688&quot;&gt;在 Cubieboard 上通過 GPIO 成功點亮第一個 LED&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://cn.cubieboard.org/forum.php?mod=viewthread&amp;amp;tid=138&quot;&gt;如何編譯單個驅動文件&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/4620761156615876245/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/4620761156615876245?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/4620761156615876245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/4620761156615876245'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/04/gpiougly-for-cubieboard.html' title='GPIO_UGLY for Cubieboard'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN_TtyPy5H1czEBX7_NTfmDj5NyD6JeOAC5FY-_H9WrdpHUi6A9f3ormMAUavgc4RWg5B5J7BfxpBzvXmkCxSoyZuqiJXtezDSu_2lrW4nFF-nlqlI6s3foGMbDnI3kmxYNzNtv5oz4gO1/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-348690247264122441</id><published>2013-04-14T15:21:00.001+08:00</published><updated>2013-04-14T16:47:37.517+08:00</updated><title type='text'>備份 SD Card</title><content type='html'>&lt;p&gt;終於，Raspberry Pi 作業系統跑起來了，要玩的應用程式也都安裝好並且設定完成了，接下來你應該備份 SD Card 以防萬一，免得將來又得重灌所有的東西。所以，咱們來備份 Raspberry Pi 的 SD card 吧。&lt;/p&gt;  &lt;p&gt;在 Windows 上，你可以用 &lt;a href=&quot;https://launchpad.net/win32-image-writer/+download&quot;&gt;Win32diskimager&lt;/a&gt;。步驟很簡單，只要輸入 image 的檔名，選擇 SD Card 的 Device，接著點選 Read 鈕就行了:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4oMbFFBGYE90avA14KZHwe6VejN3LOSaaHTg3Qq7FT7rrjIeASoSz5y8cNa3ABn6l-drgA2oFBJgRje12-2libfukOLlO_nG8KB42N2DagEekX5fMV8lepr7JdvL4VfwhYNvq2hl_xc7B/s1600-h/image%25255B2%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyxZVeLXKTUVXhokDAZAc2Uvx_3f148zDB76r_nxnkfAndtzXsxNEPtjatKIQ3buzmwQ_Lt2qb6n-ZpMZ20-zZ1eHbos7hPHjNVZfnNxAeBtkyrnMm-QJArD2CrIKyCrl848h8vDKtIVpb/?imgmax=800&quot; width=&quot;421&quot; height=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;然後，稍候一下，過幾分鐘後 SD Card 就備份完成了。&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkYeqUAAEA2TSCx9CKZimWNkWIuvEoTu95s1yt2ddZA5ozr279kTj1piZnQA8ZR6-fykGjK5InwE0M0_btaerQzpdn1fe1rOU2ZgLwSPvriXZ8iYERjE9l4a11L_rqvdhIoFDhHsGs7Ljo/s1600-h/image%25255B5%25255D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgofea2U9jxuw1jgdpGsMkNCDV4R6-JfOotb_tjvIVJVrvgCnanWVw9z48yYOuuWBElrEMi8O1FLqzv4fDQck9HsI_ikzfjmiwo0ayXy4ZIXnBbugRDc2oIesOSviJqNBUpSj4hglowgr1e/?imgmax=800&quot; width=&quot;421&quot; height=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;看你用的 SD Card 有多大，image 檔就有多大，比如 SD Card 是 8GB，那 image 檔就是 8GB。image 製作完成後，你可以把檔案壓縮一下，這樣比較省空間。&lt;/p&gt;  &lt;p&gt;在 Linux 上，請以底下的指令備份 SD Card:&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; $ dd if=/dev/sdX of=/path/to/image&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;或者是備份的時候順便壓縮：&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; $ dd if=/dev/sdx | gzip &amp;gt; /path/to/image.gz&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;其中 /dev/sdX 是你的 SD Card 設備。&lt;/p&gt;  &lt;p&gt;要把 image 還原到 SD Card，就反過來做:&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&amp;#160;&amp;#160;&amp;#160; $ dd if=/path/to/image of=/dev/sdx&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;&lt;code&gt;如果檔案有經過壓縮，請以底下的指令還原：&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;&lt;code&gt;&amp;#160;&amp;#160; $ &lt;/code&gt;&lt;code&gt;gzip -dc /path/to/image.gz | dd of=/dev/sdx&lt;/code&gt;&lt;/p&gt;  &lt;h5&gt;參考資料&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href=&quot;http://linux.vbird.org/linux_basic/0240tarcompress.php#dd&quot;&gt;鳥哥的私房菜 – dd 備份工具&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/348690247264122441/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/348690247264122441?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/348690247264122441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/348690247264122441'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/04/sd-card.html' title='備份 SD Card'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyxZVeLXKTUVXhokDAZAc2Uvx_3f148zDB76r_nxnkfAndtzXsxNEPtjatKIQ3buzmwQ_Lt2qb6n-ZpMZ20-zZ1eHbos7hPHjNVZfnNxAeBtkyrnMm-QJArD2CrIKyCrl848h8vDKtIVpb/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8516057646005806683.post-408610568679249961</id><published>2013-04-12T09:56:00.001+08:00</published><updated>2013-04-12T09:56:11.978+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arduino"/><title type='text'>超棒的 Arduino pinout diagrams</title><content type='html'>&lt;p&gt;有個叫 Pighixxxx 的義大利人，最近製作了好多 Arduino 的 pinout diagrams 貼在 &lt;a href=&quot;http://arduino.cc/forum/index.php/topic,146315.0.html&quot;&gt;Arduino forum&lt;/a&gt; 上，有 Arduino UNO 的，有很多張 ATMega 的，例如 ATMega328 與 ATMega1284p 等，也有幾張是 ATTiny 的。例如底下這張是 UNO 的 pinout diagram:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnyWoB1VI3cXYTTK1WUAgMqlf2BD7OLSVaUEHIO4lKGRN4NRjOqsLOvA2ghJ9DMXlVxx0LDSSuOe7Nag-vPoilYkl6_dzhDqiSvDfnFPiwMCw8FhT4-8QvW68y_fWDCyOaOu7-D-1AuE_j/s1600-h/ARDUINO_V2%25255B4%25255D.png&quot;&gt;&lt;img title=&quot;ARDUINO_V2&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;ARDUINO_V2&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkUe7DJxFEJwxPn4j0z_9dU6PfegwSvie86m8GUKYVELEj9UE2-A5jtTR2NPr4N0CqyeyEefGnYk9NgoFkbWkuEgZCOMg4pCecr4bodYynmW9_CLxfn_4WX7mPGkPjDUgkE53XAGxDvVAk/?imgmax=800&quot; width=&quot;720&quot; height=&quot;509&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;這些圖畫的真棒，好清楚，對如何使用 Arduino 的針腳幫助很大。&lt;/p&gt;  &lt;p&gt;之前我寫過「&lt;a href=&quot;http://coopermaa2nd.blogspot.tw/2011/07/from-arduino-to-avr.html&quot;&gt;From Arduino to AVR 單晶片教學&lt;/a&gt;」一系列的教學文章，搭配這些精美的圖來學習，真是再好不過了。&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCQ2y_CGaBwP0uIHUkSs40mk7B40yjRUVkCrwkGECu2x2PetqZlD5HUYpI47iT-UQNZOoALnMplwhaYiKKQilM41ndjNc5Kv1s7F0KckkRJXAgdOhpxy80UR1B_W3LcNuvR51N6INr7ulC/s1600-h/arduino_atmega328_Web%25255B3%25255D.png&quot;&gt;&lt;img title=&quot;arduino_atmega328_Web&quot; style=&quot;border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px&quot; border=&quot;0&quot; alt=&quot;arduino_atmega328_Web&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0Qt_pNWN_iST9PBw-iabYDY83pGERss2fKl7y2jy1UMnPNmEXyMeySlGve4YQj8aOj0l5lBVHXsSEoAEmQBMIMq2b1oOot_STF5REsc1s6TUA0THEOEwHh_D8aySNXLAjE4rLCuQATsI1/?imgmax=800&quot; width=&quot;720&quot; height=&quot;509&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;pighixxx 畫的這些圖，除了可以在 &lt;a href=&quot;http://arduino.cc/forum/index.php/topic,146315.0.html&quot;&gt;Arduino forum&lt;/a&gt; 上看到外，也可以到他&lt;a href=&quot;http://www.pighixxx.com/&quot;&gt;個人網站&lt;/a&gt;下載，圖檔有 PNG 格式，也有 PDF 格式。&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://coopermaa2nd.blogspot.com/feeds/408610568679249961/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8516057646005806683/408610568679249961?isPopup=true' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/408610568679249961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8516057646005806683/posts/default/408610568679249961'/><link rel='alternate' type='text/html' href='http://coopermaa2nd.blogspot.com/2013/04/arduino-pinout-diagrams.html' title='超棒的 Arduino pinout diagrams'/><author><name>Cooper Maa</name><uri>http://www.blogger.com/profile/14597993167511073460</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkUe7DJxFEJwxPn4j0z_9dU6PfegwSvie86m8GUKYVELEj9UE2-A5jtTR2NPr4N0CqyeyEefGnYk9NgoFkbWkuEgZCOMg4pCecr4bodYynmW9_CLxfn_4WX7mPGkPjDUgkE53XAGxDvVAk/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry></feed>