244 lines
11 KiB
Markdown
244 lines
11 KiB
Markdown
# 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
|
|
|
|
## 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](https://www.msys2.org/) 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 :
|
|
```bash
|
|
pacman -Syu
|
|
```
|
|
2) Install make :
|
|
```bash
|
|
pacman -S msys/make
|
|
```
|
|
3) Install automake :
|
|
```bash
|
|
pacman -S msys/automake
|
|
```
|
|
4) Install autoconf :
|
|
```bash
|
|
pacman -S msys/autoconf
|
|
```
|
|
5) Install gcc :
|
|
```bash
|
|
pacman -S msys/gcc
|
|
```
|
|
6) Install git :
|
|
```bash
|
|
pacman -S msys/git
|
|
```
|
|
7) Install utils needed for menuconfig :
|
|
```bash
|
|
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](http://82.157.145.101/download/toolkits/winnermicro/w806/csky-elfabiv2-tools-mingw-minilibc-20210423.tar.gz) 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 :
|
|
```bash
|
|
#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 :
|
|
The goal is to embed the following sensors in the watch :
|
|
* An accelerometer (for wrist tilt detection, single and double tap detection , foot step counting and more)
|
|
Possible choices :
|
|
* ADXL345
|
|
* MPU6050
|
|
* BMI160
|
|
* LSM6DS3
|
|
* BMA456 <-- **SELECTED** i2c addr : 0x18 or 0x19 7 bit address, has the wrist tilt detection feature.
|
|
* A magnetometer (possible choices):
|
|
* HMC5883L <-- After reading some comparison articles between the HMC5883L and QMC5883L and the datasheets, the later seems better in term of perfomances.
|
|
* QMC5883L <-- **SELECTED** i2c addr : 0x0D 7 bit address, better soldering footprint
|
|
* LSM303DLHC
|
|
* BMM150 <-- Package with balls, hard to solder
|
|
* An air pressure/temperature sensor (to display the altitude for example)
|
|
* BMP280 <-- **SELECTED** i2c addr : 0x76 or 0x77
|
|
|
|
## Actuators :
|
|
* A vibration motor to notify events to the user.
|
|
* ~~A piezo buzzer~~ : dropped, maybe in next version.
|
|
|
|
## Power source :
|
|
* A single 450 mAh cell lipo battery.
|
|
* A charge/discharge controller.
|
|
|
|
## Screen + touch element :
|
|
* [Screen with touch](https://fr.aliexpress.com/item/1005004887834918.html?spm=a2g0o.order_list.order_list_main.22.340a5e5bX8WCb0&gatewayAdapt=glo2fra) : 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](design/Kicad/W800_Smart_Watch/W800_Smart_Watch.pdf).
|
|
* PCB version 1.0 design is done based on the schematic. Waiting for the PCBs from JLCPCB.
|
|
* 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.
|
|
|
|
## 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
|
|
* 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.
|
|
|
|
|
|
## To do - HARDWARE:
|
|
* [ ] Add the MAX30102 Heart Rate Monitor to the current design.
|
|
## To do - SOFTWARE
|
|
* [ ] Finish to design the settings page.
|
|
* [ ] 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)<br>(No BLE / No WiFi) |~52 mA | ~8 hour |
|
|
|Active (240Mhz clk)<br>(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 :
|
|

|
|

|
|
### **Almost everything works :**
|
|
* BMA456 ✓
|
|
* BMP280 ✓
|
|
* QMC5883L ✓
|
|
* Screen + touch panel ✓
|
|
* CH340E for chip programming ✓
|
|
* Vibration motor ✓
|
|
* Charge IC ✓
|
|
|
|
### **To sort out :**
|
|
* DW01A chip not driving the double N mosfet as expected :-(
|
|
* Round lipo battery not having the capacity advertised, will have to change it :-(
|
|
|
|
## Next steps :
|
|
* Finish to design and print the casing.
|
|
* Find an other battery 450 mAh or bigger would be great.
|
|
* Add BLE.
|
|
* Write and release a usable firmware for every day use.
|
|
|
|
|
|
## 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 .
|