Hallo ihr lieben,
aus einem früheren Projekt habe ich noch einen 4wd Code, der auch grundsätzlich auch sehr gut funktioniert. Das einzige Problem was ich habe, etwa es dreht sich ein Rad oder beide entgegengesetzt. Was muss ich ändern, damit es auch für mein 2wd Gefährt nutzbar ist?
#include <SoftwareSerial.h>
SoftwareSerial BlueTooth(8, 9);
#include <Arduino.h>
#include <IRremote.h>
int RECV_PIN = 3;
IRrecv irrecv(RECV_PIN);
long irr_val;
decode_results results;
int in1 = 5;
int in2 = 6;
int in3 = 10;
int in4 = 11;
int speeds = 125;
const int servopin = A3;
int trigPin = A4;
int echoPin = A5;
int distance, distance_l, distance_r;
char BLE_val;
void setup() {
BlueTooth.begin(9600);
Serial.begin(9600);
Serial.println("Enabling IRin");
irrecv.enableIRIn();
Serial.println("Enabled IRin");
pinMode(in1,OUTPUT);
pinMode(in2,OUTPUT);
pinMode(in3,OUTPUT);
pinMode(in4,OUTPUT);
servopulse(servopin,90);
delay(300);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
if(BlueTooth.available()>0) {
BLE_val = BlueTooth.read();
Serial.println(BLE_val);
}
switch(BLE_val)
{
case 'F' : car_front();
break;
case 'B' : car_back();
break;
case 'L' : car_left();
break;
case 'R' : car_right();
break;
case 'S' : car_Stop();
break;
case 'a' : speeds_a();
break;
case 'd' : speeds_d();
break;
case 'Y': avoid();
break;
case 'X': IRRemote();
break;
}
}
void car_back()
{
analogWrite(in1,125);
analogWrite(in2,125);
analogWrite(in3,0);
analogWrite(in4,0);
}
void car_front()
{
analogWrite(in1,0);
analogWrite(in2,125);
analogWrite(in3,0);
analogWrite(in4,125);
}
void car_left()
{
analogWrite(in1,125);
analogWrite(in2,0);
analogWrite(in3,0);
analogWrite(in4,0);
}
void car_right()
{
analogWrite(in1,0);
analogWrite(in2,125);
analogWrite(in3,0);
analogWrite(in4,0);
}
void car_Stop()
{
digitalWrite(in1,LOW);
digitalWrite(in2,LOW);
digitalWrite(in3,LOW);
digitalWrite(in4,LOW);
}
void speeds_a() {
while (1) {
Serial.println(speeds);
if (speeds < 255) {
speeds++;
delay(10);
}
BLE_val = BlueTooth.read();
if (BLE_val == 'S')
break;
}
}
void speeds_d() {
while (1) {
Serial.println(speeds);
if (speeds > 0) { //down to 0
speeds--;
delay(10);
}
BLE_val = BlueTooth.read();
if (BLE_val == 'S')
break;
}
}
int get_distance() {
int distance = 0;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
distance = pulseIn(echoPin, HIGH) / 58;
to the distance (unit: cm)
Serial.println(distance);
return distance;
}
void avoid() {
int avoid_flag = 1;
while (avoid_flag) {
distance = get_distance();
if (distance > 0 && distance < 20) {
car_Stop();
delay(1000);
servopulse(servopin,160);
delay(500);
distance_l = get_distance();
delay(100);
servopulse(servopin,20);
delay(500);
distance_r = get_distance();
delay(100);
if (distance_l > distance_r) {
car_left();
servopulse(servopin,90);
delay(700);
}
else {
car_right();
servopulse(servopin,90);
delay(700);
}
}
else {
car_front();
}
BLE_val = BlueTooth.read();
if (BLE_val == 'S') {
avoid_flag = 0;
car_Stop();
}
}
}
void IRRemote() {
if (irrecv.decode(&results))
{
irr_val = results.value;
Serial.println(irr_val, HEX);
switch(irr_val)
{
case 0xFF629D : car_back();
break;
case 0xFFA857 : car_front();
break;
case 0xFF22DD : car_left();
break;
case 0xFFC23D : car_right();
break;
case 0xFF02FD : car_Stop();
break;
}
irrecv.resume();
}
}
void servopulse(int servopin,int myangle)
{
for(int i=0; i<30; i++)
{
int pulsewidth = (myangle*11)+500;
digitalWrite(servopin,HIGH);
delayMicroseconds(pulsewidth);
digitalWrite(servopin,LOW);
delay(20-pulsewidth/1000);
}
}