Moin Moin,
also ich hab mir endlich einen funktionfähigen Bluetooth Ultrasensor Robot Car programmiert
Nun würde ich gerne noch eine Variable Geschwindigkeitskontrolle einbauen. Mein RC-Controller hat eine Servokontrolle mit Bezeichnung J oder K inkl. Der Bereich 0 bis 180 würde mir ausreichen und so hab ich mir gedacht, man könnte es ja vielleicht umfunktionieren. Also wenn ich Servokontrolle J auf 70 schiebe, fährt das Auto "70" usw.
Nun ist die Frage, wie bekomme ich den Wert aus J gelesen und in eine Variable geschrieben, die motor1.setSpeed(120); übernimmt. Ich weiß nicht wie ich Buchstaben J einen Wertebereich hinzufügen soll.
Wenn ich bis jetzt vom SerMo erhalte ist
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
FailChar: 4A
#include <AFMotor.h>
#include <Arduino.h>
#include <HCSR04.h>
#include <SoftwareSerial.h>
SoftwareSerial BlueTooth(10, 11); // RX, TX
byte triggerPin = 9;
byte echoPin = 7;
int duration, distance;
int number;
char BT_input;
char oldInput;
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);
unsigned char smile[] = { 0x00, 0x00, 0x1c, 0x02, 0x02, 0x02, 0x5c, 0x40, 0x40, 0x5c, 0x02, 0x02, 0x02, 0x1c, 0x00, 0x00 };
unsigned char herz[] = { 0x00, 0x00, 0x00, 0x0c, 0x12, 0x21, 0x41, 0x82, 0x41, 0x21, 0x12, 0x0c, 0x00, 0x00, 0x00, 0x00 };
unsigned char vor[] = { 0x00, 0x00, 0x02, 0x04, 0x09, 0x12, 0x24, 0x48, 0x90, 0x48, 0x24, 0x12, 0x09, 0x04, 0x02, 0x00 };
#define SCL_Pin A4
#define SDA_Pin A5
void setup() {
Serial.begin(57600);
Serial.println(F("Start..."));
BlueTooth.begin(9600);
pinMode(SCL_Pin, OUTPUT);
pinMode(SDA_Pin, OUTPUT);
}
void loop() {
motor1.setSpeed(120);
motor2.setSpeed(120);
motor3.setSpeed(120);
motor4.setSpeed(120);
pinMode(triggerPin, OUTPUT);
pinMode(echoPin, INPUT);
bluetooth();
getData();
}
void getData() {
while (BlueTooth.available()) {
//char myChar = Serial.read();
char myChar = BlueTooth.read();
if (isAlpha(myChar)) {
myChar = ucase(myChar);
switch (myChar) {
case 'Y':
case 'X':
case 'B': //backward
case 'F': //forward
case 'L': //left
case 'R': //right
case 'S': //stop
Serial.print(F("Input Char: "));
Serial.println(myChar);
BT_input = myChar;
break; //gültiges Zeichen
default:
if (myChar >= ' ') {
Serial.print(F("FailChar: "));
Serial.println(myChar, HEX);
BT_input = 'S';
}
}
}
}
if (oldInput != BT_input) {
car_Stop();
delay(20); // kurze Pause schont die Antriebe!
oldInput = BT_input;
}
}
char ucase(const char c) {
if (c >= 'a' && c <= 'z') {
return (c + ('A' - 'a'));
}
return c;
}
void bluetooth() {
getData();
switch (BT_input) {
case 'X': switchdrive();break;
case 'Y': bluetooth();break;
case 'B': car_back(); break;
case 'F': car_front(); break;
case 'L': car_left(); break;
case 'R': car_right(); break;
case 'S': car_Stop(); break;
}
}
void geschwindigkeit (){
getData();
if (BT_input='K')
}
void switchdrive() {
distance = 0;
digitalWrite(triggerPin, LOW);
delayMicroseconds(4);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = round(duration * .0343) / 2;
Serial.print("Distance: ");
Serial.println(distance);
delay(100);
switch (distance) {
case 1 ... 15:
car_front();
Serial.println("zurueck");
delay(1200);
drive();
Serial.println(number);
matrix_display(herz);
break;
case 16 ... 30:
motor1.setSpeed(90);
motor2.setSpeed(90);
motor3.setSpeed(90);
motor4.setSpeed(90);
car_back();
Serial.println("langsam vor");
matrix_display(smile);
break;
case 31 ... 45:
car_back();
Serial.println("Vorwaerts");
matrix_display(vor);
break;
default:
car_back();
Serial.println("default");
matrix_display(vor);
break;
}
}
void drive() {
number = random(3);
if (number == 1) {
car_left();
delay(1500);
}
else {
car_right();
delay(1500);
}
}
void car_back() {
motor1.run(BACKWARD);
motor2.run(BACKWARD);
motor3.run(BACKWARD);
motor4.run(BACKWARD);
}
void car_front() {
motor1.run(FORWARD);
motor2.run(FORWARD);
motor3.run(FORWARD);
motor4.run(FORWARD);
}
void car_left() {
motor1.run(RELEASE);
motor2.run(RELEASE);
motor3.run(FORWARD);
motor4.run(FORWARD);
}
void car_right() {
motor3.run(RELEASE);
motor4.run(RELEASE);
motor1.run(FORWARD);
motor2.run(FORWARD);
}
void car_Stop() {
motor1.run(RELEASE);
motor2.run(RELEASE);
motor3.run(RELEASE);
motor4.run(RELEASE);
}
void matrix_display(unsigned char matrix_value[]) {
IIC_start(); //the function that calls the data transfer start condition
IIC_send(0xc0); //select address
for (int i = 0; i < 16; i++) //the pattern data is 16 bytes
{
IIC_send(matrix_value[i]); //Transmit the data of the pattern
}
IIC_end(); //End pattern data transmission
IIC_start();
IIC_send(0x8A); //Display control, select 4/16 pulse width
IIC_end();
}
//Conditions under which data transmission begins
void IIC_start() {
digitalWrite(SDA_Pin, HIGH);
digitalWrite(SCL_Pin, HIGH);
delayMicroseconds(3);
digitalWrite(SDA_Pin, LOW);
delayMicroseconds(3);
digitalWrite(SCL_Pin, LOW);
}
//Indicates the end of data transmission
void IIC_end() {
digitalWrite(SCL_Pin, LOW);
digitalWrite(SDA_Pin, LOW);
delayMicroseconds(3);
digitalWrite(SCL_Pin, HIGH);
delayMicroseconds(3);
digitalWrite(SDA_Pin, HIGH);
delayMicroseconds(3);
}
//transmit data
void IIC_send(unsigned char send_data) {
for (byte mask = 0x01; mask != 0; mask <<= 1) //Each byte has 8 bits and is checked bit by bit starting at the lowest level
{
if (send_data & mask) { //Sets the high and low levels of SDA_Pin depending on whether each bit of the byte is a 1 or a 0
digitalWrite(SDA_Pin, HIGH);
} else {
digitalWrite(SDA_Pin, LOW);
}
delayMicroseconds(3);
digitalWrite(SCL_Pin, HIGH); //Pull the clock pin SCL_Pin high to stop data transmission
delayMicroseconds(3);
digitalWrite(SCL_Pin, LOW); //pull the clock pin SCL_Pin low to change the SIGNAL of SDA
}
}