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

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

ただいまの
回答率

87.80%

csvファイルへのデータ書き出し

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 310

現在rasberrypiとmyowareとmcp3204を使って筋電位の測定をする研究をおこなっています。
下のようなプログラムを組んで文字とエンターを押すたびにデータが保存され、1000×24の表を作成しようと考えています。理想の表も下に示しておきます。いまのプログラムのままではsyakkutuのデータが最後に保存されて表もsyakkutuだけの表になってしまいます。これをそれぞれ、weakness,grasping,opening,syoukutu,haikutu,syakutuの順で横方向に連結して1000×24の表を作りたいです。アドバイスや改善点がありましたらお願いしたいです。

import wiringpi as pi
import time
import numpy as np
import openpyxl as excel
import spidev
import threading
import pandas as pd

SPI_CE = 0
SPI_SPEED = 5000000
READ_CH = 0
VREF = 5
spi = spidev.SpiDev()
spi.open(0,0)
spi.max_speed_hz =SPI_SPEED
during_time = 0.5
sampling_rate = 2000
sampling_num = int(during_time*sampling_rate)

sampling_interval = 1 / sampling_rate
x = np.arange(0, sampling_num / sampling_rate, sampling_interval)
y = np.zeros(sampling_num)

def main():
    print('測定開始')
    for i in ['weakness','grasping','opening','syoukutu','haikutu','syakkutu']:
        print("{}:測定".format(i))
        toriga = input()
        if toriga:
            MEASURE = measure()
            data = MEASURE.keisoku()
            print(data)
            pd.DataFrame(np.array(data)).T.to_csv('data.csv', index=False, header=False)
        print("{}:測定終了".format(i))

class measure(object):
    def __init__(self):
        self.data=[]
        self.data1=[]
        self.data2=[]
        self.data3=[]
        self.Vi = []
        self.Vi1= []
        self.Vi2= []
        self.Vi3= []


    def do_sampling(self,i,time_start):#電圧取得
        y[i] = time.perf_counter() - time_start

    def read_ch0(self):
        adc=spi.xfer2([6,0,0])
        data=((adc[1]&15)<<8)+adc[2]
        self.data=data
        #print('channel0')
        return 

    def read_ch1(self):
        adc=spi.xfer2([6,0x40,0])
        data=((adc[1]&15)<<8)+adc[2]
        self.data1=data
        #print('channel1')
        return 

    def read_ch2(self):
        adc=spi.xfer2([6,0x80,0])
        data=((adc[1]&15)<<8)+adc[2]
        self.data2=data
        #print('channel2')
        return 

    def read_ch3(self):
        adc=spi.xfer2([6,0xc0,0])
        data=((adc[1]&15)<<8)+adc[2]
        self.data3=data
        #print('channel3')
        return 

    def keisoku(self):
        count=0
        time_start = time.perf_counter()
        time_next = time_start
        Vi=self.Vi
        Vi1=self.Vi1
        Vi2=self.Vi2
        Vi3=self.Vi3
        while count < sampling_num :
            self.do_sampling(count, time_start)
            time_next += sampling_interval
            thread1 = threading.Thread(target=self.read_ch0)
            thread2 = threading.Thread(target=self.read_ch1)
            thread3 = threading.Thread(target=self.read_ch2)
            thread4 = threading.Thread(target=self.read_ch3)
            thread1.start()
            thread2.start()
            thread3.start()
            thread4.start()
            Vi.append(self.data)
            Vi1.append(self.data1)
            Vi2.append(self.data2)
            Vi3.append(self.data3)
            while (time.perf_counter() < time_next): # 次の時間まで待つ。
                pass
            count = count + 1

        return Vi,Vi1,Vi2,Vi3


if __name__=='__main__':
    main()

![イメージ説明]
(3d813534dc1c47f65e28c9ffb80ad9b5.png)

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

添付してもらったソースコードでは、
1つ計測するたびにdata.csvを新しく作成して上書きしているので、最後の計測のデータしか残りません。
以下のように一旦データをまとめてからファイルに出力すれば意図通りの動作になると思います。

def main():
    print('測定開始')
    all_data = []
    for i in ['weakness','grasping','opening','syoukutu','haikutu','syakkutu']:
        print("{}:測定".format(i))
        toriga = input()
        if toriga:
            MEASURE = measure()
            data = MEASURE.keisoku()
            print(data)
            all_data.extend(data)
        print("{}:測定終了".format(i))

    pd.DataFrame(all_data).T.to_csv('data.csv', index=False, header=False)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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