Browse Source

Migrate to direct wire usage for acceleration control

- Add initialization delays, to supress intial voltage jumps effect
  for peripheral devices
- Replace adafruit MCP library with pure Wire. Transmission without
  data at setup() phase breaks application.
Alexey Edelev 4 years ago
parent
commit
54415849f1

+ 8 - 12
Arduino/eScooterControl/accelerationcontrol.cpp

@@ -25,6 +25,7 @@
 #include "singleton.h"
 #include "accelerationcontrol.h"
 #include "pinconfig.h"
+#include "Wire.h"
 
 const int AcceleratorSensorDivider = AcceleratorSensorDiff * AcceleratorSensorStep;
 
@@ -37,14 +38,7 @@ AccelerationControl::AccelerationControl() : m_stopState(HIGH)
   , m_cruiseTime(0)
   , m_cruiseLevel(0)
 {
-  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");
-//  }
+  Wire.begin();
   pinMode(AcceleratorSensorPin, INPUT);
   pinMode(StopSensorPin, INPUT_PULLUP);
   attachInterrupt(digitalPinToInterrupt(StopSensorPin), [](){
@@ -53,8 +47,6 @@ AccelerationControl::AccelerationControl() : m_stopState(HIGH)
 
   m_stopState = digitalRead(StopSensorPin);
   m_acceleratorMinValue = analogRead(AcceleratorSensorPin);
-//  Serial.print("Accelerator min value: ");
-//  Serial.println(m_acceleratorMinValue);
 }
 
 
@@ -121,9 +113,13 @@ void AccelerationControl::updateAccelerationVoltage() {
   }
 
   int expectedVoltage = round(float(0x0fff) / float(AcceleratorSensorStep) * float(level));
-  m_accelerator.setVoltage(expectedVoltage, false);
+  Wire.beginTransmission(AcceleratorAddress);
+  Wire.write(64);
+  Wire.write(expectedVoltage >> 4);
+  Wire.write((expectedVoltage & 15) << 4);
+  Wire.endTransmission();
 
-  float voltage = 5.0f / 0x0fff * float(expectedVoltage);
+//  float voltage = 5.0f / 0x0fff * float(expectedVoltage);
 //  Serial.print("Expected voltage: ");
 //  Serial.println(voltage);
 }

+ 0 - 3
Arduino/eScooterControl/accelerationcontrol.h

@@ -25,7 +25,6 @@
 
 #pragma once
 
-#include <Adafruit_MCP4725.h>
 #include "singleton.h"
 
 class AccelerationControl : public Singleton<AccelerationControl>
@@ -43,8 +42,6 @@ private:
   
   void stop();
 
-  Adafruit_MCP4725 m_accelerator;
-
   unsigned int m_stopState;
   
   int m_acceleratorMinValue;

+ 6 - 3
Arduino/eScooterControl/eScooterControl.ino

@@ -42,19 +42,22 @@ void setup() {
 //  Serial.begin(115200);
 //  Serial.println("Init");
 
+  delay(1000);
   AccelerationControl::instance();
-  gAcceleratorPedalThread.assignCallback([](unsigned long time) {
+  gAcceleratorPedalThread.assignCallback([](unsigned long time){
     AccelerationControl::instance()->dispatch(time);
   });
 
+  delay(500);
   Speedometer::instance()->attachToDisplay(Display::instance());
 
+  delay(500);
   Display::instance();
-  gDisplayThread.assignCallback([](unsigned long) {
+  gDisplayThread.assignCallback([](unsigned long){
     Display::instance()->updateDisplayBuffer();
   });
 
-  gBatteryThread.assignCallback([](unsigned long) {
+  gBatteryThread.assignCallback([](unsigned long){
     Display::instance()->drawBatteryLevel(fakeBatteryLevel);
     fakeBatteryLevel++;
     if (fakeBatteryLevel > 5) {

+ 1 - 1
Arduino/eScooterControl/pinconfig.h

@@ -45,4 +45,4 @@ const int AcceleratorSensorStep = 10;
 
 const int CruiseTime = 3000; //milliseconds
 
-const uint8_t AcceleratorAddress = 0x62;
+const uint8_t AcceleratorAddress = 0x60;