Hallo zusammen, habe folgendes Problem:
- ESP8266
- MotorShield (Erweiterungsplatine)
- 4x IR Sensor (lm393)
- 2x Servo (SG90)
- 2x DC Motoren
- 1X PCF8574
- 1X Adafruit 16-Kanal (PCA9685)
Habe einen Pan/Tilt versucht zusammen zu stellen funktioniert ohne probleme, wenn das ganze in einen WebServer eingepflegt wird reagieren die sensoren nicht .
So klappt es.
#include "PCF8574.h"
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
PCF8574 pcf8574(0x20,D6,D5);
#define SERVOMIN 1100
#define SERVOMAX 3000
void setup()
{
Serial.begin(115200);
pcf8574.pinMode(0, INPUT_PULLUP);
pcf8574.pinMode(1, INPUT_PULLUP);
pcf8574.pinMode(2, INPUT_PULLUP);
pcf8574.pinMode(3, INPUT_PULLUP);
pcf8574.begin();
Wire.begin(D6,D5);
pwm.begin();
pwm.setPWMFreq(50);
}
void loop()
{
int posA = 40;
int posB = 60;
int statusSensor_O = pcf8574.digitalRead(0);
int statusSensor_U = pcf8574.digitalRead(1);
int statusSensor_R = pcf8574.digitalRead(2);
int statusSensor_L = pcf8574.digitalRead(3);
int stepsize = 2;
if (statusSensor_O == 0){
Serial.println("Oben") ;
posA = posA + stepsize;
pwm.setPWM(4, 0, pulseWidth(posA));
delay(30);
if (posA > 150){
posA = 150;
}
}
if (statusSensor_U == 0){
Serial.println("Unten") ;
posA = posA - stepsize;
pwm.setPWM(4, 0, pulseWidth(posA));
delay(30);
if (posA < 40){
posA = 40;
}
}
if (statusSensor_L == 0){
Serial.println("Links") ;
posB = posB + stepsize;
pwm.setPWM(2, 0, pulseWidth(posB));
delay(30);
if (posB > 120){
posB = 120;
}
}
if (statusSensor_R == 0){
Serial.println("Rechts") ;
posB = posB - stepsize;
pwm.setPWM(2, 0, pulseWidth(posB));
delay(30);
if (posB < 10) {
posB = 10;
}
}
}
int pulseWidth(int angle){
int pulse_wide, analog_value;
pulse_wide = map(angle, 0, 180, SERVOMIN, SERVOMAX);
analog_value = int(float(pulse_wide) / 1000000 * 50 * 4096);
return analog_value;
}
So klappt das nicht
#include <ESP8266WiFi.h>
#include "PCF8574.h"
#include <Wire.h>
#include <math.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
PCF8574 pcf8574(0x20,D6,D5);
#define SERVOMIN 1100
#define SERVOMAX 3000
const char* ssid = "**********";
const char* password = "**********";
WiFiServer server(80);
String header;
String valueString = String(5);
// Motor A
int PWMA = D1;
int AIN1 = D3;
// Motor B
int PWMB = D2;
int BIN1 = D4;
int rx, ry = 0;
int leftspeed = 0;
int rightspeed = 0;
void setup() {
Serial.begin(115200);
pinMode(PWMA, OUTPUT);
pinMode(AIN1, OUTPUT);
pinMode(PWMB, OUTPUT);
pinMode(BIN1, OUTPUT);
pcf8574.pinMode(0, INPUT_PULLUP);
pcf8574.pinMode(1, INPUT_PULLUP);
pcf8574.pinMode(2, INPUT_PULLUP);
pcf8574.pinMode(3, INPUT_PULLUP);
pcf8574.begin();
Wire.begin(D6, D5);
pwm.begin();
pwm.setPWMFreq(50);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
server.begin();
}
void loop() {
client = server.available();
if (client) {
String currentLine = "";
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
header += c;
if (c == '\n') {
if (currentLine.length() == 0) {
printWebsite();
if(header.indexOf("GET /Kopf/L") >= 0)
{
pwm.setPWM(2, 0, kopfpulseWidth(120));
}
else if(header.indexOf("GET /Kopf/R") >= 0)
{
pwm.setPWM(2, 0, kopfpulseWidth(10));
}
else if(header.indexOf("GET /Kopf/Folgen") >= 0)
{
folgen();
}
else if (header.indexOf("GET /?M") >= 0) {
valueString = header.substring(header.indexOf("/?X") + 3, header.indexOf("/X"));
rx = valueString.toInt();
valueString = header.substring(header.indexOf("/?Y") + 3, header.indexOf("/Y"));
ry = valueString.toInt() * -1 ;
}
client.println();
setMotorsXY(rx, ry);
break;
} else {
currentLine = "";
}
} else if (c != '\r') {
currentLine += c;
}
}
}
header = "";
client.stop();
}
}
void setMotorsXY(int x, int y) {
double theta = PI / 2;
double rightSpeed = 0;
double leftSpeed = 0;
if (x != 0) {
if (y > 0) {
theta = PI - atan2(y, x * (-1));
} else if (y < 0) {
theta = 2 * PI + atan2(y, x);
}
} else {
if (y > 0) {
theta = PI / 2;
} else {
theta = 3 * PI / 2;
}
}
double r = sqrt(x * x + y * y) / 100;
if (theta < PI / 2) {
leftSpeed = 100 * r;
rightSpeed = (200 * (2 * theta) / PI - 100) * r;
} else if (theta < PI) {
leftSpeed = (100 - 400 * ((theta / PI) - .5)) * r;
rightSpeed = 100 * r;
} else if (theta < 3 * PI / 2) {
leftSpeed = -100 * r;
rightSpeed = (100 - 400 * ((theta / PI) - 1)) * r;
} else if (theta < 2 * PI) {
rightSpeed = -100 * r;
leftSpeed = ( 400 * ((theta / PI) - 1.5) - 100) * r;
}
setMotors((int)rightSpeed, (int) leftSpeed);
}
void setMotors(int _right, int _left) {
int rightVal = abs(_right) ;
int leftVal = abs(_left);
if (_right > 0) {
digitalWrite(AIN1, 0);
analogWrite(PWMA, 1000);
} else if (_right < 0) {
digitalWrite(AIN1, 1);
analogWrite(PWMA, 800);
} else {
digitalWrite(AIN1, 0);
analogWrite(PWMA, 0);
}
if (_left > 0) {
digitalWrite(BIN1, 0);
analogWrite(PWMB, 1000);
} else if (_left < 0) {
digitalWrite(BIN1, 1);
analogWrite(PWMB, 800);
}
else {
digitalWrite(BIN1, 0);
analogWrite(PWMB, 0);
}
}
void folgen(){
int posA = 40;
int posB = 60;
int statusSensor_O = pcf8574.digitalRead(0);
int statusSensor_U = pcf8574.digitalRead(1);
int statusSensor_R = pcf8574.digitalRead(2);
int statusSensor_L = pcf8574.digitalRead(3);
int stepsize = 2;
if (statusSensor_O == 0){
Serial.println("Oben") ;
posA = posA + stepsize;
pwm.setPWM(4, 0, pulseWidth(posA));
delay(30);
if (posA > 150){
posA = 150;
}
}
if (statusSensor_U == 0){
Serial.println("Unten") ;
posA = posA - stepsize;
pwm.setPWM(4, 0, pulseWidth(posA));
delay(30);
if (posA < 40){
posA = 40;
}
}
if (statusSensor_L == 0){
Serial.println("Links") ;
posB = posB + stepsize;
pwm.setPWM(2, 0, pulseWidth(posB));
delay(30);
if (posB > 120){
posB = 120;
}
}
if (statusSensor_R == 0){
Serial.println("Rechts") ;
posB = posB - stepsize;
pwm.setPWM(2, 0, pulseWidth(posB));
delay(30);
if (posB < 10) {
posB = 10;
}
}
}
int pulseWidth(int angle){
int pulse_wide, analog_value;
pulse_wide = map(angle, 0, 180, SERVOMIN, SERVOMAX);
analog_value = int(float(pulse_wide) / 1000000 * 50 * 4096);
return analog_value;
}
Verstehe nicht woran es liegt, hoffe da kann jemand helfen.
Gruss