Category Archives: Arduino嵌入式開發板

[ 介紹文 ] 2018.11.02- 兒時夢想達成!!!四驅車GP晶片大改造

文字

建國中學生活科技科趙珩宇老師

照片、影片

建國中學生活科技科趙珩宇老師

 

身為七年級生,四驅車或爆走兄弟應該是引導大家成為Maker的第一個模型或動畫。製作四驅車除了可以針對外觀塗裝進行設計外,小時候也常將馬達拆開,自己重新纏線製作更強大的馬達;或透過增加配重,使車子跑起來更平穩。但在四驅迷心目中,最大的夢想還是能完成那神秘的GP晶片,而這夢想也深深埋藏於我心中,直到長大後才有機會實現。

 

GP晶片大改造

說是GP晶片,其實只是拿手上的Arduino板進行改裝而已。拿自造的Arduino板,結合自己做的線控自走車模組,加上藍牙晶片就完成改裝了。會採用這樣的方式整個重新製作,主要是因四驅車內的空間太小,但筆者不希望破壞四驅車的車殼,因此用自己的Arduino板重新製作比較快,能將整個晶片組的厚度降至9mm以下。

圖1

 

圖2

 

下圖是筆者自己製作的Arduino板搭配藍牙(個人覺得用ESP8266、nodmcu⋯⋯等板子製做,應該會更好。)

圖3

 

接下來便與讀者們分享幾張四驅車的相關照片:

圖4

 

圖5

 

圖6

 

圖7

 

至於,為什麼會有這組四驅車的軌道呢?原來是CAVEDU教育團隊的腦波弱老闆慷慨出借!這樣,讀者們終於知道他的家當有多豐富了吧!接著,請看以下兩部測試影片:

 

 

這週六、日,在華山文化創意產業園區舉行的Maker Faire Taipei 2018中,筆者會在線控機器人展攤,並由我所指導的社團學生帶大家一起玩四驅車,歡迎一起來同樂 :D!並歡迎讀者們關注「建中創造發明社社團 https://www.facebook.com/CKIC7th/)」,謝謝。

圖8

 

相關文章

[ 介紹文 ]CAVEDU教育團隊如何看AI 與科技教育

作者/攝影

文:曾吉弘

圖:CAVEDU教育團隊

主題圖片:Designed by Starline

文章分類介紹文
成本X
難度

X

時間X

 

CAVEDU怎麼看 AI 人工智慧

近年來全世界都掀起了一股「大家來coding」的風潮,台灣政府也開始推動基礎程式教育,目標是讓孩子們能在學習程式設計的過程中培養基礎的運算思維(Computational thinking)能力,能對這個快速變動的環境有更多的好奇心與觀察力。另一方面,自從大陸在今年(2018) 4月於上海發表全球第一本AI高中教材《人工智能基礎》之後,大家好像都緊張了起來:

  • 業界:「不 AI 一下,好像不行?得趕快說自己是 AI 產業。

  • 家長、同學:「我要找 AI 相關科系!」(當年的生科與資管也是這樣?)

  • 學校老師:「把原本的課程名稱加上AI兩個字!

 

上述也許誇大了點,但科技領域關鍵字一日數變,AI 領域又包山包海,除了極少數頂尖研究者之外,又有誰敢說自己是 AI大師、AI領航者呢?

 

AI 等資訊科技是現在進行式,今天弄得要死要活的東西,明天說不定點點按鈕就好了?近兩年物聯網教學就是很好的例證,使用 LinkIt 7697 搭配 MCS 雲服務,已經能讓國小學生也能做出簡單的物聯網專案,從網頁與手機就能監看感測器資訊或控制開發板。在此的並非說網路通訊協定不重要,而是對於非專業人士來說,這樣的設計能幫助他們聚焦在最重要的事情上:資料。如果資料對於開發者來說是有意義或是重要的,那先從資料本身開始是個相當好的出發點。

圖1

 

圖2

 

關鍵字會變,但流程與理論基礎不會。CAVEDU從2008年開始使用樂高機器人來教學(如果要回溯到我與鄭建彥最開始接觸樂高的話,那是1999年的RCX了),一路邁入手機App (Android / App Inventor@2010)、互動聯網裝置(Arduino / Rpi / LinkIt…@2013)、物聯網(@2015) 到去年開始如野火燎原一般的 AI。如果只追關鍵字的話,真的會無所適從。

 

根據美國麻省理工學院媒體實驗室終身幼兒園小組的Mitchel Resnick教授表示,幼兒(小學前)時期可說是我們一生中最具創造力的時候。該團隊所開發的 Scratch 已經是小學階段的最主要圖形化程式介面之一,Resnick教授也主張 「Scratch 是幫助孩子們成為創意思考者(Creative Thinker)的絕佳平台」,並致力於讓 Scratch 「很簡單」,他認為程式提供愈多功能或愈多元件反而會限縮孩子們的創造力。(關於創意思考者,請參考 Learning Creative Learning 課程,正體中文由阿吉老師與諸多好朋友一起翻譯完成。)

 

另一方面,MIT App Inventor小組創辦人 Hal Abelson 教授(阿吉老師於2017- 2018 於該實驗室擔任訪問學者)也說:「如果資訊科技一日數變,那為什麼還要讓孩子們和他們的祖父母一樣的方式來學習?” 因此,在這股浪潮下也有另一種反思:「是否人人都需要學如何寫程式?這樣同質化的過程會對孩子造成怎樣的影響?

 

CAVEDU的理念是:根據當前的科技發展趨勢,針對不同學習課群提供合適的教學內容。

 

對於孩子來說,好玩最重要

圖3

 

圖4

 

點我觀看與Hal Abelson教授的訪談   /   點我觀看與Mitchel Resnick教授的訪談

 

使用 Raspberry Pi 實作AI 視覺辨識無人小車

AI 對多數人來說,還是太虛無飄渺了。CAVEDU 為了讓學生理解 AI 諸多領域中最容易有感也是最容易實踐的:視覺辨識,我們使用 Raspberry Pi B3+ (後簡稱 Pi3)所設計的 「邊緣運算 AI 無人自駕小車」。

 

這是我們認為對於基礎 AI 視覺應用的最佳教學套件。之所以選用 Pi3 自然是因為其性價比以及豐富的教學資源,當年還是 Pi 2的時候就有相當不錯的 OpenCV 視覺追蹤效果,各樣的函式庫套件也非常豐富,一下子很多專題都可以使用它來完成,與Arduino 兩者號稱是學生專題救星呢(笑)!

 

AI 視覺應用的難點在於收集影像資料。喜歡養貓的阿吉老師開玩笑說:「我要幫我家的貓要拍多少張照片都沒問題,但是要蒐集十種不同的貓就難囉!」我們所設計的課程會帶學生體驗完整的訓練流程,不使用現成的資料集(因為訓練結果不會差太多),而是針對無人小車的場地實際收集影像,標記,最後選定模型來進行訓練。其中每一個環節都會影響到小車最終的辨識結果。一定有感!

圖5 學員自行收集的影像資料

 

圖6 AI視覺辨識課程實況

 

圖7 視覺辨識課程使用的AI無人小車

 

邊緣運算?

邊緣運算是指終端裝置也具有一定的能力來處理資料 ,可以加快資料的處理與傳送速度,只要把運算後的結果而非原始資料丟回雲端 (不過不一定什麼事情都要與雲端結合,後續會繼續討論)即可,自然能大幅減少因網路頻寬受限而產生的延遲。

 

例如就經濟面的考量,如果要做到抓到臉部之後能進一步辨識情緒/微笑或五官位置這類功能的話。後面的進階功能可以使用 Microsoft Azure 認知服務 或其他類似的雲端服務來做到,但這些雲端服務都需要付費(或部分免費),且多數需要信用卡來進行身份認證,這件事在多數學校就卡關了吧…   因此我們在課程設計上就朝「終端裝置就能做到」這個方向來努力。在此簡單做一些比較:

 

邊緣運算 VS 雲端服務

  1. 程式碼開源雲端服務很厲害,但它不會告訴你他是怎麼算的。我們能做的只能相信這些雲端服務供應商的結果。例如:Facebook 每天都有一大堆人在打卡與自拍,合理推斷在超大量的資料之下,Facebook在辨識臉孔上非常準,當然事實也是如此。如果把這些運算改到邊緣裝置來做的話,由於程式碼已知,就能循序漸進讓學生學到更多東西,也可以針對後續的情境來擴充。
  2. 不受網路環境影響:相信各位老師都體認到了:教室可以上網,不代表可以進行物聯網教學。能夠進行物聯網課程的話,教室的 router 要很夠力,基本要能夠負擔 「上課人數 x 3」的連線數:聯網裝置 + 手機 + 電腦 都要在同一個網段下才行。因此20人上課,連線數的基本需求就是 60。已經有許多學校著手升級網路基本設備,非常欣慰。
  3. 運算即時:以 CAVEDU 的AI教學車為例,這樣的情境就需要即時,而非連結雲端。Rpi 的速度不算太快,拍照上傳雲端,呼叫API,收到回傳結果來決定車子動作,這個過程再怎麼快也要3~5秒,這樣就算偵測到什麼東西,車子也已經撞牆了。因此有些標榜AI語音辨識結合自走車控制,好像有點奇怪⋯⋯。

 

作為邊緣運算裝置,如何提升 Raspberry Pi 的算力?

CAVEDU 的 Pi3 AI無人小車,直接讓 Rpi 執行使用 Keras 神經網路架構來進行視覺辨識,辨識張數每秒約2~5張(0.5 ~ 0.2秒/張)。這大大限制了車子的移動速度。畢竟,Pi 3只要開多一點網頁,系統就到100%了,何況大量的模型訓練呢?在不更換主板的前提下,要如何提升 Raspberry Pi 的算力呢?

 

Intel 所推出的 Movidius NCS神經運算棒來得恰到好處,可以把最耗資源的運算分一點去做。以 Pi3 小車來說,只要搭配一隻 Intel Movidius NCS 就可以讓每秒的張數提升到每秒約14~20張(0.07 ~ 0.05秒/張)。算是相當經濟實惠不錯的選擇,當然也可以期待 Pi 4就是了。根據 Intel 原廠文件表示,可以串接多隻 Movidius 達到更好的效能。

 

的確,覺得Pi 效能不佳的讀者,當然可以購買更高級的硬體例如 Nvidia TX1,但對於學校來說,經費可以買幾台呢?買一台大家圍著看嗎?另一方面,課程的延伸性呢?本課程已經與台灣微軟技術中心合作開辦多梯次的人工智慧實務工作坊(AGV),並搭配其 Azure 雲服務下的資料科學虛擬機器 (Data Science Virtual Machine) 來加速神經網路訓練速度,適合業界人士使用。另一方面,對於教學單位來說,可使用個人電腦來進行訓練,使用我們所提供的架構使用一般的電腦也可以完成訓練,並搭配 Pi3 完成至少一學期的課程(課表已經完成,歡迎來信索取或找我們去辦研習喔!E-mail:service@cavedu.com

圖8 Intel Movidius NCS神經運算棒

 

CAVEDU 提供各式各樣的最新課程,當第一線教學者的強力後盾。如果您也認同CAVEDU的理念,不喜歡好高騖遠的名詞大戰,歡迎來CAVEDU走走看看。

 

相關文章

 

 

[ 新品介紹 ] 2018.09.07- 尺寸真的粉重要喔!!為您介紹全世界最小的Arduino相容開發板—— PICO

原文作者由Pico團隊圖片

由Pico團隊提供

翻譯宗諭審閱阿吉老師
說明

圖、文內容經Pico團隊同意翻譯,特此致謝!原文請見這裡

PICO是一款非常小的Arduino相容開發板,大小只有0.6x 0.6英吋,與其他常見的Arduino開發板相較,它非常靈活且易於使用,尤其在開發小型應用的時候。

圖1

 

PICO在使用上非常簡單,只要用USB傳輸線連接電腦,然後上傳程式碼便可以開始使用。正如任何其他Arduino開發板一樣,PICO包括一個板載的USB接頭,腳位相容於麵包板且預裝了開機程式。PICO的尺寸使它在處理微型的應用時非常靈活,例如各種小型機器人、無人機、智慧眼鏡⋯⋯等等。因為標準尺寸的Arduino開發板通常無法用在這麼小的情境之中。

圖2

 

PICO團隊表示在募資活動結束之後就會釋出檔案,使這塊硬體完全開放原始碼。

圖3

 

至於PICO該如何使用?很簡單,就是連接電腦、上傳程式,然後盡情發揮它的功能吧!!

圖4

 

最後,一起來看看PICO的詳細規格吧!

圖5

 

想更進一步了解Arduino PICO,請到PICO的Kickstarter頁面看看。另外,也歡迎來機器人王國商城購買各種Arduino系列開發板,期待您做出各種有趣的作品。

 

相關文章

[ 教學文 ] 自己的Arduino車自己造——如何使Arduino車課程回歸生活科技的基本面?

作者/攝影

文、圖作者:永春高中生活科技趙珩宇老師(特此致謝!)

主題圖片背景:starline / Freepik

文字潤飾:CAVEDU 宗諭

文章分類教學技術文
時間

成本

難度

材料表

108課綱講求教師自行依照自己的課程需求發展課程,而筆者是生活科技老師,因此在課程中便希望可依據學生程度,以及生活科技課程所需的內容,設計自己的課程和教具。

 

過去在Arduino車的課程中,教師通常會使用現成的模組,搭配常見的Arduino開發板及模組進行組裝。但就生活科技課程中,這樣的方式少了生活科技中的機構、電子電路等內容,使得實作會專注於程式設計。為讓課程更能符合生活科技所需的內容,所以筆者就製作了可讓學生自行焊接、設計機構、車體及程式撰寫的Arduino車。

 

車體設計

車體設計部分,為符合教學時的學生能力,讓學生可自行焊接,因此首要的要求就是所有的原件皆須使用DIP封裝的元件。因此在車體上即使用了18650電池座,雖然自己不是太喜歡18650電池座,但因現在許多教師都有買這類電池,所以車體部分便依照這顆電池進行設計,另外搭配L9110 H橋IC,以及其他DIP的電容及電阻元件。

 

小知識:什麼是DIP封裝?

DIP是Dual In-Line Package的縮寫,中文名稱是雙列直插封裝,是一種積體電路的封裝方式。DIP是較早期的封裝方法,零件皆具備兩支以上的金屬腳,利用人工方式插入PCB上預留之焊點位孔,再進行點焊或過熔錫爐完成焊接。因插孔需人工進行,較不利於大量生產。然而,筆者在此的目的就是要讓學生可以人工焊接,所以才會要求皆使用DIP封裝的元件。

圖1 18650電池

 

在電路板繪製上,現在其實有許多不同的軟體可搭配。若讀者是處於剛入門時期,可用Frizing這套軟體協助設計,入門門檻會降低許多。若需教學可參考CAVEDU教育團隊不定期安排的課程,亦可參考筆者的教學網站(https://livingtech.education/elec/)所分享的自行洗電路板的方法。

 

課程設計

1.電子電路

本教具設計的目的,在於讓Arduino車的教學重點回歸到生活科技,因此,這台車子需要讓學生自行焊接製作完成,所以在製作時,教師應準備焊接用的工具,如電烙鐵、焊錫、烙鐵架⋯⋯等等,並教導學生正確的焊接操作方式,使學生可以安全地完成焊接。而在焊接中,可逐步介紹每個電子元件的名稱、用途、IC名稱、如何找IC資料⋯⋯等等內容,並自行做一些小實驗示範。

圖2 焊接時應將工具準備齊全

 

圖3 讓學生學習自行焊接

 

2.機構與外觀設計

製作完車體後,則可讓學生設計車體外觀、車體結構⋯⋯等等。在這台車上留有許多雷射切割可用的螺絲孔,或是3D列印件的組裝孔,這些螺絲孔可讓學生將自行製作的車體結構與電路板車體結合。因此,教師可引導學生在「避震」、「轉向結構」⋯⋯等等的教學內容。

圖4

 

圖5

 

圖6

 

結語

在這項教具的設計上,重點就是希望學生可將學習內容拉回生活科技範疇,因此,這篇文章在資訊科技的程式部分就不多加著墨了。對於遙控車的程式撰寫有興趣的讀者,可直接與CAVEDU教育團隊聯繫,他們有許多不同類型的程式實作課程,也歡迎多多關注他們的Facebook粉絲團

 

備註:自製Arduino遙控車課程可參考過去研習課程頁面

 

相關文章

[教學文] 係金ㄝ !!不需3D列印外觀元件,也能製作的機械生物——OTTO Like

原本,筆者將此作品命名為「果凍步兵」,但命名後,總感覺已跳脫原始設定的框架,於是便改為前輩Bridan Wang大哥所稱的「OTTO Like」吧!也透過此命名,向Otto開源者Camilo Parra Palacio表達無限敬意!

作者/攝影

機甲人形師 林益成

文章分類教學技術文
時間

成本
難度
材料表
  • Arduino nano X 1組

  • Nano多用擴展板 X 1 組

  • 伺服馬達SG90 X 4 顆

  • 開關(有段)X 1 顆

  • 塑膠罐 X 1 個

  • 塑膠(木)板 X 2 片

  • L型機構件X 2 片

製作緣起

2017年偶然在網路上看見Otto機器人,心中十分喜愛,但因當時手邊並無3D列印機,因此無法列印自造⋯⋯(遺憾啊啊啊……)。

 

在入手3D列印機後的某一天,想起了這過往的殘念,因此在Thingiverse網站取得開源資料後,迫不及待地列印、組裝,同時也下載製作了同類型、貌似青蛙的 arduped。當時,為讓Otto和arduped二者看起來更協調,因此筆者硬是改掉了Otto的腳部。以下是它們共舞的影片:

 

之後,因爲花在3D列印上的時間過長,並且希望外觀上能有更高的自由度,筆者開始試以生活周遭方便取得的物品進行製作。以下是首次試作作品的影片:

 

筆者個人一個很大的願望,是讓沒有3D列印機的朋友們,也能享受自造類Otto機器人的樂趣。因此,透過本文將個人研究成果與讀者們分享,也期待有一天能看見大家製作出更多作品。

 

製作過程

一、本體製作

Step1:開鑿相關機構孔位

圖1

 

Step2:組裝伺服馬達及電源開關

圖2

 

二、腿部製作:

Step3:將伺服馬達擺臂固定於L型機構件(需製作二組)

圖3

 

三、腳掌製作:

Step4:將伺服馬達黏著固定於塑膠板上

圖4

 

四、腿部安裝:

請參考圖5

圖5

 

五、腳掌安裝:

請參考圖6

圖6

 

六、完成Arduino程式燒錄及配線

七、素體完成

圖7

 

八、請讀者們發揮豐富的想像力,以泡棉、瓦楞紙等素材,為Otto like自造出獨一無二的外型吧!

 

相關作品

因考量後續作品會參與某些公開展示的活動,考量到強度及保存,故使用3D列印製作外型零件。目前筆者製作了三架以日系妖怪為主題的Otto like:

 

1.化貍-文福茶鍋

圖8

 

2.河童

圖9

 

3.天狗

圖10

 

目前排定參展的活動:

  • 10/19-21 TIRT全能機器人國際邀請賽暨桃園觀光工廠創客嘉年華

  • 11/2-4 Maker Faire Taipei 2018

 

屆時歡迎讀者們蒞臨展攤「機甲人形師的覓星工坊」,也歡迎至我個人的FB粉絲專頁交流:https://www.facebook.com/lyclovetyc/。而因我過去製作機器生物,有使用過ROSA系統,若讀者想更多了解這個系統,請參考:https://4rdp.blogspot.com/2017/09/rosa-38-robot-like-otto.html?m=1,謝謝。

 

備註:根據小編與作者機甲人形師林益成討論後,他表示,因近來比較忙碌,暫時抽不出時間寫給LinkIt 7697的Otto程式,所以先以Arduino測試。但未來不排除寫給LinkIt 7697的Otto程式,請讀者們靜待好消息囉!若想購買相關的開發板,請點這裡

 

相關文章

[Arduino專題好用] 自己製作Arduino擴充板,使用Multism Blue

 

設計/撰寫者

皓云/鈺莨

時間

三小時

難度

***

材料表

今日要跟大家分享的作品是Arduino馬達擴充板,我們在作馬達控制的專題,尤其要接兩顆馬達的時候(例如:自走車),如果直接接Arduino,可能會因為Arduino的電流太小而推不動馬達,或是馬達電流太大把Arduino燒壞的風險,所以必須要外接馬達驅動晶片L298N。

當我們在做專題時,都會先用杜邦線接,但是馬達驅動晶片的腳位很多,接好之後如果要帶去展示時,在運送過程中難免會有杜邦線脫落的現象,造成要查線路的問題,畫擴充板便可以解決這個問題。

那麼作成擴充板的形式還有何麼好處呢?

  • 馬達驅動晶片接線複雜,可以減少電路斷路的風險
  • 將常用的元件焊在一起,具有獨特功能性
  • 利用擴充板形式可以節省空間,好收納
  • 可以小型量產

在繪製之前必須要先下載Arduino的所需檔案

本文是用Multism Blue的電路軟體來繪製,下載軟體及安裝步驟請參閱:

[不錯用的電路設計軟體Multisim Blue]手把手安裝教學

我們的目標就是要畫出下列的接線示意圖:

圖2

Arduino接腳對應馬達驅動晶片

ArduinoL293D
D3P15
D5P10
D6P7
D9P2
5VP1、9、16
GNDP4、5、12、13

 

 

繪製Arduino擴充板電路圖

1.先開啟舊檔,先匯入 『arduino_uno.ms14』的檔案

圖3

 

2.開啟之後會是Arduino 的電路圖,和l293d馬達驅動晶片底座,為什麼說是馬達驅動晶片底座呢?

因為實際上是鑽16個孔再把馬達驅動晶片底座焊在擴充板上,另外再把l293d嵌入在底座上面,如果l293d燒壞,還可以鑷子更換l293d。

 

圖4

 

3.新增電路的電壓Vcc元件,也就是Arduino所提供的5V

「Source 」→「POWER_SOURCES」→「VCC」 → 點選「OK」

圖5

 

  1. 新增兩個Vcc 元件連接在l293d的1、9、16號腳位

圖6

 

5.再新增接地線共地,以保持電位為零。

「Source」 →「GROUND」 → 點選「OK」

 

圖7

 

6.一樣也是新增兩個接地線接到L293D的4、5、12、13號腳位

圖8

 

 

7.新增當頁接頭,這功能是Multism Blue特點之一

  • 可以取代了從l293d的腳位直接拉線到Arduino腳位的線路複雜度
  • 畫面較為簡潔,能快速了解線路

 

在選項欄位的「Place」→「Connect」→「On-page  connector」

圖9

 

圖10

 

8.選擇IO3,即是代表Arduino的腳位

圖11

 

圖12

 

 

  1. 重複7、8的步驟,另外在新增接頭IO5、 IO6、 IO9

圖13

 

 

10.將IO3、IO5、 IO6、 IO9分別接到l293d的15、10、7、2腳位

11.繪製輸出三個端子台來外接電池和2顆馬達,這種端子台上方有螺絲孔,可用一字起子轉鬆,將馬達或電池的單芯線插入孔內,再利用一字起子轉緊即可完成線路連接。

 

到「Mouser Database」→「Connectors」 →

「CONN_SCREW_TERM_Phoenix_Contact」→「1715721」

圖15

 

  1. 查詢元件相關資料
    有些電路符號都長得很類似,如果想知道實體元件長得如何,可以在上圖第5個步驟有元件的網路連結提供查閱相關資訊

圖16

 

  1. 一個接l293d的3號和5號腳位;一個接l293d的14號和11號腳位;另一個則是接l293d的8號腳位及接地。

圖17

 


將電路圖轉成PCB

 

14.在MultisimBlue電路圖繪製完成之後,再來就是將電路圖轉換成PCB繪圖軟體檔案

欄位上的「Transfer」→「Transfer to Ultiboard」→「Transfer to Ultiboard 14.0」

 

圖18

 

15.轉換完畢之後,MultisimBlue會開啟另一個PCB繪圖軟體,在電路圖中電子元件的接線,會在PCB軟體轉換成預拉線。

圖19
16. 刪除長方形黃色外板框

在左邊PCB欄位,點選兩下Board Outline,Board Outline即是外板框的意思,就是板子的外型,可以任意改變形狀。

[ 電路設計軟體Multisim Blue ] 花朵、小雞、金魚造型LED燈設計 外板框就是設計成圓形。

 

圖20

 

點選黃色外板框之後會變成虛線,之後按下鍵盤的「Delete」,即可刪除。

圖21

 

 

17.匯入Arduino 外板框

「File」→ 「Import」→「DXF」

圖22

 

然後選取『arduino_un.DXF』檔案

圖23

 

在「Ultiboad layer 」裡,有下拉式選單選擇「Board Outline」,再將把所有的單位改成mm(重要)。

圖24

 

18.匯入後需將Arduino外板框回歸到原點(就是白色的十字),要把所有的外框線設為群組,這樣所有的外框線就會一起移動。

 

首先將全選外框線

圖25

 

在外框線上按滑鼠右鍵選擇「Group selection」,再按「Properties」

圖26

 

 

 

會進到 「Group Properties」 裡 ,在分頁的「Position」的X、Y欄位分別都填上0,單位記得也要改成mm。

圖27

 

19.解除群組,一樣也是先框住所有的外框線,按右鍵選擇「Ungroup selection」,這樣的作法是為了要把元件放進外板框裡,如果沒有解除群組,元件就會把外板框擠掉而放不進去。

圖28

 

 

20.將Arduino的腳位和其他電子元件排列,先排列Arduino腳位,之後再放其他元件。

 

網路上有網友繪製出Arduino的尺寸圖,原點一樣也是在左下角,但是圖中所有尺寸皆是mil,必須換成mm(1mil = 0.0254mm ),也就是所有尺寸皆乘上0.0254。

 

圖29

 

(圖片來源: https://blog.arduino.cc/2011/01/05/nice-drawings-of-the-arduino-uno-and-mega-2560/)

 

 

將上述的尺寸轉換成座標,便可以定義出Arduino 腳位配置圖,這邊單位一律為mm。

圖30

 

現在座標已經定義出來了,這邊在畫上圖中J1、J2、J4、IOL時,我要怎麼知道位置是對的呢?以J4為例,在其中一個腳位(就是藍色圈圈)中按下滑鼠右鍵,點選「Properties」,會跑出「Through Hole Pin Properties」的視窗,分頁選「General」,欄位上有「Net」,就知道這個腳位是Arduino的8號腳位了,其他以此類推。

圖31

圖32

 

知道了大概的位置之後接下來要輸入座標,繼續以J4座標(30.22,50.8)為例,點選整個J4元件(注意圖33中虛線),在按一下滑鼠右鍵,點選「Properties」,會跑出「 Group Properties」的視窗,分頁選「Position」,在X欄位輸入30.22,Y欄位輸入50.8,單位選mm,其他腳位以此類推。

圖33

圖34

 

排列好Arduino腳位後,再依序把其他元件排至適當位置

圖35

 

21.點選 ,可以快速佈線。

圖36

22.調整線徑的寬度

[ 電路設計軟體Multisim Blue ] 花朵、小雞、金魚造型LED燈設計的內文有提到: 『設計電路板時,線徑的大小與電磁干擾成反比,線的長度與電磁干擾成正比為了降低不必要的電磁干擾,將線徑加寬。』,在此我們設定0.5mm。

 

我們如果只要選線路,單單對線路做改變的話,只需要打開,再把其他選項關閉,便可以只選線,而不會選到其他元件。

圖37

 

選取所有線路之後按右鍵,一樣點選「Properties」,會出現「Trace  Properties」 視窗 ,「General」分頁欄位有「Width」,填入0.5。

圖38

 

之後會出現會有紅色圈圈的出現,左下角的「DRC」也開始變紅色為警示效果,是因為線和線之間太靠近,還需要做一些調整。

圖39

 

將線路整理

 

圖40

 

23.調整好之後可以按下,做3D預覽查看元件排列位置,焊錫走線是否一致。

 

圖41

 

[Arduino101] 開放資料平台之智慧家電控制

 

 

隨著最近的天氣溫度上升,對住家的環境也會有所影響,所以才想利用政府開放資料平台得到目前台北市氣溫溫度和透過arduino 101 接上 LM35線性溫度感測器得知目前的室內溫度,再與台北市目前溫度和室內溫度比較後,透過藍牙控制電風扇,若室內溫度高於台北市溫度則風扇開啟,反之則風扇關閉。

作者/攝影 許鈺莨
時間  約一小時
成本 NTD 2,000
難度  *  *  *
材料表
  • Arduino 101
  • 繼電器
  • DFROBOT Arduino 擴充板
  • DFROBOT 的 LM 35線性溫度
  • arduino IDE 1.8.1
  • Appinventor 2

 

首先,硬體設備先建置:

  1. 將DFROBOT擴充板接到Arduino101
  2. LM35線性溫度感測器接到A4腳位
  3. 將繼電器接到13號腳位

 

所有硬體接好後會是以下這張圖

再來就是程式撰寫的部分,分別為arduino IDE 和Appinventor 2,先以arduino IDE 環境說明為例:

 

第5行:LM35接DFROBOT 擴充板A4腳位

第6~11行: BLE UUID設定

第12行:設定繼電器腳位為13號腳位

第17~36行:BLE連線開啟

第40~83行:BLE傳輸LM35線性溫度感測器數值至手機畫面,並且Arduino101接收到字元O時則繼電器開啟,收到C字元則繼電器關閉。

完整程式:

#include <CurieBLE.h>

#include <LM35.h>

LM35 temp(A4);
BLEPeripheral blePeripheral;  // BLE Peripheral Device (the board you're programming)
BLEService RelayService("19B10010-E8F2-537E-4F6C-D104768A1214"); // BLE LED Service

// BLE LED Switch Characteristic - custom 128-bit UUID, read and writable by central
BLEUnsignedCharCharacteristic switchCharacteristic("19B10011-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);
BLEUnsignedIntCharacteristic LM35Data( "19B10012-E8F2-537E-4F6C-D104768A1214", BLERead | BLENotify);
const int  RelayPin = 13; // pin to use for the Relay
char control = '0';
int old_data ;

void setup() {
  Serial.begin(9600);

  // set Light pin to output mode
  pinMode( RelayPin, OUTPUT);

  // set advertised local name and service UUID:
  blePeripheral.setLocalName("LM35");
  blePeripheral.setAdvertisedServiceUuid( RelayService.uuid());

  // add service and characteristic:
  blePeripheral.addAttribute(RelayService);
  blePeripheral.addAttribute(switchCharacteristic);
  blePeripheral.addAttribute(LM35Data);
  // set the initial value for the characeristic:
  switchCharacteristic.setValue(0);

  // begin advertising BLE Relay service:
  blePeripheral.begin();

  Serial.println("BLE Relay service.");
}

void loop() {
  // listen for BLE peripherals to connect:
  BLECentral central = blePeripheral.central();

  // if a central is connected to peripheral:
  if (central) {
    Serial.print("Connected to central: ");
    // print the central's MAC address:
    Serial.println(central.address());

    // while the central is still connected to peripheral:
    while (central.connected()) {
      // if the remote device wrote to the characteristic,
      // use the value to control the Light:
      if (switchCharacteristic.written()) {

        control = switchCharacteristic.value();
        Serial.print("value : ");
        Serial.println(control);
        
        if (control == 'O') {      
          Serial.println("Relay on");
          Serial.println(switchCharacteristic.value());
          digitalWrite(13, HIGH);                           // Open relay
        } else if(control == 'C'){ 
          
          Serial.println(F("Relay off"));
          Serial.println(switchCharacteristic.value());
          digitalWrite(13, LOW);                            // Close Relay
        }
        
      }
      int new_data = temp.cel();
      if(old_data != new_data)
      { 
        LM35Data.setValue(new_data);
        Serial.println(new_data);
        old_data = new_data;
        delay(1000);
      }
    }

    // when the central disconnects, print it out:
    Serial.print(F("Disconnected from central: "));
    Serial.println(central.address());
  }
}

 

接下來是Appinventor2程式說明:

Arduino 101 BLE藍牙連線需要MAC序號才可連線成功,每片MAC都不相同,在Arduino101背後QR code下方即可找到,我使用Arduino101的 BLE 藍牙MAC為98:4F:EE:0F:42,每個Arduino101的藍牙MAC都不同。當程式執行時螢幕便會初始化,手機藍牙開始等待連線,當連上Arduino101時,螢幕標題會寫已連線,開始顯示室內溫度。

當手機與arduino101藍牙連線時,Arduino101會開始送出LM35線性溫度感測器的值。

手機利用OPEN DATA 開放資料平台每10秒鐘抓取台北市溫度的json網頁,資料來源:https://goo.gl/Vz49bi
json網頁: https://works.ioa.tw/weather/api/weathers/1.json
而台北市溫度是使用中央氣象局網站公告的氣象預報資訊作為資料來源,每 20 分鐘更新最新天氣概況。

而抓取json網頁的資料有個技巧就是先將所有的json網頁匯到Appinventor 的ListPicker元件裡,ListPicker元件可以自動將json網頁資料排列好,再利用陣列抓取我們所需資料,台北市溫度在第11行第2列中。

 

ListPicker 元件把json網頁排列好,如下圖所示:

比較台北市溫度和室內溫度,一開始抓取台北市溫度時會出現()為開始要抓取第一筆json資料之符號。而台北市溫度大於室內溫度,則風扇打開;反之, 台市溫度小於室內溫度,則風扇關閉。

 

手機端畫面如下圖所示:

 

結論:
本篇實現出藉由抓取open data 之json網頁得知目前台北氣溫數值和LM35線性溫度感測器測量出室內溫度並作比較,更進一步控制家電,未來可應用於溫室或打造智慧家電,有利於植物栽種,或調節房屋溫度,打造人類更舒適的環境。

 

 

相關文章:

[LinkIt 7697開發板教學]PWM類比模擬控制-Blocklyduino圖形化開發環境

本文要介紹聯發科技實驗室推出的Blocklyduino圖形化開發環境搭配LinkIt 7697開發板製作的小型電路專題。您可由此比較與一般Arduino IDE的類C語法的異同。

作者/攝影  曾吉弘
時間  3小時
成本 LinkIt 7697開發板
難度  * * *
材料表
  • 個人電腦
  • LinkIt 7697 開發板

 

Blocklyduino簡介

        Blocklyduino是由聯發科技實驗室所開發,是根據Google Blockly搭配LinkIt 7697 開發板的圖形化開發環境。說是搭配LinkIt 7697,但其實轉成Arduino code之後,要燒到別片Arduino當然也可以。差別就在於一些特殊的函式庫。這樣的兩階段開發可以兼顧初學者與進階玩家。初學者只要拉拉方塊就能完成許多應用,進階玩家則可進一步轉成Arduino類C語言之後做到更多功能,不會受限於積木指令本身的功能限制,反而可以快速驗證想法是否可行。

 

阿吉補充(阿不整篇都是我寫的嗎?):說真的聯發科技實驗室真的…與眾不同。除了開發板之外,還有一個免費的MCS雲服務,現在又出一個Blocklyduino來降低使用者門檻。也許就是因為這樣才樂得一直寫書。不是做一片可以上網的板子,就是物聯網的player

 

6月於台北市日新國小暨台北市自造教育示範中心已經舉辦了第一梯物聯網種子教師研習,就是使用LinkIt 7697喔,請參考我們上課的投影片


 

硬體線路

請將Linkit 7697插上麵包板,並如以下示意圖將LED正負極接到P9與GND腳位。

 

7697支援PWM的腳位相當多,供電得當的話可以做出8-servo的四足機械獸。請參考本圖:MTK pinout (來源: https://docs.labs.mediatek.com/)

接下來將使用Blocklyduino 與 Arduino 類C語言來比較,使用LED呼吸燈範例。

Blocklyduino程式碼

本程式中用到了變數i,請先由Blocklyduino左側的變數中找到第一個指令,預設變數名稱為item,點選下拉式選單即可改名。

另外在本指令的左側”整數”點選下拉式選單可以看到目前Blocklyduino支援的資料型態,雖然是給小朋友或初學者用的開發環境,定義上可不馬虎呢。(對比:App Inventor只把資料型態分為數字、文字與布林)。

請對邏輯的”或”點擊滑鼠右鍵,選擇”多行輸入”,就會從原本的一個橫列改為多個橫列,這樣在畫面擷圖或製作學習單上會比較方便喔。

7697程式碼

這是Arduino IDE的基本範例。使用analogWrite()指令去控制腳位的PWM狀態,藉此來模擬類比輸出的效果。Arduino與相容開發板在此通常都是把0~1之間再劃分成256格,意即2的8次方。其他高檔一點的開發板可能可到2的10次方或更高的解析度。

 

if判斷式去檢查亮度是否達到上下限值,如果brightness變數值等於255,就將fadeamount x -1,下ㄧ次進迴圈執行 brightness += fadeamount 就會變成 255 + (-5),這樣LED就會慢慢變暗了。一路當 brightness 降到0時,fadeamount 又再次乘以-1,負負得正,LED就慢慢變亮囉。

 

在此我們特意把Arduino IDE 與 BlocklyDuino的變數命名方式一致,您可以比較看看彼此異同。

路徑:File/Example/Basic/Fade

int brightness = 0;	//本變數會在0~255之間變化,用於控制LED亮度
int fadeAmount = 5; //每次亮度的累加值
void setup() {
  pinMode(led, OUTPUT);   //設定9號腳位模式為輸出
}
 
void loop() {
  analogWrite(led, brightness);  //本指令控制 LED 亮度
 
  i += 5; //累加或累減
  if (brightness == 0 || brightness == 255) {  //判斷上下限
	fadeAmount = -fadeAmount ;
  }
  delay(30);   //每秒更新33次
}

以下是本blocklyduino程式轉出來的Arduino code,您也可以比較一下喔。

相關文章:

[Arduino/Genuino101 專題] Arduino101 x BLE x MeArm x App Inventor 使用手機藍牙遙控機械手臂

本文將帶領讀者認識Arduino/Genunio101的功能,以及如何使用I2C界面來控制機械手臂MeArm、用BLE(Bluetooth Low Energy)來跟手機溝通,並使用MIT App Inventor來撰寫手機的應用程式來跟控制板溝通。

作者/攝影 袁佑緣
時間  3小時
成本  約1,850(不含101)
難度  * * * * *
材料表

 

1.Arduino/Genuino 101 介紹

2015年10月,Arduino與Intel合作發表了一塊名為Arduino/Genuino 101的開發板,使用x86的核心並搭載BLE(Bluetooth Low Energy)以及IMU(Inertial Measurement Unit),也就是內建加速度感測與陀螺儀,而本次範例將使用101上面的BLE功能,如果想要了解IMU在101上面的應用,可以參考部落格上的另外一篇文章[ Arduino101 專題實作計畫] Arduino101二輪平衡小車DIY

 

101 的詳細規格介紹

 

2. Arduino IDE 環境準備

首先請到Arduino的官網下載最新版本的IDE,https://www.arduino.cc/en/Main/Software
以筆者為例,最新的Arduino IDE版本是8.3,Windows使用者如果不想要系統安裝Arduino IDE的話,可以直接點選Windows zip的選項,下載後解壓縮,點選裡面的.exe檔也可以直接執行。

 

打開Arduino IDE後,我們要來安裝最新的101套件包,因為驅動程式也會包含在裡面,所以不需要在額外安裝囉。請打開Tools -> Board -> Boards Manager,並搜尋101,應該就會有最新版本的Intel Curie Boards跳出來,以筆者為例,最新版本為2.0.2版。

接下來因為我們的101在連接到機械手臂之間,會經過一塊16通道的伺服馬達控制板PCA9685,所以我們必須先下載PCA9685的函式庫才能控制我們的伺服馬達。

請到Adafruit的github上面下載Adafruit-PWM-Servo-Driver-Library

請點選Download,並將下載後的壓縮檔解壓縮後,放到Arduino資料夾裡面的libraries資料夾裡面。

 

3.硬體電路

接下來請準備好若干條母對公的杜邦線,以及電池提供額外的電源(6v),以防驅動機械手臂時電源供應不足,導致101控制板無法正常運作。

完整的電路接線圖如下,基本機械手臂上的四顆伺服馬達只要把接頭正確的接上PCA9685上就行了,PCA9685上面黑色的部份表示接地線,紅色部份表示電源線,黃色則是訊號線,我們可以透過此腳位輸入PWM訊號來控制伺服馬達。

PCA9685接到101的部份只要把SDA、SCL這兩個腳位接起來,好讓101可以透過I2C來跟PCA9685溝通,另外再接上VCC跟GND以提供PCA9685工作時所需的電壓就行了。

接完之後大概就會如下完成圖,因為這塊伺服馬達控制板的關係,所以我們不需要一塊額外的麵包板跟很多條的杜邦線互相接,是不是很方便啊?

 

4.Arduino 程式設計

請在Arduino IDE 上面完成以下的程式碼。

#include <CurieBLE.h>
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

#define SERVOMIN  150 
#define SERVOMAX  600 

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

BLEService BLE_serv("19B10010-E8F2-537E-4F6C-D104768A1214");
BLEUnsignedIntCharacteristic BLE_char("19B10011-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);

void setup() 
{
    Serial.begin(9600);
    pwm.begin();
    pwm.setPWMFreq(60);

    BLE.begin();
    BLE.setLocalName("mearm");
    BLE.setAdvertisedService(BLE_serv);
    BLE_serv.addCharacteristic(BLE_char);
    BLE.addService(BLE_serv);
    BLE_char.setValue(0);
    BLE.advertise();

    Serial.println("Waiting for connections...");
}

void loop() {
    BLEDevice central = BLE.central();
    if(central)
    {
        Serial.print("Connected to central");
        Serial.println(central.address());
        while(central.connected())
            if(BLE_char.written())
            {
                int servo_num = BLE_char.value();
                int pulse_len = BLE_char.value();
                pwm.setPWM(servo_num, 0, pulse_len);
            }
        Serial.println("disconnected");
    }
}

程式說明:

以上的程式碼主要會引入兩個函式庫,一個是用來控制馬達的<Adafruit_PWMServoDriver.h>,另一個則是待會要用來跟手機溝通的<CurieBLE.h>,接下來的程式碼就是初始化一個BLE的Service,然後裡面

包一個Characteristic,主要負責來接收手機端傳送過命令。來馬達編號,還有指定的馬達PWM訊號,藉此來操控我們的機械手臂。

在while(central.connected())迴圈當中,101會一直去確認是否有新的訊息送過來,如果有收到訊息,就會把收到的來馬達編號,還有指定的馬達PWM訊號,透過pwm.setPWM(servo_num, 0, pulse_len);來控制指定的伺服馬達,藉此來操控我們的機械手臂。

 

5.App Inventor 程式設計

App Inventor是一款圖形化的Android App設計界面,只要您有google帳號,就可以直接線上編輯,雲端儲存,還可以打包下載成APK檔,然後傳到手機裡安裝,如果想要知道App Inventor的教學與應用,可以參考App Inventor中文學習網

接下來我們就要實際動手來寫我們的應用程式了,請先連到MIT App Inventor官網

接下來請新建一個專案,並進到Designer界面,開始進行我們的手機界面佈置。

因為本次專案會用到BLE的元件,所以我們必須用到App Inventor的擴充元件功能,請複製以下的網址http://iot.appinventor.mit.edu/assets/edu.mit.appinventor.ble.aix

並在extension中把BLE元件import進來,如下圖。

接下來請完成以下的元件佈置,其中Slider的最大數值是600,最小數值是150,跟前面Arduino 程式碼裡面定義的一樣,另外Connect按鈕其實是一個清單(而非一般的按鈕元件),按下去之後可以讓使用者去選取要連哪一個藍牙裝置,最下方有一個scan的按鈕,可以用來掃描新的藍牙裝置,掃描附近的裝置後,app就會自動更新清單中可以連線的裝置列表。

 

接下來我們進到Blocks界面,開始設計我們的後台程式。

首先是初始化以及連線清單的設定,在初始化的過程就會先進行一次掃描的動作,並把掃描的結果更新在清單上,此外,當清單被點選之後,程式就會呼叫BLE元件去連線清單內的指定的裝置。

讀者可能會好奇,其中有一個叫做is_connected的函式,這個自定義的元件是有什麼功能呢?其實它就是會根據是否連接到裝置來做一些按鈕跟拉桿的設定,以及此刻狀態的提示,如下圖。

以下則是基本的連線、斷線功能,以及掃描附近裝置與更新的實作。

接下來的這四個Blocks,讀者可以直接從字面上的意思去解讀他的功能,也就是當編號1到4的拉桿被拖動時,就會執行update_and_send的函式,也就是更新拉桿上面馬達狀態的提示以及送出指定的馬達脈波長度。

update_and_send的實作如下,基本上就是會根據拉桿的位置對應到的數值,送出指定的控制指令,這邊值得注意的是要記得把serviceUuid跟characteriscUuid改成跟前面Arduino程式碼裡面指定的一模一樣喔,不然BLE會無法進行資料的溝通。

到此為止已經大功告成囉,接下來就剩下把App下載到手機上就完成了,您可以點選Build -> App(provide QR code for apk,讓App Inventor把編譯好的程式碼暫時存到雲端,並顯示QRcode,讓您可以掃描它來安裝App。

 

注意:

由於BLE元件是App Inventor相當新的功能,所以對於一些手機較舊的讀者可能會發現無法安裝或者是無法使用的問題,這只能換更新版本的Android系統或者是看看App Inventor官方未來是否會有相關的計畫來支援舊版本的手機。

 

相關文章:

[ Arduino101 專題實作計畫] Arduino101二輪平衡小車DIY

作者/攝影 袁佑緣
時間
  • 3小時
成本
難度  * * * * * *
材料表
  • 厚度3mm壓克力板
  • Arduino101控制板
  • 減速馬達x2
  • 麵包板
  • 杜邦線
  • 排針
  • 電池盒
  • 防滑墊
  • 3.7v鋰電池(14500)
  • 鋰電池充電器
  • TA7279P馬達驅動晶片

1. 平衡車車體製作

本範例的平衡車車體主要是由雷切壓克力構成,壓克力的厚度是使用3mm的板材,再藉由螺絲螺帽組合而成,車子的馬達使用的是兩顆小型的5V減速馬達,輪子的部份也是由壓克力組成,胎皮則是貼上一層防滑墊,車子的底部則有兩個3號電池座,裡面各裝兩顆7V的鋰電池,一個用來驅動控制板,另一個則用來驅動馬達。
詳細的CAD檔可以參考筆者放在網路上的onsahpe專案,有興趣的讀者可以參考看看喔!

圖一、平衡車的模擬動畫

圖二、組裝爆炸圖

圖四六七八、車體的三視圖

圖八、平衡車實體圖

 

2.電路接線

本次範例使用的馬達驅動晶片是TA7279P,其腳位功能與編號如下圖(節錄自官方datasheet) ,請將5號及10號腳位接到鋰電池的電源上,並把A、B兩個channel的馬達訊號輸入腳位,也就是1、3、12、13接到Arduino 101上的3、5、6、9號腳位來當作控制板的訊號控制腳位,因為這些腳位才有辦法做PWM訊號的輸出,也因此才能控制馬達的轉速。
至於馬達的部份,請將下表output(輸出)的腳位各自接到兩顆馬達上即可,例如:A channel想控制左馬達,B channel想控制右馬達,那就把4、6號腳位接到左馬達上,9、11號腳位接到右馬達上。
另外也別忘記要給TA7279馬達驅動晶片供給工作電壓,只要在14號腳位供給5V的電力,7號腳位接地就行囉。

圖九、TA7279P腳位功能圖

圖十、TA7279P腳位編號圖

圖十一、完成車體與電線配置!

3. Arduino環境準備

請先準備好Arduino IDE,並請在Arduion IDE上的Boards Manager那邊搜尋關鍵字intel,並如下圖安裝Intel Cuire Board。至於驅動程式的部份,使用MacOS跟Linux的朋友不用擔心,直接使用就可以了,那如果是windows的使用者在第一次將控制板接到電腦上時,會挑出自動安裝驅動程式的視窗,請耐心等候電腦完成安裝就可以進行到下一步囉!

圖十二、Arduino IDE Boards Manager設定

4.程式設計

#include "CurieIMU.h" //引入Arduino 101 IMU的函式庫,用來偵測車體的            角速度與加速度方向

//宣告PID控制的各個參數,各個參數的最佳數值必須視車體情況而定,不同的車體會有所不同,電力的大小也會有影響
const float kp = 24; 
const float ki = 0.05;
const float kd = 15;

//宣告參數K作為complimentray filter的參數
const float K = 0.95;

//list number的大小會決定取平均的樣本數,越多則越準,但也會花掉更多計算時間
const int angle_list_number = 5;
const int error_list_number = 10;

//設定馬達初速為0
int speed = 0;

//定義馬達的驅動腳位
const int motor_A_1 = 3;
const int motor_A_2 = 5;
const int motor_B_1 = 6;
const int motor_B_2 = 9;

//宣告進行角度計算與PID控制會用到的一些參數
float time, time_pre, time_step;
float gyro_angle = 0;
float acce_angle = 0;
float angle_list[angle_list_number];
float pre_error = 0;
float error_list[error_list_number];
float diff_error = 0;
float offset = 0;

void setup()
{
	for(int i = 0; i < angle_list_number; i++)
		angle_list[i] = 0.0;
	for(int i = 0; i < error_list_number; i++)
		error_list[i] = 0.0;
	pinMode(motor_A_1, OUTPUT);
	pinMode(motor_A_2, OUTPUT);
	pinMode(motor_B_1, OUTPUT);
	pinMode(motor_B_2, OUTPUT);
	pinMode(13, OUTPUT);

	Serial.begin(9600);
	Serial.println("Start!!!");

//設定Arduino 101 的IMU感測器	
      CurieIMU.begin();
	CurieIMU.setAccelerometerRange(4);
	CurieIMU.setGyroRange(250);
	time = millis();
	for(int i = 0; i < 5; i++)
	{
		Serial.println("Ready...");
		delay(200);	
	}
	int time2 = millis();

//待機兩秒後,取得一個初始位置的角度,這個位置將會是平衡車目標的平衡位置
	while((millis()-time2) < 2000)
		offset = get_angle();
	digitalWrite(13, HIGH);
}

void loop()
{
//主迴圈會一直去讀取現在角度與目標角度的誤差,並透過PID控制來回傳修正動作給馬達
	float error = get_angle();
	float feedback = PID_feedback(error);
	if(abs(error) > 70)
//當傾斜角度過大時,會視為倒掉,此時將會停機並等待重啟
	{
		while(true)
		{
			analogWrite(motor_A_1, 0);
			digitalWrite(motor_A_2, LOW);
			analogWrite(motor_B_1, 0);
			digitalWrite(motor_B_2, LOW);
			Serial.println("Stop!!!");
		}
	}
	balance(feedback);
}

//平衡函式將會根據PID算出的回饋數值,呼叫馬達做出相對應的修正動作
void balance(float feedback)
{
	speed = int(feedback);
	if(speed < 0)
	{
		analogWrite(motor_A_1, abs(speed));
		analogWrite(motor_B_1, abs(speed));
		digitalWrite(motor_A_2, LOW);
		digitalWrite(motor_B_2, LOW);
	}
	else
	{
		digitalWrite(motor_A_1, LOW);
		digitalWrite(motor_B_1, LOW);
		analogWrite(motor_A_2, abs(speed));
		analogWrite(motor_B_2, abs(speed));
	}
}

//讀取角度的函式會透過計時器累加的部份,將IMU讀到的角速度離散積分成角度,同時會做平均取值並輔以complimentary filter的方式來將精確的角度數值計算出來
float get_angle()
{
	time_pre = time;
	time = millis();
	time_step = (time - time_pre)/1000;

	float ax, ay, az;
	float gx, gy, gz;
	CurieIMU.readAccelerometerScaled(ax, ay, az);
	CurieIMU.readGyroScaled(gx, gy, gz);

//將以下的註解取消掉的話可以從Arduino 101的Serial讀到此刻感應器的原始數值,記得baud rate要跟前面宣告的一樣設定成9600,另外要提醒一下如果開啟Serial輸出的功能的話,會消耗掉額外的計算資源,所以如果已經不需要再讀取數值時,最好把以下的程式碼註解掉
	//Serial.print(ax);
	//Serial.print("\t");
	//Serial.print(ay);
	//Serial.print("\t");
	//Serial.print(az);
	//Serial.print("\t");
	//Serial.print(gx);
	//Serial.print("\t");
	//Serial.print(gy);
	//Serial.print("\t");
	//Serial.print(gz);
	//Serial.println();
	
	gyro_angle += gy*time_step;
	acce_angle = (180/3.141593) * atan(ax/az);
	for(int i = 0; i < angle_list_number-1; i++)
		angle_list[i] = angle_list[i+1];
	angle_list[angle_list_number-1] = K * acce_angle + (1-K) * gyro_angle;
	float mean_angle;
	mean_angle = 0.0;
	for(int i = 0; i < angle_list_number; i++)
		mean_angle += angle_list[i];
	mean_angle /= 5;
	mean_angle -= offset;
	return mean_angle;

}

//PID回饋的函式會將錯誤進行一連串的計算,並根據開頭我們設定的三個係數來做出適當的回饋
float PID_feedback(float error)
{
	for(int i = 0; i < error_list_number-1; i++)
		error_list[i] = error_list[i+1];
	error_list[error_list_number-1] = error;

	float sum_error = 0;
	for(int i = 0; i < error_list_number; i++)
		sum_error += error_list[i];
	diff_error = error - pre_error;
	pre_error = error;
	float p_term = kp * error;
	float i_term = ki * sum_error;
	float d_term = kd * diff_error;
	float feedback = p_term + i_term + d_term;
	if(feedback >= 255)
		feedback = 255;
	else if(feedback <= -255)
		feedback = -255;

//跟前面一樣,把以下程式碼的註解拿掉的話可以從Serial讀出實際得出的回饋
	// Serial.print("P_term: ");
	// Serial.print(p_term);
	// Serial.print("\tI_term: ");
	// Serial.print(i_term);
	// Serial.print("\tD_term: ");
	// Serial.print(d_term);
	// Serial.print("\tError: ");
	// Serial.print(error);
	// Serial.print("\tFeedback: ");
	// Serial.println(feedback);
	return feedback;
}

 

5.實際操作

 

相關文章:

Arduino (Genuino) 101 與 ScratchX 環境建置

Arduino 101 是 Intel 與 Arduino.cc 合作推出的開發板,主要特色在於使用 Intel Curie 32bit 處理器,並且板子本身就有3軸加速度計與3軸陀螺儀,還有 BLE 藍牙通訊功能。

本文將告訴您如何使用 ScratchX 來控制 Arduino 101 開發板(開發者網頁),請跟著我們一起操作吧!請看實測影片

延伸閱讀:

[開箱文] Arduino 101 / Genuino 101 – Arduino.cc 與 Intel 合作,板載藍牙 BLE 與六軸加速度計/陀螺儀

Scratch 的 Arduino 101 指令說明

Continue reading

Scratch 的 Arduino 101 指令說明

本文是Scratch 的 Arduino 101 指令說明,整理自Scratch for Arduino 101 作者的頁面,請看以下指令說明:

 

設定指定數位腳位(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)為高電位(on)或低電位(off)


設定支援 PWM 的數位腳位(3, 5, 6, 9),數值範圍為0 – 100(%)


指定數位腳位(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)符合條件(on / off)時觸發本事件。


讀取指定數位腳位(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)。如該腳位為高電位,回傳為 true;反之為 false。


指定類比腳位(A0, A1, A2, A3, A4, A5)符合條件時觸發本事件。


讀取類比腳位的數值(A0, A1, A2, A3, A4, A5),回傳值為0~100(%),而非 Arduino IDE 的 0~1023。


當實際搖晃板子時,觸發本事件。請注意無法決定搖晃的力道。


讀取 Arduino 板子的指向。回傳值是三軸各自的轉動角度,單位為度。方向示意圖如下:

showing the Arduino 101 tilt orientation


設定伺服機轉軸位置(非連續型),單位為度。腳位可接在2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13。可接受的數值範圍為0~180度。

CAVEDU註記:Arduino 101 支援 PWM的腳位編號為3, 5, 6 ,9,應該還是要接在這幾隻腳位才能順利控制伺服機。


讀取指定腳位上的伺服機轉軸位置,回傳單位為度 (0~180)

 

Genuino 101 Starter Kit 開箱!感謝DFrobot

DFRobot 寄給我們的除了全套拿鐵熊貓之外,還有 Genuino 101 的 Starter Kit,大家可以和 Seeed Studio 的 Grove Starter Kit 比較一下看看兩者的差異。

之後CAVEDU 實習生會陸續把一些有趣的教學玩玩看,再和大家分享心得囉!(blink 我想就不用了啦~)

拿鐵胖達_6192

包含了以下零件與11個專題

Gravity 是 DFrobot 的特殊接頭,如同 Seeed 的 Grove 4 pin 接頭

教學:

  • Arduino Platform and Genuino/Arduino 101
  • 類比與數位訊號
  • 簡易的自動控制裝置
  • Project 1. LED閃爍
  • Project 2. 感測燈光
  • Project 3. Mini Lamp
  • Project 4. 聲音觸發LED
  • Project 5. LED呼吸燈
  • Project 6. Light調節器
  • Project 7. 潘朵拉的盒子
  • Project 8. 藍牙連線
  • Project 9. 氣象站
  • Project 10. 芝麻開門
  • Project 11. 電子坡度偵測

有個相當好聽的名字:夜光寶盒。但我想應該沒有螢光塗料在上面就是了,哈哈

拿鐵胖達_8597

259-900x600



【Intel Edison】開發板製作簡易的4軸機器手臂 part 1 軟硬體介紹 – 轉載自T客邦創客基地

本文經T客邦創客基地同意之後轉載,(T客邦原文連結),後續內容將分成多篇來刊登,歡迎您跟著一起做喔!以下是原文:

 

桌上型教學機器手臂購買連結請點我

Continue reading