diff --git a/BLE_uart_coderacer/BLE_uart_coderacer.ino b/BLE_uart_coderacer/BLE_uart_coderacer.ino new file mode 100644 index 0000000..4c4a0c0 --- /dev/null +++ b/BLE_uart_coderacer/BLE_uart_coderacer.ino @@ -0,0 +1,181 @@ +#include + +/* + Video: https://www.youtube.com/watch?v=oCMOYS71NIU + Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleNotify.cpp + Ported to Arduino ESP32 by Evandro Copercini + + Create a BLE server that, once we receive a connection, will send periodic notifications. + The service advertises itself as: 6E400001-B5A3-F393-E0A9-E50E24DCCA9E + Has a characteristic of: 6E400002-B5A3-F393-E0A9-E50E24DCCA9E - used for receiving data with "WRITE" + Has a characteristic of: 6E400003-B5A3-F393-E0A9-E50E24DCCA9E - used to send data with "NOTIFY" + + The design of creating the BLE server is: + 1. Create a BLE Server + 2. Create a BLE Service + 3. Create a BLE Characteristic on the Service + 4. Create a BLE Descriptor on the characteristic + 5. Start the service. + 6. Start advertising. + + In this example rxValue is the data received (only accessible inside that function). + And txValue is the data to be sent, in this example just a byte incremented every second. +*/ +#include +#include +#include +#include + + +#define LED_VORWAERTS 26 // Pin an dem die VORWÄRTS LED angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. +#define LED_STOP 25 // Pin an dem die STOP LED angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. +#define LED_LINKS 27 // Pin an dem die LINKS LED angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. +#define LED_RECHTS 33 + +BLECharacteristic *pCharacteristic; +bool deviceConnected = false; +uint8_t txValue = 0; +char CRstatus = 0; + +// See the following for generating UUIDs: +// https://www.uuidgenerator.net/ + +#define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID +#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E" +#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E" + + +class MyServerCallbacks: public BLEServerCallbacks { + void onConnect(BLEServer* pServer) { + deviceConnected = true; + }; + + void onDisconnect(BLEServer* pServer) { + deviceConnected = false; + } +}; + +class MyCallbacks: public BLECharacteristicCallbacks { + void onWrite(BLECharacteristic *pCharacteristic) { + std::string rxValue = pCharacteristic->getValue(); + + if (rxValue.length() > 0) { + Serial.println("*********"); + Serial.print("Received Value: "); + for (int i = 0; i < rxValue.length(); i++) + { + + CRstatus = rxValue[i]; + Serial.print(CRstatus); + + }; + + Serial.println(); + Serial.println("*********"); + } + } +}; + +CodeRacer coderacer; + +void setup() { + Serial.begin(115200); + /* + pinMode(LED_VORWAERTS, OUTPUT); // LED Vorwärts ist ein Ausgang + pinMode(LED_STOP, OUTPUT); // LED Stop ist ein Ausgang + pinMode(LED_LINKS, OUTPUT); // LED Links ist ein Ausgang + pinMode(LED_RECHTS, OUTPUT); // LED Rechts ist ein Ausgang + // alle LEDS aus + digitalWrite(LED_VORWAERTS, LOW); + digitalWrite(LED_STOP, LOW); + digitalWrite(LED_LINKS, LOW); + digitalWrite(LED_RECHTS, LOW); + */ + // CodeRacer initialisieren + coderacer.begin(); + coderacer.servo_mitte(); + coderacer.motor_einstellungen(255,255,200,200); + + // Create the BLE Device + BLEDevice::init("UART Service"); + + // Create the BLE Server + BLEServer *pServer = BLEDevice::createServer(); + pServer->setCallbacks(new MyServerCallbacks()); + + // Create the BLE Service + BLEService *pService = pServer->createService(SERVICE_UUID); + + // Create a BLE Characteristic + pCharacteristic = pService->createCharacteristic( + CHARACTERISTIC_UUID_TX, + BLECharacteristic::PROPERTY_NOTIFY + ); + + pCharacteristic->addDescriptor(new BLE2902()); + + BLECharacteristic *pCharacteristic = pService->createCharacteristic( + CHARACTERISTIC_UUID_RX, + BLECharacteristic::PROPERTY_WRITE + ); + + pCharacteristic->setCallbacks(new MyCallbacks()); + + // Start the service + pService->start(); + + // Start advertising + pServer->getAdvertising()->start(); + Serial.println("Waiting a client connection to notify..."); +} + +void loop() { + + + switch (CRstatus) { + case '0': // + Serial.println("STOP"); + //digitalWrite(LED_STOP, HIGH); + coderacer.anhalten(); + break; + case '1': + Serial.println("VOR"); + //digitalWrite(LED_VORWAERTS, HIGH); + coderacer.vorwaerts(); + break; + case '2': + Serial.println("LINKS"); + //digitalWrite(LED_LINKS, HIGH); + coderacer.links_dreh(); + break; + case '3': + Serial.println("RECHTS"); + //digitalWrite(LED_RECHTS, HIGH); + coderacer.rechts_dreh(); + break; + case '4': + Serial.println("ZURUECK"); // hier gibt es keine LED + coderacer.rueckwaerts(); + break; + //default: + //Serial.println("Kommando unbekannt"); + + } + + + + //if (deviceConnected) { + // Serial.printf("*** Sent Value: %d ***\n", txValue); + // pCharacteristic->setValue(&txValue, 1); + // pCharacteristic->notify(); + // txValue++; + //} + delay(100); + + /* + digitalWrite(LED_VORWAERTS, LOW); + digitalWrite(LED_STOP, LOW); + digitalWrite(LED_LINKS, LOW); + digitalWrite(LED_RECHTS, LOW); + */ +} diff --git a/Doku/buttons/Stop_hand.png b/Doku/buttons/Stop_hand.png new file mode 100644 index 0000000..8b9d0ee Binary files /dev/null and b/Doku/buttons/Stop_hand.png differ diff --git a/Doku/buttons/coderacer_links.png b/Doku/buttons/coderacer_links.png new file mode 100644 index 0000000..efb55b6 Binary files /dev/null and b/Doku/buttons/coderacer_links.png differ diff --git a/Doku/buttons/coderacer_oben.png b/Doku/buttons/coderacer_oben.png new file mode 100644 index 0000000..7a980fe Binary files /dev/null and b/Doku/buttons/coderacer_oben.png differ diff --git a/Doku/buttons/coderacer_rechts.png b/Doku/buttons/coderacer_rechts.png new file mode 100644 index 0000000..8d11e5b Binary files /dev/null and b/Doku/buttons/coderacer_rechts.png differ diff --git a/Doku/buttons/coderacer_rueckwaerts.png b/Doku/buttons/coderacer_rueckwaerts.png new file mode 100644 index 0000000..6ae49b3 Binary files /dev/null and b/Doku/buttons/coderacer_rueckwaerts.png differ diff --git a/Doku/coderacer_Wireless.pdf b/Doku/coderacer_Wireless.pdf new file mode 100644 index 0000000..0e7c764 Binary files /dev/null and b/Doku/coderacer_Wireless.pdf differ diff --git a/Doku/coderacer_Wireless.pptx b/Doku/coderacer_Wireless.pptx new file mode 100644 index 0000000..b6ac34c Binary files /dev/null and b/Doku/coderacer_Wireless.pptx differ diff --git a/Doku/coderacer_vorwärts.png b/Doku/coderacer_vorwaerts.png similarity index 100% rename from Doku/coderacer_vorwärts.png rename to Doku/coderacer_vorwaerts.png diff --git a/ESP32_BLE.aia b/ESP32_BLE.aia new file mode 100644 index 0000000..6f63f6c Binary files /dev/null and b/ESP32_BLE.aia differ