
OpenHand v2
AleksaHeler/OpenHand
Our attempt at a prosthetic hand using STM32 microcontroller with custom PCB and mechanics

DDS function generator build around STM32 BluePill board
Bluepill function generator is an open-source printed circuit board by BojanSof, from the BojanSof/BluePillWaveGen repository on GitHub. It is a 2-layer board of 97.7 × 58 mm with 41 parts on 60 nets, routed with 138 tracks and 0 vias.
It is built around the ICL7660N and TL084. Its parts include 27 resistors, 8 capacitors, 3 ICs, 1 connector and 1 switch. It belongs with the STM32 boards of this library.
DDS function generator implemented with STM32 BluePill board, based on STM32F103C8T6 microcontroller, 8-bit R-2R ladder DAC and additional circuitry for removing the DC offset.
The user interface is realized with OLED display based on SSD1306 controller and incremental rotary encoder.

Goal specs:
Additional tests and modifications should be done to reach the specs.

The MCU generates the data for the 8-bit R-2R ladder D/A converter.
Two of the op amps inside TL084 are used as voltage buffers, one for the output of the DAC and the second one for the variable voltage generated by filtering PWM signal outputed by the MCU. This variable voltage is used to remove the DC offset of the generated waveform. Removing the DC offset is realised with the third op amp, which subtracts the output of the DAC and the variable voltage and multiplies this difference by 1.82 so the output signal has maximum amplitude of 3 V.

To generate the data for the DAC, each waveform has lookup table stored in the Flash memory of the MCU, with 256 elements with size 1 byte. The values stored in the table are actually the data that need to be fed into the DAC. During runtime, whole or part of the table is copied into SRAM of the MCU, based on the frequency of the waveform. By changing the LUT, arbitrary periodic waveforms can be generated.
Timer 2 of the MCU is configured to generate DMA request. It has base clock of 14.4 MHz and the value stored in the Auto-Reload Register (ARR) depends on the frequency of the waveform. The value for ARR is calculated using the following formula:
ARR=TIM2\_BaseClock/(L\*f) - 1where L is the size of the LUT stored in SRAM and f is the frequency of the waveform.
The DMA unit transfers data from the LUT in SRAM to the GPIOA output data register. The pins PA0-PA7 are used to output the data to the DAC. Because the output data register of GPIOA is used, the pins PA8-PA15 can not be used as general purpose outputs, but can be used in the other modes. This problem can be resolved by writing to the bit set reset register instead of the output data register.
The software was written in C, using STM32 HAL library, in STM32CubeIDE.
I have also written SSD1306 driver which can be further developed to include more functionalities.
The code also includes isntantenous rotational speed measurement for the rotary encoder with goal to change the values for frequency and amplitude based on the rotational speed, i.e. faster turning of the encoder results in greater change of the value. This part of the code should also be improved, for better user experience.

The following waveforms are measured with DSO150 oscilloscope.
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() |
| Qty | Value | Footprint | References |
|---|---|---|---|
| 16 | 10k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R2, R3, R4, R5, R6, R8, R10, R12, R14, R16, R17, R18, R19, R20, R23, R26 |
| 9 | 20k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R1, R7, R9, R11, R13, R15, R21, R25, R27 |
| 6 | 100n | Capacitor_THT:C_Disc_D5.0mm_W2.5mm_P5.00mm | C3, C4, C5, C6, C7, C8 |
| 2 | 10u | Capacitor_THT:CP_Radial_D5.0mm_P2.50mm | C1, C2 |
| 2 | 18k2 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P7.62mm_Horizontal | R22, R24 |
| 1 | Conn_01x02_Male | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J1 |
| 1 | ICL7660 | Package_DIP:DIP-8_W7.62mm | U1 |
| 1 | OLED_SSD1306_128x64 | oled-displays:OLED-SSD1306-128x64 | DIS1 |
| 1 | RotaryEncoder_Switch | Rotary_Encoder:RotaryEncoder_Alps_EC11E-Switch_Vertical_H20mm | SW1 |
| 1 | STM32-BluePill | bluepill-fgen:STM32-BluePill | U2 |
| 1 | TL084 | Package_DIP:DIP-14_W7.62mm | U3 |

AleksaHeler/OpenHand
Our attempt at a prosthetic hand using STM32 microcontroller with custom PCB and mechanics

GadgetReboot/Phone_SLIM
POTS Telephone Subscriber Line Interface Module

tvlad1234/osillyscope
Low cost, low part count CH32V003-based oscilloscope

SamsungSLAV/muxpi
MuxPi is an open hardware and open software board which was designed to aid in automating tasks on physical devices.


hrandib/jbc_station
3 channel universal soldering station for T12, T115, T210, T245, T470 handles


quasiengineer/i8080-sbc
FPGA-based single board computer to run Intel 8080 CPU (up to 3.125Mhz)
It measures 97.7 × 58 mm and has 2 copper layers, 1.6 mm thick.
41 parts, built around the ICL7660N and TL084. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the BojanSof/BluePillWaveGen repository on GitHub, at the commit this page was made from: the board is kicad/bluepill-function-generator/bluepill-function-generator.kicad_pcb and its schematic kicad/bluepill-function-generator/bluepill-function-generator.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask BojanSof before reusing the design.