Raspberry Pi提供了26個插針,用來連接外圍設備,其中就包括了這些功能:
但是在我實際使用過程當中,出現了這些問題:
Pin7(GPIO4)有GPCLK0的功能,而pifm需要使用此針,1-wire的DS18B20也需要使用此針。如果默認開機加載了1-wire的驅動,可以正常讀取溫度之后,再運行pifm則會播放大約1s之后就變噪音了,這應該是此時1-wire的通信導致了pifm失去對Pin7的控制,進而無法播放。
如果先使用了pifm而在播放完成后modprobe w1-therm則w1-gpio不能被正確加載,dmesg當中有提示:
w1-gpio: probe of w1-gpio failed with error –16
估計是因為pifm直接寫內存,導致模式不能被切換吧。不重啟的話我不知道如何解決問題。很好的一點,最新的kernel支持了w1的針腳指定輸出,因此我在/boot/cmdline.txt當中append這個參數就可以了:
bcm2708.w1_gpio_pin=25
這樣就把1-wire的設備接到GPIO25,也就是CE0和CE1上面的那個針腳即可了,這樣就避免了Dallas 1-wire設備與pifm的沖突了。你可以設置為任意一個可以使用的GPIO,比如17,22,24等等。據我所知,1-wire也是bit-bang出來的,所以更改針腳的話是很容易的。
還有一個問題,就是pifm與PWM之間的。這個問題令我十分不解,因為pifm用的Pin7(GPIO4)與PWM的Pin12(GPIO18)無關。但是實際情況是:
1. 如果我先運行了pwm,讓其輸出到單色LED,可以觀察到亮度變化,再運行pifm,聲音正常播放,但是LED亮度不怎么變,電壓表測量的電壓在3.05V-3.06V,退出后亮度無變化,但是pwm程序依然運行
2.先運行pifm,正常播放聲音,並且PWM的燈是亮着的,亮度和上面的類似。再運行pwm,聲音停止,但是LED亮度在變化當中。我是使用“avconv -i test.mp3 -ac 1 -ar 22050 -b 352k -f wav - | sudo ./pifm”來播放的,看到轉換進度停止了,即使退出了pwm程序,pifm依然停止,因為轉換沒有前進。
總之,pifm與PWM占用了不同針腳,但是卻有先來后到之分?
pifm的源代碼當中用到了PWM,但是不理解為什么要用,應該只用GPCLK0(Pin4/GPIO7)即可