14 KiB
14 KiB
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
- It also has a docking station designed for it which is used to :
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 :
- Start by cloning this repository.
Put it in a path that doesn't contain any spaces ie : "C:\Users\Bob\Desktop\projects" for example. - Once cloning is done, you will need to install the MSYS2 tool/environment. This tool is needed to compile the project using Make.
- Open a terminal by clicking on the MSYS2 icon and execute the following commands to prepare the environment :
- Update packages :
pacman -Syu
- Install make :
pacman -S msys/make
- Install automake :
pacman -S msys/automake
- Install autoconf :
pacman -S msys/autoconf
- Install gcc :
pacman -S msys/gcc
- Install git :
pacman -S msys/git
- Install utils needed for menuconfig :
pacman -S msys/ncurses-devel pacman -S msys/gettext-devel
- You now, need to download the toolchain required to compile and link the app here and extract it somewhere you remember on your hardrive.
- 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.
- 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. - 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. - Now save your configuration and exit.
- 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.
- Sleep and Standby modes working but implemented in a crude way.
- 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.
- Supported LCD drivers :
- 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