Hallo, ich hab mir folgendes gekauft.ESP32 Camera Robot For Arduino Solar Tracking Kit – TSCINBUNY
Der Code lautet für den ESP Teil:
/*
* @Date: 2022-8-27
* @Description: ESP32 Camera Surveillance Car
* @FilePath:
*/
#include "esp_camera.h"
#include <WiFi.h>
//
// WARNING!!! Make sure that you have either selected ESP32 Wrover Module,
// or another board which has PSRAM enabled
//
// Adafruit ESP32 Feather
// Select camera model
#define CAMERA_MODEL_WROVER_KIT
#define CAMERA_MODEL_M5STACK_PSRAM
#define CAMERA_MODEL_AI_THINKER
const char *ssid = "private"; // Enter SSID WIFI Name
const char *password = "private"; // Enter WIFI Password
#if defined(CAMERA_MODEL_WROVER_KIT)
#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 21
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 19
#define Y4_GPIO_NUM 18
#define Y3_GPIO_NUM 5
#define Y2_GPIO_NUM 4
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
#elif defined(CAMERA_MODEL_AI_THINKER)
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
#else
#error "Camera model not selected"
#endif
// GPIO Setting
extern int gpLed = 4; // Light
extern String WiFiAddr = "";
void startCameraServer();
void setup()
{
Serial.begin(115200);
Serial.setDebugOutput(true);
Serial.println();
pinMode(gpLed, OUTPUT); // Light
digitalWrite(gpLed, LOW);
camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = Y2_GPIO_NUM;
config.pin_d1 = Y3_GPIO_NUM;
config.pin_d2 = Y4_GPIO_NUM;
config.pin_d3 = Y5_GPIO_NUM;
config.pin_d4 = Y6_GPIO_NUM;
config.pin_d5 = Y7_GPIO_NUM;
config.pin_d6 = Y8_GPIO_NUM;
config.pin_d7 = Y9_GPIO_NUM;
config.pin_xclk = XCLK_GPIO_NUM;
config.pin_pclk = PCLK_GPIO_NUM;
config.pin_vsync = VSYNC_GPIO_NUM;
config.pin_href = HREF_GPIO_NUM;
config.pin_sscb_sda = SIOD_GPIO_NUM;
config.pin_sscb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_JPEG;
// init with high specs to pre-allocate larger buffers
if (psramFound())
{
config.frame_size = FRAMESIZE_HVGA;/* FRAMESIZE_96X96, // 96x96
FRAMESIZE_QQVGA, // 160x120
FRAMESIZE_QCIF, // 176x144
FRAMESIZE_HQVGA, // 240x176
FRAMESIZE_240X240, // 240x240
FRAMESIZE_QVGA, // 320x240
FRAMESIZE_CIF, // 400x296
FRAMESIZE_HVGA, // 480x320
FRAMESIZE_VGA, // 640x480
FRAMESIZE_SVGA, // 800x600
FRAMESIZE_XGA, // 1024x768
FRAMESIZE_HD, // 1280x720
FRAMESIZE_SXGA, // 1280x1024
FRAMESIZE_UXGA, // 1600x1200*/
config.jpeg_quality = 20; /*It could be anything between 0 and 63.The smaller the number, the higher the quality*/
config.fb_count = 2;
Serial.println("FRAMESIZE_HVGA");
}
else
{
config.frame_size = FRAMESIZE_CIF;
config.jpeg_quality = 12;
config.fb_count = 1;
Serial.println("FRAMESIZE_CIF");
}
// camera init
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK)
{
Serial.printf("Camera init failed with error 0x%x", err);
return;
}
// drop down frame size for higher initial frame rate
sensor_t *s = esp_camera_sensor_get();
s->set_framesize(s, FRAMESIZE_CIF);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
startCameraServer();
Serial.print("Camera Ready! Use 'http://");
Serial.print(WiFi.localIP());
WiFiAddr = WiFi.localIP().toString();
Serial.println("' to connect");
}
void loop()
{
// put your main code here, to run repeatedly:
}
und für den Arduino:
#include <Servo.h>
// servo control pin
#define MOTOR_PIN 9
// PWM control pin
#define PWM1_PIN 5
#define PWM2_PIN 6
// 74HCT595N chip pin
#define SHCP_PIN 2 // The displacement of the clock
#define EN_PIN 7 // Can make control
#define DATA_PIN 8 // Serial data
#define STCP_PIN 4 // Memory register clock
// 超声波控制引脚
#define Trig_PIN 12
#define Echo_PIN 13
// 循迹控制引脚
#define LEFT_LINE_TRACJING A0
#define CENTER_LINE_TRACJING A1
#define right_LINE_TRACJING A2
const int analogPin1 = A3; // 第一个模拟通道连接到A3引脚
const int analogPin2 = A4; // 第二个模拟通道连接到A4引脚
#define motorPin1 A5 // 马达控制引脚10,用于PWM控制
#define motorPin2 11 // 马达控制引脚11,用于PWM控制
Servo MOTORservo;
const int Forward = 92; // forward
const int Backward = 163; // back
const int Stop = 0; // stop
const int Contrarotate = 172; // Counterclockwise rotation
const int Clockwise = 83; // Rotate clockwise
const int Moedl1 = 25; // model1
const int Moedl2 = 26; // model2
const int Moedl3 = 27; // model3
const int Moedl4 = 28; // model4
const int MotorLeft = 230; // servo turn left
const int MotorRight = 231; // servo turn right
int Left_Tra_Value;
int Center_Tra_Value;
int Right_Tra_Value;
int Black_Line = 700;
int leftDistance = 0;
int middleDistance = 0;
int rightDistance = 0;
byte RX_package[3] = {0};
uint16_t angle = 90;
byte order = Stop;
char model_var = 0;
int UT_distance = 0;
void setup()
{
Serial.setTimeout(10);
Serial.begin(115200);
MOTORservo.attach(MOTOR_PIN);
pinMode(SHCP_PIN, OUTPUT);
pinMode(EN_PIN, OUTPUT);
pinMode(DATA_PIN, OUTPUT);
pinMode(STCP_PIN, OUTPUT);
pinMode(PWM1_PIN, OUTPUT);
pinMode(PWM2_PIN, OUTPUT);
pinMode(Trig_PIN, OUTPUT);
pinMode(Echo_PIN, INPUT);
pinMode(LEFT_LINE_TRACJING, INPUT);
pinMode(CENTER_LINE_TRACJING, INPUT);
pinMode(right_LINE_TRACJING, INPUT);
pinMode(motorPin1, OUTPUT); // 将马达控制引脚1设置为输出
pinMode(motorPin2, OUTPUT); // 将马达控制引脚2设置为输出
pinMode(13, INPUT);
MOTORservo.write(angle);
Motor(Stop,0,0);
}
void Light_val() {
// 读取第一个模拟通道的电压值
int sensorValue1 = analogRead(analogPin1);
// 读取第二个模拟通道的电压值
int sensorValue2 = analogRead(analogPin2);
if((sensorValue1 >= 200) && (sensorValue1-sensorValue2 >= 100)){
analogWrite(motorPin1, 0);
analogWrite(motorPin2, 150);
delay(30);
analogWrite(motorPin1, 0);
analogWrite(motorPin2, 0);
delay(30);
}else if((sensorValue2 >= 200) && (sensorValue2-sensorValue1 >= 100)){
analogWrite(motorPin1, 140);
analogWrite(motorPin2, 0);
delay(30);
analogWrite(motorPin1, 0);
analogWrite(motorPin2, 0);
delay(30);
}else{
analogWrite(motorPin1, 0);
analogWrite(motorPin2, 0);
}
}
void loop()
{
RXpack_func();
switch (model_var)
{
case 0:
model1_func(order);
break;
case 1:
model2_func(); // OA model
break;
case 2:
model3_func(); // follow model
break;
case 3:
model4_func(); // Tracking model
break;
}
}
void model1_func(byte orders)
{
switch (orders)
{
case Stop:
Motor(Stop, 0,0);
Light_val();
break;
case Forward:
Motor(Forward, 180,180);
break;
case Backward:
Motor(Backward, 180,180);
break;
case Clockwise:
Motor(Clockwise, 180,180);
break;
case Contrarotate:
Motor(Contrarotate, 180,180);
break;
case MotorLeft:
motorleft();
break;
case MotorRight:
motorright();
break;
default:
// Serial.println(".");
order = 0;
Motor(Stop, 0,0);
Light_val();
break;
}
}
void model2_func() // OA
{
MOTORservo.write(90);
UT_distance = SR04(Trig_PIN, Echo_PIN);
Serial.println(UT_distance);
middleDistance = UT_distance;
if (middleDistance <= 25)
{
Motor(Stop, 0,0);
for(int i = 0;i < 500;i++){
delay(1);
RXpack_func();
if(model_var != 1)
return ;
}
MOTORservo.write(10);
for(int i = 0;i < 300;i++){
delay(1);
RXpack_func();
if(model_var != 1)
return ;
}
rightDistance = SR04(Trig_PIN, Echo_PIN);//SR04();
Serial.print("rightDistance: ");
Serial.println(rightDistance);
MOTORservo.write(90);
for(int i = 0;i < 300;i++){
delay(1);
RXpack_func();
if(model_var != 1)
return ;
}
MOTORservo.write(170);
for(int i = 0;i < 300;i++){
delay(1);
RXpack_func();
if(model_var != 1)
return ;
}
leftDistance = SR04(Trig_PIN, Echo_PIN);//SR04();
Serial.print("leftDistance: ");
Serial.println(leftDistance);
MOTORservo.write(90);
if((rightDistance < 20) && (leftDistance < 20)){
Motor(Backward, 180,180);
for(int i = 0;i < 1000;i++){
delay(1);
RXpack_func();
if(model_var != 1)
return ;
}
Motor(Contrarotate, 250,250);
for(int i = 0;i < 500;i++){
delay(1);
RXpack_func();
if(model_var != 1)
return ;
}
}
else if(rightDistance < leftDistance) {
Motor(Stop, 0,0);
for(int i = 0;i < 100;i++){
delay(1);
RXpack_func();
if(model_var != 1)
return ;
}
Motor(Backward, 180,180);
for(int i = 0;i < 500;i++){
delay(1);
RXpack_func();
if(model_var != 1)
return ;
}
Motor(Contrarotate, 250,250);
for(int i = 0;i < 500;i++){
delay(1);
RXpack_func();
if(model_var != 1)
return ;
}
}//turn right
else if(rightDistance > leftDistance){
Motor(Stop, 0,0);
for(int i = 0;i < 500;i++){
delay(1);
RXpack_func();
if(model_var != 1)
return ;
}
Motor(Backward, 180,180);
for(int i = 0;i < 500;i++){
delay(1);
RXpack_func();
if(model_var != 1)
return ;
}
Motor(Clockwise, 250,250);
for(int i = 0;i < 500;i++){
delay(1);
RXpack_func();
if(model_var != 1)
return ;
}
}
else{
Motor(Backward, 180,180);
for(int i = 0;i < 500;i++){
delay(1);
RXpack_func();
if(model_var != 1)
return ;
}
Motor(Clockwise, 250,250);
for(int i = 0;i < 500;i++){
delay(1);
RXpack_func();
if(model_var != 1)
return ;
}
}
}
else
{
Motor(Forward, 250,250);
}
}
void model3_func() // follow model
{
MOTORservo.write(90);
UT_distance = SR04(Trig_PIN, Echo_PIN);
Serial.println(UT_distance);
if (UT_distance < 15)
{
Motor(Backward, 200,200);
}
else if (15 <= UT_distance && UT_distance <= 20)
{
Motor(Stop, 0,0);
}
else if (20 <= UT_distance && UT_distance <= 25)
{
Motor(Forward, 180,180);
}
else if (25 <= UT_distance && UT_distance <= 50)
{
Motor(Forward, 220,220);
}
else
{
Motor(Stop, 0,0);
}
}
void model4_func() // tracking model
{
MOTORservo.write(90);
Left_Tra_Value = analogRead(LEFT_LINE_TRACJING);
Center_Tra_Value = analogRead(CENTER_LINE_TRACJING);
Right_Tra_Value = analogRead(right_LINE_TRACJING);
if (Left_Tra_Value < Black_Line && Center_Tra_Value >= Black_Line && Right_Tra_Value < Black_Line)
{
Motor(Forward, 250,250);
}
else if (Left_Tra_Value >= Black_Line && Center_Tra_Value >= Black_Line && Right_Tra_Value < Black_Line)
{
Motor(Contrarotate, 220,220);
}
else if (Left_Tra_Value >= Black_Line && Center_Tra_Value < Black_Line && Right_Tra_Value < Black_Line)
{
Motor(Contrarotate, 250,250);
}
else if (Left_Tra_Value < Black_Line && Center_Tra_Value < Black_Line && Right_Tra_Value >= Black_Line)
{
Motor(Clockwise, 250,250);
}
else if (Left_Tra_Value < Black_Line && Center_Tra_Value >= Black_Line && Right_Tra_Value >= Black_Line)
{
Motor(Clockwise, 220,220);
}
else if (Left_Tra_Value >= Black_Line && Center_Tra_Value >= Black_Line && Right_Tra_Value >= Black_Line)
{
Motor(Stop, 0,0);
}
}
void motorleft() //servo
{
MOTORservo.write(angle);
angle+=1;
if(angle >= 180) angle = 180;
delay(10);
}
void motorright() //servo
{
MOTORservo.write(angle);
angle-=1;
if(angle <= 1) angle = 1;
delay(10);
}
void Motor(int Dir, int Speed1 , int Speed2)
{
digitalWrite(EN_PIN, LOW);
analogWrite(PWM1_PIN, Speed1);
analogWrite(PWM2_PIN, Speed2);
digitalWrite(STCP_PIN, LOW);
shiftOut(DATA_PIN, SHCP_PIN, MSBFIRST, Dir);
digitalWrite(STCP_PIN, HIGH);
}
float SR04(int Trig, int Echo) // ultrasonic measured distance
{
digitalWrite(Trig, LOW);
delayMicroseconds(2);
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
float distance = pulseIn(Echo, HIGH) / 58.00;
delay(10);
return distance;
}
void RXpack_func() //Receive data
{
if(Serial.available() > 0)
{
delay(1); // delay 1MS
if(Serial.readBytes(RX_package, 3))
{
if (RX_package[0] == 0xA5 && RX_package[2] == 0x5A) // The header and tail of the packet are verified
{
order = RX_package[1];
if(order == Moedl1)
{
model_var = 0;
}
else if (order == Moedl2)
{
model_var = 1;
}
else if (order == Moedl3)
{
model_var = 2;
digitalWrite(13, LOW);
}
else if (order == Moedl4)
{
model_var = 3;
digitalWrite(13, HIGH);
}
}
}
}
}
Nun bekomme ich einige Warnungen und hoffe, wenn die beseitigt sind, dass dann das WLAN funktioniert. z.Z. bekomme ich nämlich keine IP, damit ich darauf zugreifen kann. Mein Router sagt auch, dass bei ihm keine Anfrage ankam und SerMo bleibt weiss.
Verkabelung: