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

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

ただいまの
回答率

89.07%

ラズパイにて、MCP3208を用いたADCについて

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,394

BluePi85

score 20

ラズパイGPIO,MCP3208を用いてADコンバータの作成に取り組んでいます。

GUIで、MCP3208より読み込んだ値を表示させたく
Qt Designerを用いて以下のコードを作成致しました。

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'ADC.ui'
#
# Created by: PyQt5 UI code generator 5.10.1
#
# WARNING! All changes made in this file will be lost!

import time
import sys
#from datetime import datetime  # 現在時刻

import spidev

from PyQt5 import QtCore, QtGui, QtWidgets

#############################################################################
VrefAD = 5.0        # 基準電圧入力
Sampling = 10

class Ui_Dialog(object):
  # ================================================================ #
    def __init__(self):
        self._timer = QtCore.QTimer()
        self._timer.timeout.connect(self.run)

        spi = spidev.SpiDev()
        spi.open(0,0)
        spi.max_speed_hz = 1000000

  # ================================================================ #
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(400, 337)
        self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
        self.buttonBox.setGeometry(QtCore.QRect(30, 290, 341, 32))
        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
        self.buttonBox.setObjectName("buttonBox")
        self.gridLayoutWidget = QtWidgets.QWidget(Dialog)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(30, 10, 231, 191))
        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
        self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.lcdNumber_2 = QtWidgets.QLCDNumber(self.gridLayoutWidget)
        self.lcdNumber_2.setObjectName("lcdNumber_2")
        self.gridLayout.addWidget(self.lcdNumber_2, 1, 1, 1, 1)
        self.label_2 = QtWidgets.QLabel(self.gridLayoutWidget)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
        self.lcdNumber_1 = QtWidgets.QLCDNumber(self.gridLayoutWidget)
        self.lcdNumber_1.setObjectName("lcdNumber_1")
        self.gridLayout.addWidget(self.lcdNumber_1, 0, 1, 1, 1)
        self.label_3 = QtWidgets.QLabel(self.gridLayoutWidget)
        self.label_3.setObjectName("label_3")
        self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
        self.label_4 = QtWidgets.QLabel(self.gridLayoutWidget)
        self.label_4.setObjectName("label_4")
        self.gridLayout.addWidget(self.label_4, 3, 0, 1, 1)
        self.lcdNumber_4 = QtWidgets.QLCDNumber(self.gridLayoutWidget)
        self.lcdNumber_4.setObjectName("lcdNumber_4")
        self.gridLayout.addWidget(self.lcdNumber_4, 3, 1, 1, 1)
        self.lcdNumber_3 = QtWidgets.QLCDNumber(self.gridLayoutWidget)
        self.lcdNumber_3.setObjectName("lcdNumber_3")
        self.gridLayout.addWidget(self.lcdNumber_3, 2, 1, 1, 1)
        self.label = QtWidgets.QLabel(self.gridLayoutWidget)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.btnStart = QtWidgets.QPushButton(Dialog)
        self.btnStart.setGeometry(QtCore.QRect(50, 220, 101, 31))
        self.btnStart.setObjectName("btnStart")
        self.btnStop = QtWidgets.QPushButton(Dialog)
        self.btnStop.setGeometry(QtCore.QRect(180, 220, 101, 31))
        self.btnStop.setObjectName("btnStop")
        self.actionOnStart = QtWidgets.QAction(Dialog)
        self.actionOnStart.setObjectName("actionOnStart")
        self.actionOnStop = QtWidgets.QAction(Dialog)
        self.actionOnStop.setObjectName("actionOnStop")

        self.retranslateUi(Dialog)
        self.buttonBox.accepted.connect(Dialog.accept)
        self.buttonBox.rejected.connect(Dialog.reject)
        self.btnStart.clicked.connect(self.OnStart)
        self.btnStop.clicked.connect(self.OnStop)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

  # ================================================================ #
    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.label_2.setText(_translate("Dialog", "AD2"))
        self.label_3.setText(_translate("Dialog", "AD3"))
        self.label_4.setText(_translate("Dialog", "AD4"))
        self.label.setText(_translate("Dialog", "AD1"))
        self.btnStart.setText(_translate("Dialog", "S t a r t"))
        self.btnStop.setText(_translate("Dialog", "S t o p"))
        self.actionOnStart.setText(_translate("Dialog", "OnStart"))
        self.actionOnStop.setText(_translate("Dialog", "OnStop"))


  # ================================================================ #
   # START
    def OnStart(self):
     # **************************************************************** #
      # タイマー開始
        self._timer.start(Sampling)

  # ================================================================ #
   #  
    def run(self):
     # **************************************************************** #
      # AD
        ADC = MCP3208_Class(ref_volts = VrefAD)
     # AD1
        ReadVoltAD1 = ADC.GetVoltage(ch=0)
     # AD2
        ReadVoltAD2 = ADC.GetVoltage(ch=1)
     # AD3
        ReadVoltAD3 = ADC.GetVoltage(ch=2)
     # AD4
        ReadVoltAD4 = ADC.GetVoltage(ch=3)

     # **************************************************************** #
      # 値を読み取った値を表示する
       # AD1
        self.lcdNumber_1.display('{:.3f}'.format(ReadVoltAD1))

       # AD2
        self.lcdNumber_2.display('{:.3f}'.format(ReadVoltAD2))

       # AD3
        self.lcdNumber_3.display('{:.3f}'.format(ReadVoltAD3))

       # AD4
        self.lcdNumber_4.display('{:.3f}'.format(ReadVoltAD4))

#        print("")
#        print(datetime.now().strftime("%Y/%m/%d %H:%M:%S") + ", AlphaAD1 = " + str('{:.3f}'.format(AlphaAD1)) + ", AlphaAD2 = " + str('{:.3f}'.format(AlphaAD2)) + ", AlphaAD3 = " + str('{:.3f}'.format(AlphaAD3)) + ", AlphaAD4 = " + str('{:.3f}'.format(AlphaAD4)))
#        print(datetime.now().strftime("%Y/%m/%d %H:%M:%S") + ", BeatAD1 = " + str('{:.3f}'.format(BeatAD1)) + ", BeatAD2 = " + str('{:.3f}'.format(BeatAD2)) + ", BeatAD3 = " + str('{:.3f}'.format(BeatAD3)) + ", BeatAD4 = " + str('{:.3f}'.format(BeatAD4)))
#        print(datetime.now().strftime("%Y/%m/%d %H:%M:%S") + ", AD1 = " + str('{:.3f}'.format(ReadVoltAD1)) + "[V], AD2 = " + str('{:.3f}'.format(ReadVoltAD2)) + "[V], AD3 = " + str('{:.3f}'.format(ReadVoltAD3)) + "[V], AD4 = " + str('{:.3f}'.format(ReadVoltAD4)) + "[V]")

     # **************************************************************** #
      # 
        self._timer.start(Sampling)



  # ================================================================ #
   # STOP
    def OnStop(self):
        ADC.Cleanup()
        self._timer.stop()

#############################################################################
#MCP3208から値を取得するクラス
class MCP3208_Class:

    """コンストラクタ"""
    def __init__(self, ref_volts):
        self.ref_volts = ref_volts
        self.spi = spidev.SpiDev()
        self.spi.open(0,0)

    """電圧取得"""
    def GetVoltage(self,ch):
        raw = self.spi.xfer2([1,(8+ch)<<4,0])
        raw2 = ((raw[1]&3) << 8) + raw[2]
        volts = (raw2 * self.ref_volts ) / float(1023)
        volts = round(volts,4)
        return volts

    """終了処理"""
    def Cleanup(self):
        self.spi.close()

#############################################################################
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

時間が経過すると以下のエラーメッセージが表示され終了してしまいます。
backend.pyの部分がエラー該当部だと思うのですが、
場所がライブラリの場所だと思い、
知識なく手を出してしまうと、今後どのような影響が出るか分からず、
何も行うことが出来ません。

大変申し訳ありませんが、
アドバイスを頂けないでしょうか?

Backend terminated (returncode: -6)
Fatal Python error: Aborted

Current thread 0x76fbc010 (most recent call first):
File "/home/pi/Python/Check20180917/ADC_qt5_rpi_20180917.py", line 185 in <module>
File "/usr/lib/python3/dist-packages/thonny/shared/thonny/backend.py", line 588 in execute_source
File "/usr/lib/python3/dist-packages/thonny/shared/thonny/backend.py", line 427 in _execute_source_ex
File "/usr/lib/python3/dist-packages/thonny/shared/thonny/backend.py", line 374 in _execute_file
File "/usr/lib/python3/dist-packages/thonny/shared/thonny/backend.py", line 155 in _cmd_Run
File "/usr/lib/python3/dist-packages/thonny/shared/thonny/backend.py", line 119 in handle_command
File "/usr/lib/python3/dist-packages/thonny/shared/thonny/backend.py", line 97 in mainloop
File "/usr/lib/python3/dist-packages/thonny/shared/backend_launcher.py", line 41 in <module>
Resetting ...

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

状況はよくわかりませんが、thonnyがエラーを出しているなら単純にthonnyを使うのをやめたらどうですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/18 23:01

    ご回答ありがとうございます。

    アドバイス頂いたように、
    IDLEにて実行したところ、エラーなどのメッセージなく落ちてしまいました。

    他に何かアドバイスを頂けたら幸いです。

    キャンセル

  • 2018/09/18 23:35

    IDLEではなく直接ターミナルからpythonコマンドで実行できませんか?

    キャンセル

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

  • ただいまの回答率 89.07%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る