Forum Rule: Always post complete source code & details to reproduce any issue!
Results 1 to 8 of 8

Thread: Ant+ libarary and USB driver for Teensy 3.5/6

  1. #1

    Ant+ libarary and USB driver for Teensy 3.5/6

    Attached is a first draft of implementing a USBHost driver for an Ant+ USB stick on the Teensy 3.6, for the Ant+ network protocol. Ant-FS (file transfers) is not implemented, yet, in the library though the framework is there for someone else to investigate, I have no need of it.
    (Ant+ is a low energy Wifi networking protocol, originally and specifically targeting sports sensors, such as a heart rate monitor, bike speed sensor, etc..)

    antplus_usb_05042017.zip

    Notes:
    Driver has been simultaneously tested with two devices:; that is, one device per channel; A heart rate monitor chest strap, and a combined bike sensor - speed and cadence, as can be observed in the debug output below.
    In this draft, please compile with the included USBHost_t36. There are two small but required modifications: QTD_LENGTH() added to USBHost_t36.h and PERIODIC_LIST_SIZE must be set to 8, otherwise default library should be fine.

    This is an initial draft so feedback is more than welcomed.

    Using the included example, antplus.ino, should produced something below:
    Code:
    with HRM enabled only
    ---------
    
    
    Ant+ USB
     @ start up mesg reason: 0x0
    [0] * network key accepted
    [0]  * channel assign accepted
    [0]  * channel mesg period accepted
    [0]  * search timeout period accepted
    [0]  * radio freq accepted
    [0]  * search waveform accepted
    [0]  * set channel id accepted
    [0]  * open channel accepted
    Channel 0 status: STATUS SEARCHING CHANNEL
     @ version: 'AJK1.04RAF'
     @ capabilities:
       Max ANT Channels: 8
       Max ANT Networks: 3
       Std. option: 0x0
       Advanced: 0xBA
       Advanced2: 0x36
    [1]  * channel assign accepted
    Channel 1 status: STATUS ASSIGNED CHANNEL
    [0] * network key accepted
    [1]  * channel mesg period accepted
    [0]  * channel assign accepted
    [1]  * search timeout period accepted
    [0]  * channel mesg period accepted
    [1]  * radio freq accepted
    [0]  * search timeout period accepted
    [1]  * search waveform accepted
    [0]  * radio freq accepted
    [1]  * set channel id accepted
    [0]  * search waveform accepted
    [1]  * open channel accepted
    [0]  * set channel id accepted
    Channel 1 status: STATUS SEARCHING CHANNEL
     @ capabilities:
       Max ANT Channels: 8
       Max ANT Networks: 3
       Std. option: 0x0
       Advanced: 0xBA
       Advanced2: 0x36
     @ version: 'AJK1.04RAF'
    [0]  * open channel accepted
     @ capabilities:
       Max ANT Channels: 8
       Max ANT Networks: 3
       Std. option: 0x0
       Advanced: 0xBA
       Advanced2: 0x36
     @ version: 'AJK1.04RAF'
    HRM: sequence:208, interval:6672ms, bpm:46
    Channel 0 status: STATUS TRACKING_CHANNEL
    Device found on channel 0: deviceId:26434, deviceType:120, transType:1
    HRM: sequence:209, interval:1318ms, bpm:47
    HRM: sequence:210, interval:1147ms, bpm:48
    HRM: sequence:211, interval:954ms, bpm:48
    HRM: sequence:212, interval:1004ms, bpm:49
    HRM: sequence:213, interval:1392ms, bpm:49
    HRM: sequence:214, interval:1378ms, bpm:48
    HRM: sequence:215, interval:1216ms, bpm:49
    HRM: sequence:216, interval:1194ms, bpm:49
    HRM: sequence:217, interval:1162ms, bpm:49
    HRM: sequence:218, interval:1183ms, bpm:49
    HRM: sequence:219, interval:1236ms, bpm:49
    HRM: sequence:220, interval:1251ms, bpm:49
    HRM: sequence:221, interval:1288ms, bpm:48
    HRM: sequence:222, interval:1208ms, bpm:48
    HRM: sequence:223, interval:1208ms, bpm:49
    HRM: sequence:224, interval:1190ms, bpm:49
    HRM: sequence:225, interval:1179ms, bpm:49
    HRM: sequence:226, interval:1178ms, bpm:49
    HRM: sequence:227, interval:1201ms, bpm:49
    HRM: sequence:228, interval:1135ms, bpm:49
    HRM: sequence:229, interval:1134ms, bpm:50
    HRM: sequence:230, interval:1126ms, bpm:50
    HRM: sequence:231, interval:1147ms, bpm:50
    HRM: sequence:232, interval:1140ms, bpm:51
    HRM: sequence:233, interval:1074ms, bpm:51
    HRM: sequence:234, interval:1098ms, bpm:51
    HRM: sequence:235, interval:1092ms, bpm:52
    HRM: sequence:236, interval:1047ms, bpm:52
    HRM: sequence:237, interval:1058ms, bpm:53
    HRM: sequence:238, interval:1055ms, bpm:53
    HRM: sequence:239, interval:1032ms, bpm:54
    HRM: sequence:240, interval:1048ms, bpm:54
    HRM: sequence:241, interval:1057ms, bpm:55
    HRM: sequence:242, interval:1051ms, bpm:55
    HRM: sequence:243, interval:1044ms, bpm:55
    HRM: sequence:244, interval:1059ms, bpm:55
    HRM: sequence:245, interval:1066ms, bpm:55
    HRM: sequence:246, interval:1052ms, bpm:55
    HRM: sequence:247, interval:1090ms, bpm:55
    HRM: sequence:248, interval:1113ms, bpm:55
    HRM: sequence:249, interval:1111ms, bpm:55
    HRM: sequence:250, interval:1089ms, bpm:55
    HRM: sequence:251, interval:1099ms, bpm:55
    HRM: sequence:252, interval:1087ms, bpm:55
    HRM: sequence:253, interval:1053ms, bpm:55
    HRM: sequence:254, interval:1083ms, bpm:55
    HRM: sequence:255, interval:1127ms, bpm:55
    HRM: sequence:0, interval:1093ms, bpm:55
    HRM: sequence:1, interval:1109ms, bpm:54
    HRM: sequence:2, interval:1096ms, bpm:54
    HRM: sequence:3, interval:1070ms, bpm:55
    HRM: sequence:4, interval:1074ms, bpm:55
    HRM: sequence:5, interval:1088ms, bpm:55
    HRM: sequence:6, interval:1114ms, bpm:54
    HRM: sequence:7, interval:1079ms, bpm:55
    HRM: sequence:8, interval:1104ms, bpm:54
    HRM: sequence:9, interval:1098ms, bpm:54
    HRM: sequence:10, interval:1063ms, bpm:55
    HRM: sequence:11, interval:1062ms, bpm:55
    HRM: sequence:12, interval:1074ms, bpm:55
    HRM: sequence:13, interval:1084ms, bpm:55
    HRM: sequence:14, interval:1070ms, bpm:55
    HRM: sequence:15, interval:1108ms, bpm:55
    HRM: sequence:16, interval:1107ms, bpm:55
    HRM: sequence:17, interval:1067ms, bpm:55
    HRM: sequence:18, interval:1071ms, bpm:55
    HRM: sequence:19, interval:1042ms, bpm:55
    HRM: sequence:20, interval:1037ms, bpm:55
    HRM: sequence:21, interval:1034ms, bpm:56
    HRM: sequence:22, interval:1079ms, bpm:56
    HRM: sequence:23, interval:1085ms, bpm:56
    HRM: sequence:24, interval:1107ms, bpm:55
    etc..
    
    ---
    
    with HRM and a combined speed and cadence sensor enabled
    (i'm manually spinning the cranks to generate sensor pickup)
    
    
    ---------
    Ant+ USB
     @ start up mesg reason: 0x0
    [0] * network key accepted
    [0]  * channel assign accepted
    [0]  * channel mesg period accepted
    [0]  * search timeout period accepted
    [0]  * radio freq accepted
    [0]  * search waveform accepted
    [0]  * set channel id accepted
    [0]  * open channel accepted
    Channel 0 status: STATUS SEARCHING CHANNEL
     @ capabilities:
       Max ANT Channels: 8
       Max ANT Networks: 3
       Std. option: 0x0
       Advanced: 0xBA
       Advanced2: 0x36
     @ version: 'AJK1.04RAF'
    HRM: sequence:166, interval:37073ms, bpm:64
    Channel 0 status: STATUS TRACKING_CHANNEL
    [1]  * channel assign accepted
    Channel 1 status: STATUS ASSIGNED CHANNEL
    [0] * network key accepted
    [1]  * channel mesg period accepted
    [0]  * channel assign accepted
    [1]  * search timeout period accepted
    [0]  * channel mesg period accepted
    [1]  * radio freq accepted
    [0]  * search timeout period accepted
    [1]  * search waveform accepted
    [0]  * radio freq accepted
    [1]  * set channel id accepted
    [0]  * search waveform accepted
    [1]  * open channel accepted
    [0]  * set channel id accepted
    Channel 1 status: STATUS SEARCHING CHANNEL
     @ capabilities:
       Max ANT Channels: 8
       Max ANT Networks: 3
       Std. option: 0x0
       Advanced: 0xBA
       Advanced2: 0x36
     @ version: 'AJK1.04RAF'
    [0]  * open channel accepted
    HRM: sequence:167, interval:1105ms, bpm:63
     @ capabilities:
       Max ANT Channels: 8
       Max ANT Networks: 3
       Std. option: 0x0
       Advanced: 0xBA
       Advanced2: 0x36
     @ capabilities:
       Max ANT Channels: 8
       Max ANT Networks: 3
       Std. option: 0x0
       Advanced: 0xBA
       Advanced2: 0x36
     @ version: 'AJK1.04RAF'
    SPDCAD: speed: 614.52km/h, cadence: 27676rpm, total distance: 114.55km
    Channel 1 status: STATUS TRACKING_CHANNEL
    Device found on channel 1: deviceId:23513, deviceType:121, transType:1
    HRM: sequence:168, interval:1080ms, bpm:62
    HRM: sequence:169, interval:1123ms, bpm:61
    HRM: sequence:170, interval:1074ms, bpm:60
    HRM: sequence:171, interval:1037ms, bpm:60
    HRM: sequence:172, interval:875ms, bpm:60
    HRM: sequence:173, interval:842ms, bpm:60
    HRM: sequence:174, interval:808ms, bpm:61
    SPDCAD: speed: 0.00km/h, cadence: 1rpm, total distance: 114.55km
    HRM: sequence:175, interval:759ms, bpm:63
    SPDCAD: speed: 0.00km/h, cadence: 349rpm, total distance: 114.55km
    HRM: sequence:176, interval:738ms, bpm:66
    HRM: sequence:177, interval:718ms, bpm:68
    HRM: sequence:178, interval:715ms, bpm:70
    SPDCAD: speed: 0.23km/h, cadence: 27rpm, total distance: 114.55km
    SPDCAD: speed: 22.28km/h, cadence: 0rpm, total distance: 114.56km
    HRM: sequence:179, interval:696ms, bpm:72
    SPDCAD: speed: 24.83km/h, cadence: 86rpm, total distance: 114.56km
    SPDCAD: speed: 24.36km/h, cadence: 0rpm, total distance: 114.56km
    HRM: sequence:180, interval:673ms, bpm:74
    SPDCAD: speed: 24.21km/h, cadence: 0rpm, total distance: 114.56km
    SPDCAD: speed: 23.92km/h, cadence: 0rpm, total distance: 114.56km
    HRM: sequence:181, interval:682ms, bpm:75
    SPDCAD: speed: 23.77km/h, cadence: 0rpm, total distance: 114.57km
    SPDCAD: speed: 23.56km/h, cadence: 0rpm, total distance: 114.57km
    SPDCAD: speed: 23.35km/h, cadence: 0rpm, total distance: 114.57km
    HRM: sequence:182, interval:668ms, bpm:77
    SPDCAD: speed: 23.14km/h, cadence: 0rpm, total distance: 114.57km
    HRM: sequence:183, interval:653ms, bpm:79
    SPDCAD: speed: 22.94km/h, cadence: 0rpm, total distance: 114.57km
    SPDCAD: speed: 22.80km/h, cadence: 21rpm, total distance: 114.57km
    HRM: sequence:184, interval:663ms, bpm:80
    SPDCAD: speed: 22.54km/h, cadence: 0rpm, total distance: 114.58km
    SPDCAD: speed: 22.28km/h, cadence: 0rpm, total distance: 114.58km
    HRM: sequence:185, interval:672ms, bpm:81
    SPDCAD: speed: 22.16km/h, cadence: 0rpm, total distance: 114.58km
    SPDCAD: speed: 21.97km/h, cadence: 0rpm, total distance: 114.58km
    HRM: sequence:186, interval:679ms, bpm:82
    SPDCAD: speed: 21.72km/h, cadence: 0rpm, total distance: 114.58km
    SPDCAD: speed: 21.49km/h, cadence: 0rpm, total distance: 114.59km
    HRM: sequence:187, interval:683ms, bpm:83
    SPDCAD: speed: 21.31km/h, cadence: 0rpm, total distance: 114.59km
    SPDCAD: speed: 21.08km/h, cadence: 0rpm, total distance: 114.59km
    HRM: sequence:188, interval:689ms, bpm:83
    SPDCAD: speed: 20.91km/h, cadence: 0rpm, total distance: 114.59km
    SPDCAD: speed: 20.74km/h, cadence: 0rpm, total distance: 114.60km
    HRM: sequence:189, interval:692ms, bpm:84
    SPDCAD: speed: 20.47km/h, cadence: 0rpm, total distance: 114.60km
    SPDCAD: speed: 0.00km/h, cadence: 14rpm, total distance: 114.60km
    SPDCAD: speed: 20.53km/h, cadence: 0rpm, total distance: 114.60km
    HRM: sequence:190, interval:683ms, bpm:84
    SPDCAD: speed: 21.60km/h, cadence: 0rpm, total distance: 114.60km
    HRM: sequence:191, interval:709ms, bpm:84
    SPDCAD: speed: 21.49km/h, cadence: 62rpm, total distance: 114.60km
    SPDCAD: speed: 22.94km/h, cadence: 0rpm, total distance: 114.61km
    SPDCAD: speed: 23.92km/h, cadence: 0rpm, total distance: 114.61km
    HRM: sequence:192, interval:705ms, bpm:84
    SPDCAD: speed: 23.70km/h, cadence: 66rpm, total distance: 114.61km
    SPDCAD: speed: 24.52km/h, cadence: 0rpm, total distance: 114.61km
    HRM: sequence:193, interval:750ms, bpm:84
    SPDCAD: speed: 24.67km/h, cadence: 0rpm, total distance: 114.61km
    SPDCAD: speed: 24.44km/h, cadence: 69rpm, total distance: 114.61km
    HRM: sequence:194, interval:756ms, bpm:83
    SPDCAD: speed: 24.83km/h, cadence: 0rpm, total distance: 114.62km
    SPDCAD: speed: 24.83km/h, cadence: 0rpm, total distance: 114.62km
    SPDCAD: speed: 24.75km/h, cadence: 69rpm, total distance: 114.62km
    HRM: sequence:195, interval:756ms, bpm:83
    SPDCAD: speed: 25.23km/h, cadence: 0rpm, total distance: 114.62km
    SPDCAD: speed: 25.15km/h, cadence: 0rpm, total distance: 114.62km
    SPDCAD: speed: 24.99km/h, cadence: 55rpm, total distance: 114.63km
    HRM: sequence:196, interval:768ms, bpm:82
    SPDCAD: speed: 25.15km/h, cadence: 0rpm, total distance: 114.63km
    SPDCAD: speed: 25.23km/h, cadence: 0rpm, total distance: 114.63km
    SPDCAD: speed: 0.00km/h, cadence: 69rpm, total distance: 114.63km
    HRM: sequence:197, interval:724ms, bpm:82
    SPDCAD: speed: 24.99km/h, cadence: 0rpm, total distance: 114.63km
    SPDCAD: speed: 24.75km/h, cadence: 0rpm, total distance: 114.64km
    HRM: sequence:198, interval:732ms, bpm:82
    SPDCAD: speed: 24.67km/h, cadence: 0rpm, total distance: 114.64km
    SPDCAD: speed: 24.44km/h, cadence: 63rpm, total distance: 114.64km
    HRM: sequence:199, interval:705ms, bpm:82
    SPDCAD: speed: 24.21km/h, cadence: 0rpm, total distance: 114.64km
    SPDCAD: speed: 24.06km/h, cadence: 0rpm, total distance: 114.64km
    SPDCAD: speed: 23.92km/h, cadence: 68rpm, total distance: 114.64km
    HRM: sequence:200, interval:706ms, bpm:82
    SPDCAD: speed: 24.36km/h, cadence: 0rpm, total distance: 114.65km
    SPDCAD: speed: 24.14km/h, cadence: 0rpm, total distance: 114.65km
    HRM: sequence:201, interval:708ms, bpm:83
    SPDCAD: speed: 23.92km/h, cadence: 0rpm, total distance: 114.65km
    SPDCAD: speed: 23.77km/h, cadence: 0rpm, total distance: 114.65km
    HRM: sequence:202, interval:690ms, bpm:83
    SPDCAD: speed: 23.56km/h, cadence: 0rpm, total distance: 114.65km
    SPDCAD: speed: 23.42km/h, cadence: 29rpm, total distance: 114.66km
    SPDCAD: speed: 23.70km/h, cadence: 0rpm, total distance: 114.66km
    HRM: sequence:203, interval:673ms, bpm:84
    SPDCAD: speed: 23.63km/h, cadence: 0rpm, total distance: 114.66km
    HRM: sequence:204, interval:677ms, bpm:84
    SPDCAD: speed: 23.56km/h, cadence: 62rpm, total distance: 114.66km
    SPDCAD: speed: 23.14km/h, cadence: 0rpm, total distance: 114.67km
    HRM: sequence:205, interval:671ms, bpm:85
    SPDCAD: speed: 22.94km/h, cadence: 0rpm, total distance: 114.67km
    SPDCAD: speed: 21.25km/h, cadence: 0rpm, total distance: 114.67km
    HRM: sequence:206, interval:667ms, bpm:85
    HRM: sequence:207, interval:678ms, bpm:86
    HRM: sequence:208, interval:674ms, bpm:86
    SPDCAD: speed: 0.00km/h, cadence: 20rpm, total distance: 114.67km
    HRM: sequence:209, interval:647ms, bpm:87
    HRM: sequence:210, interval:657ms, bpm:87
    HRM: sequence:211, interval:668ms, bpm:88
    SPDCAD: speed: 1.98km/h, cadence: 0rpm, total distance: 114.67km
    HRM: sequence:212, interval:645ms, bpm:88
    HRM: sequence:213, interval:640ms, bpm:89
    HRM: sequence:214, interval:643ms, bpm:89
    HRM: sequence:215, interval:656ms, bpm:89
    HRM: sequence:216, interval:644ms, bpm:90
    HRM: sequence:217, interval:474ms, bpm:90
    HRM: sequence:218, interval:833ms, bpm:90
    HRM: sequence:219, interval:634ms, bpm:90
    HRM: sequence:220, interval:613ms, bpm:91
    HRM: sequence:221, interval:617ms, bpm:92
    HRM: sequence:222, interval:603ms, bpm:93
    HRM: sequence:223, interval:632ms, bpm:93
    HRM: sequence:224, interval:853ms, bpm:93
    HRM: sequence:225, interval:907ms, bpm:93
    HRM: sequence:226, interval:894ms, bpm:90
    HRM: sequence:227, interval:816ms, bpm:88
    HRM: sequence:228, interval:897ms, bpm:85
    HRM: sequence:229, interval:899ms, bpm:83
    HRM: sequence:230, interval:837ms, bpm:81
    HRM: sequence:231, interval:895ms, bpm:79
    HRM: sequence:232, interval:908ms, bpm:78
    HRM: sequence:233, interval:901ms, bpm:76
    HRM: sequence:234, interval:911ms, bpm:75
    HRM: sequence:235, interval:950ms, bpm:73
    HRM: sequence:236, interval:943ms, bpm:72
    HRM: sequence:237, interval:928ms, bpm:71

  2. #2
    Senior Member PaulStoffregen's Avatar
    Join Date
    Nov 2012
    Posts
    15,115
    Is this code open source? Should I merge it into the USBHost_t36 library? It really needs to have a MIT or similar license to be merged.

    I'm not familiar with this wireless protocol and I don't own any devices that use it. Any suggestions on the minimal gear to buy to actually give it a try?


    Edit: took me a few minutes to figure out the command to extract this zip file: "7za x antplus_usb_05042017.zip"

  3. #3
    It's open source in that it's here for anyone to do with what they please. I still want to complete implementing a few of the remaining profiles, afterwhich I'll create a github and add an open source licence (for all to abuse).

    A minimal setup would be a USB stick and a sensor of your choice.
    Any Ant+ USB dongle should suffice. For my teensy bike computer I'll be picking up this small 12 adapter here: https://www.amazon.co.uk/Anself-Comp...0LIIMHP4/?th=1
    For developing Ant+ anything I'd recommend one leans toward a heart rate monitor strap, just wear and forget. I use an older model of this: https://www.amazon.co.uk/Garmin-Moni...dp/B000UOD5QM/

    7zip was used to compact the source in to a Zip compatible archive. I selected .zip as the forum doesn't accept .7z, a much leaner container imo.

  4. #4
    Senior Member
    Join Date
    Oct 2013
    Posts
    250
    Thanks very much for the library, I have been thinking about making a bike computer for years. I have ordered a generic ant+ usb stick form Amazon and have parts coming from PJRC. With sunlight readable required does anyone have any display suggestions?

  5. #5
    Senior Member
    Join Date
    Oct 2013
    Posts
    250
    Success! Just received parts from PJRC, generic Ant+ module working initially with HRM and with a little tweak cadence.

  6. #6
    Excellent, nice to have confirmation.

    How did you fair with the sunlight readable display? My own research hasn't turned up anything but non-viable E-Ink. A capacitive touch ~320x240 OLED would be amazing find right about now.
    Last edited by MichaelMC; 04-21-2017 at 06:45 PM.

  7. #7
    Senior Member
    Join Date
    Oct 2013
    Posts
    250
    http://www.newhavendisplay.com/devel...c-979_981.html, some of these look interesting. The FT800 based should run the Gameduino 2 code.

  8. #8

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •