2018年12月18日 星期二

android藍牙app的裝置搜尋與信號排序

搜尋藍牙的過程是一個非同步過程
因此需要用回呼函數來處理系統找到的藍牙裝置
以下程式是裝置搜尋回呼函數,每找到一項裝置就呼叫addDevice將資料加入裝置與信號強度的列表變數中
    private BluetoothAdapter.LeScanCallback mLeScanCallback =
    new BluetoothAdapter.LeScanCallback() {

        @Override
        public void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            addDevice(device, rssi);
                        }
                    });

                }
            });
        }
    };




但在addDevice程序中,裝置資料與rssi資料是分開存放在deviceList與devRssiValues這兩個列表中
因此為了讓顯示裝置列表的時候能夠根據信號強度排序
需要以下做法
1.先讓信號雜湊列表devRssiValues進行排序,雜湊格式是 Address:Value
2.然後雙迴圈先依序取出信號列表的位址值
3.再到裝置列表中找到該筆裝置資料
4.將裝置資料複製一份到列表的尾巴
5.刪除舊位置的裝置資料
等到信號列表中的資料跑過一遍之後,所有裝置列表的資料就會根據信號強度排序了

        // dahai: sort the deviceList
        devRssiValues = sortByComparator(devRssiValues, true);
//        Log.d("UUS-BLE:devRssiValues", devRssiValues.toString());
//        List tmpDeviceList = deviceList;
        for(Map.Entry entry : devRssiValues.entrySet()) {
            String key = entry.getKey();
            Integer value = entry.getValue();
            for(int i=0; i<deviceList.size(); i++){
                if(deviceList.get(i).getAddress().equals(key)){
                    deviceList.add(deviceList.get(i));
                    deviceList.remove(i);
                }
            }

        }
        Log.d("UUS-BLE:deviceList", deviceList.toString());

2018年12月17日 星期一

android studio如果遇到app不能連線起動(Error while Installing APK),可能是這樣...

訊息如下:
Launching app
...
java.io.IOException: Connection reset by peer
Error while Installing APK

則可以到
Preference -> Build, Execution, Deployment -> Debugger -> Android Debug Bridge(ADB)
把 Use libusb backend取消
就可以連線了

這個方法是來自於這個啟示
https://stackoverflow.com/questions/42781934/android-error-while-installing-apks

內文提到
如果Android Studio有不能安裝app的情形則則需取消 Instant Run的功能
但我找不到相關設定,可能是因為版本更新的關係,因此我嘗試上述的方法就成功了

2018年11月14日 星期三

tinker board chromium壞掉記

解法在這裡
https://tinkerboarding.co.uk/forum/thread-1735-page-2.html

wget https://snapshot.debian.org/archive/debian-security/20180701T015633Z/pool/updates/main/c/chromium-browser/chromium_67.0.3396.87-1~deb9u1_armhf.deb
sudo dpkg -i chromium_67.0.3396.87-1~deb9u1_armhf.deb
sudo apt-mark hold chromium



2018年11月13日 星期二

chromium kiosk mode on raspberry pi

在樹莓派
使用者目錄下的這個檔案裡面放檔案路徑
就可以開機自動執行
~/.config/lxsession/LXDE-pi/autostart

裡面要自動執行的程式必須給絕對路徑

2018年10月7日 星期日

system workbench for STM32 一款基於eclipse的stm32整合開發環境,以及STM32CubeMX一款STM32系列程式碼產生器

STM32 CubeMX

System Workbench for STM32(SW4STM32)

下載與安裝都很無腦,到官網下載後就可以安裝。

CubeMX以點選功能的方式快速佈置微控器的功能
要記得要去設定Debug功能,否則到了SW4STM32要跑線上除錯的時候會找不到硬體
CubeMX產生程式碼之後會問是否要打開IDE,
在Win32平台,選擇確定會順利打開SW4STM32
在MacOS平台,無法找到,必須單獨打開SW4STM32然後把專案資料import進來

先按錘子編譯專案
再按瓢蟲進入除錯模式

第一次執行瓢蟲要做以下修改,硬體除錯模式才會正常運作
點選 Debug As -> 1 AC6 STM32 C/C++ Application

然後再點選 Debug Configurations...

到 Debugger 中 Configuration Script 區塊 將 generator options展開
將Reset Mode改為 Software system reset
這樣除錯功能才能正常

2018年9月25日 星期二

ghdl,一款開源的vhdl模擬器以及gtkwave,一款開源的波形觀察器,一個二位元全加法器的實作

參考來源:https://ghdl.readthedocs.io/en/latest/using/QuickStartGuide.html

先說載點:
ghdl:
https://ghdl.readthedocs.io/en/latest/getting/Releases.html
gtkwave:
https://sourceforge.net/projects/gtkwave/files/

然後根據ghdl的說明檔,先來實作一份加法器
ghdl quick start guide:
https://github.com/ghdl/ghdl/blob/master/doc/using/QuickStartGuide.rst#a-full-adder

步驟:
用文字編輯器撰寫vhdl
存檔並且副檔名為.vhd或是.vhdl
vhdl內的entity名稱不一定要與檔名一樣
先用ghdl -a [vhdl檔]
再用ghdl -e [entity名稱] ,elaborate這個entity但我不知道什麼是elaborate
最後ghdl -r [entity名稱],跑這個vhdl,但是如果直接跑會沒有結果產生
因此需要製作testbench,testbench也是一段vhdl程式,他與一班vhdl差別在沒有port,是用來產生輸入信號以及檢查輸出是否為預期

重點:
vhdl檔案必須依照階層關係依序編譯,否則會造成頂端vhdl無法正確解譯

先用文字編輯器把下列程式存檔,檔名為「adder.vhdl」

entity adder is
  -- `i0`, `i1`, and the carry-in `ci` are inputs of the adder.
  -- `s` is the sum output, `co` is the carry-out.
  port (i0, i1 : in bit; ci : in bit; s : out bit; co : out bit);
end adder;

architecture rtl of adder is
begin
  --  This full-adder architecture contains two concurrent assignments.
  --  Compute the sum.
  s <= i0 xor i1 xor ci;
  --  Compute the carry.
  co <= (i0 and i1) or (i0 and ci) or (i1 and ci);
end rtl;

接著把下列測試檔存檔,檔名為「adder_tb.vhdl」

--  A testbench has no ports.
entity adder_tb is
end adder_tb;

architecture behav of adder_tb is
  --  Declaration of the component that will be instantiated.
  component adder
    port (i0, i1 : in bit; ci : in bit; s : out bit; co : out bit);
  end component;

  --  Specifies which entity is bound with the component.
  for adder_0: adder use entity work.adder;
  signal i0, i1, ci, s, co : bit;
begin
  --  Component instantiation.
  adder_0: adder port map (i0 => i0, i1 => i1, ci => ci,
                           s => s, co => co);

  --  This process does the real job.
  process
    type pattern_type is record
      --  The inputs of the adder.
      i0, i1, ci : bit;
      --  The expected outputs of the adder.
      s, co : bit;
    end record;
    --  The patterns to apply.
    type pattern_array is array (natural range <>) of pattern_type;
    constant patterns : pattern_array :=
      (('0', '0', '0', '0', '0'),
       ('0', '0', '1', '1', '0'),
       ('0', '1', '0', '1', '0'),
       ('0', '1', '1', '0', '1'),
       ('1', '0', '0', '1', '0'),
       ('1', '0', '1', '0', '1'),
       ('1', '1', '0', '0', '1'),
       ('1', '1', '1', '1', '1'));
  begin
    --  Check each pattern.
    for i in patterns'range loop
      --  Set the inputs.
      i0 <= patterns(i).i0;
      i1 <= patterns(i).i1;
      ci <= patterns(i).ci;
      --  Wait for the results.
      wait for 1 ns;
      --  Check the outputs.
      assert s = patterns(i).s
        report "bad sum value" severity error;
      assert co = patterns(i).co
        report "bad carry out value" severity error;
    end loop;
    assert false report "end of test" severity note;
    --  Wait forever; this will finish the simulation.
    wait;
  end process;
end behav;

先用
ghdl -a adder.vhdl

再用
ghdl -a adder_tb.vhdl
ghdl -e adder_tb

最後
ghdl -r adder_tb --vcd=adder.vcd

結果會在檔案所在資料夾中看到一個名為adder.vcd的檔案,點開來會自動啟動gtkwave
看到以下畫面:




先在左上的adder_0點一下,接著到左下幾個reg ...都點兩下,結果會在右側波形視窗出現綠線



接著用放大鏡-,一直按一直按,隨著時間刻度慢慢放大,大概到ns間距時,波形開始出現





2018年8月22日 星期三

LED蠟燭實驗

網路這幾天流傳一則影片,有人用Arudino連接一顆0402的SMD LED,然後對著點亮的LED吹氣,最後竟然可以吹熄,過一會又亮起來,如此反覆操作著。
這個作者也在instructables.com上面發表做法,甚至在Arduino官網上也有上頭條,這麼有趣的專題,我也來跟風做做看。

矽二極體每升高一度C,則障壁電壓會下降2.5mV

這是電子學課本一開始就會教的知識,如今可以用在這個小專題上,這個專題利用微小封裝的LED,使得該LED內的二極體接面能夠快速感受到溫度的變化,利用點亮LED時產生的溫度升高與吹氣時帶走溫度這兩者之間的溫差,預計可以獲得一個明顯的障蔽電壓電壓變化,然後搭配Arduino內的ADC將二極體的障壁電壓讀取出來,接著用軟體模擬蠟燭點亮與吹熄的效果。

首先接一個簡單可以點亮發光二極體的電路,一個有限流電阻的發光二極體迴路,發光二極體在迴路中的低側,如此就可以從發光二極體的陽極拉出導線量測電壓。電壓變化如此的小,除了在硬體電路上加以改進外,是否還有其他解法能得知這個微弱變化呢?

為了解決在電壓量測的軟體技巧上使用了累加法,將微小的電壓變化放大出來。當直接讀取單次的ADC數值時,只有看到個位數在跳動,但完全無法得知目前微弱電壓的數值,但是這個跳動的個位數本身就隱含著微弱電壓的訊息,於是我們只要每次讀取固定數量且大量的數據累加起來,就可以將這個隱含的訊息予以放大。這個過程有點像是累進誤差這個概念的反義應用,本來累進誤差是我們不要的,但是如果逆向思考則成為有效的工具。另外,這裡也有另一層意義需要思考,就是單筆ADC數值上的個位數跳動與累加之後產生了明顯的差別,非常貼切地驗證了「見樹不見林」這句話。在解決問題之前我們通常要先觀察問題,而觀察問題的時候則是是需要不斷改變高度甚至是維度,這時候就要依賴數學課教我們的那一堆數學工具來觀察了。

2018年8月21日 星期二

木製CNC之Z軸強化測試紀錄

這一次把Z軸重做
為了增加因安裝主軸馬達的負重
首先將X軸滑軌調整位置,把X軸兩個滑軌靠近,並且調整皮帶在X軸也靠近
將CNC主軸馬達用一塊木板做轉接,轉接到原本的Z軸之上
其中Z軸重做兩次
第一次的改裝Z軸,穩定性欠佳,會晃動
今天(8/21)把Z軸採用新式固定方法,也同時符合組裝順序,由底部到上部一層一層組裝,方便事後維修
穩定性增加,Z軸結構不再有形變問題

在45度來回畫線的測試上
依然發生在45度線有重疊問題
原本判斷是Z軸結構形變導致X軸來回有齒隙
但現在Z軸穩定增加,但線條重疊問題依舊
不得不懷疑是步進馬達本身解析度不足

有一個現象很可疑 右側的步進馬達(短線側)的無通電抓止力明顯低於左側馬達
是否為右側馬達磁力不足?

在Y軸並無齒隙問題,只有X軸有齒隙問題,而且高達1mm

2018年8月10日 星期五

新增KiCAD PCB 零件之步驟

1. 指件庫,指定要新增的零件歸屬在哪一個零件庫,並且從視窗標題確認成功載入


2.新增件

新增零件,並同時命名

3.畫邊框

邊框使用Silk層,以零件的上投影作為範圍,根據零件資料手冊繪製

4.定腳位

根據資料手冊擺放,設定零件腳編號、內徑、外徑等參數

5.寫名字
游標移至零件範圍內,按下按鍵E可進入零件參數編輯,例如名稱與3D模型指定等,

6.存檔

2018年8月9日 星期四

kicad的零件3D模型怎麼畫

步驟:
1.在kicad新增PCB零件
2.到freecad,先從Workbensches下拉選單中點選Part Design
















3.以新增草圖方式(Create a New Sketch)描繪,須先規劃以哪一個平面為主,例如XZ XY平面等等

4.以Pad a Selected Sketch方式「長肉」

5.在Combo View先點選要改變參數的草圖,接著在Property-Value視窗中調整參數

6.最後,在File->Export...輸出3D檔案,副檔名是wrl,然後放在KiCAD的3D資料夾中就可以了。注意3D資料夾中不同零件都有用資料夾包起來,要放對地方。

7.嗚哇啦


嘔~對了,模型讀進去KiCAD之後要縮小2.54倍,也就是在KiCAD元件的3D屬性Scale中要填入0.39

2018年8月6日 星期一

從kicad到CNC

以下是MAC版的做法
從KiCAD到CNC的G-code有幾個步驟
1.layout完成後使用列印功能,點選需要的圖層

2.點選列印後再點選預覽PDF,此時系統會使用內建預覽程式打開這個PDF

3.在MAC的預覽程式中輸出成圖檔,選擇PNG,解析度300 dpi

4.在inkscape中匯入圖檔,匯進來就是1:1的尺寸不用調整

5.打開Trace bitmap功能先到其中的Options分頁將Smooth corners調降成零

6.回到Trace bitmap的Mode分頁使用edge detection功能將點陣圖轉成向量外框線
2018/8/211補充:「邊緣檢測」會把圖案轉出兩層外框,使用「色彩量化」選項並且挑選第一層結果則只會有一層外框。


7.使用Gcodetools,先用orientation points定義(100,0)的位置

8.接著用path to gcode就可以輸出副檔名為ngc的gcode檔案

9.使用UniversalGcodeSender這隻程式可以觀看ngc檔案的內容


2018年6月20日 星期三

debian系統中文缺字以及6中文輸入法fcitx的問題修復

我的debian安裝中文的過程:
安裝字型
安裝輸入法fcitx

輸入法的部份一直沒有辦法啟動
用fcitx-dianose去查發現是找不到 gtk-query-immodules-2.0
結果是因為debian for armjj的關係,它放到 /usr/lib/arm-linux-gnueabihf/libgtk2.0-0/gtk-query-immodules-2.0 這裡去了
我做個軟連結把檔案複製到 /usr/lib 重新開機後輸入法就出現了

另外缺字的部份,包括注音符號都出不來,於是找到有人說裝這個字型就解決了:
 sudo apt-get install  fonts-arphic-bsmi00lp

2018年6月18日 星期一

透過apt-get dist-upgrade方式升級banana pi的debian系統

使用apt-get dist-upgrade升級banana pi的debian都會造成xwindow的顯示失效
主要錯誤是fbturbo driver不見了
找到以下方法解決

1.將banana pi安裝debian image
2.替換sources.list
3.
apt-get update
apt-get upgrade
apt-get dist-upgrade
4.根據這一篇安裝GPU driver
http://wiki.lemaker.org/BananaPro/Pi:GPU
內容主要是重建mali driver以及 fbturbo driver

2018年6月4日 星期一

在intel nuc迷你電腦上安裝debian最簡版

1.到debian官網下載iso檔,雖然名為CD/DVD的iso檔,但是放在USB也是可以開機的,下載時選擇***-netinst-***版本,就是最小安裝,過程中會依照需求自動上網下載套件包
2.這次的安裝我選擇「全碟加密加上自動分割」,過程中遇到一些問題:
2-1.全碟加密會連swap也是加密狀態,最後導致安裝完成後,swap在哪裡系統會認不得,因為他是用安裝時的swap分割區,結果安裝完成後這個分割區自然消失了因此找不到。這時候要針對新的swap分割重新做一遍設定,大概就是swapoff,mkswap,swapon之類的,網路上都有資料。
2-2.另一個全碟加密後的問題是,造成每一次開機時,系統都會要求輸入密碼,可是這在嵌入式系統上是不可行的,一種作法是把密碼明檔放在某個儲裝置,然後讓系統在開機時去讀,另一種是放在/boot上面讓系統去讀。這個/boot是明碼存放的,因此會造成風險大增。
3.安裝過程都有提示,沒有問題。

2018年5月10日 星期四

如何修改stm32f103的PWM LED範例

範例來源:https://github.com/avislab/STM32F103

當中有一個範例名為:Example_PWM_LED

是利用PWM控制位在PB6接腳的LED的亮度的實驗
並且利用PA0與PA1兩隻腳的輸入來控制PWM的程度

這裡我們修改成自動變化,也就是呼吸燈的形式

首先我們先在eclipse中開立一個新專案
在File->New->Project選擇C Project
在Executable選擇STM32F10x C/C++ Project並且設定專案名稱
在下一頁的「目標處理器設定」中將Content選擇Empty
並且確定Use system calls:是否為POSIX
確定Trace output:是否為ARM ITM(via SWO)

接著後面的選項都是預設值

隨後進入eclipse主頁面
檢查一下新開立的專案中資料夾是否到齊:
src,system,include,ldscripts
其中system中應包含cmsis,cortexm,diag,newlib,stm32f1-stdperiph

這一個空的專案檔已經將相關的原始碼備妥,所以我們只要填入新的程式碼就可以

先把專案中自動產生的main.c刪除
然後來到example這邊,在example->Example_PWM_LED裡面我們只需要複製main.c這個檔案過來專案就可以,複製的方法就是在main.c這個檔案所在的目錄裡面用滑鼠將檔案複製起來,然後到eclipse的專案瀏覽器視窗中,在剛剛開好的專案上點選滑鼠右鍵,將檔案接上即可。

接著打開main.c檔
這個範例程式的流程如下
設定GPIO,將A0,A1設為輸入,將B6設為輸出
接著設定Timer4主體以及Time4的輸出
接著初始化Timer4的OC1
然後啟動Timer4

隨即進入程式的主迴圈
先讀取A0,若按下則增加Timer CCR的數值
讀取A1,若按下則減少Timer CCR的數值

接下來我們進行修改
因為範例程式是將LED安排在PB6的端子輸出
但是我們的板子是把LED連接在PB8
根據 http://www.st.com/resource/en/datasheet/stm32f103c8.pdf 第33頁指出
說明了Timer4一共有四個輸出端子分別是PB6,PB7,PB8,PB9
目前範例是使用PB6,而我們要改成的PB8剛好是Timer4的第三組輸出

所以我們先回到範例程式前半段
其中有一道指令是用來設定Timer要用哪一組輸出端子


TIM_OCStructInit(&timerPWM);
timerPWM.TIM_Pulse = 10;
timerPWM.TIM_OCMode = TIM_OCMode_PWM1;
timerPWM.TIM_OutputState = TIM_OutputState_Enable;
timerPWM.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM4, &timerPWM);


這一段程式首先將結構變數timerPWM設定了相關參數,然後它送給TIM_OC1Init()做設定
這裡只需要把
TIM_OC1Init
改成
TIM_OC3Init
即可

接著看到主迴圈中負責設定CCR的程式

TIM4->CCR1 = TIM_Pulse;
將它改成

TIM4->CCR3 = TIM_Pulse;
即可

最後要將PWM LED的動作改成自動變化
因此我們需要一個變數來記錄「明」與「滅」的狀態
以便讓變數自動增加或減少
因此我們加入這樣的程式
    if(countDir == 0){
    if (TIM_Pulse < PERIOD)
    TIM_Pulse++;
    else
    countDir = 1;
    TIM4->CCR3 = TIM_Pulse;

    }else{
    if (TIM_Pulse > 0)
    TIM_Pulse--;
    else
    countDir = 0;
    TIM4->CCR3 = TIM_Pulse;

     }
如此一來,迴圈每次回頭就會把CCR3的數值更新,於是就可以看到LED燈明滅之間漸層變化。

2018年5月9日 星期三

如何使用arduino IDE開發stm32f103晶片

根據這裡指出:https://github.com/stm32duino/Arduino_Core_STM32

在arduino IDE裡面新增板子管理員,「額外的開發板管理員網址」如下
https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json

接著就可以在 IDE的工具->開發板: 看到 Generic STM32F103 serials選項
點選後就會在 工具選單內出現新板子的新選項
基本上維持預設值選項
然後將STM32F103的板子以ST-LINK工具連接好,接上電腦
這個板子管理員會將程式編譯好然後上傳並執行,跟傳統arduino的上傳過程一樣,只是編譯時間會久一點

STM32F103這邊完全不用做任何設定或預先安裝,上述的開發過程與其他也ST-LINK工具開發的過程一樣,只是改用Arudino IDE作為介面而已,然後他也相容原本Arudino的程式,他會在編譯過程中搭配一些程式庫將程式碼編譯成STM32F103的ARM code。

至於原本arduino的接腳與STM32F103的接腳如何對應,我還在研究
2019-2-13
關於接腳對應
直接寫接腳名稱就可以,例如:PB8

2018年5月8日 星期二

在mac開發stm32f103,eclipse+stlinkv2+openocd

這一篇使用openocd方法連接stlinkv2

安裝openocd: 參考來源: http://www.davidrojas.co.uk/stm32f3discovery-on-mac-os-x-using-eclipse-gcc-arm-and-openocd/
指令:brew install openocd --enable_ft2232_libftdi --enable_stlink
會安裝在 /usr/local/Cellar/open-ocd
打開 eclipse -> preference
裡面找到 Run/Debug -> String Substitution 裡面的 openoce_path


將openocd程式所在位置填進去

在Debug Configurations地方選擇GDB OpenOCD Debugging
在Debugger分頁地方,config option加入
-f /usr/local/share/openocd/scripts/interface/stlink-v2.cfg -f /usr/local/Cellar/open-ocd/0.10.0/share/openocd/scripts/target/stm32f1x.cfg
用以指定介面的參數檔以及目標晶片的參數檔

這樣就可以了

如果有發生不能連線的問題
那麼在連線前按住RESET鍵在點選Debugger啟動,就可以順利連線了

2018年5月6日 星期日

在mac建立stm32開發環境,eclipse+stm32+stlink,使用st-util+GDB Hardware Debugging下載與除錯


安裝st-link驅動
brew install stlink
這篇文章說是要另外下載,但我直接執行上述指令就成功安裝,不知道會不會動


安裝gcc-arm-none-eabi
brew tap PX4/homebrew-px4
brew update
brew install gcc-arm-none-eabi


下載安裝eclipse CDT

在eclipse-> Help -> Install New Software

Add -> http://gnuarmeclipse.sourceforge.net/updates
稍待清單出現,選擇需要的package
安裝完成會要求重新啟動eclipse

選擇新專案 File -> New -> Project -> C Project
接著就會出現 STM專案
勾選對應的硬體編號
設定專案名稱
在下一頁的Target processor settings選擇
Use system calls: -> POSIX
Trace output -> ARM ITM (via SWO)


安裝openocd: http://www.davidrojas.co.uk/stm32f3discovery-on-mac-os-x-using-eclipse-gcc-arm-and-openocd/
指令:brew install openocd --enable_ft2232_libftdi --enable_stlink
會安裝在 /usr/local/Cellar/open-ocd
打開 eclipse -> preference
裡面找到 Run/Debug -> String Substitution 裡面的 openoce_path
將openocd程式所在位置填進去

不用openocd
而是用st-util與GDB hardware debugging
在前面一開始提到的st-link驅動安裝
會在/usr/local/bin裡面安裝st-util
所以這裡在External Tool Configuration內設定執行外部程式/usr/loca/bin/st-util
st-util他會自動去抓已連接的st-link然後等待tcp/ip port的連接
port : 4242

然後小瓢蟲的地方要使用 GDB Hardware Debugging的方式連接
並且在Debugging tab的地方選擇tcp/ip 連接埠設定4242
接著在第三頁Startup的地方將RESET與Halt兩者反選,因為根據這裡指出,這一版eclipse有bug,選了這兩樣會導致debugger不能運作



每次要執行程式之前先按一下外部工具按鈕,讓st-util跑起來
然後再按小瓢蟲就可以連線下載~

參考資料:
http://macappstore.org/stlink/
https://blanboom.org/2014/stm32-with-osx/

2018年2月23日 星期五

raspberry pi SPI LCM 設定方法

樹莓派其中一種LCM介面是SPI
根據這篇文章指出
https://sudomod.com/forum/viewtopic.php?t=2312
步驟如下:
1.首先開啟樹莓派的SPI介面:使用命令列指令 sudo raspi-config



2.基本上使用  flexfb  跟 fbtft_device 這兩個核心外掛:基本指令如下:

sudo modprobe fbtft_device custom name=fb_ili9341  gpios=reset:25,dc:24,led:18 speed=16000000 bgr=1


3.在 /etc/rc.local 裡面添加三行,要加在 exit 0 這一行之前

sudo modprobe flexfb  width=480  height=320  regwidth=16 init=-1,0xb0,0x0,-1,0x11,-2,250,-1,0x3A,0x55,-1,0xC2,0x44,-1,0xC5,0x00,0x00,0x00,0x00,-1,0xE0,0x0F,0x1F,0x1C,0x0C,0x0F,0x08,0x48,0x98,0x37,0x0A,0x13,0x04,0x11,0x0D,0x00,-1,0xE1,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0xE2,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0x36,0x28,-1,0x11,-1,0x29,-3

sudo modprobe fbtft_device debug=3 rotate=0 name=flexfb speed=40000000 gpios=reset:25,dc:24

/usr/local/bin/fbcp&



第三步是用來執行開機自動執行核心模組掛載的動作
然後背景執行 fbcp 
fbcp 是一個framebuffer複製程式 用來將framebuffer內容複製起來然後透過SPI介面傳送到LCM的程式

fbcp需要下載原始碼並編譯與安裝
方法如下:

sudo apt-get install cmake
git clone https://github.com/tasanakorn/rpi-fbcp
cd rpi-fbcp/
mkdir build
cd build/
cmake ..
make
sudo install fbcp /usr/local/bin/fbcp


2018年2月20日 星期二

關於mbcWJFX的設計哲學

在2003那時候(根據原始碼中的註解)我打造了一個在palm上面運作的app
用途是在palm上面可以編輯與運行圖形化程式
是受到LabVIEW的啟發所做

當時是從一個簡單的palm範例開始
我記得那是一個塗鴉板程式範例
因為塗鴉板程式會運用palm的觸碰輸入與圖形之間的變化互動
因此用來實現這個專案十分洽當

palm os 是一種協調式多工
app主程式進來後有一個迴圈
在程式架構的設計上
不能有無窮迴圈或是等待迴圈在裡面
所有的事情必須切割成一片一片的時間

系統會回呼我們的事件處理副程式
static void AppEventLoop(void)
然後我們把要處理的所有事情安排在事件處理副程式中

這一個專案式我自發性的專案
在課餘時間做的
並且持續了一段時間
當時十分燒腦
而且呈現沉迷狀態

後來出社會工作後發現
這一次的專題訓練奠定了一個重要的基礎
因為後來開發生理監視器的時候
也是一個協調式多工
因此我在工作中引入許多當年累積的經驗與知識

特此為記