From d949e97b09a4b5016f253d3fa56f6e0c4a8182a1 Mon Sep 17 00:00:00 2001 From: clf3 Date: Mon, 4 Sep 2023 14:54:15 +0800 Subject: [PATCH] first ver --- radar/radar.ino | 298 ++++++++++++++++++++++++++ remote_controler/remote_controler.ino | 58 +++++ ship/ship.ino | 172 +++++++++++++++ 3 files changed, 528 insertions(+) create mode 100644 radar/radar.ino create mode 100644 remote_controler/remote_controler.ino create mode 100644 ship/ship.ino diff --git a/radar/radar.ino b/radar/radar.ino new file mode 100644 index 0000000..0416b35 --- /dev/null +++ b/radar/radar.ino @@ -0,0 +1,298 @@ +//淘宝『创元素店』https://shop423015102.taobao.com/ +//更新日期 2021/03/06 +//MiniRadar 超声波雷达 程序 +//本程序对应商品 https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-23815833841.8.4f231fe7qvLFZi&id=649834806872 + +//Github版链接: https://github.com/johnsonwust/MiniRadar + +#include +#include +#include "Ucglib.h" +//显示屏的lib 如果没有该lib请按Ctrl+Shift+I 从 库管理器中搜索 ucglib,并安装 + + +#define trigPin 6 //超声波模块的Trig口 6# +#define echoPin 5 //超声波模块的echo口 5# +#define ServoPin 3 //底座舵机端口 3# +int Ymax = 128; //屏幕的竖向像素数 +int Xmax = 160; //屏幕的横向像素数 +int Xcent = Xmax / 2; //x中位 +int base = 118; //基线高度 +int scanline = 105; //雷达扫描线长度 + +Servo baseServo; +Ucglib_ST7735_18x128x160_HWSPI ucg(/*cd=*/ 9, /*cs=*/ 10, /*reset=*/ 8); + +void setup(void) +{ + + ucg.begin(UCG_FONT_MODE_SOLID); //初始化屏幕 + ucg.setRotate90(); //设置成横屏 如果屏幕显示方向是反的,可以修改函数 setRotate90 或 setRotate270 + + pinMode(trigPin, OUTPUT); //设置trigPin端口模式 + pinMode(echoPin, INPUT); //设置echoPin端口模式 + Serial.begin(115200); //设置串口传输率 + baseServo.attach(ServoPin); //初始化舵机 + + //欢迎屏幕 + ucg.setFontMode(UCG_FONT_MODE_TRANSPARENT); + ucg.setColor(0, 0, 100, 0); + ucg.setColor(1, 0, 100, 0); + ucg.setColor(2, 20, 20,20); + ucg.setColor(3, 20, 20, 20); + ucg.drawGradientBox(0, 0, 160, 128); + ucg.setPrintDir(0); + ucg.setColor(0, 5, 0); + ucg.setPrintPos(27,42); + ucg.setFont(ucg_font_logisoso18_tf); + ucg.print("Mini Radar"); + ucg.setColor(0, 255, 0); + ucg.setPrintPos(25,40); + ucg.print("Mini Radar"); + ucg.setFont(ucg_font_helvB08_tf); + ucg.setColor(20, 255, 20); + ucg.setPrintPos(40,100); + ucg.print("Testing..."); + baseServo.write(90); + + //测试底座的运行情况,注意检测底座位置和转动姿态,是否有卡住(或者导线缠绕)的情况。 + for(int x=0;x<180;x+=5) + { baseServo.write(x); + delay(50); + } + ucg.print("OK!"); + delay(500); + + + //清屏 + //ucg.clearScreen(); + cls(); + ucg.setFontMode(UCG_FONT_MODE_SOLID); + ucg.setFont(ucg_font_orgv01_hr); + +} + + +void cls() +{ + //清屏 + ucg.setColor(0, 0, 0, 0); + + for(int s=0;s<128;s+=8) + for(int t=0;t<160;t+=16) + { + ucg.drawBox(t,s,16,8); + // delay(1); + } + + +} + + +int calculateDistance() +{ + long duration; + //trigPin断电 并 等待2微妙 + digitalWrite(trigPin, LOW); + delayMicroseconds(2); + //trigPin加电 延时 10微妙 再断电 + digitalWrite(trigPin, HIGH); + delayMicroseconds(10); + digitalWrite(trigPin, LOW); + //读取echoPin返回声波的传播时间(微妙) + duration = pulseIn(echoPin, HIGH); + //将回声时间转换成距离数值 + return duration*0.034/2; +} + +void fix_font() +{ + ucg.setColor(0, 180, 0); + ucg.setPrintPos(70,14); + ucg.print("1.00"); + ucg.setPrintPos(70,52); + ucg.print("0.67"); + ucg.setPrintPos(70,90); + ucg.print("0.33"); +} + +void fix() +{ + + ucg.setColor(0, 40, 0); + //画基线圆盘 + ucg.drawDisc(Xcent, base+1, 3, UCG_DRAW_ALL); + ucg.drawCircle(Xcent, base+1, 115, UCG_DRAW_UPPER_LEFT); + ucg.drawCircle(Xcent, base+1, 115, UCG_DRAW_UPPER_RIGHT); + ucg.drawCircle(Xcent, base+1, 78, UCG_DRAW_UPPER_LEFT); + ucg.drawCircle(Xcent, base+1, 78, UCG_DRAW_UPPER_RIGHT); + ucg.drawCircle(Xcent, base+1, 40, UCG_DRAW_UPPER_LEFT); + ucg.drawCircle(Xcent, base+1, 40, UCG_DRAW_UPPER_RIGHT); + ucg.drawLine(0, base+1, Xmax,base+1); + + ucg.setColor(0, 120, 0); + //画刻度表 + for(int i= 40;i < 140; i+=2) + { + + if (i % 10 == 0) + ucg.drawLine(105*cos(radians(i))+Xcent,base - 105*sin(radians(i)) , 113*cos(radians(i))+Xcent,base - 113*sin(radians(i))); + else + + ucg.drawLine(110*cos(radians(i))+Xcent,base - 110*sin(radians(i)) , 113*cos(radians(i))+Xcent,base - 113*sin(radians(i))); + } + + //画一些装饰性图案 + ucg.setColor(0,200,0); + ucg.drawLine(0,0,0,18); + for(int i= 0;i < 5; i++) + { + ucg.setColor(0,random(200)+50,0); + ucg.drawBox(2,i*4,random(14)+2,3); + } + + ucg.setColor(0,180,0); + ucg.drawFrame(146,0,14,14); + ucg.setColor(0,60,0); + ucg.drawHLine(148,0,10); + ucg.drawVLine(146,2,10); + ucg.drawHLine(148,13,10); + ucg.drawVLine(159,2,10); + + ucg.setColor(0,220,0); + ucg.drawBox(148,2,4,4); + ucg.drawBox(148,8,4,4); + ucg.drawBox(154,8,4,4); + ucg.setColor(0,100,0); + ucg.drawBox(154,2,4,4); + + ucg.setColor(0,90,0); + ucg.drawTetragon(62,123,58,127,98,127,102,123); + ucg.setColor(0,160,0); + ucg.drawTetragon(67,123,63,127,93,127,97,123); + ucg.setColor(0,210,0); + ucg.drawTetragon(72,123,68,127,88,127,92,123); +} + + + +void loop(void) +{ + + int distance; + + fix(); + fix_font(); //重绘屏幕背景元素 + + for (int x=180; x > 4; x-=2){ //底座舵机从180~0度循环 + + baseServo.write(x); //调整舵机角度 + + //绘制雷达扫描线 + int f = x - 4; + ucg.setColor(0, 255, 0); + ucg.drawLine(Xcent, base, scanline*cos(radians(f))+Xcent,base - scanline*sin(radians(f))); + f+=2; + ucg.setColor(0, 128, 0); + ucg.drawLine(Xcent, base, scanline*cos(radians(f))+Xcent,base - scanline*sin(radians(f))); + f+=2; + ucg.setColor(0, 0, 0); + ucg.drawLine(Xcent, base, scanline*cos(radians(f))+Xcent,base - scanline*sin(radians(f))); + ucg.setColor(0,200, 0); + //测距 + distance = calculateDistance(); + + //根据测得距离在对应位置画点 + if (distance < 100) + { + ucg.setColor(255,0,0); + ucg.drawDisc(distance*cos(radians(x))+Xcent,-distance*sin(radians(x))+base, 1, UCG_DRAW_ALL); + } + else + { //超过1米以上的,用黄色画在边缘区域示意 + ucg.setColor(255,255,0); + ucg.drawDisc(116*cos(radians(x))+Xcent,-116*sin(radians(x))+base, 1, UCG_DRAW_ALL); + } + + + //调试代码,输出角度和测距值 + Serial.print(x); + Serial.print(" , "); + Serial.println(distance); + + + if (x > 70 and x < 110) fix_font(); //扫描线和数字重合时,重绘数字 + + ucg.setColor(0,155, 0); + ucg.setPrintPos(0,126); + ucg.print("DEG: "); + ucg.setPrintPos(24,126); + ucg.print(x); + ucg.print(" "); + ucg.setPrintPos(125,126); + ucg.print(" "); + ucg.print(distance); + ucg.print("cm "); + + } + //ucg.clearScreen(); //清屏 如果arduino供电不足,可能会引起白屏(显示信号中断)可以用 cls();函数代替 ucg.clearScreen(); + delay(50); + cls(); //如有频繁白屏情况,可以使用该函数 。或者增加外部供电 + + fix(); + fix_font(); //重绘屏幕背景元素 + + for (int x=1; x < 176; x+=2){ + baseServo.write(x); //调整舵机角度 + + //绘制雷达扫描线 + int f = x + 4; + ucg.setColor(0, 255, 0); + ucg.drawLine(Xcent, base, scanline*cos(radians(f))+Xcent,base - scanline*sin(radians(f))); + f-=2; + ucg.setColor(0, 128, 0); + ucg.drawLine(Xcent, base, scanline*cos(radians(f))+Xcent,base - scanline*sin(radians(f))); + f-=2; + ucg.setColor(0, 0, 0); + ucg.drawLine(Xcent, base, scanline*cos(radians(f))+Xcent,base - scanline*sin(radians(f))); + ucg.setColor(0, 200, 0); + //测距 + distance = calculateDistance(); + + //根据测得距离在对应位置画点 + if (distance < 100) + { + ucg.setColor(255,0,0); + ucg.drawDisc(distance*cos(radians(x))+Xcent,-distance*sin(radians(x))+base, 1, UCG_DRAW_ALL); + } + else + { //超过1米以上的,用黄色画在边缘区域示意 + ucg.setColor(255,255,0); + ucg.drawDisc(116*cos(radians(x))+Xcent,-116*sin(radians(x))+base, 1, UCG_DRAW_ALL); + } + + //调试代码,输出角度和测距值 + Serial.print(x); + Serial.print(" , "); + Serial.println(distance); + + if (x > 70 and x < 110) fix_font(); //扫描线和数字重合时,重绘数字 + + ucg.setColor(0,155, 0); + ucg.setPrintPos(0,126); + ucg.print("DEG: "); + ucg.setPrintPos(24,126); + ucg.print(x); + ucg.print(" "); + ucg.setPrintPos(125,126); + ucg.print(" "); + ucg.print(distance); + ucg.print("cm "); + + } + //ucg.clearScreen(); // + delay(50); + cls(); + + +} \ No newline at end of file diff --git a/remote_controler/remote_controler.ino b/remote_controler/remote_controler.ino new file mode 100644 index 0000000..617ebdb --- /dev/null +++ b/remote_controler/remote_controler.ino @@ -0,0 +1,58 @@ +//player1,remote controler +#include +#include +#include +#include +RF24 radio(7,8);//端口可能要改 +const int Rp=0,Rr=1,interval=20;//Rp,Rr 分别为两个遥杆的接口,间断20ms +long propeller=0,rudder=0;//propeller为螺旋桨(0-1023,512为静止),rudder为舵(0-1023,512为静止) +long s_propeller=0,s_rudder=0;//发送的信号 +long check_array[6]; +const byte addresser[6]={"00001"};//创建通信通道地址,6用来写,8用来读 +void setup() { + // put your setup code here, to run once: + Serial.begin(9600); + radio.begin(); + //radio.setChannel(114);//设置信道,114号通道 + radio.openWritingPipe(addresser);//6 + radio.openReadingPipe(1,addresser);//8 + radio.setPALevel(RF24_PA_HIGH); + Timer1.initialize(interval); + Timer1.attachInterrupt(Send); +} +void Send(){//发送信号函数 + radio.stopListening(); + Serial.println("stop listening!"); + propeller=analogRead(Rp); + rudder=analogRead(Rr); + Serial.println(propeller); + Serial.println(rudder); + propeller+=create_checknumber(propeller)*10000; + rudder+=create_checknumber(rudder)*10000; + propeller+=100000; + rudder+=200000; + radio.write(&propeller,sizeof(propeller)); + radio.write(&rudder,sizeof(rudder)); + Serial.print("propeller sent"); + Serial.println(propeller); + Serial.print("rudder sent"); + Serial.println(rudder); +} +long create_checknumber(long x){//创造校验码,校验码规则:个位×4,十位×3,百位×2,千位×1 + long add=0,sum=0; + while(x!=0){ + check_array[add]=x%10; + x/=10; + add++; + } + for(int i=0,j=4;i +#include +#include +#include "Arduino.h" +#include "HardwareSerial.h" +#include + +Servo MyServo; +Servo RidaServo; +RF24 radio(7,8); +int count =0; +int IN1 =7; +int IN2 = 8; +int PWM=6; +int TrigPin=2; +int EcoPin=3; +int dAngle=5; +int angle=90; +int period=25; +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;//发送的信号 +const long R_prop=5,R_rudd=6;//输出端口 +long check_array[7],content,after_decode;//校验序列、读取内容和解码内容 +const byte addresses[6] = "00001"; //创建一个数组,建立接收机地址,或者说两个模块将用于通信的“管道” + +long decode_and_confirm(long x){ + long sum=0,add=0,x1=x; + while(x1!=0){ + check_array[add]=x1%10; + x1/=10; + add++; + } + for(long i=0,j=4;i=180){ + dAngle=-5; + } + angle=angle+dAngle; + RidaServo.write(angle); + digitalWrite(TrigPin,LOW); + delayMicroseconds(8); + digitalWrite(TrigPin,HIGH); + delayMicroseconds(10); + digitalWrite(TrigPin,LOW); + dist=pulseIn(EcoPin,HIGH,58800)/58.8; + if(dist<=0.5){ + dist=100.0; + } + if(dist/170){ + radio.read(&content,sizeof(content)); + Serial.println("The content is"); + Serial.println(content);//调试 + after_decode=decode_and_confirm(content); + Serial.println(after_decode); + if(after_decode!=-1&&content>=100000){ + if(content<200000){ + Serial.println("inputing propeller "); + if(after_decode>600||after_decode<500){ + if(after_decode>600){ + long zheng=after_decode; + digitalWrite(IN2,HIGH); + digitalWrite(IN1,LOW); + analogWrite(PWM,zheng); + delay(50); + z=zheng-512; + Serial.println("forward propelling"); + Serial.println(z); + } + else if(after_decode<500){ + long fan=1100-after_decode; + digitalWrite(IN1,HIGH); + digitalWrite(IN2,LOW); + analogWrite(PWM,fan); + delay(50); + z=fan-512; + Serial.println("back propelling"); + Serial.println(z); + } + } + else if(after_decode<=600||after_decode>=500){ + z=0; + Serial.println("stop propelling"); + Serial.println(z); + } + } + else{ + Serial.println("inputing ruddering"); + if(after_decode>600||after_decode<500){ + if(after_decode<500){ + long fan1=0.18*after_decode; + MyServo.write(fan1/2); + delay(150); + dj=fan1-90; + Serial.println("turn left"); + Serial.println(dj); + } + else if(after_decode>600){ + long zheng1=0.22*after_decode-42; + MyServo.write(zheng1/2); + delay(150); + dj=zheng1-90; + Serial.println("turn right"); + Serial.println(dj); + } + } + else if(after_decode<=600||after_decode>=500){ + dj=0; + Serial.println("stop turing"); + Serial.println(dj); + } + } + } + } + // radio.stopListening(); + //radio.write(&dist,sizeof(dist)); + // radio.write(&dj,sizeof(dj)); + //radio.write(&z,sizeof(z)); + //radio.startListening(); + //delay(20); + /* if (radio.available()) { //判断是否有要接收的数据 + radio.read(response,sizeof(response)); + Serial.print(text); + Serial.println(response); + }*/ + //delay(20); //延迟等待0.3秒 + //text++; +} +