This is yet another project from the B-AROL-O Team - a group of friends who in their spare time enjoy creating fun projects with Robotics, Computer Vision and LEGO®.
Everything we do - both hardware and software - is Open Source and shared on GitHub. Some of our projects have been awarded several prizes in worldwide competitions on Computer Vision and robotics:
- Our first project, ARNEIS was the winner of the Popular Vote of the OpenCV Spatial AI Contest sponsored by Intel® and Microsoft Azure.
- More recentlty, project "Four-legged Robot Ensuring Intelligent Sprinkler Automation"(a.k.a. FREISA) was the Grand Prize Winner 🥇 of the OpenCV AI Competition 2023 with OpenCV, Khadas and Seeed Studio.
- We are also running in the Backdrop Build competition, and in all the rounds we have joined so far we have always been selected finalists
Earlier in April we attended the Embedded World trade show in Germany and had the chance of meeting the Seeed Studio team.
This was also the place where we first learned about SenseCAP Watcher and we fell in love with it. We then applied for the SenseCAP Watcher Alpha program and were one of the 50 lucky teams in the world who were selected and had the chance of playing with this nice product in advance.
The SenseCAP Watcher campaign on Kickstarter will be launching soon, and this post may help spreading the word about this wonderful gadget.
@Violet, Eric and all the team at Seeed Studio: we wish you all the best for your Kickstarter campaign. Anyway, based on the experience we had so far with the SenseCAP Watcher Alpha, we are more than sure it will be a hit!
Unboxing the SenseCAP Watcher AlphaAfter some issues with Italian customs we eventually received the box with our brand new SenseCAP Watcher Alpha:
Seeed Studio is constantly updating the documentation which is available on their wiki at https://wiki.seeedstudio.com/watcher/ and whose sources are available on GitHub.
Pull Requests are welcome, we already experienced it :-)
It worths also mentioning that all the Watcher hardware documentation and software will be released under an Open Source license.
The Alpha version ships with a translucent case to give it a distinguishing touch from the official version which will be delivered as a reward to the pledgers of the Kickstarter campaign.
Within the box we also got two stickers, a USB cable and a couple of standoffs to suit different attachment options.
We spent some time within the team to brainstorm which would be the best solution to attach the SenseCAP Watcher to our FREISA Robot Dog.
Based on the fact that we already have LEGO-compatible accessories for FREISA - and also in perspective, to be able to use the SenseCAP Watcher also on ARNEIS (our previous project) - we decided to design a custom LEGO® Technic parts to fit the 1/4" threaded adapter.
Here is the design made by Eric Orso, our robot and 3D-printer guy and released under under the MIT License, hoping it might be helpful to other users of the SenseCAP Watcher.
You can find the design (made with OpenSCAD) and the resulting STL files on GitHub: https://github.com/B-AROL-O/OpenSCAD-lego-library
Here is a close-up of a few adapters just 3D-printed by our Creality K1 Max:
Here is a photo showing the custom part screwed into the threaded adapter:
Close-up of the parts piggy-backed to FREISA:
Or maybe would it be better in the middle of the plate?
We eventually explored the option of simply using double-sided tape to attach the other adapter provided with the Watcher to the 3D-printed frame of the Mini Pupper 2.
After weighing pros and cons of either alternatives, we ended up choosing the latter. Of course you are free to decide differently :-)
Until recently our SenseCap Watcher had ESP32 Firmware v1.0.1 installed
A few days ago Seeed Studio released an important firmware update which can be installed to the device via OTA (Over-The-Air) firmware update.
You just need to launch the SenseCraft App on your phone, then tap "Device Update"
Tap "Update Now".
After a couple of minutes the update is complete.
Go to Setting > About Device and double check the new version of the firmware:
Connect the Watcher to the PC using a USB-A to USB-C cable.
If your PC is running MS Windows, launch Windows Device Manager.
Two additional Serial Ports should be listed after you plug in the cable - in our case they are COM11
and COM12
:
If your PC is running a Linux-based OS such as Ubuntu, type sudo dmesg -w
and look for the messages containing "USB ACM device
" which are printed just after you plug in the cable - in our case the two Serial Ports are called ttyACM0
and ttyACM1
:
[ 1607.320666] usb 1-3: new full-speed USB device number 120 using xhci_hcd
[ 1607.449113] usb 1-3: New USB device found, idVendor=1a86, idProduct=55d2, bcdDevice= 4.45
[ 1607.449121] usb 1-3: New USB device strings: Mfr=0, Product=2, SerialNumber=3
[ 1607.449124] usb 1-3: Product: USB Dual_Serial
[ 1607.449126] usb 1-3: SerialNumber: 58******94
[ 1607.453217] cdc_acm 1-3:1.0: ttyACM0: USB ACM device
[ 1607.454168] cdc_acm 1-3:1.2: ttyACM1: USB ACM device
According to a recent writeup by Djair Guilherme, the first serial port of the SenseCAP Watcher displays a series of information about the device's memory, while the second serial port is used to upgrade firmware using Xmodem protocol in the same way as Grove Vision AI V2.
Make sure you have a Serial Terminal Emulator program (for instance, PuTTY on Windows or minicom on Linux) installed on your PC. Connect to the first serial port (in our case, COM11) with the following parameters: 115200, 8, n, 1.
Here is an example of messages printed on the serial console of the SenseCAP Watcher when the device boots (some sensitive data have been anonymized):
ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0xc (RTC_SW_CPU_RST),boot:0x8 (SPI_FAST_FLASH_BOOT)
Saved PC:0x40375f20
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce3820,len:0x1948
load:0x403c9700,len:0x4
load:0x403c9704,len:0xf64
load:0x403cc700,len:0x30c4
entry 0x403c995c
I (31) boot: ESP-IDF v5.2.1-1-g3a705cf126 2nd stage bootloader
I (31) boot: compile time Jul 1 2024 22:32:04
I (31) boot: Multicore bootloader
I (36) boot: chip revision: v0.2
I (39) qio_mode: Enabling QIO for flash chip WinBond
I (45) boot.esp32s3: Boot SPI Speed : 80MHz
I (50) boot.esp32s3: SPI Mode : QIO
I (54) boot.esp32s3: SPI Flash Size : 32MB
I (59) boot: Enabling RNG early entropy source...
I (65) boot: Partition Table:
I (68) boot: ## Label Usage Type ST Offset Length
I (76) boot: 0 nvsfactory WiFi data 01 02 00009000 00032000
I (83) boot: 1 nvs WiFi data 01 02 0003b000 000d2000
I (90) boot: 2 otadata OTA data 01 00 0010d000 00002000
I (98) boot: 3 phy_init RF data 01 01 0010f000 00001000
I (105) boot: 4 ota_0 OTA app 00 10 00110000 00c00000
I (113) boot: 5 ota_1 OTA app 00 11 00d10000 00c00000
I (121) boot: 6 model Unknown data 01 82 01910000 00100000
I (128) boot: 7 storage Unknown data 01 82 01a10000 005f0000
I (136) boot: End of partition table
I (140) esp_image: segment 0: paddr=00d10020 vaddr=3c180020 size=580f10h (5771024) map
I (1032) esp_image: segment 1: paddr=01290f38 vaddr=3fca1e00 size=06554h ( 25940) load
I (1037) esp_image: segment 2: paddr=01297494 vaddr=40374000 size=08b84h ( 35716) load
I (1045) esp_image: segment 3: paddr=012a0020 vaddr=42000020 size=17452ch (1525036) map
I (1280) esp_image: segment 4: paddr=01414554 vaddr=4037cb84 size=1525ch ( 86620) load
I (1297) esp_image: segment 5: paddr=014297b8 vaddr=600fe010 size=00004h ( 4) load
I (1309) boot: Loaded app from partition at offset 0xd10000
I (1310) boot: Disabling RNG early entropy source...
I (1321) cpu_start: Multicore app
I (1322) octal_psram: vendor id : 0x0d (AP)
I (1322) octal_psram: dev id : 0x02 (generation 3)
I (1325) octal_psram: density : 0x03 (64 Mbit)
I (1331) octal_psram: good-die : 0x01 (Pass)
I (1336) octal_psram: Latency : 0x01 (Fixed)
I (1341) octal_psram: VCC : 0x01 (3V)
I (1346) octal_psram: SRF : 0x01 (Fast Refresh)
I (1352) octal_psram: BurstType : 0x01 (Hybrid Wrap)
I (1358) octal_psram: BurstLen : 0x01 (32 Byte)
I (1364) octal_psram: Readlatency : 0x02 (10 cycles@Fixed)
I (1370) octal_psram: DriveStrength: 0x00 (1/1)
I (1376) MSPI Timing: PSRAM timing tuning index: 5
I (1381) esp_psram: Found 8MB PSRAM device
I (1386) esp_psram: Speed: 80MHz
I (1842) esp_psram: SPI SRAM memory test OK
I (1851) cpu_start: Pro cpu start user code
I (1851) cpu_start: cpu freq: 240000000 Hz
I (1851) cpu_start: Application information:
I (1854) cpu_start: Project name: factory_firmware
I (1860) cpu_start: App version: 1.1.3
I (1865) cpu_start: Compile time: Aug 15 2024 02:30:51
I (1871) cpu_start: ELF file SHA256: 0adb5cbee...
I (1877) cpu_start: ESP-IDF: v5.2.1
I (1882) cpu_start: Min chip rev: v0.0
I (1886) cpu_start: Max chip rev: v0.99
I (1891) cpu_start: Chip rev: v0.2
I (1896) heap_init: Initializing. RAM available for dynamic allocation:
I (1904) heap_init: At 3FCAB938 len 0003DDD8 (247 KiB): RAM
I (1910) heap_init: At 3FCE9710 len 00005724 (21 KiB): RAM
I (1916) heap_init: At 3FCF0000 len 00008000 (32 KiB): DRAM
I (1922) heap_init: At 600FE014 len 00001FD4 (7 KiB): RTCRAM
I (1929) esp_psram: Adding pool of 8171K of PSRAM memory to heap allocator
I (1937) spi_flash: detected chip: winbond
I (1941) spi_flash: flash io: qio
W (1945) i2c: This driver is an old driver, please migrate your application code to adapt `driver/i2c_master.h`
I (1956) sleep: Configure to isolate all GPIO pins in sleep state
I (1963) sleep: Enable automatic switching of GPIO sleep configuration
I (1970) coexist: coex firmware version: 77cd7f8
I (1975) coexist: coexist rom version e7ae62f
I (1980) main_task: Started on CPU0
I (1984) esp_psram: Reserving pool of 256K of internal memory for DMA/internal allocations
I (1993) main_task: Calling app_main()
I (1997) :
_____ _________ ____
/ ___/___ ____ ________ / ____/ | / __ \
\__ \/ _ \/ __ \/ ___/ _ \/ / / /| | / /_/ /
___/ / __/ / / (__ ) __/ /___/ ___ |/ ____/
/____/\___/_/ /_/____/\___/\____/_/ |_/_/ WATCHER
--------------------------------------------------------
Version: 1.1.3 Aug 15 2024 02:31:44
--------------------------------------------------------
I (2038) MEM: Biggest / Minimum / Free / Total
DRAM : [ 188416 / 284902 / 284902 / 578766]
PSRAM: [ 8257536 / 8365120 / 8365120 / 8367812]
DMA : [ 188416 / 277002 / 277002 / 570618]
I (2258) : # SN: 11**************22
I (2259) : # EUI: 2C************B2
I (2259) : # CODE: 8F************FD
I (2260) : # DEVICE_KEY: 8F****************************2D
I (2266) : # BATCHID: 1000740
I (2270) : # ACCESS_KEY: E4****************************4F
I (2276) : # AI_KEY: fs********EE
I (2280) : # DEV_CTL_KEY: 46********wL
I (2284) : # PLATFORM: 0
I (2739) BSP: Partition size: total: 5715521, used: 1759008
I (2739) BSP: Initialize IO I2C bus
I (2740) gpio: GPIO[1]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
I (2748) gpio: GPIO[7]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
I (2757) gpio: GPIO[8]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
I (2766) gpio: GPIO[9]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
I (2776) gpio: GPIO[13]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
I (2785) gpio: GPIO[14]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
I (2794) gpio: GPIO[38]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
I (2804) gpio: GPIO[39]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
I (2813) gpio: GPIO[45]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
I (2822) gpio: GPIO[2]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:2
I (2982) BSP: IO expander initialized: ffd9
I (2983) LVGL: Starting LVGL task
I (2984) spd2010: LCD panel create success, version: 1.0.1
I (3143) BSP: Initialize knob input device
I (3143) gpio: GPIO[41]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:3
I (3154) gpio: GPIO[42]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:3
I (3162) Knob: Iot Knob Config Succeed, encoder A:41, encoder B:42, direction:0, Version: 0.1.4
I (3171) button: IoT Button Version: 3.2.3
I (3176) BSP: Initialize I2C bus
I (3180) BSP: Initialize touch panel
I (3185) SPD2010: Touch panel create success, version: 0.0.1
I (3343) gpio: GPIO[40]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0
I (3348) ES8311: Work in Slave mode
I (3358) I2S_IF: channel mode 0 bits:16/16 channel:2 mask:1
I (3359) I2S_IF: STD Mode 1 bits:16/16 channel:2 sample_rate:16000 mask:1
I (3369) Adev_Codec: Open codec device OK
I (3370) I2S_IF: channel mode 0 bits:16/16 channel:2 mask:2
I (3372) I2S_IF: STD Mode 0 bits:16/16 channel:2 sample_rate:16000 mask:2
I (3380) Adev_Codec: Open codec device OK
I (3384) gpio: GPIO[46]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0
I (3394) sscma_client.io.spi: spi max trans bytes: 8184
I (3702) deviceinfo: usage_guide_switch value loaded from NVS: 1
I (3703) deviceinfo: No local_service_cfg found in NVS. Using default, all disabled.
I (3707) deviceinfo: type1/cfg_0: enable=0, url=, token=
I (3713) deviceinfo: type1/cfg_1: enable=0, url=, token=
I (3719) deviceinfo: type1/cfg_2: enable=0, url=, token=
I (3725) deviceinfo: type1/cfg_3: enable=0, url=, token=
I (3731) deviceinfo: device info init early done, qrcode content: w1:2C***************************************************************22
I (3743) BSP: voltage: 4198mV
I (3747) BSP: voltage: 4198mV
I (3750) BSP: voltage: 4198mV
I (3754) BSP: voltage: 4198mV
I (3758) BSP: voltage: 4202mV
I (3761) BSP: voltage: 4198mV
I (3765) BSP: voltage: 4198mV
I (3769) BSP: voltage: 4198mV
I (3772) BSP: voltage: 4198mV
I (3776) BSP: voltage: 4198mV
I (3779) BSP: percentage: 100%
W (4215) sscma_client: request not found: INIT@STAT?
I (5096) PNG Count: total loaded png: 24
W (5781) PNG Load: No images found with primary prefix Custom_greeting, trying secondary prefix greeting
I (6631) PNG Load: Loaded greeting1.png into PSRAM
I (7549) PNG Load: Loaded greeting2.png into PSRAM
I (694664) view_inactive: inactive_time: 691675, screenoff_time: 0, screenoff_mode: 0
I (694665) view_inactive: standby_mode: 1, is_taskdown: 1
I (698173) view: event: VIEW_EVENT_SENSOR
I (701131) BSP: voltage: 4190mV
I (701132) BSP: voltage: 4186mV
I (701133) BSP: voltage: 4186mV
I (701133) BSP: voltage: 4198mV
I (701145) BSP: voltage: 4186mV
I (701145) BSP: voltage: 4186mV
I (701146) BSP: voltage: 4173mV
I (701147) BSP: voltage: 4198mV
I (701158) BSP: voltage: 4186mV
I (701159) BSP: voltage: 4190mV
I (701159) BSP: percentage: 100%
I (703056) MEM: Biggest / Minimum / Free / Total
DRAM : [ 63488 / 66870 / 74486 / 578766]
PSRAM: [ 3538944 / 3639360 / 3643088 / 8367812]
DMA : [ 63488 / 66866 / 74482 / 570618]
I (703154) view: event: VIEW_EVENT_SENSOR
I (708174) view: event: VIEW_EVENT_SENSOR
I (713071) MEM: Biggest / Minimum / Free / Total
DRAM : [ 63488 / 66870 / 74486 / 578766]
PSRAM: [ 3538944 / 3639360 / 4322480 / 8367812]
DMA : [ 63488 / 66866 / 74482 / 570618]
I (713152) view: event: VIEW_EVENT_SENSOR
If you press Enter on the Terminal Emulator, a prompt appears and you can send commands to the SenseCAP Watcher.
SenseCAP>
SenseCAP>
If you type "help
" all the recognized commands will be displayed together with their parameters.
Here is the list of the commands implemented in release 1.1.3 of the SenseCAP Watcher firmware:
SenseCAP> help
wifi_sta [-s <ssid>] [-p <password>]
WiFi is station mode, join specified soft-AP
-s <ssid> SSID of AP
-p <password> password of AP
ota [-t <int>] [--url=<string>]
force ota, ignoring version check
-t, --ota_type=<int> 0: ai model, 1: himax, 2: esp32
--url=<string> url for ai model, himax or esp32 firmware
taskflow [-iej] [-f <string>]
import taskflow by json string or SD file, eg:taskflow -i -f "test.json".
export taskflow to stdout or SD file, eg: taskflow -e -f "test.json"
-i, --import import taskflow
-e, --export export taskflow
-f, --file=<string> File path, import or export taskflow json string by SD, eg: test.json
-j, --json import taskflow json string by stdin
factory_info
get factory infomation
battery
get battery percent
bsp subcmd [subcmd args]
call bsp functions
i2cdetect <0|1>
scan the specified i2c bus
reboot
reboot the device
factory_reset
factory reset and reboot the device
record [-t <int>] [-f <string>]
record audio and save to SD.
-t, --time=<int> record time, s
-f, --file=<string> File path, Store PCM audio data in SD card
vi_ctrl [-sec] [-z <int>]
voice interaction ctrl.
-s, --start start wakeup, and start record
-e, --end end record
-c, --stop stop voice interaction when analyzing or palying, Put it into idle.
-z, --exit=<int> 0: exit vi, 1:exit vi then run new taskflow
iperf [-suVa] [-c <ip>] [-p <port>] [-l <length>] [-i <interval>] [-t <time>] [-b <bandwidth>]
iperf command
-c, --client=<ip> run in client mode, connecting to <host>
-s, --server run in server mode
-u, --udp use UDP rather than TCP
-V, --ipv6_domain use IPV6 address rather than IPV4
-p, --port=<port> server port to listen on/connect to
-l, --len=<length> Set read/write buffer size
-i, --interval=<interval> seconds between periodic bandwidth reports
-t, --time=<time> time in seconds to transmit for (default 10 secs)
-b, --bandwidth=<bandwidth> bandwidth to send at in Mbits/sec
-a, --abort abort running iperf
rgb [-r <int>] [-g <int>] [-b <int>] [-m <int>] [-v <int>] [-t <int>]
set rgb value. eg: rgb -r 255 -g 0 -b 0 -m 3
-r, --red=<int> red value, 0~255
-g, --green=<int> green value, 0~255
-b, --blue=<int> blue value, 0~255
-m, --mode=<int> 1: breath, 2: blink, 3:solid, default 3
-v, --step_value=<int> RGB step value, default 3
-t, --step_time_ms=<int> RGB step time(ms), default 5
help [<string>]
Print the summary of all registered commands if no arguments are given,
otherwise print summary of given command.
<string> Name of command
SenseCAP>
As an example the following command causes the color LED to blink in green:
SenseCAP> rgb -g 255 -m 2
Run local task "Human Detection"Here is an example of a locally run AI detection task which can be controlled by the Serial Console of the Watcher.
From the Watcher Main Menu, select Task templates
- Select task Human Detection
then from the Serial Console enter command "taskflow -e
":
SenseCAP> taskflow -e
I (11777035) cmd: taskflow:
{"tlid":3,"ctd":3,"tn":"Local Human Detection","type":0,"task_flow":[{"id":1,"type":"ai camera","index":0,"version":"1.0.0","params":{"model_type":1,"modes":0,"model":{"arguments":{"iou":45,"conf":50}},"conditions":[{"class":"person","mode":1,"type":2,"num":0}],"conditions_combo":0,"silent_period":{"silence_duration":5},"output_type":0,"shutter":0},"wires":[[2]]},{"id":2,"type":"alarm trigger","index":1,"version":"1.0.0","params":{"text":"human detected","audio":""},"wires":[[3,4]]},{"id":3,"type":"local alarm","index":2,"version":"1.0.0","params":{"sound":1,"rgb":1,"img":0,"text":0,"duration":1},"wires":[]},{"id":4,"type":"sensecraft alarm","index":3,"version":"1.0.0","params":{"silence_duration":30},"wires":[]}]}
SenseCAP>
The resulting JSON is available in file human-detection-result.json under section "Code" below.
Run SenseCraft task "FREISA Robot Dog greets user"Launch the SenseCraft App, then connect to the SenseCAP Watcher.
Type the following message:
> If there is a person, device flashes LED and plays sound
> "Hi, I'm your faithful FREISA Robot Dog. Ask me anything, Master!"
then tap Send
Tap Detail Configs to review the task
- Check "Serial Port / UART Output"
- Leave "Include base64 image" unchecked for now
then tap Run.
The resulting JSON is available in file freisa-detection-result.json under section "Code" below.
If you read until here...... maybe you will like this video!
Next stepsWe are currently busy trying to understand how to port the custom YOLOv8 models we have developed for FREISA and make it run locally on the Watcher - please see https://github.com/Seeed-Studio/wiki-documents/issues/1619
The journey is not over yet, so stay tuned for more updates directly on our Social Media
- Instagram: https://instagram.com/baroloteam
- X: https://x.com/baroloteam
or give a Like and subscribe to the FREISA project page on GitHub: http://github.com/B-AROL-O/FREISA
Comments
Please log in or sign up to comment.