openmv:

import sensor, image, time
from pyb import LED, UART
#import lcd
import json, ustruct class Elecdesign(object): def __init__(self):
sensor.reset()
# 图像翻转
# sensor.set_vflip(True)
# sensor.set_hmirror(True)
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA) # 320x240
#sensor.set_windowing((480, 480))
sensor.skip_frames(time=900)
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)
# 获取三种颜色的灯
self.red_led = LED(1)
self.green_led = LED(2)
self.blue_led = LED(3)
#self.red_threshold = (92, 0, -56, 34, -36, 76)
self.red_threshold = (100, 0, -84, 17, -59, 94)
#self.green_threshold = (100, 0, -39, 40, -67, 127)
self.green_threshold = (100, 0, 93, -12, -54, 71)
self.uart_middle = UART(3, 19200)
#self.uart_middle.init(115200, bits=8, parity=None, stop=1)
#self.uart_green = UART(1, 115200)
# 误差消除
self.square_detlax = 2
self.square_detlay = 2
#
self.real_roi = (70, 48, 126, 143) # 320 240
self.left_corner = (70, 48) # 左上角点
self.left_down_corner = 0 # 左下角
self.right_corner = (196, 191) # 右下角点
self.right_up_corner = 0 # 右上角
self.w = 0
self.h = 0
self.middle_dot = 0 # 中心点 # 关灯
def close_rgb(self):
self.red_led.off()
self.green_led.off()
self.blue_led.off() # 开白灯
def while_rgb(self):
self.close_rgb()
self.red_led.on()
self.green_led.on()
self.blue_led.on() # 开红灯
def red_rgb(self):
self.close_rgb()
self.red_led.on() # 开绿灯
def green_rgb(self):
self.close_rgb()
self.green_led.on() # 开蓝灯
def blue_rgb(self):
self.close_rgb()
self.blue_led.on() # 与arduino通信
def chat_arduino(self, string):
self.uart_middle.write(json.dumps(string))
print("已发送:", string) # 接受消息
def recv_arduino(self):
recv = self.uart_middle.read()
if recv:
return recv
else:
return None # 返回指定色块相对于图像中的坐标(中心点)
def dot_identify(self, thresholds, img):
most_pixels = 0
max_x = 0
if img:
#blob0 = img.find_blobs([thresholds], pixels_threshold=2, area_threshold=2, merge=True, invert=True)
blob0 = img.find_blobs([thresholds],x_stride=1, y_stride=1, area_threshold=0, pixels_threshold=0,merge=False, margin=1, invert=True)
if blob0:
for n in range(len(blob0)):
if blob0[n].pixels() > most_pixels:
most_pixels = blob0[n].pixels()
max_x = n
img.draw_rectangle(blob0[max_x].x(), blob0[max_x].y(), blob0[max_x].w(), blob0[max_x].h(),
color=(0, 0, 255), thickness=1, fill=False)
img.draw_cross(blob0[max_x].x() + int(blob0[max_x].w() / 2), blob0[max_x].y() + int(
blob0[max_x].h() / 2), color=(0, 0, 255), size=1, thickness=1)
return blob0[max_x].x() + int(blob0[max_x].w() / 2), \
blob0[max_x].y() + int(blob0[max_x].h() / 2)
else:
return 0
else:
return 0 def change_mode_dot(self):
sensor.reset()
sensor.set_auto_gain(False)
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA) # 320x240
sensor.skip_frames(n=10)
sensor.set_auto_exposure(False, 1000)#在这里调节曝光度,调节完可以比较清晰地看清激光点
sensor.set_auto_whitebal(False) # turn this off.
sensor.set_auto_gain(False) # 关闭增益(色块识别时必须要关) def change_mode_square(self):
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
#sensor.set_framesize(sensor.QQVGA) # 240x160
sensor.set_framesize(sensor.QVGA) # 320x240
sensor.skip_frames(n=10)
sensor.set_auto_whitebal(False)
sensor.set_auto_gain(False) def find_max_square(self, blobs):
max_size=0
for blob in blobs:
if blob[2]*blob[3] > max_size:
max_blob=blob
max_size = blob[2]*blob[3]
return max_blob def square_type_change(self, data):
string = ""
for j in data:
string = string + str(j)
return "{"+string+"}" # 找方块
def square_identify(self, img):
blobs = img.find_rects(roi=self.real_roi, threshold = 30000)
if blobs:
r = self.find_max_square(blobs)
else:
return 0
img.draw_rectangle(r.rect(), color = (255, 0, 0))
#print(r.corners())
dot1 = (r.corners()[0][0]+self.square_detlax, r.corners()[0][1]-self.square_detlay)
dot2 = (r.corners()[1][0]-self.square_detlax, r.corners()[1][1]-self.square_detlay)
dot3 = (r.corners()[2][0]-self.square_detlax, r.corners()[2][1]+self.square_detlay)
dot4 = (r.corners()[3][0]+self.square_detlax, r.corners()[3][1]+self.square_detlay)
corners = (dot1, dot4, dot3, dot2)
for p in corners:
img.draw_circle(p[0], p[1], 1, color = (0, 255, 0))
#print(self.square_type_change(corners))
#return self.square_type_change(corners)
#print(corners)
return corners # 像素点到具体坐标转换(中间为原点)
def change_dot_type(self, dot):
if dot == 0:
return 0
x, y = dot
x0, y0 = self.left_corner
xt, yt = self.right_corner
return int((((x-x0)*0.5)/(xt-x0)-0.25)*1000), int((-((y-y0)*0.5)/(yt-y0)+0.25)*1000) # 左上角到右下角点推roi
def count_roi(self):
if self.left_corner and self.right_corner:
self.real_roi = (self.left_corner[0], self.left_corner[1],\
self.right_corner[0]-self.left_corner[0], self.right_corner[1]-self.left_corner[1])
return True
else:
return False # 初始化幕布大小
#def init_background(self):
#type_dot = 0 # 1 左上 2 右下
#while 1:
#while 1:
#data = self.recv_arduino()
#if data == "left":
#type_dot = 1
#break
#elif data == "right":
#type_dot = 2
#break
#elif data == "EOF":
#return
#sensor.skip_frames(n=10)
#img = sensor.snapshot()
#if type_dot == 1:
#self.left_corner = self.dot_identify(self.red_threshold, img)
#elif type_dot == 2:
#self.right_corner = self.dot_identify(self.red_threshold, img) def run_dot(self):
self.change_mode_dot()
while 1:
img = sensor.snapshot()
print(self.dot_identify(self.red_threshold, img)) def run_square(self):
self.change_mode_square()
while 1:
img = sensor.snapshot().lens_corr(strength = 1.8, zoom = 1.0)
self.square_identify(img)
#lcd.display(img) def run_chat(self):
while 1:
data = self.recv_arduino()
if data:
data = data.decode("utf-8")
time.sleep(1) # 计算其他两个点
def find_two_dot(self):
self.left_down_corner = (self.right_corner[0], self.left_corner[1])
self.right_up_corner = (self.left_corner[0], self.right_corner[1])
self.middle_dot = (int((self.left_corner[0] + self.right_corner[0])/2), \
int((self.left_corner[1] + self.right_corner[1])/2))
self.h = self.right_corner[1] - self.left_corner[1]
self.w = self.right_corner[0] - self.left_corner[0]
self.count_roi() # 初始化
def first_init(self):
#self.change_mode_dot()
while 1:
data = self.recv_arduino()
sensor.snapshot()
if data:
data = data.decode("utf-8")
print("接受消息:", data)
if data=="O":
break
while 1:
img = sensor.snapshot()
dot = self.dot_identify(self.red_threshold, img)
if dot:
print("dot1", dot)
self.left_corner = dot
break
while 1:
data = self.recv_arduino()
sensor.snapshot()
if data:
data = data.decode("utf-8")
print("接受消息:", data)
if data=="O":
break
while 1:
img = sensor.snapshot()
dot = self.dot_identify(self.red_threshold, img)
if dot:
print("dot2", dot)
self.right_corner = dot
break
self.find_two_dot()
print("初始化成功,四个点为:", self.left_corner, self.right_up_corner, self.right_corner, self.left_down_corner)
self.green_rgb()
time.sleep(1)
self.close_rgb() # 发送边框
def send_four_dot(self):
dot_real_set = []
while 1:
img = sensor.snapshot().lens_corr(strength = 1.8, zoom = 1.0)
dot_set = self.square_identify(img)
if dot_set:
for dot in dot_set:
dot_real_set.append(self.change_dot_type(dot))
#return self.square_type_change(tuple(dot_real_set))
dot_real_set = self.square_type_change(tuple(dot_real_set))
self.uart_middle.write(str(dot_real_set))
print("已发送:", str(dot_real_set))
self.green_rgb()
time.sleep(1)
self.close_rgb()
break # 发送单点
def send_one_dot(self):
while 1:
sensor.snapshot()
data = self.recv_arduino()
#print(data)
if data:
data = data.decode("utf-8")
print(data)
if data == "D":
return
if data == "O":
img = sensor.snapshot()
dot = self.dot_identify(self.red_threshold, img)
print(dot)
self.uart_middle.write("{"+str(self.change_dot_type(dot))+"}")
#print(str(self.change_dot_type(dot))) def main_run(self):
while 1:
order = self.recv_arduino()
sensor.snapshot()
if order:
print(order)
order = order.decode("utf-8")
print("接受消息:", order)
if order=="A":
#self.recv_arduino()
self.red_rgb()
self.change_mode_dot()
self.first_init()
elif order=="B":
self.blue_rgb()
self.change_mode_square()
self.send_four_dot()
elif order=="C":
self.change_mode_dot()
self.send_one_dot() def test_run1(self):
strr = "{(-379, 3)(290, 38)(258, 430)(-411, 409)}"
#self.change_mode_square()
while 1:
a = self.send_four_dot()
#order = self.recv_arduino()
#if order:
#self.uart_middle.write(strr)
#print("已发送:", strr) def print_dot(self):
#new_list = []
f = open("text.txt", "w")
self.change_mode_dot()
while 1:
order = self.recv_arduino()
sensor.snapshot()
if order:
order = order.decode("utf-8")
if order == "O":
img = sensor.snapshot()
dot = self.dot_identify(self.red_threshold, img)
print(dot)
f.write(str(dot)+"\n")
#f.flush()
elif order == "E":
f.close()
break if __name__ == '__main__':
recognition = Elecdesign()
#recognition.run_dot()
#recognition.run_square()
recognition.main_run()
#recognition.test_run1()
#recognition.print_dot()

arduino(主控):

#include <LobotServoController.h>
#include <SoftwareSerial.h> // 引用BT函数库
#include <math.h>
#include <U8g2lib.h>
#include <OneButton.h> #define KEY_FUNCTION 7 // 功能键
#define KEY_STOP 5 // 急停按键
#define light_ring 13 OneButton button_7(KEY_FUNCTION, false);
OneButton button_5(KEY_STOP, false);
U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);
LobotServoController myse;
SoftwareSerial BT(8, 9); // 接收脚,传送脚
LobotServo servos[2]; uint8_t type=1; // 模式 1 reset 2 绕边框移动 3 寻黑边
int stop_sign=0;
int positionxxx;
int id1=1;
int id2=2;
int init_positionx = 1500;
int init_positiony = 1515;
int edge_positionx;
int edge_positiony;
int positionx1;
int positiony1;
int time=100;
int i;
double xangle;//横轴角度
double yangle;//纵轴角度
double x;//横轴坐标
double y;//纵轴坐标
double deltax=0.01;//横轴偏移
double deltay=0;
//double deltay=(7*PI)/250;//纵轴调整
//double deltay=56/(PI*2000);
// double deltay=56/2000*PI;
double r=0.06;//舵机长度,舵机选择半径
double psi;//计算角度
double k_x=4000/(3*PI);//横轴为270°舵机
double k_y=2000/PI; //纵轴为180°舵机
double result1;
double result2; // 创建接受结构体
typedef struct
{
int data[4][2] = {{0,0}};
int len = 0;
}List; typedef struct
{
int data[1][2] = {{0,0}};
}Dot; typedef struct
{
int target_val; //目标值
int actual_val; //实际值
float err; //定义当前偏差值
float err_next; //定义下一个偏差值
float err_inter;
float err_last; //定义最后一个偏差值
float Kp, Ki, Kd; //定义比例、积分、微分系数
}_pid; _pid turnx;
_pid turny; String detectString();
int chuanhan(float x, float y, float r);
Dot recv_one_dot();
List recv_four_dot();
void alert();
void stop_alert();
void click_7();
void longclick_7();
void click_6();
void click_5();
void surround();
void surround_black();
void UI_show_flash();
void UI_show_reset();
void UI_show_stop();
void UI_show_rect();
void UI_show_edge();
void UI_show_error(); void setup() {
Serial.begin(9600); //舵机控制板控制串口
//Serial.println("BT is ready!");
BT.begin(19200); //openmv串口
u8g2.begin(); // 启动u8g2 128×64
u8g2.setFont(u8g2_font_callite24_tr);
servos[0].ID=id1;
servos[1].ID=id2;
pinMode(light_ring, OUTPUT); // 声光提示
button_7.reset();//清除一下按钮状态机的状态
button_7.attachClick(click_7); // 单击
button_7.attachLongPressStart(longclick_7); // 长按
button_5.reset();
button_5.attachClick(click_5);
} void turn_param_init(void)
{
turnx.target_val=0;
turnx.actual_val=0.0;
turnx.err = 0.0;
turnx.err_last = 0.0;
turnx.err_inter = 0.0; turnx.Kp = 1.0;
turnx.Ki = 0.1;
//  turn.Kd = 1;
} void turn_param_initY(void)
{
turny.target_val=0;
turny.actual_val=0.0;
turny.err = 0.0;
turny.err_last = 0.0;
turny.err_next = 0.0; turny.Kp = 2;
turny.Ki = 0.1;
//  turn.Kd = 1;
} float turn_pid_realizeX(float actual_val)
{
/*计算目标值与实际值的误差*/
turnx.err = -turnx.target_val + actual_val;
Serial.print("err:");
Serial.println(turnx.err);
if(turnx.err<10 && turnx.err>-10)
{
turnx.target_val=0;
turnx.actual_val=0.0;
turnx.err = 0.0;
turnx.err_last = 0.0;
turnx.err_inter = 0.0; // goto EXIT;
}
/*PID算法实现*/
// turnx.actual_val = turnx.actual_val+ (0*(turnx.err - turnx.err_next) + 1*turnx.err);
//                   + turn.Kd*(turn.err - 2 * turn.err_next + turn.err_last);
else{
turnx.actual_val += 0.3*(turnx.err) + 0.2*turnx.err_inter;
//                   + turn.Kd*(turn.err - 2 * turn.err_next + turn.err_last);
//  /*传递误差*/
//  turn.err_last = turn.err_next;
turnx.err_inter += turnx.err;
Serial.print("actual_val:");
Serial.println(turnx.err_inter);
Serial.println(turnx.actual_val);}
//  turn.err_last = turn.err_next;
// turnx.err_next = turnx.err;
/*返回当前实际值*/
return turnx.actual_val;
} float turn_pid_realizeY(float actual_val)
{
/*计算目标值与实际值的误差*/
turny.err = turny.target_val-actual_val;
/*PID算法实现*/
turny.actual_val += turny.Kp*(turny.err - turny.err_next) + turny.Ki*turny.err;
//                   + turn.Kd*(turn.err - 2 * turn.err_next + turn.err_last);
/*传递误差*/
//  turn.err_last = turn.err_next;
turny.err_next = turny.err;
/*返回当前实际值*/
return turny.actual_val;
} String detectString() // 判断传入的字符串能否被接收
{
// 我们传入的数据形式 you send: {(90, 101)}
while(BT.read() != '{'); //返回"{}"中的字符串
return(BT.readStringUntil('}'));
} double x_chuanhan(double x)
{
// x=-x;
// xangle=atan(x);
// result1=k_x*xangle+1500;
// return result1; psi=atan(1/(deltax+x));
if(x>0){xangle=acos(deltax/(sqrt(1+sq(deltax+x))))-psi;}
if(x<0){xangle=PI-(acos(deltax/(sqrt(1+sq(deltax+x))))-psi);}
if(x<0){result1=-x*x+k_x*xangle+1500;}
if(x>0){result1=-x*x-k_x*xangle+1500;}
return result1; // result1=-428.68*x+1499;
// return result1;
} double y_chuanhan(double x, double y)
{
if (r+y>0){
psi=atan(sqrt(1+sq(x))/(r+y));
yangle=acos(r/(sqrt(1+sq(x)+sq(r+y))))-psi-deltay;
result2=k_y*(0.850882)*yangle+1515;}
else if (r+y<0){
psi=atan(sqrt(1+sq(x))/(r+y));
yangle=acos(-(r/(sqrt(1+sq(x)+sq(r+y)))))+psi+deltay;
result2=-k_y*yangle+1515;}
else if (r+y==0){
yangle=asin(-r);
result2=k_y*yangle+1515;}
return result2; // result2=-192*sq(y)-572*y+1515;
// return result2;
} Dot recv_one_dot(){
Dot dot;
// BT.print("1");
// Serial.println("123");
while(1){
if(BT.available()) break;
}
// Serial.println("321");
String s = detectString();
// Serial.println(s);
String numStr = "";
for(int i = 0; i<s.length(); i++)
{
if(s[i]=='(')
{
numStr = "";
}
else if(s[i] == ',')
{
dot.data[0][0] = numStr.toInt(); numStr = ""; // 清空numstr,方便接受','后的另一组数据
}
else if(s[i]==')') // 读到结尾
{
dot.data[0][1] = numStr.toInt();
numStr = "";
}
else // 读到数据
{
numStr += s[i];
}
}
return dot; // 拿到一个数据点 有放大1000倍
} List recv_four_dot(){
List four_dot;
while(1){
if(BT.available()) break;
}
delay(500); // 等待数据发完
String s = detectString();
Serial.println(s);
String numStr = "";
for(int i = 0; i<s.length(); i++)
{
if(s[i]=='(')
{
numStr = "";
}
else if(s[i] == ',')
{
four_dot.data[four_dot.len][0] = numStr.toInt(); numStr = ""; // 清空numstr,方便接受','后的另一组数据
}
else if(s[i]==')') // 读到结尾
{
four_dot.data[four_dot.len][1] = numStr.toInt();
numStr = "";
four_dot.len++;
}
else // 读到数据
{
numStr += s[i];
}
}
// Serial.println(four_dot.data[0][0]);
// Serial.println(four_dot.data[0][1]);
// Serial.println(four_dot.data[1][0]);
// Serial.println(four_dot.data[1][1]);
// Serial.println(four_dot.data[2][0]);
// Serial.println(four_dot.data[2][1]);
// Serial.println(four_dot.data[3][0]);
// Serial.println(four_dot.data[3][1]);
return four_dot; // 四个点,按顺序读取即可
} void alert(){
digitalWrite(light_ring, HIGH);
} void stop_alert(){
digitalWrite(light_ring, LOW);
} void UI_show_flash(){
char m_str[1];
strcpy(m_str, u8x8_u8toa(type, 1));
u8g2.firstPage();
do {
u8g2.drawStr(0, 40,"Mode:");
u8g2.drawStr(70, 40, m_str);//在指定位置显示字符串
} while ( u8g2.nextPage() );
} void UI_show_reset(){
u8g2.firstPage();
do {
u8g2.drawStr(0, 40,"reset!");
} while ( u8g2.nextPage() );
} void UI_show_stop(){
u8g2.firstPage();
do {
u8g2.drawStr(0, 40,"stop!");
} while ( u8g2.nextPage());
} void UI_show_edge(){
u8g2.firstPage();
do {
u8g2.drawStr(0, 40,"Edge!");
} while ( u8g2.nextPage());
} void UI_show_rect(){
u8g2.firstPage();
do {
u8g2.drawStr(0, 40,"Rect!");
} while ( u8g2.nextPage());
} void UI_show_rect_1(){
u8g2.firstPage();
do {
u8g2.drawStr(0, 40,"Rect_1!");
} while ( u8g2.nextPage());
} void UI_show_error(){
u8g2.firstPage();
do {
u8g2.drawStr(0, 40,"error!");
} while ( u8g2.nextPage());
} void click_7(){
Serial.println("click");
type++;
if(type>5){
type=1;
}
UI_show_flash();
} void longclick_7(){
// Serial.println("long_click");
if(type==1){ // reset
UI_show_reset();
click_6();
}else if(type==2){
UI_show_edge(); // 绕边框移动
surround();
}else if(type==3){
UI_show_rect_1();
rect_1();
}else if(type==4){
UI_show_rect(); // 绕黑边移动
surround_black(); }else if(type==5){
// PID_turn();
tick();
}
else{
UI_show_error();
}
} void tick(){
for(int i=0;i<=215;i+=2)
{
servos[0].Position=1605-i;
for(int j=0;j<=286;j+=2)
{
servos[1].Position=1646-j;
myse.moveServos(servos,2,100);
delay(110);
BT.print("O");
delay(200);
}
}
BT.print("E");
} // void PID_turn(){
// while(1)
// {
// if (turn.err>4 || turn.err<-4)
// {
// BT.print("O");
// dot=recv_one_dot();
// turn.actual_val=dot.data[0];
// positionx=turn_pid_realize()+500;
// servos[0].Position=positionx;
// myse.moveServos(servos,2,200);
// }
// else
// {
// break;
// }
// }
// } void PID_turn(Dot dot){
//actual_val=dot.data[0][0];
// if (turnx.err>4 || turnx.err<-4)
// {
// BT.print("O");
// dot=recv_one_dot();
// positionx=turn_pid_realize()+500;
positionxxx=turn_pid_realizeX(dot.data[0][0])+1500;
if(turnx.err!=0.0)
{servos[0].Position=positionxxx;
Serial.println("123");
Serial.println(servos[0].Position);}
// myse.moveServos(servos,2,200);
// }
} // 复位函数
void click_6(){
// Serial.println("reset!");
myse.moveServo(id1,init_positionx,50);
myse.moveServo(id2,init_positiony,50);
UI_show_reset();
delay(1000);
} // 具体写死的移动函数
void surround(){
BT.print("A");
delay(1000);
// 左上
servos[0].Position=1605;
servos[1].Position=1646;
myse.moveServos(servos,2,200);
delay(220);
delay(1000);
BT.print("O"); // 告诉openmv快看
delay(1000);
// 右上
servos[0].Position=1390;
servos[1].Position=1646;
myse.moveServos(servos,2,200);
delay(220);
delay(1000);
// 右下
servos[0].Position=1390;
servos[1].Position=1360;
myse.moveServos(servos,2,200);
delay(220);
delay(1000);
BT.print("O"); // 告诉openmv快看
delay(1000);
// 左下
servos[0].Position=1605;
servos[1].Position=1360;
myse.moveServos(servos,2,200);
delay(220);
delay(1000);
// 左上
servos[0].Position=1605;
servos[1].Position=1646;
myse.moveServos(servos,2,200);
delay(220);
delay(1000);
// 回中
servos[0].Position=init_positionx;
servos[1].Position=init_positiony;
myse.moveServos(servos,2,200);
delay(220);
UI_show_flash();
return;
} void rect_1(){
delay(1000);
// 左上
servos[0].Position=1604;
servos[1].Position=1643;
myse.moveServos(servos,2,200);
delay(220);
delay(2000);
// 右上
servos[0].Position=1486;
servos[1].Position=1644;
myse.moveServos(servos,2,500);
delay(520);
delay(2000);
// 右下
servos[0].Position=1486;
servos[1].Position=1537;
myse.moveServos(servos,2,200);
delay(220);
delay(2000);
// 左下
servos[0].Position=1604;
servos[1].Position=1536;
myse.moveServos(servos,2,200);
delay(220);
delay(2000);
// 左上
servos[0].Position=1602;
servos[1].Position=1639;
myse.moveServos(servos,2,200);
delay(220);
delay(2000);
// 归中
servos[0].Position=init_positionx;
servos[1].Position=init_positiony;
myse.moveServos(servos,2,200);
delay(220); } void surround_black(){
BT.print("B");
delay(1000);
List dot_list = recv_four_dot();
dot_list.len = 0;
// BT.print("C");
// delay(1000);
for(dot_list.len; dot_list.len<=3; dot_list.len++){
// EXIT:
// Serial.println(dot_list.data[dot_list.len][0]);
// Serial.println(dot_list.data[dot_list.len][1]);
// Serial.println(double(dot_list.data[dot_list.len][0]/1000.0), 3);
// Serial.println(double(dot_list.data[dot_list.len][1]/1000.0), 3);
servos[0].Position=x_chuanhan(double(dot_list.data[dot_list.len][0])/1000.00000);
servos[1].Position=y_chuanhan(double(dot_list.data[dot_list.len][0])/1000.00000, double(dot_list.data[dot_list.len][1])/1000.00000);
myse.moveServos(servos,2,200);
delay(220);
delay(1000);
// turnx.target_val = dot_list.data[dot_list.len][0];
// Serial.println("qweqwe");
// Serial.println(turnx.target_val);
// while(1){
// // delay(1000);
// BT.print("O");
// Dot dot = recv_one_dot();
// Serial.println("321");
// Serial.println(dot.data[0][0]);
// PID_turn(dot);
// if(turnx.err<10 && turnx.err>-10)
// {
// turnx.err=0;
// break;
// }
// myse.moveServos(servos,2,200);
// delay(220);
// delay(1000);
// }
}
servos[0].Position=x_chuanhan(double(dot_list.data[0][0])/1000.00000);
servos[1].Position=y_chuanhan(double(dot_list.data[0][0])/1000.00000, double(dot_list.data[0][1])/1000.00000);
myse.moveServos(servos,2,200);
delay(220);
delay(1000);
// BT.print("D");
} void click_5(){
stop_sign=1;
} void loop(){
button_7.tick();
}

2023电赛E题代码的更多相关文章

  1. TI MSP430工程配置及2019年电赛A题编程示例(使用430 F5529)

    配置 第一步:右击工程,选择Options 第二步:在General Options的Target选项卡里选择对应的器件Device,这里是MSP430G2231 第三步:在Debugger里选择FE ...

  2. 2018年数学建模国赛B题 智能RGV的动态调度策略

    第一种情况大致思路: 每秒判断各个CNC的状态,若工作完成或者是出于空闲状态下则向RGV发出一个请求.同时,RGV每秒判断自己的状态(上下料.移动.闲置.清洗等),如果是处于闲置状态,则启用调度算法, ...

  3. 杭电acm 1038题

    本题比较简单,但是需要掌握几个小技巧,先上代码 /************************************* 杭电ACM 1038题,已AC ********************* ...

  4. 杭电acm 1033题

    Problem Description For products that are wrapped in small packings it is necessary that the sheet o ...

  5. 2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

    2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh ...

  6. HDU-5532//2015ACM/ICPC亚洲区长春站-重现赛-F - Almost Sorted Array/,哈哈,水一把区域赛的题~~

    F - Almost Sorted Array Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  7. ACM-ICPC 2019南昌网络赛F题 Megumi With String

    ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...

  8. ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval

    ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ...

  9. 2019ICPC南京网络赛A题 The beautiful values of the palace(三维偏序)

    2019ICPC南京网络赛A题 The beautiful values of the palace https://nanti.jisuanke.com/t/41298 Here is a squa ...

  10. Python解答蓝桥杯省赛真题之从入门到真题(二刷题目一直更新)

    蓝桥刷题 原文链接: https://github.com/libo-sober/LanQiaoCup Python解答蓝桥杯省赛真题之从入门到真题 不同字串 """ 一 ...

随机推荐

  1. IvorySQL 4.2 发布

    IvorySQL 4.2 已于 2025 年 1 月 13 日正式发布.新版本全面支持 PostgreSQL 17.2,并修复了多项 bug. 增强功能 PostgreSQL 17.1 增强功能 确保 ...

  2. Netty源码—2.Reactor线程模型一

    大纲 1.关于NioEventLoop的问题整理 2.理解Reactor线程模型主要分三部分 3.NioEventLoop的创建 4.NioEventLoop的启动 1.关于NioEventLoop的 ...

  3. 【Docker】简介

    Docker 简介 某个应用,如果可以提供服务,那么就可以打包成docker供给他人使用 是什么 我们具体来看看Docker. 大家需要注意,Docker本身并不是容器,它是创建容器的工具,是应用容器 ...

  4. fdMemtable FDQuery json之间的一些关系

    1 procedure TForm1.btn1Click(Sender: TObject); 2 var ss,ss1: TStringStream; 3 begin 4 ss := TStringS ...

  5. HTB打靶记录-EscapeTwo

    信息收集 nmap -sV -sC -O 10.10.11.51 Starting Nmap 7.95 ( https://nmap.org ) at 2025-04-05 14:52 CST Sta ...

  6. 机器人操作系统ROS2之安装(Ubuntu 24)

    根据官网说明,ROS2是支持MAC的,本来打算在手头的MAC 15.3.2装一个,虽然要自己编译ROS2系统,但是想着比虚拟机性能好,就兴冲冲的开始了,也没在意官网提示尽量还是装安装版.最后折腾了几天 ...

  7. 获取img标签文件大小

    创建一个请求,然后查看返回的content-length img.src.length * 0.75 canvas转base64后

  8. 关于composer报错The openssl extension is required for SSL/TLS protection but is not available问题

    今天使用composer的时候得到了这个错误: The openssl extension is required for SSL/TLS protection but is not availabl ...

  9. Web前端开发规范手册(有点老,仅供参考)

    一.规范目的 1.1 概述 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进行前台页面开发. 本 ...

  10. 容器镜像基础(nydus)

    " 包括 nydus 的基本概念.架构和容器镜像加速使用方法. 1. nydus 1.1 存在的问题 对于容器镜像使用者 问题一:启动容器慢:容器启动慢的情况普遍发生在当用户启动一个很大的容 ...