為樹莓派開發板增加模擬信號接口
大家可能已經在樹莓派開發板上發現了一個問題,樹莓派沒有模擬信號的輸入引腳,這意味著樹莓派不能直接處理模擬輸入信號,為了解決這個問題,本文將討論如何通過使用 A/D信號轉換器實現樹莓派模擬信號輸入的問題。
是一個10位8通道的ADC(模擬數字轉換器),它使用SPI總線協議,價格便宜,也不需要使用額外的組件,不含電源和接地引腳 只占用4個樹莓派的引腳,
就可以提供8個模擬信號輸入。 輸出最大值(2的10次方)= 1023,所以輸出的范圍是0-1023兩個模擬信號如何同時輸入到單片機,0表示0V,1023表示3.3V 。
引腳定義
ADC共有16個引腳,其中左側8個引腳用于接收模擬信號輸入,分別是CH0-CH7(引腳序號:1-8)。D.Groud是芯片的數字地,CS/SHDN是芯片選擇引腳,Din和Dout是數據輸入和輸出腳,CLOCK是時鐘,A.是模擬地,Vref是模擬基準電壓腳,Vdd/Vcc是供電引腳。
打開樹莓派的SPI接口
打開樹莓派的命令終端并輸入以下命令:sudo raspi-,
樹莓派命令終端
會彈出如下窗口
樹莓派接口設置
然后啟用SPI。
樹莓派啟用SPI接口安裝NumPy
關于NumPy將稍后進行討論。首先要安裝它,在終端中輸入以下命令 :
sudo apt-get -numpy
通過電位器控制LED的亮度
首先,我們將嘗試使用電位器的模擬輸出值來控制LED的亮度。電路連接如下。
樹莓派通過電位器控制LED的亮度
我們先將樹莓派和按下表的對應關系完成連接。
Pi
VDD
3.3V
VREF
3.3V
AGND
GND
CLK
DOUT
GPIO9
DIN
CS
GPIO8
DGND
GND
然后,將10k電位計的中心引腳連接到的CH0上兩個模擬信號如何同時輸入到單片機,將電位計的另外兩端連接到3.3V和GND上。最后將LED的正極引腳(LED的長腳)連接到樹莓派的GPIO 20,再將220歐電阻從LED的負極引腳連接到樹莓派的GND。
通過電位器控制LED的亮度的代碼
# Importing modules import spidev # To communicate with SPI devices from numpy import interp # To scale values from time import sleep # To add delay import RPi.GPIO as GPIO # To use GPIO pins # Start SPI connection spi = spidev.SpiDev() # Created an object spi.open(0,0) # Initializing LED pin as OUTPUT pin led_pin = 20 GPIO.setmode(GPIO.BCM) GPIO.setup(led_pin, GPIO.OUT) # Creating a PWM channel at 100Hz frequency pwm = GPIO.PWM(led_pin, 100) pwm.start(0) # Read MCP3008 data def analogInput(channel): spi.max_speed_hz = 1350000 adc = spi.xfer2([1,(8+channel)<<4,0]) data = ((adc[1]&3) << 8) + adc[2] return data while True: output = analogInput(0) # Reading from CH0 output = interp(output, [0, 1023], [0, 100]) print(output) pwm.ChangeDutyCycle(output) sleep(0.1)
其中,(,[0,1023],[0,100])函數用于將值從0-1023轉換到0-100。我們上面提到過 ADC的輸出范圍是0-1023,這里需要對應0-100的占空比,因此需要對這些值進行了轉換。
樹莓派從TMP36讀取實時溫度
解決了樹莓派模擬信號輸入的問題,現在,我們將使用樹莓派從TMP36的測量值中讀取并計算溫度值。電路圖如下所示:
樹莓派從TMP36讀取實時溫度 實現代碼
# Importing modules import spidev # To communicate with SPI devices from time import sleep # To add delay # Start SPI connection spi = spidev.SpiDev() # Created an object spi.open(0,0) # Read MCP3008 data def analogInput(channel): spi.max_speed_hz = 1350000 adc = spi.xfer2([1,(8+channel)<<4,0]) data = ((adc[1]&3) << 8) + adc[2] return data # Below function will convert data to voltage def Volts(data): volts = (data * 3.3) / float(1023) volts = round(volts, 2) # Round off to 2 decimal places return volts # Below function will convert data to temperature. def Temp(data): temp = ((data * 330)/float(1023))-50 temp = round(temp) return temp while True: temp_output = analogInput(0) # Reading from CH0 temp_volts = ConvertVolts(temp_output) temp = ConvertTemp(temp_output) print("Temp : {} ({}V) {} deg C".format(temp_level,temp_volts,temp)) sleep(5)
以上通過將連接至樹莓派,實現了樹莓派連接模擬信號傳感器的問題,并通過電位器和TMP36兩個模擬元件做了相應的測試,要完成測試,請拷貝上面的代碼另存為.py文件,并在樹莓派命令行輸入: XXXX.py 來運行。