質問編集履歴
2
他サイトへの同じ質問について、他サイトの方の質問を削除致しました。 コードを成型し直しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -3,86 +3,137 @@
|
|
3
3
|
結論から書くと、一度目のデバッグではちゃんと通信ができますが、一旦停止し、初めからデバックをやり直すと「invalid literal for int() with base 10: ''」というエラーが返ってきます。問題がありそうな関数に関して以下に掲載いたします。
|
4
4
|
|
5
5
|
【Arduino側】
|
6
|
+
```Arduino
|
7
|
+
//心電計測関数
|
6
8
|
void HRV_check(){
|
7
|
-
int checkflag = 0;
|
9
|
+
int checkflag = 0;
|
8
|
-
char inputData;
|
10
|
+
char inputData;
|
9
|
-
|
11
|
+
|
10
|
-
while(1){
|
12
|
+
while(1){
|
11
|
-
//二分計測したら'0'が送られてくる
|
13
|
+
//二分計測したら'0'が送られてくる
|
12
|
-
if(Serial.available() > 0){
|
14
|
+
if(Serial.available() > 0){
|
13
|
-
inputData = Serial.read();
|
15
|
+
inputData = Serial.read();
|
14
|
-
//データ受信
|
16
|
+
//データ受信
|
15
|
-
//ループ停止信号
|
17
|
+
//ループ停止信号
|
16
|
-
if(inputData == '0'){
|
18
|
+
if(inputData == '0'){
|
17
|
-
break;
|
19
|
+
break;
|
18
|
-
}
|
20
|
+
}
|
19
|
-
else if(inputData == '1'){
|
21
|
+
else if(inputData == '1'){
|
20
|
-
checkflag = 1;
|
22
|
+
checkflag = 1;
|
21
|
-
}
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
if(checkflag == 1){
|
27
|
+
//心電読み込み
|
28
|
+
//データなし
|
29
|
+
if((digitalRead(10) == 1)||(digitalRead(11) == 1)){
|
30
|
+
Serial.println('!');
|
31
|
+
}
|
32
|
+
else{
|
33
|
+
//心電情報送信
|
34
|
+
Serial.println(analogRead(A5));
|
35
|
+
}
|
36
|
+
//1ms待機
|
37
|
+
delay(1);
|
38
|
+
}
|
39
|
+
}
|
22
40
|
}
|
23
41
|
|
24
|
-
i
|
42
|
+
void loop(){
|
25
|
-
//
|
43
|
+
//シリアル信号受信
|
26
|
-
|
44
|
+
HRV_check();
|
27
|
-
|
45
|
+
|
28
|
-
|
46
|
+
exit(0);
|
29
47
|
}
|
48
|
+
```
|
30
|
-
|
49
|
+
【PC側】
|
31
|
-
//心電情報送信
|
32
|
-
Serial.println(analogRead(A5));
|
33
|
-
}
|
34
|
-
//1ms待機
|
35
|
-
|
50
|
+
```python
|
51
|
+
import serial
|
52
|
+
from serial.tools import list_ports
|
36
|
-
|
53
|
+
import time
|
54
|
+
import numpy as np
|
55
|
+
import matplotlib.pyplot as plt
|
56
|
+
from biosppy.signals import ecg
|
57
|
+
import pandas as pd
|
37
|
-
|
58
|
+
import scipy
|
38
|
-
}
|
39
59
|
|
60
|
+
#サンプリング周波数
|
61
|
+
Fs = 512
|
62
|
+
|
63
|
+
#心電計測時間(s)
|
64
|
+
HR_calculate_time = 150
|
65
|
+
|
66
|
+
if __name__ == "__main__":
|
40
|
-
|
67
|
+
main()
|
68
|
+
|
41
69
|
#2分間心電を計測する関数
|
42
70
|
#引数:Arduinoシリアルポート
|
43
71
|
def HRV_check(ser):
|
44
|
-
#時間計測用
|
72
|
+
#時間計測用
|
45
|
-
sum_time = 0
|
73
|
+
sum_time = 0
|
46
|
-
temp_time = 0
|
74
|
+
temp_time = 0
|
47
|
-
#心電計測用
|
75
|
+
#心電計測用
|
48
|
-
hrv_data = []
|
76
|
+
hrv_data = []
|
77
|
+
|
78
|
+
#PCからArduinoへ送る場合
|
79
|
+
ser.write(b'1')
|
80
|
+
#ser.write(moji.encode('utf-8'))
|
81
|
+
print("心電計測中")
|
49
82
|
|
50
|
-
|
83
|
+
while True:
|
84
|
+
temp_time = time.perf_counter()
|
85
|
+
##################計測開始##################
|
86
|
+
#信号読み込み
|
87
|
+
val_arduino = ser.readline()#シリアル通信(PC⇔Arduino)
|
51
|
-
|
88
|
+
print(type(val_arduino))
|
89
|
+
# val_decoded = float(repr(val_arduino.decode())[1:-5])
|
52
|
-
|
90
|
+
val_decoded = val_arduino.strip().decode('UTF-8')
|
91
|
+
#心電情報表示
|
53
|
-
print(
|
92
|
+
print(val_decoded)
|
54
93
|
|
55
|
-
while True:
|
56
|
-
temp_time = time.perf_counter()
|
57
|
-
##################計測開始##################
|
58
|
-
#
|
94
|
+
#取得ミス時
|
59
|
-
val_
|
95
|
+
if val_decoded == '!':
|
60
|
-
print(
|
96
|
+
print(";;\n")
|
97
|
+
#配列がカラなら 0
|
98
|
+
if not hrv_data:
|
99
|
+
hrv_data.append(0)
|
100
|
+
#カラでないなら ひとつ前のデータを
|
101
|
+
else:
|
61
|
-
|
102
|
+
hrv_data.append(hrv_data[-1])
|
62
|
-
|
103
|
+
#正常に取得できていれば配列に追加
|
63
|
-
|
104
|
+
else:
|
105
|
+
print("正常よ")
|
64
|
-
p
|
106
|
+
hrv_data.append(int(val_decoded))
|
65
107
|
|
108
|
+
#################計測終了###################
|
66
|
-
#
|
109
|
+
#時間を加算していく
|
110
|
+
sum_time += (time.perf_counter() - temp_time)
|
111
|
+
#2分経過していたらループを抜ける
|
112
|
+
if sum_time > HR_calculate_time:
|
67
|
-
|
113
|
+
ser.write(b'0')
|
68
|
-
print(";;\n")
|
69
|
-
#配列がカラなら 0
|
70
|
-
if not hrv_data:
|
71
|
-
hrv_data.append(0)
|
72
|
-
#カラでないなら ひとつ前のデータを
|
73
|
-
e
|
114
|
+
break
|
74
|
-
hrv_data.append(hrv_data[-1])
|
75
|
-
#正常に取得できていれば配列に追加
|
76
|
-
else:
|
77
|
-
hrv_data.append(int(val_decoded))
|
78
115
|
|
79
|
-
#################計測終了###################
|
80
|
-
|
116
|
+
def main():
|
81
|
-
s
|
117
|
+
ser = select_port(baudrate = 9600)
|
118
|
+
print("Arduino読み込み")
|
119
|
+
#PC→Arduino
|
120
|
+
#e:終了
|
121
|
+
#s:HRV計測スタート
|
122
|
+
|
82
|
-
#
|
123
|
+
####心電計測フェイズ####
|
124
|
+
while(1):
|
125
|
+
#心電計測
|
126
|
+
input1 = input("まず初めに、2分間心電を計測します。\nokと入力すると、10秒後に計測が開始されます。")
|
127
|
+
|
83
|
-
if
|
128
|
+
if input1 == "ok":
|
84
|
-
|
129
|
+
"心電計測開始"
|
130
|
+
HRV_check(ser)
|
85
|
-
break
|
131
|
+
break;
|
132
|
+
else: print("入力が適切でありません。")
|
133
|
+
####################
|
134
|
+
ser.close()
|
135
|
+
|
136
|
+
```
|
86
137
|
|
87
138
|
試したこと
|
88
139
|
単純にArduinoからdegitalreadした信号をprintlnにて送信する → 動作する。
|
1
テキストが大きく表示されるようになっていたので、「# テキスト」のせいかな?と思い、間の空白を削除しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -58,7 +58,7 @@
|
|
58
58
|
#信号読み込み
|
59
59
|
val_arduino = ser.readline()#シリアル通信(PC⇔Arduino)
|
60
60
|
print(type(val_arduino))
|
61
|
-
#
|
61
|
+
#val_decoded = float(repr(val_arduino.decode())[1:-5])
|
62
62
|
val_decoded = val_arduino.strip().decode('UTF-8')
|
63
63
|
#心電情報表示
|
64
64
|
print(val_decoded)
|