teratail header banner
teratail header banner
質問するログイン新規登録

質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

2041閲覧

PythonでSPI I/FのADCからデータを取得したい

YOshim

総合スコア1094

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/03/19 02:35

編集2021/03/19 04:13

0

0

現在Raspi4にADC7924を接続してデータ取得を試みておりますが、取得データが常に0となっております。
部品の実装やピンアサインを確認しましたが特に問題はないと思われます。コードに問題があるとして、どこが誤っているかもしくは怪しそうかをご指摘頂きたく。
やっていること自体は単純です。
AD7924のレジスタに同じデータを2回繰り返し送信しています。1回目は読取チャンネル設定のためにデータ送信しています。
2回目のデータ送信時にAD7294から出力されるデータを読み取りprint文で表示しています。
このデータが常に0になっております。ADCの入力がGNDに落ちていない限りは出力値として0になることはほぼありえないので、コードに問題があると考えています。

Python

1import spidev 2import wiringpi as w 3import time 4import sys 5 6cs_pin = 22 7w.wiringPiSetup() 8w.pinMode(cs_pin, 1) 9w.digitalWrite(cs_pin, 1) 10 11spi = spidev.SpiDev() 12spi.open(0, 0) 13spi.max_speed_hz = 1000000 14spi.mode = 2 15 16w.digitalWrite(cs_pin, 0) 17time.sleep(0.1) 18spi.writebytes([0xFF, 0xFF]) 19w.digitalWrite(cs_pin, 1) 20time.sleep(0.1) 21 22WRITE   = 0b1 << 11 23SEQ1    = 0b0 << 10 24PM1     = 0b1 << 5 25PM0     = 0b1 << 4 26SEQ0    = 0b0 << 3 27RANGE   = 0b0 << 1 28CODING  = 0b0 << 0 29 30def readADC(channel): 31    CH = channel << 6 32    data = WRITE | SEQ1 | PM1 | PM0 | CH | SEQ0 | RANGE | CODING 33    data0 = (data >> 4) & 0xFF 34    data1 = (data << 4) & 0xFF 35    send_data = [data0, data1] 36    print('send_data:{}'.format(send_data)) 37    38 w.digitalWrite(cs_pin, 0) 39    time.sleep(0.1) 40    spi.xfer2(send_data) 41 w.digitalWrite(cs_pin, 1) 42    time.sleep(0.1) 43 44 w.digitalWrite(cs_pin, 0) 45    time.sleep(0.1) 46    adc = spi.xfer2(send_data) 47    w.digitalWrite(cs_pin, 1) 48 49    adc_value = adc[0] << 8 | adc[1] 50    print('CH:%d %d' % (channel, adc_value)) 51    52 return adc_value 53 54if __name__ == '__main__': 55    try: 56        while True: 57            readADC(0) 58            readADC(1) 59            readADC(2) 60            time.sleep(0.2) 61 62    except KeyboardInterrupt: 63        spi.close() 64        sys.exit(0)

やったこととしては、レジスタ値を様々な値に変えてみましたが、変化なしです。
デバイスの実装不良かもと思い改めて半田付けしてみましたが、やはり変化なしです。

以上、宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

回答ありがとうございます。
初歩的なミスで、
wiringPiSetup()ではなくwiringPiSetupGpio()とすることで動作しました。
色々アドバイス頂きありがとうございます。
こんなミスですみません。

投稿2021/03/19 06:15

YOshim

総合スコア1094

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2021/03/19 06:26

Broadcom番号のGPIO22を意図していたが wiringPiSetup()としてしまい、wiringPI番号のGPIO22(存在しない)を指定していたということですね
guest

0

Raspi触ったこと無いので恐縮ですが、ひとまず下記試されてはいかがでしょう。

  1. readADCの内部で、どの行まで想定通りに動いているか各変数の中身を確認する。
  2. ADCの出力をテスターやオシロで確認する。

投稿2021/03/19 04:18

jeanbiego

総合スコア3966

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YOshim

2021/03/19 05:21

1についてはソースに記載の通り確認済です。 2については手元にオシロがないため波形が確認できません。CS端子は正常にH/L切り替わっていることは確認しました。
guest

0

2回の書き込み中、CSをずっと下げたままかと思いますが、1回1回上げてみてください

投稿2021/03/19 04:09

ozwk

総合スコア13553

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YOshim

2021/03/19 04:11

回答ありがとうございます。 早速修正してみましたが、やはりデータは0のままでした。 上記コードも修正致します。
ozwk

2021/03/19 04:30

一応回路図もください
YOshim

2021/03/19 04:34

すみません、それはご容赦ください。。。
ozwk

2021/03/19 06:08 編集

AD7924の各ピンに何がつながっているかと SPIバスに他にぶら下がっているものがあるかを教えて下さい あとはjeanbiegoさんの指摘事項もご確認ください
YOshim

2021/03/19 05:20

CS端子にプルダウン、その他はダンピング抵抗として33オームを直列に接続しています。 他にSPI IFを共有しているデバイスはありません。
ozwk

2021/03/19 05:33 編集

VDD/VDRIVE/REFINは? VIN0~3の電圧をテスターで読むとどうなってますか? (ソフトの話をしろよと思われるかもしれませんが、ノーヒントでコード読むのは辛いものがあるので...)
YOshim

2021/03/19 05:34

VDDは5V、VDRIVEは3.3V、REFINは2.5Vです。 アナログ入力端子電圧は以下の通りです。 VIN0: 0V VIN1: 1.1V VIN2: 1.5V でした。
ozwk

2021/03/19 06:07 編集

DOUTをMISOから引っこ抜いて、 MISOは抵抗か何かでHレベルに吊ると受信データは0xFFFFが得られることが期待できると思います。 どうなりますか?
YOshim

2021/03/19 06:16

解決しました、すみません。 上記の方法は今後似たような問題が発生したさいに参考にさせて頂きます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問