tag:blogger.com,1999:blog-46288547590804397732024-03-13T12:19:05.447-07:00玩玩機器人,設計創意無窮薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.comBlogger81125tag:blogger.com,1999:blog-4628854759080439773.post-91062689616281648592021-07-16T18:49:00.004-07:002021-07-16T18:49:57.041-07:00多工執行緒的 Arduino 控制<p> <span style="background-color: white; color: #050505; font-family: "Segoe UI Historic", "Segoe UI", Helvetica, Arial, sans-serif; font-size: 15px; white-space: pre-wrap;">多工執行緒的 Arduino 控制</span></p><div dir="auto" style="background-color: white; color: #050505; font-family: "Segoe UI Historic", "Segoe UI", Helvetica, Arial, sans-serif; font-size: 15px; white-space: pre-wrap;">本範例在同一個時間內,同時做不同的任務(讓 led明滅、七段顯示器數字顯示),這是 圖控程式離線下所做不到的事。</div><div dir="auto" style="background-color: white; color: #050505; font-family: "Segoe UI Historic", "Segoe UI", Helvetica, Arial, sans-serif; font-size: 15px; white-space: pre-wrap;"><br /></div><div dir="auto" style="background-color: white; color: #050505; font-family: "Segoe UI Historic", "Segoe UI", Helvetica, Arial, sans-serif; font-size: 15px; white-space: pre-wrap;"><a href="https://www.youtube.com/watch?v=CqKxA0DESn4">https://www.youtube.com/watch?v=CqKxA0DESn4<div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/CqKxA0DESn4" width="320" youtube-src-id="CqKxA0DESn4"></iframe></div><br /></a><br /></div>薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com0tag:blogger.com,1999:blog-4628854759080439773.post-91998602325407253842021-07-16T18:09:00.001-07:002021-07-16T18:09:08.297-07:00<p> <span style="background-color: #f0f2f5; color: #050505; font-family: "Segoe UI Historic", "Segoe UI", Helvetica, Arial, sans-serif; font-size: 15px;">用圖控程式,它只有提供delay()函數,delay是讓工作暫時停止,必須等他做完才能執行下一個步驟。</span></p><div dir="auto" style="background-color: #f0f2f5; color: #050505; font-family: "Segoe UI Historic", "Segoe UI", Helvetica, Arial, sans-serif; font-size: 15px;">是一種很標準的程序控制。</div><div dir="auto" style="background-color: #f0f2f5; color: #050505; font-family: "Segoe UI Historic", "Segoe UI", Helvetica, Arial, sans-serif; font-size: 15px;">範例中,利用兩LED皆在Arduino的PIN-2,3,透過millis()的時間函數,分別對兩個LED提供不同的變化週期。<div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dxFiTop0-EJq3uOfNHPZ1MMb-xfRiVhgdJEy-KNd-wIZdwEI2fEBfGZg9BTVkqRQIN7pHczjufqqY3dQX3fvg' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-jHcpTEbyRQo/YPItpSKBANI/AAAAAAAAY7E/rpWPLlkctC4SOfWI4QwviSeo9d772ZVCgCNcBGAsYHQ/s737/213686040_4769058086442822_2164514223141640121_n.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="737" data-original-width="391" height="320" src="https://1.bp.blogspot.com/-jHcpTEbyRQo/YPItpSKBANI/AAAAAAAAY7E/rpWPLlkctC4SOfWI4QwviSeo9d772ZVCgCNcBGAsYHQ/s320/213686040_4769058086442822_2164514223141640121_n.jpg" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><br /></div>薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com0tag:blogger.com,1999:blog-4628854759080439773.post-28974722710281088062020-11-28T04:39:00.012-08:002020-11-28T17:47:34.434-08:00荷蘭風車 arduino控制<p> 藉由手作荷蘭風車,馬達的部分,以 Arduino晶片控制,搭配按鈕開關,來起閉風車轉動。</p><p>其中:</p><p>接腳3:偵測按鈕是否按下(高低電位偵測藉以判斷按鈕是否按下),當按下按鈕,高電位;放開按鈕,低電位。</p><p>接腳5、6:與L9110馬達驅動板的 A1A、A1B接點連結。</p><p>啟動時,因為採用PWM時Arduino會產生額外的低頻噪音,為消除噪音,在程式中,改變計時器的設定。</p><p>因為接腳5、6分屬Timer0管轄,在void setup()中增加:</p><p> TCCR<span style="color: red;">0</span>A = _BV(COM<span style="color: red;">0</span>A1) | _BV(COM<span style="color: red;">0</span>B1) | _BV(WGM<span style="color: red;">0</span>1) | _BV(WGM<span style="color: red;">0</span>0); </p><p> TCCR<span style="color: red;">0</span>B = _BV(CS<span style="color: red;">00</span>); </p><p> OCR<span style="color: red;">0</span>A = 180; </p><p> OCR<span style="color: red;">0</span>B = 50; </p><p>上開程式碼以紅色色標之處為Timer0的0代號。</p><p>如果是採用3、11接腳,則為Timer 2;採用9、10接腳,則為Timer 1。</p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dy2ZB4wklFUjHS9HdSiRXLsZewK5BA8O_FUTvPQsOECvfLQf0Go8NBzCeBiZ0ZvK5wAK-HrG0vCGDwqmkd51w' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div><br /><p>附上Arduino程式碼:</p><p><br /></p><p>#define A_1A 6</p><p>#define A_1B 5</p><p>int button_pin=3;</p><p>int i=1;</p><p><br /></p><p>void setup() {</p><p> // put your setup code here, to run once:</p><p> TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM01) | _BV(WGM00); </p><p> TCCR0B = _BV(CS00); </p><p> OCR0A = 180; </p><p> OCR0B = 50; </p><p> pinMode(button_pin,INPUT);</p><p> pinMode(A_1A,OUTPUT);</p><p> pinMode(A_1B,OUTPUT);</p><p> pinMode(13,OUTPUT);</p><p>}</p><p><br /></p><p>void loop() {</p><p> // put your main code here, to run repeatedly:</p><p><br /></p><p><br /></p><p> //analogWrite(A_1A,130);</p><p> //analogWrite(A_1B,0);</p><p> //delay(100);</p><p><br /></p><p> if (digitalRead(button_pin)==HIGH) {</p><p> i=i+1;</p><p> while(digitalRead(button_pin)==HIGH){}</p><p> }</p><p> if (digitalRead(button_pin)==LOW && i%3==0) {</p><p> digitalWrite(13,HIGH);</p><p> analogWrite(A_1A,150);</p><p> digitalWrite(A_1B,0);</p><p> delay(20);</p><p> } </p><p> if (digitalRead(button_pin)==LOW && i%3==1) {</p><p> digitalWrite(13,LOW);</p><p> analogWrite(A_1A,255);</p><p> digitalWrite(A_1B,0); </p><p> delay(20); </p><p> } </p><p> if (digitalRead(button_pin)==LOW && i%3==2) {</p><p> digitalWrite(13,LOW);</p><p> digitalWrite(A_1A,0);</p><p> digitalWrite(A_1B,0); </p><p> delay(20); </p><p> } </p><p>}</p>薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com0tag:blogger.com,1999:blog-4628854759080439773.post-14973574128392433762020-10-17T19:36:00.003-07:002020-10-17T19:36:45.075-07:00小木屋+荷蘭風車利用閒暇的時間,自己用Google Sketchup軟體繪製小木屋和風車的設計圖,並使用雷射切割機將零件切出。<div>在課程設計上,可在生活科技九年級能源與動力、電與控制等單元做應用<div class="separator" style="clear: both; text-align: center;"><br /></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-gvxR6MIHSi8/X4up6ym9K6I/AAAAAAAAXWs/Nffi5NwmTaUhacu4yWxt32ImjEdIRh6DgCNcBGAsYHQ/s701/121385681_3972131752802130_6574297413953957564_o.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="701" data-original-width="526" height="320" src="https://1.bp.blogspot.com/-gvxR6MIHSi8/X4up6ym9K6I/AAAAAAAAXWs/Nffi5NwmTaUhacu4yWxt32ImjEdIRh6DgCNcBGAsYHQ/s320/121385681_3972131752802130_6574297413953957564_o.jpg" /></a></div><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dxDzjQaB-y4HUbp8DmJ-GGSLmMgYpM0wyyOcaQBkhj-TlCvT8m2WPQJzQHnKIcHh7_T_niMc6Nwlvnzzp7umg' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><br />。</div>薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com0tag:blogger.com,1999:blog-4628854759080439773.post-38688154507718139292014-12-13T05:35:00.000-08:002014-12-13T05:43:01.659-08:00從AppInventor2開發產品中,體驗智慧財產的重要學校自這個學期開始授課App Inventor課程之後,學生普遍的反應還算不錯。<br />
過去國三的電腦課程,通常是上Visual Baic,但對於初次接觸程式設計的孩子來說,一堆抽象的文字語言,數字與字串,或者是運算子,甚至是迴圈的應用,條件式的判斷....光是這些就足以讓孩子們失去學習的信心。<br />
<br />
這個學期開始之前,鄭博全老師找我一起商討對於國三學生的課程時談到AppInventor課程,打算在學期中授課,當下我對於這一套軟體並不陌生,因為過去在設計機器人nxt設計時,在進行藍芽連線時,就已經開始使用App Inventor這個軟體作為手機與機器之間的溝通橋樑。<br />
<br />
在開始授課的時候,孩子們開始學習圖形化程式設計的操作,崁入式的程式碼建構,相較於傳統的文字程式來說,是淺顯而易懂的。雖然在剛開始還是會排斥著,然而在經過一段時間的學習後,孩子們慢慢地能夠習慣操作,並能慢慢地能夠自己產生一個簡易的軟體。<br />
<br />
這個建構的過程並不簡單,因為從零學起,從排斥到接納,雖然是半強迫式的學習,但也消弭了對程式設計的恐懼感。從程式設計中,孩子們除了培養靈活的邏輯設計觀念之外,更從中體驗到:原來開發一個程式軟體,竟是相當不簡單!<br />
<br />
一個手機遊戲軟體,人人取得容易。<span style="background-color: red;">然而一個軟體的生命週期,從玩家對於軟體的精緻程度,將決定喜好的程度</span>。 因此,在建構一個軟體的過程,不斷修飾程式的外觀之外,對於程式的內涵(程式碼)的功能強度,更是考驗一個程式設計者的智慧。<br />
<br />
我們從課程中,最後希望帶給孩子們的是:<span style="color: red;">認真看待智慧財產權</span>。在一個產品開發的階段,是如此耗費工夫(時間)的,為了讓產品能永續成長,智慧財產是不容許被侵害的,因為從設計的過程中,既然如此辛苦,就更能體會其他開發產品的原設計者,當時對這個商品的努力程度。 薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com0tag:blogger.com,1999:blog-4628854759080439773.post-53501487820570430342014-12-12T08:35:00.001-08:002014-12-12T08:35:44.130-08:00利用matlab,一秒鐘讀取一筆資料影片結果:https://www.youtube.com/watch?v=JZhv-OIad-8&feature=youtu.be<br />
<br />
程式碼:<br />
clear all<br />clc<br /><br />data=[100 90 80 60 80 90 75 70 80 100];<br />n=size(data,2);<br />sum=0;<br />average_value=0;<br /><br />for i=1 :10 <br /> if i==1<br /> max_value=data(i); <br /> min_value=data(i);<br /> end <br /> <br /> sum=sum + data(i);<br /> <br /> if data(i)>max_value<br /> max_value= data(i);<br /> end <br /> <br /> if data(i)<min_value br=""> min_value=data(i);<br /> end <br /> fprintf('第%d筆資料=%d,讀取完畢\n',i,data(i))<br /> pause(1);<br />end<br />fprintf('-------------\n')<br />average_value=sum/n;<br />fprintf('平均值=%3.2f\n',average_value)<br />fprintf('最大值=%d\n',max_value)<br />fprintf('最大值=%d\n',min_value)</min_value>薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com0tag:blogger.com,1999:blog-4628854759080439773.post-49574528451291199762013-04-14T08:17:00.004-07:002013-04-14T08:28:01.180-07:00UltraSonicSensor應用-保護眼睛的守護神<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
<span class="messageBody" data-ft="{"type":3}"><span class="userContent">NXT ,保護眼睛的守護神!<br /> 當超音波偵測到前方人體離電視太近的時候,系統發出Light光<wbr></wbr><span class="word_break"></span>線及聲音警告。</span></span></h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
<span class="messageBody" data-ft="{"type":3}"><span class="userContent"> </span></span></h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
<span class="messageBody" data-ft="{"type":3}"><span class="userContent">[機構]</span></span></h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
<span class="messageBody" data-ft="{"type":3}"><span class="userContent"><div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-Eu-xWL4Dqpo/UWrHx522ENI/AAAAAAAAAWs/CkFVQQkj1jo/s1600/2013-04-14+23.04.52.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="192" src="http://1.bp.blogspot.com/-Eu-xWL4Dqpo/UWrHx522ENI/AAAAAAAAAWs/CkFVQQkj1jo/s320/2013-04-14+23.04.52.jpg" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-ClchHz9OIew/UWrH0i7flSI/AAAAAAAAAW0/VI-0gLLvxEw/s1600/2013-04-14+23.04.01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="192" src="http://4.bp.blogspot.com/-ClchHz9OIew/UWrH0i7flSI/AAAAAAAAAW0/VI-0gLLvxEw/s320/2013-04-14+23.04.01.jpg" width="320" /></a></div>
</span></span></h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
[程式] </h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
#define sonic_sensor IN_1<br />#define touch_sensor IN_2<br />#define light_sensor IN_3<br />#define touch SENSOR_2<br />#define MotorOut OUT_B<br />#define length 150<br /><br />long tick;<br /><br /><br />void WaitSEC3()<br />{<br /> tick=CurrentTick();<br /> while(CurrentTick()<(tick+3000))<br /> {<br /> PlayTone(880,50);<br /> Wait(950);<br /> }<br /> Wait(1000);<br />}<br /><br /><br /><br /><br />task main()<br />{<br /> SetSensorTouch(touch_sensor);<br /> ResetTachoCount(MotorOut);<br /> SetVolume(4);<br /> SetSensorLight(light_sensor,false);<br /> SetSensorLowspeed(sonic_sensor);<br /> WaitSEC3();<br />}<br /><br /><br />task MotorRotateFn()<br />{<br /> Follows(main);<br /> while(touch==0)<br /> {<br /> RotateMotorPID(MotorOut,10,90,40,40,90); //右轉<br /> Wait(100);<br /> RotateMotorPID(MotorOut,10,-170,40,40,90); //左轉<br /> Wait(100);<br /> RotateMotorPID(MotorOut,10,80,40,40,90); //右轉<br /> }<br /> Off(MotorOut);<br /> StopAllTasks();<br />}<br /><br />task DetectFn()<br />{<br /> Follows(main);<br /> while(true)<br /> {<br /> if(SensorUS(sonic_sensor)<length br=""> <length{<br /> PlayTone(500,50);<br /> SetSensorLight(light_sensor,true);<br /> Wait(50);<br /> SetSensorLight(light_sensor,false);<br /> Wait(50);<br /> }<br /> }<br />}</length></h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
[影片] </h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
</h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
</h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
</h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
</h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
</h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
</h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
</h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
</h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
</h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
</h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
</h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
</h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
</h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
</h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
</h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
</h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
</h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
</h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
</h5>
<h5 class="uiStreamMessage userContentWrapper" data-ft="{"type":1,"tn":"K"}">
<object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/FWNX2pQh_hw/0.jpg" height="266" width="320"><param name="movie" value="http://www.youtube.com/v/FWNX2pQh_hw?version=3&f=user_uploads&c=google-webdrive-0&app=youtube_gdata" /><param name="bgcolor" value="#FFFFFF" /><param name="allowFullScreen" value="true" /><embed width="320" height="266" src="http://www.youtube.com/v/FWNX2pQh_hw?version=3&f=user_uploads&c=google-webdrive-0&app=youtube_gdata" type="application/x-shockwave-flash" allowfullscreen="true"></embed></object></h5>
薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com0tag:blogger.com,1999:blog-4628854759080439773.post-38082720451322900542013-04-05T22:08:00.002-07:002013-04-06T02:01:50.216-07:00齒輪組應用-nxt腳踏車利用齒輪組原理,組裝的腳踏車。<br />
後輪利用橡皮筋傳動。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-GsGsJTEupsw/UV_jeWrUrPI/AAAAAAAAAWQ/0sRe5lkoXBI/s1600/2013-04-06+16.44.45.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="192" src="http://3.bp.blogspot.com/-GsGsJTEupsw/UV_jeWrUrPI/AAAAAAAAAWQ/0sRe5lkoXBI/s320/2013-04-06+16.44.45.jpg" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-zODZhMR3pkU/UV_jhYkCeqI/AAAAAAAAAWY/g3-DAmD9dxE/s1600/2013-04-06+16.45.23.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="192" src="http://4.bp.blogspot.com/-zODZhMR3pkU/UV_jhYkCeqI/AAAAAAAAAWY/g3-DAmD9dxE/s320/2013-04-06+16.45.23.jpg" width="320" /></a></div>
<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;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/iNiQCqAfIbk?feature=player_embedded' frameborder='0'></iframe></div>
齒輪組合可謂千變萬化,我個人設計時,先從後輪開始做起,先把後輪與腳踏傳動軸的橡皮筋先測試連動性。<br />
確認後,再續完成前輪與龍頭等機構的連結。<br />
最後為整合前後輪能藉由nxt馬達轉動,來帶動各部位的轉動,所以藉由齒輪組(三個)來傳遞給前輪及腳踏傳動軸。而腳踏傳動軸得到動能後,藉由橡皮筋的連動,使後輪轉動。薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com0tag:blogger.com,1999:blog-4628854759080439773.post-21638005223199949702013-04-05T04:48:00.000-07:002013-04-05T17:51:16.198-07:00齒輪機構-玩玩<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Q73M1eHgKsE/UV6znDMJ7aI/AAAAAAAAAWE/B9BZhVkH-dM/s1600/2013-04-05+19.09.24.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="192" src="http://3.bp.blogspot.com/-Q73M1eHgKsE/UV6znDMJ7aI/AAAAAAAAAWE/B9BZhVkH-dM/s320/2013-04-05+19.09.24.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
感謝探奇邱老師給予的資料(如參考資料)。<br />
齒輪機構,有趣的地方在於透過齒輪之間的串合,可以有非常多的變化,因此被應用在馬達速度(差速)的變化。<br />
<br />
齒輪比,藉由兩個齒輪串合,我們從經驗得知,大齒輪轉一圈,小齒輪轉動n圈,便可以做到差速的轉換。例如圖中:<br />
與馬達串合在一起(同軸)的是8齒的小齒輪,8齒的小齒輪又與40齒的大齒輪咬合在一起。如此共構的齒輪組。我們知道:40齒的大齒輪轉動1圈,同時8齒的小齒輪已跑了5圈。<br />
<br />
是以,馬達以150轉/分運轉,假設小齒輪轉150圈,那麼40齒的大齒輪,就是轉了30圈。所以以倍數的關係可知~大齒輪的轉速是30轉/分。<br />
<br />
圖中另外一組是8齒小齒輪與24齒小齒輪,該8齒小齒輪與40齒同軸。<br />
8齒小齒輪與24齒小齒輪的齒輪比=1:3,所以可知8齒小輪轉3圈,24 齒中齒輪轉1圈。<br />
<br />
所以整個齒輪組的組合,從馬達的輸入端傳動到24齒輸出端的葉片轉動,呈現轉動比為:<br />
(1/5)x(1/3)=1/15<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
換句話說,馬達轉15圈,輸出端的葉片僅轉動1圈,藉此達到轉速的變化!!!! <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>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dyCiA5cxsFJgc5mssJCdNDN1icM7gL1JqGkeaZ0F-OkRWVJH1oFF5YiFuCmYYhoTuBxSfg3d1-Yikb4cSDZ_A' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div>
<br />
另外,齒輪組改成Worm Gear也很有趣:<br />
<div class="separator" style="clear: both; text-align: center;">
<br /><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/IyZmQ70Tz1I?feature=player_embedded' frameborder='0'></iframe></div>
<br />
參考資料:<br />
1.<span data-ft="{"tn":"K"}" id=".reactRoot[1].[1][2][1]{comment629647647050574_7324409}.0.[1].0.[1].0.[0].[0][2]"><span class="UFICommentBody" id=".reactRoot[1].[1][2][1]{comment629647647050574_7324409}.0.[1].0.[1].0.[0].[0][2].0"><a content="http://www.education.rec.ri.cmu.edu/roboticscurriculum/curriculum/introductiontogears.htm" href="http://www.education.rec.ri.cmu.edu/roboticscurriculum/curriculum/introductiontogears.htm" id=".reactRoot[1].[1][2][1]{comment629647647050574_7324409}.0.[1].0.[1].0.[0].[0][2].0.[2]" rel="nofollow" target="_blank">http://www.education.rec.ri.cmu.edu/roboticscurriculum/curriculum/introductiontogears.htm</a></span></span><br />
<span data-ft="{"tn":"K"}" id=".reactRoot[1].[1][2][1]{comment629647647050574_7324409}.0.[1].0.[1].0.[0].[0][2]"><span class="UFICommentBody" id=".reactRoot[1].[1][2][1]{comment629647647050574_7324409}.0.[1].0.[1].0.[0].[0][2].0">2.</span></span><span data-ft="{"tn":"K"}" id=".reactRoot[1].[1][2][1]{comment629647647050574_7324409}.0.[1].0.[1].0.[0].[0][2]"><span class="UFICommentBody" id=".reactRoot[1].[1][2][1]{comment629647647050574_7324409}.0.[1].0.[1].0.[0].[0][2].0"><span data-ft="{"tn":"K"}" id=".reactRoot[1].[1][2][1]{comment629647647050574_7324410}.0.[1].0.[1].0.[0].[0][2]"><span class="UFICommentBody" id=".reactRoot[1].[1][2][1]{comment629647647050574_7324410}.0.[1].0.[1].0.[0].[0][2].0"><a content="http://www.education.rec.ri.cmu.edu/roboticscurriculum/curriculum/gearsspeedtorque.htm" href="http://www.education.rec.ri.cmu.edu/roboticscurriculum/curriculum/gearsspeedtorque.htm" id=".reactRoot[1].[1][2][1]{comment629647647050574_7324410}.0.[1].0.[1].0.[0].[0][2].0.[0]" rel="nofollow" target="_blank">http://www.education.rec.ri.cmu.edu/roboticscurriculum/curriculum/gearsspeedtorque.htm</a></span></span> </span></span>薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com0tag:blogger.com,1999:blog-4628854759080439773.post-76499190049113528032012-07-08T03:45:00.000-07:002012-07-08T03:45:37.555-07:00撲克牌洗牌機久違了,好久沒有新的idea,今天寫一篇關於利用NXT做撲克牌發牌機。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-JfG-Sp-a--U/T_li-ADNbFI/AAAAAAAAASM/C0Db9V_vg8U/s1600/255244_495169807165026_104121107_n.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://3.bp.blogspot.com/-JfG-Sp-a--U/T_li-ADNbFI/AAAAAAAAASM/C0Db9V_vg8U/s320/255244_495169807165026_104121107_n.jpg" width="320" /></a></div>
<div align="left" class="separator" style="clear: both; text-align: center;">
</div>
<br />
<br />
基本上,把撲克牌放兩邊,模擬我們人的手洗牌的樣子。<br />
而機構本身利用輪胎來推進撲克牌至中間的凹槽,馬達轉動的速度無需過快,以免撲克牌卡紙而破壞了牌紙。<br />
<br />
且程式也止不過幾行,其中主要用以啟動馬達轉動的程式碼:<br />
<br />
OnFwd(OUT_AB,50);<br />
<br />
以下是洗牌機的影片片段:<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dznBWnsGHvifa9VAn1onXtYZevt29n6VXH6SvHPH-vVcBIF3HV2WEliyikX-6l7lL3yDG07VbsAzv24TuMHVQ' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div>薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com0tag:blogger.com,1999:blog-4628854759080439773.post-80132860890575855392012-04-13T18:36:00.002-07:002012-04-13T18:46:02.006-07:00使用matlab開啟Excel檔案,讀取數據資料matlab當需要開啟外部資料,例如excel檔案時,使用的指令:<br /><blockquote>1. importdata('filename') -->filename就是你要指定的檔案名稱,包含副檔名<br />例如,欲打開一個檔名為data.xls,則指令為importdata('data.xls')<br />2. xlsread('filename')-->filename是你要指定的檔案名稱,副檔名預設為xls<br /></blockquote><br /><br />有時操作者在程式執行期間,想切換開啟不同的xls檔案名稱,而不想重新啟動程式,可以使用input指令。下列為部分片段程式:<br /><blockquote>file_name=input('Open filename:')<br />file_data=xlsread(int2str(file_name))<br /></blockquote><br /><br />如此,即可由操作者自行輸入檔案名稱,如果檔名以數字命名,記得做轉換為文字。薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com0tag:blogger.com,1999:blog-4628854759080439773.post-42364504731229266022012-02-17T07:22:00.000-08:002012-02-17T07:30:25.813-08:00Matlab解聯立方程式matlab功能強大,對於工程解題更是他的強項。多年來,我對matlab總有一份眷戀,畢竟真的很好用。<br /><br />ok,回到正題,因想到解聯立解,所以找一找網路上對matlab解聯立解的方法,找到一個方法還不錯用:<br /><br />假設一個聯立方程式:<br />x+y=2.....(1)<br />x-y=0.....(2)<br /><br />以觀察法可以判斷找到x=1,y=1為其解。<br /><br />而matlab的程式表示方法,假設等號左邊的x,y未知數之係數,看成一個矩陣A,且等號右邊的係數可以看成一個陣列C<br />簡化上述的表示式,以矩陣可以寫成<br />AX=C<br /><br />所以:<br />A=[1 1<br /> 1 -1]<br />C=[2<br /> 0]<br /><br />底下是matlab程式的寫法:<br />A=[1 1;1 -1];<br />C=[2;0];<br />X=A\C<br /><br />以左除法,即可解出聯立解,其中X得到的答案就是x,y的解。薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com0tag:blogger.com,1999:blog-4628854759080439773.post-55350845583644704322012-02-01T22:25:00.000-08:002012-02-01T22:27:12.562-08:00App Inventor 改版後的編輯網站<a href="http://experimental.appinventor.mit.edu/">http://experimental.appinventor.mit.edu/</a>薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com0tag:blogger.com,1999:blog-4628854759080439773.post-26358610853405911092011-12-16T21:01:00.000-08:002011-12-17T07:11:16.445-08:00走迷宮找最短路徑至終點前一篇的文章[<a href="http://cmackimo.blogspot.com/2011/12/line-follower-nxt-carx-ynxt-x-y-1-1-11.html">篩選簡化路徑的Line Follower</a>]談到:<br /><blockquote>『電腦鼠從起點到終點所經過的所有途徑,記錄所經過的座標之後,自動篩選及簡化路徑,進而尋找最短途逕從起點直至終點。』</blockquote><br />本篇據此,經由nxt分析 最短途徑後,操作者將nxt電腦鼠再次放到起點處,預備讓電腦鼠可以依據最短途逕直至終點。不過程式需要增加一段,也是本篇的精華所在。<br /><a href="http://3.bp.blogspot.com/-7mIRv5oWvyc/Tuxcp03dQjI/AAAAAAAAARE/hGeJgUrrJRw/s1600/%25E5%259C%2596%25E7%2589%25871.jpg"></a><br /><a href="http://4.bp.blogspot.com/-MzEMhcMHKEg/TuxVTtljFzI/AAAAAAAAAQ4/8L07yvwamc4/s1600/%25E5%259C%2596%25E7%2589%25871.jpg"></a><br /><br /><pre>#define blue_tap1 3<br />#define blue_tap2 4<br />#define red_tap 9<br />#define factor 2<br /><br /><br />#define LMotor OUT_A<br />#define RMotor OUT_C<br />#define Motors OUT_AC<br /><br />#define LightSensor1Port IN_1<br />#define LightSensor2Port IN_2<br />#define ColorSensorPort IN_4<br /><br />int x[10];<br />int y[10];<br />int x_fix[10];<br />int y_fix[10];<br /><br />int i,j,k=0;<br />int D;<br />int colornum;<br />int black,white,light1_value,light2_value;<br />int Lpower=0,Rpower=0;<br /><br />long tick;<br />string code;<br /><br /><br />void WaitSEC3()<br />{<br /> tick=CurrentTick();<br /> while(CurrentTick()<(tick+3000))<br /> {<br /> PlayTone(880,50);<br /> Wait(950);<br /> }<br /> Wait(1000);<br />}<br /><br />void InitialLightSensor()<br />{<br /> while(!ButtonPressed(BTNCENTER,false))<br /> {<br /> TextOut(0,LCD_LINE3,"Light at black..");<br /> black=Sensor(LightSensor1Port);<br /> }<br /> ClearScreen();<br /> Wait(1000);<br /> while(!ButtonPressed(BTNCENTER,false))<br /> {<br /> TextOut(0,LCD_LINE3,"Light at white..");<br /> white=Sensor(LightSensor1Port);<br /> }<br /> ClearScreen();<br /> WaitSEC3();<br />}<br /><br /><br />void LoopAdjust()<br />{<br /> for(i=0; i<ArrayLen(x); i++)<br /> {<br /> x_fix[k]=x[i];<br /> y_fix[k]=y[i];<br /> for(j=i; j<ArrayLen(x); j++)<br /> {<br /> if((x[j]==x[i])&&(y[j]==y[i]))<br /> {<br /> x_fix[i]=x[j];<br /> y_fix[i]=y[j];<br /> i=j;<br /> }<br /> }<br /> k++;<br /> }<br />}<br /><br />void BotWalking()<br />{<br /> light1_value=Sensor(LightSensor1Port);<br /> Rpower=(light1_value-black)*factor;<br /> Lpower=(white-light1_value)*factor;<br /> OnFwd(LMotor,Lpower);<br /> OnFwd(RMotor,Rpower);<br />}<br /><br />void LightSensorTouchLine() //讓bot的兩個light往前推進一小步,直至壓線<br />{<br /> tick=CurrentTick();<br /> while(CurrentTick()<tick+800)<br /> {<br /> OnFwdSync(Motors,25,0);<br /> }<br />}<br /><br />void TireTouchLine(int n) //讓bot往前移動,直至前輪壓線<br />{<br /> tick=CurrentTick();<br /> while(CurrentTick()<tick+n)<br /> {<br /> OnFwd(LMotor,25);<br /> OnFwd(RMotor,25);<br /> }<br />}<br /><br />void BotRightTurn() //讓bot右轉<br />{<br /> LightSensorTouchLine();<br /> Off(Motors);<br /> Wait(SEC_1);<br /> TireTouchLine(500);<br /> tick=CurrentTick();<br /> while(CurrentTick()<tick+2050)<br /> {<br /> OnFwd(LMotor,25);<br /> OnFwd(RMotor,-25);<br /> }<br />}<br /><br />void BotLeftTurn() //讓bot左轉<br />{<br /> LightSensorTouchLine();<br /> Off(Motors);<br /> Wait(SEC_1);<br /> TireTouchLine(1400);<br /> tick=CurrentTick();<br /> while(CurrentTick()<tick+1600)<br /> {<br /> OnFwd(LMotor,-25);<br /> OnFwd(RMotor,25);<br /> }<br />}<br /><br /><br /><br /><br />void ShortLoopGo() //Result: (0,1)-->(-1,1)-->(-1,0)-->(-2,0)<br />{<br /> string prev_axis="Y" ;<br /> i=1;<br /><br /> while(i<=k)<br /> {<br /> colornum=SensorHTColorNum(ColorSensorPort);<br /> //NumOut(0,LCD_LINE1,D);<br /> if((colornum!=blue_tap1)||(colornum!=blue_tap2))<br /> {<br /> if(colornum==red_tap)<br /> {<br /> StopAllTasks();<br /> }<br /> BotWalking();<br /> }<br /> <br /> if((colornum==blue_tap1)||(colornum==blue_tap2))<br /> {<br /> Off(Motors);<br /> Wait(SEC_1);<br /> if((x_fix[i]-x_fix[i-1])!=0)<br /> {<br /> if(((x_fix[i]-x_fix[i-1])>0)&&(prev_axis=="Y"))<br /> {<br /> D=1;<br /> }<br /> if(((x_fix[i]-x_fix[i-1])>0)&&(prev_axis=="-Y"))<br /> {<br /> D=2;<br /> }<br /><br /> if(((x_fix[i]-x_fix[i-1])<0)&&(prev_axis=="Y"))<br /> {<br /> D=3;<br /> }<br /> if(((x_fix[i]-x_fix[i-1])<0)&&(prev_axis=="-Y"))<br /> {<br /> D=4;<br /> }<br /><br /> if(((x_fix[i]-x_fix[i-1])>0)&&(prev_axis=="-X"))<br /> {<br /> D=5;<br /> }<br /> if(((x_fix[i]-x_fix[i-1])<0)&&(prev_axis=="X"))<br /> {<br /> D=6;<br /> }<br /> }<br /> <br /> if((y_fix[i]-y_fix[i-1])!=0)<br /> {<br /> if(((y_fix[i]-y_fix[i-1])>0)&&(prev_axis=="X"))<br /> {<br /> D=7;<br /> }<br /> if(((y_fix[i]-y_fix[i-1])>0)&&(prev_axis=="-X"))<br /> {<br /> D=8;<br /> }<br /><br /> if(((y_fix[i]-y_fix[i-1])<0)&&(prev_axis=="X"))<br /> {<br /> D=9;<br /> }<br /> if(((y_fix[i]-y_fix[i-1])<0)&&(prev_axis=="-X"))<br /> {<br /> D=10;<br /> }<br /><br /> if(((y_fix[i]-y_fix[i-1])>0)&&(prev_axis=="Y"))<br /> {<br /> D=11;<br /> }<br /> <br /> if(((y_fix[i]-y_fix[i-1])<0)&&(prev_axis=="-Y"))<br /> {<br /> D=12;<br /> }<br /> }<br /> NumOut(0,LCD_LINE1,D);<br /> switch(D)<br /> {<br /> case 1:<br /> BotRightTurn();<br /> prev_axis="-X";<br /> break;<br /> case 2:<br /> BotLeftTurn();<br /> prev_axis="-X";<br /> break;<br /> case 3:<br /> BotLeftTurn();<br /> prev_axis="X";<br /> break;<br /> case 4:<br /> BotRightTurn();<br /> prev_axis="X";<br /> break;<br /> case 5:<br /> LightSensorTouchLine();<br /> Off(Motors);<br /> Wait(SEC_1);<br /> TireTouchLine(500);<br /> BotWalking();<br /> prev_axis="-X";<br /> break;<br /> case 6:<br /> LightSensorTouchLine();<br /> Off(Motors);<br /> Wait(SEC_1);<br /> TireTouchLine(1400);<br /> BotWalking();<br /> prev_axis="X";<br /> break;<br /> case 7:<br /> BotRightTurn();<br /> prev_axis="Y";<br /> break;<br /> case 8:<br /> BotLeftTurn();<br /> prev_axis="Y";<br /> break;<br /> case 9:<br /> BotLeftTurn();<br /> prev_axis="-Y";<br /> break;<br /> case 10:<br /> BotRightTurn();<br /> prev_axis="-Y";<br /> break;<br /> case 11:<br /> LightSensorTouchLine();<br /> Off(Motors);<br /> Wait(SEC_1);<br /> TireTouchLine(500);<br /> BotWalking();<br /> prev_axis="Y";<br /> break;<br /> case 12:<br /> LightSensorTouchLine();<br /> Off(Motors);<br /> Wait(SEC_1);<br /> TireTouchLine(1400);<br /> BotWalking();<br /> prev_axis="-Y";<br /> break;<br /> }<br /> i++;<br /> }<br /> }<br /> Off(Motors);<br />}<br /><br />task main()<br />{<br /> SetSensorLowspeed(ColorSensorPort);<br /> SetSensorLight(LightSensor1Port,true);<br /> SetSensorLight(LightSensor2Port,true);<br /> ArrayBuild(x,0,-1,-1,-1,-2,-2,-2,-1,-1,-2);<br /> ArrayBuild(y,1, 1, 2, 3, 3, 2, 1, 1, 0, 0);<br /> LoopAdjust();<br /> InitialLightSensor();<br /> while(!ButtonPressed(BTNCENTER,false));<br /> ClearScreen();<br /> ShortLoopGo();<br />}<br /><br /></pre><br />●★●★●★●★●★●★●★●★●★●★<br />程式說明<br />1.LoopAdjust()函式-用以調整簡化最短路徑<br />2.BotWalking()函式-電腦鼠走黑線的副函式<br />3.LightSensorTouchLine()、TireTouchLine()-讓電腦鼠光感、輪胎在轉彎處修正其位置<br />4.BotRightTurn()-電腦鼠右轉副函式<br />5.BotLeftTurn()-電腦鼠左轉副函式<br />6.ShortLoopGo()-最短路徑副函式-本篇文章核心函式(Kernel Sub-Function)<br />(1)根據電腦鼠座標位置,於叉路轉彎,共有12個條件式<br />(2)依現行軌道,從起點處向上(或向前)Y為正,向下(或向後)Y為負;<br />(3)從起點處向左X為正,向右為負。<br />(4)前述2,3根據電腦鼠依現在座標、下一個駐點座標的二者地理位置座標,決定左右轉或前行,方向由使用者定義方向,於程式中設定之。<br /><br />[執行結果]<br /><br /><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dycTGIms90FlvzW8caxydX7uZhyQFtpayyPhZ-vD9-3P63JqBix6noEqEuqZcqIdjtaHLtl5oLN1m8wUbd9cw' class='b-hbp-video b-uploaded' frameborder='0'></iframe>薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com4tag:blogger.com,1999:blog-4628854759080439773.post-86790309423528382562011-12-09T17:11:00.000-08:002011-12-17T01:30:37.438-08:00篩選簡化路徑的Line Follower續前一篇[<a href="http://cmackimo.blogspot.com/2011/12/line-follower.html">具路徑規劃的Line Follower</a>],當電腦鼠(nxt car)從起點走到終點後,根據前述的程式,我們是將所經過的路徑之x-y座標,存成檔案紀錄在nxt檔案夾中,可供我們事後觀測座標路徑正確與否。<br /><br />其次,我們打算根據所走的x-y所有點,計算較短路徑。<br /><br /><a href="http://3.bp.blogspot.com/-d_JlmTymUDA/TuKzSKdmFSI/AAAAAAAAAQI/IWw0j71JC28/s1600/2011-12-03%2B17.59.01.jpg"><img style="cursor:pointer; cursor:hand;width: 320px; height: 192px;" src="http://3.bp.blogspot.com/-d_JlmTymUDA/TuKzSKdmFSI/AAAAAAAAAQI/IWw0j71JC28/s320/2011-12-03%2B17.59.01.jpg" alt="" id="BLOGGER_PHOTO_ID_5684302804322489634" border="0" /></a><br />(圖1 電腦鼠軌道)<br /><br />程式的規劃,電腦鼠在路徑行走時,採右手法則(即遇到叉路時,以右轉優先,其次為直行,最後為左轉)。<br />從圖1,可以知道:<br />當電腦鼠走到(-1,1)時,以右手法則轉向右邊,途經(-1,2)、(-1,3)、(-2,3)、(-2,2)、(-2,1),最後又會到(-1,1)的點,之後右轉至(-1,0),再轉至終點(-2,0)。<br />這過程中,電腦鼠途經(-1,2)、(-1,3)、(-2,3)、(-2,2)、(-2,1)這些座標的點,對我們直觀的判斷,這些中途繞道的點,應該是多餘的。<span style="color: rgb(255, 0, 0);">所以之後的程式,應該根據所有走過的座標,去篩選哪些是不必要再走的。</span><br /><br />本篇文章,先設計一測試程式,將電腦鼠走過的座標,存成陣列,並逐步篩選以簡化路徑。<br /><br />[程式]<br /><a href="http://3.bp.blogspot.com/-iR0zYIQgAvo/TuK7oraI3rI/AAAAAAAAAQg/bDB2Uv1G4CE/s1600/%25E5%259C%2596%25E7%2589%25871.jpg"><img style="cursor:pointer; cursor:hand;width: 181px; height: 320px;" src="http://3.bp.blogspot.com/-iR0zYIQgAvo/TuK7oraI3rI/AAAAAAAAAQg/bDB2Uv1G4CE/s320/%25E5%259C%2596%25E7%2589%25871.jpg" alt="" id="BLOGGER_PHOTO_ID_5684311987216506546" border="0" /></a><br />(圖2 簡化路徑之程式)<br /><br />圖2程式:<br />x[ ],y[ ]為原始數據,而x_fix[ ], y_fix[ ]為簡化後記錄的座標數據<br />程式從第一組元素(element)開始往後比對,i為參考組,j為比對組。<br />後面各組(j)若有與參考組(i)的座標雷同,則記錄該點至x_fix及y_fix。<br />(基本上,當電腦鼠會走回原來的地方,代表剛剛所經過的路徑必不是終點存在的區域,既然回到原來的地方,所以剛剛繞過的地方可捨去不用)<br /><br /><a href="http://1.bp.blogspot.com/-QilPF2sv46Y/TuLCtS13trI/AAAAAAAAAQs/VqFLYXJb720/s1600/%25E5%259C%2596%25E7%2589%25871.jpg"><img style="cursor:pointer; cursor:hand;width: 320px; height: 50px;" src="http://1.bp.blogspot.com/-QilPF2sv46Y/TuLCtS13trI/AAAAAAAAAQs/VqFLYXJb720/s320/%25E5%259C%2596%25E7%2589%25871.jpg" alt="" id="BLOGGER_PHOTO_ID_5684319763102676658" border="0" /></a><br />(圖3 電腦鼠走過的座標示意圖)<br /><br />從圖3,籃框處中間的其他各點,為非必要的途徑,所以可捨去。<br />所以經過篩選後,最後的座標為:<br />(0,1)-->(-1,1)-->(-1,0)-->(-2,0)<br /><a href="http://4.bp.blogspot.com/-yDZRNfHbOzg/TuK66PCDSdI/AAAAAAAAAQU/xQ09V-LuQiA/s1600/%25E5%259C%2596%25E7%2589%25871.jpg"></a>薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com0tag:blogger.com,1999:blog-4628854759080439773.post-70350391965668016482011-12-03T01:51:00.000-08:002011-12-17T01:32:53.433-08:00具路徑紀錄之Line Follower前些日子,採購了一顆具備辨色能力之hitechnic color sensor,並應用在Line Follower實務,在等距之處貼上色貼,刻劃橫坐標x以及縱座標y。
<br />
<br /><a href="http://2.bp.blogspot.com/-RC_j5-3vstI/TtoZYJCNGzI/AAAAAAAAAP8/Cw4pRsJdOwA/s1600/2011-12-03%2B17.59.01.jpg"><img style="cursor:pointer; cursor:hand;width: 320px; height: 192px;" src="http://2.bp.blogspot.com/-RC_j5-3vstI/TtoZYJCNGzI/AAAAAAAAAP8/Cw4pRsJdOwA/s320/2011-12-03%2B17.59.01.jpg" alt="" id="BLOGGER_PHOTO_ID_5681881782414023474" border="0" /></a>
<br />(圖1 硬體地圖配置)
<br />
<br />一、硬體介紹
<br />1.圖1每一個色貼間隔,盡可能讓bot有足夠空間可以迴轉。
<br />
<br />2.起點設置在照片中車子停止的位置,硬體裝置使用三個感應器(light sensor x2、color sensor x1)。color sensor負責偵測前端是否為[色貼]標籤,做為後續判斷是否前進或左右轉彎的依據。
<br />
<br />3.light sensor分置兩側,左邊light sensor(緊鄰color sensor),負責做沿線前進的功能;右邊的light sensor,負責判斷是否做轉彎的動作…
<br />
<br />二、軟體程式
<br /><pre>
<br />#define LMotor OUT_A
<br />#define RMotor OUT_C
<br />#define Motors OUT_AC
<br />
<br />#define LightSensor1Port IN_1
<br />#define LightSensor2Port IN_2
<br />#define ColorSensorPort IN_4
<br />#define factor 2
<br />
<br />#define black_tap 0
<br />#define blue_tap1 3
<br />#define blue_tap2 4
<br />#define red_tap 9
<br />
<br />
<br />int colornum; //彩色感應器讀值
<br />int black,white,light1_value,light2_value; //光感器讀值
<br />int Lpower=0,Rpower=0;
<br />long tick=0;
<br />
<br />//紀錄車子移動方位
<br />
<br />int x=0,y=0;
<br />int D=1; //初始放在y軸上
<br />
<br />byte fileHandle;
<br />short bytesWritten;
<br />string str_log;
<br />string str_x;
<br />string str_y;
<br />
<br />void InitialLightSensor()
<br />{
<br /> while(!ButtonPressed(BTNCENTER,false))
<br /> {
<br /> TextOut(0,LCD_LINE3,"Light at black..");
<br /> black=Sensor(LightSensor1Port);
<br /> }
<br /> ClearScreen();
<br /> Wait(1000);
<br /> while(!ButtonPressed(BTNCENTER,false))
<br /> {
<br /> TextOut(0,LCD_LINE3,"Light at white..");
<br /> white=Sensor(LightSensor1Port);
<br /> }
<br /> ClearScreen();
<br /> tick=CurrentTick();
<br /> while(CurrentTick()<(tick+3000))
<br /> {
<br /> PlayTone(880,50);
<br /> Wait(950);
<br /> }
<br /> Wait(1000);
<br />}
<br />
<br />void BotWalking()
<br />{
<br /> light1_value=Sensor(LightSensor1Port);
<br /> Rpower=(light1_value-black)*factor;
<br /> Lpower=(white-light1_value)*factor;
<br /> OnFwd(LMotor,Lpower);
<br /> OnFwd(RMotor,Rpower);
<br />}
<br />
<br />void LightSensorTouchLine() //讓bot的兩個light往前推進一小步,直至壓線
<br />{
<br /> tick=CurrentTick();
<br /> while(CurrentTick()<tick+800)
<br /> {
<br /> OnFwdSync(Motors,25,0);
<br /> }
<br />}
<br />
<br />void TireTouchLine(int n) //讓bot往前移動,直至前輪壓線
<br />{
<br /> tick=CurrentTick();
<br /> while(CurrentTick()<tick+n)
<br /> {
<br /> OnFwd(LMotor,25);
<br /> OnFwd(RMotor,25);
<br /> }
<br />}
<br />void BotRightTurn() //讓bot右轉
<br />{
<br /> tick=CurrentTick();
<br /> while(CurrentTick()<tick+2050)
<br /> {
<br /> OnFwd(LMotor,25);
<br /> OnFwd(RMotor,-25);
<br /> }
<br />}
<br />
<br />void BotLeftTurn() //讓bot左轉
<br />{
<br /> tick=CurrentTick();
<br /> while(CurrentTick()<tick+1600)
<br /> {
<br /> OnFwd(LMotor,-25);
<br /> OnFwd(RMotor,25);
<br /> }
<br />}
<br />
<br />
<br />void BotTurning()
<br />{
<br /> Off(Motors);
<br /> Wait(1000);
<br /> LightSensorTouchLine();
<br /> Off(Motors);
<br /> Wait(1000);
<br />
<br /> light1_value=Sensor(LightSensor1Port);
<br /> light2_value=Sensor(LightSensor2Port);
<br /> colornum=SensorHTColorNum(ColorSensorPort);
<br />
<br /> if(light1_value>light2_value) //可右轉
<br /> {
<br /> TireTouchLine(500);
<br /> BotRightTurn();
<br /> D=D+1;
<br /> if(D>4) D=1;
<br /> }
<br /> if(light1_value<=light2_value) //可左轉
<br /> {
<br /> if(colornum==black_tap) //彩色感應器偵測到前方有黑線,可前行
<br /> {
<br /> BotWalking();
<br /> D=D;
<br /> }
<br /> if(colornum!=black_tap)
<br /> {
<br /> TireTouchLine(1400);
<br /> BotLeftTurn();
<br /> D=D-1;
<br /> if(D<1) D=4;
<br /> }
<br /> }
<br />}
<br />
<br />void AxisRecord()
<br />{
<br /> if(D==1)
<br /> {
<br /> y=y+1;
<br /> }
<br />
<br /> if(D==2)
<br /> {
<br /> x=x+1;
<br /> }
<br />
<br /> if(D==3)
<br /> {
<br /> y=y-1;
<br /> }
<br />
<br /> if(D==4)
<br /> {
<br /> x=x-1;
<br /> }
<br /> str_x=NumToStr(x);
<br /> str_y=NumToStr(y);
<br /> str_log=str_x+" "+str_y;
<br /> WriteLnString(fileHandle,str_log,bytesWritten);
<br />}
<br />
<br />void IfEndTask()
<br />{
<br /> Off(Motors);
<br /> tick=CurrentTick();
<br /> while(CurrentTick()<tick+1000)
<br /> {
<br /> PlayTone(880,20);
<br /> Wait(450);
<br /> }
<br /> AxisRecord();
<br /> StopAllTasks();
<br />}
<br />
<br />
<br />task main()
<br />{
<br /> DeleteFile("DataLog.txt");
<br /> CreateFile("DataLog.txt",10000,fileHandle);
<br />
<br /> SetSensorLowspeed(ColorSensorPort);
<br /> SetSensorLight(LightSensor1Port,true);
<br /> SetSensorLight(LightSensor2Port,true);
<br /> InitialLightSensor();
<br />}
<br />
<br />task BotWalkTask()
<br />{
<br /> Follows(main);
<br />
<br /> while(true)
<br /> {
<br /> colornum=SensorHTColorNum(ColorSensorPort);
<br /> if((colornum!=blue_tap1)||(colornum!=blue_tap2)) //判斷是否遇到叉路
<br /> {
<br /> if(colornum==red_tap)
<br /> {
<br /> IfEndTask();
<br /> }
<br /> BotWalking();
<br /> }
<br /> if((colornum==blue_tap1)||(colornum==blue_tap2))
<br /> {
<br /> AxisRecord();
<br /> BotTurning();
<br />
<br /> }
<br /> }
<br />}
<br /></pre>
<br />
<br />三、執行結果:
<br />
<br /><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dxqch8t4FXyZW9vMVysq_40cg_8uTtGqHxFFN8P5Pal0E-y0TVDxC6AHTzxikc6HuwD5GBHVrJU_FGIgJZp' class='b-hbp-video b-uploaded' frameborder='0'></iframe>薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com0tag:blogger.com,1999:blog-4628854759080439773.post-24281399037351538302011-11-24T05:38:00.000-08:002011-11-24T06:30:12.215-08:00Google App Inventor: 亂數產生器亂數產生器,隨機產生一個或一組數字,在教室情境中很受歡迎。<br />當老師想要點名,卻又不想流於形式,亂數產生器得到的號碼,讓學生無法得知下一刻是誰被點到,那種急速上升刺激與快感,難以形容。<br /><br />曾在Market找相關的軟體,卻未盡滿足我的需要,所以心中浮現用app inventor來開發,相信難度不高,且能客製化自己的需要來安排各種功能。<br /><br />首先,我的軟體介面如下:<br /><a href="http://2.bp.blogspot.com/-7VHTBz0mePI/Ts5LAAWdtCI/AAAAAAAAAPM/ruOyIMD1eaM/s1600/%25E5%259C%2596%25E7%2589%25871.jpg"><img style="cursor:pointer; cursor:hand;width: 221px; height: 320px;" src="http://2.bp.blogspot.com/-7VHTBz0mePI/Ts5LAAWdtCI/AAAAAAAAAPM/ruOyIMD1eaM/s320/%25E5%259C%2596%25E7%2589%25871.jpg" alt="" id="BLOGGER_PHOTO_ID_5678558643627078690" border="0" /></a><br />(圖1 軟體介面)<br /><br />圖1中:<br />1.[亂數範圍]可由使用者自行決定起訖範圍。<br />2.[剔除不要的號碼]欄位,由使用者自行決定亂數產生時,以不出現此欄位指定的號碼為主。<br />3.當按下[隨機產生號碼]按鈕,即產生斗大的一個號碼於畫面中。<br /><br />程式碼:<br /><a href="http://1.bp.blogspot.com/-IGXwEni1C10/Ts5M2D-0N3I/AAAAAAAAAPk/Y3IloJz5Vbo/s1600/%25E5%259C%2596%25E7%2589%25872.jpg"><img style="cursor:pointer; cursor:hand;width: 320px; height: 231px;" src="http://1.bp.blogspot.com/-IGXwEni1C10/Ts5M2D-0N3I/AAAAAAAAAPk/Y3IloJz5Vbo/s320/%25E5%259C%2596%25E7%2589%25872.jpg" alt="" id="BLOGGER_PHOTO_ID_5678560671826196338" border="0" /></a><br />上述程式中:<br />1.StartNum及EndNum變數,分別指定為主畫面使用者輸入起訖號碼<br />2.RndNo變數,由[random integer函式],隨機產生一數字並指定回RndNo,範圍如上述1.<br />3.RemoveElementNum變數,使用者指定[剔除號碼]後,系統自動統計其個數,並指定給RemoveElementNum<br />4.for range迴圈:<br />檢視[隨機產生的數字]是否與[欲剔除的數字]相等?若相等,則重新產生一個新的數字。直至不重複為止。薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com0tag:blogger.com,1999:blog-4628854759080439773.post-37093635869272893422011-11-19T00:17:00.000-08:002011-11-19T01:02:08.756-08:00Hitechnic Color Sensor 測試一、硬體方面<br /><blockquote>color sensor 接在nxt主機上的IN_4。</blockquote>二、軟體方面<br /><blockquote>根據[<a href="http://www.freelug.org/spip.php?article1030">Third-party <span class="spip_surligne">sensors</span>: a review of some <span class="spip_surligne">Hitechnic</span>’s <span class="spip_surligne">sensors</span></a>]一文提到:<br /><span style="font-style: italic;">The new and totally redesigned </span><span style="font-style: italic;" class="spip_surligne">HiTechnic</span><span style="font-style: italic;"> </span><span style="font-style: italic;" class="spip_surligne">Color</span><span style="font-style: italic;"> </span><span style="font-style: italic;" class="spip_surligne">Sensor</span><span style="font-style: italic;"> Version 2 (V2) operates by using a single white LED (light emitting diode) to illuminate the target and analyses the </span><span style="font-style: italic;" class="spip_surligne">color</span><span style="font-style: italic;"> components of the light reflected by the target’s surface and calculates a </span><span style="font-style: italic;" class="spip_surligne">Color</span><span style="font-style: italic;"> Number that is returned to the NXT program.</span><br /><p><strong><span class="spip_surligne">Sensor</span> Register Layout</strong></p><table class="spip"><thead><tr class="row_first"><th scope="col">Adress</th><th scope="col">Type</th><th scope="col">Contents</th></tr></thead><tbody><tr class="row_even"><td>42H</td><td>byte</td><td><span class="spip_surligne">Color</span> number</td></tr><tr class="row_odd"><td>43H</td><td>byte</td><td>Red reading</td></tr><tr class="row_even"><td>44H</td><td>byte</td><td>Green reading</td></tr><tr class="row_odd"><td>45H</td><td>byte</td><td>Blue reading</td></tr></tbody></table><p style="font-style: italic;">Procedures are already available in Bricxcc to use the <span class="spip_surligne">sensor</span>:</p><ul style="font-style: italic;" class="spip"><li><strong><span class="spip_surligne">SetSensorLowspeed</span>()</strong> initializes the I2C communication with the <span class="spip_surligne">sensor</span>.</li><li><strong><span class="spip_surligne">SensorHTColorNum</span>(port)</strong> returns the value of <span class="spip_surligne">Color</span> number.</li><li><strong><span class="spip_surligne">ReadSensorHTRawColor</span>(port, rouge, vert, bleu)</strong> returns the RGB readings.</li><li><strong><span class="spip_surligne">ReadSensorHTColor</span>(port, index, rouge, vert, bleu)</strong> returns the value of <span class="spip_surligne">Color</span> number, and the RGB readings. See the code example at the end of the article ...</li></ul></blockquote><blockquote>所以在NXC的程式基本採用的指令,包含二個:<br />1. SetSensorLowspeed(IN_4)<br />2. ReadSensorHTColor(IN_4,colorvalue,r,g,b)<br />其中,IN_4是彩色感應器接向IN_4,而colorvalue是經由color sensor回應的讀值,r,g,b分別為red,green,blue三原色的數值。</blockquote><a href="http://4.bp.blogspot.com/-mZ93NbbdDc8/TsdwhVchghI/AAAAAAAAAO8/XlXii0EkkP8/s1600/Color_Number.jpg"><img style="cursor:pointer; cursor:hand;width: 204px; height: 246px;" src="http://4.bp.blogspot.com/-mZ93NbbdDc8/TsdwhVchghI/AAAAAAAAAO8/XlXii0EkkP8/s320/Color_Number.jpg" alt="" id="BLOGGER_PHOTO_ID_5676629573318574610" border="0" /></a><br />三、程式碼<br /><pre>#define ColorSensorPort IN_4<br /><br />task main()<br />{<br /><br /> byte r,g,b;<br /> byte colorvalue;<br /> SetSensorLowspeed(ColorSensorPort);<br /><br /> while(true)<br /> {<br /> ReadSensorHTColor(ColorSensorPort, colorvalue,r,g,b);<br /> NumOut(0,LCD_LINE3,colorvalue);<br /> if (colorvalue==0) PlayTone(880,25);<br /> Wait(25);<br /> ClearScreen();<br /> }<br />}<br /><br />上述程式是說:<br />當color sensor讀值(colorvalue)=0,則PlayTone一個短音。<br />colorvalue=0-->黑色<br /></pre>薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com0tag:blogger.com,1999:blog-4628854759080439773.post-1889034044536074172011-10-22T04:36:00.000-07:002011-10-22T04:55:11.793-07:00Google App Inventor - 使用手機的語音控制如果你的手機支援語音搜尋,那麼應該可以啟用語音辨識的操作。<br />這個功能可以替代手寫,英語的辨識率還算不錯,但中文辨識率不太高就是了。<br />(假如假設你發音正確,那麼應該可以顯示將你想說的語音轉成文字)<br /><br />首先,我在手機介面上,設計如下的簡易畫面來進行測試:<br /><a href="http://4.bp.blogspot.com/-9Ya8K0_iOQs/TqKrWnjxzZI/AAAAAAAAAOE/55PC9yFeCEE/s1600/%25E5%259C%2596%25E7%2589%25871.jpg"><img style="cursor:pointer; cursor:hand;width: 320px; height: 258px;" src="http://4.bp.blogspot.com/-9Ya8K0_iOQs/TqKrWnjxzZI/AAAAAAAAAOE/55PC9yFeCEE/s320/%25E5%259C%2596%25E7%2589%25871.jpg" alt="" id="BLOGGER_PHOTO_ID_5666279686250024338" border="0" /></a><br />(圖1)手機操作畫面<br /><br />圖1中,我引用了App inventor的Other stuff中的[Speech recognizer]元件作語音控制。<br />而[按下後說話]的按鈕,是用來啟用speech recognizer,當你按下後即可說話。<br />簡單說了一段英文或中文語句,文字將顯示在圖中的Voice2TextResult文字欄位。<br /><br />-------------------------------<br />其次,開啟Block Editor,進行程式編輯。<br />程式設計如下:<br /><a href="http://1.bp.blogspot.com/-qQy8rT3ShKw/TqKsjO6I9aI/AAAAAAAAAOQ/i4ytMS9lHVk/s1600/%25E5%259C%2596%25E7%2589%25872.jpg"><img style="cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://1.bp.blogspot.com/-qQy8rT3ShKw/TqKsjO6I9aI/AAAAAAAAAOQ/i4ytMS9lHVk/s320/%25E5%259C%2596%25E7%2589%25872.jpg" alt="" id="BLOGGER_PHOTO_ID_5666281002482857378" border="0" /></a><br />(圖2)程式內容<br /><br />圖2中:<br />1. SpeechAfterPressedBtn-即按鈕,按下按鈕後,開始說話。<br /> call SpeechRecognizer1.GetText,呼叫語音辨識,取得文字。<br />2. When...SpeechRecognizer1.BeforeGettingText-<br /> 當操作者還在說話時,介面上Voice2TextResult文字欄位的內容為空白<br />3. When...SpeechRecognizer1.AfterGettingText-<br /> 將Voice2TextResult文字欄位指定為SpeechRecognizer1.Result<br /> 即所說的內容,經過語音辨識後將文字呈現在Voice2TextResult文字欄位<br /><br />--------------------------<br />有興趣的玩家,可以利用這樣的功能,實現在NXT的藍芽控制,當你說:<br />Go或是向前、Back或是向後、Left或是向左、Right或是向右,經過語音辨識,再結合<br />前述<a href="http://cmackimo.blogspot.com/2011/08/google-app-inventor-segway.html">[Google App Inventor -手機藍芽遙控Segway</a>]的方法,程式稍微修改一下就可<br />讓你的機器人用語音控制前進,後退、向左及向右了。薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com2tag:blogger.com,1999:blog-4628854759080439773.post-27249405946088058042011-10-15T04:26:00.000-07:002011-10-15T04:32:08.752-07:00利用手機的指北針感應器,來做方位感測前幾天利用手機的digital compass sensor (orientation sensor),拿來做為方位的度量。<br />設計的機構如下:<br /><br /><a href="http://3.bp.blogspot.com/-5vpenMGwV-Q/TpluaWBGAMI/AAAAAAAAANg/v40W9aJrO2g/s1600/298716_299728956709113_100000160327950_1426816_267547270_n.jpg"><img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/-5vpenMGwV-Q/TpluaWBGAMI/AAAAAAAAANg/v40W9aJrO2g/s320/298716_299728956709113_100000160327950_1426816_267547270_n.jpg" alt="" id="BLOGGER_PHOTO_ID_5663679405260931266" border="0" /></a><br />結果發現,這樣的機構,因為太靠近nxt motor,會產生磁場嚴重的干擾而使度量發生錯誤。<br />今天再改裝加高鷹架,機構如圖:<br /><br /><a href="http://1.bp.blogspot.com/-UUUYsACEdUg/TpluwQ_wLbI/AAAAAAAAANs/U2_n76KyTNs/s1600/DSCF0005.JPG"><img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/-UUUYsACEdUg/TpluwQ_wLbI/AAAAAAAAANs/U2_n76KyTNs/s320/DSCF0005.JPG" alt="" id="BLOGGER_PHOTO_ID_5663679781870251442" border="0" /></a><a href="http://4.bp.blogspot.com/-4__a2akWxIQ/Tplu3oVGGQI/AAAAAAAAAN4/473SxdNBD1o/s1600/DSCF0004.JPG"><img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-4__a2akWxIQ/Tplu3oVGGQI/AAAAAAAAAN4/473SxdNBD1o/s320/DSCF0004.JPG" alt="" id="BLOGGER_PHOTO_ID_5663679908392868098" border="0" /></a><br />尚未測試,也許可以改善。測試的結果待續。薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com0tag:blogger.com,1999:blog-4628854759080439773.post-84434838374955982011-09-20T20:48:00.000-07:002011-09-21T03:07:39.913-07:00Google App Inventor - 使用手機的LocationSensor讀取經緯資料現在的手機只要具備GPS的功能,就可以使用Google App Inventor裡的LocationSensor 來讀取<br />所在位置的經緯度、高度等資料。<br /><br /><a href="http://2.bp.blogspot.com/-SBqd6StaLuM/Tnmo0QHRqdI/AAAAAAAAAL4/RGgf-uEPGLs/s1600/%25E5%259C%2596%25E7%2589%25871.png"><img style="cursor:pointer; cursor:hand;width: 274px; height: 320px;" src="http://2.bp.blogspot.com/-SBqd6StaLuM/Tnmo0QHRqdI/AAAAAAAAAL4/RGgf-uEPGLs/s320/%25E5%259C%2596%25E7%2589%25871.png" alt="" id="BLOGGER_PHOTO_ID_5654736422772517330" border="0" /></a><br />(圖1-軟體介面外型)<br /><br />部分程式:<br /><a href="http://3.bp.blogspot.com/-CGl0-jMXV8Q/TnmpvHo7X_I/AAAAAAAAAMA/eh0xuO09WXU/s1600/%25E5%259C%2596%25E7%2589%25873.jpg"><img style="cursor:pointer; cursor:hand;width: 320px; height: 167px;" src="http://3.bp.blogspot.com/-CGl0-jMXV8Q/TnmpvHo7X_I/AAAAAAAAAMA/eh0xuO09WXU/s320/%25E5%259C%2596%25E7%2589%25873.jpg" alt="" id="BLOGGER_PHOTO_ID_5654737434110025714" border="0" /></a><br />其中:<br />1. [value latitude] -->由Location Sensor傳回的緯度數據<br />2. [value longitude]-->由Location Sensor 傳回的經度數據<br />3. LatitudeReport.Text --> 將[value latitude]顯示在(圖1)的緯度欄位<br />4. LongitudeReport.Text-->將[value longitude]顯示在(圖1)的經度欄位<br />5. AddressReport.Text-->將[LocationSensor1.CurrentAddress]的結果顯示在位址欄位<br /><br />至於已知兩處AB的經緯度,如何得知A-B間最短的距離?<br />我利用:<br /><a href="http://3.bp.blogspot.com/-MQkssP1ls24/Tnm2ppvVbZI/AAAAAAAAAMI/EuHqER4fa_M/s1600/%25E5%259C%2596%25E7%2589%25874.jpg"><img style="cursor:pointer; cursor:hand;width: 320px; height: 34px;" src="http://3.bp.blogspot.com/-MQkssP1ls24/Tnm2ppvVbZI/AAAAAAAAAMI/EuHqER4fa_M/s320/%25E5%259C%2596%25E7%2589%25874.jpg" alt="" id="BLOGGER_PHOTO_ID_5654751633835650450" border="0" /></a><br />其中:<br />其中 <img src="http://latex.codecogs.com/gif.latex?d" /> 為大圓距離, <img src="http://latex.codecogs.com/gif.latex?r" /> 是地球半徑(6371km),而點 1 經度、緯度分別為 <img src="http://latex.codecogs.com/gif.latex?%5Clambda_1" /> 、 <img src="http://latex.codecogs.com/gif.latex?%5Cphi_1" /> ,點 2 的經度、緯度分別為 <img src="http://latex.codecogs.com/gif.latex?%5Clambda_2" /> 、 <img src="http://latex.codecogs.com/gif.latex?%5Cphi_2" /> 。<br />其實這只是球面三角餘弦公式的推廣,注意經緯度的度數計算時要轉成徑度,才會計算正確。<br />d算出來的單位為km.薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com4tag:blogger.com,1999:blog-4628854759080439773.post-91130300987771024342011-09-14T06:21:00.000-07:002011-09-14T07:35:01.806-07:00Google App Inventor- 製作找方位軟體坊間有一些support Compass的軟體,以圖像的方式做出指北針,操作者可由指針朝北定出方位。<br /><br />筆者試著以<a href="http://www.appinventorbeta.com/">Google App inventor</a>製作一簡易型的指北針,只要您的手機有Orientation Sensor就具備數位指北針的支援。<br /><br /><a href="http://2.bp.blogspot.com/-KDwwvIXkAmw/TnCtwLK_EyI/AAAAAAAAALo/uzUOQU0Nho0/s1600/%25E5%259C%2596%25E7%2589%25871.jpg"><img style="cursor:pointer; cursor:hand;width: 212px; height: 320px;" src="http://2.bp.blogspot.com/-KDwwvIXkAmw/TnCtwLK_EyI/AAAAAAAAALo/uzUOQU0Nho0/s320/%25E5%259C%2596%25E7%2589%25871.jpg" alt="" id="BLOGGER_PHOTO_ID_5652208575494165282" border="0" /></a><br />(圖1)<br /><br />介面說明:<br /><blockquote>1. [Compass Test]-軟體標題<br />2. [CurrentDirection]-標籤文字<br />3. [TextBox]-存放方位感測器(Orientation Sensor)的方位<br />4. [CheckDirection]- 按鈕每點一次,可搜尋當前方位角<br />5. 引用OrientationSensor,並設定為[enable]</blockquote><br /><br />※使用AppInventor,介面可使用中文字,但Block Editor僅能使用英文字,設計時須注意。<br /><a href="http://3.bp.blogspot.com/-ANbHRhahyck/TnCz4tfemJI/AAAAAAAAALw/WRw_xiYnTxE/s1600/%25E5%259C%2596%25E7%2589%25872.jpg"><img style="cursor:pointer; cursor:hand;width: 82px; height: 320px;" src="http://3.bp.blogspot.com/-ANbHRhahyck/TnCz4tfemJI/AAAAAAAAALw/WRw_xiYnTxE/s320/%25E5%259C%2596%25E7%2589%25872.jpg" alt="" id="BLOGGER_PHOTO_ID_5652215319215642770" border="0" /></a><br />(圖2)<br /><br />圖2即Block Edit的程式碼。<br />由appinventor手冊提供的orientation sensor,偵測到的為數值,介於0~359。<br />其中:<br />0: 北方<br />90: 東方<br />180: 南方<br />270: 西方<br /><br />筆者將數值轉化成文字,使操作的時候較易識別。<br />-------------------------------<br />※測試時,操作者將手機任意指向一方位,按下[CheckDirection]按鈕,即馬上顯示該方位的方位角,但無角度顯示,僅以16方位之結果顯示之。<br />即:<br /><blockquote>東、西、南、北<br />東南、東北、東南東、南東南、北北東、東北東<br />西南、西北、西南西、南南西、西北西、北北西</blockquote>薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com0tag:blogger.com,1999:blog-4628854759080439773.post-29214116919268072902011-09-04T01:06:00.000-07:002011-09-04T01:28:03.269-07:00手機藍芽遙控挖土機<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.blogger.com/video.g?token=AD6v5dwg-K7nAbffZukp0fKFtJmtKg16OysrS9NFvNpqA2TTNBAit9pqQw7tGLT44QlJ7vyPGpwfXQnwEl3iXKg' class='b-hbp-video b-uploaded' frameborder='0'></iframe>
<br />
<br />這個遙控的原理承襲前述藍芽遙控的方式,技術上大同小異。
<br />bot裝置參考[<a href="http://mindstorms.lego.com/en-us/support/buildinginstructions/8527-/T-56.aspx">Lego.com Mindstorms</a>]部分的接法。
<br />機身略有修改。
<br />薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com0tag:blogger.com,1999:blog-4628854759080439773.post-49906768345391773322011-09-01T06:14:00.000-07:002011-09-01T06:43:40.783-07:00VB設計:讓電腦自動偵測SerialPort,並自動與nxt連線在上一篇[<a href="http://cmackimo.blogspot.com/2011/08/nxt.html">利用藍芽技術,讓電腦可控制NXT主機</a>],當時談到:
<br />
<br />在設計時,使用者必須先知道自己的電腦對外連線的輸出埠(Com port)並連結,才能讓電腦透過藍芽連線裝置。
<br />
<br />然而,如果能夠設計一程式,讓電腦在開啟軟體後,能夠自動偵測與連結電腦現有的輸出埠,而無須使用者去指定,便能增加其便利性。
<br />
<br />換句話說,電腦到底選中哪一個輸出埠,交由軟體自己去尋找與連線,而不再經由使用者去確認與指定。
<br />
<br />我的作法是:
<br /><a href="http://3.bp.blogspot.com/-r8WXFBBAU6I/Tl-JIYLw5VI/AAAAAAAAALg/Tszx-2RPg-o/s1600/%25E5%259C%2596%25E7%2589%25871.jpg"><img style="cursor:pointer; cursor:hand;width: 275px; height: 320px;" src="http://3.bp.blogspot.com/-r8WXFBBAU6I/Tl-JIYLw5VI/AAAAAAAAALg/Tszx-2RPg-o/s320/%25E5%259C%2596%25E7%2589%25871.jpg" alt="" id="BLOGGER_PHOTO_ID_5647383234769642834" border="0" /></a>ˋ
<br />上圖即VB建構的一個畫面,畫面上方做一個MenuStrip,裡面的item包含Connect 、Disconnect
<br />以及結束。
<br />
<br />當按下[connect]的item,程式碼相對應的內容如下:
<br />
<br /><pre> Private Sub ComPortConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComPortConnect.Click
<br /> Dim com_port As String = ""
<br />
<br /> For Each sp As String In My.Computer.Ports.SerialPortNames
<br /> com_port = sp
<br /> Next
<br />
<br /> SerialPort1.PortName = com_port
<br /> SerialPort1.Open()
<br /> ConnStatus.Text = com_port + " is Connected"
<br /> End Sub
<br /></pre>------
<br />其中:
<br />1.ComPortConnect_Click() 代表按下該item後即將完成的動作行為
<br />2. Dim com_port As String ="": 宣告com_port為字串變數,其初始值為空字串
<br />3. For Each sp.....:這一段的敘述,讓電腦自動尋找已建立的com port name有哪些,其結果回傳給sp變數,並指定給com_port
<br />4. SerialPort1.PortName = com_port: 指定SerialPort的PortName為被找到的com_port
<br />5. SerialPort1.Open( ): 開啟該com_port的序列埠
<br />6. ConnStatus是畫面裏頭的文字方塊(TextBox),當連線成功,則在該TextBox顯示COM(x) is connected!
<br />
<br />當按下[Disconnect]的item,相對應程式碼如下:
<br />
<br /><pre>
<br /> SerialPort1.Close()
<br /> ConnStatus.Text = "Wait to connect!"
<br /></pre>
<br />上述意思是:
<br />把SerialPort開啟的序列埠關閉,並於文字方塊顯示Wait to connect!
<br />薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com4tag:blogger.com,1999:blog-4628854759080439773.post-53201628268015366282011-08-23T09:00:00.000-07:002011-08-23T09:02:43.070-07:00Kinect技術,值得研究!今天在大潤發特別停駐在Kinect看人打電玩的時候,不是因為電玩好玩到甚麼程度,而是Kinect感應器的技術吸引我。
<br />
<br />-----------------
<br />目前Kinect的技術有三大主流:Kinect一次可擷取三種東西,分別是彩色影像、3D深度影像、以及聲音訊號。
<br />
<br />Kinect主要就是靠3D深度感應器偵測玩家的動作。中間視訊鏡頭則是用來辨識玩家身分(靠著人臉辨識和身體特徵)、以及辨識基本的臉部表情。
<br />-----------------
<br />
<br />這可以提供給做影像辨識的研究一個方向,傳統的影像辨識各家學派技術推陳出新,技術艱深難懂,如果能夠統一規格,當然對間接使用這項技術應用的人來說,他也許不需要再學辨識技術,只要接續這項技術的後端,繼續開發更多的應用,這真的很不錯喔。
<br />
<br />當然,以遊戲的角度來思考,Kinect的技術優於Wii或PS,在於使用者無須背負(手持)感應器(如Wii要手持遙控器),Kinect完全拋棄這些雜七雜八的東西,讓使用者更輕盈。
<br />
<br />寒假再來好好研究這一項技術。薛老師http://www.blogger.com/profile/06138911994667065764noreply@blogger.com0