Pedal & Button Controller (eng)

During building my pedals, I decided to make my own pedal controller using cheep and affordable components. Already having some  experience with Arduino boards, I know their capabilities and decided to route a STM32 way this time (mostly to learn something new though).

Here is the comparision of Arduino Leonardo (which is a most likely candidate for our goal) and STM32F103C8T6 (which I used)

Arduino Leonardo STM32F103C8T6
Flash 32KB 64KB
SRAM 2.5KB 20KB
EEPROM 1KB Absent
Architecture 8-bit ATMEL AVR 32-bit ARM CORTEX-M3
Frequency 16MHz up to 72MHz
GPIO pins 20 26
PWM 7 12
Timers 1x 16-bit, 2x 8-bit 3x 16-bit, 1x pwm
Peripheral 10-bit ADC (6 channels)
1x I2C
1x SPI
1x UART
USB
2 x 12-bit, 1 μs A/D converters (7 channels)
7-channel DMA controller
3x USART
2x I2C
2x SPI
CAN
USB

As you can see, specs for stm32f103c8 are not so bad. And it’s cheaper than Leonardo!

One big drawback is that you need additional external programmer. But its not expensive also, total price for mini board + programmer is still comparable with Arduino clones.

 

 

I bought both items on aliexpress.com, search for «STM32F103C8T6 Minimum System Development Board» and «ST-Link v2 mini», for example this and this.

Schematics for the dev board: STM32Mini

Or here in pdf

Pinout in pdf — The-Generic-STM32F103-Pinout-Diagram

So, after some time, I programmed simracing-oriented firmware for the device.

Device capabilities are:

  • 6x 12-bit (4096 steps) axises
  • rotary encoders support
  • rotary switches support
  • matrix buttons support
  • single buttons support
  • axises calibration
  • 1kHz exchange rate with PC, which means 1ms maximum latency for axises

It can be used for DIY buttons boxes, button rim plates, pedals, hand brakes, gear shifters, etc, etc — everywhere you need joystick/gamepad interface with PC.

Here is pinout you get after flashing the firmware first time:

             STM32F103C8T6
	   -------------------
	- |3VB		 +3.3V| -
  	- |C13		   GND| -
  COL1	- |C14		   +5V| - 
  COL2	- |C15		    B9| - ROW6
  ADC0 	- |A0		    B8| - ROW5
  ADC1 	- |A1		    B7| - ROW4
  ADC2	- |A2		    B6| - ROW3
  ADC3	- |A3		    B5| - ROW2
  ADC4	- |A4		    B4| - ROW1
  ADC5	- |A5		    B3| - COL4
  ADC6	- |A6		   A15| - ROT11
  COL5	- |A7		   A12| - 
  ROT1	- |B0		   A11| - 
  ROT2	- |B1		   A10| - ROT8
  ROTA	- |B10		    A9| - ROT7
  ROTB	- |B11		    A8| - ROT6
	- |R		   B15| - ROT5
	- |+3.3V	   B14| - ROT4
	- |GND		   B13| - ROT3
	- |GND		   B12| - COL3
	   -------------------

Also I programmed small PC-based app named OSHStudio, which allows you to choose a function for each pin. Here is how the initial pinout looks in OSHStudio, when you click «Get Config from Device»:

default_pinout

 

You can configure pins choosing its function in comboboxes:

list

 

Buttons

When buttons wired in matrix, columns have to be connected to Button Matrix COLUMNS pins, rows — to Button Matrix ROWS pins. Single separate buttons (not matrix), can be connect to «Single Button +3,3V» or «Single Button GND». If you connect button to «Single Button +3.3V» than connect the other side of button to +3.3V, if you connect button to «Single Button GND» than connect it to GND. Here is an example of matrix wiring:

buttonMatrixDia_bbYou can test your buttons in the «Buttons» tab of OSHStudio:

buttons_tab

In this tab you can also configure POV Hat switches. When activated first Hat Switch used first 4 buttons of matrix, 2nd Hat Switch — from 2nd 4 buttons and so on.

Rotary Encoders

The firmware supports full step, half step and quarter step encoders. Rotary encoders can be wired in «chained» or «single» configuration. Chained config means you wire side encoders’ pins (PINA & PINB) together and central pin become «control» pin. Central pin identified your encoder type — 1/1 (full step), 1/2 (half step) or 1/4 (quarter step). You can wire different type encoders in one chain.

Schematics:

RotariesChainedDia_bb

Also encoders can be connected in single configuration. In this case you should configure side pins according to the type of encoder and central pin have to be connected to +3.3V.

Schematics:

RotariesSingleDia_bb

Encoders can also be tested in the «Buttons» tab.

 

Rotary Switches

Virtual button is «clicked» when shaft is changing position.

SwitchesDia_bb

Axises

Analog pins ADC0 — ADC6 used to connect potentiometers or other analog inputs. Also you can calibrate axises in OSHStudio, and calibration values in this case will be stored in MCU itself. After calibration an axis is «expanded» by the controller, so PC always sees axis as 4096 steps.

3

Notes

I recommend set to «Not used» all unused pins 🙂

You can find pictures in better resolution, code and firmware itself in the github project.

Direct link to firmware (version 0.11 — latest)

Direct link to firmware (version 0.10)

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s