README.md

    PlatformIO + CH32V003 + SSD1306 (I2C OLED display 128x64) + two VL53L0X (I2C ToF) + servo + DC motor

    Never-stopping car.

    •  This README.md on gitflic
    •  License: CC0 1.0 Universal (отказ от своих авторских прав и передача произведения в общественное достояние)
    // MCU:
    //            ========================
    //     MOTORF-[1 (PD6)    (PD4,PD5) 8]-  MOTORB, and to programmer SWIO
    //     GND   -[2 (VSS)  MCU   (PC4) 7]-  to SERVO
    //     XSHUT -[3 (PA2)  SOP8  (PC2) 6]-  to I2C SCL
    //     V3.3  -[4 (VDD)        (PC1) 5]-  to I2C SDA
    //            ========================
    //  where
    //      XSHUT: to XSHUT pin of TOF1 (forward) to control its disabling, while changing standard address of TOF1 (backward)
    //      SERVO: PWM (using TIM1 timer)
    //      MOTORF(Forward), MOTORB(Backward): to H-bridge forward/backward input (H-bridge forward/backward output -- to DC motor)
    

    Repo: https://gitflic.ru/project/ikarus512/platformio-ch32v003-oled-vl53l0x

    Based on PlatformIO (VS Code)/CH32V platform 1.1.0/blinky-none-os example (same examples as in CH32V003EVT.zip from https://www.wch.cn)/framework = none-os, board = genericCH32V003J4M6.

    MCU: CH32V003 (CH32V003J4M6 SOP8) QingKe 32-bit RISC-V

    Programmer: WCH-LinkE that should be switched to RV mode by holding ModeS button during powering on (Way3). I did not need to reprogram it (MounRiverStudio not needed at all). Desire in future: to use Arduino board with sketch as programmer (similar to ArduinoISP sketch for programming AVR MCU like ATtiny85).

    Using I2C HAL and SSD1306 (OLED display 128x64) from https://habr.com/ru/articles/775724 (https://github.com/Sergo101/CH32V003_stHAL and some parts taken from STM32 https://github.com/stm32f1/vl53l0x_stm32).

    Using two I2C VL53L0X ToF sensors, based on https://github.com/pololu/vl53l0x-arduino (rewritten from C++ to C). Second ToF sensor controlled using XSHUT pin, so it cane be send to standby, while first ToF sensor address can be changed (new address is forgotten on power off).

    Servo: PWM example from https://github.com/JimMerkle/CH32V003F4P6_PWM/blob/master/User/main.c

    Other components

    • DC-DC boost converter 1.5 to 3.3V, max power ~300mW?, hence max current 100mA?)
    • H-bridge (DIP8) Can be controlled by single input pin (non-stop mode, only backward or forward)
    • H-bridge (SOP8)

    Additional tools

    • build and upload command:

      pio run -e genericCH32V003J4M6 -t upload
      
    • WCH ISP (working?):

      $HOME/.platformio/packages/tool-wchisp/wchisp info
      
    • Disassembler:

      ./tools/disasm.sh
      
    • Recovery tool in case of chip SWIO pin is blocked (programmed for output) If you accidentally set SWIO pin for output, and cannot re-programn CH32V003 MCU anymore, use ch32v003_unbricker.py taken from https://gitverse.ru/zhevak/unbricker/content/master/ch32v003_unbricker.py

      ./tools/ch32v003_unbricker.py
      

      If needed, install python and needed packages:

      sudo apt install -y python3 pip3; pip3 install pyusb pyserial hid -U
      

    TODO notes

    Conflicting delay functions

    - Delay_Ms(ms) is not working because of conflicts between:
        - Delay_Init() + Delay_Ms()    (from .platformio/packages/framework-wch-noneos-sdk/Debug/ch32v00x/debug.c)
        - HAL_Systick_Init() + HAL_delay_1ms()   (from systick_hal.c)
    

    Memory space optimization

    TODO: investigate if anything can be done.
    - Fonts: use only one small font (probably cape letters can be eliminated), ...
    - Optimization of space by converting some functions to macros, or making functions inline, did not helped (seems already inlined, check disassembling).
    - PROGMEM no big sense, because on CH32V003, 16K Flash. https://wellys.com/posts/avr_c_progmem like on Arduino: PROGMEM attribute, F("strings"), ...
    - GPIO programing structures are not needed (check if not already optimized by compiler)
    

    How to build PlatformIO based project

    =====================================

    1. Install PlatformIO Core
    2. Download development platform with examples
    3. Extract ZIP archive
    4. Run these commands:
    # Change directory to example
    $ cd platform-ch32v/examples/blinky-none-os
    
    # Build project
    $ pio run
    
    # Upload firmware
    $ pio run --target upload
    
    # Upload firmware for the specific environment
    $ pio run -e genericCH32V003J4M6 --target upload
    
    # Clean build files
    $ pio run --target clean
    
    $ pio run --list-targets
    Environment          Group     Name                      Title                     Description
    genericCH32V003J4M6  Platform  check_flash_protection    Check Flash Protection
    genericCH32V003J4M6  Platform  disable_flash_protection  Disable Flash Protection
    genericCH32V003J4M6  Platform  disable_sdi_printf        Disable SDI Printf
    genericCH32V003J4M6  Platform  enable_flash_protection   Enable Flash Protection
    genericCH32V003J4M6  Platform  erase                     Erase Flash
    genericCH32V003J4M6  Platform  sdi_printf                Enable SDI Printf
    genericCH32V003J4M6  Platform  size                      Program Size              Calculate program size
    genericCH32V003J4M6  Platform  upload                    Upload
    
    pio run -e genericCH32V003J4M6 --target upload
    
    Описание

    PlatformIO, CH32V003, oled 128x64, vl53l0x

    Конвейеры
    0 успешных
    0 с ошибкой