2014年3月14日 星期五

Beaglebone black with Arduino microphone module


使用平台Beaglebone Black
元件Arduino 高感度聲音傳感器



最近因為實驗室需要聲音的應用,加上Beaglebone Black上有ADC,所以就想來研究一下AM335X上的ADC,讀完manual之後,才知道原來這個AM335XADC原本是設計給觸控螢幕用的,不過manual上的介紹寫得滿清楚的,雖然我還不是很明白step為什麼需要16個就是,可能也是因為我的應用比較單純吧,一個channel只要配一個step就夠了,看來有空要來存點錢買塊小觸控螢幕了!


因為之前有研究BBBIO的經驗,因此ADC方面也是依靠mmap的方式來操作,就花了幾天寫了一個簡單的ADC library,加到BBBIO之中,但是我沒辦法在User-space之中打中斷,所以只能用Busy-polling的方式去掃ADCFIFO,算是一個比較失敗的地方吧,不過如果做為基本應用的話,我覺得目前的實做已經足夠了。


我用的聲音模組是Arduino的高感度聲音模組,如下圖1,應該算是非常好入手的元件,有Analogy的輸出跟Digital的輸出,因為是用ADC,所以就接Analogy的腳位。



1. Arduino 高感度麥克風

詳細的腳位如圖2,使用時需要注意增益的輸出,建議先接到示波器上,把增益調到1.8V內,不然Beaglebone blackADC可能會直接被打穿燒掉



2. Circuit Layout


接著因為我不喜歡在Beaglebone black上接HDMI線,那個腳位設計常跟USB互卡還挺麻煩的,因此我用socket,把ADC讀進來的資料傳到電腦上顯示,順道寫了一個專用的簡易示波器,詳細的Demo與截圖如下,Demo中播放了1KHz和3KHz的出來,可以看到其波形的改變。



3. UI




接下來只要用fftw之類的library進行複利葉轉換的分析,就可以做一些特別的應用了,而Beaglebone black的ADC最快可以到1.6MHz,只要調ADC的參數即可,我同時也在BBBIO的toolkit中寫了一個Toolkit_GPIO_CLK_Status來計算參數,如果不想算的朋友,也許可以參考一下!





33 則留言:

  1. 您好
    我是最近也在研究BBB的學生
    想請教您一些問題
    這是我的frankho8@hotmail.com
    因為我不知道用甚麼方式聯絡您
    拜託拜託了><

    回覆刪除
    回覆
    1. HI !
      您好,這是我的email : r7418529@gmail.com

      請問是什麼問題呢,如果我懂,我會盡量回答

      PS : 你好像也有用 Hangouts連絡我 ??

      刪除
  2. 版主您好,
    我最近在研究beaglebone的ADC,我希望的採樣率是4800S/s,
    我使用網路上open file的方式對/sys/bus/iio/devices/iio:device/in_voltage*_raw進行讀取,但會有兩個問題:
    第一個是file的更新速度跟不上我的讀取速度(意即read後會有多筆重複的value,4800S下的time interval應該是200us左右)
    第二個是會有許多雜訊出現,因為我的range設定在0~1V,但卻會跳出許多1.785 1.685 1.799 如此超出邊界的value,

    不過我找到了版主您的BBBiolib, 但我是CS領域的新手... 故想在這邊詢問您的經驗,
    我看到版主是對44.1kHz進行採樣,不知道您有沒有遇過雜訊的問題(非電路本身產生)?
    另外使用BBBiolib的話有沒有最大的read同步速率限制?
    另外我有透過github下載您的code, 並且已經make install, 產生了一個.a檔案, 我應該怎麼做才能在我的code裡面使用function去read ADC呢?

    抱歉問題可能有點多, 但希望版主能夠不吝指導, 謝謝!

    回覆刪除
    回覆
    1. 訊問題:
      beaglebone black的ADC可以處理0~1.8V,因此你能取到1.6 1.7應該是很正常的,
      而你設定的range,是設到ADCRANGE這個register嗎? 這個register的意思是有數值超過這個range,他會打一個Out_of_Range的中斷出去,
      而取到的資料會不會進FIFO,這可能要去查看看reference manual才知道。



      速度問題:
      我不知道/sys/bus/iio/devices/iio:device/in_voltage*_raw的速度瓶頸在哪裡,
      我猜也許是因為他使用one-shot的取樣方式,而不是採用continuous的取樣方式,這種採樣方式是你操作一次ADC,就只採樣一次。

      我是使用memory map和continus的方式來進行ADC FIFO的存取,理論上應該可以達到ADC的全速1.6MHz (24MHZ/15),但是實際上我並沒有試過全速,
      不過目前使用過最大是16KHZ,量測時間基本上是正確的(1.00xx s) ,量測的數值是一個訊號產生器產出來的正弦波,
      我只用畫圖的方式將弦波畫出來,目測感覺是沒問題,不過這應該不算是個驗證方法吧XD

      因為BBBio library沒有辦法處理中斷,所以變成我需要busy polling或試用timer每隔一段時間去取,
      所以我沒辦法知道FIFO有沒有overflow,所以他會不會因為interrupt或者schedule來影響到一些取樣,我沒辦法非常肯定的說不會,我只能讓polling的時間快一點,來避免這種情況。


      BBBIO :
      ADC得部份,您可以到Demo的資料夾內看看,Demo/Demo_ADC/ADC_voice.c 這個檔案提供了一個初步的使用方法,

      1. 指定ADC的速率,你可以make ADC_CALC 這個toolkit來知道要設定哪些數值,使用方法註解在ADC_voice.c內,
      執行這個toolkit你會得到4個數值,Clock Divider、Open Dly、Sample Dly 、Sample Average,這些數值該如何設定,ADC_voice.c有說明。

      2. 指定ADC的buffer,你需要給BBBIO一個buffer,讓他可以把資料存到buffer內,把你的buffer和buffer_size設到BBBIO_ADCTSC_channel_ctrl內,buffer是int type

      3. 指定你要用哪一個AIN來存取,BBB有AIN0~7

      4. 當你要開始sample時,請先把你要用的AIN enable,假設你要用AIN0,請使用以下指令,沒有要用AIN不要enable,會讓ADC sample變慢。
      BBBIO_ADCTSC_channel_enable(BBBIO_ADC_AIN0);

      5. 開始讓ADC work,使用以下指令,然後把Size指定為你想要sample的數量,這個數值不能高於buffer的size,同時這是一個blocking的function,在沒有取到這個數量時,他不會return
      BBBIO_ADCTSC_work( SIZE yow want fetch );

      以上是一個大概的使用流程,請注意這個function,我當初設計的時候沒有考慮到multi thread的情況,
      因此,在multi thread情況下,同一時間,只能有一個thread使用這個ADC function,否則會發生....很奇怪的現象,
      這是我當初設計不周,我還在思考要怎的改會好點。

      希望這些有回答到你的問題。

      刪除
    2. 作者已經移除這則留言。

      刪除
    3. 您好, 上一則留言打得不夠完整, 所以刪除之,
      訊問題:
      這部分我沒有動ADCRANGE等參數,只是純粹用訊號產生器把output訊號定在0V~1V,不過會有超出1V的read值出現,但卻和下面網站的測試結果一樣有雜訊出現:
      http://www.thebrokendesk.com/post/reading-analog-values-and-efficacy-of-the-beaglebone-blacks-adc/
      故若版主沒有遇到此問題的話,我想說是否您有用濾波器等濾除雜訊.

      速度問題:
      這部分的話我之後會使用版主的BBBiolib去跑跑看測資,看出來的結果是否相符合,感謝.

      BBBIO :
      好的,我會再去了解, 我目前是在 beaglebone white 上做測試, 不知在記憶體位址上和BBB有沒有差別? 會不會有read不到的情況發生.

      再次謝謝.

      刪除
    4. 我沒有使用濾波器,我沒有碰到類似那個網頁一樣的情況。

      我的測試環境是使用一個發聲源發出N個聲音,然後使用44K hz的sample rate進行聲音訊號的截取,然後再透過FFT轉換頻率出來看

      是可以正常的解出發出的頻率,而波形上雖然也會有環境雜訊,但是都是非常細微的雜訊,並沒有像那個網頁一樣這麼誇張。

      我這幾天在去找看看能不能借到訊號產生器,在實驗實驗好了



      我手上沒有Beaglebone white ...不是很肯定能不能直接用,不過我是參考AM335X Technical reference manual來寫這個library的,

      這個系列應該也是包含AM3358跟AM3359,不過processor的頻率好像不大一樣,跑起來的頻率正不正確...我沒有辦法給你一個很正確的答覆,不好意思。

      刪除
  3. 作者已經移除這則留言。

    回覆刪除
  4. 版主您好,
    最近使用您的bbbiolib對60hz進行每週期80次的採樣的點,得到的效果良好,比起open file沒有雜訊以及更新不及的狀況,圖如下:
    http://imgur.com/RWurtWU

    另外我想問說, 原本我要使用您的adc_calc算出60hz的取樣參數,,但我打入 -f 60 -t 1的時候,似乎出現無窮迴圈, 跑了很久跑不出來:
    http://imgur.com/FLeKZg7

    最後是我自己tune出參數,我假設beaglebone white的的clock frequency是24Mhz,然後每秒採樣4800個點,故會是24000000/4800=5000, 5000 - 13(conversion delay)-1(opendelay) = 4986 , 不過結果有順利出來就好, 感謝您的bbbiolib.

    我想請問open_delay和sample_delay有什麼差別?因為我看delay = 13(conversion delay) + O(open delay) + S(sample delay),
    但我若設(4986, 1 )和(1, 4986)會得到不同採樣結果, 前者才是正確的. 不曉得為何?

    日後我有空可能會把在beaglebone white使用bbbiolib ADC的過程寫一篇英文的介紹文,不知版主允許嗎?

    回覆刪除
    回覆
    1. 可以用真是太好了。


      ADC_CALC那個應該不是跑不出來,而是可能的組合太多,我當初設計是想說盡可能把組合列出來給使用者看

      但是... 頻率設比較低的話,就會造成可行解太多,而導致像這樣看起來像是掛掉的無窮迴圈,因為我是採取列舉法來計算。

      如果您急用的話,請修改Toolkit/Toolkit_ADC_CALC/ADC_CALC.c,然後把迴圈中印參數的4個printf都註解,會跑比較快。

      這是我設計失誤導致的,我近期在想想要加什麼參數來讓使用者調整比較好,真是不好意思。



      clock frequency的確是24M,但是取樣並不是每個clock取樣一次,取樣是使用以下的公式

      ADC Sample Rate = ADC_SYSTEM_CLK / (ClockDivider * (OpenDly + SampleAVG * (14 + SampleDly))) ;

      OpenDly:可以想像成是每一個ADC sample step之間的delay,大概是多久做一次那種感覺
      SampleDly:用在你的取樣有沒有需要平均,假設你需要平均2個sample為1個的時候,那這2個sample之間要delay多久,就是sample Dly
      14:13+1,13是ADC要conveter一個sample所需的時間,1是open delay結束後,接著等sample delay,所需的時間。

      在TI AM335X Technical referenece manual,Session 12 Touchscreen Controller內有更詳細的說明。



      介紹文的話,如果你有空的話,這當然是沒有問題!

      PS :如果你寫完能抽空通知我嗎? 我想把你的介紹文連結放入BBBIO的reference中,讓使用者能夠有更好的文件可以参考。


      謝謝

      刪除
  5. 好的, 沒有問題, 寫完會通知您, 但可能要到七月多.
    另外最後我想再請教一件事情, 我使用beaglebone white的ADC時候,只有AIN 1 4 5 6會顯示正確波形,
    而AIN0 用示波器看總是在1.8v, AIN 2 3總是在0v , 不知道您有沒有遇過這個問題?
    我查網路上是說這被保留給lcd cape使用了, 那這樣有辦法enable他嗎?
    我試過
    https://groups.google.com/forum/#!topic/beagleboard/7ejOSh9Fs5s
    http://blog.csdn.net/wyt2013/article/details/17396555
    兩個網站,用dtc對am335x-boneblack.dts做compile, 但reboot後還是一樣, AIN0 = 1.8v, AIN2 3 = 0V.
    不知道版主有沒有遇過這個問題?謝謝.

    回覆刪除
    回覆
    1. 恩恩,感謝你!

      不好意思,請問您用示波器看是什麼意思呢? 硬體的示波器??
      還是使用之前您貼的那張圖的程式呢?
      我使用Beaglebone Black來作簡單的測試,AIN2跟3接在 VADC跟VGND,是可以正常接到0V跟1.8V。


      刪除
  6. 版主您好, 之前我有回覆兩次, 但不知道是不是我字數太多的關係所以一直沒有出來(或者是google的問題).
    內容是我藉由重新recompile kernel的方式去取消touchscreen的功能, 然後就可以得到AIN0 2 3 的輸入波形,
    我問別人的結果, 是touchscreen這個功能會lock住一些ADC.

    另外我想詢問版主一個問題, 我看到bbbiolib裡面有個PWM的功能, 不曉得PWM的clock是根據system clock 還是 hardware clock做調整的呢?
    因為我最近使用linuxPTP這套open source軟體在對system clock做時間同步, 但我需要產生1PPS的輸出, 希望能用版主開發的PWM功能, 但不清楚您的PWM的clock source為何? 謝謝.

    回覆刪除
    回覆
    1. 可能我這樣問不太清楚... 我的意思是PWM所使用的clock和整個beaglebone上的hardware clock是同一個嗎? 謝謝.

      刪除
    2. 這樣阿 難怪我一直覺得奇怪,怎麼您的留言都沒有顯示出來,我還以為是不是我不小心改了什麼設定。

      我的mail內留有您留言的副本,請問我可以稍為編輯一下,然後加入上面的內容嗎? 當然,肯定會加上您的大名以感謝您的貢獻!

      刪除
    3. PWM的話,用的是system clock ,100MHz 的clock。

      但是使用高於10M Hz的output的話,波形就不大準了,我還在找是不是哪邊設計上失誤了。

      1PPS 是10M HZ嗎? 此圖是BBBio的 PWM function 10M的輸出波形,不知道合不合你用?

      https://lh3.googleusercontent.com/-8DCnXVRGI2k/U7XVxO1j8mI/AAAAAAAAAMA/VQxU6pUVG88/w958-h542-no/IMAG0092.jpg

      刪除
  7. 謝謝您, 1PPS指的是每秒脈衝(1 pulse per second), 也就是1Hz訊號, 所以一定夠用, 感謝!
    另外我有個不確定觀念想要釐清... 是說system clock在Linux系統上(假如安裝在beaglebone上的), 是指所有的程式(例如用到C語言的time.h)都是存取同一個clock嗎?
    像是bbbiolib 內的ADC是否也是呢?

    對了, 我之前的回覆是因為我要用linuxPTP作時間同步必須recompile kernel, 所以我對Angstrom提供的kernel作recompile, 但完成之後我詢問linpuxPTP的作者發現Angstrom提供的kernel有些問題, 所以之後我又參考 https://eewiki.net/display/linuxonarm/BeagleBone , 重新安裝Ubuntu, 當然也要再次recompile kernel, 不過之後linuxPTP可以順利運行. 版主您要編輯的話當然OK, 不過我似乎也沒什麼貢獻... 只是問人得到答案而已... 若能加進您的內容, 加速大家解決問題的時間我當然樂意, 謝謝.

    回覆刪除
    回覆
    1. 我不知道核心底層的clock是怎麼實做的,如果是Am335x這個processor的話,根據我的理解,他會有一個主要的clock source。
      然後am335x本身有一個clock manager來控制每一個sub module使用的clock,CM再將這些clock除頻,分成好幾個clock domain,
      然後針對每一個不同的module送不一樣的clock domain。
      ex :
      ADC屬於CLK_M_OSC domain , max freq 24 MHz
      PWMSS屬於 PD_PER_L4LS_GCLK domain , max freq 100 MHz
      GPIO屬於 PD_WKUP_L4_WKUP_GCLK domain , max freq 100 MHz


      原來是1阿... 哈哈,是我才疏學淺,以下是"PWM" 1 HZ output的圖,圖中應該是沒有rising過慢的問題
      https://lh6.googleusercontent.com/-E9l128pES7k/U7aiN9NGa3I/AAAAAAAAANE/72yUIbuAN0o/w958-h542-no/IMAG0102.jpg
      https://lh4.googleusercontent.com/-G_XcXoWpjj4/U7aiN0eIMCI/AAAAAAAAANI/hGXGG9beODo/w958-h542-no/IMAG0103.jpg
      https://lh3.googleusercontent.com/-r7FZ1fyePw4/U7aiNwVvwkI/AAAAAAAAANA/xpE_lYFylxU/w958-h542-no/IMAG0104.jpg

      請問您用DEMO_LED來做PWM,是用類似以下的code嗎?
      pin_high(9,22);
      iolib_delay_ms(500);
      pin_low(9,22);
      iolib_delay_ms(500);

      我使用這段code,沒有發生rising 或 falling過慢的問題,示波器channel一樣採用1ms,以下是上述程式碼跑出來的結果圖
      https://lh6.googleusercontent.com/-QXz_wADxoqI/U7ag5zLSn_I/AAAAAAAAAMk/tFsyz0bnmto/w958-h542-no/IMAG0099.jpg
      https://lh5.googleusercontent.com/-CF4R_LiYV7g/U7ag5xO5Z4I/AAAAAAAAAMg/xJq1D8UlEXo/w958-h542-no/IMAG0100.jpg

      如果你想要一個穩定的1PPS output的話,我建議您用PWM,而不要用delay的方式來做,因為iolib_delay_ms用得是linux內部的nanoslee實作,
      這個sleep有時候會跟你設定的時間差一點,當你system的負載很高的時候,像是processor經常運作再50% 60%的環境以上時,會非常明顯感覺出來他不準。
      PWM有一個獨立的控制器再控制,應該是不太受你的processor的負載影響。


      感謝你同意,因為這問題我之前也沒遇過,感覺非常有分享的價值!

      刪除
    2. 1.因為某些特殊的需要, 我必須使用system clock而不能用額外的控制器clock, 故我在參考下列網站, 研讀Linux clock的機制後, 想出一個方法: 因為我會使用linuxPTP對CLOCK_REALTIME做1PPS校準(將delay壓在1us以下), 所以我使用clock_nanosleep()而非nanosleep() (原因是若因CLOCK_REALTIME遭到更新而clock_nanosleep()小於絕對時間的設定值時, 可自動return, 而不會等待interval跑完, 此在下面的網頁有3. 4.介紹). 至於負載問題我還要測試, 因為我的目的是在beaglebone執行兩三個網路程式, 故我想應該不會到滿載的情況.
      http://cpp.ezbty.org/import_doc/linux_manpage/clock_nanosleep.2.html
      http://www.ibm.com/developerworks/cn/linux/1307_liuming_linuxtime1/
      http://stackoverflow.com/questions/7794955/why-is-clock-nanosleep-preffered-over-nanosleep-to-create-sleep-times-in-c
      http://www.qnx.com/support/knowledgebase.html?id=50130000000mutM

      2.DEMO_LED 我是照著Demo資料夾的程式做測試, 也就是版主您貼的, 但我的rising time有點大, 故等到拿到beaglebone black時我會再測試一次, 不曉得在跑PWM或LED之前是不是一定要先執行過一次overlay下的build檔, 對device tree重新設定? 若沒有做此動作會有什麼問題嗎? 謝謝.

      刪除
    3. 1. Linux sleep的精度我沒有很仔細的去研究,如果DEMO_LED那種方式你合用的話那就沒問題了,我比較好奇特殊需求,也許PWM也能達成。


      2. 不用每次都build,overlay內的檔案是為了讓BBBio改pin mux用的,因為PWM的pin腳有時候會沒有被設定再PWM的mode,像是P9_22,如果pin腳沒有設定再這個mode,那就算打開了PWM也沒有意思,不會有正確的動作;而為了改pin mode,必須要操作control module這個Register,但是這個register必須是privilege mode才能控制,但是BBBio是透過mmap實作,屬user space所以沒辦法用,因此使用device tree overlay的方式實作,而這個overlay資料夾,就包含了相關的檔案。

      你可以使用toolkit中的 EP_status來看你要操作的PIN腳有沒有被設定再你要使用的mode中,如果沒有,才有必須要使用overlay來改,不然一般來說沒有必要用到overlay

      刪除
  8. 您好, 我測試一下了PWM, 但不知道是不是我用beaglebone(white)的關係, 在mmap上似乎出現錯誤, 不過我也有用overlay 打入./build, 又或者是因為我kernel 是3.14版的關係, 我不太確定:
    root@arm:~/sv/bbbiolib# make PWM
    gcc -c ./BBBio_lib/BBBiolib_PWMSS.c -o ./BBBio_lib/BBBiolib_PWMSS.o
    gcc -c ./BBBio_lib/BBBiolib_McSPI.c -o ./BBBio_lib/BBBiolib_McSPI.o
    gcc -c ./BBBio_lib/BBBiolib_ADCTSC.c -o ./BBBio_lib/BBBiolib_ADCTSC.o
    gcc -c ./BBBio_lib/BBBiolib.c -o ./BBBio_lib/BBBiolib.o
    ./BBBio_lib/BBBiolib.c: In function ‘iolib_delay_ms’:
    ./BBBio_lib/BBBiolib.c:248:3: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’ [-Wformat=]
    fprintf(stderr, "delay_ms error: %s\n", strerror(errno));
    ^
    ./BBBio_lib/BBBiolib.c: In function ‘BBBIO_sys_delay_ms’:
    ./BBBio_lib/BBBiolib.c:863:3: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’ [-Wformat=]
    fprintf(stderr, "delay_ms error: %s\n", strerror(errno));
    ^
    ./BBBio_lib/BBBiolib.c: In function ‘BBBIO_sys_delay_us’:
    ./BBBio_lib/BBBiolib.c:891:3: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’ [-Wformat=]
    fprintf(stderr, "delay_ms error: %s\n", strerror(errno));
    ^
    ar -rs ./BBBio_lib/libBBBio.a ./BBBio_lib/BBBiolib.o ./BBBio_lib/BBBiolib_PWMSS.o ./BBBio_lib/BBBiolib_McSPI.o ./BBBio_lib/BBBiolib_ADCTSC.o
    cp ./BBBio_lib/libBBBio.a ./
    gcc -o PWM ./Demo/Demo_PWM/PWM.c -L ./BBBio_lib/ -lBBBio
    root@arm:~/sv/bbbiolib# ./PWM
    Bus error
    root@arm:~/sv/bbbiolib#

    我會再買一塊beaglebone black去測試是否是此原因, 另外主要是我需要1PPS的功能, 所以我用DEMO_LED發現可以做到1pps的功能, 不過在delay處理上最大只能到999ms, 所以我改了一下bbbiolib內的timespec的tv_sec進位, 不過在rising上似乎有點慢, 需要4ms, 不知道是因為LED和PWM的IO處理方式不同嗎?因為我看到版主您可在nanosecond下產生波形, 下面是我的波形圖:http://imgur.com/a/l1MTD

    另外有個插曲... 就是我不小心把beaglebone的P8上的5V接到示波器的GND上... 板子直接crash, 接上電源後連heartbeat LED都不跳了... 按RESET也沒反應... 之後要重買一塊了...

    回覆刪除
    回覆
    1. 其實我也是參考那個網頁來build kernel 只不過我用得是Debian,3.8的版本。
      關於Bus error的問題,以前出現Bus error,通常都是因為我忘記把module的clock送進去,不過PWM的clock我應該是有把他打開才對,
      可以麻煩你將BBBio_lib/BBBiolib.h的#define BBBIO_LIB_DBG註解拿掉,然後再執行看看,再把發出的訊息告訴我嗎?
      3.14的核心我沒試過,這幾天我再compile一個來試試看,最近比較忙,可能要過個1.2天才能告訴你測試結果,真是不好意思。


      我之前是有不小心把正負電短路 ... 然後也一樣掛了,不過我把電源拔掉後等一段時間,在插上去還是可以用,不知道你的BBB再送電看看能不能RUN起來?

      如果不行,那只能重買一塊了,只是最近國內購買價格似乎有點.... 小幅上升。

      刪除
    2. 嗨,我今天拿到新買的BBB和BBW了,照著eewiki上的步驟安裝Debian、3.8的kernel到microSD上,
      我BBWhite可以順利boot,但BBBlack卻無法,我插入USB時我的Ubuntu找不到ttyUSB0,也就沒辦法用minicom,
      但我把microSD退出時,插入USB卻可以找的到ttyACM0,啟動的是出廠內建於eMMC的Debian,
      我想請問版主您當初安裝有遇到找不到ttyUSB0的問題嗎? 我好奇想確認是我電腦的問題還是BBB的問題,因為我照著eewiki的流程run過兩次,但都找不到ttyUSB0,
      我看到一些資料是說kernel版本的問題,所以我想在此先詢問版主是否可以在3.8版本下啟動Debian,有按住USER/BOOT先將microSD寫入eMMC內嗎? 另外您的PC的dirstribution為何? 若確認是kernel的問題的話,我會嘗試用3.15版本重run一遍。 謝謝。

      刪除
    3. 試試看下面的步驟

      1. 再BBB上修改以下檔案/etc/inittab,妳也許會再6X行附近看到跟下面字串一樣的字,沒有也沒關係。

      T0:23:respawn:/sbin/getty -L ttyO0 115200 vt102

      將這行的ttyO0改成ttyGS0,如果沒有的話,就新增,改完會像下面這樣

      T0:23:respawn:/sbin/getty -L ttyGS0 115200 vt102

      2. 把g_serial的module 裝起來
      #modprobe g_serial

      3. 接著在BBB上用ls /dev,應該就可以看到ttyGS0出來的,沒有做步驟2的話,不會有這個。

      4. 接著到PC上,ls /dev,應該就可以看到ttyACM0了。

      5. 預設用這個時,沒辦法用root登入,如果你想要用root登入,請在BBB上修改 /etc/securetty,加入ttyGS0
      #vim /etc/securetty

      刪除
    4. 6. 以上步驟每次重開機都要做一次,如果你不想重做一次,那請修改這個檔案 /etc/modules,新增以下內容
      #vim /etc/modules
      新增 g_serial

      這樣每次重開機就不用再手動下指令了。


      PS : 如果你是燒好SD卡之後,想用ttyACM0直接連,而不用網路或接螢幕設定的話,假設你的SD卡插入PC後是sdf,請mount sdf2,然後再照上面的步驟做一些小修改,在放到BBB上,應該就能直接用ttyACM0連了


      刪除
  9. 我現在沒辦法找到microSD啟動後BBB,所以沒辦法在BBB下輸入指令,
    版主您當初也是把ttyUSB0改成ttyGS0才能啟動嗎?
    不過我在google上找了之後,似乎沒太多人遇到這個問題,不曉得是uEnv.txt的問題還是inittab的問題,
    我會再試試其他方法,謝謝您。

    回覆刪除
  10. 你的SD卡插進去後 user LED會閃嗎? 我3片BBB分別是A5A A5B B版本,都不用按住BOOT,插好送電就直接由microSD卡開機。


    我當初都是燒好SD卡之後,再直接mount 第2個磁區,設一下網路然後用SSH直接登進來操作,我很少用USB。
    如果你沒辦法下指令也沒關係,把SD卡拿出來放到PC上,mount起來之後再修改相關設定檔好了,步驟 1 ,5 ,6有做應該就OK了,上面3個步驟都是改BBB的檔案,非PC,不過我覺得直接設SSH也是個好方法。


    假設你的SD卡插進電腦後是讀成sdf,到時候要改一下
        #mount -t ext4 /dev/sdf2 /mnt/fs
        #vim /mnt/fs/etc/inittab     ->步驟1
        #vim /mnt/fs/etc/securetty    ->步驟5 (如果你不想讓root可以用這個登,不用作)
        #vim /mnt/fs/etc/etc/modules   ->步驟6


    如果你是用eewiki上的uEnv的話,我剛剛試過,是沒有問題的。
    http://www.eewiki.net/display/linuxonarm/BeagleBone+Black#BeagleBoneBlack-uEnv.txtbasedbootscript

    回覆刪除
  11. 版主您幫了我一個大忙... 雖然用修改inittab改成GS0的方法似乎還是對我無效... (我不知道為何)
    但你提到了用ethernet作log in的方法, 可能是我資質駑鈍, 之前都沒想到... 或者是我太執著要用USB去登入,
    不過我修改/etc/network/interfaces 裡面設定eth0的IP後就可以進去BBB了!非常感謝.
    在eewiki上RobertCNelson寫到usb gadget的部份, 我看到要用wget指令, 我心想"我連BBB都進不去了要怎麼用wget?"
    現在我想他的意思是要我先用ethernet進去再用wget的意思吧?
    最近花太多時間在處理USB的問題上... 進度有點delay, 版主一語驚醒夢中人, 感謝.

    回覆刪除
  12. 在BBB中試試 modprobe g_serial ? 應該會再/dev下看到ttyGS0

    還好有幫到你,我還怕我沒搞清楚你的問題 ...

    回覆刪除
  13. 版主您好, 我今天用Demo_LED測試1PPS訊號並發現之前的問題出在哪了, 我去找了Textronix的使用手冊,
    原因是Tektronix示波器如果要掃描高精度的脈衝訊號的話, 一開始x軸的scale要用SEC/DIV轉到最小(us, ns),
    我之前都是用擷取間距1s的scale去RUN/STOP, 然後再用SEC/DIV放大去看, 所以會有很大的rise time, 只能說我電路實驗都沒在專心聽呀...
    不過這證明版主的bbbiolib運行順利, 謝謝, 下面是結果附圖:
    http://imgur.com/g6tpYND

    回覆刪除
    回覆
    1. 原來如此,能用就好,希望你未來實作順利!

      刪除
  14. 您好
    我是最近也在研究BBB的學生
    想請教您如何讓取樣率達到1m?
    我怎麼調參數都只有百k,達不到m取樣率
    拜託拜託了><

    回覆刪除
  15. 您好:

      嘗試看看BBBIO_ADC_WORK_MODE_BUSY_POLLING ?

      不過我沒有做超過100K的實驗,所以我不確定我寫的這套lib能不能處理超過1M的sampling rate

      不好意思....

    回覆刪除