Go to file
2023-09-27 00:54:41 +02:00
design Finished to design the second version of the docking, it now has a USB micro connector and a cutout for the hearth rate sensor. STL file also available. 2023-09-27 00:54:41 +02:00
documentation Added the CH340 USB to serial adapter chip's datasheet 2023-04-10 21:26:58 +02:00
src Added some doc to some functions 2023-09-27 00:52:59 +02:00
.gitignore Updated the gitignore file 2023-04-10 21:30:23 +02:00
LICENSE Mise à jour de 'LICENSE' 2023-03-24 21:42:52 +01:00
README.md Mise à jour de 'README.md' 2023-05-07 12:13:37 +02:00

W800_Smart_Watch

Why this project :

I was interested in working on a bigger project with more challenges and which could be useful.
I am also quite unhappy with the smartwatches that are on the market (expensive, no access to the firmware, data collection and privacy issues), that's why I decided to try doing my own that I can fully customize. This is going to be a long adventure with a lot of discoveries along the way :).
I also wanted to test this W800 SOC more deeply and see what it could do and I think it is a perfect fit for the project.
So let's go !

A Smart Watch project using the Chinese W800 SOC.

The W800 is a pretty interesting chip with impressive characteristics for its price (around 1$) :

Core :

  • 32bit XT804 CPU
  • 240 Mhz max clock

Memory :

  • 2 MB on chip flash
  • 288 KB RAM, ~130 KB available to the user

Wireless connectivity :

  • Bluetooth EDR(Classic) and BLE 4.2
  • WiFi 2.4Ghz 802.11 b/g/n

SDK & OS

  • FreeRTOS v10.4.1
  • BLE stack : NimBLE
  • TCP IP stack : lwip v2.1.3

W800 Smart Watch V1 specifications :

Sensors :

  • A magnetometer (QMC5883L) used by the compass app for example
  • An accelerometer (BMA456) to get wrist tilt detection (to wake the screen up), step counts, activity detection (standing, walking and running) and more.
  • A pressure and temperature sensor (BMP280) used by the altimeter app for example.
  • A heart rate sensor (MAX30102) is planned to be added (connection pads on the PCB, no driver written).

Screen and Actuators :

  • A 1.28 inch touch screen is being used on the watch (GC9A01 screen controller).
  • A vibration motor to notify the user of events.
  • No physical buttons as everything can be done using the graphical interface.

Connectivity :

  • The watch has BLE (4.2) connectivity which is used to connect to a phone using the GadgetBridge app to :
    • control music playback - to implement
    • find my phone feature
    • report its battery level
    • report step counts - to implement
    • display received text messages, emails and calls - to implement
    • show the weather forecast for the next 6 hours or so - to implement
  • WiFi is also available but not used yet because I didn't find any good use case for it. It is also very power hungry.

Battery and Battery life:

  • The battery currently used in this version of the watch is a 6mm x 25mm x 35mm (602535) single cell 500 mAh lipo battery (had one laying around).
  • Using the current battery, expected battery life is :
    • ~ 5 days in sleep mode.
    • ~ 9 hours when continuously connected to BLE with the phone (I may be able to slightly improve power consumption in BLE mode - working on it).

Casing size, Weight and Docking station :

  • The case of the watch is 3D printed and the STL design files are available here
    • The size of the watch's case is as follow :
    • The thickness of the watch will be reworked in the next version of the casing, the goal is to shave 3 to 4 mm off to reach 12 to 13 mm.
    • The watch weighs around 50 grams with the 500 mAh battery and the straps attached to it.
  • It also has a docking station designed for it which is used to :
    • Recharge the W800 Smart Watch by simply putting the watch on it. The connection between the docking and the watch is done through a magnetic 4 pin connector.
    • Flash a new firmware to the watch. No extra programming hardware is required, only the docking is needed.

Getting started :

So, you'd like to try this project yourself ?

Here are the steps to follow, in order to build the firmware and flash the board :

On Windows :

  1. Start by cloning this repository.
    Put it in a path that doesn't contain any spaces ie : "C:\Users\Bob\Desktop\projects" for example.
  2. Once cloning is done, you will need to install the MSYS2 tool/environment. This tool is needed to compile the project using Make.
  3. Open a terminal by clicking on the MSYS2 icon and execute the following commands to prepare the environment :
    1. Update packages :
    pacman -Syu
    
    1. Install make :
    pacman -S msys/make
    
    1. Install automake :
    pacman -S msys/automake
    
    1. Install autoconf :
    pacman -S msys/autoconf
    
    1. Install gcc :
    pacman -S msys/gcc
    
    1. Install git :
    pacman -S msys/git
    
    1. Install utils needed for menuconfig :
    pacman -S msys/ncurses-devel
    pacman -S msys/gettext-devel
    
  4. You now, need to download the toolchain required to compile and link the app here and extract it somewhere you remember on your hardrive.
  5. Now, go back to the MSYS terminal window and move to the src/W800_SDK_v1.00.10/ directory which is located in the cloned repository, using the cd command.
  6. Then, execute the make menuconfig command, this should greet you with a crude configuration window.
    Move to the Toolchain Configuration --> option using the arrows and hit enter.
    Using the same controls, move to the toolchain path and set the location to where you extracted the toolchain in step 4.
  7. To be able to flash the board, you will also need to set the used com port in the Download Configuration ---> option.
    TIPS : set the download rate to : 2000000, this should speed up the flashing process.
  8. Now save your configuration and exit.
  9. Finally, type :
#This will remove all builded object to start from a clean environment (Needed only once)
make distclean

#This will only compile the library part of the firmware
make lib

#This will compile the actual firmware using the libraries and produce the .bin file
make 

#This will flash the board using the previously generated .bin file
make down

#This will do both previous commands in one (build and flash)
make flash

Sensors and I2C addresses :

  • Accelerometer : BMA456 I2C addr : 0x18 or 0x19 7 bit address.
  • Magnetometer : QMC5883L I2C addr : 0x0D 7 bit address.
  • Pressure/Temperature sensor : BMP280 I2C addr : 0x76 or 0x77 7 bit address.
  • Heart Rate and SpO2 sensor : Max30102 I2C addr : 0x57 7 bit address.

Power source :

  • A single ~ 400 mAh cell lipo battery.
  • A charge/discharge controller stage :
    • TP4056
    • DW01A + 8205A

Screen + touch element :

  • Screen with touch : GC9A01 with touch panel. It uses the required 4 line Serial Interface.
  • Touch element i2c addr : 0x15, CST816D I2C touch driver.

Programming and charging :

  • The smart watch programming and charging is done through the same USB port
    using a magnetic 4 pin plug.

MCU Pin assignement table :

Pin Number Pin Name Type Function Pull UP/DOWN Connected to Comment
PB_20 I/O UART0_RX/PWM1/UART1_CTS/I²C_SCL U/D USB/Serial TX flash pin
PB_19 I/O UART0_TX/PWM0/UART1_RTS/I²C_SDA U/D USB/Serial RX flash pin and BMA456, Touch Panel, HMC5883L and BMP280 SDA pins
WAKEUP I External Wake Up Pin D BMA456 IRQ 1 line and Touch Panel IRQ line through NAND Gate The chip is waken up when the pin is HIGH
RESET I Reset Pin D Micro switch and USB/Serial RTS pin
XTAL_OUT O External crystal output
XTAL_IN I External crystal input
AVDD3V3 P Chip power supply, 3.3V
ANT I/O RF Antenna
AVDD3V3 P Chip power supply, 3.3V
AVDD3V3 P Chip power supply, 3.3V
AVDD3V3_AUX P Chip power supply, 3.3V
TEST I Test function configuration pin
BOOTMODE I/O BOOTMODE and I²S_MCLK/LSPI_CS/PWM2/I²S_DO U/D Touch Panel Reset line
PA_1 I/O JTAG_CK/I²C_SCL/PWM3/I²S_LRCK/ADC0 U/D BMA456, Touch Panel, HMC5883L and BMP280 SCL pins
PA_4 I/O JTAG_SWO/I²C_SDA/PWM4/I²S_BCK/ADC1 U/D Battery resistor voltage divider output
PA_7 I/O PWM4/LSPI_MOSI/I²S_MCK/I²S_DI/Touch0 U/D LCD backlight N-MOSFET driver
VDD3V3IO P IO power supply, 3.3V
PB_0 I/O PWM0/LSPI_MISO/UART3_TX/PSRAM_CK/Touch3 U/D Vibration motor control pin
PB_1 I/O PWM1/LSPI_CK/UART3_RX/PSRAM_CS/Touch4 U/D Touch Panel IRQ line
PB_2 I/O PWM2/LSPI_CK/UART2_TX/PSRAM_D0/Touch5 U/D Debug UART serial output
PB_3 I/O PWM3/LSPI_MISO/UART2_RX/PSRAM_D1/Touch6 U/D TP4056A Charging Signal
PB_4 I/O LSPI_CS/UART2_RTS/UART4_TX/PSRAM_D2/Touch7 U/D TP4056A Charged Signal
PB_5 I/O LSPI_MOSI/UART2_CTS/UART4_RX/PSRAM_D3/Touch8 U/D Battery resistor voltage divider enable
VDD3V3IO P IO power supply, 3.3V
CAP I External capacitor, 4.7µF
PB_6 I/O UART1_TX/MMC_CLK/HSPI_CK/SDIO_CK/Touch9 U/D LCD Serial Clock Pin
PB_7 I/O UART1_RX/MMC_CMD/HSPI_INT/SDIO_CMD/Touch10 U/D LCD Serial Data Pin
PB_8 I/O I²S_BCK/MMC_D0/PWM_BREAK/SDIO_D0/Touch11 U/D LCD Data or Command Selection Pin
PB_9 I/O I²S_LRCK/MMC_D1/HSPI_CS/SDIO_D1/Touch12 U/D LCD Reset Pin
PB_10 I/O I²S_DI/MMC_D2/HSPI_DI/SDIO_D2 U/D LCD Chip Select Pin
VDD3V3IO P IO power supply, 3.3V
PB_11 I/O I²S_DO/MMC_D3/HSPI_DO/SDIO_D3 U/D BMA456 IRQ 2 line
GND P Ground (Central Pad)

What is done/working so far - HARDWARE :

  • Schematic :
    • First version of the schematic is done an available here.
  • 2 layer PCB version 1.0 design is done based on the schematic. It has a 38 mm diameter size.
  • Wake up interrupts handling :
    • Wrist tilt MCU wake up working
    • LCD touch wake up
  • MCU sleep feature :
    • Sleep and Standby modes working but implemented in a crude way.
      Can and should be improved.
  • PIFA antenna tested, performance isn't the best but it is working well for what it will be used for (BLE).

What is done/working so far - SOFTWARE :

  • LVGL 8.3.3 running on the SOC using DMA.
    • Supported LCD drivers :
      • ILI9341 in 4-line serial mode (8 bits) with D/C pin
      • ST7789 in 4-line serial mode (8 bits) with D/C pin
      • GC9A01 in 4-line serial mode (8 bits) with D/C pin <-- this one is used.
    • Supported LCD touch screen :
      • CST816D I2C capacitive touch ic.
    • Four screens designed and working with LVGL :
      • 1 watch face based on a casio watch.
      • 1 menu screen with a list of icons.
      • 1 setting screen with basic settings (date and time + display brightness) (work in progress).
      • 1 compass application using the QMC5883L.
  • Debug UART on PB_2 (output only)
  • Sensors/Actuators :
    • QMC5883L driver working
    • BMA456 driver working
    • BMP280 driver working (temperature + pressure + altitude)
    • Battery voltage sense using ADC is working
    • Vibration motor controlled by PWM working
  • Update the W800 SDK from version 1.00.08 to version 1.00.10 released in January of 2023.
  • Added multi-language support to the UI, still some translations to do though.
  • Step counter using the BMA456 is working and steps are displayed on the watch face.

To do - HARDWARE:

  • Add the MAX30102 Heart Rate Monitor to the current design.
  • Issue with the DW01A chip, should be as easy as to replace the 100nf C12 cap with a lower value, let's say 80nf, found a workaround.

To do - SOFTWARE

  • Finish to design the settings page.
  • Implement watch settings persistency using the integrated flash memory
  • Implement a good algorithm to handle adaptiv MCU clock to save power
  • Drivers:
    • Write/port the MAX30102 Heart Rate Monitor driver to the project.
  • Add a wake up alarm app (using the vibration motor).
  • Add BLE functionality.

Achieved power consumption recap:

(Need to work on sleep current :-( )

Mode Current draw Estimated battery life (450 mAh lipo)
Active (40Mhz clk)
(No BLE / No WiFi)
~52 mA ~8 hour
Active (240Mhz clk)
(No BLE / No WiFi)
~72 mA ~6 hour
Sleep ~4.5 mA ~4 days and 4 hours
Standby ~1.8 mA ~10 days and 15 hours

Some screenshots of the achieved visuals currently running on the watch using lvgl :

Here is a preview of what the PCB should look like :

The front :

The back :

Update 21/03/2023 : PCBs were received from JLCPCB and this what they look like :


And the watch running :

Almost everything works :

  • BMA456 ✓
  • BMP280 ✓
  • QMC5883L ✓
  • Screen + touch panel ✓
  • CH340E for chip programming ✓
  • Vibration motor ✓
  • Charge IC ✓

** Known issues :**

  • DW01A chip not driving the double N mosfet as expected (when plugging a battery, the watch doesn't start without beeing plugged into the charger at least once).
    Thought it might be a capacitor value issue, replaced C12 with a 82nf and 68nf caps, but it did not solve the problem :(.
    TLDR : after installing the battery, the watch might need to be plugged to it's charger at least once to start up
  • The new battery should have a size of 26.8x26.8 mm maximum : 602626 (400 mAh) would be a good choice.

Next steps :

  • Write and release a usable firmware for every day use. - In active dev

If you are interested by the project or if you just want to say hi, you can contact me at the email address : bugreport[at]laposte.net .