2019年6月3日 星期一

Jetson Nano GPIO support

Jetson Nano GPIO 位在 J41 connector

https://www.jetsonhacks.com/nvidia-jetson-nano-j41-header-pinout/

使用GPIO首先要處理權限的問題, 不然只有 root 能操作GPIO.
依據以下命令新增一個 group 叫 gpio. 把想要操作GPIO的user加入這個group.
然後在每次export GPIO後更改sys file system相關檔案的權限

sudo groupadd -f -r gpio
sudo usermod -a -G gpio $USER
sudo cp /opt/nvidia/jetson-gpio/etc/99-gpio.rules /etc/udev/rules.d/

修改 /etc/udev/rules.d/99-gpio.rules

SUBSYSTEM=="gpio", KERNEL=="gpio*", ACTION=="add", \
    PROGRAM="/bin/sh -c 'chown root:gpio /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value; chmod 660 /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value'"

將chmod 660 改為 chmod 666

sudo udevadm control --reload-rules && sudo udevadm trigger

將想要使用的GPIO export命令放在 /etc/profile.d/export-gpio.sh
這樣每次系統重啟就會自動把GPIO export好. 例如GPIO18

echo 18 > /sys/class/gpio/export

echo out > /sys/class/gpio/gpio18/direction

echo 1 > /sys/class/gpio/gpio18/value

最後要sudo reboot now

以c/c++來控制GPIO.

https://github.com/gigijoe/jetsonTX2GPIO

Input / Output 電路

https://www.jetsonhacks.com/2015/12/29/gpio-interfacing-nvidia-jetson-tx1/


2019年5月31日 星期五

Jetson Naon Camera Support

Jetson Nano 支援的 IMX219 Cmaera 連接到主板上CSI-2 Connector. 另外也支援USB UVC 類型的 camera


IMX219 Camera 可直接購買 Raspberry Pi camera module V2 直上, 該模組有800萬畫素, 解析度支援到 3280x2464

v4l2-ctl -d /dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
Index       : 0
Type        : Video Capture
Pixel Format: 'RG10'
Name        : 10-bit Bayer RGRG/GBGB
Size: Discrete 3280x2464
Interval: Discrete 0.048s (21.000 fps)
Size: Discrete 3280x1848
Interval: Discrete 0.036s (28.000 fps)
Size: Discrete 1920x1080
Interval: Discrete 0.033s (30.000 fps)
Size: Discrete 1280x720
Interval: Discrete 0.017s (60.000 fps)
Size: Discrete 1280x720
Interval: Discrete 0.017s (60.000 fps)


gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM),width=1280, height=720, framerate=30/1, format=NV12' ! nvvidconv ! xvimagesink -e

USB Camera基本上只要有UVC支援都能用,選擇非常多

測試驅動

gst-launch-1.0 v4l2src device=/dev/video0 ! image/jpeg,width=1280,height=720,framerate=30/1 ! jpegparse ! jpegdec ! xvimagesink sync=false

IMX219 Camera 顏色校正

https://devtalk.nvidia.com/default/topic/1051913/how-to-close-gstreamer-pipeline-in-python/?offset=14

sudo cp camera_overrides.isp /var/nvidia/nvcam/settings
sudo chmod 664 /var/nvidia/nvcam/settings/camera_overrides.isp
sudo chown root:root /var/nvidia/nvcam/settings/camera_overrides.isp

在coding過程中,若Camera使用中程式不正常中止或Camera buffer overflow需要重啟Camera Daemon才能再次正常工作

sudo systemctl restart nvargus-daemon

2019年5月23日 星期四

Jetson Nano USB OTG

Jetson Nano 在RJ-45 port旁邊有個micro USB插座, 找一條USB線連接PC就能夠從PC上經由USB Ethernet登入到Jetson Nano, 非常之方便

Jetson Nano的IP address固定是192.168.55.1

從PC SSH登入
$ ssh <username>@192.168.55.1


另外,以此方式執行遠端Jetson Nano上的程式,若有輸出圖形視窗會得到錯誤訊息並跳出程式

gigijoe@gigijoe-desktop:~/object-tracking/build$ ./object-tracking-cuda 0
Wait for camera stable ... Ok

(object-tracking-cuda:9198): Gtk-WARNING **: 18:09:00.626: cannot open display:

修改PC端 /etc/ssh/sshd_config
-#    X11Forwarding no
+    X11Forwarding yes

再重新登入執行程式,圖形視窗會出現在PC端,很神奇吧





2019年5月21日 星期二

Jetson Nano initial setup

入手Nvidia Jetson Nano先做個簡單的初始設定紀錄



官網的簡介
https://devblogs.nvidia.com/jetson-nano-ai-computing/

1.依據官網上的步驟把系統映像檔寫到MMC card (32GB up)
https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit

Reference
https://www.pyimagesearch.com/2016/07/11/compiling-opencv-with-cuda-support/

2.短路J48使用5V / 4A的power adapter供電

3.上電開機後經過一連串設定及 user name / password 進入Ubuntu Desktop

4.系統上有4GB DDR memory在之後compile OpenCV會不夠用,先開個4GB swap

$ sudo fallocate -l 4.0G /swapfile
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile

$ sudo vi /etc/fstab

/swapfile none swap defaults 0 0
5.安裝必要開發套件

$ sudo apt-get update
$ sudo apt-get install cmake git
$ sudo apt-get install python-pip
$ sudo apt-get install python3-pip python3-pil

$ sudo apt-get install gstreamer1.0-tools gstreamer1.0-alsa \ 
gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly \
gstreamer1.0-libav

$ sudo apt-get install libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev \
libgstreamer-plugins-good1.0-dev \
libgstreamer-plugins-bad1.0-dev \
libgstrtspserver-1.0-dev

$ sudo apt-get install libgtk2.0-dev

$ sudo apt-get install cmake

6.分別下載 opencv 及 opencv_contrib
https://github.com/opencv/opencv/archive/4.4.0.zip
https://github.com/opencv/opencv_contrib/archive/4.4.0.zip
解壓縮後放在同一個目錄下

cd opencv-4.4.0
mkdir build
cd build

cmake -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.4.0/modules -DWITH_CUDA=ON -DCUDA_FAST_MATH=1 -DBUILD_EXAMPLES=OFF -DWITH_GSTREAMER=ON -DWITH_V4L=ON -DWITH_LIBV4L=OFF -D BUILD_opencv_python2=ON -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_opencv_python3=ON -DPYTHON3_INCLUDE_DIR2=/usr/include/python3.6m -DPYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_EXAMPLES=OFF -D CMAKE_INSTALL_PREFIX=/usr/local -DENABLE_CXX11=ON -D CMAKE_C_COMPILER=/usr/bin/gcc-7 ..

$ make -j $(($(nproc) + 1))
等待約三個小時...

$ sudo make install

7.安裝Jetson Stats, 這樣就能即時monitor CPU / GPU / Memory 狀態

$ sudo -H pip3 install jetson-stats

$jtop







2018年11月9日 星期五

BMW M62引擎水溫漫談

BMW M62 V8引擎水溫一直是令人擔心的問題, 原廠設計為了燃燒效率及排放環保的因素將正常的水溫設定在攝氏105度, 因此只要散熱系統中有某項零件發生問題水溫很快就會失控.

@ 首先介紹一下幾個與水溫相關重要的零件
1.冷卻水: 由水及水箱精組成, 用來帶走引擎產生的廢熱
2.水箱: 將冷卻水中的廢熱釋放至大氣中
3.水泵浦: 帶動冷卻水在引擎及水箱之間循環
4.水龜: 控制從引擎出來的冷卻水是否流向水箱, 保持冷卻水溫度不至於過低.
5.水箱風扇: 鼓動空氣流過水箱散熱鰭片帶走冷卻水的廢熱
6.風扇離合器: 以熱耦合方式連接引擎轉軸及水箱風扇, 常溫時風扇轉速慢風量小, 風扇離合器本體溫度超過攝氏98度則完全接合引擎轉軸及水箱風扇風量大.
7.水箱蓋: 負責在冷卻水壓力超過200psi(約13個大氣壓力)釋放部份冷卻水減少壓力.

意示圖如下
http://up.autotitre.com/66e018058e.png

@ 冷卻水原理與工作狀況
1.水的沸點在一個大氣壓時是攝氏100度, 壓力越高沸點越高, 引擎的冷卻循環系統是封閉系統當溫度上升時壓力也跟著上升. 200psi時水的沸點約攝氏192度.
2.水箱精主要成份是乙二醇, 其沸點在一個大氣壓時是攝氏196度, 主要功能用於與水混合提高沸點及防鏽.
3.水的沸點在壓力下已經遠超過105度, 為什麼還需要加水箱精? 在引擎內部冷卻水與引擎的接觸面溫度遠超過攝氏105度, 在這個位置會產生許多氣泡, 尤其是細小的雜質多時, 如同用火煮水在水壺底部會看到許多氣泡. 這些氣泡的熱傳導效果遠比水差, 會造成引擎的廢熱在特定的小範圍過度累積. 因此還是需要水箱精防止氣泡的產生.
4. 水箱精防鏽的功能也極為重要, 防止零件生鏽腐蝕, 例如水泵浦輪葉就是鐵製品, 還有汽缸床墊片等.
5. 水箱精的熱傳導速率比水差, 因此過多的水箱精並不利於散熱.

由以上可知, 正確的水箱精與水比例混合極為重要, 也有必要一段時間更換冷卻水, 避免雜質的累積(例如自來水中的礦物質結晶及鐵鏽)減少氣泡產生的機會以及防止阻塞水箱鰭片間細小水道的狀況發生.

@水箱工原理與工作狀況
1.水箱外部有許多鰭片用以增加面積達到快速散熱的效果, 鰭片很脆弱所以要注意不要受到外力撞擊, 也不要有異物阻擋(如樹葉紙片等),會減少散熱速度.
2.水箱是消耗品, 用久了內部表面會沈積雜質, 甚至會造成其中的小水道阻塞, 散熱效率會降低.
3.可在更換冷卻水的同時清洗水箱, 更徹底去除雜質.

@水泵浦原理與工作狀況
1.水泵浦由皮帶驅動內部水輪葉, M62 V8水泵浦並不耐用, 通常軸承會先損壞造成漏水, 並且軸心偏移使得水輪葉摩擦到引擎本體.
2.正確使用水箱精防鏽, 避免水輪葉腐蝕鏽光,造成冷卻水循環不良無法散熱.

@水龜原理與工作狀況
1. M62 V8的水龜是電子水龜, 其實就是傳統的熱臘式水龜加上一組加熱器, DME電腦控制加熱器使得水龜在水溫低於攝氏105度就開啟, 例如在DME偵測到大腳油門引擎負載增加時提前降低水溫以應付突然增加的廢熱.
2.加熱器通電也需要一小段時間水龜才會真正開啟.
3.引擎故障碼map cooling就表示水龜的加熱器已經斷路故障, 但即便如此水龜還是會在攝氏105度開啟,只是引擎重負載時水溫會下降得比較慢或著高溫會達到110度以上才下降.
4.水龜通常很耐用,最糟的狀況是卡阻無法開啟或熱臘老化開啟溫度提高.



@風扇離合器原理與工作狀況
1.風扇離合器內部使用矽油作為耦合界面, 本體接在水泵浦輸入軸上, 溫度高於攝氏98度以上才會完全接合, 此設計使得風扇風量得以隨水溫及負載變化.
2.M62 V8風扇離合器與M52外觀形式相同但耦合係數並不相同.
3.水溫高時踩油門應該能聽見明顯的風扇運轉聲, 表示風扇離合器有正確接合.
4.風扇離合器老化矽油洩漏會造成風扇離合器無法鎖定, 產生的風量不足, 怠速水溫過高.



@水箱蓋原理與工作狀況
1.水箱蓋會釋放過高的壓力. 水箱水加超過副水箱指示的最高水位, 甚至是加滿會使得冷卻水在溫度上升時體積膨脹壓力超過200psi, 水箱蓋就會釋放部份冷卻水直到壓力下降至設定值.
2.水箱蓋老化會造成冷卻水異常減少.



@水溫設定
1.M62 V8水溫設定在攝氏105度, 我個人目前改裝設定在92~95度之間. 改裝方式前篇有敘述.
2.工作水溫比原廠設定低是希望能降低引擎內部蓄積的廢熱, 畢竟台灣的氣候高溫溼熱不比歐陸乾燥涼爽, 期待能有效延長內部橡膠類耗材壽命, 另外引擎內部水道表層長年下來蓄積了許多沈積物, 降低水溫也能補償熱傳導效率下降的問題.
3.駕駛行為也會影響水溫,長時間高負載水溫自然處在高檔,當車輛減速時適時降檔提高引擎轉速能使得風扇產生更多風量加快散熱


@定期保養檢查
1.每一到兩年更換冷卻水並清潔水箱
2.定期巡視冷卻水水位, 若有減少的狀況應特別注意並找出洩漏點
3.副水桶水位加到指示浮標的高水位即可,多加了只會造成冷卻系統壓力過高然後由水箱蓋洩出.
4.換水後應打開副水箱旁的洩氣螺絲將管路內的空氣排放乾淨.
5.水泵浦應定時檢查, 尤其水泵浦軸心是否搖晃, 葉片是否鏽蝕
6.M62 V8冷卻系統水管是塑膠接頭快拆式設計,經過多次拆裝會有毀損的狀況,應更換新品.
7.除水溫外還可以電腦讀取水箱出水口溫度觀察系統散熱的情況.
8.M62 V8正常水溫範圍從85~110度間都算正常範圍. 長期觀察水溫變化就能察覺系統是否有異常.





2018年5月15日 星期二

STM32F10x code size optimization




I have been using ARM embedded gcc with STM32F103 for a long time. recentlly, I found the binary size is much smaller compiled by Keil than gcc. It's huge different, lets say 10k bytes with Keil and 40k bytes with gcc. After some research there's solution.

1. Optimization level to code size

CFLAGS += -Os

2.Remove debug

#CFLAGS += -g

3.Add garbage collection flag

CFLAGS += -Wl,--gc-sections 

4. Using nano-newlib instead of newlib

CFLAGS += --specs=nano.specs

5.Other flags

CFLAGS += -fno-common -mfloat-abi=soft -fsingle-precision-constant -fomit-frame-pointer -ffunction-sections -fdata-sections

6.Below are the results, the red text is code size in bytes

CFLAGS += -Os

arm-none-eabi-size main.elf
   text    data     bss     dec     hex filename
  99652    2332    4560 106544   1a030 main.elf

CFLAGS += -Os
CFLAGS += -Wl,--gc-sections

arm-none-eabi-size main.elf
   text    data     bss     dec     hex filename
  88712    2260    3748   94720   17200 main.elf

CFLAGS += -Os
CFLAGS += -Wl,--gc-sections
CFLAGS += --specs=nano.specs

arm-none-eabi-size main.elf
   text    data     bss     dec     hex filename
  31716    1156    1620   34492    86bc main.elf

CFLAGS += -Os
CFLAGS += -Wl,--gc-sections
CFLAGS += --specs=nano.specs
CFLAGS += -fno-common -mfloat-abi=soft -fsingle-precision-constant -fomit-frame-pointer -ffunction-sections -fdata-sections

arm-none-eabi-size main.elf
   text    data     bss     dec     hex filename
  22572    1136    1612   25320    62e8 main.elf





2018年4月26日 星期四

BMW E38 Enhanced IKE


Enhanced IKE - DME/EGS data stream displayed in the instrument cluster





Supports

DME : Bosch Motronic v7.2 (M62TU) 
EGS : Automatic Transmission ZF5HP24 v8.60.2 (E38/E39/E53)

Functions

@ Display the following information

1.Coolant temperature.
2.Coolant outlet temperature.
3.Transmission temperature.
4.Intake air temperature.
5.Intake air mass flow.
6.Battery voltage.
7.Engine RPM.
8.Engine load.
9.Fuel trim additive.
10.Fuel trum multiplicative.

@ Display switch by steering wheel buttons NEXT / PREV or RT_TELEPHONE.

@ Data request interval 2 secs.

@ Automatic external scanner collision detection.

Principle

Basiclly, the project is a small OBDII scanner that requesting information from DME and EGS.
It reads data from D-Bus then write display string to I-Bus. There are 4 wires needed to connect to wire harness of IKE (12V / GND / D-BUS / I-BUS)

Hardware/Software

Base on STM32F103C8T6 (20k RAM / 64k FLASH)

Enhanced IKE released as free, open source hardware/software, licensed under the GNU General Public License (GPL)

https://github.com/gigijoe/E-IKE

All bugs are made by my self @@

Installation

Before doing anything, make sure the ACC key off and know what you are doing...



There are 4 pins need to branch out - D-Bus / I-Bus / 12V / GND

Find connector X10113 on the back of Instrument Cluster. Mark the following wires.
D-Bus : Pin 1 (White / Purple)


 GND : Pin 9 / 10 (Brown / Green)


I-Bus : Pin 8 (White / Gray / Yellow)


12V : Pin 12 (Purple / Green)


Soldering 4 wires of MPX connector to the X10113 wire harness

PIN          X10113                                      MPX 

D-Bus      Pin 1 (White / Purple)                D-Bus (Brown)
I-Bus       Pin 8 (White / Gray / Yellow)     I-Bus (White)
12V         Pin 12 (Purple / Green)               12V (Red)
GND       Pin 9 / 10 (Brown / Green)         GND (Black)



The E-IKE box is located in the space below to instrument cluster as shown. Then plug in the MPX connector.

Modification of under hood 20 pins connector cap. The cap is needed in order to make connection between TXD and TXDII of D-Bus


Remove the PCB from the cap.
Wired two pins and cut two wires as below then put it back to the cap.

Operation

ACC Key on, press steering wheel button NEXT / PREV / RT_TELEPHONE to switch between items.