🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2331閲覧

PythonとESP32の複数の変数をいれたシリアル通信のについて

schrott

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/01/14 08:05

編集2021/01/15 12:04

前提・実現したいこと

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}

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

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

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

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

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

y_waiwai

2021/01/14 08:37

ml とmr とはなんでしょうか
schrott

2021/01/15 09:27

mlはmotorLeft mrはmotorRight の略です。
guest

回答1

0

ベストアンサー

PHP、Cake PHP はタグが違うので外してくださいね。

format で文字列を作ってからそれを encode してバイナリにしましょう。

Python

1s = '{:d} {:d}'.format(ml, mr) 2b = s.encode() 3ser.write(b)

投稿2021/01/14 08:36

A_kirisaki

総合スコア2853

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

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

schrott

2021/01/15 09:36

実行してみたところ ser.write(b'ml mr') (mlとmrに数値は入ってます。) 数値は入っているのですが、 ser.write(b゛75 75゛)のようには動かないです。 どのようにしたら良いでしょう? (Esp32にはmlスペースmrとして送りたいのです)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問