Browse Source

Implement speed control

- Current version of Adafruit MCP4725 library hangs at begin()
  It's either software or hardware issue. Need to migrate to pure
  Wire and check where is issue.
Alexey Edelev 4 years ago
parent
commit
46db351e51

+ 38 - 4
Arduino/eScooterControl/accelerationcontrol.cpp

@@ -26,15 +26,25 @@
 #include "accelerationcontrol.h"
 #include "pinconfig.h"
 
-const int AcceleratorSensorDivider = (AcceleratorSensorMaxValue - AcceleratorSensorMinValue) * AcceleratorSensorStep;
+const int AcceleratorSensorDivider = AcceleratorSensorDiff * AcceleratorSensorStep;
+
+const int MaxLevel = 100/AcceleratorSensorStep;
 
 AccelerationControl::AccelerationControl() : m_stopState(HIGH)
+  , m_acceleratorMinValue(0)
   , m_accelerationLevel(0)
   , m_accelerationVoltage(0)
   , m_cruiseTime(0)
   , m_cruiseLevel(0)
 {
-//  m_accelerator.begin(0x62);//TODO address to be setup from pinconfig;
+  bool result = m_accelerator.begin(0x60);//TODO address to be setup from pinconfig;
+  m_accelerator.setVoltage(0, false);
+
+//  if (!result) {
+//    Serial.println("unable to find on 0x62");
+//  } else {
+//    Serial.println("0x62 ok");
+//  }
   pinMode(AcceleratorSensorPin, INPUT);
   pinMode(StopSensorPin, INPUT_PULLUP);
   attachInterrupt(digitalPinToInterrupt(StopSensorPin), [](){
@@ -42,6 +52,9 @@ AccelerationControl::AccelerationControl() : m_stopState(HIGH)
   }, CHANGE);
 
   m_stopState = digitalRead(StopSensorPin);
+  m_acceleratorMinValue = analogRead(AcceleratorSensorPin);
+//  Serial.print("Accelerator min value: ");
+//  Serial.println(m_acceleratorMinValue);
 }
 
 
@@ -82,14 +95,35 @@ void AccelerationControl::stop() {
 int AccelerationControl::readAcceleratorData()
 {
   int value = analogRead(AcceleratorSensorPin);
-  return round(100.0*(value - AcceleratorSensorMinValue)/AcceleratorSensorDivider);
+  if (value < m_acceleratorMinValue) {
+    m_acceleratorMinValue = value; //Andjust min value accordingly
+  }
+//  Serial.print("Accelerator sensor: ");
+//  Serial.print(value);
+//  Serial.print(" ");
+  int outValue = round(100.0*(value - m_acceleratorMinValue)/AcceleratorSensorDivider);
+  if (outValue > MaxLevel) {
+    outValue = MaxLevel;
+  } else if (outValue < 0) {
+    outValue = 0;
+  }
+//  Serial.println(outValue);
+  return outValue;
 }
 
 void AccelerationControl::updateAccelerationVoltage() {
+//  Serial.print("Acceleration level: ");
+//  Serial.println(m_accelerationLevel);
+
   int level = m_accelerationLevel;
   if (m_cruiseLevel > 0) {//At cruise control
     level = m_cruiseLevel;
   }
 
-  int expectedVoltage = 0x0fff / AcceleratorSensorStep * level;
+  int expectedVoltage = round(float(0x0fff) / float(AcceleratorSensorStep) * float(level));
+  m_accelerator.setVoltage(expectedVoltage, false);
+
+  float voltage = 5.0f / 0x0fff * float(expectedVoltage);
+//  Serial.print("Expected voltage: ");
+//  Serial.println(voltage);
 }

+ 1 - 0
Arduino/eScooterControl/accelerationcontrol.h

@@ -47,6 +47,7 @@ private:
 
   unsigned int m_stopState;
   
+  int m_acceleratorMinValue;
   unsigned int m_accelerationLevel;
   unsigned int m_accelerationVoltage;
 

+ 10 - 7
Arduino/eScooterControl/eScooterControl.ino

@@ -42,23 +42,26 @@ void setup() {
 //  Serial.begin(115200);
 //  Serial.println("Init");
 
+  AccelerationControl::instance();
+  gAcceleratorPedalThread.assignCallback([](unsigned long time) {
+    AccelerationControl::instance()->dispatch(time);
+  });
+
   Speedometer::instance()->attachToDisplay(Display::instance());
-  
-  gDisplayThread.assignCallback([](unsigned long){
+
+  Display::instance();
+  gDisplayThread.assignCallback([](unsigned long) {
     Display::instance()->updateDisplayBuffer();
   });
 
-  gBatteryThread.assignCallback([](unsigned long){
+  gBatteryThread.assignCallback([](unsigned long) {
     Display::instance()->drawBatteryLevel(fakeBatteryLevel);
     fakeBatteryLevel++;
     if (fakeBatteryLevel > 5) {
       fakeBatteryLevel = 0;
     }
   });
-
-  gAcceleratorPedalThread.assignCallback([](unsigned long time){
-    AccelerationControl::instance()->dispatch(time);
-  });
+//  Serial.println("Init complete");
 }
 
 void loop() {

+ 3 - 2
Arduino/eScooterControl/pinconfig.h

@@ -40,8 +40,9 @@ const int DisplayClkPin = 12;
 const int AcceleratorSensorPin = A0;
 
 //Align accelerator trigger values
-const int AcceleratorSensorMinValue = 177;
-const int AcceleratorSensorMaxValue = 874;
+const int AcceleratorSensorDiff = 548;
 const int AcceleratorSensorStep = 10;
 
 const int CruiseTime = 3000; //milliseconds
+
+const uint8_t AcceleratorAddress = 0x62;