From 05ce129d1977a16c5c0e7869de7b8b42d03531f3 Mon Sep 17 00:00:00 2001 From: clf3 Date: Tue, 12 Sep 2023 17:14:26 +0800 Subject: [PATCH] ship with detect --- remote_controler/remote_controler.ino | 5 +- .../remote_controler_board_2_vertical.ino | 110 ++++++++ ship/ship.ino | 7 +- ship_with_detect/ship_with_detect.ino | 238 ++++++++++++++++++ 4 files changed, 353 insertions(+), 7 deletions(-) create mode 100644 remote_controler_board_2_vertical/remote_controler_board_2_vertical.ino create mode 100644 ship_with_detect/ship_with_detect.ino diff --git a/remote_controler/remote_controler.ino b/remote_controler/remote_controler.ino index d538d6a..c73b4f5 100644 --- a/remote_controler/remote_controler.ino +++ b/remote_controler/remote_controler.ino @@ -38,10 +38,11 @@ void loop() { sending_signal=0; propeller=analogRead(Rp); rudder=analogRead(Rr); - propeller=propeller*1.41; - rudder=rudder*1.41; + propeller=propeller*1.18; + rudder=rudder*1.18; if(propeller>=1000)propeller=999; if(rudder>=1000)rudder=999; + rudder=999-rudder; sending_signal+=propeller; sending_signal+=rudder*1000; sending_signal+=1000000; diff --git a/remote_controler_board_2_vertical/remote_controler_board_2_vertical.ino b/remote_controler_board_2_vertical/remote_controler_board_2_vertical.ino new file mode 100644 index 0000000..5d877da --- /dev/null +++ b/remote_controler_board_2_vertical/remote_controler_board_2_vertical.ino @@ -0,0 +1,110 @@ +#include +#include +#include "Ucglib.h" +#define interruptPin 2 +SoftwareSerial sendingSerial(5,6); +int Ymax = 160; //屏幕的竖向像素数 +int Xmax = 128; //屏幕的横向像素数 +int Xcent = Xmax / 2; //x中位 +int base = 100; //基线高度 +int scanline = 105; //雷达扫描线长度 +int outcircle=80; +int midcircle=60; +int midcircle2=40; +int incircle=20; +int x=90; +int distance=50; +bool rec=false; +bool clr=false; +bool ignoreClr=false; +String received="";//用来接受字符 +Ucglib_ST7735_18x128x160_HWSPI ucg(/*cd=*/ 9, /*cs=*/ 10, /*reset=*/ 8); +void fix_font() +{ + ucg.setColor(0, 180, 0); + ucg.setPrintPos(Xcent-10,26); + ucg.print("1.00"); + ucg.setPrintPos(Xcent-10,46); + ucg.print("0.75"); + ucg.setPrintPos(Xcent-10,66); + ucg.print("0.50"); + ucg.setPrintPos(Xcent-10,86); + ucg.print("0.25"); +} +void fix() +{ + ucg.setColor(0, 40, 0); + //画基线圆盘 + ucg.drawDisc(Xcent, base+1, 3, UCG_DRAW_ALL); + ucg.drawCircle(Xcent, base+1, outcircle, UCG_DRAW_UPPER_LEFT); + ucg.drawCircle(Xcent, base+1, outcircle, UCG_DRAW_UPPER_RIGHT); + ucg.drawCircle(Xcent, base+1, midcircle, UCG_DRAW_UPPER_LEFT); + ucg.drawCircle(Xcent, base+1, midcircle, UCG_DRAW_UPPER_RIGHT); + ucg.drawCircle(Xcent, base+1, midcircle2, UCG_DRAW_UPPER_LEFT); + ucg.drawCircle(Xcent, base+1, midcircle2, UCG_DRAW_UPPER_RIGHT); + ucg.drawCircle(Xcent, base+1, incircle, UCG_DRAW_UPPER_LEFT); + ucg.drawCircle(Xcent, base+1, incircle, UCG_DRAW_UPPER_RIGHT); + ucg.drawLine(0, base+1, Xmax,base+1); + ucg.setColor(0, 120, 0); +} +void setup() { + ucg.begin(UCG_FONT_MODE_SOLID); //初始化屏幕 + ucg.setRotate180(); //设置成横屏 如果屏幕显示方向是反的,可以修改函数 setRotate90 或 setRotate270 + Serial.begin(9600); //设置串口传输率 + sendingSerial.begin(38400); + sendingSerial.listen();//必须要加 + ucg.clearScreen(); + //cls(); + ucg.setFontMode(UCG_FONT_MODE_SOLID); + ucg.setFont(ucg_font_orgv01_hr); +} + +void loop() { + while(sendingSerial.available()){ + if(sendingSerial.peek()!='\n'){//peek()查看当前字节是不是换行 + received+=(char)sendingSerial.read(); + } + else{ + rec=true; + sendingSerial.read();//把换行符读掉 + Serial.println(received); + if(received[0]=='1'){ + ignoreClr=false; + distance=received.substring(4).toInt();//个十百3位数 + x=received.substring(1,4).toInt();//第456位 三位数 + } + else if(received[0]=='2'){ + if(!ignoreClr){ + clr=true; + } + } + else{ + rec=false; + } + received=""; + } + } + if(rec){ + if(clr){ + ucg.clearScreen(); + fix(); + fix_font(); //重绘屏幕背景元素 + clr=false; + ignoreClr=true; + return; + } + else if(ignoreClr){ + return; + } + + if (distance < 100){ + ucg.setColor(255,0,0); + ucg.drawDisc(0.8*distance*cos(radians(x))+Xcent,-0.8*distance*sin(radians(x))+base, 1, UCG_DRAW_ALL); + } + else{ //超过1米以上的,用黄色画在边缘区域示意 + ucg.setColor(255,255,0); + ucg.drawDisc((outcircle-1)*cos(radians(x))+Xcent,-(outcircle-1)*sin(radians(x))+base, 1, UCG_DRAW_ALL); + } + rec=false; + } +} diff --git a/ship/ship.ino b/ship/ship.ino index 4c82e55..309ce9e 100644 --- a/ship/ship.ino +++ b/ship/ship.ino @@ -57,12 +57,9 @@ void setup() pinMode(PWM,OUTPUT); pinMode(A1,INPUT); pinMode(A2,INPUT); - MyServo.write(angle); - - RadarServo.write(0); - - delay(1000); MyServo.write(45); + RadarServo.write(0); + delay(1000); } long confirm(long x){ if(x>=1000000&&x<=2000000)return x%1000000; diff --git a/ship_with_detect/ship_with_detect.ino b/ship_with_detect/ship_with_detect.ino new file mode 100644 index 0000000..af0b251 --- /dev/null +++ b/ship_with_detect/ship_with_detect.ino @@ -0,0 +1,238 @@ +#include +#include "Arduino.h" +#include "HardwareSerial.h" +#include +#include +#define trigPin 2 //超声波模块的Trig口 6# +#define echoPin 5 //超声波模块的echo口 5# +#define ServoPin 3 //底座舵机端口 3# +unsigned long time=0; +bool increasing=true; +bool clr=false; +//0: increase 1: decrease 2: clr +int status=0; +int clrtime=40; +int x=0; +const int interval=100; +String sending="",received=""; +Servo MyServo; +Servo RadarServo; +SoftwareSerial bluetoothSerial(7,8); +int count =0; +int IN1 =9; +int IN2 =10; +int PWM=6; +int angle=90; +int period=25; +int attachwater; +int j; +// float dist; +long dj,z;//dj是舵机,z是螺旋桨转速 +//long propeller=0,rudder=0;//propeller为螺旋桨(0-1023,512为静止),rudder为舵(0-1023,512为静止) +//long s_propeller=0,s_rudder=0;//发送的信号 +long propeller,rudder;//校验序列、读取内容和解码内容 +long response=0; +const byte addresses[6] = "00001"; //创建一个数组,建立接收机地址,或者说两个模块将用于通信的“管道” +int calculateDistance() +{ + long duration; + digitalWrite(trigPin, LOW); + delayMicroseconds(2); + digitalWrite(trigPin, HIGH); + delayMicroseconds(10); + digitalWrite(trigPin, LOW); + duration = pulseIn(echoPin, HIGH); + return duration*0.034/2; +} + +void setup() +{ + Serial.begin(9600); + bluetoothSerial.begin(57600); + bluetoothSerial.listen(); + MyServo.attach(4); + RadarServo.attach(ServoPin); + pinMode(trigPin,OUTPUT); + pinMode(echoPin,INPUT); + pinMode(IN1,OUTPUT); + pinMode(IN2,OUTPUT); + pinMode(PWM,OUTPUT); + RadarServo.write(0); + MyServo.write(45); + delay(1000); + +} +long confirm(long x){ + if(x>=1000000&&x<=2000000)return x%1000000; + else return -1; +} +void loop() { + int distance=0; + attachwater=0; + for(j=1;j<=100;j++) + { + if(analogRead(A1)*5/1023!=4) break; + } + if(j>=100) attachwater=1; + + + Serial.println(attachwater); + + // Serial.print("s: "); + // Serial.println(status); + if(status==0){ + if(x<180){ + x+=2; + } + else{ + status=2; + } + RadarServo.write(x); //调整舵机角度 + //测距 + distance = calculateDistance(); + //send distance + //response=1000000+x*1000+distance; + response=0; + response+=distance; + //Serial.println(response); + response+=(long)x*1000; + //Serial.println(response); + response+=1000000; + //Serial.println(response); + } + else if(status==1){ + if(x>0){ + x-=2; + } + else{ + status=2; + } + RadarServo.write(x); //调整舵机角度 + //测距 + distance = calculateDistance(); + //response=1000000+x*1000+distance; + response=0; + response+=distance; + //Serial.println(response); + response+=(long)x*1000; + //Serial.println(response); + response+=1000000; + //Serial.println(response); + //send distance + } + else if(status=2){ + clrtime--; + if(clrtime<=0){ + clrtime=4; + if(x>=180){ + status=1; + } + else{ + status=0; + } + } + //send clear + response=2000000; + } + sending=String(response); + + // Serial.print("x: "); + // Serial.println(x); + // Serial.print("d: "); + // Serial.println(distance); + // Serial.println(response); + //Serial.println(sending); + bluetoothSerial.println(sending); + delay(interval); + //delay(20-distance/17); + //Serial.println(distance); + while(bluetoothSerial.available()>0){ + //Serial.println("available!"); + if(bluetoothSerial.peek()!='\n'){//peek()查看当前字节是不是换行 + received+=(char)bluetoothSerial.read(); + //Serial.println(received); + //Serial.println("no \n"); + } + else{ + bluetoothSerial.read();//把换行符读掉 + Serial.println(received); + //Serial.println(received.length()); + //content=toInt(received); + if(received[0]=='1'&&received.length()-1==7){ + propeller=received.substring(4).toInt(); + rudder=received.substring(1,4).toInt(); + if(propeller>550||propeller<449){ + if(propeller>550){ + long zheng=0.568*propeller-312.4; + digitalWrite(IN2,HIGH); + digitalWrite(IN1,LOW); + if(attachwater==1) + { + analogWrite(PWM,zheng); + z=zheng; + } + else + { + analogWrite(PWM,0); + z=0; + } + //Serial.println("forward propelling"); + //Serial.println(z); + + } + else if(propeller<449){ + + long fan=255-0.568*propeller; + digitalWrite(IN1,HIGH); + digitalWrite(IN2,LOW); + if(attachwater==1) + { + analogWrite(PWM,fan); + z=fan; + } + else + { + analogWrite(PWM,0); + z=0; + } + //Serial.println("back propelling"); + //Serial.println(z); + + } + } + else if(propeller<=550||propeller>=449){ + z=0; + analogWrite(PWM,0); + Serial.println("stop propelling"); + Serial.println(z); + } + //Serial.println("inputing ruddering"); + if(rudder>550||rudder<449) + { + if(rudder<449){ + long fan1=0.1*rudder; + MyServo.write(fan1); + //Serial.println("turn left"); + dj=2*fan1-90; + //Serial.println(dj); + } + else if(rudder>550){ + long zheng1=0.1*rudder-10.122; + MyServo.write(zheng1); + dj=2*zheng1-90; + //Serial.println("turn right"); + //Serial.println(dj); + } + } + else if(rudder<=550||rudder>=449){ + dj=0; + MyServo.write(45); + //Serial.println("stop turing"); + //Serial.println(dj); + } + } + received=""; + } + } +} + \ No newline at end of file