Introduction: STM32duino Gauge

This project is a breadboard design of a CanBus Gauge that uses an STM32 Blue pill, DRV8833 and MCP 2551.

If you prefer videos there will be link at the end!

Supplies

  • 1 STM32 Bluepill
  • 1 MCP 2551 Breakout
  • Breadboards
  • 1 X27.168 Stepper Motor
  • 1 Red LED
  • 1 220ohm resistor
  • ~25 prototyping wires
  • 1 pololu DRV8833 Breakout

Step 1: Rough Out the Breadboard

In this step we get all the main components layout on the breadboard. We also get some wiring done. Mostly all the 5V+ lines and Ground lines. We can also start putting in some of the wires to the microcontroller but these may move as we start writing the code.

Step 2: Code!

Below is some barebones code for this to get it to work. I would suggest editing to your needs. Follow along in the code for wiring. for example the sleep pin on the DRV8833 goes to pin PB13 on the STM32.

#include <eXoCAN.h>
#include <Stepper.h>
#include <Adafruit_NeoPixel.h>

// backlight setup
Adafruit_NeoPixel pixels(3, PB4, NEO_GRB + NEO_KHZ800);
char lrgb[3];

// Stepper & erro light setup
int stepsPerRevolution = 635;
int stepperSpeed = 60;
int pos, val, light, motor;

Stepper x27(stepsPerRevolution, PB6, PB7, PB8, PB9); // initialize the stepper library


// Can setup
eXoCAN can(STD_ID_LEN, BR250K, PORTA_11_12_XCVR);
int PodId = 0x003;   // ID for rx filtering   <--- Must be different for each pod
int id, fltIdx;

//Read can Function
inline void canRead(bool print = false) 
{
  if (can.rxMsgLen >= 0)
  {
    if (print)
    {
      if (can.id == PodId)
      {// if statement catches any missed by filter.
      light = (can.rxData.bytes[0]); // first byte is for idiot light
      int m1 = (can.rxData.bytes[1]); // next 3 are added to make the 635 steps of the stepper motor
      int m2 = (can.rxData.bytes[2]);
      int m3 = (can.rxData.bytes[3]);
       motor =   m1 + m2 + m3;
    }
    if(can.id == 0x002){ //0x002 is the backlight
      lrgb[1] = (can.rxData.bytes[0]);
      lrgb[2] = (can.rxData.bytes[1]);
      lrgb[3] = (can.rxData.bytes[2]);
      }
    can.rxMsgLen = -1;
  }
  // return id;
}}

void canISR() // get bus msg frame passed by a filter to FIFO0
{
  can.filterMask16Init(0, PodId, 0x7ff, 0x002, 0x7ff); // supposed to filter messages... always misses the first wrong one
  can.rxMsgLen = can.receive(can.id, fltIdx, can.rxData.bytes); // get CAN msg
  
}

//light function
inline void idiot()
{
 if (light == 1)
 {
  digitalWrite(PB5, HIGH);
  } else {
  digitalWrite(PB5, LOW); 
  }
}

//zero function
inline void x27zero()
{
  x27.setSpeed(stepperSpeed);
  x27.step(-stepsPerRevolution);
  delay(10);
  x27.step(5); //less likely to bottom out now. leaves 595 useable steps but I suggest skipping last 5 also
  pos = 5;  // needs to be the same number as the skipped steps
}

void x27move(unsigned int npos)
{
 if (pos != npos && npos <= stepsPerRevolution){
   val = npos - pos;
   pos = npos;
   x27.step(val);
 }
}

void ws2812(){
  for(int i=0; i<3; i++) { 
    pixels.setPixelColor(i, pixels.Color(lrgb[1], lrgb[2], lrgb[3]));
    pixels.show();   
    }
}
void setup() {
  Serial.begin(112500);
  can.attachInterrupt(canISR);
  pinMode(PB5, OUTPUT); //idiot light pin
  pinMode(PB12, OUTPUT);
  digitalWrite(PB12, HIGH);
  x27zero();
  can.enableInterrupt(); // enable rx interrupt
  pixels.begin();
  pixels.clear();
}

void loop() {
  canRead(true); 
  idiot();
  x27move(motor);
  ws2812();
}<br>

Step 3: Design a PCB for It!

Follow the youtube channel Fixed Until Broken to see how I designed this.

Good new is this a very simple to do yourself in Kicad or if you have no experience designing PCBs EasyEDA might be a better fit. If you don't want use the Bluepill and just want to use STM32F103 or you just want to use the dvr8833 and not the module/breakout board than download the schematics for these to use to help you design your board.

Just don't forget to put Pin 3 / pin 6 of your DRV8833 to ground. ( That is the mistake I made in my design). It was easy to overcome my mistake but scraping off some solder mask and running a jump/bodge wire.

Step 4: Order and Build Your Gauge!

NextPCB Sponsored this build so I would suggest using them to build your copy of this project. Files are here on github. https://github.com/garnerm91/STM32_pod

⭐Register to get free $100 coupons: https://www.nextpcb.com?code=matt

⭐Double-sided PCB assembly free shipping: https://www.nextpcb.com/pcb-assembly-services?cod...

⭐Free PCB File checker: https://www.nextpcb.com/pcb-assembly-services?cod...

Step 5: Video!