![見出し画像](https://assets.st-note.com/production/uploads/images/47505578/rectangle_large_type_2_e03006ae2b98f8dd8200689629530afa.jpg?width=1200)
データの取得できず (_ _;
どうも、じぇいかわさきです。
夜なべして作成したADコンバータをラズパイに接続して、早速コードを書いてみました。
書いてみたというか、ネットを参考にして自分の求めていることに近い物を選んで試してみました。
が、結果は散々たるものになりデータが上手く取得できません。
まずはADCの使い方を学ぶ
それでは最初に、YL69のデータをいきなり取得するのではなく、まずはADCの使い方についてちょっと学んでいきました。
参考にしたコードはこれです。
import spidev
Vref = 3.3
ch0 = [0x06,0x00,0x00]
spi = spidev.SpiDev()
spi.open(0,0) #bus 0,cs 0
spi.max_speed_hz = 1000000 # 1MHz
adc = spi.xfer2(ch0)
data = ((adc[1] & 0x0f) << 8) | adc[2]
print(str(Vref*data/4096) + "V")
spi.close()
非常にシンプルなコードで、ch0に接続された電圧を測定するというものです。
自分の場合は、Vrefにラズパイの3.3Vを使用しておりますので、ここを3.3に変えて、実際にはYL69がつながっていますが、短絡していない状態ですので3.3Vに近い値を示すはずです。
実行してみると、確かにオープンな状態になっているので
3.3Vに対して3.299VとほぼVrefの値になりました。
それでは、実際にセンサー部分をウエットティッシュを被せてみますと、コンパレータ部分のLEDが点灯しますので、ショート方向になっているようです。
同じようにコードを実行してみると
値は約1.1V下がった値を示しました。
とりあえずはコードとしては動いているようですね。
それでは実際にYL69のデータを採取するコードで実験
実際には使用しているADCと同じコードはなかったのですが、現状使用しているMCP3208とMCP3008はほぼ同じようなコードであるということから、Adafriutのページからサンプルコードを参考にさせていただきました。
import time
import os
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
# read SPI data from MCP3008 chip, 8 possible adc's (0 thru 7)
def readadc(adcnum, clockpin, mosipin, misopin, cspin):
if ((adcnum > 7) or (adcnum < 0)):
return -1
GPIO.output(cspin, True)
GPIO.output(clockpin, False) # start clock low
GPIO.output(cspin, False) # bring CS low
commandout = adcnum
commandout |= 0x18 # start bit + single-ended bit
commandout <<= 3 # we only need to send 5 bits here
for i in range(5):
if (commandout & 0x80):
GPIO.output(mosipin, True)
else:
GPIO.output(mosipin, False)
commandout <<= 1
GPIO.output(clockpin, True)
GPIO.output(clockpin, False)
adcout = 0
# read in one empty bit, one null bit and 10 ADC bits
for i in range(12):
GPIO.output(clockpin, True)
GPIO.output(clockpin, False)
adcout <<= 1
if (GPIO.input(misopin)):
adcout |= 0x1
GPIO.output(cspin, True)
adcout >>= 1 # first bit is 'null' so drop it
return adcout
# change these as desired - they're the pins connected from the
# SPI port on the ADC to the Cobbler
SPICLK = 23
SPIMISO = 21
SPIMOSI = 19
SPICS = 24
# set up the SPI interface pins
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPICS, GPIO.OUT)
# adc #0
adc_pin = 0;
while True:
# read the analog pin
moisture = readadc(adc_pin, SPICLK, SPIMOSI, SPIMISO, SPICS)
print("moisture: {0}".format(moisture))
time.sleep(1)
実際にこれで動くと思ったのですが、何故か値は0のまま変化しません。
オープンなので乾燥しているということから、0でも間違いでは無さそうですが、先程のウエットティッシュを被せても0のまま何も変化しません。
せっかくうまくいくかとおもったのですが、やはりそうは桑名の焼蛤ではないですが、うまくは行きませんでした。
なかなか手強そうです。
急がば回れでもう一度ゆっくり学んでいこう
ネットで説明してくれているコードを流用してうまく行かないかと思いましたが、やはり環境の違いなどで一筋縄では動きませんね。
しかし、そういう時こそ学びが有るわけですから、じっくりと何故動かないのかをチェックしていく必要があります。
少なくとも、ADC自体は動作をしているようですから、YL69に合わせた使い方の部分なんでしょう。
もう一度、YL69の動作を含めててADCの使い方を学びなおした方が良さそうです。
急がば回れで、再度コードを眺めながら分析し間違いを見つける作業をしていきたいと思います。
じぇいかわさきです。生産技術者として35年、今まで培った経験とスキルを元に、ものづくりに関わる世の出来事に対して思ったことをホンネで書いてます。ノウハウやアイデアもありますよ。 また写真も全力で撮っています、気に入った写真があればサポートや感想をぜひお寄せください。