Difference between revisions of "OpenPlotter"

From wiki.bastelbude.grade.de
Jump to: navigation, search
(aisdispatcher)
(autopilot)
 
(150 intermediate revisions by the same user not shown)
Line 3: Line 3:
 
== Aim ==
 
== Aim ==
 
* fit a cheap and open source [https://en.wikipedia.org/wiki/Electronic_Chart_Display_and_Information_System ECDIS] on board of a sailing vessel
 
* fit a cheap and open source [https://en.wikipedia.org/wiki/Electronic_Chart_Display_and_Information_System ECDIS] on board of a sailing vessel
* yacht has SeaTalkng network (/w Raymarine iTC-5 Converter)
+
=== analog ===
** VHV radio (Navman VHF 7100)
+
* rudder angle sensor (VDO 10-180 Ohm) '''not yet connected'''
** autopilot (Raymarine Evolution EV-200 Sail)
+
* fuel-level port (???) '''not yet connected'''
** sumlog (VDO)
+
* fuel-level starboard (???) '''not yet connected'''
** depth sounder (???)
+
* drinking water (WEMA ??? 600mm) '''not yet connected'''
 +
* see also:
 +
** https://blog.emilecantin.com/web/sysadmin/iot/javascript/sailing/2016/03/19/arduino-signalk-part-2.html
 +
** https://sailoog.gitbooks.io/openplotter-documentation/en/analog-ads1115.html
 +
** https://sailoog.gitbooks.io/openplotter-documentation/en/wiring-i2c-sensors.html
 +
 
 +
=== nmea0183 ===
 +
* VHV radio (Navman VHF 7100) RS-422, differential
 +
* gps (Garmin GPS 126) RS-232, single-ended
 +
* see also http://boatprojects.blogspot.de/2012/12/beginners-guide-to-nmea-2000-nmea-0183.html
 +
 
 +
=== SeaTalkng network ===
 +
* em-trak B100 ( http://www.allaboutais.com/index.php/en/products/products-on-the-market )
 +
** PGN 129025 Position
 +
** PGN 129026 COG and SOG
 +
** NOT 129029 GNSS Position Data
 +
* autopilot control unit (Raymarine ACU-200)
 +
* autopilot sensor (Raymarine EV1)
 +
** PGN 127245 Rudder
 +
** PGN 127250 Vessel Heading
 +
** PGN 127251 Rate of Turn
 +
** PGN 127357 Attitude
 +
* autopilot instrument (Raymarine p70s)
 +
** PGN 127245 Rudder
 +
** PGN 127258 Magnetic Variation
 +
* battery monitor (Victron BMV-702, 'VE.Direct to NMEA2000 interface')
 +
* battery inverter/charger (Victron MultiPlus, 'VE.Bus to NMEA2000 interface')
 +
* Raymarine iTC-5 converter
 +
** sumlog (VDO, Model?)
 +
** depth sounder (Airmar, Model?)
 +
** optional: Raymarine M81105 rudder angle sensor
 +
*** Red to Green: 5K Ohms (+/- 10%) steady
 +
*** Red to Blue: Variable no less than 1.5K no more than 3.5K as the wheel is spun hardover to hardover
 +
*** Blue to Green: Variable no less than 1.5K no more than 3.5K as the wheel is spun hardover to hardover
 +
*** A 5K pot, probably wire wound, not particularly good precision ($10) packaged in a plastic moulding ($200), but typically very reliable
 +
*** http://raymarine.ning.com/forum/topics/rudder-angle-indicator
 +
* Raymarine SeaTalk-SeaTalkng converter
 +
** instrument (ST70)
 +
** autopilot remote Raymarine A18106
 
** wind & close hauled/VMG instrument (Raymarine Wind ST50 Plus)
 
** wind & close hauled/VMG instrument (Raymarine Wind ST50 Plus)
** gps (Garmin GPS 126)
 
** AIS Class-B transceiver ( http://www.allaboutais.com/index.php/en/products/products-on-the-market )
 
** battery monitor (Victron BMV-700)
 
  
 
== Parts (boat specific) ==
 
== Parts (boat specific) ==
Line 270: Line 305:
 
** Raspberry Pi 3 Model B+
 
** Raspberry Pi 3 Model B+
 
** PiCAN 2 incl. SMPS
 
** PiCAN 2 incl. SMPS
* eth0 IP set to static (here 192.168.1.111)
+
* eth0 IP set to static (here 192.168.3.111)
  
 
== setup Raspbian Stretch Lite ==
 
== setup Raspbian Stretch Lite ==
Line 287: Line 322:
 
sudo apt-get install mc
 
sudo apt-get install mc
 
</pre>
 
</pre>
* enable root login over SSH  
+
* enable root login over SSH
 
** add to '''/etc/ssh/sshd_config''' <pre>PermitRootLogin yes</pre>
 
** add to '''/etc/ssh/sshd_config''' <pre>PermitRootLogin yes</pre>
 
** restart service <pre>sudo /etc/init.d/ssh restart</pre>
 
** restart service <pre>sudo /etc/init.d/ssh restart</pre>
** set root password <pre>sudo passwd root</pre>
+
** set root password (A****M**) <pre>sudo passwd root</pre>
 
* set up static IP at '''/etc/dhcpcd.conf'''
 
* set up static IP at '''/etc/dhcpcd.conf'''
 
<pre>
 
<pre>
Line 421: Line 456:
 
     }
 
     }
 
</pre>
 
</pre>
 +
 +
=== connect to signalk ===
 +
* json: http://192.168.2.1:3000/signalk/v1/api/vessels/self/
 +
* web-ui: http://192.168.2.1:3000/@signalk/server-admin-ui/#/dashboard
 +
** admin: A****M**
 +
* tcp nmea0183: 192.168.2.1:10110
 +
* tcp ais: 192.168.2.1:183
  
 
=== signalk sandbox ===
 
=== signalk sandbox ===
Line 476: Line 518:
 
== samba ==
 
== samba ==
  
== wifi client and access-point ==
+
== wifi AP (bridge) ==
 +
* see https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md
 +
* works only on eth0 > wifi
 +
* does not work on wlan0 > wlan1
 +
 
 +
== wifi client and access-point==
 +
* wlan0 build-in wifi adapter (as access point)
 +
** b8:27:eb:3c:8c:ef
 +
** 192.168.2.1/24 (static)
 +
** metric 300
 +
** see <b>etc/dhcpd.conf</b>
 +
* wlan1 usb wifi adapter (as client)
 +
** 00:0f:c9:0a:df:87
 +
** 192.168.43.x (dhcp)
 +
** metric 100
 +
** see <b>etc/dhcpd.conf</b> and <b>etc/wpa_supplicant/wpa_supplicant.conf</b>
 +
** DNS problems? see <b>etc/resolv.conf.head</b>
 +
* eth0 (wired to router)
 +
** b8:27:eb:69:d9:ba
 +
** 192.168.1.111/24 (static)
 +
** metric 500
 +
** see <b>etc/dhcpd.conf</b>
 +
* setup:
 +
** https://www.raspberrypi.org/forums/viewtopic.php?t=215581
 +
** https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md
 +
** enable hostapd
 +
*** see <b>/etc/hostapd/hostapd.conf</b> (LIVPI:66666666)
 +
systemctl is-enabled hostapd
 +
systemctl unmask hostapd
 +
systemctl enable hostapd
 +
 
 +
== wifi client and access-point (experimental)==
 
* see also
 
* see also
 
** https://github.com/Mateus-Romera/rpi3-wifi-station-ap-stretch
 
** https://github.com/Mateus-Romera/rpi3-wifi-station-ap-stretch
 +
** https://pifi.imti.co/#getting-started
 
** https://github.com/peebles/rpi3-wifi-station-ap
 
** https://github.com/peebles/rpi3-wifi-station-ap
 
** https://albeec13.github.io/2017/09/26/raspberry-pi-zero-w-simultaneous-ap-and-managed-mode-wifi/
 
** https://albeec13.github.io/2017/09/26/raspberry-pi-zero-w-simultaneous-ap-and-managed-mode-wifi/
 
* issues
 
* issues
 
** https://www.raspberrypi.org/forums/viewtopic.php?t=188891#p1189305
 
** https://www.raspberrypi.org/forums/viewtopic.php?t=188891#p1189305
 +
 +
== tile server /w cache+proxy ==
 +
* https://github.com/yetzt/tilethief
 +
** https://github.com/expressjs/express (web framework)
 +
** https://github.com/yetzt/node-lru-files (file cache)
 +
* https://github.com/yetzt/tileblaster
 +
** https://en.wikipedia.org/wiki/Nginx (reverse proxy)
 +
 +
=== draft ===
 +
* at home:
 +
** fetch an overview tile set of intended sailing area zoomlevels ~1-14 (/w mobac, preconfigured downloads, etc.) and preload cache
 +
* on board while connected to internet:
 +
** grab detailed tiles zoom 15-18 of intended approaches/anchorages via web app through proxy and cache
 +
* under way /wo internet connection:
 +
** sail using cached tiles
 +
* aim:
 +
** keep stress on tile servers low (do NOT download all possible tiles of zoom levels 15-18 at home)
 +
* drawback:
 +
** a 'raw' tile store /w deep /{z}/{x}/{y} directory structure might cause trouble on (sd-card driven) rasPIs ...
 +
 +
=== tiletief ===
 +
==== global install tilethief (as pi)====
 +
* <code>$ sudo npm install -g tilethief</code>
 +
* <code>cd /usr/lib/node_modules/tilethief</code>
 +
* edit tilethief.js
 +
** change line 302 and 319 <code>mime.getType</code> (instead of <code>mime.lookup</code>)
 +
** you might want to add some helper output:
 +
*** ln 300 <code>if (commander.verbose) logger.info("serving %s from cache", _tile_file);</code>
 +
*** ln 306 <code>if (commander.verbose) logger.info("attempting to fetch %s", _tile_url);</code>
 +
*** ln 312 <code>if (commander.verbose) logger.info("fetched %s", _tile_url);</code>
 +
* <code>mkdir data</code> and <code>chmod 777 data</code>
 +
* edit config.js
 +
<pre>
 +
module.exports = {
 +
 +
/* express settings */
 +
"app": {
 +
"workers": 2, // number of worker processes
 +
"proxied": true, // trust x-forwarded-for header
 +
"env": "production",
 +
"socket": false, // socket overrides hostname and port
 +
 +
"port": 46000
 +
},
 +
 +
/* lru tile cache */
 +
"cache": {
 +
"dir": "/home/pi/.tilethief/tiles",
 +
"files": 200000,
 +
"size": "2 GB",
 +
"age": "52 Weeks",
 +
"check": "1 Hour"
 +
},
 +
 +
/* send heartbeats with nsa */
 +
// "heartbeat": "udp4://127.0.0.1:65432",
 +
 +
/* load backends from url */
 +
"backend-url": false, // point this to a json with the contents of config.backends
 +
 +
/* the tile backends */
 +
"backends": {
 +
"osm": {
 +
"url": "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
 +
"filetypes": ["png"],
 +
"sub": ["a","b"],
 +
"zoom": [0,17],
 +
"boundaries": [-180, -90, 180, 90] // west, south, east, north
 +
},
 +
"openSeaMap": {
 +
"url": "http://t1.openseamap.org/seamark/{z}/{x}/{y}.png",
 +
"filetypes": ["png"],
 +
"sub": ["a","b"],
 +
"zoom": [0,17],
 +
"boundaries": [-180, -90, 180, 90] // west, south, east, north
 +
}
 +
},
 +
 +
/* max number of concurrent connections to backend servers */
 +
"connections": 23,
 +
 +
/* the default tile */
 +
"default-image": "assets/default-tile.png",
 +
 +
/* allowed extensions */
 +
"allowed-extensions": ["png","jpg"],
 +
 +
/* redirect users to this url when they try to access the index page */
 +
"redirect-url": false
 +
 +
};
 +
</pre>
 +
* run <code>tilethief -v</code> or <code>DEBUG=tilethief node /usr/lib/node_modules/tilethief/tilethief.js</code>
 +
* point your web browser to
 +
** <code>192.168.2.1:46000/osm/1/1/1.png</code>
 +
** <code>192.168.2.1:46000/openSeaMap/14/8448/5366.png</code>
 +
* systemd Service Unit
 +
* <b>/etc/systemd/system/tilethief.service</b>
 +
<pre>
 +
[Service]
 +
ExecStart=/usr/lib/node_modules/tilethief/tilethief.js
 +
Restart=always
 +
StandardOutput=syslog
 +
StandardError=syslog
 +
WorkingDirectory=/home/pi/.tilethief
 +
User=pi
 +
Environment=EXTERNALPORT=4600
 +
[Install]
 +
WantedBy=multi-user.target
 +
</pre>
 +
* <code>sudo systemctl enable tilethief.service</code>
 +
* <code>sudo systemctl start tilethief.service</code>
 +
* conclusion:
 +
** fetching tiles online is rather slow
 +
** serving tiles from disk is fast
 +
 +
==== nginx + tilethief ====
 +
tilethiev does not serve tiles from cache while offline. ngix speeds up serving and works well offline.
 +
* <code>sudo apt install nginx</code>
 +
* <code>cd /etc/nginx/sites-available</code>
 +
* add to <code>default</code>
 +
<pre>
 +
server {
 +
listen 47000;
 +
server_name tileblaster;
 +
 +
#gzip off;
 +
#gzip_static on;
 +
#gunzip on;
 +
 +
location / {
 +
root /home/pi/.tilethief/tiles;
 +
log_not_found off;
 +
expires 30d;
 +
add_header Pragma public;
 +
add_header Cache-Control "public";
 +
add_header X-Static super;
 +
try_files $uri $uri/ @tilethief;
 +
}
 +
 +
location @tilethief {
 +
proxy_pass http://127.0.0.1:46000;
 +
proxy_set_header Host $host;
 +
proxy_set_header X-Real-IP $remote_addr;
 +
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 +
expires 30d;
 +
etag on;
 +
add_header X-Static miss;
 +
}
 +
}
 +
</pre>
 +
* <code>sudo /etc/init.d/nginx restart</code>
 +
 +
=== alternative: global install tileblaster (experimental)===
 +
 +
==== nginx + tileblaster (experimental) ====
 +
* <code>sudo apt install nginx</code>
 +
* <code>cd /etc/nginx/sites-available</code>
 +
* add to <code>default</code>
 
<pre>
 
<pre>
 +
upstream tileblaster {
 +
server unix:/tmp/tileblaster.sock;
 +
}
 +
 +
server {
 +
listen 47000;
 +
server_name tileblaster;
 +
 +
gzip off;
 +
gzip_static on;
 +
gunzip on;
 +
 +
location / {
 +
root /tmp/tileblaster;
 +
if (!-f $request_filename.gz) {
 +
proxy_pass http://tileblaster;
 +
}
 +
}
 +
}
 
</pre>
 
</pre>
 +
* <code>sudo /etc/init.d/nginx restart</code>
 +
 +
==== tileblaster ====
 +
* <code>sudo npm i tileblaster -g --no-optional</code>
 +
* <code>cd /usr/lib/node_modules/tileblaster</code>
 +
* edit <code>config.js</code>
 +
<pre>
 +
module.exports = {
 +
 +
// path to socket file
 +
"socket": "/tmp/tileblaster.sock",
 +
 +
// path to tile directory
 +
"tiles": "/tmp/tileblaster",
 +
 +
// nsa heartbeat server, if so desired
 +
// "heartbeat": "udp4://nsa.example.com:30826",
 +
 +
// clean up every so often m=minute h=hour d=day w=week
 +
"cleanup": "15m",
 +
 +
// maps
 +
"maps": {
 +
 +
// map id, accessible via //server/mapid/z/x/y.ext
 +
"osm": {
 +
 +
// backend url:
 +
// * {s} subdomains specified in sub
 +
// * {z}, {x}, {y} tile coordinates
 +
// * {e} extension
 +
// * {r} resolution marker
 +
// "url": "https://{s}.tiles.example.com/tiles/{z}/{x}/{y}{r}.{e}",
 +
"url": "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.{e}",
 +
 +
// possible extensions
 +
// "ext": ["mvt","json","topojson","png","jpg"],
 +
"ext": ["png"],
 +
 +
// valid zoom levels
 +
"zoom": [0,16],
 +
 +
// valid subdomains
 +
"sub": ["a","b"],
 +
 +
// bounding box, west, south, east, north
 +
"bbox": [-180,-90,180,90],
 +
 +
// valid mimetypes from backend server
 +
"mime": ["application/vnd.mapbox-vector-tile","application/x-protobuf","application/json","image/png"],
 +
 +
// valid resolution markers
 +
"res": ["@2x","@4x"],
 +
 +
// optimize tiles
 +
// * .png with `optipng`
 +
// * .jpg with `mozjpeg`
 +
// "optimize": true,
 +
"optimize": false,
 +
 +
// minimum time tiles are kept
 +
"expires": "52w",
 +
 +
},
 +
 +
// more backends here
 +
 +
},
 +
 +
};
 +
 +
</pre>
 +
* run <code>DEBUG=tileblaster node /usr/lib/node_modules/tileblaster/bin/tileblaster.js</code> or <code>/usr/lib/node_modules/tileblaster/bin/tileblaster.js</code>
 +
* point your webbrowser to <code>192.168.2.1:47000/osm/13/4215/2689.png</code>
 +
* conclusion:
 +
** fetching tiles online is fast
 +
** serving tiles from disk is fast
 +
** <strike>tileblaster hangs after short time</strike>
 +
** tileblaster compresses tiles (thus need to compress mobac tile, too)
 +
 +
=== alternative: nginx stand alone ===
 +
* https://coderwall.com/p/--wgba/nginx-reverse-proxy-cache-for-openstreetmap
 +
* filenames are not preserved (nginx uses own directory/file-structure)
 +
 +
=== preload cache /w mobac tilestore ===
 +
* https://sourceforge.net/projects/mobac/
 +
* https://sourceforge.net/projects/mobac/files/Misc/TileStore%20Utility/
 +
* example: <code>java -jar ts-util.jar extract "C:\mobac\tilestore\db-vaarkaart" "C:\mobac\tilestore\vaarkaart"</code>
 +
 +
=== setup signalk's charts plugin ===
 +
* https://github.com/SignalK/charts-plugin
 +
* add online charts provider
 +
** eg. http://192.168.2.1:46000/openSeaMap/{z}/{x}/{y}.png
 +
** flipped y: http://192.168.2.1:46000/eniro/{z}/{x}/{-y}.png
 +
=== toDo: make cache/proxy a signalK plugin ===
 +
* aim:
 +
** install via appstore
 +
** activate via web-ui
 +
** configure via web-ui
 +
** use signalK's logging facility
 +
* https://github.com/SignalK/signalk-server-node/blob/master/SERVERPLUGINS.md
 +
* start by copying another example that provides an http ui, like charts plugin
 +
** https://github.com/SignalK/charts-plugin/blob/master/src/plugin.js#L12-L150
 +
* ...
 +
<pre>
 +
</pre>
 +
 +
= autologin to public hotspot =
 +
* https://unix.stackexchange.com/questions/118289/how-do-i-authenticate-to-a-wireless-providers-open-network-without-using-a-br
 +
 +
= 3G router =
 +
* 192.168.3.1
 +
* admin:; A****M**
 +
* 3GUSB AldiTalk
 +
** User Name: eplus
 +
** Password: Internet
 +
** Dial Number: *99#
 +
** Authentication Protocol : CHAP only
 +
** APN: internet.eplus.de
 +
** Reconnect Mode: manual
 +
** MTU: 1492
 +
 +
= apps =
 +
== data sources ==
 +
* http://wiki.opennauticalchart.org/index.php?title=Category:Data_Sources
 +
== applications ==
 +
* http://wiki.opennauticalchart.org/index.php?title=Category:Applications
 +
 +
= devices =
 +
== wind ==
 +
* https://electronics.stackexchange.com/questions/123114/how-to-sense-wind-direction-low-cost-low-power
 +
* https://homofaciens.de/technics-base-circuits-encoder-disc_ge.htm
 +
* https://www.thingiverse.com/thing:1712264
 +
 +
=== mechanical ===
 +
* https://www.segeln-forum.de/board1-rund-ums-segeln/board35-bootstechnik-und-elektronik/67401-windsensor-diy 0.3-6deg
 +
* http://www.peetbros.com/shop/item.aspx?itemid=137 1.4deg
 +
** https://www.wimo.com/wetterstation-peet-bros_d.html#zubehoer  EUR 115,-
 +
** https://mechinations.net/2014/12/27/building-a-nmea-0183-wind-instrument/
 +
* Ventus W132 360/16=22.5deg EUR 25,-
 +
** https://www.stall.biz/project/weatherman-die-perfekte-wetterstation-fuer-die-hausautomation/comment-page-3
 +
** http://www.wetterstationen.info/forum/bastlerforum/wie-funktioniert-der-windrichtungsgeber-im-w132-von-ventus/?PHPSESSID=f498cd44557b15e347fbe109253598b8
 +
 +
=== ultrasonic ===
 +
* http://www.dl1glh.de/ultrasonic-anemometer.html
 +
* https://soldernerd.com/category/arduino-ultrasonic-anemometer/
 +
* https://hackaday.com/2013/08/21/ultrasonic-anemometer-for-an-absurdly-accurate-weather-station/
 +
* https://www.netatmo.com/de-DE/product/weather/weatherstation/accessories#windgauge 5deg EUR 100,-
 +
** https://github.com/kissandr/netatmo_wind
 +
* https://calypsoinstruments.com/shop EUR 500,-
 +
** https://github.com/decipherindustries/signalk-calypso-ultrasonic
 +
 +
== gyro + accelerometer + compass ==
 +
* https://sailoog.gitbooks.io/openplotter-documentation/en/imu-sensor.html
 +
** https://github.com/RPi-Distro/RTIMULib
 +
* https://github.com/SignalK/signalk-imu
 +
* http://navspark.mybigcommerce.com/ns-hp-gl-gps-glonass-rtk-receiver/
 +
== autopilot ==
 +
see [[PyPilot]]
 +
 +
== shutdown button ==
 +
* https://alexbloggt.com/raspberry-pi-ausschalter/
  
 
[[category:Projekte]]
 
[[category:Projekte]]

Latest revision as of 10:42, 25 February 2020

general

Aim

  • fit a cheap and open source ECDIS on board of a sailing vessel

analog

nmea0183

SeaTalkng network

  • em-trak B100 ( http://www.allaboutais.com/index.php/en/products/products-on-the-market )
    • PGN 129025 Position
    • PGN 129026 COG and SOG
    • NOT 129029 GNSS Position Data
  • autopilot control unit (Raymarine ACU-200)
  • autopilot sensor (Raymarine EV1)
    • PGN 127245 Rudder
    • PGN 127250 Vessel Heading
    • PGN 127251 Rate of Turn
    • PGN 127357 Attitude
  • autopilot instrument (Raymarine p70s)
    • PGN 127245 Rudder
    • PGN 127258 Magnetic Variation
  • battery monitor (Victron BMV-702, 'VE.Direct to NMEA2000 interface')
  • battery inverter/charger (Victron MultiPlus, 'VE.Bus to NMEA2000 interface')
  • Raymarine iTC-5 converter
    • sumlog (VDO, Model?)
    • depth sounder (Airmar, Model?)
    • optional: Raymarine M81105 rudder angle sensor
      • Red to Green: 5K Ohms (+/- 10%) steady
      • Red to Blue: Variable no less than 1.5K no more than 3.5K as the wheel is spun hardover to hardover
      • Blue to Green: Variable no less than 1.5K no more than 3.5K as the wheel is spun hardover to hardover
      • A 5K pot, probably wire wound, not particularly good precision ($10) packaged in a plastic moulding ($200), but typically very reliable
      • http://raymarine.ning.com/forum/topics/rudder-angle-indicator
  • Raymarine SeaTalk-SeaTalkng converter
    • instrument (ST70)
    • autopilot remote Raymarine A18106
    • wind & close hauled/VMG instrument (Raymarine Wind ST50 Plus)

Parts (boat specific)

  • Seatalkng extensions:
    • Spur-Kabel mit 1 offenen Ende 3m Art.-Nr: A06044 EUR 40,-
    • 5-Wege-Verbinder Art.-Nr: A06064 EUR 35,- (alternativ T-Stück Art.-Nr.: A06028 EUR 25,-)
    • Backbone-Kabel 0,40m - A06033 EUR 30,-

Mini-PC

  • Raspberry Pi 3 Model B EUR 33,50 or Raspberry Pi 3 Model B+ EUR 35,-
  • 16GB MicroSD Card EUR 10,-
  • PiCAN 2 EUR 45,- or PiCAN 2 incl. SMPS EUR 52,-

openPlotter

  • hardware
    • Raspberry Pi 3 Model B
    • PiCAN 2
  • eth0 IP set to static (192.168.1.112)

Setup Pi:

  • see also
  • connect to openplotter-UI (eg. VNC)
    • update openCPN
    • upgrade Raspbian
    • upgrade to openPlotter 0.17.1
    • Preferences > Raspberry Configuration > Interfaces > SSH:enable (Remote-access via WinSCP and Putty defaults pi:raspberry)
  • (sudo apt-get install tightvncserver (make RDP working))
  • sudo apt-get install can-utils
  • sudo apt-get install mc
  • update node
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt install nodejs
  • update signalk to latest
    • kill running signalk-server process
cd /home/pi/.config
rm -rf signalk-server-node_tmp
git clone https://github.com/SignalK/signalk-server-node.git signalk-server-node_tmp
cd signalk-server-node_tmp
npm install && npm run prepublishOnly
npm install mdns
cd /home/pi/.config
rm -rf signalk-server-node
mv signalk-server-node_tmp signalk-server-node
  • restart signalk @ openplotter-UI

Setup Android:

  • RDC from playStore (working)
  • aRDP free from playStore (suits my needs best)

Setup piCAN2:

  • (in case you want to play with virtual-can-interfaces) add to /etc/modules
vcan
  • add to /boot/config.txt
dtparam=spi=on
dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25
dtoverlay=spi-bcm2835-overlay
source /etc/network/interfaces.d/*
  • add to /etc/network/interfaces/interfaces.d/can0
#physical can interfaces
allow-hotplug can0
iface can0 can static
bitrate 250000
down /sbin/ip link set $IFACE down
up /sbin/ifconfig $IFACE txqueuelen 10000
  • (in case you want to play with virtual-can-interfaces) add to /etc/network/interfaces/interfaces.d/vcan0
#virtual can interfaces
auto vcan0
iface vcan0 inet manual
pre-up /sbin/ip link add dev $IFACE type vcan
up /sbin/ifconfig $IFACE up
  • restart interfaces
service networking restart
  • check interfaces (can0 and vcan0)
ifconfig
  • install canboat
mkdir ~/canboat
cd ~/canboat
sudo apt-get install xsltproc
git clone git://github.com/canboat/canboat
cd canboat
sudo make
sudo make install
  • working admin-ui generated canboat sample
    {
      "id": "canboat",
      "pipeElements": [
        {
          "type": "providers/simple",
          "options": {
            "logging": false,
            "type": "NMEA2000",
            "subOptions": {
              "type": "canbus",
              "interface": "vcan0"
            }
          }
        }
      ],
      "enabled": false
    }
  • not working admin-ui generated canboatjs sample
    {
      "id": "canboatjs",
      "pipeElements": [
        {
          "type": "providers/simple",
          "options": {
            "logging": false,
            "type": "NMEA2000",
            "subOptions": {
              "type": "canbus-canboatjs",
              "interface": "vcan0"
            }
          }
        }
      ],
      "enabled": true
    }
  • working canboatjs sample
    {                                                                           
      "id": "canbus-canboatjs",                                          
      "enabled": true,                                                          
      "pipeElements": [                                                         
        {                                                                       
          "type": "providers/canbus",                                           
          "options": {
            "canDevice": "vcan0"
          }                                                                     
        },                                                                      
        {                                                                       
          "type": "providers/canboatjs"                                         
        },                                                                      
        {                                                                       
          "type": "providers/n2k-signalk"                                       
        }                                                                       
      ]                                                                         
    }


  • old working canboat sample
{
  "id": "n2k-vcan0",
  "pipeElements": [
    {
      "type": "providers/execute",
      "options": {
        "command": "candump vcan0 | candump2analyzer "
      }
    },
    {
      "type": "providers/liner",
      "options": {
        "rawlogging": true,
        "logdir": "logs",
        "discriminator": "2"
      }
    },
    {
      "type": "providers/n2kAnalyzer"
    },
    {
      "type": "providers/n2k-signalk"
    }
  ]
}

configure kplex and signalk

  • 'Signal K Server Plugin Configuration' > activate 'Convert Signal K to NMEA0183'
    • select sentences you are interested in
  • NMEA0183 (this is kplex) > Advanced >
    • add input channel tcp:localhost:10110
    • remove filter at opencpn out channel
[tcp]
name=signalk_in
direction=in
address=localhost
port=10110

[tcp]
name=opencpn
direction=out
mode=server
port=10109

experimental

    {"pipeElements": [
      {"type": "providers/execute", "options": {"command": "candump can0 | candump2analyzer | analyzer -json -si -nv"}},
      {"type": "providers/liner"},
      {"type": "providers/from_json"},
      {"type": "signalk-socketcan-device", "options": {"n2kAddress": 110, "canDevice": "can0"}},
      {"type": "providers/n2k-signalk"}
      ],"id": "n2k-can0"
    }

blackBox

  • hardware
    • Raspberry Pi 3 Model B+
    • PiCAN 2 incl. SMPS
  • eth0 IP set to static (here 192.168.3.111)

setup Raspbian Stretch Lite

  • download Raspbian Stretch Lite and copy image to SD-card (Etcher or win32diskimager)
  • log in (hdmi) as pi:raspberry (us-keboard-layout!)
  • start sudo raspi-config
    • enable ssh
    • resize SD-card
    • set wifi locale
    • ...
    • reboot
  • connect via ssh or scp
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install mc
  • enable root login over SSH
    • add to /etc/ssh/sshd_config
      PermitRootLogin yes
    • restart service
      sudo /etc/init.d/ssh restart
    • set root password (A****M**)
      sudo passwd root
  • set up static IP at /etc/dhcpcd.conf
interface eth0
static ip_address=192.168.1.111/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

setup piCAN2 (as root)

  • install can-utils
apt-get update
apt-get install can-utils
  • add to /boot/config.txt
dtparam=spi=on
dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25
dtoverlay=spi-bcm2835-overlay
  • add to /etc/modules
vcan
  • add to /etc/network/interfaces
source /etc/network/interfaces.d/*
  • add to /etc/network/interfaces/interfaces.d/can0
#physical can interfaces
allow-hotplug can0
iface can0 can static
bitrate 250000
down /sbin/ip link set $IFACE down
up /sbin/ifconfig $IFACE txqueuelen 10000
  • add to /etc/network/interfaces/interfaces.d/vcan0
#virtual can interfaces
auto vcan0
iface vcan0 inet manual
pre-up /sbin/ip link add dev $IFACE type vcan
up /sbin/ifconfig $IFACE up
  • install canboat
apt-get install xsltproc
apt-get install git
mkdir ~/canboat
cd ~/canboat
git clone git://github.com/canboat/canboat
cd canboat
make
make install

install signalK (as root)

apt-get update
apt-get install -y curl git build-essential dialog
curl -sL https://deb.nodesource.com/setup_8.x | bash -
apt-get install nodejs
apt-get install libnss-mdns avahi-utils libavahi-compat-libdnssd-dev
npm install -g --unsafe-perm signalk-server

setup signalK (as pi)

sudo signalk-server-setup
reboot
  • in your browser, start signalk-web-interface (eg. http://192.168.1.111:3000)
  • add admin-user via admin-ui and log-in (here admin:A****M**)
  • add canboat Data-Provider via Admin-UI (stored in home/pi/.signalk/settings.json )
    {
      "id": "canboat",
      "pipeElements": [
        {
          "type": "providers/simple",
          "options": {
            "logging": false,
            "type": "NMEA2000",
            "subOptions": {
              "type": "canbus",
              "interface": "vcan0"
            }
          }
        }
      ],
      "enabled": true
    }
  • alternative add canboatjs Data-Provider via Admin-UI (stored in home/pi/.signalk/settings.json )
    {
      "id": "canboatjs",
      "pipeElements": [
        {
          "type": "providers/simple",
          "options": {
            "logging": false,
            "type": "NMEA2000",
            "subOptions": {
              "type": "canbus-canboatjs",
              "interface": "vcan0"
            }
          }
        }
      ],
      "enabled": true
    }

connect to signalk

signalk sandbox

signalk-server --sample-nmea0183-data

sudo systemctl stop signalk.service
sudo systemctl stop signalk.socket

sudo systemctl start signalk.service
sudo systemctl start signalk.socket

sudo systemctl disable signalk.service
sudo systemctl disable signalk.socket

sudo systemctl status signalk*

export DEBUG=signalk-server:udp-provider
export DEBUG=signalk-parser-nmea0183
./signalk-server

aisdispatcher

    {
      "id": "AIS-udp",
      "pipeElements": [
        {
          "type": "providers/simple",
          "options": {
            "logging": false,
            "type": "NMEA0183",
            "subOptions": {
              "type": "udp",
              "port": "77777"
            }
          }
        }
      ],
      "enabled": true
    }

raymarine autopilot

samba

wifi AP (bridge)

wifi client and access-point

systemctl is-enabled hostapd
systemctl unmask hostapd
systemctl enable hostapd

wifi client and access-point (experimental)

tile server /w cache+proxy

draft

  • at home:
    • fetch an overview tile set of intended sailing area zoomlevels ~1-14 (/w mobac, preconfigured downloads, etc.) and preload cache
  • on board while connected to internet:
    • grab detailed tiles zoom 15-18 of intended approaches/anchorages via web app through proxy and cache
  • under way /wo internet connection:
    • sail using cached tiles
  • aim:
    • keep stress on tile servers low (do NOT download all possible tiles of zoom levels 15-18 at home)
  • drawback:
    • a 'raw' tile store /w deep /{z}/{x}/{y} directory structure might cause trouble on (sd-card driven) rasPIs ...

tiletief

global install tilethief (as pi)

  • $ sudo npm install -g tilethief
  • cd /usr/lib/node_modules/tilethief
  • edit tilethief.js
    • change line 302 and 319 mime.getType (instead of mime.lookup)
    • you might want to add some helper output:
      • ln 300 if (commander.verbose) logger.info("serving %s from cache", _tile_file);
      • ln 306 if (commander.verbose) logger.info("attempting to fetch %s", _tile_url);
      • ln 312 if (commander.verbose) logger.info("fetched %s", _tile_url);
  • mkdir data and chmod 777 data
  • edit config.js
module.exports = {

	/* express settings */
	"app": {
		"workers": 2,			// number of worker processes
		"proxied": true,		// trust x-forwarded-for header
		"env": "production",
		"socket": false,		// socket overrides hostname and port

		"port": 46000
	},

	/* lru tile cache */
	"cache": {
		"dir": "/home/pi/.tilethief/tiles",
		"files": 200000,
		"size": "2 GB",
		"age": "52 Weeks",
		"check": "1 Hour"
	},
	
	/* send heartbeats with nsa */
	// "heartbeat": "udp4://127.0.0.1:65432",

	/* load backends from url */
	"backend-url": false, // point this to a json with the contents of config.backends

	/* the tile backends */
	"backends": {
		"osm": {
			"url": "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
			"filetypes": ["png"],
			"sub": ["a","b"],
			"zoom": [0,17],
			"boundaries": [-180, -90, 180, 90] // west, south, east, north
		},
		"openSeaMap": {
			"url": "http://t1.openseamap.org/seamark/{z}/{x}/{y}.png",
			"filetypes": ["png"],
			"sub": ["a","b"],
			"zoom": [0,17],
			"boundaries": [-180, -90, 180, 90] // west, south, east, north
		}
	},
	
	/* max number of concurrent connections to backend servers */
	"connections": 23,
	
	/* the default tile */
	"default-image": "assets/default-tile.png",
	
	/* allowed extensions */
	"allowed-extensions": ["png","jpg"],
	
	/* redirect users to this url when they try to access the index page */
	"redirect-url": false
	
};
  • run tilethief -v or DEBUG=tilethief node /usr/lib/node_modules/tilethief/tilethief.js
  • point your web browser to
    • 192.168.2.1:46000/osm/1/1/1.png
    • 192.168.2.1:46000/openSeaMap/14/8448/5366.png
  • systemd Service Unit
  • /etc/systemd/system/tilethief.service
[Service]
ExecStart=/usr/lib/node_modules/tilethief/tilethief.js
Restart=always
StandardOutput=syslog
StandardError=syslog
WorkingDirectory=/home/pi/.tilethief
User=pi
Environment=EXTERNALPORT=4600
[Install]
WantedBy=multi-user.target
  • sudo systemctl enable tilethief.service
  • sudo systemctl start tilethief.service
  • conclusion:
    • fetching tiles online is rather slow
    • serving tiles from disk is fast

nginx + tilethief

tilethiev does not serve tiles from cache while offline. ngix speeds up serving and works well offline.

  • sudo apt install nginx
  • cd /etc/nginx/sites-available
  • add to default
server {
	listen 47000;
	server_name tileblaster;

	#gzip off;
	#gzip_static on;
	#gunzip on;

	location / {
		root /home/pi/.tilethief/tiles;
		log_not_found off;
		expires 30d;
		add_header Pragma public;
		add_header Cache-Control "public";
		add_header X-Static super;
		try_files $uri $uri/ @tilethief;
		}

	location @tilethief {
		proxy_pass http://127.0.0.1:46000;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		expires 30d;
		etag on;
		add_header X-Static miss;
	}
}
  • sudo /etc/init.d/nginx restart

alternative: global install tileblaster (experimental)

nginx + tileblaster (experimental)

  • sudo apt install nginx
  • cd /etc/nginx/sites-available
  • add to default
upstream tileblaster {
	server unix:/tmp/tileblaster.sock;
}

server {
	listen 47000;
	server_name tileblaster;

	gzip off;
	gzip_static on;
	gunzip on;

	location / {
		root /tmp/tileblaster;
		if (!-f $request_filename.gz) {
			proxy_pass http://tileblaster;
		}
	}
}
  • sudo /etc/init.d/nginx restart

tileblaster

  • sudo npm i tileblaster -g --no-optional
  • cd /usr/lib/node_modules/tileblaster
  • edit config.js
module.exports = {

	// path to socket file
	"socket": "/tmp/tileblaster.sock",

	// path to tile directory
	"tiles": "/tmp/tileblaster",

	// nsa heartbeat server, if so desired
	// "heartbeat": "udp4://nsa.example.com:30826",

	// clean up every so often m=minute h=hour d=day w=week
	"cleanup": "15m",

	// maps
	"maps": {
		
		// map id, accessible via //server/mapid/z/x/y.ext
		"osm": {
		
			// backend url: 
			// * {s} subdomains specified in sub
			// * {z}, {x}, {y} tile coordinates
			// * {e} extension
			// * {r} resolution marker
			// "url": "https://{s}.tiles.example.com/tiles/{z}/{x}/{y}{r}.{e}",
			"url": "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.{e}",

			// possible extensions
			// "ext": ["mvt","json","topojson","png","jpg"],
			"ext": ["png"],

			// valid zoom levels
			"zoom": [0,16],

			// valid subdomains
			"sub": ["a","b"],

			// bounding box, west, south, east, north
			"bbox": [-180,-90,180,90],

			// valid mimetypes from backend server
			"mime": ["application/vnd.mapbox-vector-tile","application/x-protobuf","application/json","image/png"],

			// valid resolution markers
			"res": ["@2x","@4x"],
			
			// optimize tiles
			// * .png with `optipng`
			// * .jpg with `mozjpeg`
			// "optimize": true,
			"optimize": false,

			// minimum time tiles are kept
			"expires": "52w",
			
		},
		
		// more backends here

	},

};

  • run DEBUG=tileblaster node /usr/lib/node_modules/tileblaster/bin/tileblaster.js or /usr/lib/node_modules/tileblaster/bin/tileblaster.js
  • point your webbrowser to 192.168.2.1:47000/osm/13/4215/2689.png
  • conclusion:
    • fetching tiles online is fast
    • serving tiles from disk is fast
    • tileblaster hangs after short time
    • tileblaster compresses tiles (thus need to compress mobac tile, too)

alternative: nginx stand alone

preload cache /w mobac tilestore

setup signalk's charts plugin

toDo: make cache/proxy a signalK plugin


autologin to public hotspot

3G router

  • 192.168.3.1
  • admin:; A****M**
  • 3GUSB AldiTalk
    • User Name: eplus
    • Password: Internet
    • Dial Number: *99#
    • Authentication Protocol : CHAP only
    • APN: internet.eplus.de
    • Reconnect Mode: manual
    • MTU: 1492

apps

data sources

applications

devices

wind

mechanical

ultrasonic

gyro + accelerometer + compass

autopilot

see PyPilot

shutdown button