文章類型
開發平台
解決方案
關注主題
文章類型
開發平台
解決方案
關注主題

【Tutorial】用Arduino Mini Pro打造低成本迷你電子看板

作者:Jack Hsu

我有沒有聽錯?!3.3V/8MHz 8bit MCU 的 Arduino Mini Pro 竟然可以拿來做「動畫胸牌」,不是 LED 的那種(下方左圖),而是 64K 彩色 LCD 的那種(下方右圖)。它不僅可以秀文字和影像,還可以選擇多張自己喜歡的影像及輸入自己想要的文字後再下載,更誇張的是竟然沒有用到 SD 卡,總成本不到二個小朋友(<NT$500)。

(圖一) 左圖為傳統 LED 胸牌;右圖為本開源專案迷你電子看板【OpenQSignage】(圖片來源:Jack提供)

各位 Maker,這是真的!而最主要的功臣就是來揚科技(Lyontek Inc.)的那顆 PSRAM(Pseudo Static Random Access Memory,右圖綠色板子上正中間那顆八隻腳的 IC)。但到底什麼是 PSRAM,又要怎麼才能完成這項作品,就讓我們繼續看下去。

前一陣子剛好買了一些 LCD 模組準備來開源另一個項目,正好 MakerPRO 歐兄提供我一顆來揚科技(Lyontek Inc.)的 PSRAM ,也和廠商交換意見,想出了一些點子,或許可幫助 Maker 們創作出一些有趣的應用。

在經過一番集思廣益後,我決定把原先另一個項目延遲,並把 LCD 模組先挪過來使用,先推出【OpenQSignage 迷你電子看板】,並免費開源給各位 Maker!

近似同義名詞補充

  1. Digital Signage:電子看板、數位看板、數字標牌、廣告機;
  2. Digital Frame:數位相框;
  3. Name Badge:胸牌、名牌;
  4. Scrolling Advertising:名片型字幕機、廣告機、跑馬燈

這個開源專案主要是以數位看板的架構來實現,一般我們常在超商或賣場看到此類廣告機,其系統最主要包括一台顯示器、一台本地端主機負責依排程播放內容、一台遠端主機進行內容編輯及多子機管理;或著為了節省成本省去本地端主機,而直接用串流影像方式播放。

通常數位看板可以顯示靜態影像、動態影片(視頻)及即時文字跑馬燈。大型系統則需要一個遠端系統來管理播放排程、更新播放內容和顯示即時資訊,更進階一點的還會提供客戶自行編排播放內容視窗的排列方式。

話說回來,我一個人不可能用幾百塊錢、幾週時間就可完成這麼大的系統,於是我將這個專案迷你化(Q 版),並改成動畫胸牌的應用,方便大家能快速了解整個開發流程及軟硬體架構,有很多地方寫的不太好或還需要改善的地方, 就留給各位 Maker自由發揮。如有任何想法,歡迎來信或留言討論。

目前這個迷你電子看板雖然體積變小,但該有的 LCD 顯示屏、本地端排程播放及內容(影像、文字)編輯及下載功能樣樣不缺。本地端的部份(如上方右圖中的迷你電子看板)主要由 Arduino Pro Mini(3.3V/8MHz)作為主機,負責接收及播放排程內容,而排程及顯示用影像都儲存在來揚科技提供的那顆 PSRAM 上,另外還有 64K色LCD 顯示屏、鋰電池及充放電模組板。

PC 端則提供一套排程編輯及下載專屬程式(如下圖),包括影像選取、轉換成 LCD 顯示格式、顯示停留時間設定、文字輸入、字體選擇、文字(前、背景)色彩、橫幅文字顯示模式及下載排程到本地端主機等功能。

(圖二) PC端排程編輯及影像轉換系統操作介面(圖片來源:Jack提供)

本來以為這次的專案應該三兩下工夫就能收工,結果一波 N 折,搞了快一個月才全部收工。接下來我將分別就硬體設計、Arduino 程式及 PC 端程式進行說明。

硬體設計

最早想用 Arduino Nano 當作主控板,自帶 USB 可直接下載程式又可當UART通訊埠,於是買了兩片回來試。結果控制電路板全焊好了,這才發現LCD 模組和 PSRAM都是3.3V介面,天真的我以為將 LCD及PSRAM接上3.3V,Arduino Nano接5V,I/O介面就會通,寫了一些測試程後,才證實「待誌不是憨人所想的這麼簡單」(台語發音),完全不會工作,突然覺得有點崩潰。

後來,想用3.3V和5.0V位準轉換板來解決,但發現接腳太多實在不好處理,所以也放棄這個念頭。不死心的我又在網路查了一下發現 Arduino 的主晶片 Atmel Mega328P是可以支援3.3V的,找到一些文章教人如何把Arduino Nano 或Pro Mini 改成 3.3V,但改板太麻煩,只好乖乖重買板子。

天不從人願啊~Arduino Nano 沒有 3.3V 版,要 Pro Mini才有,而且時脈速度要降一半,只剩 8MHz,更慘的是還要另外買USB轉UART的板子才能下載程式和資料,真是大悲劇啊!但老天對我的考驗還沒結束,上網買了3.3V的Arduino Pro Mini和USB轉UART(CH340G)的轉接板,收到貨後,發現USB轉UART轉接板竟是 5V的板子,害我又得上網查資料自己改板子,這才順利下載程式。

經過一波三折,終於把硬體採購都搞定!寫了一個簡單 PC 程式和一小段Arduino SPI PSRAM和LCD顯示測試程式後,又發現原先 Arduino拿A4(PC4)和 A5(PC5)當數位 I/O 用竟然無法正常工作,搞了好久一直沒解,最後只好放棄當數位 I/O 使 用,保留下來後續I2C使用,並讓SPI PSRAM和LCD共用晶片選擇線。

但!悲劇還沒結束,下載完程式和顯示資料後,突然發現板子只要一離開USB就會沒電,PSRAM內的資料就全沒了,等於全白作工!所以只好再次上網找鋰電池和充電板來解決持續供電這個問題,最後終於解決目前發現的硬體問題。

希望透過本文,讓後續想實作這個專案的人不會經過這麼多波折,按圖施工, 一次就能完美達陣。

零件清單

本專案所需材料如下:

  1. Arduino Pro Mini 3.3V/8MHz 一片(注意一般是 5V/16MHz,不要買錯)
  2. USB 轉 UART 板(3.3V)一片(買不到的請參考上列敘述: CH340G 如何將 5V 板子 改成 3.3V 板子)
  3. 2.2 吋 LCD 模組一片 (必須是解析度 176×220,ILI9225 驅動,8 Bit Bus)
  4. 來揚科技 SPI PSRAM LY68L6400 模組一片(8MByte)
  5. 鋰電池充放電板一片(建議輸出電壓不要升壓成 5V 那種)
  6. 鋰電池一顆(3.7V,800mA,電池容量可依需求增減)
  7. 洞洞板一片(手工焊接用,未來可改成印刷電路板)
  8. LED、220Ω 各一顆(作為指示燈)
  9. 按鍵、10kΩ 各一顆(作為操作用)

以上,除 了第4 項是來揚科技提供外,價格大約 NT$10(來揚告知的參考價,但不知要多少量才有這個價格),其餘在淘寶或露天上都可輕鬆買到,價錢會依不同的採購管道而有不同,整體來說材料費大約 NT$300 ~ 500 之間。

(圖三) 硬體電路圖(圖片來源:Jack提供)

電路圖

本次專案是希望成品可以真的別在胸口,所以不方便用麵包板的插線,加上此次電路連結頗為複雜;建議在實作焊接要時特別注意,以免不慎短路而造成零件損壞。 當然如果後續有機會製作成印刷電路板時,就會更方便製作(完整電路圖請參閱下圖)。另外本次板子在焊接時跳線太多,所以就不提供焊接參考圖啦(焊接好的成品圖及各個零件參考位置圖請參考下圖)。

(圖四) 成品配置、焊接及組裝參考圖(圖片來源:Jack提供)

主要零件使用補充說明

為了後續看程式時能更了解重要零件用法,這裡補充說明一下。

Arduino Pro Mini

Arduino Pro Mini 是其家族中板子最小的,但因為它是開放性設計,所以各家廠商會依自己需要增減一些 I/O(如:A4、A5、A6、A7),而側面保留 UART 的腳位及順序可能也會有些不同,所以在採購板子及 USB 轉 UART 轉接板時要注意,不然就得像本專案一樣,必須自己加一塊轉板或焊一條專用排線,方便下載程式及影像內容。

另外,這次選用的板子是3.3V版本,是指主晶片的工作電壓,而非外加電壓。 真正的外接電源必須從 RAW 的腳位接入,板子上有電壓調節器,自動會降成 3.3V 給主晶片用,同時可透過 VCC(3V3)接腳引到其它需要 3.3V 的小零件。因此, RAW 輸入電壓可從 3.35 到 12V,所以不管是 USB(5V)或鋰電池(3.7~4.2V),甚至拿 9V 電池供電都沒問題。

LCD 模組

上次 OpenQCam用的是 SPI(四線式)通訊方式的 LCD 模組,這次為了加快顯示資料更新速度,所以選用 8bit 資料匯流排形式的模組。這塊模組原先是為了另一個開源案子準備的,特別挑選 2.2 吋 176×220 像素的解析度,所以可能有點奇怪,後續若大家有興趣的話,亦可改成常用的 QVGA (320×240 像素)規格。

一般上網買此類模組時可能會附上 Arduino UTFT 的函式庫方便開發,但它支援太多類型,驅動方式很難 一下看懂。這個專案裡,我把它簡化到只支援 ILI9225 驅動晶片且橫式顯示,讓大家更容易理解 LCD 工作原理。

目前這款 LCD 支援 65,536(俗稱 64K)色顯示,每點像素以 RGB565 表示,就是紅色 5 個位元加上綠色 6 個位元加上藍色 5 個位元,合計 16 位元來表示,等於 2 個位元組,所以一個畫面共需 176 ×220×2=77,440 個位元組,而 LCD 模組已自帶這些繪圖記憶體(GRAM),只要寫入後模組就會自動刷新屏幕,直到有新值寫入或斷電後才會消失。

LCD 座標系統

再來,說明 LCD 原始座標系統和顯示時的座標系統之差異,這部份一定要搞懂,否則就無法正確顯示。

首先原始 LCD 模組預設是直式顯示,暫存器 0x03 的設定值為 0x1030,其座標系統原點(0,0)在左上角,掃描方向由左而右、由上而下(如下方左圖所示)。為了當胸牌(橫式顯示)使用,所以我們要將掃描方向設定改成 由上而下、由右至左,這裡指的方向是對應原始定義(黃線標示),而暫存器 0x03 的值就必須改成 0x1028。從下方左圖中可看出綠色座標軸和洋青色座標值是我們習慣在 PC 上顯示的座標系統,而黃色線座標軸和洋紅色座標值則為 LCD 模組真正的座標值,因此使用上我們必須進行轉換。

另外,為了加速畫面更新速度,LCD 模組允許只對特定視窗(Window)局部進行更新, 如圖五右圖中綠色方框,使用前要設定視窗起始座標(x1,y1)、結束座標(x2,y2)及 預計開始填值的起點(sx,sy)。特別注意,這裡用的座標都是原始定義座標,使用時填入的資料數量(影像長寬)一定要和視窗大小相同,不然圖像顯示時可能會產生捲繞或斜切問題。

LCD 相關控制時序,請 LCD 驅動晶片 ILI9225 資料手冊,或者直接對照程式碼及註解作進一步理解。

(圖五) LCD 預設及顯示座標系統及掃描方向(圖片提供:Jack提供)

Lyontek PSRAM

終於!到了本專案最重要的核心元件介紹~首先感謝來揚科技(Lyontek)贊助一片 SPI PSRAM(Pseudo Static Random Access Memory)模組,就是圖四左下圖中那塊綠色板子,上面放了一顆 LY68L6400,還有一顆超亮綠色的電源指示燈,但為了避免影響拍照,只好用黑膠帶把它貼住了。

什麼是 PSRAM 呢?一般只聽過SRAM和DRAM。SRAM 速度快、價格高、耗電少,一般 MCU 中都會帶一些,以Arduino Pro Mini上的那顆 Atmel Mega328P 來說只有 2K 位元組的 SRAM。而 DRAM 價格超便宜,但控制電路很複雜,且較 SRAM 耗電,因為要一直刷新,一般桌機或手機動不動就有 1G 位元組(或更高),但其控制電路非常複雜,而且要定時刷新不然資料會不見, 所以通常要較高等級的 CPU 才有辦法使用,像Arduino 這種 8bit MCU 根本不可能使用。

史提芬周(星爺)說:「爭什麼爭,把瀨尿蝦和牛丸摻在一起做瀨尿牛丸不就好了。」因此,就有廠商把 DRAM 包裝成 SRAM,把自動刷新機制都作進 IC 中,這樣用的人就沒感覺,好像在用 SRAM,直接讀寫就好,連小型 MCU 也都 可以用,這樣的產品就被稱為 Pseudo(假) SRAM。

後來,又有廠商為了方便小型 MCU 沒這麼多接腳可用,將其改成用 SPI 串列通訊 方式讀寫,只需四條線就可使用,大大滿足小型 MCU 使用者,此次來揚科技提供的這項產品就屬於此類。

LY68L6400 是一顆 64Mbit(8MByte)PSRAM,比 Arduino Pro Mini 的記憶體(SRAM)大了 4,000 倍,它的 SPI 低速時脈可達 33MHz,比起 Arduino Pro Mini (3.3V 版本) SPI 的 4MHz(因為最小除頻為 2)快了八倍多。它還提供了高速模式可達 100MHz(新版 144MHz),若用 QPI 模式可再加快3倍,相當四組 SPI 同時工作,可惜我們用不到,享受不到這種快感。就算 MCU 來的及,LCD 也不給力,所以就只能拿法拉利來當裕隆開了。

話說回來,這麼大的儲存空間是要作什麼用,要用到何年何日才用的完?這時,本專案就充分發揮了這項產品的用處,從前面 LCD 介紹中我們可得知光一張畫面就要 77.4K 位元組,而 Ardiuno 的 2K 位元組小得連一張影像都裝不下,此時 PSRAM 就幫了大忙,隨便存個近百張影像也沒問題。

使用時我們從 PC 端用 UART 將顯示的排程及影像傳送到 Arduino 中,每收到一個位元組就立即寫入 PSRAM, 當從 PSRAM 讀取到一個位元組時也是馬上寫入 LCD GRAM 中,這樣 Arduino 就幾乎沒用到什麼記憶體,只有少數會變動,使得本專案得已實現大量彩色影像播放功能。

這麼好用的產品,難道都沒有缺點嗎?個人覺得斷電資料就消失是最大問題,所以必須搭配電池持續供電,而這樣可能會增加一些電池及充電模組的成本。那或許會有人問,那我用 SD 卡儲存不就不會有這個問題嗎?我想看在這顆 PSRAM 才十元,比起 SD 卡便宜太多,如果使用的場合經常需要重新更新顯示內容的情況下,這項產品仍是不錯的選擇,至於要如何使用,就留給各位發揮創意了。

充電電池及模組

為了讓本案能真的當成 LCD 動畫胸牌使用,且避免 PSRAM 斷電後資料消失,所以額外增加了鋰電池及充電模組。一般鋰電池有的有帶保護板防止過充,有的靠充電模組自行偵測,因此選用時要注意搭配問題。一般充電模組輸入可選用 Micro USB 插座類型,方便取得 5V 電源來源。而輸出部份一般有兩種,一種是把鋰電池輸出電壓直接升壓到 5V,像是行動電源作法;另一種是鋰電池電壓多少就輸出多少。原則上這兩種都可使用,本專案是選用後者。

另外大家可能會關心的是電池容量到底要多少才夠用,以實測未優化情況來說, 800mAh 的電池充滿電後,在自動連續播放模式下(MCU 持續讀取 PSRAM 再寫入 LCD 中,相當於耗電最大情況),大約可撐七個小時。這裡可能還有很多電力 使用優化作法,比方說調整 LCD 背光、加強播放間隔時間等等,有待各位協助。

USB 轉 UART 轉換板

由於 Arduino Pro Mini 不像 Nano 有自帶 USB 轉 UART,所以必須使用額外的 USB 轉 UART 轉板。網路上有很多種板子,其中 CH340G 算是比較常見的(Nano上就 是用這顆 IC),驅動程式可和 Nano 共用,不用另外安裝。但各家提供的腳位排列順序都不同,有些還沒有RST腳位,通常都是 5V 介面的,但有些有設計切換開 關或可跳接成 3.3V 的 UART。本來上網買的時候已有指定 3.3V 版,但收到時發現不是可切換的那種(賣家圖文不符),還好 CH340G 可支援 3.3V,所以只好手工改板。完整手冊可參考USB轉UART晶片CH340G資料手冊

首先拆掉正面連接 USB5V 和 CH340G VCC(pin 16)的電容,再來將 VCC 和 V3(pin 4)連在一起,讓外部(Arduino Pro Mini VCC)進來的 3.3V 可送至 CH340G 的 VCC, 如下圖所示。接著切斷背面 5V 的線,另外將 USB 送進來的 5V 直接連線送到外面(排針),如下方上圖所示,不讓5V經過板子,也不要供電給 CH340G, 如此即完成 USB 轉 3.3V UART 的轉接板。

為方便直接連到 Arduino Pro Mini,所以另外手焊了一塊轉板,(如下圖右半邊)。這裡多設計了一個跳接線,主要是為了切換 Arduino Pro Mini 的 RAW 是由誰供電,當短路時由 USB 供電(5V)到 Arduino Pro Mini,再由 Arduino Pro Mini 送回 3.3V 給 CH340G,若拔掉跳接線(開路)時,則改由鋰電池供電(3.7 ~ 4.2V)。 請特別注意,不可跳接線短路時又由鋰電池供電,這樣會造成短路,這裡的 USB 5V 並不是用來對電池充電的。

(圖六) (左上及左下)USB 轉 UART 轉接板改成 3.3V 版本參考圖,(右)手工轉接板(圖片來源:Jack提供)

名詞中英對照

  1. 靜態記憶體(Static Random Access Memory,SRAM)
  2. 動態記憶體(Dynamic Random Access Memory,DRAM)
  3. 刷新(Reflash)
  4. 跳接線(Jumper)

Arduino 程式

當要下載程式到 Arduino 前請記得先關閉本專案 PC 端程式,以免佔用通訊埠 (COM)導致程式無法下載。當按下板上重置鍵後,首先會看到 LCD 螢幕出現十六道彩色條紋,等待一秒後清除畫面(黑屏),接著開始等待 PC 端下載排程及影 像資料。待完成下載後,會進入自動播放模式,即依排程設定之時間、顯示模式來顯示圖框及橫幅(文字)。

當 SW1 按住超過三秒時,會交換自動播放或者是手動切換模式;當按鍵時間小於三秒時會視為手動切換模式;在手動切換模式時,不依排程設定,直接秀出圖框影像及橫幅文字;再按一下則切換到下一組,全部輪完就重頭開始。不管是自動或手動切換模式,當 UART 收到 PC 端傳來命令時,會馬上停下排程, 改執行接收影像任務。

目前本專案僅支援三組圖框影像及三組橫幅文字,由於 PSRAM 空間還很大,未來可考慮改成支援更多影像版本。

(圖七) PSRAM 空間使用圖(圖片來源:Jack提供)

完整程式碼及註解,可直接點選這裡下載。

PC程式

配合 Arduino 能正確依排程設定顯示指定的圖框影像及文字橫幅,必須 在 PC 端開發一套影像轉檔及下載程式。本專案在這裡選用 Windows 環境加上 QT 5.6 版(方便跨平台)及 OpenCV 3.2 版來進行開發視窗程式。QT 及 OpenCV 的版本原則上不太重要,較舊的版本應該也可以,並沒有用到太多功能。

目前這版程式離真正的電子看板排程程式還差得滿遠的,但作為展示、學習用還是相當合適的。為了簡化程式開發,本專案只提供三組圖框影像及三組橫幅文字設定。如下圖所示,可依下列步驟操作:

  1. 載入所需圖框影像,若影像大於 220×176 則會自動縮小(不論原圖長寬比例)。
  2. 設定顯示停留時間,單位為 0.1 秒。
  3. 再來輸入文字內容,這裡支援任何文字輸入(中英文混合亦可)。
  4. 按【C】鍵指定文字及背景色,亦可按【字體】鍵選定指定字體及尺寸。
  5. 指定橫幅文字顯示模式,固定顯示、交替閃爍及不顯示。
  6. 完成三組圖框影像及橫幅文字設定後就可準備下載工作了。

一般來說在電腦上的彩色影像是全彩(紅、綠、藍各以 8bit 表示,俗稱 RGB888), 但這裡我們利用 OpenCV 讀取影像檔案時,它會變成 BGR888(24bit),紅綠通道會相反,而 LCD 顯示時因為只用了 16bit,所以需降低色彩數變成 RGB565,明顯可看出色彩數量及表示方式有很大差異。因,此影像要下載到 Arduino 前必須進行格式轉換,不然無法正確顯示在 LCD 上。(詳細作法可參見完整程式碼下載mainwindow.h裡ColorBGR8882RGB565的函式。)

(圖八) 載入圖框影像、設定排程、編輯橫幅文字及設定顯示模式(圖片來源:Jack提供)

下載資料前,首先按下 Arduino Pro Mini 的重置鍵,讓系統回到等待下載模式;接著用 USB 轉 UART 轉接板連接 Arduino Pro Mini 和 PC 端;接下來就如圖九所 示,按下【檢查】鍵確認 USB 轉 UART 轉接板是否已啟動,若正常工作時,會出現埠名(COM)及描述,此時【開啟通訊埠】鍵也會被致能,按下後就會開啟通訊埠準備輸出資料到 Arduino Pro Mini;此時,若想試一下是否通訊正常,可按【LED On】和【LED Off】來點亮及熄滅板子上的 LED。再來按下【下載】,等個約五十秒就可下載完所有資料。

目前傳輸時間看起來有點久,主要是因為通訊埠(COM)通訊鮑率設定只有 57,600bps,因為不知那個地方產生干擾,導致設為 115,200bps 時會接收到亂碼,希望後續找到問題並解決後,下載速度就可大幅提升;若要再更快那可能就換掉 Arduino,改用具有 USB 大量傳輸(Bluk)能力 MCU 才能徹底改善。

(圖九) 通訊埠檢查、開啟及排程、圖像下載(圖片來源:Jack提供)

本專案目前仍有許多不足的地方有待各位自由發揮,後續如有任何想法或者在實作上遇到任何問題歡迎在下方留言,我會儘我所能回答大家。當然如果有人有興趣把本專案開發成真正的商品,不管是自行發展或找我合作都很歡迎。

(原文出自:歐尼克斯實境互動工作室,含程式碼閱讀請見原文,完整程式碼可在這裡下載,責任編輯:廖庭儀)

許 哲豪

許 哲豪

工作經驗超過二十年,主要專長機電整合、電腦視覺、人機互動、人工智慧、專利分析及新創輔導。曾任機電整合工程師、機器視覺研發副理、技轉中心商業發展經理。目前擔任多家公司兼任技術顧問並積極推廣實境互動相關技術。
許 哲豪

上一篇: | 已是最新文章

468 ad

2 Comments

我想回應

你的電子郵件位址並不會被公開。 必要欄位標記為 *

成城共創股份有限公司版權所有、轉載必究.Copyright(c) 2017 MakerPRO