2018年1月13日 星期六

用Atmega 328p 自組Arduino上傳草稿碼時, 如何自動Reset?


Arduino開發板玩了一陣子之後, 會想要自己組一個開發板。
參考做法: https://www.arduino.cc/en/Main/Standalone

這樣的好處是:
1. 省錢
  開發板比較貴, ATMega328P晶片比較便宜
2. 省電
  要做低粍電專案, 開發板粍電量太高
3. 好玩

但是寫完草稿碼後, 要上傳時; 以前看葉大的書, 叫我們自己找正確的時點去Reset晶片。
手動Reset的日子, 我也過了不少, 但有時太常改程式, 又不太抓得到時點, 會一直上傳失敗。

所以就想人家開發板為什麼不用手動Reset, 可以自動Reset?
發現其實只是將Serial-to-USB的RTS接腳, 接一個100nF的電容, 再接到328p晶片的Reset腳位就好。


參考來源: 電路圖

直接用來看看, 是真的可以運作的! 只是加個電容就好了, 真是神奇!
可是我用來有時也會失敗!
又Google了一下, 發現別人也有類似情形, 有人就加上拉電阻及下接電阻。
我後來查了一下Arduino官方電路圖:
https://www.arduino.cc/en/uploads/Main/Arduino_Nano-Rev3.2-SCH.pdf

也是一樣做法!

就不管了, 那就這樣接吧, 後來把breadboard的元件用洞洞板焊接後, 發現上傳的成功率居然變得很高! 所以我的想法是: breakboard可能有些接觸不良的情形, 用焊接的就消除這個問題, 只是我的Serial-to-USB板子接到洞洞板做的成品時, 仍是用插接的, 加上電容也是臨時用杜邦線接的, 也會有接觸不良問題, 才造成部份的失敗率!


2018年1月9日 星期二

MacOs High Sierra CH340

今天我的Mac當機好幾次了!
原本好好的程式,今天一直出問題,移到Windows用,又好好的沒事。
才想到是不是Mac出問題,問了google
原本真的是Mac有問題!

http://www.stm32duino.com/viewtopic.php?t=1684

後來發現不全然是Mac的問題, 主要還是我接的Arduino板子, 其實還有其他外加元件和電路; 而這些電路本身的設計有些問題。主要的問題是電流或電壓在某些狀況下不太正常。會造成Arduion板子自己reset或行為異常, 這個現象在Mac上的結果會是當機重開! 有趣的是在Windows 10上卻不會有問題出現。

修改電路接法, 再重試後, 就不會當機了。


2017年12月13日 星期三

什麼patch?要怎麼用?

今天收到一個*.patch的檔案, 因為之前廠商有一個範例程式有些問題。
他們做了一些修正。

我本以為他們會把整包改好的程式丟過來, 沒想到是用patch!

如果是Linux/Unix的環境, 本來就是常用patch來做程式的異動,
但他們的環境一直都是在Windows上面的。

這下子真不知如何做了, 找了一下, 發現:

https://stackoverflow.com/questions/517257/how-do-i-apply-a-diff-patch-on-windows

有人介紹在Windows可以用Python工具來做:
pip install patch
python -m patch
於是照做:
先把*.patch檔copy到原先的程式, projects目錄的上一層.
因為我在.patch檔看到如下的內容:

diff --git a/projects/target_apps/ble_examples/ble_app_barebone/src/user_barebone.c

想來是用相對目錄, 就如此做了, 也不知有沒有必要如此?

然後下如下指令:

G:\DA14585_SDK\6.0.4.326>python -m patch 20171120_0_ancs.patch

沒有出現任何成功或失敗的訊息!
用人工去檢查, 結果是成功的做好了!


2017年12月2日 星期六

Myth about ADXL345 breakout


  This is my experience about buying AD's ADXL345 accelerometer breakout board.

  There are so many breakout boards of ADXL345 sold in the market (or shopping store). Some are very cheap and some are very expensive. Price ranges from NT$ 65 to NT$799. Which one should you buy? What's the difference between the cheap one and expensive one?


  I choose to take adventure and buy the cheaper breakout, one for NT$ 65 and one for NT$ 85. And the result, the NT$ 65 one can't work! But the NT$ 85 one work perfectly.


  As the picture shows, this ADXL345 breakout board work! The acceleration reading values can be read out. At first I use ST's Nucleo-F401RE development board to connect this NT$ 85 ADXL345 breakout board via SPI interface. And in the MBED online compile web site, I import the ADXL345_HelloWorld sample program to read out acceleration readings.

  The first time I run that program, nothing can be readout. Strange! Check the schematic (show below), I found SDO (pin 12) was connect to ground.
85元便宜ADXL345板子電路圖

  So this is the problem come from. Don't hesitate, use your torch to remove resistor R4. And try again. This time the readings was correct. But in the internet, I found some blog say that NT$ 85 breakout can't work with SPI. He say this kind of cheap breakout just work with I2C. I was confused! Because the same breakout is working fine via SPI in front of me.

  Recently I have opportunity to experiment this cheap ADXL345 breakout with Arduino Uno board. Because Arduino Uno board is 5 voltage system, and ARM Cortex is 3.3 voltage system. It worth to give it a try. But first, I check Sparkfun's web site about their ADXL345 breakout board. They have demonstrate how to connect Arduino Uno board with their breakout via both SPI and I2C.
Sparkfun's ADXL345 breakout

So, what's the difference between Sparkfun's breakout and the cheap one?
The NT$ 85 cheap breakout

Just using our eye, we see that the number of components in the cheap breakout are much more that the Sparkfun's breakout.
SparkFun ADXL345板子的電路圖

Yes, there are just 3 capacitors in addition to the ADXL345 chip at the Sparkfun's breakout. Nothing special. No reason it can work with SPI, but the cheap one can't.
Let's make experiment to see result.

I2C界面接法
wiring via I2C

Wiring via I2C work fine. The wiring char and sample code is here: https://github.com/poushen/adxl345_i2c

SPI界面接法
wiring via SPI

Wiring via SPI:
1. Connect Arduino Uno board's SPI pins directly with the cheap breakout's SPI pins don't work. Check Sparkfun's web site, I find they use voltage level translator.
2. Using TI's TXB0104 to do the work of voltage level translator, the readings is not correct. Check the TXB0104's document, see it's sensitive to pull-up resistor. And the cheap breakout do have 10K pull-up resistor at SDA, SCL, CS pins.
3. Using bidirectional logic level converter (BD-LLC), it work perfectly! The wiring char and sample code is here: https://github.com/poushen/adxl345_spi
BD-LLC document is here: https://learn.sparkfun.com/tutorials/bi-directional-logic-level-converter-hookup-guide

In conclusion, the cheap ADXL345 breakout can connect via SPI.

  The cheap breakout was designed for I2C wiring, so it give us pull-up and pull-down resistor out of box. But it work with SPI too. Just remove R4 pull-down resistor and using BD-LLC, we can make it work with SPI. Oops, you want to use TI's TXB0104. Ok, I think it would be also work. But you must remove more resistor. See https://learn.sparkfun.com/tutorials/txb0104-level-shifter-hookup-guide

Adafruit的板子

  Now let's look at Adafruit's ADXL345 breakout board. In addition to voltage regulator and pull-up pull-down resistor, it also have voltage level shifter build in. With some other circuit design, it let you   easier to connect with Arduino Uno via SPI or I2C. Adafruit indeed is more intimate. So, which breakout board will you choose? Cheap one or expensive one?

Whatever you choose (or buy), don't forget that Spartfun and Adafruit had ADXL345 sample code and library for you (it's free too). Of course, you can write the code by yourself. Just like those I put in GitHub. Also, don't forget Analog Devices ADXL345 official web site. There are so many documents. http://www.analog.com/en/products/mems/accelerometers/adxl345.html

2017年11月22日 星期三

升級到MacOS High Sierra? ftp會不見哦!

今天忍不住了,還是升級到MacOS High Sierra
果然沒事找事,一升級就會出問題!

居然終端機裡的ftp不見了,當下心想,又是Apple自己改的!
找了一下,果然如此:

https://discussions.apple.com/thread/8093031?start=0&tstart=0

那怎麼辦呢?
上面討論串的最後,有朋友提了一個方法,就是安裝LFTP來頂著用:
$ brew install inetutils

will install inetutils from GNU that includes /usr/local/bin/ftp

$ which ftp
/usr/local/bin/ftp
$ ftp --version
ftp (GNU inetutils) 1.9.4
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by many authors.
要先安裝brew:
https://brew.sh/

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

順利裝好。

然後下 $ brew install inetutils
結果:
Error: Your Xcode (8.2) is too outdated.
Please update to Xcode 9.1 (or delete it).

Xcode can be updated from the App Store.

原因是之前為了玩深度學習Tensorflow的nVidia GPU計算功能,把xcode command line工具的路徑固定到8.2版去了,那現在只好改回來:

$ sudo xcode-select --switch /Applications/Xcode.app

再重下之前指令,就好了:
$ brew install inetutils
==> Installing dependencies for inetutils: libidn
==> Installing inetutils dependency: libidn
==> Downloading https://homebrew.bintray.com/bottles/libidn-1.33.high_sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring libidn-1.33.high_sierra.bottle.tar.gz
==> Caveats
Emacs Lisp files have been installed to:
  /usr/local/share/emacs/site-lisp/libidn
==> Summary
🍺  /usr/local/Cellar/libidn/1.33: 72 files, 1.3MB
==> Installing inetutils
==> Downloading https://homebrew.bintray.com/bottles/inetutils-1.9.4.high_sierra.bottle.1.tar.gz
######################################################################## 100.0%
==> Pouring inetutils-1.9.4.high_sierra.bottle.1.tar.gz

🍺  /usr/local/Cellar/inetutils/1.9.4: 107 files, 2.6MB


2017年9月18日 星期一

關於ADXL345兩三事

  之前想找顆G-Sensor玩, 不知怎麼地就找到ADXL345,也許看到網路上很多人在玩ADXL345吧!不過,這顆的封裝對手藝不好的人來說,要自己焊接腳位出來有點困難!還是去找找breakout, 沒錯吧!果然很多廠商都有在賣做好的breakout, 省了我們很多時間!

  接下來是現實考量,價錢如何?以這個網站來說,買一顆晶片要價台幣80塊錢。我想那breakout不就更貴了嗎?其實不然,只看單純只有分接ADXL345晶片的板子,最便宜的只要台幣65塊,再貴一點的,也只要台幣85塊。當然,貴的也有,那些國外名廠DFROBOT 500塊,Adafruit 750塊,SparkFun 799元。那到底要選那個呢?


  我沒什麼錢,所以選了便宜的,可是又怕有問題,就買了65塊和85塊的各一個。果然,一分錢一分貨!那個65元的,我怎麼試,到現在還是不能用!至於,85塊的,還不錯用哦!



  看圖,可以正常的讀取加速度值。ADXL345可以使用I2C或者SPI界面來與MCU溝通,我先用STM32F401這張意法半導體做的ARM Cortex M4的板子來連接,在MBED的平台上,已經有一個很完整的ADXL345_HelloWorld範例程式(使用SPI界面),可以直接由online compiler滙入,或者到此網址:
  ADXL345-Accelerometer/

但是這張板子剛開始接上時,也不會動,這很奇特,沒辦法,便宜的板子,說明文件就是比較差了一些! 如果買那些貴的板子,特別是SparkFun的,可以看到他們的網站有很詳細的文件,如何接線,如何寫程式,全都清清楚楚。不過,這樣好像也少了一些樂趣!
  還好這板子也附上了電路圖:
85元便宜ADXL345板子電路圖
唉,仔細看了一下,SDO(pin 12)居然已經接地了,難怪訊號都不對了,還好只要把下拉電阻R4移除就可以解決了。心一橫,拿起焊槍,給他燙下去,再試一下,果然就ok了!
這個時候,在網路上找資料時,看到有人提到說: 這種便宜的板子只能接I2C,不像SparkFun的板子可以接SPI又可以接I2C。我有點被困惑了?明明我現在就在用SPI和這張板子連呀,怎麼會說不行呢?

  最近得空,想想人家也許是用Arduino的板子,而不是用ARM Cortex系列的板子,因為Arduino Uno系列的板子是5V, 而ADXL345是3V的,也許有一些差異吧!先去SparkFun查了一下,他們的文件裡把I2C和SPI兩個界面的接法都示範了,也就是說,ADXL345和Arduino Uno板子要用I2C或SPI來接都是可以的。當然了,他們是用SparkFun自己出的breakout。

Sparkfun's ADXL345 breakout
這張Sparkfun的breakout和85元的又有何不同呢?
The NT$ 85 cheap breakout
光看圖片,就知道SparkFun的元件比較少,便宜板子的元件反而比較多!看看SparkFun板子的電路圖吧!
SparkFun ADXL345板子的電路圖
是吧!除了ADXL345晶片外,就只有三顆電容,沒什麼特別的!為什麼它就可以接SPI界面,85元的就不行呢?來做個實驗試試看吧!

先用I2C界面接法試試:
我把程式和接線圖放在: https://github.com/poushen/adxl345_i2c
好的,I2C沒問題!

I2C界面接法
wiring via I2C


接下來用SPI接法試試:
1. 直接Arduino的MISO, MOSI, CLK, CS和85元ADXL345板子的SDO, SDA, SCL, CS對接,果然無法正常讀到資料。看了一下SparkFun網站的文件,發現他們使用了voltage level translator.
2. 加入TI TXB0104(voltage level translator)試試,讀出來的資料不正常,用邏輯分析儀看訊號,發現Clock, SDO部份訊號有時不正常。查了TXB0104的文件,發現它對上拉電阻很敏感,看一下電路圖,便宜板子預先在SDA, SCL, CS三個腳位都有10K的上拉電阻!
3. 手上正好有bidirectional logic level converter (BD-LLC), 就先試試,因為看到的文件中有提到這系列的好像比較不怕上拉電阻。果然,這一換上去,就可以正常讀到資料了。
我把程式和接線圖放在:https://github.com/poushen/adxl345_spi
BD-LLC文件可參考:https://learn.sparkfun.com/tutorials/bi-directional-logic-level-converter-hookup-guide

SPI界面接法
wiring via SPI

結論:沒有所謂便宜的板子不能接SPI這回事!.

  便宜板子只是設想我們會用I2C來接,所以貼心的先備好上拉和下拉電阻。 但是如果你想用SPI來接也是可以的,只要移除R4下拉電阻,再用BD-LLC就可以了。想用TI TXB0104, 我想也是沒問題的,只是要多移除幾個上拉電阻吧!可見:https://learn.sparkfun.com/tutorials/txb0104-level-shifter-hookup-guide

  這樣,再回頭來看,那個Adafruit 新台幣750元的breakout就又更貼心了一些,
Adafruit的板子
除了和85元便宜板子一樣有的整流器, 上拉下拉電阻外,還加上了voltage level shifter,讓你可以更輕易的使用I2C和SPI。
那你會選那一個呢?

不管選那個,記得Sparkfun, Adafruit都已經幫你寫好程式了,有需要不用客氣,都可以免費取得的。當然,要自己寫來玩也不錯,可以參考我放在GitHub的程式。
還有ADXL345原廠的網站也有不少資料可參考:http://www.analog.com/en/products/mems/accelerometers/adxl345.html



2017年7月3日 星期一

加大VirtualBox的虛硬擬碟 + Gparted Live CD

前幾天用VirtualBox裝了一台Ubuntu虛擬機來做實驗,
安裝的時候也不知要用多大硬碟空間, 就隨便給了10G的大小。
也沒選擇LVM, 後來發現其中4G被分給Page使用,
實際上, 可用的只有6G, 很快就不够了。

當然可以重裝啦! 但如果可以把虛硬擬碟加大, 那就更好啦!

VirtualBox可以這樣做:
https://forums.virtualbox.org/viewtopic.php?f=35&t=50661

1. 用VBoxManager modifyhd --resize
註: VBoxManager執行檔可能要自己找一下目錄位置

2. download Gparted live CD的ISO檔, (http://gparted.sourceforge.net/download.php/)
掛到虛擬機的CD去, 重開機
會看到這個可愛的工具,
然後就可以用滑鼠去把磁區拉大就好了,
嘔! 可能要先把其他磁區移到後面位置,
不過, 這就是小事啦!

我試用後, 成功的把虛硬擬碟空間加大了!
真是好用的工具!