古人智慧

Just Do it!
上士聞道,勤而行之;中士聞道,若存若亡;下士聞道,大笑之。不笑,不足以爲道。
~ 道德經 41

「實現夢想不是追逐成功,而是在於賦予生命意義,人生中的每個決定與聲音都有其重要含義。」"The key to realizing a dream is to focus not on success but on significance — and then even the small steps and little victories along your path will take on greater meaning."
電視名人-歐普拉·溫芙蕾(OPRAH WINFREY)

搜尋此網誌

Translation

2018年9月29日 星期六

羅馬簾維修

窗簾,不只是遮陽與隱私。
一個房子如果沒有窗簾,就無法成為
不同意? 那您看官可以把家裡的窗簾拆掉,看看啥感覺~~~
家裡臥房的羅馬簾經過多年風吹雨打,布料特質都被破壞,稍微出個力就破損。
如同這窗簾,它的活動拉簾的固定環被拉斷~~

《拉環斷落》
要換新,或是修復?
當然啦,肯定DIY修看看。
最簡單方式就是用棉線把拉環直接固定在窗簾上
針眼真是小,老花要將棉線穿過去很辛苦,還好在針線盒看到這寶物

《縫起來》

《另外兩個順便加固縫》

《運作正常》
前後花了將近1小時把這窗簾搞定,應該可以再撐個幾年吧~~~~

2018年9月4日 星期二

Raspberry Pi 3B+ 樹莓派 - TensorFlow+Keras+OpenCV installation guide

這樹莓派要裝上AI的工具讓我折騰了好一陣子,真是累人。
趁記憶還清楚,把過程寫下:

基礎設備

Raspberry Pi 3B+
官網下載最新image影像檔 RASPBIAN STRETCH WITH DESKTOP
燒錄到至少16GB的SD卡,插到3B+然後開機把WiFi與相關流程完成設定。
注意: 不要讓開機程序執行自動安裝更新,因為會等好久。這步驟待會會再做。。。

重啟後,進入到pi,然後開始以下流程重點安裝:

清除不需要的APPs,省下1GB以上。

sudo apt-get purge wolfram-engine
sudo apt-get purge libreoffice*
sudo apt-get clean
sudo apt-get autoremove

開始更新Raspbian,

sudo apt update
sudo apt upgrade

sudo apt autoremove

把swap增加大一些,避免在執行安裝時出錯。

sudo nano /etc/dphys-swapfile

# set size to absolute value, leaving empty (default) then uses computed value
#   you most likely don't want this, unless you have an special disk situation
#CONF_SWAPSIZE=100
CONF_SWAPSIZE=1024
重啟後,進入到pi,因為Raspbian已經自帶Python3.5.3,可以直接安裝TensorFlow,記得要用pip3!!!

安裝TensorFlow:

sudo apt install libatlas-base-dev
pip3 install --user tensorflow
如果沒出現error,就繼續下一步。 如果有錯誤訊息,參考TensorFlow官網

安裝OpenCV

sudo apt install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt install libxvidcore-dev libx264-dev
sudo apt install qt4-dev-tools

pip3 install --user opencv-python

安裝Keras

sudo apt install python3-h5py
pip3 install --user keras

安裝其他工具、繪圖與影像處理模組:

pip3 install --user pillow lxml jupyter matplotlib
安裝jupyter後,用nano ~/.bashrcexport PATH=$PATH:~/.local/bin加入到最後一行。 然後輸入source .bashrc,不然會出現 command not found!!

Jupyter remote用法:

In remote host, open the terminal, change directory to where you have your notebooks and type:
#on the 3B+ site
jupyter notebook --no-browser --port=8889

#on the PC/Mac site
ssh -N -f -L localhost:8001:localhost:8889 pi@192.168.1.xxx
然後在PC/Mac端的browser輸入localhost:8001就連上樹莓派的jupyter開始寫code測試。
Oh, one more thing. Tensorflow會有機會Google `Protocal Buffer’這個工具,建議一起裝上。
sudo apt install protobuf-compiler

就這樣OK了!!!

2018年8月18日 星期六

古董錶清洗與上油

手錶,經過百年的進化進準度高,但是老錶的製作工藝與品位,確實讓人讚歎。
DIY,一只年紀比我還大的瑞士老錶,經過我的巧手,指針從灰暗到湛藍,錶殼與刻度重返亮金,玻璃恢復清透無痕,上油後擺輪輕快的滴答唱著歌。。。。
10年多前因緣際會獲得手上這只古董錶,記得當時這手錶玻璃模糊,錶殼暗灰,指針暗藍。
上週心血來潮入手一套拆錶工具錶油,如下圖:
先撬開背蓋,這老錶沒防水機制,把錶芯小心拿出來。
然後,用酒精+水(1:3)當做清潔劑,棉花棒在錶面輕輕的來回擦拭。


《指針從暗藍色變成湛藍,漂亮!!》
至於玻璃部分,用眼鏡布沾一點自製的清潔劑,在內部擦乾淨再用噴嘴輕輕把灰塵噴掉。
因為手上螺絲起子無法拆這些齒輪,所以只好用點油筆沾一點錶油在可以看見的活動齒輪部位上一點油,看來效果還可以。
把後蓋與錶殼的接觸部位用棉花棒沾防水膏塗上,可以減少錶殼與後蓋之間的摩擦。
最後,錶帶用強力膠把裂開的部位粘好。
看吧,這錶如同新的一般,測試了兩天,手錶走的很準確,這真的是好錶

2018年7月29日 星期日

咖啡豆烘焙DIY

喝咖啡幾十年了,沒看過咖啡樹長啥樣子,也不知咖啡豆是怎麼來的。。。
前幾天因緣際會拿到一包咖啡生豆,瞬間傻眼。。。。
就積極Google如何生豆保存與如何烘焙
相關圖片
《咖啡生豆》
DIY烘焙步驟看來應該不難,難度應該是在如何掌握烤咖啡豆的溫度與時間。
看了幾個Youtube視頻,DIY魂迅速燃起,go go go~~
將生豆放入平底鍋,然後開爐,中度火力不要過大。

《開爐準備》
注意翻炒速度,讓每顆生豆平均受熱。因為第一次做實驗,加上手腳不靈光,好像受熱程度不均勻。沒事,多玩幾次就熟練啦。。。

《注意均勻受熱》
因為喜歡重度烘焙口味,所以一直炒到第二次爆音,產生褐色的程度才起鍋。這過程會產生濃煙,尤其第二爆音的時候,記得抽油煙機要開大一些。

《重度烘焙》
值得一提的是,剛起鍋的咖啡豆焦味很重,但是慢慢冷卻後咖啡香味就逐漸飄出來,真的很香。。。

《起鍋》
網上達人提到,剛起鍋的咖啡豆味道並不是最好,最好放個2~3天,讓咖啡豆排氣過度旺盛的狀況會減緩,口感豐厚度增加。不過,基於研究精神(其實是嘴饞),我放置一天後就泡了第一杯來嘗嘗。。。
是的,手搖磨豆。
在磨豆過程中可以聞到咖啡香味,而且覺得豆子相對很硬,要用平常大一點的力量。

《手動磨豆機》
粉狀結構與顏色很漂亮~
準備沖泡
加熱水
噹噹,第一杯出爐~~
看來顏色比平常泡的黑,也比較香。
這口味很濃但不苦澀,吞下去後有回甘的感覺,看來還算成功!
喝完一杯後,慘了,中毒了~~~
好想再喝一杯,回不去了。。。。。。。。。。。。。。。

後記

這過程讓我很想DIY一台咖啡烘焙機,可以運用AI的方式來控制溫度與時間,做這個項目各種演算法與機器應該是非常有趣的~

2018年7月8日 星期日

[STM32F4] 6 UltraSonic Platform,6個超聲波偵測小車底盤

最近在研究[STM32F4](https://www.st.com/en/microcontrollers/stm32-32-bit-arm-cortex-mcus.html)。
這款SOC在Robot機器人的平台使用率極高,主要是搭載ARM M系列32bits的CPU再加上周邊很多組的GPIO。而且,ST設計一套[STM32CubeMX](https://www.st.com/en/development-tools/stm32cubemx.html)可以快速簡單來config這顆SOC所需要的pin腳、clock等等,之後再自動產生相對應的code,真是不錯的tool,且這SOC價格不貴C/P值極高。

##美圖欣賞
###這小車搭載6顆超聲波,2顆防跌落,兩套電機馬達與輪子

《小車底盤正面搭配X828手機,正面3顆超聲波》

《播個有趣的畫面增強效果》

《兩個側面各一顆》

《屁股一顆》

《線接的很亂,但功能正常》

##視頻分享
###人臉自動追蹤





2018年6月21日 星期四

OpenCV on MacOS 在MacOS安裝OpenCV開發

最近開始研究商用機器人,必須運用高階的開發工具來與AI做結合。
OpenCV,從維基百科全稱是Open Source Computer Vision Library,是一個跨平台的電腦視覺庫。
OpenCV可用於解決如下領域的問題:
  • 增強現實
  • 人臉識別
  • 手勢識別
  • 人機互動
  • 動作識別
  • 運動跟蹤
  • 物體識別
  • 圖像分割
  • 機器人
所以,學習OpenCV是有其必要性。

安裝Python開發

環境

MacOS 10.15.5 High Sierra
Python 3.6
OpenCV 3.4.1_5
先google前人的經驗,找到幾篇記錄下來:

Python 環境

參考Install OpenCV 3 on MacOS,建議用virtualenv建立一個虛擬pyhton3.6的環境,避免與macOS弄混。
  • 建立opencv虛擬python3.6環境,並安裝必要的package:
    virtualenv -p python3 opencv
    source opencv/bin/activate
    pip install numpy scipy matplotlib scikit-image scikit-learn ipython pandas jupyter
    deactivate
    
  • 用brew安裝opencv,個人是認為比較簡單的方式:
brew install opencv
或者之前已經安裝過舊版,用upgrade方式。
brew upgrade opencv
  • 環境變數設定:
echo /usr/local/opt/opencv/lib/python3.6/site-packages > /usr/local/lib/python3.6/site-packages/opencv3.pth
  • 進入到剛剛建立的opencv的virtualenv
cd ~/opencv/lib/python3.6/site-packages
ln -s /usr/local/opt/opencv/lib/python3.6/site-packages/cv2.cpython-36m-darwin.so cv2.so
  • 測試是否安裝完成:
source opencv/bin/activate
ipython
import cv2
print(cv2.__version__)

安裝Xcode開發

這部分有點複雜,分為command mode與xcode IDE模式。
參考這份文章,與這篇
  • command mode

先確定是否已經安裝 pkg-config
 * brew install pkg-config
  • 如果安裝順利,應該可以導出compiler需要的include、lib的參數:
pkg-config --cflags --libs opencv
  • 如同這麼多的參數:
-I/usr/local/Cellar/opencv/3.4.1_5/include/opencv -I/usr/local/Cellar/opencv/3.4.1_5/include -L/usr/local/Cellar/opencv/3.4.1_5/lib -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dpm -lopencv_face -lopencv_photo -lopencv_fuzzy -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_optflow -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_dnn -lopencv_plot -lopencv_xfeatures2d -lopencv_shape -lopencv_video -lopencv_ml -lopencv_ximgproc -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_flann -lopencv_xobjdetect -lopencv_imgcodecs -lopencv_objdetect -lopencv_xphoto -lopencv_imgproc -lopencv_core
  • 再來寫個簡單的code,main.cpp來測試,記得在desktop放個png:
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char** argv) {
    Mat image;
    image = imread("/Users/regis/Desktop/aaa.png", 1);
    namedWindow("Display Image", WINDOW_AUTOSIZE);
    imshow("Display Image", image);
    waitKey(0);
    return 0;
}
  • build code的寫法:
    g++ $(pkg-config --cflags --libs opencv) -std=c++11  main.cpp -o test1
    
  • 執行:
    ./test1
    
  • Xcode IDE模式

這部分我搞了好一陣子,主要是卡在search path的地方,找了好久。。。

《include path》

《Lib path》
  • 再來就是把lib/.a抓進來,如果沒做這個動作,會build失敗。只要把.dylib.a抓進來即可。
  • 再把剛剛的main.cpp拷貝過來,build與run看看,應該會成功的!

接下來,就是要好好研究openCV的功能了!

2018年6月6日 星期三

[STM32F4x] OpenOCD install on MacOS

單片機MCU的價格不斷下降內含Flash與RAM,開發的工具也越來越成熟與穩定,隨著IOT興起推動MCU的熱潮!!!
手上剛好有一片STM32F407的核心板子,正好可以進入ARM 32bits MCU的世界。
STM32系列是很廣泛被使用在各領域的MCU,內含Cotex-M1到M7的ARM 32bits CPU,是值得深入學習的晶片系列。
在淘寶買到的核心板與Jtag
單片機MCU的價格不斷下降內含FlashRAM,開發的工具也越來越成熟與穩定,隨著IOT興起推動MCU的熱潮!!!
手上剛好有一片STM32F407的核心板子,正好可以進入ARM 32bits MCU的世界。
STM32系列是很廣泛被使用在各領域的MCU,內含Cotex-M1到M7的ARM 32bits CPU,是值得深入學習的晶片系列。

在淘寶買到的核心板與Jtag

<zu’zh

OpenOCD 安裝 installation


Regis-MacPro:~ regis$ brew update

Already up-to-date.

Regis-MacPro:~ regis$ brew install openocd
結果

==> Installing dependencies for open-ocd: libusb, libusb-compat, libftdi, hidapi

==> Installing open-ocd dependency: libusb

==> Downloading https://homebrew.bintray.com/bottles/libusb-1.0.22.high_sierra.b

######################################################################## 100.0%

==> Pouring libusb-1.0.22.high_sierra.bottle.tar.gz

🍺  /usr/local/Cellar/libusb/1.0.22: 29 files, 514.8KB

==> Installing open-ocd dependency: libusb-compat

==> Downloading https://homebrew.bintray.com/bottles/libusb-compat-0.1.5_1.high_

######################################################################## 100.0%

==> Pouring libusb-compat-0.1.5_1.high_sierra.bottle.tar.gz

🍺  /usr/local/Cellar/libusb-compat/0.1.5_1: 14 files, 94.3KB

==> Installing open-ocd dependency: libftdi

==> Downloading https://homebrew.bintray.com/bottles/libftdi-1.4.high_sierra.bot

######################################################################## 100.0%

==> Pouring libftdi-1.4.high_sierra.bottle.1.tar.gz

🍺  /usr/local/Cellar/libftdi/1.4: 19 files, 164.3KB

==> Installing open-ocd dependency: hidapi

==> Downloading https://homebrew.bintray.com/bottles/hidapi-0.8.0-rc1.high_sierr

######################################################################## 100.0%

==> Pouring hidapi-0.8.0-rc1.high_sierra.bottle.2.tar.gz

🍺  /usr/local/Cellar/hidapi/0.8.0-rc1: 17 files, 131.2KB

==> Installing open-ocd

==> Downloading https://homebrew.bintray.com/bottles/open-ocd-0.10.0.high_sierra

######################################################################## 100.0%

==> Pouring open-ocd-0.10.0.high_sierra.bottle.1.tar.gz

🍺  /usr/local/Cellar/open-ocd/0.10.0: 632 files, 4.7MB
首先,尋找interface\是否有J-Link的設定檔。但是,如何找到這個interface\的folder?

sudo find / |grep interface/jlink.cfg
出現在這裡!!!

/usr/local/Cellar/open-ocd/0.10.0/share/openocd/scripts/interface/jlink.cfg
再來就下命令來連上STM32F4核心板

Regis-MacPro:50_openocd regis$ openocd -f interface/jlink.cfg -f target/stm32f4x.cfg
結果成功透過J-Link連上STM32F4核心板

Open On-Chip Debugger 0.10.0

Licensed under GNU GPL v2

For bug reports, read

 http://openocd.org/doc/doxygen/bugs.html

Info : auto-selecting first available session transport "jtag". To override use 'transport select <transport>'.

adapter speed: 2000 kHz

adapter_nsrst_delay: 100

jtag_ntrst_delay: 100

none separate

cortex_m reset_config sysresetreq

Info : No device selected, using first device.

Info : J-Link V9 compiled Jun  2 2222 22:22:22

Info : Hardware version: 9.40

Info : VTarget = 3.192 V

Info : clock speed 2000 kHz

Info : JTAG tap: stm32f4x.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)

Info : JTAG tap: stm32f4x.bs tap/device found: 0x06413041 (mfg: 0x020 (STMicroelectronics), part: 0x6413, ver: 0x0)

Info : stm32f4x.cpu: hardware has 6 breakpoints, 4 watchpoints
到這裡就成功把OpenOCD執行,並開通port 4444接收telnet來連線執行命令。

測試 Test

打開另一個terminal終端,輸入以下telnet指令

telnet localhost 4444
出現Open On-Chip Debugger,表示連上

Trying ::1...

telnet: connect to address ::1: Connection refused

Trying 127.0.0.1...

Connected to localhost.

Escape character is '^]'.

Open On-Chip Debugger

> poll

background polling: on

TAP: stm32f4x.cpu (enabled)
help指令了解更多
> help
adapter_khz [khz]
      With an argument, change to the specified maximum jtag speed.  For
      JTAG, 0 KHz signifies adaptive  clocking. With or without argument,
      display current setting. (command valid any time)
adapter_name
      Returns the name of the currently selected adapter (driver) (command
      valid any time)
adapter_nsrst_assert_width [milliseconds]
      delay after asserting SRST in ms (command valid any time)
adapter_nsrst_delay [milliseconds]
      delay after deasserting SRST in ms (command valid any time)
add_help_text command_name helptext_string
      Add new command help text; Command can be multiple tokens. (command
      valid any time)
add_script_search_dir <directory>
      dir to search for config files and scripts (command valid any time)
add_usage_text command_name usage_string
      Add new command usage text; command can be multiple tokens. (command
      valid any time)
arm
      ARM command group (command valid any time)
  arm core_state ['arm'|'thumb']
        display/change ARM core state
  arm disassemble address [count ['thumb']]
        disassemble instructions 
  arm mcr cpnum op1 CRn CRm op2 value
        write coprocessor register
  arm mrc cpnum op1 CRn CRm op2
        read coprocessor register
  arm reg
        display ARM core registers
  arm semihosting ['enable'|'disable']
        activate support for semihosting operations
  arm semihosting_fileio ['enable'|'disable']
        activate support for semihosting fileio operations
array2mem arrayname bitwidth address count
      convert a TCL array to memory locations and write the 8/16/32 bit
      values
bindto [name]
      Specify address by name on which to listen for incoming TCP/IP
      connections (command valid any time)
bp <address> [<asid>]<length> ['hw'|'hw_ctx']
      list or set hardware or software breakpoint
command
      core command group (introspection) (command valid any time)
  command mode [command_name ...]
        Returns the command modes allowed by a  command:'any', 'config', or
        'exec'.  If no command isspecified, returns the current command
        mode.  Returns 'unknown' if an unknown command is given. Command
        can be multiple tokens. (command valid any time)
  command type command_name [...]
        Returns the type of built-in command:'native', 'simple', 'group',
        or 'unknown'. Command can be multiple tokens. (command valid any
        time)
cortex_m
      Cortex-M command group
  cortex_m maskisr ['auto'|'on'|'off']
        mask cortex_m interrupts
  cortex_m reset_config ['srst'|'sysresetreq'|'vectreset']
        configure software reset handling (command valid any time)
  cortex_m vector_catch ['all'|'none'|('bus_err'|'chk_err'|...)*]
        configure hardware vectors to trigger debug entry
dap
      DAP command group
  dap apcsw [sprot]
        Set csw access bit 
  dap apid [ap_num]
        return ID register from AP (default currently selected AP)
  dap apreg ap_num reg [value]
        read/write a register from AP (reg is byte address of a word
        register, like 0 4 8...)
  dap apsel [ap_num]
        Set the currently selected AP (default 0) and display the result
  dap baseaddr [ap_num]
        return debug base address from MEM-AP (default currently selected
        AP)
  dap info [ap_num]
        display ROM table for MEM-AP (default currently selected AP)
  dap memaccess [cycles]
        set/get number of extra tck for MEM-AP memory bus access [0-255]
  dap ti_be_32_quirks [enable]
        set/get quirks mode for TI TMS450/TMS570 processors (configuration
        command)
debug_level number
      Sets the verbosity level of debugging output. 0 shows errors only; 1
      adds warnings; 2 (default) adds other info; 3 adds debugging.
      (command valid any time)
drscan tap_name [num_bits value]* ['-endstate' state_name]
      Execute Data Register (DR) scan for one TAP.  Other TAPs must be in
      BYPASS mode.
dump_image filename address size
echo [-n] string
      Logs a message at "user" priority. Output message to stdout. Option
      "-n" suppresses trailing newline (command valid any time)
exit
      exit telnet session
fast_load
      loads active fast load image to current target - mainly for profiling
      purposes
fast_load_image filename address ['bin'|'ihex'|'elf'|'s19'] [min_address [max_length]]
      Load image into server memory for later use by fast_load; primarily
      for profiling (command valid any time)
find <file>
      print full path to file according to OpenOCD search rules (command
      valid any time)
flash
      NOR flash command group (command valid any time)
  flash bank bank_id driver_name base_address size_bytes chip_width_bytes
            bus_width_bytes target [driver_options ...]
        Define a new bank with the given name, using the specified NOR
        flash driver. (configuration command)
  flash banks
        Display table with information about flash banks. (command valid
        any time)
  flash erase_address ['pad'] ['unlock'] address length
        Erase flash sectors starting at address and continuing for length
        bytes.  If 'pad' is specified, data outside that range may also be
        erased: the start address may be decreased, and length increased,
        so that all of the first and last sectors are erased. If 'unlock'
        is specified, then the flash is unprotected before erasing.
  flash erase_check bank_id
先到這裡,下次再研究深入些。