Inexpensive low-quality Lora32u4 GPS tracker for #juniorIOTchallenge 2018
this set of folders is for #JuniorIOTchallenge - Smart City Challenge 2018
met leerling teams bij fablab de Kaasfabriek in Alkmaar
deze software op het internet is natuurlijk geheim...
...anders kunnen ze makkelijk afkijken!
previous iteration is Junior IoT Baloon Challenge february 2017
so for ora location transmittor with GPS and rfm95 see
https://github.com/Kaasfabriek/GPS-Lora-Balloon-rfm95-TinyGPS/tree/master/Balloon-rfm95
Credits:
- Software plakker: Dennis --> dennis.ruigrok@gmail.com
- Educatie kletser: Marco --> marco@kaasfabriek.nl
- Regie en inspiratie: marco@marcovanschagen.nl
- Junior IOT Challenges: marco@dataschrift.nl
Some practical soldering tips in nice pictures: https://www.thethingsnetwork.org/labs/story/build-the-cheapest-possible-node-yourself --> you will need to use our pin mapping instead
- Lora32u4 with antenna, frequency 868 Mhz - 12 euro on Ebay and AliExpress optional:
- GPS
- Compass
- Solar Powerbank + lipo protect strip
- Lipo 380 mAh
- juniorIOTchallenge_Lora32u4_gpsTracker_with_extras (folder) this is the GPS tracker, with demo code added got compass and peer-to-peer radio
-----------------------------------------------------------------------------
2A usb charge cable
ββββββββββββββββββββββββββββββββββββββββββ β one or more I2c modules:
β solar βββββββββββββββββββββββββββββ β βββββββββββββββββ
β powerbank β controll board (Mini USB)ββ β Oled display β
β enclosure β B- B+ S- S+ ββ βVin GND SCL SDAβ
β ββββββββΌββΌβββββΌββΌββββββββββββ βββ¬ββββ¬ββββ¬ββββ¬ββ
βββββββββββββββββββ β β βββββββββββββββ β β β βI2cβchained
ββ 1-5x 1800mAh +βΌββββ€ β - + 200 mA β β ββββββββββββββββββββββ
ββ Li-Ion 18650 - βΌββ€ β β solar panelβ β βBME/BMP280 or BME680β
βββββββββββββββββββ β β βββββββββββββββ β βVin GND SCL SDA β
ββββββββββββββββββββββββββββββββββββββββββ βββ¬ββββ¬ββββ¬ββββ¬βββββββ
ββββββββββββββββββββββββΌββΌβββ β β βI2cβchained
β Lipo protect - + B- B+ β ββββββββββββββββββββββββββ
βββββββββββββββββββΌββΌββββββββ β GY-91 (BMP280+MPU9250) β
β β βββββββββββββββββββββββββ βVin GND SCL SDA 3 SD A Bβ
β β β GPS GN-801 β βββ¬ββββ¬ββββ¬ββββ¬βββ¬ββ¬βββ¬ββ¬β
β β βor BN-180/BN-200/BN-220β β β βI2cβchained
β β β 3V3 GND RXD TXDβ ββββββββββββββββββββββββββ
βββββββββββ β β βββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββ β compass HMC5983 β
β LiPo β ext 3V3 GND β β βVin GND SCL SDA CS SD DRβ
β 380 mAh β - + <50mA β β βββ¬ββββ¬ββββ¬ββββ¬βββ¬βββ¬βββ¬ββ
βprotectedβ β β β β β β β β
ββββββ¬βββ¬ββ βββ β txβ rxβ Vbat/2β β βI2cβ ant
βββββββββββββββββββββ¬βββXββββ¬βββXβββXββββ¬ββββ¬ββββ¬βββXβββXββββ¬ββββ¬ββββββββ β
β - + β BAT EN 5V 13 12 11 10 9 6 5 3 2 β β
β (LIPO CONN)β LED A1 A10 A9 A7 SCL SDA β β
β β ββββββββ ββββββββββββββββββ DIO3 R β
β(USB CONN) β LORA32U4 βATMEGAβ β RFM95 / HDP13 β DIO2 R β
β β β 32U4 β β4=rst 7=irq 8=csβ β β
β (RST BTN) β ββββββββ ββββββββββββββββββ ant(0)ββ
β β 15 16 β
β RST 3V3 REF GND A0 A1 A2 A3 A4 A5 SCK MOSI MISO 0 1 DIO1 ANT β¬
βββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬βββXβββXβββXβββRβββRβββRββββ¬ββββ¬βββRββββββββ
β __β ? ? xxx xxx xxx RX TX
ββ β β β SPI-RFM95 serial1
pushbutton β β ? ? 18mA
GND BAT β β GND 5V β β GND 5V
βββΌββββΌββ βββ΄ββββ΄ββββ΄ββββ΄βββββββ΄β΄β΄β βββ΄ββββ΄ββββ΄ββββ΄βββ΄β΄β΄β
βgnd Vinβ βRXD TXD GND 5V miscβ βTXD RXD GND 5V miscβ
βstep-upβ β PM dust sensor β β Co2 sensor β
βGND 5V β βSDS021 42x32x24mm 60mA β β MH-Z19 β
βββΌββββΌββ βSDS011 71x70x23mm 220mAβ βββββββββββββββββββββ
βββββββββββββββββββββββββ
* R = pins connected to RFM95
* X = avoid main function on these pins for compatibility with 32u4 Beetle
* for pushbutton to work, need to enable the internal pull-up
* pin-out for GPS BN-180/BN-200/BN-220 ==> (led) GND TX RX VCC (batt)
* pin-out for SDS021 ==> (hole) (1) 5V NC GND Rx Tx (5)
* pin-out for SDS011 ==> (1) CTL 1umPWM 5V 25umPWM GND Rx Tx (7) (hole)
* pin-out for MH-Z19 ==> 2 rows, and sometimes a 7 pin connector:
brown Vout 3.3 β
white (nc) β (HD)
black GND β (SR) PWM
red Vin 5v β Tx (green (AoT)
blue Rx β Rx bottom) GND
green Tx β (Vout 3.3V) Vin 5V
yellow (nc) β (side window)
-----------------------------------------------------------------------------
βββββββββββββ
β β β β β
β β β β β
β β β β β βββββββββββββββββ
ββββββββ β β β ββββββββ ββββββ β¬GND DIO2β¬
PM TXDβ¬A2 MOβ¬βββββββ βββ¬MISO DIO1β¬
PM RDXβ¬A1 SCKβ¬βββββββββββ¬MOSI DIOOβ¬
GNDβBTNββ¬A0 SS MIβ¬ββββ ββββββ¬SCK RFM95 3.3Vβ¬β3V3
I2c sda β¬A10 D9 BEETLE RSTβ¬ β¬NSS DIO4β¬
CO2 txβ¬A11 D10 5Vβ¬ β¬RESET DIO3β¬ ant
CO2 rxβ¬D11 RX TX SDA SCL GNDβ¬ β¬DIO5 GNDβ¬ β
β D6 D0 D1 D2 D3 3V3 β gndβ¬GND ANAβ¬ββββββ
ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬βββ βββββββββββββββββ
RXD TXD I2C I2C RFM
CO2 CO2 SDA SCL 3V3
+ LiPo?
-----------------------------------------------------------------------------
βββββββββββββ
β β β β β
β β β β β
β β β β β βββββββββββββββββ
ββββββββ β β β ββββββββ β¬GND DIO2β¬
β MIβ¬βββββββββββ¬MISO DIO1β¬
β MOβ¬βββββββββββ¬MOSI DIOOβ¬
I2c sca β¬SCA CJMCU SCKβ¬βββββββββββ¬SCK RFM95 3.3Vβ¬βdiodeβ5V
I2c sda β¬SDA BEETLE RESβ¬ β¬NSS DIO4β¬
CO2 txβ¬RX GNDβ¬ β¬RESET DIO3β¬ ant
CO2 rxβ¬TX 5Vβ¬ β¬DIO5 GNDβ¬ β
β D11 D10 D9 A0 A1 A2 β gndβ¬GND ANAβ¬ββββββ
ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬βββ βββββββββββββββββ
rx tx β RXD TXD
GPS GPS push PM PM
btn
β
gnd
βββββββββββββββββββββ
β MH-Z19 18mAβ βββββββββββββββββββββββββ
β Co2 sensor β β PM dust sensor β
βmisc GND 5V RXD TXDβ βSDS021 42x32x24mm 60mA β
ββ¬ββ¬ββ¬ββ¬ββββ¬ββββ¬ββββ¬β βSDS011 71x70x23mm 220mAβ
β β β β βRXD TXD GND 5V miscβ
βββββ βββββ GND 5V β β ββ¬ββββ¬ββββ¬ββββ¬βββββ¬ββ¬ββ¬ββ
β led βββββ β push β β β β β β
SODAQ β β β spk β btn β β β β gnd 5v
EXPLORER I2c β β β β β β β β β β
βββββββββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββββββββββββββββ
βRSTBTN SCL SDA X GND D13 D12 D11 D10 D9 D8 - D7 D6 D5 D4 D3 D2 D1 D0 β loraβ
β SCK MI MO SS tx rx tx rx TX RX β antβ
β LED-BUILTIN Serial β β
β TEMP_SENSOR LED_RED \\ β
βUSBCONN analog LED_GREEN \\ β
βSerialUsb LED_BLUE < ATSAMD21 > β β
β β β
β A7 A8 β β
β GND 3V D11 D12 o o+ β β
β o o o o batt o int [ lora RN2483 ] β β
βBTN o o+ o [ Serial2 ] β β
β GND 3V SCA SCL solr o ext β β
βBLE o o o o SDA1 SCL1 // β
βSerial1 X X RES 3.3 5V GND GND BAT - A0 A1 A2 A3 A4 A5 // β
βββββββββββββββββββββββββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββββββββββββββββ
NB-IOT
SHIELD I2c
βββββββββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββ
β SCL SDA X GND D13 D12 D11 D10 D9 D8 - D7 D6 D5 D4 D3 D2 D1 D0 β
β TX RX β
β LSM303AGR/LSM303C ACCEL & MAGNETO Serial β
β [ ] I2C-address ACCEL 0x1D, MAG 0x1E \
βnb-iot [ NB-IOT ] \
βant [ UBLOX SARA N200 ] HTS221 TEMP&HUM β
β [ ] I2C-address 0x5F [ ] β
β Serial [ GPS ] β
β LPS22HB BAROMETRIC [ UBLOX SAM-M8Q-0-10] β
β I2C-address is 0x5D [ ] β
β I2C-address 0x42 β
β SD CARD RSTBTN β
β /
β X X RES 3.3 5V GND GND BAT - A0 A1 A2 A3 A4 A5 /
βββββββββββββββββββββββββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββββ¬ββ
LPS22HB BAROMETRIC
I2C-address is 0x5D
HTS221 TEMP&HUM
I2C-address 0x5F
Important: bytes 0 to 8 (nine bytes) are agreed format for TTNmapper.org
who will ignore any further bytes. They expect SF7 signal, which is our
default choice also for other reasons.
-- start with TTNmapper defined format
byte 0, 1, 2 Latitude 3 bytes, -90 to +90 degr, scaled to 0..16777215
byte 3, 4, 5 Longitude 3 bytes, -180..+180 degrees, scaled 0..16777215
note: earth circumfence is 40.075 km; data is 40075*1000/16777215 = 2.5 m
2.5 m is about the GPS accuracy of 2..3 meters
byte 6, 7 Altitude 2 bytes, in meters. 0..65025 meter
byte 8 GPS DoP byte, in 0.1 values. 0.25.5 DoP
-- then a section to detect dark spots in the coverage map
byte 9, 10, 11 Prev Latit
byte 12, 13, 14 Prev Longi
byte 15, 16 Prev Altit
byte 17 Prev DoP
-- now our 'regular' values
byte 18 VCC byte, 50ths, 0 - 5.10 volt -- secret voltmeter
byte 19 CPUtemp byte, -100 - 155 deg C -- secret thermometer
byte 20 Vbat byte, 50ths, 0 - 5.10 volt -- hardwired Lora32u4
byte 21
0b0000 0000
-nnn nnnn Compass 0-120, My compass in 3 degree precision 0..360
Value=127: no compass value
1--- ---- MyBtn#1 bit, is my button pressed
byte 22 myID, dataset:
0b0000 0000
---- -nnn Dataset (not needed - to be re-used) Select Value 0-7 to tell which dataset
nnnn ---- MyTeamID Value 0-31 my team ID
byte 23,24 Temperature 2 bytes (was: counter, 2 bytes)
-- OPTIONAL radio values (leave 00 if not used)
byte 25 RemoteID ID of remote team (who shot me)
0b0000 0000
---- nnnn RadioSSN Received radio strength 1
nnnn ---- RemoteID Value 0-31, Remote team ID
byte 26, 27, 28 RemoteLat 3 bytes, -90 to +90 degrees scaled 0..16777215
byte 29, 30, 31 RemoteLon 3 bytes, -180..+180 degrees scaled 0..16777215
byte 32 R comp ++
0b0000 0000
-nnn nnnn RemoteComp 0-120, Remote Compass 3 degree precision 0..360
Value=127: no compass value
1--- ---- RemBtn#1 bit, is remote button pressed
byte 33 distance ++
0b0000 0000
-nnn nnnn distance 0-100, Distance in meters 0..100
101-120, 100+(x-100)*20 for 120..500
121-126, 500+(x-120)*100 for 600..1100
Value=127: no distance value
1--- ---- Am I Hit My hit status (I was hit?)
Game rule: add 2 degrees on each side of this 3 degree segment
A hit is when target is within this range and within 20 meters +/-3 meters
-- OPTIONAL set environmental sensors values ((leave 00 if not used)
byte 34, 35 Moisture 2 bytes, AD measurement directly from AD port
byte 36, 37 AirPress 2 bytes, AD measurement directly from AD port
byte 38, 39 CO2 2 bytes, AD measurement directly from AD port
byte 40, 41 PPM 2.5 2 bytes, AD measurement directly from AD port put_PM_into_sendbuffer
byte 42, 43 PPM 10 2 bytes, AD measurement directly from AD port
byte 44, 45 Audio 1 2 bytes
byte 46, 47 Audio 2 2 bytes
THIS BYTE STRING NEEDS A DECODER FUNCTION IN TTN:
/* *
function Decoder (bytes) {
var _lat = (bytes[0] << 16 | bytes[1] << 8 | bytes[2]) / 16777215.0 * 180.0 - 90;
var _lng = (bytes[3] << 16 | bytes[4] << 8 | bytes[5]) / 16777215.0 * 360.0 - 180;
var _alt = (bytes[6] << 8) + bytes[7];
var _hdop = bytes[8] / 10.0;
var _prev_lat = (bytes[9] << 16 | bytes[10] << 8 | bytes[11]) / 16777215.0 * 180.0 - 90;
var _prev_lng = (bytes[12] << 16 | bytes[13] << 8 | bytes[14]) / 16777215.0 * 360.0 - 180;
var _prev_alt = (bytes[15] << 8) + bytes[16];
var _prev_hdop = bytes[17] / 10.0;
var _VCC = bytes[18] / 50;
var _tempCPU = bytes[19] -100;
var _Vbat = bytes[20] / 50;
var _compass = (bytes[21] & 127) * 3;
var _myBtn = bytes[21] >> 7;
var _myID = bytes[22] >> 4;
var _dataSetType = bytes[22] & 15;
var _counter = bytes[23] << 8 | bytes[24];
var _inputHEX = bytes.map(function(b) { return ('0' + b.toString(16)).substr(-2);}).join(' ');
// if _dataSetType = 0001 my game data
var _remoteID = bytes[25] & 15;
var _remote_radioSSN = bytes[25] >> 4;
var _remote_lat = (bytes[26] << 16 | bytes[27] << 8 | bytes[28]) / 16777215.0 * 180.0 - 90;
var _remote_lng = (bytes[29] << 16 | bytes[30] << 8 | bytes[31]) / 16777215.0 * 360.0 - 180;
var _remote_compass = (bytes[32] & 127) * 3;
var _remote_Btn = bytes[32] >> 7;
var _remote_distance = bytes[33] & 127;
var _remote_DidHitMe = bytes[33] >> 7;
return {
arduino_VCC: _VCC,
arduino_Vbat: _Vbat,
arduino_tempCPU: _tempCPU,
compass: _compass,
myBtn: _myBtn,
myID: _myID,
dataSetType: _dataSetType,
gps_lat: _lat,
gps_lng: _lng,
gps_alt: _alt,
gps_hdop: _hdop,
gps_prev_lat: _prev_lat,
gps_prev_lng: _prev_lng,
gps_prev_alt: _prev_alt,
gps_prev_hdop: _prev_hdop,
counter: _counter,
payload: _inputHEX,
remoteID: _remoteID,
remote_radioSSN: _remote_radioSSN,
remote_lat: _remote_lat,
remote_lng: _remote_lng,
remote_compass: _remote_compass,
remote_Btn: _remote_Btn,
remote_distance: _remote_distance,
remote_DidHitMe: _remote_DidHitMe
};
}
*/
byte 0 My ID My ID and message type
0b0000 0000
---- nnnn MessType
---- 0001 msg#1 Yelling out loud that I have fired
---- 0010 msg#2 You have fired and here is my answer
nnnn ---- MyID
byte 1, 2, 3 MyLat
byte 4, 5, 6 MyLon
byte 7 MyComp ++
0b0000 0000
-nnn nnnn MyComp
1--- ---- MyBtn#1
byte 8 RemoteID Your ID, hey I am talkming to you
0b0000 0000
---- ---n WasIhit Hit indicator
nnnn ---- RemoteID Value 0-31, Remote team ID
byte 9 Validator Hash (binary add) on message, GPS date, salt..