From 61bc131ae6e5991b85f59248f270db6a43afd02c Mon Sep 17 00:00:00 2001 From: Ishan Monie Date: Fri, 11 Apr 2025 19:00:20 -0700 Subject: [PATCH 1/4] Added ultrasonic sensor --- lowcar/devices/Device/defs.h | 4 +- .../devices/Ultrasonic/UltrasonicSensor.cpp | 40 +++++++++++++++++++ lowcar/devices/Ultrasonic/UltrasonicSensor.h | 22 ++++++++++ lowcar/devices/Ultrasonic/ultrasonic_test.ino | 25 ++++++++++++ 4 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 lowcar/devices/Ultrasonic/UltrasonicSensor.cpp create mode 100644 lowcar/devices/Ultrasonic/UltrasonicSensor.h create mode 100644 lowcar/devices/Ultrasonic/ultrasonic_test.ino diff --git a/lowcar/devices/Device/defs.h b/lowcar/devices/Device/defs.h index 913a941c..9c47dc7f 100644 --- a/lowcar/devices/Device/defs.h +++ b/lowcar/devices/Device/defs.h @@ -60,8 +60,8 @@ enum class DeviceType : uint8_t { SERVO_CONTROL = 0x04, POLAR_BEAR = 0x05, KOALA_BEAR = 0x06, - PDB = 0x07 - // DISTANCE_SENSOR = 0x07 Uncomment when implemented + PDB = 0x07, + DISTANCE_SENSOR = 0x08 //Uncomment when implemented }; // identification for resulting status types diff --git a/lowcar/devices/Ultrasonic/UltrasonicSensor.cpp b/lowcar/devices/Ultrasonic/UltrasonicSensor.cpp new file mode 100644 index 00000000..976b9cd9 --- /dev/null +++ b/lowcar/devices/Ultrasonic/UltrasonicSensor.cpp @@ -0,0 +1,40 @@ +#include "UltrasonicSensor.h" +#include + +// pin definitions for the ultrasonic sensor +const uint8_t UltrasonicSensor::trigPin = (const uint8_t) Digital::IO4; +const uint8_t UltrasonicSensor::echoPin = (const uint8_t) Digital::IO5; + +UltrasonicSensor::UltrasonicSensor() + : Device(DeviceType::DISTANCE_SENSOR, 1) { + ; +} + +void UltrasonicSensor::device_enable() { + pinMode(trigPin, OUTPUT); + pinMode(echoPin, INPUT); +} + +size_t UltrasonicSensor::device_read(uint8_t param, uint8_t* data_buf) { + // trigger the ultrasonic pulse + digitalWrite(trigPin, LOW); + delayMicroseconds(2); + digitalWrite(trigPin, HIGH); + delayMicroseconds(10); + digitalWrite(trigPin, LOW); + + long duration = pulseIn(echoPin, HIGH); + float distance = duration * 0.034f / 2.0f; // convert to cm + + float* data_ptr_float = (float*) data_buf; + *data_ptr_float = distance; + + return sizeof(float); +} + +size_t UltrasonicSensor::device_write(uint8_t param, uint8_t* data_buf) { + return 0; +} + +void UltrasonicSensor::device_actions() { +} \ No newline at end of file diff --git a/lowcar/devices/Ultrasonic/UltrasonicSensor.h b/lowcar/devices/Ultrasonic/UltrasonicSensor.h new file mode 100644 index 00000000..66859097 --- /dev/null +++ b/lowcar/devices/Ultrasonic/UltrasonicSensor.h @@ -0,0 +1,22 @@ +#ifndef ULTRASONIC_SENSOR_H +#define ULTRASONIC_SENSOR_H + +#include "Device.h" +#include "defs.h" + +class UltrasonicSensor : public Device { + public: + UltrasonicSensor(); + + virtual size_t device_read(uint8_t param, uint8_t* data_buf) override; + virtual size_t device_write(uint8_t param, uint8_t* data_buf) override; + virtual void device_enable() override; + virtual void device_reset() override; + virtual void device_actions() override; + + private: + static const uint8_t trigPin; + static const uint8_t echoPin; +}; + +#endif diff --git a/lowcar/devices/Ultrasonic/ultrasonic_test.ino b/lowcar/devices/Ultrasonic/ultrasonic_test.ino new file mode 100644 index 00000000..e2477839 --- /dev/null +++ b/lowcar/devices/Ultrasonic/ultrasonic_test.ino @@ -0,0 +1,25 @@ +#include "UltrasonicSensor.h" + +UltrasonicSensor sensor; + +void setup() { + Serial.begin(9600); + sensor.device_enable(); // sets up TRIG and ECHO +} + +void loop() { + uint8_t buffer[sizeof(float)]; + size_t bytes = sensor.device_read(0, buffer); + + if (bytes == sizeof(float)) { + float distance; + memcpy(&distance, buffer, sizeof(float)); + Serial.print("Distance: "); + Serial.print(distance); + Serial.println(" cm"); + } else { + Serial.println("Failed to read sensor data."); + } + + delay(500); +} From 05fb46f52f4ee2eaada8f70aefd99d8523151557 Mon Sep 17 00:00:00 2001 From: Brandon Wong Date: Fri, 11 Apr 2025 19:42:26 -0700 Subject: [PATCH 2/4] [LOWCAR] Added ultrasonic sensor runtime_util --- lowcar/devices/Device/defs.h | 2 +- lowcar/devices/Ultrasonic/UltrasonicSensor.h | 22 --------------- lowcar/devices/Ultrasonic/ultrasonic_test.ino | 25 ----------------- .../UltrasonicSensor.cpp | 27 ++++++++----------- .../UltrasonicSensor/UltrasonicSensor.h | 25 +++++++++++++++++ runtime_util/runtime_util.c | 8 ++++++ 6 files changed, 45 insertions(+), 64 deletions(-) delete mode 100644 lowcar/devices/Ultrasonic/UltrasonicSensor.h delete mode 100644 lowcar/devices/Ultrasonic/ultrasonic_test.ino rename lowcar/devices/{Ultrasonic => UltrasonicSensor}/UltrasonicSensor.cpp (50%) create mode 100644 lowcar/devices/UltrasonicSensor/UltrasonicSensor.h diff --git a/lowcar/devices/Device/defs.h b/lowcar/devices/Device/defs.h index 9c47dc7f..bcd2a8b6 100644 --- a/lowcar/devices/Device/defs.h +++ b/lowcar/devices/Device/defs.h @@ -61,7 +61,7 @@ enum class DeviceType : uint8_t { POLAR_BEAR = 0x05, KOALA_BEAR = 0x06, PDB = 0x07, - DISTANCE_SENSOR = 0x08 //Uncomment when implemented + ULTRASONIC_SENSOR = 0x08 }; // identification for resulting status types diff --git a/lowcar/devices/Ultrasonic/UltrasonicSensor.h b/lowcar/devices/Ultrasonic/UltrasonicSensor.h deleted file mode 100644 index 66859097..00000000 --- a/lowcar/devices/Ultrasonic/UltrasonicSensor.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef ULTRASONIC_SENSOR_H -#define ULTRASONIC_SENSOR_H - -#include "Device.h" -#include "defs.h" - -class UltrasonicSensor : public Device { - public: - UltrasonicSensor(); - - virtual size_t device_read(uint8_t param, uint8_t* data_buf) override; - virtual size_t device_write(uint8_t param, uint8_t* data_buf) override; - virtual void device_enable() override; - virtual void device_reset() override; - virtual void device_actions() override; - - private: - static const uint8_t trigPin; - static const uint8_t echoPin; -}; - -#endif diff --git a/lowcar/devices/Ultrasonic/ultrasonic_test.ino b/lowcar/devices/Ultrasonic/ultrasonic_test.ino deleted file mode 100644 index e2477839..00000000 --- a/lowcar/devices/Ultrasonic/ultrasonic_test.ino +++ /dev/null @@ -1,25 +0,0 @@ -#include "UltrasonicSensor.h" - -UltrasonicSensor sensor; - -void setup() { - Serial.begin(9600); - sensor.device_enable(); // sets up TRIG and ECHO -} - -void loop() { - uint8_t buffer[sizeof(float)]; - size_t bytes = sensor.device_read(0, buffer); - - if (bytes == sizeof(float)) { - float distance; - memcpy(&distance, buffer, sizeof(float)); - Serial.print("Distance: "); - Serial.print(distance); - Serial.println(" cm"); - } else { - Serial.println("Failed to read sensor data."); - } - - delay(500); -} diff --git a/lowcar/devices/Ultrasonic/UltrasonicSensor.cpp b/lowcar/devices/UltrasonicSensor/UltrasonicSensor.cpp similarity index 50% rename from lowcar/devices/Ultrasonic/UltrasonicSensor.cpp rename to lowcar/devices/UltrasonicSensor/UltrasonicSensor.cpp index 976b9cd9..c103e664 100644 --- a/lowcar/devices/Ultrasonic/UltrasonicSensor.cpp +++ b/lowcar/devices/UltrasonicSensor/UltrasonicSensor.cpp @@ -1,20 +1,13 @@ #include "UltrasonicSensor.h" -#include // pin definitions for the ultrasonic sensor -const uint8_t UltrasonicSensor::trigPin = (const uint8_t) Digital::IO4; -const uint8_t UltrasonicSensor::echoPin = (const uint8_t) Digital::IO5; +#define TRIG_PIN 16 +#define ECHO_PIN 14 -UltrasonicSensor::UltrasonicSensor() - : Device(DeviceType::DISTANCE_SENSOR, 1) { +UltrasonicSensor::UltrasonicSensor() : Device(DeviceType::ULTRASONIC_SENSOR, 1) { ; } -void UltrasonicSensor::device_enable() { - pinMode(trigPin, OUTPUT); - pinMode(echoPin, INPUT); -} - size_t UltrasonicSensor::device_read(uint8_t param, uint8_t* data_buf) { // trigger the ultrasonic pulse digitalWrite(trigPin, LOW); @@ -26,15 +19,17 @@ size_t UltrasonicSensor::device_read(uint8_t param, uint8_t* data_buf) { long duration = pulseIn(echoPin, HIGH); float distance = duration * 0.034f / 2.0f; // convert to cm - float* data_ptr_float = (float*) data_buf; - *data_ptr_float = distance; + float* float_buf = (float*) data_buf; + *float_buf = distance; return sizeof(float); } -size_t UltrasonicSensor::device_write(uint8_t param, uint8_t* data_buf) { - return 0; -} +void UltrasonicSensor::device_enable() { + // set all pins to INPUT mode + this->trigPin = TRIG_PIN; + this->echoPin = ECHO_PIN; -void UltrasonicSensor::device_actions() { + pinMode(this->trigPin, OUTPUT); + pinMode(this->echoPin, INPUT); } \ No newline at end of file diff --git a/lowcar/devices/UltrasonicSensor/UltrasonicSensor.h b/lowcar/devices/UltrasonicSensor/UltrasonicSensor.h new file mode 100644 index 00000000..e5c096de --- /dev/null +++ b/lowcar/devices/UltrasonicSensor/UltrasonicSensor.h @@ -0,0 +1,25 @@ +#ifndef ULTRASONIC_SENSOR_H +#define ULTRASONIC_SENSOR_H + +#include +#include "Device.h" +#include "defs.h" + +class UltrasonicSensor : public Device { + public: + // Constructor + UltrasonicSensor(); + + virtual size_t device_read(uint8_t param, uint8_t* data_buf); + virtual void device_enable(); + + // virtual void device_enable() override; + // virtual void device_reset() override; + // virtual void device_actions() override; + + private: + static uint8_t trigPin; + static uint8_t echoPin; +}; + +#endif diff --git a/runtime_util/runtime_util.c b/runtime_util/runtime_util.c index cf7febaa..d0a03eb0 100644 --- a/runtime_util/runtime_util.c +++ b/runtime_util/runtime_util.c @@ -116,6 +116,13 @@ device_t PDB = { {.name = "dv_cell3", .type = FLOAT, .read = 1, .write = 0}, {.name = "network_switch", .type = BOOL, .read = 1, .write = 0}}}; +device_t UltrasonicSensor = { + .type = 8, + .name = "UltrasonicSensor", + .num_params = 1, + .params = { + {.name = "distance", .type = FLOAT, .read = 1, .write = 0}}}; + // *********************** VIRTUAL DEVICE DEFINITIONS *********************** // // A CustomDevice is unusual because the parameters are dynamic @@ -216,6 +223,7 @@ __attribute__((constructor)) void devices_arr_init() { DEVICES[PolarBear.type] = &PolarBear; DEVICES[KoalaBear.type] = &KoalaBear; DEVICES[PDB.type] = &PDB; + DEVICES[UltrasonicSensor.type] = &UltrasonicSensor; DEVICES[CustomDevice.type] = &CustomDevice; DEVICES[SoundDevice.type] = &SoundDevice; DEVICES[TimeTestDevice.type] = &TimeTestDevice; From 2f8b16e87ad2f4deffa70912ca5bf66e76a2832f Mon Sep 17 00:00:00 2001 From: Brandon Wong Date: Fri, 11 Apr 2025 22:21:41 -0700 Subject: [PATCH 3/4] [LOWCAR] fixed issues with pin variables --- .../UltrasonicSensor/UltrasonicSensor.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lowcar/devices/UltrasonicSensor/UltrasonicSensor.cpp b/lowcar/devices/UltrasonicSensor/UltrasonicSensor.cpp index c103e664..38a8aa49 100644 --- a/lowcar/devices/UltrasonicSensor/UltrasonicSensor.cpp +++ b/lowcar/devices/UltrasonicSensor/UltrasonicSensor.cpp @@ -10,13 +10,13 @@ UltrasonicSensor::UltrasonicSensor() : Device(DeviceType::ULTRASONIC_SENSOR, 1) size_t UltrasonicSensor::device_read(uint8_t param, uint8_t* data_buf) { // trigger the ultrasonic pulse - digitalWrite(trigPin, LOW); + digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); - digitalWrite(trigPin, HIGH); + digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); - digitalWrite(trigPin, LOW); + digitalWrite(TRIG_PIN, LOW); - long duration = pulseIn(echoPin, HIGH); + long duration = pulseIn(ECHO_PIN, HIGH); float distance = duration * 0.034f / 2.0f; // convert to cm float* float_buf = (float*) data_buf; @@ -27,9 +27,9 @@ size_t UltrasonicSensor::device_read(uint8_t param, uint8_t* data_buf) { void UltrasonicSensor::device_enable() { // set all pins to INPUT mode - this->trigPin = TRIG_PIN; - this->echoPin = ECHO_PIN; + // this->trigPin = TRIG_PIN; + // this->echoPin = ECHO_PIN; - pinMode(this->trigPin, OUTPUT); - pinMode(this->echoPin, INPUT); + pinMode(TRIG_PIN, OUTPUT); + pinMode(ECHO_PIN, INPUT); } \ No newline at end of file From 189a89a2e2f57d7b596e7ecf7a28699dabb155b5 Mon Sep 17 00:00:00 2001 From: Brandon Wong Date: Fri, 11 Apr 2025 23:18:15 -0700 Subject: [PATCH 4/4] [LOWCAR] still having some issues with the sensor immediately disconnecting but cleaned it up a little --- lowcar/devices/UltrasonicSensor/UltrasonicSensor.cpp | 9 +++------ lowcar/devices/UltrasonicSensor/UltrasonicSensor.h | 4 ---- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/lowcar/devices/UltrasonicSensor/UltrasonicSensor.cpp b/lowcar/devices/UltrasonicSensor/UltrasonicSensor.cpp index 38a8aa49..528771ee 100644 --- a/lowcar/devices/UltrasonicSensor/UltrasonicSensor.cpp +++ b/lowcar/devices/UltrasonicSensor/UltrasonicSensor.cpp @@ -4,7 +4,7 @@ #define TRIG_PIN 16 #define ECHO_PIN 14 -UltrasonicSensor::UltrasonicSensor() : Device(DeviceType::ULTRASONIC_SENSOR, 1) { +UltrasonicSensor::UltrasonicSensor() : Device(DeviceType::ULTRASONIC_SENSOR, 17) { ; } @@ -12,6 +12,7 @@ size_t UltrasonicSensor::device_read(uint8_t param, uint8_t* data_buf) { // trigger the ultrasonic pulse digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); + digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); @@ -20,16 +21,12 @@ size_t UltrasonicSensor::device_read(uint8_t param, uint8_t* data_buf) { float distance = duration * 0.034f / 2.0f; // convert to cm float* float_buf = (float*) data_buf; - *float_buf = distance; + float_buf[0] = distance; return sizeof(float); } void UltrasonicSensor::device_enable() { - // set all pins to INPUT mode - // this->trigPin = TRIG_PIN; - // this->echoPin = ECHO_PIN; - pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); } \ No newline at end of file diff --git a/lowcar/devices/UltrasonicSensor/UltrasonicSensor.h b/lowcar/devices/UltrasonicSensor/UltrasonicSensor.h index e5c096de..53c1e4f2 100644 --- a/lowcar/devices/UltrasonicSensor/UltrasonicSensor.h +++ b/lowcar/devices/UltrasonicSensor/UltrasonicSensor.h @@ -13,10 +13,6 @@ class UltrasonicSensor : public Device { virtual size_t device_read(uint8_t param, uint8_t* data_buf); virtual void device_enable(); - // virtual void device_enable() override; - // virtual void device_reset() override; - // virtual void device_actions() override; - private: static uint8_t trigPin; static uint8_t echoPin;