前提・実現したいこと
ser.write(b"75 75")とESP32に送信すると75 75と受け取るのですがser.write(b"ml mr")と送信してもmlとmrの値を入れずにESP32がml mrと受け取ってしまいます。どのようにしたら
ser.write(b"ml mr")でmlとmrの値を入れてESP32に送ることができますか?
分かりづらくてすいません。
該当のソースコード
Python3
1import sys 2import cv2 3import numpy as np 4from time import sleep 5import serial 6import math 7 8cap = cv2.VideoCapture(0) 9 10kp=3 11 12while(True): 13 ret,frame = cap.read() 14 15 frame = cv2.resize(frame,(int(frame.shape[1]*0.2),int(frame.shape[0]*0.3))) 16 #cv2.rectangle(frame,(0,30),(130,150),(0,0,0),thickness=-1) 17 18 cv2.imshow("frame",frame) 19 20 gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) 21 blur = cv2.GaussianBlur(gray,(5,5),0) 22 23 ret,thresh = cv2.threshold(blur,0,255,cv2.THRESH_OTSU) 24 25 color_src01 = cv2.cvtColor(thresh,cv2.COLOR_GRAY2BGR) 26 27 label = cv2.connectedComponentsWithStats(thresh) 28 n = label[0]-1 29 data=np.delete(label[2],0,0) 30 center=np.delete(label[3],0,0) 31 32 for i in range(n): 33 34 x0 = data[i][0] 35 y0 = data[i][1] 36 x1 = data[i][0]+data[i][2] 37 y1 = data[i][1]+data[i][3] 38 cv2.rectangle(color_src01,(x0,y0),(x1,y1),(0,0,255)) 39 40 cv2.putText(color_src01, "X: " + str(int(center[i][0])),(x1 - 30, y1 + 15), 41cv2.FONT_HERSHEY_PLAIN,1,(0,255,255)) 42 43 x2=int(center[i][0]) 44 print(x2) 45 print('X2') 46 47 X3=x2-20 48 x3=abs(X3) 49 print(x3) 50 print('X3') 51 52 ser =serial.Serial('/dev/ttyUSB0', 115200 ,timeout=1) 53 54 if(x2<15): # Left 55 ml=kp*(20+x3) 56 mr=kp*(20-x3)+75 57 58 print("Left") 59 60# ser.write(b"ml mr") 61 #print("ml mr") 62 63 64 elif(15<=x2<25): 65 print("forward") 66 ser.write(b"75 75") 67 68 cv2.imshow("color_src01",color_src01) 69 70 #cv2.imshow('Gray',gray) 71 #cv2.imshow('Blur',blur) 72 #cv2.imshow('1',color_src01) 73 #cv2.imshow('2',label) 74 75 76 77 key = cv2.waitKey(1) 78 if key == 27: 79 break 80 81cap.release() 82cv2,destroyAllWindow() 83 84Ardu 85 86// ヘッダファイル読み込み 87#include <WiFi.h> 88#include <Wire.h> 89#include <WiFiUDP.h> 90#include <WiFiUdp.h> 91 92//モータのpin設定 93#define Ain1 19 94#define Ain2 18 95#define PWMA 4 96 97#define Bin1 25 98#define Bin2 26 99#define PWMB 27 100 101/* チャンネルの定義 */ 102const int CHANNEL_0 = 0; 103const int CHANNEL_1 = 1; 104 105const int LEDC_TIMER_BIT = 8; // PWMの範囲(8bitなら0〜255、10bitなら0〜1023) 106const int LEDC_BASE_FREQ = 12800; // 周波数(Hz) 107const int VALUE_MAX = 255; // PWMの最大値 108 109void setup() { 110 111 pinMode(Ain1, OUTPUT); 112 pinMode(Ain2, OUTPUT); 113 pinMode(PWMA, OUTPUT); 114 pinMode(Bin1, OUTPUT); 115 pinMode(Bin2, OUTPUT); 116 pinMode(PWMB, OUTPUT); 117 118 // ピンのセットアップ 119 ledcSetup(CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_BIT); 120 ledcSetup(CHANNEL_1, LEDC_BASE_FREQ, LEDC_TIMER_BIT); 121 122 // ピンのチャンネルをセット 123 ledcAttachPin(PWMA, CHANNEL_0); 124 ledcAttachPin(PWMB, CHANNEL_1); 125 126 Serial.begin(115200); //通信速度が115200 127} 128 129 130void loop() { // 131//------------------------------------------------------ 132 if (Serial.available() > 0) 133 { 134 135 long dub = 1, dub2=1; 136 137 delay(20); // 受信データが貯まるまで20ms待つ 138 byte data_size = Serial.available(); //受信データサイズを「data_size」に収める 139 byte buf[data_size]; //データサイズが0以上なら、一気に「buf[]」へ格納する 140 byte buf1[data_size]; 141 byte buf2[data_size]; 142 long motor1 = 0; //byte型は0~255までしか使えない long型は32bit +-10桁使える 143 long motor2 = 0; //byte型は0~255までしか使えない long型は32bit +-10桁使える 144 byte x=0, x2=0, i_space=0; 145 byte size1=0, size2=0; 146 147 bool minus = 0, minus2=0; // 148 bool flag_space = 0; 149 150 Serial.print("data size:"); 151 Serial.println(data_size); // printlnは改行+復帰 152 153 // bufに数値データを読み込む 154 for (byte i = 0 ; i < data_size ; i++) 155 { 156 //buf[i] = Serial.read() - '0'; 157 buf[i] = Serial.read(); //受信したシリアルデータを読む。 158 159 if (buf[i] == ' '){ i_space = i; //スペースが見つかれば 160 Serial.print("i_space= "); 161 Serial.println(i_space); 162 } 163 if(i_space == 0){ 164 if (buf[0] == '-') minus = 1; //先頭に‘ – ’の文字があれば配列から省く 165 else{ 166 buf[i] -= '0'; 167 buf1[i] = buf[i]; 168 } 169 if( minus == 1 && i>0){ 170 buf[i] -= '0'; 171 buf1[i] = buf[i]; 172 } 173 174 Serial.print(" buf1="); 175 Serial.print(buf1[i]); 176 Serial.println(" "); 177 178 size1= i+1; 179 180 } 181 else if(i_space > 0 && i > i_space){ 182 if (buf[i_space+1] == '-') minus2 = 1; //先頭に‘ – ’の文字があれば配列から省く 183 else{ 184 buf2[i-i_space-1] = buf[i]; 185 buf2[i-i_space-1] -= '0'; 186 } 187 if( minus2 == 1 && i > i_space+1){ 188 buf2[i-i_space-1] = buf[i]; 189 buf2[i-i_space-1] -= '0'; 190 } 191 192 Serial.print(" buf2="); 193 Serial.print(buf2[i-i_space-1]); 194 Serial.println(" "); 195 196 size2= i-i_space-1+1; 197 198 } 199/* 200 else(i > i_space){ 201 buf2[0] -= '0'; //‘ ’(space)の文字があれば配列から省く 202 if (buf2[0] == '-') minus = 1; //先頭に‘ – ’の文字があれば配列から省く 203 else buf[i] -= '0'; 204 if( minus == 1 && i>0) buf[i] -= '0'; 205*/ 206/* 207 Serial.print("i="); //テスト用 208 Serial.print(i); 209 Serial.print(" buf1="); 210 Serial.print(buf1[i]); 211 Serial.println(" "); 212*/ 213 214 } 215 // モータの値を算出 216 for (byte i = 0; i < (size1 - minus) ; i++) 217 { 218 x = size1 -1 - i; //配列を反転 219 motor1 = dub*buf1[x] + motor1; 220 //motor = dub*buf[x] + motor; 221 //Serial.print("motor= "); 222 //Serial.println(motor); 223 dub = 10*dub; // 配列ごとの数値を桁数合わせて足し算 224 } 225 if (minus == 1) motor1 = -1*motor1; //先頭に‘ – ’の文字があれば-1をかけて負の数値になる。 226 227 Serial.print("motor1= "); 228 Serial.println(motor1); 229 230 for (byte i = 0; i < (size2 - minus2) ; i++) 231 { 232 x = size2 - 1 - i; //配列を反転 233 motor2 = dub2*buf2[x] + motor2; 234 //motor = dub*buf[x] + motor; 235 //Serial.print("motor= "); 236 //Serial.println(motor); 237 dub2 = 10*dub2; // 配列ごとの数値を桁数合わせて足し算 238 } 239 240 if (minus2 == 1) motor2 = -1*motor2; //先頭に‘ – ’の文字があれば-1をかけて負の数値になる。 241 242 Serial.print("motor2= "); 243 Serial.println(motor2); 244 245 246//------------------------------------------------------ 247 if (motor1 >= 0) // motor1の数値が0以上の場合 248 { 249 digitalWrite(Bin1,1); // 左 正転 250 //digitalWrite(PWMB,0); 251 ledcWrite(1,motor1); 252 } 253 254 if (motor2 >= 0) // motor2の数値が0以上の場合 255 { 256 digitalWrite(Ain1,1); // 右 正転 257 //digitalWrite(PWMB,0); 258 ledcWrite(0,motor2); 259 } 260 261 } 262 263}
回答1件
あなたの回答
tips
プレビュー