Vorreste collegare un vecchio tapis roulant al vostro account Zwift o al vostro dispositivo Garmin per allenarvi nelle fredde giornate invernali? Se avete un animo nerd e un po’ di pratica, si può fare, grazie ad un Raspberry e qualche gadget.
In primis mi preme dire che non è tutta farina del mio sacco, la guida arriva direttamente da QUI, io mi sono semplicemente interessato di correggere alcuni link, adattarla al Raspberry di prima generazione (PI B+) e riportarla.
La procedura non è così complicata come si possa pensare, bastano pochi accessori, 3 file per collegare il Raspberry al sensore e un po’ di codice, ma partiamo con la lista della spesa:
- un Raspberry Pi. Va bene qualsiasi modello, ma visto il periodo storico in cui i chip costano più dell’oro, io ho optato per uno di prima generazione (Raspberry Pi B+) che da tempo riposava in cassetto, di conseguenza tutti i link che trovare in questa guida fanno riferimento a quell’hardware, se usate un dispositivo più recente dovrete modificare la versione di NodeJS scelta,
- una micro sd su cui installare Raspbian (se avete già un sistema funzionate potete utilizzare quello),
- un adattatore USB per la connessione Ant+, io ne utilizzo uno molto economico che trovate qui: amzn.to/38XNL0J
- un sensore infrarosso come questo amzn.to/3la9Yyu, se volete spendere poco e non avete fretta, vi conviene cercare su AliExpress:
Passiamo a lavorare sul software, accediamo al Raspberry come meglio crediamo (in locale o tramite ssh) e sul terminale iniziamo a digitare:
sudo apt update
sudo apt upgrade
sudo reboot
sudo apt install git libudev-dev
Ora dobbiamo conoscere l’architettura su cui si basa la nostra versione di SO:
uname -m
se state utilizzando un Raspberry Pi B+, sarà: armv6l
ma è meglio essere sicuri, se risultasse una diversa architettura, dovremmo recuperare i file giusti per l’installazione che segue.
Proseguiamo installando NodeJS:
wget https://nodejs.org/dist/latest-v11.x/node-v11.15.0-linux-armv6l.tar.gz
tar -xzf node-v11.15.0-linux-armv6l.tar.gz
cd node-v11.15.0-linux-armv6l/
sudo cp -R * /usr/local/
Verifichiamo che NodeJS e npm siano correttamente installati nella versione che ci serve:
node - v
v11.15.0
npm -v
6.7.0
E’ giunto il momento di inserire l’adattatore Ant+ in una delle porte USB e verificarne le caratteristiche:
lsusb
il terminale dovrebbe restituirci qualcosa del genere:
Bus 001 Device 004: ID 0fcf:1008 Dynastream Innovations, Inc. ANTUSB-m Stick
Se il vostro modello fosse diverso non disperate, basterà modificare i dati nelle operazioni che seguono.
Creiamo una regola UDEV per abilitare l’accesso al dispositivo ANT+:
sudo nano /etc/udev/rules.d/Dynastream-ANTUSB-m.rules
copiamo all’interno i seguenti parametri:
SUBSYSTEM=="usb", ATTRS{idVendor}=="0fcf", ATTRS{idProduct}=="1008", RUN+="/sbin/modprobe usbserial vendor=0x0fcf product=0x1008", MODE="0666", OWNER="pi", GROUP="root"
salviamo (CRTL+O) e usciamo (CTRL+X).
Prestiamo particolare attenzione a quello che abbiamo appena scritto nel file in oggetto, perché se il nostro dispositvo Ant+ ha delle specifiche diverse bisogna correggere i dati. Controlliamo che i valori idVendor, idProduct e successivi corrispondano a quelli restituiti in precedenza dal terminale quando abbiamo digitato lsusb.
Ora rimuoviamo l’adattatore Ant+, attendiamo qualche istante, ricolleghiamolo e digitiamo sul teminale:
ls /dev/ttyUSB0
se non ci sono problemi dovremmo leggere:
/dev/ttyUSB0
Procediamo danto i seguendi comandi:
git clone https://github.com/Loghorn/ant-plus.git
cd ant-plus/
nano ant-plus.js
ora modifichiamo il file aggiungendo al blocco “module.export” una riga:
module.exports = {
...
Messages: Ant.Messages,
};
salviamo il file e continuiamo digitando:
npm install
al termine delle operazioni:
node sample/sample.js
se tutto funziona dovremmo leggere qualcosa di simile:
3 Stick found 3 startup 3 Max channels: 8 3 sensor1 attached
fermiamo la ricerca con CTRL+C e preseguimo:
npm install rpi-gpio
cd ./sample
git clone https://github.com/gallochri/strideSpeedDistance.git
node strideSpeedDistance/start.js
modifichiamo il file strideSpeedDistance.js:
nano /home/pi/ant-plus/sample/strideSpeedDistance/strideSpeedDistance.js
correggendo il valore preimpostato “const stick = new Ant.GarminStick3();” con “const stick = new Ant.GarminStick2();”.
(se il vostro modello di stick Ant+ fosse, ad esempio, un 0fcf:1009, non avete bisogno di effettuare questa modifica)
avviamo lo script:
node strideSpeedDistance/start.js
in questo modo il nostro Raspberry inizia a trasmettere, ovviamente nulla visto che non abbiamo ancora eseguito i collegamenti; se lo script funziona e rimane attivo possiamo terminarlo momentaneamente premendo CRTL+C.
Misuriamo approssimativamente la lunghezza del nostro tappeto e impostiamola correttamente nel file apposito (in cm, ci sono i riferimenti all’interno):
nano /home/pi/ant-plus/sample/strideSpeedDistance/speedMeter.js
Salviamo il file. Se vogliamo eseguire lo script automaticamente e in backgroud ad ogni accensione del Raspberry, ci sono diversi sistemi: PM2, forever… ma io ho optato per un più semplice e immediato edit del Cron:
sudo crontab -e
aggiungendo:
@reboot /usr/local/bin/node /home/pi/ant-plus/sample/strideSpeedDistance/start.js &
A questo punto non ci resta che occuparci dei collegamenti, molto semplici:
- alimentiamo il sensore infrarossi collegando il pin VCC al pin 2 del Raspberry per avere la 5V,
- colleghiamo il pin GRD al pin 6 per la massa,
- colleghiamo il pin OUT al pin 7 per il segnale.
Finito. Ora non ci resta che fare un po’ di bricolage. Io ho inserito il sensore infrarossi all’interno di una piccola scatoletta di plastica e l’ho fissato al bordo destro del tapis roulant, poi ho fatto un segno bianco del tappeto che sarà il riferimento che leggerà il sensore. Fate alcune prove avviando il tapis roulant e se tutto funziona a dovere ma la velocità non dovesse corrispondere esattamente, potete sempre regolarla agendo sull’impostazione della lunghezza.
Piccolo “bonus”: se volete aumentare la precisione del rilevamento e la velocità con cui vengono inviati i dati, potete aggiungere un segno sul tappeto equidistante dal precedente (dividendo quindi il tappeto in quattro parti uguali) e dimezzare di conseguenza il valore della lunghezza nel file speedMeter.js.