tag:blogger.com,1999:blog-20605565531199484212024-02-07T13:55:49.972-08:00樂高 Lego 與 Arduino 機器人紀錄自己玩樂高機器人與Arduino的過程,歡迎有興趣的網友一起討論Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.comBlogger68125tag:blogger.com,1999:blog-2060556553119948421.post-12583490763009702902017-05-27T21:08:00.001-07:002017-05-28T17:34:09.605-07:00Arduino 與 樂高變速箱樂高的材料結構性多樣化,其中齒輪比大小都有因此組成一個6段變速箱試試看<br />
<br />
1.Arduino UNO *1<br />
2. SHIELD V5.0 擴展板 *1<br />
3.伺服馬達MG996R *2<br />
4.LDC 1602 I2C *1<br />
5.電池 9V *1<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7gVP81CzwsEi8-Lku5LOnax6-JUByjNqJrMlNdHYPHMatd7meYyKJiUNaBcoZ5YvLduXwrrMstwP78zvaRlJ0Og8K9NUgbV1ZgyQPXEi9pY4H_s8wSZiYHBAtXXMpCnOh1RdSmxWhYnUH/s1600/DSC02309_2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="898" data-original-width="1600" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7gVP81CzwsEi8-Lku5LOnax6-JUByjNqJrMlNdHYPHMatd7meYyKJiUNaBcoZ5YvLduXwrrMstwP78zvaRlJ0Og8K9NUgbV1ZgyQPXEi9pY4H_s8wSZiYHBAtXXMpCnOh1RdSmxWhYnUH/s640/DSC02309_2.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2OX-MNu36iOk-Dm7CtuKlZMxKl9-AvWpdE12ZYabKYec-4O3jQNV1oiwFYnV_2Ac31SKMlotyp2fLrZGls4PLO3tEudsB2dJYF20mSTgmy82VczzZxX7I85eRthMcNzSY-lpRFWKsfikt/s1600/DSC02333_2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="898" data-original-width="1600" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2OX-MNu36iOk-Dm7CtuKlZMxKl9-AvWpdE12ZYabKYec-4O3jQNV1oiwFYnV_2Ac31SKMlotyp2fLrZGls4PLO3tEudsB2dJYF20mSTgmy82VczzZxX7I85eRthMcNzSY-lpRFWKsfikt/s640/DSC02333_2.jpg" width="640" /></a></div>
<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/tg-CgujTJ44" width="560"></iframe><br />
<br />
<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/8cLR8d8mos4" width="560"></iframe><br />
<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/mAT90kTpp9Y" width="560"></iframe><br />
<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/XV-Pa72Mu7I" width="560"></iframe><br />
<br />
<br />
<br />Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-39001594827873033412017-05-24T20:48:00.001-07:002017-05-26T06:40:56.701-07:00讓Arduino 感應器收集資料並儲存在資料庫材料:<br />
1. Arduino UNO板子 *1<br />
2.SHIELD V5.0 擴展板 *1<br />
3.小型伺服馬達SG90 *2<br />
4.HC-SR04 超音波感測器 *1<br />
5.1602 LCD I2C 點陣液晶模組 *1<br />
6.LED 燈球 *1<br />
7.電源用9V 電池 *1<br />
<br />
開發環境<span style="background-color: white; color: #333333; font-family: "microsoft jhenghei" , "helvetica" , "arial" , sans-serif; font-size: 16px;">Arduino IDE 1.8.2,沒使用</span><span style="background-color: white; color: #333333; font-family: "microsoft jhenghei" , "helvetica" , "arial" , sans-serif; font-size: 16px;"> </span><span style="background-color: white; color: #333333; font-family: "microsoft jhenghei" , "helvetica" , "arial" , sans-serif; font-size: 16px;">Scratch</span><span style="background-color: white; color: #333333; font-family: "microsoft jhenghei" , "helvetica" , "arial" , sans-serif; font-size: 16px;"> 積木程式是因為arduino的程式沒有多複雜,小學5年級以上的學生經說明都能理解,用程式碼的好處比起積木指令要更簡潔彈性更大,尤其當程式複雜時更能體會用程式碼的好處。</span><br />
<span style="background-color: white; color: #333333; font-family: "microsoft jhenghei" , "helvetica" , "arial" , sans-serif; font-size: 16px;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaegrfD9rYLVZ4zR9EqNQCZllWSiaMn8lLdg1pyHni_y-WaCqG1PqTv2tMgUbOKLLuEAVUs0xYUIkkkZ_Ev43PKxLMO21C7xtHj37YmTUOj8M4QjN11cnWrBA9EzGu62NHzIA-Fr-5vBaV/s1600/arduino182.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="591" data-original-width="1267" height="298" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaegrfD9rYLVZ4zR9EqNQCZllWSiaMn8lLdg1pyHni_y-WaCqG1PqTv2tMgUbOKLLuEAVUs0xYUIkkkZ_Ev43PKxLMO21C7xtHj37YmTUOj8M4QjN11cnWrBA9EzGu62NHzIA-Fr-5vBaV/s640/arduino182.jpg" width="640" /></a></div>
<span style="background-color: white; color: #333333; font-family: "microsoft jhenghei" , "helvetica" , "arial" , sans-serif; font-size: 16px;"><br /></span>
<span style="background-color: white; color: #333333; font-family: "microsoft jhenghei" , "helvetica" , "arial" , sans-serif; font-size: 16px;"><br /></span>
<span style="background-color: white; color: #333333; font-family: "microsoft jhenghei" , "helvetica" , "arial" , sans-serif; font-size: 16px;">Arduino uno+ </span><span style="color: #333333; font-family: "microsoft jhenghei" , "helvetica" , "arial" , sans-serif;">Sensor Shield V5.0 </span>擴展板<span style="color: #333333; font-family: "microsoft jhenghei" , "helvetica" , "arial" , sans-serif;">合體後的外觀</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm6m5DWaupm1tLrFm4UPnRuEV6gjzUQX1_ECG_8P9w4ujSyfNe4Cd3Sx86jXV_8nRckboR09jngdPzboYGK7OpCruNRHxBGsaln88eccPmgHOtdHrSuvfrp8_IzXRDVEdkIq3Uo78J4y_B/s1600/arduinoshieldv5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="416" data-original-width="592" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm6m5DWaupm1tLrFm4UPnRuEV6gjzUQX1_ECG_8P9w4ujSyfNe4Cd3Sx86jXV_8nRckboR09jngdPzboYGK7OpCruNRHxBGsaln88eccPmgHOtdHrSuvfrp8_IzXRDVEdkIq3Uo78J4y_B/s320/arduinoshieldv5.jpg" width="320" /></a></div>
<span style="color: #333333; font-family: "microsoft jhenghei" , "helvetica" , "arial" , sans-serif;">用</span>擴展板的好處就是把常用的GPIO腳位、電源、接地都拉出來不需要用麵包版來接線擴充<br />
<br />
<br />
<span style="background-color: white; color: #333333; font-family: "microsoft jhenghei" , "helvetica" , "arial" , sans-serif; font-size: 16px;">程序一:</span><span style="background-color: white; color: #333333; font-family: "microsoft jhenghei" , "helvetica" , "arial" , sans-serif; font-size: 16px;">把上述零件單一測試</span><br />
<span style="background-color: white; color: #333333; font-family: "microsoft jhenghei" , "helvetica" , "arial" , sans-serif; font-size: 16px;"><br /></span>
伺服馬達<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaPOwi53ccYbjKUWjG_n1W5sPTBVxuEf-rVpm9q11iULHIwptyyTDfc-1dktii_itwGNgta1kb_JXr0mLUYNPhBclX4KMcHW6-o4dSk5NQBGAwGMZRFYdR9zB5Eno0Z7YsNiuCEbn3sl4O/s1600/servocode.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="916" data-original-width="960" height="610" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaPOwi53ccYbjKUWjG_n1W5sPTBVxuEf-rVpm9q11iULHIwptyyTDfc-1dktii_itwGNgta1kb_JXr0mLUYNPhBclX4KMcHW6-o4dSk5NQBGAwGMZRFYdR9zB5Eno0Z7YsNiuCEbn3sl4O/s640/servocode.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="color: #333333; font-family: "microsoft jhenghei" , "helvetica" , "arial" , sans-serif; font-size: small; text-align: start;"><span style="background-color: white;">測試</span></span><span style="font-size: small; text-align: start;">小型伺服馬達SG90:是否能在0~180來回運作</span></td></tr>
</tbody></table>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<br />
1602 LCD I2C 點陣液晶模組<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwGHoqa_6z6jmWzCVg3qxGlh9_Gv4T4Hj-ZO0kxkTo2rSRhC8oRLWKbUh2zDps6CM_M-mMJ0rI8DDM2ksgTksJtSndRYrBl8M0nroHrwNePrPcilz1CKBSICWsqN7HfY7JEZtOFdTdd1FN/s1600/lcd1602.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="823" data-original-width="887" height="593" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwGHoqa_6z6jmWzCVg3qxGlh9_Gv4T4Hj-ZO0kxkTo2rSRhC8oRLWKbUh2zDps6CM_M-mMJ0rI8DDM2ksgTksJtSndRYrBl8M0nroHrwNePrPcilz1CKBSICWsqN7HfY7JEZtOFdTdd1FN/s640/lcd1602.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">測試1602 LCD 點陣液晶模組是否能正常顯示文字</td></tr>
</tbody></table>
<br />
<br />
<br />
HC-SR04 超音波感測器<br />
延續剛剛LCD螢幕的程式碼,這次要把超音波測到的距離顯示在LCD上<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBaCBMEDBg-rN5722loCd0Sng6wIQWDhtWvJwcI2UA8YUss5DXzW4BoNca7txmaqjZyFMafVgoQiEYYrqmP8J_s5II2SpslUZuJrr9jkYJCkbaRrMuurFeVfSOWG3NN7_3RHA3CxW711Dd/s1600/ultrasonic.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1032" data-original-width="1023" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBaCBMEDBg-rN5722loCd0Sng6wIQWDhtWvJwcI2UA8YUss5DXzW4BoNca7txmaqjZyFMafVgoQiEYYrqmP8J_s5II2SpslUZuJrr9jkYJCkbaRrMuurFeVfSOWG3NN7_3RHA3CxW711Dd/s640/ultrasonic.jpg" width="634" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">測試HC-SR04 超音波感測器</td></tr>
</tbody></table>
<br />
<br />
當以上伺服馬達、LCD螢幕、超音波感應器測試都Ok後就要整合在一個程式中,我用樂高零件把Arduino UNO機板、擴展版、伺服馬達、LCD 1602螢幕、超音波HC-SR04整合在一起如下圖<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwj2O5PB9zMA_j6pGd0vW3TR2ihCApSwTrTKhEChLoE-5920_tsejrSbYyw6GoZ1VlZt8_2CcVYT0uOdUAVNYJrzOX78cp2jO6G-ypo-JN2MFWAnZG-psuxkshtCli-cASKZkYZn9tY_Wm/s1600/DSC02292.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="897" data-original-width="1600" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwj2O5PB9zMA_j6pGd0vW3TR2ihCApSwTrTKhEChLoE-5920_tsejrSbYyw6GoZ1VlZt8_2CcVYT0uOdUAVNYJrzOX78cp2jO6G-ypo-JN2MFWAnZG-psuxkshtCli-cASKZkYZn9tY_Wm/s640/DSC02292.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">用樂高積木當架構把零件組合起來</td></tr>
</tbody></table>
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5rZacGW9qZiYQwuHbfXuD8k0Vg4EU_Uxuve7G8bghNJCPVH8g36jOHzkIIugBwE13_w_81L-nJw4vBS0NIVUX3Ouqlr6nvjIfZe7rNnX-1_Dw3W9VwWDmwGTZuXwSqyS1DQEB0-QttHwb/s1600/DSC02295.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="897" data-original-width="1600" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5rZacGW9qZiYQwuHbfXuD8k0Vg4EU_Uxuve7G8bghNJCPVH8g36jOHzkIIugBwE13_w_81L-nJw4vBS0NIVUX3Ouqlr6nvjIfZe7rNnX-1_Dw3W9VwWDmwGTZuXwSqyS1DQEB0-QttHwb/s640/DSC02295.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">編譯與上傳程式到Arduino中</td></tr>
</tbody></table>
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeUpoUhqQPcKR9iqX5-lC2e0AghfvhJ52jsUeVqOeUwf307lMTEqLLBXF5oDuIvx1KGb0YUizltw1S7F-vec3WRAu-MIi44iMZneuLb03CJuyRZrUR2glIwjc03BhWNdeg9O22O-NW-EED/s1600/DSC02298.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="897" data-original-width="1600" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeUpoUhqQPcKR9iqX5-lC2e0AghfvhJ52jsUeVqOeUwf307lMTEqLLBXF5oDuIvx1KGb0YUizltw1S7F-vec3WRAu-MIi44iMZneuLb03CJuyRZrUR2glIwjc03BhWNdeg9O22O-NW-EED/s640/DSC02298.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">C 語言+ Arduino + MacBook Pro</td></tr>
</tbody></table>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/rO9Tly2EB-8" width="560"></iframe></div>
<br />
<br />
<br />
接著在PC要撰寫接收Arduino傳過來的資料並存入資料庫中,我用C#開發PC端程式<br />
<br />
重點說明:<br />
PC與Arduino溝通的方式很多如透過USB Cable、藍芽BT、 WIFI等,這次用USB Cable來接收與傳遞資料跟 Arduino溝通。<br />
<br />
PC與Arduino溝通是透過ComPort,當Arduino機板插到電腦USB接口時作業系統會給予一個ComPort作為雙方溝通之用,可以從控制台>>系統>>裝置管理員中得知訊息<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhChyhUS0IY16s4y-bjxMMHsFSdQTwGMdNNhDDhaJX3xxNjO7FHTr3nq5VS_TrDR_L-mwbSOHwTi-j_45Fj6Dro9ADl9Xa8t_IvCbfnycXwxx0_CyVhICTadjmrFB0YTVGOlG3ZunOJ9GH4/s1600/comport.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="427" data-original-width="701" height="388" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhChyhUS0IY16s4y-bjxMMHsFSdQTwGMdNNhDDhaJX3xxNjO7FHTr3nq5VS_TrDR_L-mwbSOHwTi-j_45Fj6Dro9ADl9Xa8t_IvCbfnycXwxx0_CyVhICTadjmrFB0YTVGOlG3ZunOJ9GH4/s640/comport.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"> PC與Arduino溝通是透過COM21(註:每個人的ComPort不同)</td></tr>
</tbody></table>
<br />
因此PC端程式要傳送與接收Arduino資料時就是透過Com21,PC端的程式開發<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjioewV4KOH0GC5sZmQe1ne9NdrlTX9u3h3zQvdj-8oE4qC0xykJi1X_wa71FZviyVFDiLkpldnGJDiP91669Ha7EqZdr7x0OpZZ12GGK0Cdkacqw2gG7qsnRGSLKdUaOZP9k-Z_9j2uhY0/s1600/arduinopc.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="552" data-original-width="1292" height="273" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjioewV4KOH0GC5sZmQe1ne9NdrlTX9u3h3zQvdj-8oE4qC0xykJi1X_wa71FZviyVFDiLkpldnGJDiP91669Ha7EqZdr7x0OpZZ12GGK0Cdkacqw2gG7qsnRGSLKdUaOZP9k-Z_9j2uhY0/s640/arduinopc.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">PC 端每2秒接收Arduino 超音波傳送的資訊儲存並繪圖</td></tr>
</tbody></table>
<br />
<br />
如果在Arduino接上溫度感應器、煙霧感應器、土壤質感應器、心跳感應器等都能用相同的方式紀錄資訊並於事後分析,更進階的玩法就是向特定裝置如手機App發送訊息等(這時候又要學習開發手機App程式)。<br />
<br />
Arduino的售價低廉入門容易在網路上Google一大堆資料,如果想讓小朋友動手玩玩看並學習程式撰寫是十分適合的科學教材。<br />
<br />
<br />Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-10534771660736816872017-03-04T16:00:00.002-08:002017-03-04T16:00:19.735-08:00YouTube 影片分享機器手臂<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/LRppCkH9Y3k" width="480"></iframe>Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-6341773801407248162017-01-12T16:56:00.004-08:002017-01-12T17:13:36.851-08:00YouTube 六軸機械手臂分享在網路看到這個模型真是讚<br />
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/7zobzqcsjIQ/0.jpg" frameborder="0" height="300" src="https://www.youtube.com/embed/7zobzqcsjIQ?feature=player_embedded" width="480"></iframe><br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/betlNcZ27CM/0.jpg" frameborder="0" height="300" src="https://www.youtube.com/embed/betlNcZ27CM?feature=player_embedded" width="480"></iframe><br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div>
<br /></div>
Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-35406849228492657332015-12-27T23:01:00.004-08:002015-12-27T23:03:01.292-08:00Arduino 循跡智慧車、遙控車與Android智慧手機藍芽控制<br />
<br />
用Arduino DIY做玩具是個很有趣的題目,既能學到組裝結構又能學習程式設計一舉兩得,看到車子沿著黑線前進遇到障礙物就自動停住跟買現成的玩具遙控車有著很不一樣的感受,跟小孩一起玩小孩也很有興趣學習。<br />
<br />
需要的組件如下:<br />
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">1.Arduino Uno 相容版</span><span style="background-color: white; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">。</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: white; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">2.藍芽 HC-06 接收與傳送訊息至Android手機</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: white; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3.LED全彩燈球可以顯示循跡車狀態</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: white; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">4.兩顆1:48 DC馬達與輪組作為驅動力</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: white; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">5.萬向輪</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: white; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">6.L298N馬達驅動板,控制馬達正反轉與速度PWS變化</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: white; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">7.超音波感應器 HC-SR04讓循跡車能感應前方是否有障礙物</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: white; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">8.尋跡模組 TCRT5000 紅外線反射感應器,用來分辨黑白線</span></div>
<span id="docs-internal-guid-0b64f8eb-e75f-d48b-e041-dfc454fbe96b"></span><br />
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<div style="line-height: 1.38;">
<span style="background-color: white; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">9.樂高Technic標準孔支架作為循跡車主結構</span></div>
<div style="line-height: 1.38;">
<span style="background-color: white; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div style="line-height: 1.38;">
<span style="background-color: white; color: black; font-family: Arial; font-size: 14.666666666666666px; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<span style="background-color: white; font-family: Arial; font-size: 14.6667px; line-height: 20.24px; vertical-align: baseline; white-space: pre-wrap;"><iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/xG5ksMji0xk" width="560"></iframe></span></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGDHqrM5S9_DU3gU8tm3fpLNzSFVteZFcBwNDbCmwMDY4lk3d-DGZ2SfB8qtCLqutYU2DFY8SlhqGNiC8dOsLjjWZCDKCB3QtHDxbXZSfPtCf7IfR3ank8nYuPTPhl2g-aiZDDmEKQYvPy/s1600/IMGP0012.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="424" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGDHqrM5S9_DU3gU8tm3fpLNzSFVteZFcBwNDbCmwMDY4lk3d-DGZ2SfB8qtCLqutYU2DFY8SlhqGNiC8dOsLjjWZCDKCB3QtHDxbXZSfPtCf7IfR3ank8nYuPTPhl2g-aiZDDmEKQYvPy/s640/IMGP0012.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7AMBsyKFMSvs63eP2QYRhH9MSqzgw6aakepN5ycbKuAsYRz_oVHH94k9ji1NFKawrkqs9hh6GrR6ez1gEsDqAX1I3DVJKD4G2nX6j4rtq4iDJChr0s7Xcj3bUPPF8ZL8FOjQEmFLF44rR/s1600/IMGP0002.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="628" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7AMBsyKFMSvs63eP2QYRhH9MSqzgw6aakepN5ycbKuAsYRz_oVHH94k9ji1NFKawrkqs9hh6GrR6ez1gEsDqAX1I3DVJKD4G2nX6j4rtq4iDJChr0s7Xcj3bUPPF8ZL8FOjQEmFLF44rR/s640/IMGP0002.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJjeT3-S2UbQWnPD48ggUX5uyHgN82I-nnos7T3pYsalKgGKBiG-FZ8ZVbg_eeeiPy2E7Kh2bPB49POV7WKzuqqO5yst5LPeqHgnHAgIcDK04QIAW-fuZMFz-NKoAlezI53fEeWjzVb7qg/s1600/IMGP0003.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="424" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJjeT3-S2UbQWnPD48ggUX5uyHgN82I-nnos7T3pYsalKgGKBiG-FZ8ZVbg_eeeiPy2E7Kh2bPB49POV7WKzuqqO5yst5LPeqHgnHAgIcDK04QIAW-fuZMFz-NKoAlezI53fEeWjzVb7qg/s640/IMGP0003.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqqkAJKacaqAneHCDhvK42ReobQZAJeAUdFNE6L5gnEqkL14MuntZPWqzY2tPPSt6s629GS3-a9zhGHxvhY2NUth6Ae-j_f3MaA1JZ5Oatdty5qNhW-gJjRK5sW7IY6prkugHqXbA8YaGL/s1600/IMGP0005.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="424" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqqkAJKacaqAneHCDhvK42ReobQZAJeAUdFNE6L5gnEqkL14MuntZPWqzY2tPPSt6s629GS3-a9zhGHxvhY2NUth6Ae-j_f3MaA1JZ5Oatdty5qNhW-gJjRK5sW7IY6prkugHqXbA8YaGL/s640/IMGP0005.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBfqTx3aIlEo9N7Pt3VJqxoQWQ0av3BJeXIyz7CskNoUE3QhqqD-cQXldpdvQxa8YqgfhcDFEsCGK66E91gah0w5AEeMQhmsiEgxEnD7O2uXosg33T3EC7KklIEDeZWZdGm2iV_vROaCa1/s1600/IMGP0006.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBfqTx3aIlEo9N7Pt3VJqxoQWQ0av3BJeXIyz7CskNoUE3QhqqD-cQXldpdvQxa8YqgfhcDFEsCGK66E91gah0w5AEeMQhmsiEgxEnD7O2uXosg33T3EC7KklIEDeZWZdGm2iV_vROaCa1/s640/IMGP0006.jpg" width="478" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMXvIdyBqj9N3LBb08ym7lBeV8rGgnxik7G_tIWKujrWrrAmKEeo7sdd366FSmEJPgDspb7MLAKoyOiW-yMLIsv_rrTvQfiSKOCOhYjTICWRv5zL0UdIOfJy2fImCCSZ_d2jn4NliHV0m2/s1600/IMGP0007.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="444" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMXvIdyBqj9N3LBb08ym7lBeV8rGgnxik7G_tIWKujrWrrAmKEeo7sdd366FSmEJPgDspb7MLAKoyOiW-yMLIsv_rrTvQfiSKOCOhYjTICWRv5zL0UdIOfJy2fImCCSZ_d2jn4NliHV0m2/s640/IMGP0007.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-sdoqY9khJ391FT-vhABDE8tCmVg33hFSWoaaa13as3lbLNJU-x2_jvRWg_3LTSD9q8HgalUf8Dj_64kK-k8Wb_Lynp9HmsCAJpYYI8VN5GUESGsPJasafwSmNWx-T4qRZhRjXVMzsyby/s1600/IMGP0008.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="424" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-sdoqY9khJ391FT-vhABDE8tCmVg33hFSWoaaa13as3lbLNJU-x2_jvRWg_3LTSD9q8HgalUf8Dj_64kK-k8Wb_Lynp9HmsCAJpYYI8VN5GUESGsPJasafwSmNWx-T4qRZhRjXVMzsyby/s640/IMGP0008.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoSCKriAKYFRGlUkFw-HVqqegdTgv62h9L2p3W7_8NTbtLT5rCwOBuiZkvUvosh8-wI1KnK6XUMzi3aC-R1hVLS8N5PjzAo_oT4TZ-O3OIy78CwNhVCNxQtmZEB89DUo1BXe2Gu7bgIMPW/s1600/IMGP0009.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="424" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoSCKriAKYFRGlUkFw-HVqqegdTgv62h9L2p3W7_8NTbtLT5rCwOBuiZkvUvosh8-wI1KnK6XUMzi3aC-R1hVLS8N5PjzAo_oT4TZ-O3OIy78CwNhVCNxQtmZEB89DUo1BXe2Gu7bgIMPW/s640/IMGP0009.jpg" width="640" /></a></div>
<br />Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-19771681133346845662015-12-24T19:50:00.002-08:002015-12-26T17:39:49.468-08:00Arduino 機械手臂準備資料進入Arduino通常都會作些自己有興趣的項目,例如循跡自走車、藍芽遙控車、Wifi無線網路等,這些都做過後下一個目標就是機械手臂Robot Arm,當然先從資料收集準備起。<br />
<br />
<a href="http://www.86duino.com/?page_id=2854&lang=TW">86Duino</a><br />
<br />
<a href="http://www.86duino.com/wp-includes/file/Chapter11-TC.pdf">機械手臂介紹01</a> <a href="http://www.89idea.com/blog/?paged=2&tag=robot">組裝過程介紹</a> <br />
<br />
資料裡面提到Servo的定位要參考各種規格的差異性,在組裝前Servo要先定位不要拿到零件就開始組裝,電源供應要注意穩定性。<br />
<br />
<br />
YouTube上有趣的應用<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/oDQI4Gw84R4" width="560"></iframe>Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-28603432021169236182015-12-18T22:54:00.002-08:002015-12-18T22:56:49.608-08:00實做Arduino + ESP8266 WIFI無線模組與Android手機互動<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtTyW2VgyMs5rqJccJLa2Ssj_sslPlq69dguFzhirH_QfMzVNsNJXoDIdBDJ1C2ZsUb0vanGIYp1q4S2FjAxU43pCdnCkhnHbK7EnVeJ0POH9wyrvNgSFrcp1winmDNPY8qcN_uiBLBbUP/s1600/IMGP0002.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="422" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtTyW2VgyMs5rqJccJLa2Ssj_sslPlq69dguFzhirH_QfMzVNsNJXoDIdBDJ1C2ZsUb0vanGIYp1q4S2FjAxU43pCdnCkhnHbK7EnVeJ0POH9wyrvNgSFrcp1winmDNPY8qcN_uiBLBbUP/s640/IMGP0002.jpg" width="640" /></a></div>
<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguJ7AcRICyGKiWXGf7j5i6Hf3uRi7Hln5MRbBllYhWlUtZC_iOUIDZwC3q7p4c7t543udV1slYvAfP2KdslHOVfJ2JN78xHoWC3nDDO29xitkWWIPClnb8VCft4dOb1YCfK2FPQKIkG_-1/s1600/IMGP0002_2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="334" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguJ7AcRICyGKiWXGf7j5i6Hf3uRi7Hln5MRbBllYhWlUtZC_iOUIDZwC3q7p4c7t543udV1slYvAfP2KdslHOVfJ2JN78xHoWC3nDDO29xitkWWIPClnb8VCft4dOb1YCfK2FPQKIkG_-1/s640/IMGP0002_2.jpg" width="640" /></a></div>
<br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihLnTDqMxRWNMGnPFrYq2mwXKoA_qzcYqxKm_ed07LCEcU9gAkM9I0eWeO7WfUmnI9nqHX9QOhm-fkLsYSl1H-wZoDjTDZmdYvlwgRxb19iifndaMdEcEOGX6jorYJt62YXbllOSU96jcw/s1600/IMGP0004.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="422" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihLnTDqMxRWNMGnPFrYq2mwXKoA_qzcYqxKm_ed07LCEcU9gAkM9I0eWeO7WfUmnI9nqHX9QOhm-fkLsYSl1H-wZoDjTDZmdYvlwgRxb19iifndaMdEcEOGX6jorYJt62YXbllOSU96jcw/s640/IMGP0004.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">接上電源準備起動 ESP8266 無線 WIFI 模組</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfy6YKnH9Qs5zE9WFsblFaRUXGN-yT2XRfd6lKWGyjVtM-AhUaM_ZAD0hgLCY3JetKY45Tqamispc7HzwxWPrEXmntyWD0PzegNzx53mOWPa0iWXoicoD5VtU2WsmQ8n2zERjDiwnofaF3/s1600/IMGP0005.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"><img border="0" height="422" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfy6YKnH9Qs5zE9WFsblFaRUXGN-yT2XRfd6lKWGyjVtM-AhUaM_ZAD0hgLCY3JetKY45Tqamispc7HzwxWPrEXmntyWD0PzegNzx53mOWPa0iWXoicoD5VtU2WsmQ8n2zERjDiwnofaF3/s640/IMGP0005.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">當Arduino ESP8266 接上家中WIFI 路由器時取得DHCP 192.168.1.54,另外ESP 8266 AP模式的固定IP 192.168.4.1</td></tr>
</tbody></table>
<br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOv4PoDHruA2IJpKjYIVar5xeNYlUmhi54fJNwhhXoglC12N6dLjCI2XLX9c3xKy_1aFLz538MM9vxIwCm_pg3YqcP6ZvUq7NoWtRYa_oZE5_mLuMRqnefWQLLnooNci1jfcEFCrg9xMWP/s1600/IMGP0006.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="422" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOv4PoDHruA2IJpKjYIVar5xeNYlUmhi54fJNwhhXoglC12N6dLjCI2XLX9c3xKy_1aFLz538MM9vxIwCm_pg3YqcP6ZvUq7NoWtRYa_oZE5_mLuMRqnefWQLLnooNci1jfcEFCrg9xMWP/s640/IMGP0006.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">螢幕顯示ESP8266 監聽Port 8015,這就是Android手機與ESP8266溝通Port</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmuUav1vu85eGZYXsYbd4TJys_RPb_70BSfZ54PshSOhlNTP0YaI3YrTsUibTc5bw1FCIECHcloOVixqN0pUf1b_8qhvRfCBdeN8kgdLY-ZdNUXOqQ6XoVKxizq155dmgHdn11JZFbNsiI/s1600/IMGP0007.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="422" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmuUav1vu85eGZYXsYbd4TJys_RPb_70BSfZ54PshSOhlNTP0YaI3YrTsUibTc5bw1FCIECHcloOVixqN0pUf1b_8qhvRfCBdeN8kgdLY-ZdNUXOqQ6XoVKxizq155dmgHdn11JZFbNsiI/s640/IMGP0007.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">實際測試:Android手機直接連接ESP8266 AP模式 192.168.4.1 Port8015 並送出red訊息,<br />
當Arduino收到red後把LED切到紅色</td></tr>
</tbody></table>
<br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj2ONylgRxLCMf2UBZ_Z9d1YdChEYReIkfk17MAioxI5e28J0ZCt4hsOFTaWKxOBuIoP2WYbSVofj2I4JVcnH4TIx5dmcudDHDRlZOtIj-7qu6B234cIbsa6gCraQ9qUXw09HxhwL1oL9V/s1600/IMGP0008.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="422" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjj2ONylgRxLCMf2UBZ_Z9d1YdChEYReIkfk17MAioxI5e28J0ZCt4hsOFTaWKxOBuIoP2WYbSVofj2I4JVcnH4TIx5dmcudDHDRlZOtIj-7qu6B234cIbsa6gCraQ9qUXw09HxhwL1oL9V/s640/IMGP0008.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: 12.8px;">實際測試:Android手機直接連接ESP8266 AP模式 192.168.4.1 Port8015 並送出green訊息,</span><br />
<span style="font-size: 12.8px;">當Arduino收到green後把LED切到綠色</span></td></tr>
</tbody></table>
<br />
<br />
實際測試影片<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/-J_mNgCjxOg" width="560"></iframe><br />
<br />
<br />
<br />
<br />
<br />Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com5tag:blogger.com,1999:blog-2060556553119948421.post-49365465017846595922015-12-04T15:45:00.001-08:002015-12-04T19:23:07.043-08:00Android 與Arduino 資料交換方式當你想要從手機發送訊息給Arduino或想從Arduino收到回傳訊息時都必須知道如何使用DataInputStream / DataOutStream<br />
<br />
<a href="http://android-er.blogspot.tw/2014/08/pervent-program-blocked-by.html">Example01</a> <a href="http://android-er.blogspot.tw/2014/02/android-sercerclient-example-client.html">Example02</a><br />
<div>
<br /></div>
<div>
<h3>
android的網路資料交換分為2種:基於socket的,和基於http協定的。</h3>
<div>
自己玩Android 與Arduino不論是透過藍芽 HC-05、HC-06或是無線網路ESP8266 都是用Socket方式來做資料交換。網路上這篇文章說明很清楚值得大家參考</div>
<h3>
<b><span style="color: #cc0000;">基於socket的用法</span></b></h3>
<div>
<br /></div>
<div>
<span style="color: #274e13;"><b>伺服器端:</b></span><b><span style="color: #274e13;">-----------------------------------------------------------------------------------------</span></b></div>
<div>
<br /></div>
<div>
先啟動一個伺服器端的socket ServerSocket svr = new ServerSocket(8989);</div>
<div>
<br /></div>
<div>
開始偵聽請求 </div>
<div>
Socket s = svr.accept();</div>
<div>
<br /></div>
<div>
取得輸入和輸出</div>
<div>
DataInputStream dis = new DataInputStream(s.getInputStream());</div>
<div>
<br /></div>
<div>
DataOutputStream dos = new DataOutputStream(s.getOutputStream());</div>
<div>
<br /></div>
<div>
Socket 的交互通過流來完成,即是說傳送的位元組流,因此任何檔都可以在上面傳送。<br />
<br />
誰打開的記得要關上。</div>
<div>
<br /></div>
<div>
用DataInputStream/DataOutputStream來進行包裝是因為我們想要他們對基底資料型別的讀寫功能readInt(),writeInt(),readUTF(),writeUTF()等等。</div>
<div>
<br /></div>
<div>
<b><span style="color: #274e13;">用戶端:-----------------------------------------------------------------------------------------</span></b></div>
<div>
<br /></div>
<div>
發起一個socket連接 </div>
<div>
Socket s = new Socket("192.168.1.16",8015);</div>
<div>
<br /></div>
<div>
取得輸入和輸出</div>
<div>
DataInputStream dis = new DataInputStream(s.getInputStream());</div>
<div>
DataOutputStream dos = new DataOutputStream(s.getOutputStream());</div>
<div>
<br /></div>
<div>
之後就可以相互通信了。誰打開的記得要關上。<br />
<br />
<br />
InputStream is = new FileInputStream("test");<br />
//暫存BYTE陣列<br />
ByteArrayOutputStream baos = new ByteArrayOutputStream();<br />
//緩衝<br />
byte buffer[] = new byte[512];<br />
//紀錄讀進來長度<br />
int length = 0;<br />
//假如等於-1代表沒有資料了<br />
while( (length = is.read(buffer)) != -1){<br />
//從緩衝區讀取buffer裡面0~length-1的位置<br />
baos.write(buffer, 0, length);<br />
}<br />
//ByteArrayOutputStream轉成位元陣列<br />
byte data [] = baos.toByteArray();<br />
is.close();<br />
baos.close();</div>
<div>
<br />
<br />
<br />
<br />
<br /></div>
<h3>
<b><span style="color: #990000;">基於Http協定</span></b></h3>
<div>
<br /></div>
<div>
一般是發送請求到某個應用伺服器。此時需要用到HttpURLConnection</div>
<div>
<br /></div>
<div>
先取得HttpURLConnection urlConn = new URL("http://www.google.com").openConnection();</div>
<div>
<br /></div>
<div>
設置標誌 </div>
<div>
<br /></div>
<div>
urlConn.setDoOutput(true); urlConn.setDoInput(true);//post的情況下需要設置DoOutput為true</div>
<div>
<br /></div>
<div>
urlConn.setRequestMethod("POST");</div>
<div>
<br /></div>
<div>
urlConn.setUseCache(false);//設置是否用緩存</div>
<div>
<br /></div>
<div>
urlConn.setRequestProperty("Content-type","application/x-www-form-urlencoded");//設置content-type</div>
<div>
<br /></div>
<div>
獲得輸出流,便於想伺服器發送資訊。</div>
<div>
<br /></div>
<div>
DataOutputStream dos = new DataOutputStream(urlConn.getOutputStream());</div>
<div>
<br /></div>
<div>
望流裡面寫請求參數</div>
<div>
<br /></div>
<div>
dos.writeBytes("name="+URLEncoder.encode("chenmouren","gb2312");</div>
<div>
<br /></div>
<div>
dos.flush();dos.close();//發送完後馬上關閉。</div>
<div>
<br /></div>
<div>
獲得輸入流,取資料</div>
<div>
<br /></div>
<div>
BufferReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));</div>
<div>
<br /></div>
<div>
reader.readLine();//用 !=null來判斷是否結束</div>
<div>
<br /></div>
<div>
reader.close();</div>
<div>
<br /></div>
<div>
讀完了記得關閉connection urlConn.disconnect();<br />
<br />
<br />
//-----------------------------------------------<br />
<br />
<pre>import java.io.*;
import java.net.*;
public class client
{
public static void main(String [] argv)throws IOException
{
StartClient(1234);
}
public static void StartClient(int port)
{
try
{
//設定連線的主機位置
InetAddress add = InetAddress.getByName("ecc.johnsonlu.org");
SocketAddress sc_add= new InetSocketAddress(add,port);
Socket sc = new Socket();
int timeout = 2000 ; //timeout 2秒
System.out.println("連線中....");
//與主機連線
sc.connect(sc_add,timeout);
System.out.println(sc.getLocalAddress() + "連線到" + sc.getInetAddress());
//傳送資料到Server端
DataOutputStream out = new DataOutputStream(sc.getOutputStream());
out.writeUTF("我是Client");
out.flush();
//接收Server端資料
DataInputStream in = new DataInputStream(sc.getInputStream());
System.out.println("Server:" + in.readUTF());
}
catch(SocketTimeoutException e)
{
System.out.println("Timeout");
}
catch(IOException e)
{
e.printStackTrace();
}
}
}</pre>
<br />
<br />
<br />
<br />
<br />
<br />
//----------------------------------------------<br />
<span style="background-color: white; color: #444444; font-family: "samsungif" , "arial" , "tahoma" , "simsun" , "simhei" , "microsoft yahei" , "dotum" , "gulim" , sans-serif; font-size: 13px;">Client:</span><br />
<pre class="ml0" style="background-color: #ebf2fa; color: #444444; font-family: 'Courier New'; font-size: 12px; overflow-x: auto; padding: 20px 30px; word-wrap: break-word;"><code style="color: #5c6371; font-family: 'Courier New'; line-height: 21px; margin: 0px; padding: 0px; word-wrap: break-word;">try{
Socket socket = new Socket(mDestinationIP,mDestinationPort);
DataInputStream dataInputStream = new
DataInputStream(socket.getInputStream());
int data;
//read data from server
while ((data=dataInputStream.read()) != -1) {
//do sth
}
} catch (IOException e){
//handle socket IOExceptions
}</code></pre>
<br />
<h5 class="ml0" style="color: #444444; font-family: samsungif, Arial, Tahoma, SimSun, SimHei, 'Microsoft YaHei', Dotum, Gulim, sans-serif; font-size: 15px; line-height: 18px; margin-bottom: 10px; margin-left: 0px !important; margin-right: 0px; margin-top: 15px; padding: 0px;">
Client Buffered data streaming</h5>
<div>
<pre class="ml0" style="background-color: #ebf2fa; color: #444444; font-family: 'Courier New'; font-size: 12px; overflow-x: auto; padding: 20px 30px; word-wrap: break-word;"><code style="color: #5c6371; font-family: 'Courier New'; line-height: 21px; margin: 0px; padding: 0px; word-wrap: break-word;">try{
Socket socket = new Socket(mDestinationIP,mDestinationPort);
BufferedInputStream bufferedInputStream = new
BufferedInputStream((socket.getInputStream());
int data;
//read date from server
while ((data= bufferedInputStream.read()) != -1) {
//do sth
}
} catch (IOException e){
//handle socket IOExceptions
}</code></pre>
</div>
<br />
//---------------------------------------<br />
<br />
<br />
<pre style="border: 1px solid black; color: #333333; font-size: 14px;"><code><span style="color: black;">import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class AndroidClient extends Activity {
EditText textOut;
TextView textIn;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textOut = (EditText)findViewById(R.id.textout);
Button buttonSend = (Button)findViewById(R.id.send);
textIn = (TextView)findViewById(R.id.textin);
buttonSend.setOnClickListener(buttonSendOnClickListener);
}
Button.OnClickListener buttonSendOnClickListener
= new Button.OnClickListener(){
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Socket socket = null;
DataOutputStream dataOutputStream = null;
DataInputStream dataInputStream = null;
try {
socket = new Socket("192.168.1.101", 8888);
dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataInputStream = new DataInputStream(socket.getInputStream());
dataOutputStream.writeUTF(textOut.getText().toString());
textIn.setText(dataInputStream.readUTF());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
if (socket != null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (dataOutputStream != null){
try {
dataOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (dataInputStream != null){
try {
dataInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}};
}</span></code></pre>
<br />
<br />
<br /></div>
</div>
Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-86130442066708669652015-12-01T02:00:00.004-08:002015-12-01T02:00:40.599-08:00Arduino 字串處理<span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;">Serial.begin(9600);</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> String str="Hello World!";</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str.length()); //輸出 12</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str.indexOf(" ")); //輸出 5 (有找到傳回索引)</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str.indexOf(" ", 6)); //輸出 -1 (沒找到傳回 -1)</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str.lastIndexOf("!")); //輸出 11</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str.substring(6)); //輸出 World!</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str.substring(0,7)); //輸出 Hello W</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> str.replace("World","Tony"); </span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str); //輸出 Hello Tony!</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> str.concat(" Good Day!"); </span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str); //輸出 Hello Tony! Good Day!</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> str.remove(16); //從 Day 前面空格開始刪</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str); //輸出 Hello Tony! Good</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> str.remove(11,5); //從 G 前面空格開始刪</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str); //輸出 Hello Tony!</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> str.toLowerCase(); </span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str); //輸出 hello tony!</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> str.toUpperCase(); </span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str); //輸出 HELLO TONY!</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str.charAt(1)); //輸出 E</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> str.setCharAt(5,'+'); //將空格改為 +</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str); //輸出 HELLO+TONY!</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> String str2="Hello+Tony!";</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str.equals(str2)); //輸出 0</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str.equalsIgnoreCase(str2)); //輸出 1</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str.compareTo(str2)); //輸出 -32 (不同, str 在前)</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str.compareTo("HELLO+TONY!")); //輸出 0 (雷同)</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str.startsWith("HELLO")); //輸出 1</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str.endsWith("TONY!")); //輸出 1</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> str=" HELLO ";</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> str.trim();</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str.length()); //輸出 5 (已刪除前後空格)</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> str="180 Days";</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str.toInt()); //輸出 180</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> str="65.245KG";</span><br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;" /><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; line-height: 20.79px;"> Serial.println(str.toFloat()); //輸出 65.25 (四捨五入到小數第二位)</span>Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-52917465787338057452015-11-25T21:46:00.000-08:002015-12-06T19:06:51.876-08:00Android 手機與Arduino 藍芽HC-05 / 06 連結應用讓Android、iPhone手機與Arduino連結交互應用是很有趣的程式設計,因此有些要注意的地方就留下紀錄<br />
<br />
首先是Arduino部分<br />
<br />
<a href="http://blog.xuite.net/chycahock/EDA/225365055-Android%E8%88%87Arduino%E7%9A%84%E8%97%8D%E8%8A%BD%E9%80%9A%E8%A8%8A" target="_blank">網路資源</a> <a href="http://blog.kenyang.net/2012/07/android-bluetooth-api.html" target="_blank">搜尋藍芽裝置</a> <a href="http://blog.kenyang.net/2012/07/android-bluetooth-api.html" target="_blank">網路資源</a> <a href="http://blog.cavedu.com/programming-language/appinventor/appinventorandarduinowithbluetooth3/">Arduino送資料給手機接收</a> <a href="http://blog.cavedu.com/programming-language/appinventor/%E9%9B%99a%E8%A8%88%E7%95%ABpart6%EF%BC%9Aarduino-%E5%82%B3%E5%85%A9%E7%AD%86%E8%B3%87%E6%96%99%E5%88%B0-android-%E6%89%8B%E6%A9%9F/">收機接收資料</a><br />
<br />
<a href="http://kidheart-android.blogspot.tw/2011/10/finding-devices.html">藍芽搜尋</a> <a href="http://swf.com.tw/?p=759">藍芽傳送程式</a> <a href="http://blog.ddt.idv.tw/2015/02/arduino_24.html">透過藍芽上傳程式02</a><br />
<br />
<a href="http://yhhuang1966.blogspot.tw/2015/09/arduino_14.html">Arduino 資料型態</a> <a href="http://andcooker.blogspot.tw/2012/09/android-thread-handler.html">執行序資料傳遞</a> <a href="http://blog.kenyang.net/2011/11/17/java-thread-run-vs-start/">執行序Run與Start差異性</a><br />
<br />
<a href="http://luffyspace.blogspot.tw/2014/10/macarduino-uno.html">透過藍芽燒縙Arduino 程式取代USB</a><br />
<br />
<br />
Part 1<br />
<br />
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;">#include <softwareserial .h=""><o:p></o:p></softwareserial></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;">#include <wire .h=""><o:p></o:p></wire></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span style="font-family: 微軟正黑體; font-size: 12pt;"><span lang="EN-US">#include <liquidcrystal_i hasspace="False" negative="False" numbertype="1" sourcevalue="2" st1:chmetcnv="" tcsc="0" unitname="C" w:st="on">2C</liquidcrystal_i></span></span></div>
.h><br />
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<br /></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<br /></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;">#define MAX_BTCMDLEN 128<o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<br /></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span style="font-family: 微軟正黑體; font-size: 12pt;"><span lang="EN-US" style="color: green;">// </span><span style="color: green;">建立一個軟體模擬的序列埠</span></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span style="font-family: 微軟正黑體; font-size: 12pt;"><span lang="EN-US" style="color: green;">// HC-06 Arduino</span><span lang="EN-US"><o:p></o:p></span></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span style="font-family: 微軟正黑體; font-size: 12pt;"><span lang="EN-US" style="color: green;">// TX RX/Pin10</span><span lang="EN-US"><o:p></o:p></span></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span style="font-family: 微軟正黑體; font-size: 12pt;"><span lang="EN-US" style="color: green;">// RX TX/Pin11</span><span lang="EN-US"><o:p></o:p></span></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;">SoftwareSerial BTSerial(10,11); <span style="color: green;">// Arduino RX/TX</span><o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<br /></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span style="font-family: 微軟正黑體; font-size: 12pt;"><span lang="EN-US" style="color: green;">// Addr, En, Rw, Rs, d4,d5,d6,d7 backlight, polarity</span><span lang="EN-US"><o:p></o:p></span></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span style="font-family: 微軟正黑體; font-size: 12pt;"><span lang="EN-US" style="color: blue;">LiquidCrystal_I<st1:chmetcnv hasspace="False" negative="False" numbertype="1" sourcevalue="2" tcsc="0" unitname="C" w:st="on">2C</st1:chmetcnv> lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);</span><span lang="EN-US"> </span></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<br /></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;">byte cmd[MAX_BTCMDLEN]; <span style="color: green;">// received 128 bytes from an Android system</span><o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;">int len = 0; <span style="color: green;">// received command length</span><o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<br /></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;">void setup() {<o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span style="font-family: 微軟正黑體; font-size: 12pt;"><span lang="EN-US"> Serial.begin(9600); <span style="color: green;">// Arduino</span></span><span style="color: green;">起始鮑率:<span lang="EN-US">9600</span></span><span lang="EN-US"><o:p></o:p></span></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span style="font-family: 微軟正黑體; font-size: 12pt;"><span lang="EN-US"> BTSerial.begin(9600); <span style="color: green;">// HC-06 </span></span><span style="color: green;">出廠的鮑率:每個藍牙晶片的鮑率都不太一樣,請務必確認</span><span lang="EN-US"><o:p></o:p></span></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;"> <o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span style="font-family: 微軟正黑體; font-size: 12pt;"><span lang="EN-US" style="color: green;"> // </span><span style="color: green;">初始化<span lang="EN-US">LCD1602</span></span><span lang="EN-US"><o:p></o:p></span></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span style="font-family: 微軟正黑體; font-size: 12pt;"><span lang="EN-US" style="color: blue;"> lcd.begin(16, 2);</span><span lang="EN-US"><o:p></o:p></span></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span style="font-family: 微軟正黑體; font-size: 12pt;"><span lang="EN-US" style="color: blue;"> lcd.clear();</span><span lang="EN-US"><o:p></o:p></span></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span style="font-family: 微軟正黑體; font-size: 12pt;"><span lang="EN-US" style="color: blue;"> lcd.backlight();</span><span lang="EN-US"><o:p></o:p></span></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;">}<o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<br /></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;">void loop() {<o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;"> char str[MAX_BTCMDLEN];<o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;"> int insize, ii; <o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;"> int tick=0;<o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span style="font-family: 微軟正黑體; font-size: 12pt;"><span lang="EN-US"> while ( tick<max_btcmdlen nbsp="" span="" style="color: green;">// </max_btcmdlen></span></span><span style="color: green;">因為包率同為<span lang="EN-US">9600, Android</span>送過來的字元可能被切成數份</span><span lang="EN-US"><o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span style="font-family: 微軟正黑體; font-size: 12pt;"><span lang="EN-US"> if ( (insize=(BTSerial.available()))>0 ){ <span style="color: green;">// </span></span><span style="color: green;">讀取藍牙訊息</span><span lang="EN-US"><o:p></o:p></span></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;"> for ( ii=0; ii<insize ii="" o:p=""></insize></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;"> cmd[(len++)%MAX_BTCMDLEN]=char(BTSerial.read());<o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;"> else {<o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;"> tick++;<o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span style="font-family: 微軟正黑體; font-size: 12pt;"><span lang="EN-US"> if ( len ) { <span style="color: green;">// </span></span><span style="color: green;">用<span lang="EN-US">LCD1602</span>顯示從<span lang="EN-US">Android</span>手機傳過來的訊息</span><span lang="EN-US"><o:p></o:p></span></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;"> sprintf(str,"%s",cmd);<o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;"> <span style="color: green;">// Serial.println(str);</span><o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span style="font-family: 微軟正黑體; font-size: 12pt;"><span lang="EN-US" style="color: green;"> // </span><span style="color: green;">將對串列埠的輸出改為對<span lang="EN-US">LCD1602</span>輸出</span><span lang="EN-US"><o:p></o:p></span></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;"> <span style="color: blue;">lcd.clear();</span><o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span style="font-family: 微軟正黑體; font-size: 12pt;"><span lang="EN-US" style="color: blue;"> lcd.print(str);</span><span lang="EN-US"><o:p></o:p></span></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;"> cmd[0] = <span style="color: red;">'\0'</span>;<o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;"> }<o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;"> len = 0;<o:p></o:p></span></div>
<div class="MsoNormal" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px;">
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;">}<o:p></o:p></span></div>
<div>
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;"><br /></span></div>
<div>
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;">---------------------------------------------------------------------------------------------</span></div>
<div>
<span lang="EN-US" style="font-family: 微軟正黑體; font-size: 12pt;"><br /></span></div>
<div>
<span style="font-family: 微軟正黑體;">Part 2</span></div>
<div>
<div>
//-------------------------------------------------------------</div>
<div>
// Controlling a servo position using serial port </div>
<div>
// Controlling a 360 continuous rotation servo using bluetooth</div>
<div>
// 2015.02.04</div>
<div>
// by gsyan <http: gsyan888.blogspot.com=""> </http:></div>
<div>
//-------------------------------------------------------------</div>
<div>
#include <servo .h=""> </servo></div>
<div>
<br /></div>
<div>
long serialBaudRate = 115200; //藍牙(序列埠)通訊的速率(鮑率 baud rate)</div>
<div>
<br /></div>
<div>
int rightPin = 9;<span class="Apple-tab-span" style="white-space: pre;"> </span>//右邊 servo 控制腳接在哪一個腳位</div>
<div>
int leftPin = 10;<span class="Apple-tab-span" style="white-space: pre;"> </span>//左邊 servo 控制腳接在哪一個腳位</div>
<div>
<br /></div>
<div>
//底下角度的值必須自行測試, 依 servo 來設定</div>
<div>
int rightStopAngle = 95;<span class="Apple-tab-span" style="white-space: pre;"> </span>//右邊 servo 停止轉動的值</div>
<div>
int leftStopAngle = 106;<span class="Apple-tab-span" style="white-space: pre;"> </span>//左邊 servo 停止轉動的值</div>
<div>
int maxAngle = 75;<span class="Apple-tab-span" style="white-space: pre;"> </span>//正轉、逆轉(加減)最大的值</div>
<div>
<br /></div>
<div>
const int delayMilliseconds = 20;<span class="Apple-tab-span" style="white-space: pre;"> </span>// 每隔多少 MS 讀取一次資料</div>
<div>
<br /></div>
<div>
Servo rightServo; <span class="Apple-tab-span" style="white-space: pre;"> </span>// create servo object to control right servo </div>
<div>
Servo leftServo;<span class="Apple-tab-span" style="white-space: pre;"> </span>// create servo object to control leftt servo </div>
<div>
<br /></div>
<div>
int angle = 0;<span class="Apple-tab-span" style="white-space: pre;"> </span>//記錄目前 servor 動力的值(真正給 servo 的值還會加上 rightStopAngle或leftStopAngle</div>
<div>
<br /></div>
<div>
//讓兩顆 servo 停止</div>
<div>
void servoStop() {</div>
<div>
rightServo.write(rightStopAngle);</div>
<div>
leftServo.write(leftStopAngle);</div>
<div>
} </div>
<div>
//讓兩顆 servo 暫停指定的時間</div>
<div>
void servoPause(int t) {</div>
<div>
servoStop();</div>
<div>
delay(t);</div>
<div>
} </div>
<div>
<br /></div>
<div>
//初始程序 </div>
<div>
void setup() </div>
<div>
{ </div>
<div>
Serial.begin(serialBaudRate); //Arduino起始鮑率:38400</div>
<div>
</div>
<div>
rightServo.attach(rightPin); // attaches the servo on pin "rightPin" to the right servo object </div>
<div>
leftServo.attach(leftPin);<span class="Apple-tab-span" style="white-space: pre;"> </span>// attaches the servo on pin "leftPin" to the left servo object </div>
<div>
angle = 0;</div>
<div>
servoStop();</div>
<div>
} </div>
<div>
<br /></div>
<div>
//循環執行的程序</div>
<div>
void loop() </div>
<div>
{ </div>
<div>
byte inBytes[20];<span class="Apple-tab-span" style="white-space: pre;"> </span>//暫存所有外部傳來資料用</div>
<div>
byte inByte;<span class="Apple-tab-span" style="white-space: pre;"> </span>//暫存用</div>
<div>
int inSize;<span class="Apple-tab-span" style="white-space: pre;"> </span>//計算已取得多少資料用</div>
<div>
</div>
<div>
if ((inSize=(Serial.available()))>0){ //讀取藍牙訊息</div>
<div>
for (int i=0; i<insize div="" i=""></insize><br />
<div>
inByte = Serial.read();</div>
<div>
if(i<19 div=""><!--19--><!--19--><!--19--><!--19--><!--19--><!--19--><!--19--><!--19--><!--19--><!--19--><!--19--><!--19--></19><br />
<div>
inBytes[i] = inByte;</div>
<div>
}</div>
<div>
}</div>
<div>
//執行指定的動作 F(前進)、f(後退)、t(右轉)、T(左轉)和 S(停止)</div>
<div>
switch(char(inBytes[0])) {</div>
<div>
case 'F' : //Forward</div>
<div>
if(angle > 0) {</div>
<div>
servoPause(500);</div>
<div>
}</div>
<div>
angle = -1*maxAngle;</div>
<div>
rightServo.write(rightStopAngle+angle);</div>
<div>
leftServo.write(leftStopAngle-angle);</div>
<div>
break;</div>
<div>
case 'f' : //Backword</div>
<div>
if(angle < 0) {</div>
<div>
servoPause(500);</div>
<div>
}</div>
<div>
angle = maxAngle;</div>
<div>
rightServo.write(rightStopAngle+angle);</div>
<div>
leftServo.write(leftStopAngle-angle);</div>
<div>
break;</div>
<div>
case 'T' : //Left turn</div>
<div>
servoPause(500);</div>
<div>
angle = -1*maxAngle;</div>
<div>
rightServo.write(rightStopAngle+angle);</div>
<div>
leftServo.write(leftStopAngle+angle);</div>
<div>
break;</div>
<div>
case 't' : //Right turn</div>
<div>
servoPause(500);</div>
<div>
angle = maxAngle;</div>
<div>
rightServo.write(rightStopAngle+angle);</div>
<div>
leftServo.write(leftStopAngle+angle);</div>
<div>
break;</div>
<div>
case 'S' : //stop</div>
<div>
servoStop();</div>
<div>
break;</div>
<div>
default : //others: stop</div>
<div>
servoStop();</div>
<div>
break;</div>
<div>
</div>
<div>
}</div>
<div>
} </div>
<div>
</div>
<div>
delay(delayMilliseconds); // 暫停多少 MS 後繼續</div>
<div>
</div>
<div>
} </div>
<!--19--></div>
</div>
</div>
Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-54917735910971951842015-11-25T17:46:00.000-08:002015-12-09T20:27:17.400-08:00Arduino 與無線WIFI ESP8266 使用Arduino 與無線WIFI ESP8266 使用<br />
<br />
<a href="http://lets-make-games.blogspot.tw/2015/04/wifi-esp8266-wifi.html">參考文章</a> <a href="http://mlwmlw.org/2015/07/%E6%B7%B1%E5%85%A5%E6%B7%BA%E5%87%BA-wifi-%E6%99%B6%E7%89%87-esp8266-with-arduino/"> 參考文章</a> <a href="http://blog-zzzman.rhcloud.com/2015/04/21/arduino-apache-helmet-software/">ESP8266與Android溝通</a> <a href="http://yhhuang1966.blogspot.tw/2015/10/esp8266-wifi-arduino.html">ESP8266與Web應用</a> <a href="http://www.28im.com/android/a4016295.html">ESP8266</a><br />
<br />
<a href="http://lets-make-games.blogspot.tw/2015/04/wifi-esp8266-wifi.html">克里斯遊戲自己做文章</a> <a href="http://nhs-tw.blogspot.tw/2015/11/step-by-step-esp8266-12-with-arduino.html"> ESP8266-12應用</a> <a href="http://nhs-tw.blogspot.tw/">DIY想像力Blog</a><br />
<br />
<a href="http://code.unumobile.com/wf8266r/tutorials/25_AccessPoint">ESP8266設定AP</a> <a href="https://github.com/UNUMobile/wf8266t/blob/master/WF8266T-TFT/_05_AccessPoint/_05_AccessPoint.ino"> ESP8266Code</a> <a href="http://ruten-proteus.blogspot.tw/2014/12/esp8266-at-command.html">ESP8266 AT Command</a><br />
<br />
<a href="http://blog.huntgang.com/2015/01/20/arduino-esp8266-tutorial-web-server-monitor-example/">資料上傳到Web</a><br />
<br />
這幾篇文章寫的太好了幾乎ESP8266的問題從接線、設定到韌體升級都寫的非常詳細,照著做幾乎都能成功。<br />
<br />
3.3V電源供電的方式很多,我是從Arduino UNO 3.3V供電升級韌體,<span style="background-color: white; color: #444444; font-family: , "arial"; font-size: 16px; line-height: 22.4px;">Baud Rate設成9600</span><br />
<span style="background-color: white; color: #444444; font-family: , "arial"; font-size: 16px; line-height: 22.4px;">注意事項:韌體升級要求的電源比較嚴格,我用Arduino UNO 3.3V一孔拉出2條接ESP8266在RealTerm執行 AT Command都沒問題,但韌體升級就會出現無法連接的錯誤訊息,後來用3.3V電源才能正常升級。</span><br />
<br />
<br />
常用AT Command如下<br />
<br />
AT ------------------->回應OK代表連線正常<br />
AT+GMR-----------><span style="background-color: white; color: #444444; font-family: , "arial"; font-size: 16px; line-height: 22.4px;">取得目前的韌體版本號碼</span><br />
<span style="background-color: white; color: #444444; font-family: , "arial"; font-size: 16px; line-height: 22.4px;"><br /></span>
<br />
<div style="background-color: white; color: #444444; font-family: 微軟正黑體, Arial; font-size: 16px; line-height: 22.4px;">
ESP8266的Wifi連線有三種模式:</div>
<div style="background-color: white; color: #444444; font-family: 微軟正黑體, Arial; font-size: 16px; line-height: 22.4px;">
<ol>
<li style="margin: 0px 0px 0.25em; padding: 0px;">Station模式:扮演連線到現有Wifi的裝置。</li>
<li style="margin: 0px 0px 0.25em; padding: 0px;">AP模式:扮演無線基地台,提供Wifi環境供連線。</li>
<li style="margin: 0px 0px 0.25em; padding: 0px;">Station+AP混合模式:允許同時使用以上兩種模式的特有功能</li>
</ol>
<div>
<div style="line-height: 22.4px;">
取得目前Wifi連線模式:</div>
<blockquote class="tr_bq" style="background-color: rgba(0, 144, 246, 0.0980392); line-height: 22.4px; margin: 6px 10px; padding: 6px;">
<b>指令「AT+CWMODE」</b><br />
「AT+CWMODE?」查詢當前模式<br />
「AT+CWMODE=2」將模式設定為第2種(AP模式)。</blockquote>
<br />
<b style="line-height: 22.4px;">指令「AT+CWLAP」</b><br />
<span style="background-color: rgba(0, 144, 246, 0.0980392); line-height: 22.4px;">顯示可連線的Wifi網路清單。</span><br />
<br />
<div style="line-height: 22.4px;">
<blockquote class="tr_bq" style="background-color: rgba(0, 144, 246, 0.0980392); margin: 6px 10px; padding: 6px;">
<b>指令「AT+CWJAP」</b><br />
「AT+CWJAP=<ssid>,<password>」連線到已存在的無線網路。<br />「AT+CWJAP?」查詢已連線到的無線網路。<br /><ssid>:無線網路的識別名稱(要加引號)。<br /><password>:無線網路的密碼(要加引號)。</password></ssid></password></ssid></blockquote>
</div>
<div style="line-height: 22.4px;">
如果需要切斷 Wifi連線,我們可以也可使用這個指令:</div>
<div style="line-height: 22.4px;">
<blockquote class="tr_bq" style="background-color: rgba(0, 144, 246, 0.0980392); margin: 6px 10px; padding: 6px;">
<b>指令「AT+CWQAP」</b><br />
切斷已連線的無線網路。 </blockquote>
</div>
</div>
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9pxPQzkb4MAziVISyfctfh7qObwFWMIHlAIuYCnYpaPhuCIedZCAvl7V4QlTpP9HZVNCli93iHLiINEYJKdTJ3N8SJrK-yc1wUEIMcYW2Mr5xwz9vxl5ogHMG5Lry7TEmdi90ucfiEIeT/s1600/ESP8266%25E6%258E%25A7%25E5%2588%25B6.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9pxPQzkb4MAziVISyfctfh7qObwFWMIHlAIuYCnYpaPhuCIedZCAvl7V4QlTpP9HZVNCli93iHLiINEYJKdTJ3N8SJrK-yc1wUEIMcYW2Mr5xwz9vxl5ogHMG5Lry7TEmdi90ucfiEIeT/s640/ESP8266%25E6%258E%25A7%25E5%2588%25B6.jpg" width="522" /></a></div>
<br />
<br />
<br />
<a href="http://ruten-proteus.blogspot.tw/2014/12/esp8266-firmware-burning.html">一鍵燒錄更新軟體</a> <a href="https://github.com/itead/ITEADLIB_Arduino_WeeESP8266">GITHUB</a><br />
<br />
<br />
測試ESP8226與電腦連線使用TelNet方式<br />
<br />
如果你想使用自己設定的Port 可以用Telnet方式來測試<br />
1.先把ESP8226連上WIFI設備<br />
<span style="background-color: white; color: #444444; font-family: , "arial"; font-size: 16px; line-height: 22.4px;"> Wifi連線模式設為 Station模式:</span><span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;">AT+CWMODE=1 確認OK</span></span><br />
<span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;"><br /></span></span>
<span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;">2.</span></span><span style="background-color: white; color: #444444; font-family: , "arial"; font-size: 16px; line-height: 22.4px;">列出目前的Wifi清單:</span><span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;">AT+CWLAP</span></span><br />
<span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;">請先看是否有目標 wifi名稱出現</span></span><br />
<span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;"><br /></span></span>
<span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;">3.準備與WIFI連線:AT+CWJAP="PALMONE","123456789" 確認OK</span></span><br />
<span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;"><br /></span></span>
<span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;">4.如果連線成功 AT+CIFSR </span></span><span style="color: #444444; font-family: , "arial"; line-height: 22.4px;">會有一組IP:192.168.1.185 如果沒連上WIFI回傳IP:0.0.0.0</span><br />
<span style="color: #444444; font-family: , "arial"; line-height: 22.4px;"><br /></span>
<span style="color: #444444; font-family: , "arial"; line-height: 22.4px;">5.把ESP8266當Server端讓筆電連上:把ESP多重連線打開 </span><span style="color: #444444; font-family: , "arial";"><span style="background-color: white; line-height: 22.4px;">AT+CIPMUX=1 確認OK</span></span><br />
<span style="color: #444444; font-family: , "arial";"><span style="background-color: white; line-height: 22.4px;"><br /></span></span>
<span style="color: #444444; font-family: , "arial";"><span style="background-color: white; line-height: 22.4px;">6.ESP8266 開啟伺服器與Port :</span><span style="line-height: 22.4px;">AT+CIPSERVER=1,8087 ,Port:8087 確認OK</span></span><br />
<span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;"><br /></span></span>
<span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;">以上步驟ESP8266就準備完成等待Client端請求連線</span></span><br />
<span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;"><br /></span></span>
<span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;">筆電部份:</span></span><br />
<span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;">我是用MacBook </span></span><br />
<span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;">1.先連上與ESP8266相同的WIFI,這動作讓筆電與ESP8266在同一網域,不同網域請先設定的路由器讓不同網域可以溝通</span></span><br />
<span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;"><br /></span></span>
<span style="color: #444444; font-family: , "arial"; line-height: 22.4px;">2.打開超級終端機 </span><span style="color: #444444; font-family: , "arial"; line-height: 22.4px;">Ping 192.186.1.185 你會看到回應訊息代表IP位置存在</span><br />
<span style="color: #444444; font-family: , "arial"; line-height: 22.4px;"><br /></span>
<span style="color: #444444; font-family: , "arial"; line-height: 22.4px;">3.在</span><span style="color: #444444; font-family: , "arial"; line-height: 22.4px;">超級終端機輸入</span><span style="color: #444444; font-family: , "arial"; line-height: 22.4px;">telnet 192.168.1.185 8087 連線,如果成功ESP8266會出現Link訊息</span><br />
<span style="color: #444444; font-family: , "arial"; line-height: 22.4px;"><br /></span>
<span style="color: #444444; font-family: , "arial"; line-height: 22.4px;">4.測試訊息傳送在ESP8226這邊</span><span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;">AT+CIPSEND=0,5 表示跟第1個連線裝置溝通 長度5,ESP8266最多同時能跟5個Client連線代碼 0 ~ 4</span></span><br />
<span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;"><br /></span></span>
<span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;">5.輸入Hello字串按Send ASCII鈕,接著在筆電的電超級終端機會收到Hello這5個字串顯示,代表ESP8266與筆電可以互傳訊息了</span></span><br />
<span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;"><br /></span></span>
<br />
<span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;">前前後後花了3天重複閱讀克里斯的文章與執行步驟,先幫ESP8266更新韌體把<span style="background-color: white; font-family: , "arial"; font-size: 16px; line-height: 22.4px;">Baud Rate</span>設成9600</span></span><br />
<span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;"><br /></span></span>
<span style="color: #444444; font-family: , "arial";"><span style="line-height: 22.4px;"><br /></span></span>
非常感謝網友克里斯對 ESP8266 各種疑難雜症的分享與解釋讓我能順利的測試成功,不然像我這種對電子學完全不懂得門外漢是不可能理解 ESP8266每支腳位的代表意義<br />
<br />
Arduino 程式<br />
<pre style="background-color: #f7f7f7; border-radius: 3px; box-sizing: border-box; color: #333333; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; font-stretch: normal; line-height: 1.45; margin-bottom: 16px; overflow: auto; padding: 16px; word-wrap: normal;"><code style="background: transparent; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; line-height: inherit; margin: 0px; max-width: initial; overflow: initial; padding: 0px; word-break: normal; word-wrap: normal;">#include "ESP8266.h"
#include <softwareserial .h="">
SoftwareSerial mySerial(3, 2); /* RX:D3, TX:D2 */
ESP8266 wifi(mySerial);</softwareserial></code></pre>
<pre style="background-color: #f7f7f7; border-radius: 3px; box-sizing: border-box; color: #333333; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; font-stretch: normal; line-height: 1.45; margin-bottom: 16px; overflow: auto; padding: 16px; word-wrap: normal;"><code style="background: transparent; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; line-height: inherit; margin: 0px; max-width: initial; overflow: initial; padding: 0px; word-break: normal; word-wrap: normal;">ESP8266_TX->RX(D3)
ESP8266_RX->TX(D2)
ESP8266_CH_PD->3.3V
ESP8266_VCC->3.3V
ESP8266_GND->GND</code></pre>
<pre style="background-color: #f7f7f7; border-radius: 3px; box-sizing: border-box; color: #333333; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; font-stretch: normal; line-height: 1.45; margin-bottom: 16px; overflow: auto; padding: 16px; word-wrap: normal;"><code style="background: transparent; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6px; line-height: inherit; margin: 0px; max-width: initial; overflow: initial; padding: 0px; word-break: normal; word-wrap: normal;">
</code></pre>
<br />
<br />Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-71201756317088442752015-11-24T23:00:00.000-08:002015-11-24T23:01:00.975-08:00Arduino 中斷與外部中斷Arduino 中斷與外部中斷<br />
<br />
有時候執行Arduino程式時會發生Reset重起,這些資料可以參考<br />
<br />
<a href="http://coopermaa2nd.blogspot.tw/2011/04/attachinterrupt.html">Cooper Maa attachInterrupt() 與外部中斷</a><br />
<br />
<a href="http://coopermaa2nd.blogspot.tw/2010/12/arduino-arduino.html">Arduino 開發版中斷I/O Port 定義</a> <a href="https://www.arduino.cc/en/Reference/AttachInterrupt">UNO 外部中斷D2與D3</a><br />
<br />
<br />
網站文章裡面提到:<br />
要特別注意是,程式裏的 buttonState 變數是宣告成 volatile,這樣做的目的是告訴 Compiler 不要做最佳化,避免變數狀態不同步。給你一個建議,程式主體跟 ISR 都會用到的變數,盡可能把它宣告成 volatile。<br />
<br />
attachInterrupt() 函式<br />
<br />
attachInterrupt() 函式的用途是用來指定外部中斷的處理函式(Interrupt Service Routine, ISR),就像範例程式所示範的指定 buttonStateChanged() 當作 Interrupt 0 外部中斷的處理函式。<br />
<br />
attachInterrupt() 函式有三個參數:<br />
<br />
interrupt: 外部中斷的編號。大部份 Arduino 板子都有兩個外部中斷,編號 0 (Interrupt 0)是在 pin 2 上,而編號 1 (Interrupt 1)是在 pin 3 上。<br />
function: 中斷處理函式(Interrupt Service Routine, ISR)。中斷處理函式必須是不接受參數而且不回傳任何東西。<br />
mode: 定義什麼狀況下該觸發中斷,有四個可以設定的常數值:<br />
LOW: 當 pin 為 LOW 時觸發中斷<br />
CHANGE: 當 pin 狀態改變時觸發中斷,不管是從 HIGH 到 LOW 或從 LOW 到 HIGH<br />
RISING: 當 pin 狀態從 LOW 到 HIGH 時觸發中斷,RISING 又稱正緣觸發<br />
FALLING: 當 pin 狀態從 HIGH 到 LOW 時觸發中斷,FALLING 又稱負緣觸發<br />
如果要移除外部中斷服務函式,就使用 detachInterrupt() 函式。<br />
<br />
啟用與停止中斷<br />
<br />
如果要停止 Arduino 所有中斷,可以呼叫 noInterrupt() 函式,要重新啟用中斷,只要呼叫一次 interrupts() 函式即可。Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-80989691049908059952015-11-20T19:12:00.002-08:002015-11-20T19:23:38.279-08:00Arduino 與 全彩LED燈泡測試Arduino 與 全彩LED燈泡測試<br />
<br />
這次要測試剛買來的全彩LED燈泡測試<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXoTmp4jFofqx2DD2C35VWqHhFTLrmIOwwit2BjtEnNDyom2YSOyf-cWSJMwZTTv5sgGAck1L7OrfM5SbdkWAI9oKracbGhh-V8TSt-j0CsUO_XQEeb8Q0bS7RnhPygvLsLpyI0Zl8dY6U/s1600/LEDBALL.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXoTmp4jFofqx2DD2C35VWqHhFTLrmIOwwit2BjtEnNDyom2YSOyf-cWSJMwZTTv5sgGAck1L7OrfM5SbdkWAI9oKracbGhh-V8TSt-j0CsUO_XQEeb8Q0bS7RnhPygvLsLpyI0Zl8dY6U/s640/LEDBALL.jpg" width="620" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">網路上的示意圖但紅線(V腳位)不能接5V,要接Ground才能亮</td></tr>
</tbody></table>
<br />
<br />
<br />
//範例用PWM來控制所以用9,10,11三隻PWM腳位,其他非PWM腳位也都可以但只有HIGH or LOW(1 or o) 看使用者應用,因為Arduino UNO腳位不多因此所有腳位都要充分利用。<br />
//或是用Analog腳位A0~A5也是可以的<br />
<br />
int redpin = 11; //select the pin for the red LED<br />
int bluepin =10; // select the pin for the blue LED<br />
int greenpin =9;// select the pin for the green LED<br />
<br />
或是數位腳<br />
int redpin = 7; //select the pin for the red LED<br />
int greenpin =2;// select the pin for the green LED<br />
int bluepin =4; // select the pin for the blue LED<br />
<br />
<br />
<br />
int val;<br />
<br />
<br />
<br />
void setup() {<br />
pinMode(redpin, OUTPUT);<br />
pinMode(bluepin, OUTPUT);<br />
pinMode(greenpin, OUTPUT);<br />
Serial.begin(9600);<br />
<br />
<br />
}<br />
<br />
void loop()<br />
{<br />
<br />
analogWrite(A3, 255); //255 R 紅 其餘0<br />
analogWrite(A5, 0); //255 G 綠 其餘0<br />
analogWrite(A4, 0); //255 B 藍 其餘0<br />
//黃=R255,G255,B0 橘=228,120,51<br />
delay(1000);<br />
<br />
<br />
analogWrite(A3, 0); //255 R 紅 其餘0<br />
analogWrite(A5, 255); //255 G 綠 其餘0<br />
analogWrite(A4, 0); //255 B 藍 其餘0<br />
delay(1000);<br />
<br />
<br />
analogWrite(A3, 255); //255 R 紅 其餘0<br />
analogWrite(A5, 255); //255 G 綠 其餘0<br />
analogWrite(A4, 0); //255 B 藍 其餘0<br />
delay(1000);<br />
<br />
<br />
digitalWrite(redpin, HIGH); //255 R 紅 其餘0<br />
digitalWrite(greenpin, LOW); //255 G 綠 其餘0<br />
digitalWrite(bluepin, LOW); //255 B 藍 其餘0<br />
<br />
<br />
<br />
/*<br />
for(val=255; val>0; val--)<br />
{<br />
analogWrite(11, val);<br />
analogWrite(10, 255-val);<br />
analogWrite(9, 128-val);<br />
delay(10);<br />
}<br />
for(val=0; val<255 p="" val=""> {<br />
analogWrite(11, val);<br />
analogWrite(10, 255-val);<br />
analogWrite(9, 128-val);<br />
delay(10);<br />
}<br />
Serial.println(val, DEC);<br />
*/<br />
}<!--255--><!--255--><!--255--><!--255--><!--255--></255>Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-50803080084107624692015-10-09T05:52:00.002-07:002015-10-09T06:48:02.844-07:00Arduino WIFI 注意事項<span style="font-size: large;">Arduino WIFI 注意事項</span><br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">ESP8266 WiFi 是Arduino常用的WIFI模組,該模組有兩種運行模式(AP模式和STA模式)</span><br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">AP模式(相當於區域網路連結,手機本地控制</span><span style="font-size: large;">):</span><br />
<span style="font-size: large;">把ESP8266 WiFi 熱點,也就是預先設定ESP8266 AP熱點名稱與密碼,這樣手機搜尋WIFI找到設定的名稱與密碼就可以連線使用。</span><br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">執行手機APK程式就可以用WIFI方式與Arduino ESP8266溝通。</span><br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">STA模式(相當於Internet網路連結,用於外部網路讓手機、網頁控制</span><span style="font-size: large;">):</span><br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><a href="http://nodemcu-car.doit.am/21.html" target="_blank">網路資源</a></span><br />
<br />
<br />
<br />
<br />
<br />
<span style="font-size: large;">另一塊WIFI模組 :</span><span style="background-color: white; color: #333333; font-family: YanoneKaffeesatzRegular; font-size: 30px; letter-spacing: 0.05em;">nRF24L01 (電壓不可超過3.6V)</span><br />
<span style="background-color: white; color: #333333; font-family: Helvetica, 'LiHei Pro', PMingLiU, sans-serif; font-size: 16px; line-height: 33.6px;">nFR24L01 2.4G無線模組只能單向雙工,一個模組只能單純發送或接收,不能改變,所以我們使用兩塊Arduino開發板來分別收發</span><span style="background-color: white; color: #333333; font-family: YanoneKaffeesatzRegular; font-size: 30px; letter-spacing: 0.05em;"><br /></span>
<span style="background-color: white; color: #333333; font-family: YanoneKaffeesatzRegular; font-size: 30px; letter-spacing: 0.05em;"><br /></span>
<span style="background-color: white; color: #333333; font-family: YanoneKaffeesatzRegular; font-size: 30px; letter-spacing: 0.05em;"><br /></span>
<span style="background-color: white; color: #333333; font-family: YanoneKaffeesatzRegular; letter-spacing: 0.05em;"><span style="font-size: large;"><a href="http://single9.net/2012/11/when-ti-launchpad-meet-nrf24l01/" target="_blank">網路資源</a> <a href="http://single9.net/2015/01/rf24-nrf24l01-library/" target="_blank">網路資源02</a> <a href="http://tmrh20.github.io/RF24/GettingStarted_8ino-example.html" target="_blank">網路資源03</a> <a href="http://fun101.com.tw/?posts/25459-technology-in-the-future-internet-of-things-business-model-how-to-use-wireless-transmission-the-basic-text" target="_blank">網路資源04</a></span></span><br />
<span style="background-color: white; color: #333333; font-family: YanoneKaffeesatzRegular; letter-spacing: 0.05em;"><br /></span>
<span style="background-color: white; color: #333333; font-family: YanoneKaffeesatzRegular; letter-spacing: 0.05em;"><br /></span>
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">使用器材</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">arduino UNR R3*2</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">NRF2401 *2</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">使用庫</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">RF24</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">RF24Network</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">//////////////////////////////////////主機-發送信號/////////////////////////////////////</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">#include <rf24network .h=""></rf24network></span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">#include <rf24 .h=""></rf24></span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">#include <spi .h=""></spi></span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">// nRF24L01(+) radio attached using Getting Started board </span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">RF24 radio(9,10);</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">// Network uses that radio</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">RF24Network network(radio);</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">// Address of our node</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">const uint16_t this_node = 1;</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">// Address of the other node</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">const uint16_t other_node = 0;</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">// How often to send 'hello world to the other unit</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">const unsigned long interval = 150; //ms</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">// When did we last send?</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">unsigned long last_sent;</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">// How many have we sent already</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">//unsigned long packets_sent;</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">// Structure of our payload</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">struct payload_t</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">{</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> uint32_t ms;</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> uint32_t sensorDataA;</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> uint32_t sensorDataB;</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">};</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">boolean power_SW;</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">int led_VOL;</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">void setup(void)</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">{</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> Serial.begin(115200);</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> Serial.println("RF24Network/examples/helloworld_tx/");</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> SPI.begin();</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> radio.begin();</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> radio.setDataRate( RF24_250KBPS ) ;</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> network.begin(/*channel*/ 50, /*node address*/ this_node);</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> randomSeed(analogRead(0));</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> pinMode(7,INPUT_PULLUP); </span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">}</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">void loop(void)</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">{</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> power_SW=!digitalRead(7);</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> led_VOL=analogRead(A0)/4;</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> // Pump the network regularly</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> network.update();</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> // If it's time to send a message, send it!</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> unsigned long now = millis();</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> if ( now - last_sent >= interval )</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> {</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> last_sent = now;</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> Serial.print("power_SW:");</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> Serial.println(power_SW);</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> Serial.print("led_VOL:");</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> Serial.println(led_VOL);</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> Serial.print("Sending...");</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> payload_t payload = { </span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> millis(),power_SW,led_VOL };</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> RF24NetworkHeader header(/*to node*/ other_node);</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> bool ok = network.write(header,&payload,sizeof(payload));</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> if (ok)</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> Serial.println("ok.");</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> else</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> Serial.println("failed.");</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> }</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">}</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">//////////////////////////////////////從機-接收信號/////////////////////////////////////</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">#include <rf24network .h=""></rf24network></span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">#include <rf24 .h=""></rf24></span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">#include <spi .h=""></spi></span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">// nRF24L01(+) radio attached using Getting Started board </span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">RF24 radio(9,10);</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">// Network uses that radio</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">RF24Network network(radio);</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">// Address of our node</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">const uint16_t this_node = 0; </span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">// Address of the other node</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">const uint16_t other_node = 1;</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">// Structure of our payload</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">struct payload_t</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">{</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> uint32_t ms;</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> uint32_t sensorDataA;</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> uint32_t sensorDataB;</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">};</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">#define power_PIN 5</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">#define led_PIN 6</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">boolean power_SW;</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">int led_VOL;</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">void setup(void)</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">{</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> Serial.begin(115200);</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> SPI.begin();</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> radio.begin();</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> radio.setDataRate( RF24_250KBPS ) ;</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> network.begin(/*channel*/ 50, /*node address*/ this_node);</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> pinMode(power_PIN,OUTPUT);</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> pinMode(led_PIN,OUTPUT);</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">}</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">void loop(void)</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">{ </span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> // Pump the network regularly</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> network.update();</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> // Is there anything ready for us?</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> while ( network.available() )</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> {</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> // If so, grab it and print it out</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> RF24NetworkHeader header;</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> payload_t payload;</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> network.read(header,&payload,sizeof(payload));</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> power_SW=payload.sensorDataA;</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> led_VOL=payload.sensorDataB;</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> Serial.print("power_SW:");</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> Serial.println(power_SW);</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> Serial.print("led_VOL:");</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> Serial.println(led_VOL);</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> }</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> digitalWrite(power_PIN,power_SW);</span><br />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;"> analogWrite(led_PIN,led_VOL);</span><br />
<br style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px; word-wrap: break-word;" />
<span style="background-color: white; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 21px;">}</span><br />
<span style="background-color: white; color: #333333; font-family: YanoneKaffeesatzRegular; font-size: 30px; letter-spacing: 0.05em;"><br /></span>
<br />
<br />
<br />
<br />Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-57684114882655886322015-10-05T23:33:00.000-07:002015-10-06T02:16:25.829-07:00Arduino 與藍芽模組設定 HC-05 HC06Arduino 與藍芽模組設定 HC-05 HC06<br />
<br />
<a href="http://swf.com.tw/?p=712" target="_blank">網昱多媒體</a> <a href="http://gsyan888.blogspot.tw/2014/03/arduino-hc-06-at-command.html" target="_blank"> 網路參考資料</a> <a href="http://luffyspace.blogspot.tw/2014/10/arduino-uno.html" target="_blank">透過藍芽傳輸程式</a> <a href="http://blog.ddt.idv.tw/2015/02/arduino_24.html" target="_blank">透過藍芽傳輸程式02</a><br />
<br />
<a href="http://swf.com.tw/?p=759" target="_blank">透過藍芽傳輸程式03</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr5RTjG5Rtr5sH1roLO8m_ZAnQQNdu8FXezn-LaGwYEfTdDh1qYgJ988MJ0BEuRj98btQu2c68D1vDS3cV1gBXpH0zam79CIZlAy04Xw0pD1wIvsrTieEKJCu3Vkk49kQBwE94ACtxeAix/s1600/arduino-hc-06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr5RTjG5Rtr5sH1roLO8m_ZAnQQNdu8FXezn-LaGwYEfTdDh1qYgJ988MJ0BEuRj98btQu2c68D1vDS3cV1gBXpH0zam79CIZlAy04Xw0pD1wIvsrTieEKJCu3Vkk49kQBwE94ACtxeAix/s640/arduino-hc-06.png" width="528" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both;">
HC-06 和 Arduino 的腳位對應如下:</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
HC-06 VCC → Arduino 5V</div>
<div class="separator" style="clear: both;">
HC-06 GND → Arduino GND</div>
<div class="separator" style="clear: both;">
HC-06 TXD → Arduino pin 10</div>
<div class="separator" style="clear: both;">
HC-06 RXD → Arduino pin 11</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="color: #333333; font-family: Arial, sans-serif;">
<span style="font-size: 15.6px; line-height: 24.96px;">#include <softwareserial .h=""></softwareserial></span></div>
<div style="color: #333333; font-family: Arial, sans-serif;">
<span style="font-size: 15.6px; line-height: 24.96px;">SoftwareSerial BTSerial(10, 11); // RX | TX</span></div>
<div style="color: #333333; font-family: Arial, sans-serif;">
<span style="font-size: 15.6px; line-height: 24.96px;">void setup()</span></div>
<div style="color: #333333; font-family: Arial, sans-serif;">
<span style="font-size: 15.6px; line-height: 24.96px;">{</span></div>
<div style="color: #333333; font-family: Arial, sans-serif;">
<span style="font-size: 15.6px; line-height: 24.96px;"> Serial.begin(9600);</span></div>
<div style="color: #333333; font-family: Arial, sans-serif;">
<span style="font-size: 15.6px; line-height: 24.96px;"> Serial.println("Enter AT commands:");</span></div>
<div style="color: #333333; font-family: Arial, sans-serif;">
<span style="font-size: 15.6px; line-height: 24.96px;"> BTSerial.begin(9600); // HC-06 current bound rate (default 9600)</span></div>
<div style="color: #333333; font-family: Arial, sans-serif;">
<span style="font-size: 15.6px; line-height: 24.96px;">}</span></div>
<div style="color: #333333; font-family: Arial, sans-serif;">
<span style="font-size: 15.6px; line-height: 24.96px;">void loop()</span></div>
<div style="color: #333333; font-family: Arial, sans-serif;">
<span style="font-size: 15.6px; line-height: 24.96px;">{</span></div>
<div style="color: #333333; font-family: Arial, sans-serif;">
<span style="font-size: 15.6px; line-height: 24.96px;"> // Keep reading from HC-06 and send to Arduino Serial Monitor</span></div>
<div style="color: #333333; font-family: Arial, sans-serif;">
<span style="font-size: 15.6px; line-height: 24.96px;"> if (BTSerial.available())</span></div>
<div style="color: #333333; font-family: Arial, sans-serif;">
<span style="font-size: 15.6px; line-height: 24.96px;"> Serial.write(BTSerial.read());</span></div>
<div style="color: #333333; font-family: Arial, sans-serif;">
<span style="font-size: 15.6px; line-height: 24.96px;"> // Keep reading from Arduino Serial Monitor and send to HC-06</span></div>
<div style="color: #333333; font-family: Arial, sans-serif;">
<span style="font-size: 15.6px; line-height: 24.96px;"> if (Serial.available())</span></div>
<div style="color: #333333; font-family: Arial, sans-serif;">
<span style="font-size: 15.6px; line-height: 24.96px;"> BTSerial.write(Serial.read());</span></div>
<div style="color: #333333; font-family: Arial, sans-serif;">
<span style="font-size: 15.6px; line-height: 24.96px;">}</span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
執行AT命令修改相關資料</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<br />
<br />
<br />
<br />
<br />
<br />
<li style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 15.6px; line-height: 24.96px;">AT:測試,回應「OK」</li>
<li style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 15.6px; line-height: 24.96px;">AT+VERSION:回應靭體的版本。</li>
<li style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 15.6px; line-height: 24.96px;">AT+NAMExyz:將裝置名稱改為「xyz」。 </li>
<li style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 15.6px; line-height: 24.96px;">AT+PIN1234:將連線密碼換為「1234」。</li>
<li style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 15.6px; line-height: 24.96px;">AT+BAUD4:將 baud rate 換為 9600。</li>
<li style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 15.6px; line-height: 24.96px;">AT+BAUD5:將 baud rate 換為 19200</li>
<li style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 15.6px; line-height: 24.96px;">AT+BAUD6:將 baud rate 換為 38400</li>
<li style="background-color: white; color: #333333; font-family: Arial, sans-serif; font-size: 15.6px; line-height: 24.96px;">AT+BAUD7:將 baud rate 換為 57600</li>
<span style="color: #333333; font-family: Arial, sans-serif;"><div style="font-size: 15.6px; line-height: 24.96px;">
<span style="color: #333333; font-family: Arial, sans-serif;"><span style="font-size: 15.6px; line-height: 24.96px;"><br /></span></span></div>
<div>
<span style="background-color: white; font-size: 15.6px; line-height: 24.96px;">注意事項: HC-06 一輸入完「AT」就馬上會回應了,建議上面的指令用複製貼上的方法,不然很難跟晶片比快</span><br />
<span style="background-color: white; font-size: 15.6px; line-height: 24.96px;"><br /></span>
<span style="background-color: white; font-size: 15.6px; line-height: 24.96px;"><a href="http://swf.com.tw/?p=712" target="_blank">在間看模式時要注意</a></span><br />
<span style="background-color: white; font-size: 15.6px; line-height: 24.96px;">HC-05 命令結尾\n\r</span><br />
<span style="background-color: white; font-size: 15.6px; line-height: 24.96px;">HC--06 命令沒有\n\r</span><br />
<span style="background-color: white; font-size: 15.6px; line-height: 24.96px;"><br /></span></div>
</span>Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-7720280163469312142015-09-18T00:39:00.000-07:002015-09-18T01:41:22.106-07:00Arduino UNO R3 與光敏電阻感測器Arduino UNO R3 與光敏電阻感測器<br />
<br />
<br />
<br />
<span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; line-height: 13.0667px; text-indent: -24px;">紅外線循跡感測器 (IR Tracker Sensor)</span><br />
<br />
/*<br />
KSM017<br />
入射光強,電阻減小,入射光弱,電阻增大<br />
<br />
1、VCC 電源3.3-5V<br />
2、GND 接地<br />
3、DO TTL開關信号输出 數位輸出(0 or 1)<br />
4、AO 模擬信號输出 類比輸出(電壓)<br />
*/<br />
<br />
int iAo = A1;<br />
int iDo = 7;<br />
<br />
<br />
void setup() {<br />
// put your setup code here, to run once:<br />
Serial.begin(9600);<br />
pinMode(iDo,INPUT);<br />
pinMode(iAo,INPUT);<br />
<br />
}<br />
<br />
void loop() {<br />
// put your main code here, to run repeatedly:<br />
int pr = analogRead(iAo);<br />
//int pr2 = analogRead(iDo);<br />
Serial.print("Dgt=");<br />
Serial.print(digitalRead(iDo));<br />
<br />
Serial.print(" | ");<br />
Serial.print("Alg=");<br />
Serial.println(pr);<br />
<br />
<br />
//int sensorValue = analogRead(1);<br />
//float Rsensor=(float)(1023-sensorValue)*10/sensorValue;<br />
//Serial.println(Rsensor);<br />
<br />
<br />
delay(1000);<br />
}Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-71891272963574315132015-09-13T21:27:00.000-07:002015-11-17T01:14:55.776-08:00Arduino UNO R3 與 L298N馬達驅動板 測試Arduino UNO R3 與 L298N馬達驅動板的配合是蠻多人使用的方式,一開始我也是照網路上大家的接法但是馬達就是不動作,後來又爬文爬好久才知道自己的錯誤點(就是沒把L298N與Arduino 板用GRD串接起來)因此怎麼測試馬達就是不動作。<br />
<br />
<br />
另外要注意的一點就是你用L298N接2個DC馬達,其中ENA或ENB接在D9、D10腳位控制PWM輸出時,如果又用上Servo時會發現D9、D10失效<br />
<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/xG5ksMji0xk" width="560"></iframe><br />
<br />
我之前組裝尋跡自走車時用L298N控制2顆DC馬達可以走得穩穩的,後來加上一顆SG90 Servo9G腳位接在D12時其中一顆DC馬達ENA就會發生不動作,原以為是電壓不足就外接電源但ENA依然不動作,上網查資料才知道當使用Servo.h函式庫時<span style="color: #990000;">D9 與 D10 腳位的 PWM 功能就會被停用,</span>所以ENA PWM失效解決辦法就是ENA PWM不要接D9或 D10<br />
<br />
<span style="color: #990000;">Servo伺服器雖然使用了 PWM 訊號來控制馬達轉動,不過,這不表示要使用 Arduino 的 PWM 腳位,只不過根據 Servo library 的說明,除了 Arduino Mega 之外,如果使用了 Arduino 的 Servo 程式庫,D9 與 D10 腳位的 PWM 功能就會被停用。(</span><span style="color: #134f5c;"><a href="http://www.codedata.com.tw/social-coding/mblock-arduino-9-servo-motor/" target="_blank">網路資源</a></span><span style="color: #990000;">) (</span><span style="color: #0c343d;"><a href="http://yehnan.blogspot.tw/2013/09/arduinotower-pro-sg90.html" target="_blank">網路資源</a></span><span style="color: #990000;">)</span><br />
<br />
<br />
<a href="https://www.arduino.cc/en/reference/servo" target="_blank"><b>原文如下</b></a><br />
<span style="background-color: white; color: #4f4e4e; font-family: "typoninesans regular 18" , "lucida grande" , "lucida" , "verdana" , sans-serif; font-size: 15.9984px; line-height: 27.9972px;">The Servo library supports up to 12 motors on most Arduino boards and 48 on the Arduino Mega. On boards other than the Mega,</span><span style="background-color: white; font-family: "typoninesans regular 18" , "lucida grande" , "lucida" , "verdana" , sans-serif; font-size: 15.9984px; line-height: 27.9972px;"><span style="color: #990000;"> <b>use of the library disables analogWrite() (PWM) functionality on pins 9 and 10</b></span></span><span style="background-color: white; color: #4f4e4e; font-family: "typoninesans regular 18" , "lucida grande" , "lucida" , "verdana" , sans-serif; font-size: 15.9984px; line-height: 27.9972px;">, whether or not there is a Servo on those pins. On the Mega, up to 12 servos can be used without interfering with PWM functionality; use of 12 to 23 motors will disable PWM on pins 11 and 12.</span><br />
<br />
<br />
<span style="background-color: white; color: #333333; font-family: "arial" , "stheiti" , "pmingliu" , sans-serif; font-size: 13px;">在Arduino板子中的</span><span style="background-color: white; color: #333333; font-family: "arial" , "stheiti" , "pmingliu" , sans-serif; font-size: 13px;">第3、5、6、9、10、11腳可做PWM輸出</span><span style="background-color: white; color: #333333; font-family: "arial" , "stheiti" , "pmingliu" , sans-serif; font-size: 13px;">,其頻率大都為490Hz,而在Uno板子,第5、6腳的頻率約980Hz</span><br />
<span style="background-color: white; color: #333333; font-family: "arial" , "stheiti" , "pmingliu" , sans-serif; font-size: 13px;"><a href="http://bach.ccu.edu.tw/tools/page/show_page.php?page_url=/Site/nu14075/Blog/dir_Br2ysq/article_orvQpQ.html" target="_blank">L298N使用方式</a></span><br />
<br />
<br />
<br />
<a href="http://tronixlabs.com/news/tutorial-l298n-dual-motor-controller-module-2a-and-arduino/">網路上另一篇文章</a><br />
<br />
<br />
<a href="http://bach.ccu.edu.tw/tools/page/show_page.php?page_url=/Site/nu14075/Blog/dir_Br2ysq/article_orvQpQ.html">這篇就是解決問題的文章</a><br />
/*<br />
首先來看電源的接法,電源的接法可分成三種,第一種是只提供一組外部電源+12V。<br />
將+12V電源的正負分別接到+12V與GND這兩個插座,同時將+12V上方的Jumper短路,<br />
此時+12V會連接到7805,然後降壓成5V,提供給板子上的IC使用。不需要將5V接到Arduino的板子取得5V電源。<br />
第二種接法同第一種接法,但將5V接到Arduino板子的5V,提供5V給Arduino板,所以Arduino板不需要另外再接5V電源來供電。<br />
第三種接法則是將+12V上方的Jumper拔起來,不透過7805來產生5V,<br />
但必須將+5V的插座接到Arduino的5V,也就是從Arduino提供5V給L298N使用。<br />
以上三種接法,不論哪一種接法,一定要將GND插座與Arduino的GND相連,如此`才有共同的零電壓準位。<br />
*/<br />
<br />
/*<br />
int value;<br />
int dir;<br />
void setup() {<br />
pinMode(3, OUTPUT); //接到ENA<br />
pinMode(4, OUTPUT); //接到N1<br />
pinMode(5, OUTPUT); //接到N2<br />
digitalWrite(4, HIGH); //設定馬達正轉<br />
digitalWrite(5, LOW);<br />
value= 255; //PWM輸出值<br />
dir = -1; //value值的遞增或遞減<br />
}<br />
<br />
void loop() {<br />
value= value+ dir; <br />
if (value< 80) //當value值小於80時,馬達不會轉,所以dir改成遞增(如果使用3V馬達 上下限值不能大於50~150, 5V 80~255)<br />
dir = 1;<br />
else if (value>= 255) //當value值為最大255時,dir改成遞減<br />
dir = -1;<br />
analogWrite(3, value);<br />
delay(200);<br />
}<br />
<br />
*/<br />
<br />
<br />
程式碼如下:<br />
<br />
//也可以用 Analog A0 ~ A5<br />
//Digital PWM 3、5、6、9、10、11<br />
<br />
const int motorIn1=5;<br />
const int motorIn2=6;<br />
<br />
const int motorIn3=9;<br />
const int motorIn4=10;<br />
<br />
void setup() {<br />
<br />
pinMode(motorIn1, OUTPUT); //接到N5<br />
pinMode(motorIn2, OUTPUT); //接到N6<br />
<br />
pinMode(motorIn3, OUTPUT); //接到N9<br />
pinMode(motorIn4, OUTPUT); //接到N10<br />
<br />
}<br />
<br />
void loop() {<br />
<br />
<br />
<br />
<br />
//正轉<br />
for(int i=150;i<255 i="" p=""> analogWrite(motorIn1,i);<br />
analogWrite(motorIn2,0);<br />
<br />
analogWrite(motorIn3,i);<br />
analogWrite(motorIn4,0);<br />
<br />
delay(500);<br />
}<br />
<br />
analogWrite(motorIn1,0);<br />
analogWrite(motorIn2,0);<br />
analogWrite(motorIn3,0);<br />
analogWrite(motorIn4,0);<br />
delay(2000); <br />
<br />
//反轉<br />
<br />
for(int i=150;i<255 i="" p=""> analogWrite(motorIn1,0);<br />
analogWrite(motorIn2,i);<br />
<br />
analogWrite(motorIn3,0);<br />
analogWrite(motorIn4,i);<br />
delay(500);<br />
}<br />
<br />
analogWrite(motorIn1,0);<br />
analogWrite(motorIn2,0);<br />
analogWrite(motorIn3,0);<br />
analogWrite(motorIn4,0);<br />
delay(2000);<br />
<br />
<br />
}<br />
<!--255--><!--255--><!--255--><!--255--><!--255--><!--255--><!--255--><!--255--><!--255--><!--255--><!--255--><!--255--><!--255--><!--255--><!--255--><!--255--><!--255--><!--255--><!--255--><!--255--><!--255--><!--255--></255></255>Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-1683167565288125702015-06-24T01:36:00.000-07:002015-06-24T01:40:58.104-07:00Arduino Color Sensor 顏色感應器 TCS230Arduino Color Sensor 顏色感應器 TCS230<br />
<br />
Pin 腳接法<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjugVd-ckIYpyp136c5nFbv_AtD2zr1etxi4TzJsm8SWXs7EgYDdJkuFgQ-4T87-B6GULKQzpxs54n3-knnPGwlaXGe80DvwLiAQUC7pu-t7r1bUTa3pxQ1xJ2tzyEaP9xkIz2p3Y9BFSVP/s1600/color_sensor.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="352" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjugVd-ckIYpyp136c5nFbv_AtD2zr1etxi4TzJsm8SWXs7EgYDdJkuFgQ-4T87-B6GULKQzpxs54n3-knnPGwlaXGe80DvwLiAQUC7pu-t7r1bUTa3pxQ1xJ2tzyEaP9xkIz2p3Y9BFSVP/s640/color_sensor.jpg" width="640" /></a></div>
<br />
<br />
<br />
#include <timerone .h=""></timerone><br />
<br />
#define S0 6 // Please notice the Pin's define<br />
#define S1 5<br />
#define S2 4<br />
#define S3 3<br />
#define OUT 2<br />
<br />
int g_count = 0; // count the frequecy<br />
int g_array[3]; // store the RGB value<br />
int g_flag = 0; // filter of RGB queue<br />
float g_SF[3]; // save the RGB Scale factor<br />
<br />
<br />
// Init TSC230 and setting Frequency.<br />
void TSC_Init()<br />
{<br />
pinMode(S0, OUTPUT);<br />
pinMode(S1, OUTPUT);<br />
pinMode(S2, OUTPUT);<br />
pinMode(S3, OUTPUT);<br />
pinMode(OUT, INPUT);<br />
<br />
digitalWrite(S0, LOW); // OUTPUT FREQUENCY SCALING 2%<br />
digitalWrite(S1, HIGH);<br />
}<br />
<br />
// Select the filter color<br />
void TSC_FilterColor(int Level01, int Level02)<br />
{<br />
if(Level01 != 0)<br />
Level01 = HIGH;<br />
<br />
if(Level02 != 0)<br />
Level02 = HIGH;<br />
<br />
digitalWrite(S2, Level01);<br />
digitalWrite(S3, Level02);<br />
}<br />
<br />
void TSC_Count()<br />
{<br />
g_count ++ ;<br />
}<br />
<br />
void TSC_Callback()<br />
{<br />
switch(g_flag)<br />
{<br />
case 0:<br />
Serial.println("->WB Start");<br />
TSC_WB(LOW, LOW); //Filter without Red<br />
break;<br />
case 1:<br />
Serial.print("->Frequency R=");<br />
Serial.println(g_count);<br />
g_array[0] = g_count;<br />
TSC_WB(HIGH, HIGH); //Filter without Green<br />
break;<br />
case 2:<br />
Serial.print("->Frequency G=");<br />
Serial.println(g_count);<br />
g_array[1] = g_count;<br />
TSC_WB(LOW, HIGH); //Filter without Blue<br />
break;<br />
<br />
case 3:<br />
Serial.print("->Frequency B=");<br />
Serial.println(g_count);<br />
Serial.println("->WB End");<br />
g_array[2] = g_count;<br />
TSC_WB(HIGH, LOW); //Clear(no filter) <br />
break;<br />
default:<br />
g_count = 0;<br />
break;<br />
}<br />
}<br />
<br />
void TSC_WB(int Level0, int Level1) //White Balance<br />
{<br />
g_count = 0;<br />
g_flag ++;<br />
TSC_FilterColor(Level0, Level1);<br />
Timer1.setPeriod(1000000); // set 1s period<br />
}<br />
<br />
void setup()<br />
{<br />
TSC_Init();<br />
Serial.begin(9600);<br />
Timer1.initialize(); // defaulte is 1s<br />
Timer1.attachInterrupt(TSC_Callback); <br />
attachInterrupt(0, TSC_Count, RISING); <br />
<br />
delay(4000);<br />
<br />
for(int i=0; i<3 i="" p=""> Serial.println(g_array[i]);<br />
<br />
g_SF[0] = 255.0/ g_array[0]; //R Scale factor<br />
g_SF[1] = 255.0/ g_array[1] ; //G Scale factor<br />
g_SF[2] = 255.0/ g_array[2] ; //B Scale factor<br />
<br />
Serial.println(g_SF[0]);<br />
Serial.println(g_SF[1]);<br />
Serial.println(g_SF[2]);<br />
<br />
}<br />
<!--3--><!--3--><!--3--><!--3--><!--3--><!--3--></3><br />
<br />
void loop()<br />
{<br />
g_flag = 0;<br />
for(int i=0; i<3 i="" p=""> Serial.println(int(g_array[i] * g_SF[i]));<br />
delay(4000);<br />
<br />
}<br />
<br />
<br />
<!--3--><br />
<div>
<br /></div>
<!--3--><!--3--><!--3--><!--3--><!--3--><!--3--></3>Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-69910220092856116672015-06-23T20:49:00.002-07:002015-10-03T06:24:10.197-07:00Arduino 與 步進馬達28BYJ-48 5v DC+ARDUINO MOTOR SHIELD L293D 驅動板Arduino 與 步進馬達28BYJ-48 5v DC+ARDUINO MOTOR SHIELD L293D驅動板 實做<br />
<br />
<a href="http://kowala21.blogspot.tw/2014/07/arduino-pro-mini-28byj-48-5vdc.html">網路資源</a><br />
<br />
零件清單<br />
1.Arduino UNO<br />
2.步進馬達28BYJ-48 5v DC<br />
3. 驅動板<br />
<br />
<br />
#include <stepper .h=""> <br /> #define STEPS 200 //定義步進馬達每圈的步數 </stepper><br />
<br />
//steps:代表馬達轉完一圈需要多少步數。如果馬達上有標示每步的度數, <br />
//將360除以這個角度,就可以得到所需要的步數(例如:360/3.6=100)。(int) <br />
<br />
//如果步進馬達只會往一個方向轉動,不會反轉把 pin 2 與 pin3 要交換接<br />
<br />
Stepper stepper(STEPS, 9, 10, 11, 12); <br />
<br />
void setup(){ <br />
stepper.setSpeed(140); // 將馬達的速度設定成140RPM 最大 150~160 <br />
} <br />
<br />
void loop(){ <br />
<br />
stepper.step(1600);//正8圈 <br />
delay(1000); <br />
stepper.step(-1600);//反8圈 <br />
delay(1000); <br />
<br />
} <br />
<br />
<br />
<br />
<br />
<br />
Part 2<br />
1.Arduino UNO<br />
2.直流馬達 DC Motor<br />
3.ARDUINO MOTOR SHIELD L293D<br />
<br />
<a href="http://blog.filipeflop.com/motores-e-servos/controle-motor-dc-arduino-motor-shield.html">網路資源</a> <a href="http://learn-program-blog.blogspot.tw/2014/03/arduino-adafruit-motor-shield.html">網路資源2</a> <a href="http://blog.xuite.net/chycahock/EDA/233258061-DIY%E6%89%8B%E6%A9%9FApp%E8%97%8D%E8%8A%BD%E9%81%99%E6%8E%A7%E8%BB%8A">網路資源3</a> <a href="http://blog.xuite.net/chycahock/EDA/230452643-DIY%E5%AF%A6%E4%BD%9CBlumoduino%E6%8E%A7%E5%88%B6%E6%9D%BF">網路資源4</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLcxKX5s-McZ3g3-3hnnoGaBqMB16JmMZQOmdcsUMk1-yg-Nl6wHD5shTmHNrmOLMrp6tEydM8vVsT3TnLfVnaIEfp_Psehv8MhUppyXm1yFfzquWPOA7FnQhznuuByW09cqPxV6cYt6_U/s1600/Arduino_Motor_Shield_L293D1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLcxKX5s-McZ3g3-3hnnoGaBqMB16JmMZQOmdcsUMk1-yg-Nl6wHD5shTmHNrmOLMrp6tEydM8vVsT3TnLfVnaIEfp_Psehv8MhUppyXm1yFfzquWPOA7FnQhznuuByW09cqPxV6cYt6_U/s640/Arduino_Motor_Shield_L293D1.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho6Uc3cn6eg5Obghbl17SCArhMGE9aekptbA7Lep_EMO1DqGsbrG3KJ9Aazrbq3sflvUtbWsfsYzemrj_e2jvQBJK4gDR06s7Gi5p8NiGiKuHPrCCqJ8o3Bl9NXwTlY1M_td16XjezGTCd/s1600/Circuito_Motor_Shield_com_motor_-DC_12v1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="402" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEho6Uc3cn6eg5Obghbl17SCArhMGE9aekptbA7Lep_EMO1DqGsbrG3KJ9Aazrbq3sflvUtbWsfsYzemrj_e2jvQBJK4gDR06s7Gi5p8NiGiKuHPrCCqJ8o3Bl9NXwTlY1M_td16XjezGTCd/s640/Circuito_Motor_Shield_com_motor_-DC_12v1.jpg" width="640" /></a></div>
<br />
在Arduino UNO 對應腳位Pine<br />
<br />
<span class="co2" style="background-color: #ecf1f1; box-sizing: border-box; font-family: 'TyponineSans Regular 18', 'Lucida Grande', Lucida, Verdana, sans-serif; font-size: 18px; line-height: 31.5px;">#define MOTO_M1_A 2</span><br />
<span class="co2" style="background-color: #ecf1f1; box-sizing: border-box; font-family: 'TyponineSans Regular 18', 'Lucida Grande', Lucida, Verdana, sans-serif; font-size: 18px; line-height: 31.5px;">#define MOTO_M1_B 3</span><br />
<span class="co2" style="background-color: #ecf1f1; box-sizing: border-box; font-family: 'TyponineSans Regular 18', 'Lucida Grande', Lucida, Verdana, sans-serif; font-size: 18px; line-height: 31.5px;">#define MOTO_M2_A 1</span><br />
<span class="co2" style="background-color: #ecf1f1; box-sizing: border-box; font-family: 'TyponineSans Regular 18', 'Lucida Grande', Lucida, Verdana, sans-serif; font-size: 18px; line-height: 31.5px;">#define MOTO_M2_B 4</span><br />
<span class="co2" style="background-color: #ecf1f1; box-sizing: border-box; font-family: 'TyponineSans Regular 18', 'Lucida Grande', Lucida, Verdana, sans-serif; font-size: 18px; line-height: 31.5px;">#define MOTO_M3_A 5</span><br />
<span class="co2" style="background-color: #ecf1f1; box-sizing: border-box; font-family: 'TyponineSans Regular 18', 'Lucida Grande', Lucida, Verdana, sans-serif; font-size: 18px; line-height: 31.5px;">#define MOTO_M3_B 7</span><br />
<span class="co2" style="background-color: #ecf1f1; box-sizing: border-box; font-family: 'TyponineSans Regular 18', 'Lucida Grande', Lucida, Verdana, sans-serif; font-size: 18px; line-height: 31.5px;">#define MOTO_M4_A 0</span><br />
<span class="co2" style="background-color: #ecf1f1; box-sizing: border-box; font-family: 'TyponineSans Regular 18', 'Lucida Grande', Lucida, Verdana, sans-serif; font-size: 18px; line-height: 31.5px;">#define MOTO_M4_B 6</span><br />
<br style="background-color: #ecf1f1; box-sizing: border-box; font-family: 'TyponineSans Regular 18', 'Lucida Grande', Lucida, Verdana, sans-serif; font-size: 18px; line-height: 31.5px;" />
<span class="co1" style="background-color: #ecf1f1; box-sizing: border-box; font-family: 'TyponineSans Regular 18', 'Lucida Grande', Lucida, Verdana, sans-serif; font-size: 18px; line-height: 31.5px;">// Arduino pins for the PWM signals.</span><br />
<span class="co2" style="background-color: #ecf1f1; box-sizing: border-box; font-family: 'TyponineSans Regular 18', 'Lucida Grande', Lucida, Verdana, sans-serif; font-size: 18px; line-height: 31.5px;">#define MOTOR1_PWM 11</span><br />
<span class="co2" style="background-color: #ecf1f1; box-sizing: border-box; font-family: 'TyponineSans Regular 18', 'Lucida Grande', Lucida, Verdana, sans-serif; font-size: 18px; line-height: 31.5px;">#define MOTOR2_PWM 3</span><br />
<span class="co2" style="background-color: #ecf1f1; box-sizing: border-box; font-family: 'TyponineSans Regular 18', 'Lucida Grande', Lucida, Verdana, sans-serif; font-size: 18px; line-height: 31.5px;">#define MOTOR3_PWM 6</span><br />
<span class="co2" style="background-color: #ecf1f1; box-sizing: border-box; font-family: 'TyponineSans Regular 18', 'Lucida Grande', Lucida, Verdana, sans-serif; font-size: 18px; line-height: 31.5px;">#define MOTOR4_PWM 5</span><br />
<span class="co2" style="background-color: #ecf1f1; box-sizing: border-box; font-family: 'TyponineSans Regular 18', 'Lucida Grande', Lucida, Verdana, sans-serif; font-size: 18px; line-height: 31.5px;">#define SERVO1_PWM 10</span><br />
<span class="co2" style="background-color: #ecf1f1; box-sizing: border-box; font-family: 'TyponineSans Regular 18', 'Lucida Grande', Lucida, Verdana, sans-serif; font-size: 18px; line-height: 31.5px;">#define SERVO2_PWM 9</span><br />
<br />
<br />
<br />
<br />
<br />
<br />
//使用直流馬達範例 DC Motor<br />
<br />
<div class="line number1 index0 alt2" style="background: none white !important; border-radius: 0px !important; border: 0px !important; bottom: auto !important; box-sizing: content-box !important; color: #777777; float: none !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 13px; font-stretch: inherit; height: auto !important; left: auto !important; line-height: 14.3000001907349px; margin: 0px !important; min-height: inherit !important; outline: 0px !important; overflow: visible !important; padding: 0px 1em !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; white-space: pre !important; width: auto !important;">
<span style="font-family: monospace;">#include <afmotor .h=""> //呼叫該函式庫</afmotor></span><br />
<br />
<span style="font-family: monospace;">AF_DCMotor motor(4, MOTOR12_64KHZ); // AF_DCMotor 變數名稱(第幾個馬達控制, 頻率)</span><br />
<span style="font-family: monospace;"> // Motor1 & Motor2 有這幾個頻率:</span><br />
<span style="font-family: monospace;"> // MOTOR12_64KHZ, MOTOR12_8KHZ,</span><br />
<span style="font-family: monospace;"> //MOTOR12_2KHZ, MOTOR12_1KHZ</span><br />
<span style="font-family: monospace;"> // </span><br />
<span style="font-family: monospace;"> // Motor3 & Motor4 有這幾個頻率:</span><br />
<span style="font-family: monospace;"> // MOTOR12_64KHZ, MOTOR12_8KHZ, MOTOR12_1KHZ</span><br />
<span style="font-family: monospace;"> //</span><br />
<span style="font-family: monospace;">void setup() {</span><br />
<span style="font-family: monospace;"> Serial.begin(9600); // set up Serial library at 9600 bps</span><br />
<span style="font-family: monospace;"> Serial.println("Motor test!");</span><br />
<span style="font-family: monospace;"> </span><br />
<span style="font-family: monospace;"> motor.setSpeed(200); // set the speed to 200/255</span><br />
<span style="font-family: monospace;">}</span><br />
<br />
<span style="font-family: monospace;">void loop() {</span><br />
<span style="font-family: monospace;"> Serial.print("tick");</span><br />
<span style="font-family: monospace;"> </span><br />
<span style="font-family: monospace;"> motor.run(FORWARD); // turn it on going forward</span><br />
<span style="font-family: monospace;"> delay(1000);</span><br />
<br />
<span style="font-family: monospace;"> Serial.print("tock");</span><br />
<span style="font-family: monospace;"> motor.run(BACKWARD); // the other way</span><br />
<span style="font-family: monospace;"> delay(1000);</span><br />
<span style="font-family: monospace;"> </span><br />
<span style="font-family: monospace;"> Serial.print("tack");</span><br />
<span style="font-family: monospace;"> motor.run(RELEASE); // stopped</span><br />
<span style="font-family: monospace;"> delay(1000);</span><br />
<span style="font-family: monospace;">}</span></div>
<br />
<br />
<br />
//使用步進馬達 Step Motor<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipEwlgGuL2WKmBkgacq66DkWUphpV7-aURScrzDE_lYlXqxgMEv5qnzQ6AgjQaeM1hhtbyvMjy-_KE905zhwhYdGsNnMm_8PCEGWTdKIW8feO74YWK3xiSO9YQNVkXgmPz_9M0GCefPVJ9/s1600/motor-shield-com-motor-de-passo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="442" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipEwlgGuL2WKmBkgacq66DkWUphpV7-aURScrzDE_lYlXqxgMEv5qnzQ6AgjQaeM1hhtbyvMjy-_KE905zhwhYdGsNnMm_8PCEGWTdKIW8feO74YWK3xiSO9YQNVkXgmPz_9M0GCefPVJ9/s640/motor-shield-com-motor-de-passo.jpg" width="640" /></a></div>
<br />
<br />
<br />
<span style="background-color: white; color: #666666; font-family: helvetica, arial, sans-serif; font-size: 13px; line-height: 17.42px;"> `stepsPerRevolution` 必須設定為你的馬達實際上一圈會有多少步,如果是 28BYJ-48 5V DC 的話,規格上寫著,步進角為 `5.625 / 64`,因此這馬達轉一圈需要的步數是 `360 / (5.625 / 64)`,也就是 `4096` 步,這是一/二相激磁才會有的步數,Stepper 程式庫原始碼它是採二相激磁的實作方式,因此,使用這個 Stepper 程式庫實際上要設的 `stepsPerRevolution` 是 `2048` 步</span><br />
<span style="background-color: white; color: #666666; font-family: helvetica, arial, sans-serif; font-size: 13px; line-height: 17.42px;"><br /></span>
<span style="background-color: white; color: #666666; font-family: helvetica, arial, sans-serif; font-size: 13px; line-height: 17.42px;">PWR Jumper 短路(套上)的話會對 Arduino UNO 板供電5V</span><br />
<span style="background-color: white; color: #666666; font-family: helvetica, arial, sans-serif; font-size: 13px; line-height: 17.42px;"><br /></span>
<br />
#include <afmotor .h=""></afmotor><br />
#include <servo .h=""></servo><br />
<br />
#define SERVO1_PWM 10<br />
#define SERVO2_PWM 9<br />
<br />
double passos_total = 2048; //Numero de passos para 1 rotacao total<br />
<br />
int porta_motor = 2; //1 para motor em M1/M2 e 2 para motor em M3/M4<br />
int angulo = 30; //Angulo de rotacao do eixo<br />
<br />
double numero_de_passos = 0; //Armazena o numero de passos que o motor vai girar<br />
<br />
AF_Stepper arduino(passos_total, porta_motor); //Define os parametros do motor<br />
Servo servo_1;<br />
<br />
void setup()<br />
{<br />
arduino.setSpeed(10); //Define a velocidade de rotacao<br />
Serial.begin(9600);<br />
servo_1.attach(SERVO1_PWM);<br />
}<br />
<br />
void loop()<br />
{<br />
//Calcula a quantidade de passos, baseado no angulo determinado<br />
numero_de_passos = angulo / (360 / passos_total);<br />
//170.67/步<br />
<br />
servo_1.write(0); <br />
delay(1000);<br />
servo_1.write(180);<br />
delay(2000);<br />
<br />
//Mostra no serial monitor o numero de passos calculados<br />
Serial.println(numero_de_passos);<br />
<br />
//Move o motor. Use FORWARD para sentido horario,<br />
//BACKWARD para anti-horario<br />
for(int i=0;i<=5;i++){<br />
arduino.step(numero_de_passos, FORWARD, SINGLE);<br />
arduino.release();<br />
}<br />
delay(2000);<br />
<br />
for(int i=0;i<=5;i++){<br />
arduino.step(numero_de_passos, BACKWARD, SINGLE);<br />
arduino.release();<br />
}<br />
delay(2000);<br />
}<br />
<br />
<br />
//---------------------------------------------------------<br />
<br />
#include <afmotor .h=""></afmotor><br />
AF_Stepper motor(48, 2); <span style="color: #274e13; font-family: tahoma, arial, Hiragino Sans GB, sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 21px;"><b>//</b></span></span><span style="background-color: #f3f3f3;">48表示每圈的步數(360度/步距角,48的步距角為7.5度)</span><br />
<span style="background-color: #f3f3f3;"> //</span><span style="background-color: #f3f3f3;">2表示第二路步進電機(共支持兩路)</span><br />
<div>
void setup() {<br />
Serial.begin(9600); // set up Serial library at 9600 bps<br />
Serial.println("Stepper test!");<br />
motor.setSpeed(10); // 10 rpm<br />
motor.step(100, FORWARD, SINGLE);<br />
motor.release();<br />
delay(1000);<br />
}<br />
void loop() {<br />
motor.step(100, FORWARD, SINGLE);<br />
motor.step(100, BACKWARD, SINGLE);<br />
motor.step(100, FORWARD, DOUBLE);<br />
motor.step(100, BACKWARD, DOUBLE);<br />
motor.step(100, FORWARD, INTERLEAVE);<br />
motor.step(100, BACKWARD, INTERLEAVE);<br />
motor.step(100, FORWARD, MICROSTEP);<br />
motor.step(100, BACKWARD, MI<br />
}</div>
Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-11259421406495984452015-05-22T06:49:00.003-07:002015-11-18T21:49:05.560-08:00Arduino 第一次入手玩了一陣子樂高Lego Mindstorms機器人,看到arduino資料得知這是自由度很高的電子套件由一片開放的電路板跟一大堆的感應器、馬達可以組合千變萬化的作品。<br />
<br />
基於好奇下上網買了一些零件<br />
Arduino Uno R3<br />
arduino sensor shield v5.0<br />
Ultarsonic<br />
Servo Motor<br />
<b>arduino bluetooth hc-05</b><br />
<b>一把杜邦線</b><br />
<b><br /></b>
<b>Arduino Ide </b><b>軟體 <a href="http://openhome.cc/Gossip/Books/mBlockArduino1-3and1-4.html#1-3" target="_blank">Arduino UNO 完整介紹(一定要詳細閱讀)</a></b><br />
<b><br /></b>
<b>有了上面這些軟硬體就可以開工了。</b><br />
<b><br /></b>
<b>我完全沒有電子經驗因此第一次看到電路板跟看到樂高機器人是完全不同的感受,首先VCC、GRD要先爬文才能知道是要作什麼的。</b><br />
<b><br /></b>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLmh9lJ2RbDdmB27iosyrR2-1VlWwbBdWpG8ZxZg30gSjpHxBsMemxFO7LWSHpzKnkz8iUNdOSRP4P1Tb2idBlgG1WNUYQchGifDVlInIKgim4W2L5YVggbK8yG9a_gRmLnzmRNyyCC5CT/s1600/Arduino-callouts1.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="406" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLmh9lJ2RbDdmB27iosyrR2-1VlWwbBdWpG8ZxZg30gSjpHxBsMemxFO7LWSHpzKnkz8iUNdOSRP4P1Tb2idBlgG1WNUYQchGifDVlInIKgim4W2L5YVggbK8yG9a_gRmLnzmRNyyCC5CT/s640/Arduino-callouts1.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Arduino Uno 主要功能說明</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqj7wngTpXtfdqXT0HyL9oheENOS2soEvxhtCjkyVdurVBFX1Ey1Ccg0PGdDmo_YumPKBP8NcQ9s33hxPrPkU-FW5lA1pfYJD5kSD7UiL-OiKYmM9AP4fHph2SRjSHO6hoxOoMopXNO_xn/s1600/uno_cast.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqj7wngTpXtfdqXT0HyL9oheENOS2soEvxhtCjkyVdurVBFX1Ey1Ccg0PGdDmo_YumPKBP8NcQ9s33hxPrPkU-FW5lA1pfYJD5kSD7UiL-OiKYmM9AP4fHph2SRjSHO6hoxOoMopXNO_xn/s640/uno_cast.jpg" width="522" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Arduino Uno R3 跟上面那塊有點不同</td></tr>
</tbody></table>
<b><br /></b>
<b><br /></b>
<b><br /></b>
<b><br /></b>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN1t5YXpsVjYGOVqOwOrbz6KJWqmTvOncUOcZO38JwKD9BSgqAwRZnJvUcnQt6H44W9Xd9CqcNSuEcv5spToOks2tg3mSihVn7AuWGcPUyfDIm_zISLTJKgVMI1B7xH6GIfp_fMThiiP9U/s1600/sensorshield.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="626" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN1t5YXpsVjYGOVqOwOrbz6KJWqmTvOncUOcZO38JwKD9BSgqAwRZnJvUcnQt6H44W9Xd9CqcNSuEcv5spToOks2tg3mSihVn7AuWGcPUyfDIm_zISLTJKgVMI1B7xH6GIfp_fMThiiP9U/s640/sensorshield.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: xx-small; text-align: start;">arduino sensor shield v5.0 各接腳說明</span></td></tr>
</tbody></table>
<b><br /></b>
<b><br /></b>
<b>一堆電子名詞都是先Google才能知道,總之查到什麼都先紀錄下來</b><br />
<b><br /></b>
<br />
<div class="p1">
<span class="s1">RC 伺服馬達(Radio Controlled Servo Motor) 大部份是透過 PWM (Pulse Width Modulation, 脈波寬度調變)來控制,Arduino 裏內建了 Servo Library 讓程式開發容易上手</span><br />
<span class="s1"><br /></span>
<span class="s1">TG-90 servo 有180度的限制</span>
<span class="s1"> </span><br />
<span class="s1">Parallax 連續旋轉伺服機:沒有角度限制</span><br />
<span class="s1"><br /></span>
<span class="s1"><br /></span>
<br />
<div class="p1">
<span class="s1">void</span><span class="s2"> </span><span class="s3"><b>loop</b></span><span class="s4">()</span></div>
<div class="p2">
<span class="s1">{</span></div>
<div class="p3">
<span class="s2"> </span><span class="s5">int</span><span class="s2"> </span><span class="s4">analogValue = </span><span class="s3"><b>analogRead</b></span><span class="s4">(A0); </span><span class="s1">// read the analog input</span></div>
<div class="p2">
<span class="s6"> </span><span class="s1">Serial.println(analogValue); </span><span class="s7">// print it</span></div>
<div class="p4">
<br /></div>
<div class="p3">
<span class="s2"> </span><span class="s1">// if your sensor's range is less than 0 to 1023, you'll need to</span></div>
<div class="p3">
<span class="s2"> </span><span class="s1">// modify the map() function to use the values you discovered:</span><br />
<span class="s1">//把可變電組的數值0~1023等比例轉化RC Servo 0 ~ 179度</span></div>
<div class="p2">
<span class="s6"> </span><span class="s5">int</span><span class="s6"> </span><span class="s1">servoAngle = </span><span class="s3"><b>map</b></span><span class="s1">(analogValue, 0, 1023, 0, 179);</span></div>
<div class="p4">
<br /></div>
<div class="p3">
<span class="s2"> </span><span class="s1">// move the servo using the angle from the sensor:</span></div>
<div class="p2">
<span class="s6"> </span><span class="s1">servoMotor.write(servoAngle);</span></div>
<span class="s1">
</span><br />
<div class="p2">
<span class="s1">}</span></div>
</div>
<b><br /></b>
<b><br /></b>
<b><br /></b>
<b><a href="http://blog.xuite.net/chycahock/EDA/225365055-Android%E8%88%87Arduino%E7%9A%84%E8%97%8D%E8%8A%BD%E9%80%9A%E8%A8%8A">Arduino 藍芽與手機互傳訊息</a></b><br />
<br />
<div style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.8500003814697px; line-height: 20.7900009155273px;">
<span style="background-color: white;">藍芽模組的LED燈號:</span></div>
<div style="background-color: white; color: #333333;">
<ul style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.8500003814697px; line-height: 1.4; margin: 0.5em 0px; padding: 0px 2.5em;">
<li style="border: none; margin: 0px 0px 0.25em; padding: 0px;">連續的快閃:藍芽等待配對中</li>
<li style="border: none; margin: 0px 0px 0.25em; padding: 0px;">連續的快閃2下後停1下:藍芽已配對成功,運作中</li>
<li style="border: none; margin: 0px 0px 0.25em; padding: 0px;">連續慢速閃爍<span style="font-family: "arial" , sans-serif; font-size: 16px; line-height: 24.9600009918213px;">(約兩秒一次):藍芽已進入AT模式,準備設定</span></li>
</ul>
<div>
<span style="font-family: "arial" , sans-serif;"><span style="line-height: 24.9600009918213px;"><br /></span></span></div>
<div>
<span style="font-family: "arial" , sans-serif;"><span style="line-height: 24.9600009918213px;"><a href="http://blog.cavedu.com/?s=%E9%9B%99a">Android 與 Arduio 文章</a></span></span><br />
<span style="font-family: "arial" , sans-serif;"><br /></span>
<span style="font-family: "arial" , sans-serif;"><a href="http://swf.com.tw/?p=759">網昱多媒體資料</a></span><br />
<br />
<a href="http://here-apps.blogspot.tw/2014/07/lab2-arduino.html">Android 與 Arduino透過BT讀取資料</a><br />
<br />
<a href="http://blog.cavedu.com/programming-language/appinventor/%E9%9B%99a%E8%A8%88%E7%95%ABpart6%EF%BC%9Aarduino-%E5%82%B3%E5%85%A9%E7%AD%86%E8%B3%87%E6%96%99%E5%88%B0-android-%E6%89%8B%E6%A9%9F/">Cave的雙A計畫</a><br />
<br />
<a href="http://www2.lssh.tp.edu.tw/~hlf/class-1/lang-c/var-char.htm">C語言字元說明</a></div>
</div>
<br />
<b><br /></b>
<b><br /></b>
Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com3tag:blogger.com,1999:blog-2060556553119948421.post-67433952446995388022015-05-04T02:37:00.001-07:002015-05-05T18:49:37.716-07:00網路上有趣的樂高模型分享<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/r8s6GkPP5EM" width="560"></iframe><br />
<br />
<br />
<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/UwpghsdmDsE" width="560"></iframe><br />
<br />
<br />
<br />
<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/iOLFP90DneY" width="560"></iframe><br />
<a href="http://7inkit.blogspot.tw/2014/03/tink-arduinoservo-motor-plotclock.html" target="_blank">也有用Arduino做成的模型與資料分享有興趣的人可以研究一下</a><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/4wEJ1Tk4K30" width="560"></iframe><br />
<br />
<br />
<br />
<br />
<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/6xCd55oSgO4" width="560"></iframe><br />
<br />
<br />
<br />
<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/b5E-VyQOfNM" width="560"></iframe>Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-37270837506172039512015-04-27T19:31:00.001-07:002015-04-30T20:52:48.783-07:00兩台樂高機器人NXT 分工合作<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
這次要做的題目是2台樂高機器人NXT 分工合作,而且盡可能把感應器都裝在NXT上這樣在程式設計時就能互相運用做出多樣化的動作與目的。<br />
<br />
<br />
<br />
<b><span style="color: #990000;">第一台樂高NXT機器人</span></b>是「履帶車輛」,前面安裝超音波感應器(UltraSonic Sensor)與光線感應器(Light Sensor),後面安裝爪子與顏色感應器(Color Sensor)。<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfPuj_2xxn02SxzLwTVPW7eqrEAM-Wbkmgqc6S55Imx4OqTt9KbcNjyppCHVg-w0b77-fqCOmSmJeRmStlpSs7JrfmAsQSYCClo-D1E_yUjsaXtA_8C8WY3pidjWusNUBGvftsBqB30yB2/s1600/IMGP0005_2.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfPuj_2xxn02SxzLwTVPW7eqrEAM-Wbkmgqc6S55Imx4OqTt9KbcNjyppCHVg-w0b77-fqCOmSmJeRmStlpSs7JrfmAsQSYCClo-D1E_yUjsaXtA_8C8WY3pidjWusNUBGvftsBqB30yB2/s1600/IMGP0005_2.jpg" height="422" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><div style="font-size: medium; text-align: start;">
超音波感應器:負責偵測前方式否有物體存在。</div>
<div style="font-size: medium; text-align: start;">
光線感應器:負責車輛行駛在黑色路線軌跡上。</div>
</td></tr>
</tbody></table>
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkB0meiScQNcNO6q5oh6ULwdkA9ftBgpLDyTnomi9Tg1WOs2HDY5yrX_9vMKX-9OdLmqkRP8oT5unnrnLNOGg0Ae_RB9ZHdD5ZWGkai-s9d-TY4KTPQeQWZXPIkkvxWdnPZ_myU7mYIY12/s1600/IMGP0003_2.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkB0meiScQNcNO6q5oh6ULwdkA9ftBgpLDyTnomi9Tg1WOs2HDY5yrX_9vMKX-9OdLmqkRP8oT5unnrnLNOGg0Ae_RB9ZHdD5ZWGkai-s9d-TY4KTPQeQWZXPIkkvxWdnPZ_myU7mYIY12/s1600/IMGP0003_2.jpg" height="422" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: xx-small; text-align: start;">顏色感應器:負責偵測地面上特定顏色做出對應事件動作。</span></td></tr>
</tbody></table>
<br />
<br />
<br />
<br />
<br />
<br />
<b><span style="color: #990000;">第二台樂高NXT機器人</span></b>是「機械手臂」,安裝超音波感應器(UltraSonic Sensor)或碰觸感應器(Touch Sensor)負責偵測是否有物品需要抓取。<br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSl79EuQgM1SNF_dsqgup2rc5938GEj1MGuxVWsc0ejFCuTx4D5EnxVYot8-oL84in-pqChYOHmP04QG7omfL-isIV82SElcK-rDufBVfGCLuZ9X6ocLICstjJdgMXIobZfz-7OUxhFuaP/s1600/IMGP0021_2.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSl79EuQgM1SNF_dsqgup2rc5938GEj1MGuxVWsc0ejFCuTx4D5EnxVYot8-oL84in-pqChYOHmP04QG7omfL-isIV82SElcK-rDufBVfGCLuZ9X6ocLICstjJdgMXIobZfz-7OUxhFuaP/s1600/IMGP0021_2.jpg" height="422" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: xx-small; text-align: start;">三顆樂高馬達(Motor)使用內建的角度偵測,所以抓取與放置都能固定在特定位置上。</span></td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhE6mA4aS54b3V0fA0TIOKmcDqXWrnfbv2MeclE1cgRe3YA2tlcFOl_WUavDLK_qMP4PEFG-idF-cvDnYR5HGR9fYQknIJNoxcxTWb5vH9Bvlc49bPZUHCoXplwmc5aJOD3loVquy214Bva/s1600/IMGP0012.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhE6mA4aS54b3V0fA0TIOKmcDqXWrnfbv2MeclE1cgRe3YA2tlcFOl_WUavDLK_qMP4PEFG-idF-cvDnYR5HGR9fYQknIJNoxcxTWb5vH9Bvlc49bPZUHCoXplwmc5aJOD3loVquy214Bva/s1600/IMGP0012.jpg" height="422" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">第二顆升降馬達與第三顆抓取馬達構造圖</td></tr>
</tbody></table>
<br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidPYAt0AZ8NXktANTkEf_mYAZt5yXO0SG9N3KdQdu4cnYdMhwTa0zUM8ykirNLpkv4aaFc9dd_tLostPp3kHzsn8gV18TsIMfZoGEAVtiUt4zqqnRZIGO1adR6_HK17l9tDLUDOsOqEnqY/s1600/IMGP0014.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidPYAt0AZ8NXktANTkEf_mYAZt5yXO0SG9N3KdQdu4cnYdMhwTa0zUM8ykirNLpkv4aaFc9dd_tLostPp3kHzsn8gV18TsIMfZoGEAVtiUt4zqqnRZIGO1adR6_HK17l9tDLUDOsOqEnqY/s1600/IMGP0014.jpg" height="422" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">第一顆<span style="font-size: 12.8000001907349px;">轉向</span><span style="font-size: 12.8000001907349px;">馬達與第二顆升降</span><span style="font-size: 12.8000001907349px;">馬達齒輪連結</span></td></tr>
</tbody></table>
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKSQotP3bzoi-MENWZ1ZstQSGnOFwydqbDZ82HZ5Tk88ZMRgyJWj5F2k308PeRum4fkeDJfQabC4F06IEdbESpaY5ILFoAEfrx8lSNH8kDyCSaeKW9IbPITnGkVyq3I7HKgc8eJEZ0BaC0/s1600/IMGP0015.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKSQotP3bzoi-MENWZ1ZstQSGnOFwydqbDZ82HZ5Tk88ZMRgyJWj5F2k308PeRum4fkeDJfQabC4F06IEdbESpaY5ILFoAEfrx8lSNH8kDyCSaeKW9IbPITnGkVyq3I7HKgc8eJEZ0BaC0/s1600/IMGP0015.jpg" height="422" width="640" /></a></div>
<br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF-gaFQrGhqEDtPJkZ_J2prlV5z9dpMiNgC95tzQ6k-BH4ytXPpLydm2esb-1SA-jtbNTopVopk-vzNR10w9fdCGRRe_9DUDw2cTKMbMfDs_2DSu2lvRcKf60XxAUjkNxUZE8S_dU_5JV6/s1600/IMGP0017.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF-gaFQrGhqEDtPJkZ_J2prlV5z9dpMiNgC95tzQ6k-BH4ytXPpLydm2esb-1SA-jtbNTopVopk-vzNR10w9fdCGRRe_9DUDw2cTKMbMfDs_2DSu2lvRcKf60XxAUjkNxUZE8S_dU_5JV6/s1600/IMGP0017.jpg" height="422" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: left;">當第三顆馬達抓取物品時齒輪經過轉向帶動下個齒輪與傳動軸會產生其它方向應力讓零件慢慢位移是甚至解體,因此在組裝上必須考量結構強度與預防零組件位移措施。</td></tr>
</tbody></table>
<br />
<br />
int iTch=Motor.A.getTachoCount(); //讀取A馬達角度值<br />
Motor.A.resetTachoCount(); //重設A馬達角度值<br />
<br />
<br />
<b>測試步驟:</b><br />
<br />
1. Android手機與第一台樂高機器人藍芽連結並啟動NXT程式(非必要性只是測試Android手機與樂高機器人的互動)<br />
<br />
2.光線感應器先偵測黑色與白色的反射數值當作黑色軌跡路線的判斷標準<br />
<br />
3.當第一台NXT在軌跡路線上(PID)運行時,如果超音波感應器遇到前方12公分內有物品時,車輛迴轉180度讓後方的爪子去抓取物品,抓取物品後車輛再迴轉180度繼續在軌跡路線上前進,此時顏色感應器啟動偵測路面上是否有顏色標示。<br />
<br />
4.當顏色感應器偵測到特定顏色時開始執行「放置物品」的對應動作<br />
<br />
<br />
<span style="color: #990000;">綠色</span>:「右轉」直行一段距離放在固定位置,此時第二台樂高機器人的超音波感應器或碰觸感應器被觸動執行抓取物品然後放在固定位置(預計放在黑色路線上讓第一台樂機器人繼續抓取),如此一直無線迴圈讓兩台樂高機器人一直運作。(外加動作是BT向手機傳遞訊息如顏色)<br />
<br />
<span style="color: #990000;">藍色</span>:不動作<br />
<br />
<span style="color: #990000;">紅色</span>:不動作<br />
<br />
<span style="color: #990000;">黃色</span>:不動作<br />
<br />
<br />
5.當遇到「綠色」標示時第一台NXT會右轉後前進一段距離放置物品再回到黑色軌跡路線上,此時第二台NXT機器手臂的超音波感應器或碰觸感應器會偵測到有物品需要抓取,因此啟用抓取程式讓NXT機器手臂移動物品放置。<br />
<br />
<br />
<b>硬體與軟體</b><br />
<b><br /></b>
硬體組裝:用樂高零件組裝結構性與強度足夠的「履帶車輛」與「機器手臂」。<br />
<br />
軟體設計:按照測試流程來設計程式,第一台樂高NXT動作多程式比較複雜,第二台樂高機器手臂動作固定程式碼較少。<br />
<br />
Lejos 是架構在 Java語言下因此程式結構與延伸完整,本次程式設計運用行為模式(Behavior)因此可以把軌跡車、超音波偵測、顏色偵測等各自撰寫獨立的Class測試,最後再定義各種動作(軌蹟車、超音波、顏色感應)的優先順序一起整合運用,擺除以往把3顆馬達、所有Sensor動作與變數檢查都寫在一起有時候都不知道是那個環節出錯( Debug花費時間比寫程式還多)。<br />
<br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEhPL8g1xuXDePnrPyjfbC00HFqF7XpU5XyyvoXqFI2yQr7TGZ67II3TVVO1aK_IEfweh6Ddxp9gmHInRh8EkOJlgXisy_JxgkAbpA0hXv6Yehyphenhyphenog4V_IsSZ-ldI3iP1BCUDgFRgKCCTtE/s1600/IMGP0008.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEhPL8g1xuXDePnrPyjfbC00HFqF7XpU5XyyvoXqFI2yQr7TGZ67II3TVVO1aK_IEfweh6Ddxp9gmHInRh8EkOJlgXisy_JxgkAbpA0hXv6Yehyphenhyphenog4V_IsSZ-ldI3iP1BCUDgFRgKCCTtE/s1600/IMGP0008.jpg" height="422" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">DIY場地:各色膠帶 + 白色真珠板.....準備測試。</td></tr>
</tbody></table>
<br />
<br />
<br />
<br />
<b>YouTube影片資料</b><br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/ZswudPq2LOw" width="560"></iframe><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-83332346348498552902015-04-14T07:48:00.001-07:002015-04-14T07:51:05.037-07:00Android手機方向感應器與樂高NXT配合應用當手機有方向感應器(ORIENTATION)能分辨東西南北時便可以把資訊分享給樂高NXT機器人作為判斷方向的用途<br />
<br />
首先要了解Android方向感應器的三個數值的定義eventvalue<br />
<br />
方位角 Value[0]:0代表北方、90代表東方、270代表西方、180代表南方 .............共360度<br />
<br />
南北向 Value[1]:南北旋轉向...手機水平螢幕朝上=(0)、手機直立=(-90)、手機倒立=(90)、手機水平螢幕朝下=(正負180)<br />
<br />
東西向 Value[2]:東西向旋轉...手機水平螢幕朝上=(0)、手機向右翻(-90)、手機向左翻(90)、手機水平螢幕朝下=(0)<br />
<br />
方向感應器與3軸加速器的不同處在於方向感應器有「方位角」因此能分辨東西南北。Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-1920129832347751102015-04-10T22:04:00.000-07:002015-04-11T00:09:34.328-07:00Android 三軸加速感應器與 Lego NXT 應用Android 手機裡面有個Accelerometer 加速感應器,它的作用就是能即時知道手機的移動或翻轉位置狀態如下圖所示<br />
<br />
X軸為「左右翻轉」的加速度<br />
Y軸為「前後翻轉」的加速度<br />
Z軸為「上下移動」的加速度<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWaO17V-3Kapd-FOeTofm4n66uHm6VZgli1cTD9HIhcDHjaR3tKFog84sQQmeCVbrXasjYuADIvuQ68T5dOsZF-B04Cd4iin3jHusc97OxPJuBZRTD6i0xTLBXa4M8JHY2ggap3upcQ7bq/s1600/ACCELEROMETER.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWaO17V-3Kapd-FOeTofm4n66uHm6VZgli1cTD9HIhcDHjaR3tKFog84sQQmeCVbrXasjYuADIvuQ68T5dOsZF-B04Cd4iin3jHusc97OxPJuBZRTD6i0xTLBXa4M8JHY2ggap3upcQ7bq/s1600/ACCELEROMETER.jpg" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
利用這個特性我們就可控制 Lego NXT 在行走時能左右轉或是加速、煞車、前進、後退</div>
<div class="separator" style="clear: both; text-align: left;">
X軸往左翻負值、往右翻正直--->控制車子左右轉 value:-10<=X軸<=10<x p=""></x></div>
<div class="separator" style="clear: both; text-align: left;">
Y軸往前翻負值、往後翻正直--->控制車子往前加速 往後煞車 value:-10<=Y軸<=10<y p=""></y></div>
<div class="separator" style="clear: both; text-align: left;">
Z軸目前用不著</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhccE6fYWNbzkOTQu63x1ApGx4Ndvm0mhBkzpFb0CpHOp7molccJS1hVgOMX_5WlL_y7VsEhPERF5J5LrBLBH8Ew2tzzkQiqLyr2KjS35zwhpNhNhveLLnrFnrpWiuSgP03rWxNO7T6yaH3/s1600/Screenshot_2015-04-11-13-27-44.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhccE6fYWNbzkOTQu63x1ApGx4Ndvm0mhBkzpFb0CpHOp7molccJS1hVgOMX_5WlL_y7VsEhPERF5J5LrBLBH8Ew2tzzkQiqLyr2KjS35zwhpNhNhveLLnrFnrpWiuSgP03rWxNO7T6yaH3/s1600/Screenshot_2015-04-11-13-27-44.png" height="640" width="360" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="" style="clear: both; text-align: left;">
App執行後的步驟</div>
<div class="" style="clear: both; text-align: left;">
1.把樂高NXT啟動、藍芽開啟並執行程式等待手機App的藍芽連結此時顯示「Waiting」。</div>
<div class="" style="clear: both; text-align: left;">
2.按下App「藍芽連結」鈕如果找到樂高NXT並連結成功後會顯示「Connected」,樂高會把爪子打開後關閉一次代表連結成功。</div>
<div class="" style="clear: both; text-align: left;">
3.啟動App讀取手機上的三軸加速器資料,並把資料傳給樂高NXT接收與執行對應動作</div>
<div class="" style="clear: both; text-align: left;">
A.X軸在正負2的數值內保值前進或後退,超過正負2代表要樂高要左轉或右轉</div>
<div class="" style="clear: both; text-align: left;">
B.Y軸在直立超過9時代表樂高NXT要停止不動,其餘時候是前進或後退</div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqljhr1YR3iaZCINOzuQ153Wg_-ky4h33z97awzi8fvSkkYmhP35u4AeCUgB0wma2y546S6GiexE2blJei4wzepdmHhKEtknzD1llwtlRDkT7mThfYrLdyARFT0i5jOa5oBPbFWnrFOW1p/s1600/Screenshot_2015-04-11-11-41-32.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqljhr1YR3iaZCINOzuQ153Wg_-ky4h33z97awzi8fvSkkYmhP35u4AeCUgB0wma2y546S6GiexE2blJei4wzepdmHhKEtknzD1llwtlRDkT7mThfYrLdyARFT0i5jOa5oBPbFWnrFOW1p/s1600/Screenshot_2015-04-11-11-41-32.png" height="640" width="360" /></a></div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi18wuIYb0W7NZtE-eoAoGGNu6L_VGmoZOtIbbr83aR8wL76csLqHKy0FrOgELDx6gH7G2wXS10gDpH_OeGxQHmthAfRx1HCVuXqxpquh4b6PWRMnhi6Epo7FHMNfi9i-kNxF2EumczF7p3/s1600/DSC09213.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi18wuIYb0W7NZtE-eoAoGGNu6L_VGmoZOtIbbr83aR8wL76csLqHKy0FrOgELDx6gH7G2wXS10gDpH_OeGxQHmthAfRx1HCVuXqxpquh4b6PWRMnhi6Epo7FHMNfi9i-kNxF2EumczF7p3/s1600/DSC09213.jpg" height="358" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvRfaZhI89Tu2cFiKDHcbtSRVpWJugoFF2qeBorbnp4PvG_d985n2oKFFMTI1cj_AStzcrTL267XdEOnoiOmzwhghLYGoX-xwG1Sw-cdGZuD-VrD9U2t7Nzhn3BcJgB-dwNyzs-RcxjsCt/s1600/DSC09208.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvRfaZhI89Tu2cFiKDHcbtSRVpWJugoFF2qeBorbnp4PvG_d985n2oKFFMTI1cj_AStzcrTL267XdEOnoiOmzwhghLYGoX-xwG1Sw-cdGZuD-VrD9U2t7Nzhn3BcJgB-dwNyzs-RcxjsCt/s1600/DSC09208.jpg" height="358" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqNtbH9R2vKymM-IwWnLkO0JC_6RKwGJdlYISJw-ehBVh-mwJsOW5fsl-uXgXirWmYzzInBEDZF667X7Deqbpnk_fmNZ7-dOJAUxyphyz_pLLqzE8NFxDNi-3FeYwfyqcv-stEGDlrW08D/s1600/DSC09209.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqNtbH9R2vKymM-IwWnLkO0JC_6RKwGJdlYISJw-ehBVh-mwJsOW5fsl-uXgXirWmYzzInBEDZF667X7Deqbpnk_fmNZ7-dOJAUxyphyz_pLLqzE8NFxDNi-3FeYwfyqcv-stEGDlrW08D/s1600/DSC09209.jpg" height="358" width="640" /></a></div>
<br />
<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/RM4H0zZFfqU" width="560"></iframe><br />
<br />
<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/34hyY97PCvA" width="560"></iframe><br /></div>
Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com0tag:blogger.com,1999:blog-2060556553119948421.post-15540291325811395782015-04-09T01:59:00.000-07:002015-04-09T21:07:56.968-07:00Android 手機透過藍芽與 NXT Lejos 應用<div class="separator" style="clear: both; text-align: center;">
</div>
NXT主機上有藍芽BlueTooth因此能傳送與接收其他裝置的藍芽資料,本篇要實做用一般常見的Android手機與Lego NXT主機透過藍芽做資料交換。<br />
<br />
準備的物件<br />
1.Android手機一隻新舊款沒關係但要有藍芽功能。<br />
2.Lego Mindstorms NXT 或EV3,馬達3顆接 A、B、C Port<br />
3.先將手機與NXT 的藍芽都打開,讓手機尋找NXT主機內定密碼為1234,連結成功後手機上就有這台NXT的資訊與名字作為手機App要連結的目標。<br />
<br />
由於Android手機有很多Sensor如重力感應器、方向感應器、光線感應器、GPS等如能加以應用等於幫NXT省下不少外購Sensor費用。<br />
<br />
如果大家有淘汰的Android手機可以試試看本篇的應用。<br />
<br />
<span style="font-size: large;"><span style="color: #990000;">第</span><span style="color: #990000;">一部份開發 Android App程式:</span></span><br />
<br />
我在App主畫面上放了 9個 Button以方便未來擴充應用<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3B21BmU9YrpayG1Ys-SfyfFPG25duabIFe08nWwLRUtA-CkxpuUzBgBNdi0ZwXdBZ3ZQm3H2dvJF1dC6eP7FaeqWpLlp4AugKjpASJi7DYKwodHBaVGt1KaZ4iSpSShnqQkhgpcNm5NaS/s1600/Screenshot_2015-04-10-12-03-05.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3B21BmU9YrpayG1Ys-SfyfFPG25duabIFe08nWwLRUtA-CkxpuUzBgBNdi0ZwXdBZ3ZQm3H2dvJF1dC6eP7FaeqWpLlp4AugKjpASJi7DYKwodHBaVGt1KaZ4iSpSShnqQkhgpcNm5NaS/s1600/Screenshot_2015-04-10-12-03-05.jpg" height="640" width="360" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">執行 App 程式的主畫面</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbTPX1E0f3AWwxLmqLX5VU5-GDXF98XBjG47VGfXBR38XcRLBjhbcfGsVXhWCwdQzFTlP_Y3R9JupnovlFnqvHFC3d3NXs3v_i-y10wchGctojsVt1dHOWzYRw_jX_h44RB8U9qvzsOTkA/s1600/Screenshot_2015-04-10-11-50-47.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbTPX1E0f3AWwxLmqLX5VU5-GDXF98XBjG47VGfXBR38XcRLBjhbcfGsVXhWCwdQzFTlP_Y3R9JupnovlFnqvHFC3d3NXs3v_i-y10wchGctojsVt1dHOWzYRw_jX_h44RB8U9qvzsOTkA/s1600/Screenshot_2015-04-10-11-50-47.jpg" height="640" width="360" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">顯示手機上 Sensor 資訊</td></tr>
</tbody></table>
<br />
<br />
<br />
<br />
原始碼如下:開發環境 Eclipse 與 Android、Lejos套件<br />
<br />
package com.example.lego_android;<br />
<br />
import android.app.Activity;<br />
import android.os.Bundle;<br />
import android.util.DisplayMetrics;<br />
import android.view.Menu;<br />
import android.view.MenuItem;<br />
import android.view.View;<br />
import android.view.View.OnClickListener;<br />
import android.widget.LinearLayout;<br />
import android.graphics.Color;<br />
import android.view.Window;<br />
import android.widget.*;<br />
import android.graphics.drawable.Drawable;<br />
import android.view.Gravity;<br />
import android.text.TextPaint;<br />
import android.bluetooth.BluetoothAdapter;<br />
import android.bluetooth.BluetoothDevice;<br />
import android.bluetooth.BluetoothSocket;<br />
import java.util.*;<br />
import java.io.DataInputStream;<br />
import java.io.DataOutputStream;<br />
import java.io.IOException;<br />
<br />
import android.content.*;<br />
<br />
<br />
public class MainActivity extends Activity {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> private int MP=LinearLayout.LayoutParams.MATCH_PARENT;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> private int WC=LinearLayout.LayoutParams.WRAP_CONTENT;<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> private TableRow.LayoutParams view_layout2;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> private TextView txtID;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> private TextView txtSync;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> private TextView txtTitle01;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> private TextView txtTrending;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> private TextView txtTitle02;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> private String strTimeCnt="";<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> private TextView txtVer;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> private boolean chkvername=false;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> private String strVer="";<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> private int ifisze=18;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> private int iChnl=0;<span class="Apple-tab-span" style="white-space: pre;"> </span> <br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> private String strTitleH="LegoRun 資 訊 管 理";<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> <br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> <br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> private BluetoothAdapter adapter;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>private BluetoothSocket nxtSocket;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public DataInputStream nxtDataIn;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public DataOutputStream nxtDataOut;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> public final int MODE_CONTROL = 1;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> private int mode;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> <br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> private boolean bConnect_NXT=false;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> private String NXTUUID = "00001101-0000-1000-8000-00805F9B34FB";<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>@Override<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>protected void onCreate(Bundle savedInstanceState) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>super.onCreate(savedInstanceState);<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>LinearLayout layout=new LinearLayout(this);<br />
layout.setOrientation(LinearLayout.VERTICAL); <br />
layout.setLayoutParams(new LinearLayout.LayoutParams(MP,MP));<br />
layout.setBackgroundColor(Color.rgb(19,92,160));<br />
<br />
//標題隱藏<br />
requestWindowFeature(Window.FEATURE_NO_TITLE);<br />
setContentView(layout);<br />
<br />
<br />
TableLayout tl= new TableLayout(this);<br />
tl.setLayoutParams(new LinearLayout.LayoutParams(MP,MP));<br />
tl.setBackgroundColor(Color.parseColor("#333333"));<br />
tl.setStretchAllColumns(true);<br />
layout.addView(tl); <br />
<br />
<br />
TableLayout.LayoutParams row_layout_mid = new TableLayout.LayoutParams();<br />
row_layout_mid.weight=1f;<br />
row_layout_mid.setMargins(0,1,0,1); //setMargins(left, top, right, bottom);<br />
<br />
TableLayout.LayoutParams row_layout_max = new TableLayout.LayoutParams();<br />
row_layout_max.weight=8f;<br />
row_layout_max.setMargins(0,1,0,1); //setMargins(left, top, right, bottom);<br />
<br />
TableLayout.LayoutParams row_layout_min = new TableLayout.LayoutParams();<br />
row_layout_min.weight=0.2f;<br />
row_layout_min.setMargins(0,1,0,1); //setMargins(left, top, right, bottom);<br />
<br />
TableRow.LayoutParams view_layout1 = new TableRow.LayoutParams(MP,MP);<br />
view_layout1.span=2;<br />
<br />
view_layout2 = new TableRow.LayoutParams(getScrWH(MainActivity.this)[0]/2,MP);<br />
view_layout2.setMargins(1,0,0,0);<br />
<br />
TableRow tr1 = new TableRow(this);<br />
tr1.setLayoutParams(row_layout_mid);<br />
tr1.setGravity(Gravity.CENTER_HORIZONTAL);<br />
txtTitle01 = new TextView(this);<br />
txtTitle01.setLayoutParams(view_layout1);<br />
txtTitle01.setText(strTitleH);<br />
txtTitle01.setBackgroundColor(Color.parseColor("#00C9C9")); //#46C7C7<br />
txtTitle01.setGravity(Gravity.CENTER);<br />
TextPaint tp = txtTitle01.getPaint();<br />
tp.setFakeBoldText(true);<br />
txtTitle01.setTextColor(Color.parseColor("#EEEEEE"));<br />
txtTitle01.setOnClickListener(new ButtonClickListener());<br />
txtTitle01.setTextSize(ifisze);<br />
txtTitle01.setTag("txtTitle01");<br />
tr1.addView(txtTitle01);<br />
tl.addView(tr1);<br />
<br />
TableRow tr2 = new TableRow(this);<br />
tr2.setLayoutParams(row_layout_mid);<br />
tr2.setGravity(Gravity.CENTER_HORIZONTAL);<br />
txtTitle02 = new TextView(this);<br />
<br />
<br />
txtTitle02.setText("尚未連結Lego NXT...");<br />
<br />
txtTitle02.setTextSize(18);<br />
txtTitle02.setLayoutParams(view_layout1);<br />
txtTitle02.setGravity(Gravity.CENTER);<br />
txtTitle02.setBackgroundColor(Color.WHITE);<br />
tr2.addView(txtTitle02);<br />
tl.addView(tr2);<br />
<br />
<br />
TableRow tr3 = new TableRow(this);<br />
tr3.setLayoutParams(row_layout_max);<br />
tr3.setGravity(Gravity.CENTER_HORIZONTAL);<br />
tl.addView(tr3);<br />
<br />
LinearLayout layoutBrick=new LinearLayout(this);<br />
layoutBrick.setOrientation(LinearLayout.VERTICAL);<br />
layoutBrick.setLayoutParams(view_layout1);<br />
layoutBrick.setBackgroundColor(Color.parseColor("#95B9C7"));<br />
tr3.addView(layoutBrick);<br />
<br />
<br />
TableLayout tl_Brick= new TableLayout(this);<br />
tl_Brick.setLayoutParams(new LinearLayout.LayoutParams(MP,MP));<br />
tl_Brick.setBackgroundColor(Color.parseColor("#FFFFFF"));<br />
tl_Brick.setStretchAllColumns(true);<br />
layoutBrick.addView(tl_Brick);<br />
<br />
TableLayout.LayoutParams row_layout_Brick = new TableLayout.LayoutParams();<br />
row_layout_Brick.weight=1f;<br />
<br />
TableRow.LayoutParams view_layout_Brick = new TableRow.LayoutParams(MP,MP);<br />
view_layout_Brick.weight=0.7f;<br />
<br />
<br />
int ibtn=0;<br />
for(int i=0;i<=2;i++){<br />
<br />
TableRow tr_Brick = new TableRow(this);<br />
tr_Brick.setLayoutParams(row_layout_Brick);<br />
tr_Brick.setGravity(Gravity.CENTER_HORIZONTAL);<br />
tl_Brick.addView(tr_Brick);<br />
<br />
for(int j=0;j<=2;j++){<br />
Button btn_Brick = new Button(this);<br />
btn_Brick.setLayoutParams(view_layout_Brick); <br />
btn_setup(btn_Brick,ibtn); //設定按鈕外觀圖形<br />
btn_Brick.setOnClickListener(new ButtonClickListener());<br />
<br />
tr_Brick.addView(btn_Brick);<br />
ibtn++;<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
TableRow tr4 = new TableRow(this);<br />
tr4.setLayoutParams(row_layout_min);<br />
tr4.setGravity(Gravity.CENTER_HORIZONTAL);<br />
<br />
txtTrending = new TextView(this);<br />
txtTrending.setText("資料設定");<br />
txtTrending.setTextSize(18);<br />
txtTrending.setLayoutParams(view_layout1);<br />
txtTrending.setGravity(Gravity.CENTER);<br />
txtTrending.setTag("txtTrending");<br />
txtTrending.setOnClickListener(new ButtonClickListener());<br />
txtTrending.setBackgroundColor(Color.parseColor("#E5E4E2"));<br />
tr4.addView(txtTrending);<br />
tl.addView(tr4);<br />
<br />
<br />
//-------------------------------------------<br />
TableRow tr5 = new TableRow(this);<br />
tr5.setLayoutParams(row_layout_mid);<br />
tr5.setGravity(Gravity.CENTER_HORIZONTAL);<br />
<br />
txtID = new TextView(this);<br />
setTxtView(txtID,"帳 號 設 定","txtID");<br />
tr5.addView(txtID);<br />
<br />
txtSync = new TextView(this);<br />
setTxtView(txtSync,"資 料 更 新","txtSync");<br />
tr5.addView(txtSync);<br />
<br />
tl.addView(tr5);<br />
<br />
//----------------------------------------------<br />
TableRow tr6 = new TableRow(this);<br />
tr6.setLayoutParams(row_layout_mid);<br />
tr6.setGravity(Gravity.CENTER_HORIZONTAL);<br />
<br />
TextView txtHelp = new TextView(this);<br />
setTxtView(txtHelp,"使 用 說 明","txtHelp");<br />
tr6.addView(txtHelp);<br />
<br />
txtVer = new TextView(this);<br />
setTxtView(txtVer,"版 本 資 訊","txtVer");<br />
tr6.addView(txtVer);<br />
tl.addView(tr6);<br />
<br />
<br />
<br />
//藍芽啟用<br />
adapter = BluetoothAdapter.getDefaultAdapter();<br />
if(adapter==null)<br />
{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>Toast.makeText(getApplication(), "No Bluetooth adapter found", Toast.LENGTH_SHORT).show();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>this.finish();<br />
}<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if(!adapter.isEnabled())<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), 1);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>@Override<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public boolean onCreateOptionsMenu(Menu menu) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>// Inflate the menu; this adds items to the action bar if it is present.<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>getMenuInflater().inflate(R.menu.main, menu);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>return true;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public int[] getScrWH(Activity activity){<br />
int scrWH[]={0,0};<br />
DisplayMetrics dm = new DisplayMetrics();<br />
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);<br />
scrWH[0] = dm.widthPixels;<br />
scrWH[1] = dm.heightPixels;<br />
return scrWH;<br />
}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>//按鈕事件<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>class ButtonClickListener implements OnClickListener {<br />
// onClick 方法(觸碰按鈕時的事件處理器)<br />
public void onClick(View v){<br />
//取得 tag<br />
String tag = (String)v.getTag();<br />
<br />
if (tag.equals("btn0")){<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if(((Button)v).getText().equals("藍芽連結")){<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>txtTitle02.setText("尋找藍芽中..."); <span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>//開啟藍芽<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if(connectNxt())<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>((Button)v).setText("關閉藍芽");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}else{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>try {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>txtTitle02.setText("傳送功能 = 關閉藍芽連結");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>nxtDataOut.writeInt(999);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>nxtDataOut.flush(); <span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>nxtSocket.close();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>bConnect_NXT=false;<br />
} catch (IOException e) {<br />
e.printStackTrace();<br />
}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>((Button)v).setText("藍芽連結");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
}<br />
<br />
<br />
//傳送資料<br />
if (tag.equals("btn1")){<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>try {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if(((Button)v).getText().equals("啟動馬達A")){ <span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>txtTitle02.setText("傳送功能 = 啟動馬達A");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>nxtDataOut.writeInt(0);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>nxtDataOut.flush();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>((Button)v).setText("關閉馬達A");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}else{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>txtTitle02.setText("傳送功能 = 關閉馬達A");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>nxtDataOut.writeInt(1);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>nxtDataOut.flush();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>((Button)v).setText("啟動馬達A");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>} catch (IOException e) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>// TODO Auto-generated catch block<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>e.printStackTrace();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>} <span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
}<br />
<br />
if (tag.equals("btn2")){<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>try {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if(((Button)v).getText().equals("啟動馬達B")){ <span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>txtTitle02.setText("傳送功能 = 啟動馬達B");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>nxtDataOut.writeInt(2);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>nxtDataOut.flush();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>((Button)v).setText("關閉馬達B");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}else{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>txtTitle02.setText("傳送功能 = 關閉馬達B");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>nxtDataOut.writeInt(3);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>nxtDataOut.flush();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>((Button)v).setText("啟動馬達B");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>} catch (IOException e) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>// TODO Auto-generated catch block<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>e.printStackTrace();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>} <span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
}<br />
<br />
<br />
if (tag.equals("btn3")){<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>try {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if(((Button)v).getText().equals("啟動馬達C")){ <span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>txtTitle02.setText("傳送功能 = 啟動馬達C");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>nxtDataOut.writeInt(4);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>nxtDataOut.flush();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>((Button)v).setText("關閉馬達C");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}else{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>txtTitle02.setText("傳送功能 = 關閉馬達C");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>nxtDataOut.writeInt(5);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>nxtDataOut.flush();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>((Button)v).setText("啟動馬達C");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>} catch (IOException e) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>// TODO Auto-generated catch block<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>e.printStackTrace();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>} <span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
}<br />
<br />
<br />
}<br />
<br />
}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>private boolean connectNxt()<br />
{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if(bConnect_NXT){<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>txtTitle02.setText("手機已經連結成功不須再次連結"); <span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>return false;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>String name="NXT8547";<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>BluetoothDevice nxt = null;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
Set<bluetoothdevice> devicesSet = adapter.getBondedDevices(); </bluetoothdevice><br />
<br />
if(devicesSet.size()==0)<br />
{ <span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>txtTitle02.setText("手機上無任何藍芽連結裝置");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>return false;<br />
}<br />
<br />
for (BluetoothDevice device : devicesSet)<br />
{<br />
if (device.getName().equals(name))<br />
{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>nxt = device;<br />
break;<br />
}<br />
}<br />
<br />
if(nxt==null)<br />
{ <span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>txtTitle02.setText("找不到Lego NXT name:"+name);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>return false;<br />
}<br />
<br />
try<br />
{ <span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>nxtSocket = nxt.createRfcommSocketToServiceRecord(UUID.fromString(NXTUUID));<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>nxtSocket.connect();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>nxtDataOut = new DataOutputStream(nxtSocket.getOutputStream());<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>nxtDataIn = new DataInputStream(nxtSocket.getInputStream());<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
catch(IOException e)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>txtTitle02.setText("連結此裝置:"+name+" 失敗!!");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>return false;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
txtTitle02.setText("連結此裝置:"+name+" 成功!!");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>bConnect_NXT=true;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>return true;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>private void setTxtView(TextView v,String strText,String strTag){<br />
v.setText(strText);<br />
v.setTextSize(ifisze);<br />
v.setLayoutParams(view_layout2);<br />
v.setGravity(Gravity.CENTER);<br />
v.setBackgroundColor(Color.parseColor("#F3F3F3"));<br />
v.setTag(strTag);<br />
v.setOnClickListener(new ButtonClickListener());<br />
}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>private void btn_setup(Button btn_Brick,int ibtn){<br />
Context context=getApplicationContext(); <br />
<br />
<br />
Drawable[][] image=new Drawable[9][2];<br />
image[0][0]=context.getResources().getDrawable(R.drawable.net_42_128);<br />
image[0][1]=context.getResources().getDrawable(R.drawable.net_42_72);<br />
<br />
image[1][0]=context.getResources().getDrawable(R.drawable.net_24_128);<br />
image[1][1]=context.getResources().getDrawable(R.drawable.net_24_72);<br />
<br />
image[2][0]=context.getResources().getDrawable(R.drawable.net_18_128);<br />
image[2][1]=context.getResources().getDrawable(R.drawable.net_18_72);<br />
<br />
image[3][0]=context.getResources().getDrawable(R.drawable.net_08_128);<br />
image[3][1]=context.getResources().getDrawable(R.drawable.net_08_72);<br />
<br />
image[4][0]=context.getResources().getDrawable(R.drawable.net_21_128);<br />
image[4][1]=context.getResources().getDrawable(R.drawable.net_21_72);<br />
<br />
image[5][0]=context.getResources().getDrawable(R.drawable.net_27_128);<br />
image[5][1]=context.getResources().getDrawable(R.drawable.net_27_72);<br />
<br />
image[6][0]=context.getResources().getDrawable(R.drawable.net_22_128);<br />
image[6][1]=context.getResources().getDrawable(R.drawable.net_22_72);<br />
<br />
image[7][0]=context.getResources().getDrawable(R.drawable.net_01);<br />
image[7][1]=context.getResources().getDrawable(R.drawable.net_23_72);<br />
<br />
image[8][0]=context.getResources().getDrawable(R.drawable.net_26_128);<br />
image[8][1]=context.getResources().getDrawable(R.drawable.net_26_72);<br />
<br />
<br />
<br />
<br />
<br />
String[][] strBtn=new String[9][2];<br />
strBtn[0][0]="藍芽連結";<br />
strBtn[0][1]="btn0";<br />
strBtn[1][0]="啟動馬達A";<br />
strBtn[1][1]="btn1";<br />
strBtn[2][0]="啟動馬達B";<br />
strBtn[2][1]="btn2";<br />
strBtn[3][0]="啟動馬達C";<br />
strBtn[3][1]="btn3";<br />
<br />
strBtn[4][0]="啟動光線";<br />
strBtn[4][1]="btn6";<br />
strBtn[5][0]="Fun05";<br />
strBtn[5][1]="btn7";<br />
<br />
strBtn[6][0]="Fun06";<br />
strBtn[6][1]="btn4";<br />
strBtn[7][0]="Fun07";<br />
strBtn[7][1]="btn5";<br />
strBtn[8][0]="Fun08";<br />
strBtn[8][1]="btn8";<br />
<br />
<br />
<br />
<br />
<br />
<br />
btn_Brick.setText(strBtn[ibtn][0]);<br />
btn_Brick.setTextSize(ifisze);<br />
btn_Brick.setTag(strBtn[ibtn][1]);<br />
//-------------<br />
int spacing=0;<br />
int width=btn_Brick.getMeasuredWidth();<br />
int height=btn_Brick.getMeasuredHeight();<br />
int txt_width=(int)(btn_Brick.getTextSize()*btn_Brick.getText().length());<br />
int txt_height=(int)(btn_Brick.getLineCount()*btn_Brick.getLineHeight());<br />
<br />
int img_width=0;<br />
int img_height=0;<br />
int content_height=0;<br />
int content_width=0;<br />
int padding_w=0;<br />
int padding_h=0;<br />
int isel=0;<br />
<br />
if(getScrWH(this)[0]>=720){<br />
img_width=image[ibtn][0].getIntrinsicWidth();<br />
img_height=image[ibtn][0].getIntrinsicHeight();<br />
isel=0;<br />
}else{<br />
img_width=image[ibtn][1].getIntrinsicWidth();<br />
img_height=image[ibtn][1].getIntrinsicHeight();<br />
isel=1;<br />
}<br />
content_height=txt_height+img_height+spacing;<br />
content_width=txt_width+img_width+spacing;<br />
padding_w=width/2-content_width/2;<br />
padding_h=height/2-content_height/2;<br />
btn_Brick.setCompoundDrawablesWithIntrinsicBounds( null,image[ibtn][isel], null, null);<br />
////setMargins(left, top, right, bottom);<br />
//btn_Brick.setPadding(0,padding_h,0,0);<br />
btn_Brick.setCompoundDrawablePadding(padding_h/2);<br />
//----------------<br />
<br />
}<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<br />
}<br />
<br />
<br />
<span style="color: #990000; font-size: large;">第二部份開發Lejos NXT 程式</span><br />
<br />
import lejos.nxt.Button;<br />
import lejos.nxt.ButtonListener;<br />
import lejos.nxt.LCD;<br />
import lejos.nxt.Motor;<br />
import lejos.nxt.comm.BTConnection;<br />
import lejos.nxt.comm.Bluetooth;<br />
<br />
import java.io.DataInputStream;<br />
import java.io.DataOutputStream;<br />
<br />
import lejos.nxt.comm.*;<br />
import lejos.util.Delay;<br />
<br />
<br />
public class BT_Frm01 {<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public static void main(String[] args)throws Exception {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>// TODO Auto-generated method stub<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>Button.ESCAPE.addButtonListener(new ButtonListener(){<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public void buttonPressed(Button b){System.exit(1);}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public void buttonReleased(Button b){}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>});<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>LCD.drawString("Waiting",0,0);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>BTConnection btc = Bluetooth.waitForConnection(0, NXTConnection.RAW);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>DataInputStream din = btc.openDataInputStream();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>DataOutputStream dout = btc.openDataOutputStream();<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>LCD.drawString("Connected",0,0);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;">Motor.A.setSpeed(450);</span><br />
<span class="Apple-tab-span" style="white-space: pre;">Motor.B.setSpeed(450);</span><br />
<span class="Apple-tab-span" style="white-space: pre;">Motor.C.setSpeed(450);</span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>while(true){<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>int iData=din.readInt();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>LCD.clear();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>LCD.drawString("value="+String.valueOf(iData),0,2);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if(iData==999){<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>btc.close();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>System.exit(1);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>break;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>switch(iData){<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>case 0:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>Motor.A.forward();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>break;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>case 1:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>Motor.A.stop();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>break;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>case 2:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>Motor.B.forward();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>break;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>case 3:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>Motor.B.stop();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>break;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>case 4:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>Motor.C.forward();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>break;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>case 5:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>Motor.C.stop();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>break;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>Delay.msDelay(1000);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
}<br />
<div>
<br />
<br />
除了手機可跟NTX互動溝通外不同的NXT主機也可以互動,這是我用第一台NXT主機當控制器透過BT遙控第二台NXT車輛的影片,第一隻馬達控制前輪方向動作、第二隻馬達控制後輪前進後退動作<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/DYGbJGg-JW4" width="560"></iframe></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<br />Lego Runhttp://www.blogger.com/profile/12376832463978326433noreply@blogger.com2