# LED-strip met RPi (hardware)
Voor deze opstelling gebruik ik een raspberry pi zero w. Dit is de kleinste en goedkoopste RPi met WiFi-ondersteuning. Geen zero bij de hand? Je kan dan perfect een iets duurdere RPi2, RPi3 of RPi4 gebruiken.
# De hardware.
- 1 x raspberry pi zero w (of een andere RPi met netwerkondersteuning)
- 1 x SD-kaart van minimaal 2GB
- 1 x RGB LED-strip
- 1 x 12V-DC naar 5V-DC adaptor
(12V voor de LED-strip en 5V voor de PRi-voeding) - 3 x MOSFET's
(De RPi-uitgangen kunnen het hoge stroomverbruik van de LED-strip niet aan.)
# De software.
Ik ga ervan uit dat je reeds voldoende ervaring hebt met schrijven en bewerken van een RPi-image. Je kan perfect met je voorkeurtools verder werken. Onderstaande tools worden in dit project gebruikt:
- Etcher: om de basis-image naar de SD-kaart te schrijven.
- Paragon ExtFS for Windows. Een gratis tool waarmee je linux-partitie automatisch kan mounten onder Windows. Je kan op deze partitie zowel lezen als schrijven.
Geen gedoe meer met sudo nano .... Gewoon de bestanden openen in je favoriete editor. 😃 - Backup & Recovery Free om een back-up van je definitieve image te maken.
- Sublime Text: een eenvoudige teksteditor om Unix-bestanden aan te passen.
- MobaXterm: als alternatief voor PuTTY en Git Bash.
MobaXterm is een handige SSH- en SFTP-tool in één.
# Nieuwe RPi-image configureren.
- Download Raspbian Stretch Lite.
- Schrijf de image op een SD-kaart.
- Mount SD-kaart en open de Linux partitie met Paragon ExtFS.
# Enable ssh (boot partitie).
- Plaats in de boot partitie een leeg bestand met als naam ssh (dus zonder extensie).
# Configureer netwerkinstellingen (Linux partitie).
- Open het bestand /ect/wpa_supplicant/wpa_supplicant.conf met Sublime Text.
- Voeg achteraan het bestand de WiFi-configuratie toe:TIP: je kan later het wachtwoord coderen via het commando:
# WiFi network={ key_mgmt=WPA-PSK ssid="YOUR_SSID" psk="YOUR_PASSWORD" }
1
2
3
4
5
6$ wpa_passphrase YOUR_SSID YOUR_PASSWORD
.
Bovenstaande configuratie geeft ons een dynamisch IP-adres. Heb je liever een statisch IP-adres (bijvoorbeeld WiFi: 192.168.1.61 en Ethernet: 192.168.1.60), pas dan volgend bestand aan:
- Open het bestand /ect/dhcpcd.conf met Sublime Text en voeg achteraan volgende code toe:
# WiFi interface wlan0 static ip_address=192.168.1.61/24 static routers=192.168.1.1 static domain_name_servers=8.8.8.8 8.8.4.4 # Ethernet (niet nodig voor de RPi zero!) interface eth0 static ip_address=192.168.1.60/24 static routers=192.168.1.1 static domain_name_servers=8.8.8.8 8.8.4.4
1
2
3
4
5
6
7
8
9
10
11
BELANGRIJK
Unmount de SD-kaart altijd via ExtFS. Doe je dit niet, dan zijn de wijzigingen meestal niet bewaard!
# Installeer GIT en clone het basis-script via Github.
- Verbind de RPi met de voedingsspanning (voor de RPi zero w is dit de BUITENSTE micro USB connector).
- Connecteer via mobaXterm met de RPi.
- Ga naar de map /home/pi en voer achtereenvolgens volgende commando's uit:
$ sudo apt-get install git $ git clone https://github.com/pverhaert/PIstrip.git $ mv /home/pi/PIstrip/* /home/pi/ $ rm -R -f /home/pi/PIstrip
1
2
3
4 - Run het bash-script:
$ sudo bash PIstrip.sh
1 - Update/upgrade RPi (keuze 1).
- Installeer Node.js versie 4 of hoger (keuze 60 t.e.m 65).
Let op: het script controleert op welke processor je nu draait en installeert de juiste Node-versie. Installeer je Node op een PRi zero, dan kan je de SD-kaart niet gebruiken op een RPi3 en omgekeerd! - Maak SSL certificaten voor https (keuze 100).
Je hoeft tijdens deze installatie niet alle velden in te vullen. Je mag elke keer op enter drukken.
Waarom SSL certificaten aanmaken? Op de RPi komt ook een website die je kan openen via het IP-adres. Je kan zowel http als https gebruiken. Bijvoorbeeld: http://192.168.1.61 en https://192.168.1.61.
Voorlopig krijg je op het einde van de configuratie enkel een statische webpagina te zien. - Installeer pm2 (keuze 101).
pm2 is een vrij uitgebreide process manager voor Node. In onze toepassing zijn we vooral geïnteresseerd in de watch end reload functie. Telkens je een Node-script aanpast, wordt het script automatisch terug opgestart. Ook als je de RPi volledig stopt en terug opstart, zal het script ook automatisch opstarten. - Installeer node dependencies voor het project (keuze 102).
Let op: deze keer ZONDER sudo!$ npm install
1- Express: web framework voor Node.
- PubNub voor Node. Het script dat we hier gebruiken, is vergelijkbaar met het PubNub-script in Cordova.
- Johnny-five: een JavaScript robotics & IoT platform.
- Raspi-io: een RPi I/O plugin voor Johnny-five.
- Reboot de RPi.
$ sudo reboot
1
# Configureer app.js
- Ga naar /home/pi/app.js.
- Vervang de variabele
subscribeKey
door de API-key die bij het project hoort.
/*
pm2 info:
http://pm2.keymetrics.io/docs/usage/quick-start/#cheatsheet
https://www.npmjs.com/package/pm2#main-features
--------------------------------------------------------------------------------
Debug app.js: $ sudo pm2 start app.js --watch --no-daemon
Run app.js: $ sudo pm2 start app.js --watch
Save runing processes: $ sudo pm2 save
Display all processes: $ sudo pm2 list
Stop app.js: $ sudo pm2 stop app.js
Kill the current pm2: $ sudo pm2 kill
*/
var path = require('path');
var fs = require('fs');
var https = require('https');
var express = require('express');
var PubNub = require('pubnub');
var raspi = require('raspi-io');
var five = require('johnny-five');
// Pubnub config
var channel = 'PIstrip';
var pubnub = new PubNub({
subscribeKey: 'sub-c-XXXXXXXXXXXXXXXXXX',
ssl: true
});
// Status PI-LED's
var STRIP = new Object();
STRIP.color = '#220000';
// Johnny-five
var board = new five.Board({
io: new raspi({
enableSoftPwm: true
})
});
board.on('ready', function () {
// Pin info: https://github.com/nebrius/raspi-io/wiki/Pin-Information
var rgb = new five.Led.RGB(['P1-11', 'P1-13', 'P1-15']);
rgb.color(STRIP.color);
pubnub.addListener({
message: function (m) {
var msg = m.message; // Payload
if (msg.color) {
var color = msg.color;
color = color.trim();
color = color.split(' ');
for (var i = 0; i < color.length; i++) {
try {
rgb.color(color[i]);
STRIP.color = color[i];
} catch (err) {
console.log(err);
}
}
};
console.log('msg', STRIP);
},
status: function (s) {
console.log('*** status ***');
console.log(s);
}
});
pubnub.subscribe({
channels: [channel]
});
pubnub.history({
channel: channel,
count: 1
},
function (status, response) {
console.log('history response', response);
var color = response.messages[0].entry.color;
try {
rgb.color(color);
STRIP.color = color;
} catch (err) {
console.log(err);
}
}
);
});
// Express http
var app = express();
app.use(express.static(path.join(__dirname, 'www')))
.get('*', function (req, res) {
res.redirect('https://' + req.headers['host'] + req.url)
})
.listen(80);
// Express https
https.createServer({
key: fs.readFileSync('server.key'),
cert: fs.readFileSync('server.crt')
}, app)
.listen(443, function () {
console.log('Secure website on port 443');
});
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# App.js opstarten met pm2.
Zie ook: https://www.npmjs.com/package/pm2#main-features
Het hoofdprogramma, app.js, is volledig klaar. Zet de toepassing in productie via de commando's:
$ sudo pm2 start app.js --watch
$ sudo pm2 save
2
Het commando save bewaart de huidige configuratie zodat app.js automatisch start zodra je de RPi terug volledig opstart.
Wil je het script aanpassen, dan kan je het script best eerst stoppen en terug in debug-mode (--no-daemon
) starten.
$ sudo pm2 stop app
$ sudo pm2 start app.js --watch --no-daemon
2
Pas als het script volledig klaar is, zet je het terug in productie.
$ sudo pm2 stop app
$ sudo pm2 start app.js --watch
$ sudo pm2 save
2
3
Je kan de toestand van de app volgen via:
$ sudo pm2 list
De app volledig verwijderen doe je via:
$ sudo pm2 delete app
$ sudo pm2 save
2
# App-website hosten op de RPi.
Elke app die je met Cordova ontwikkelt, heeft zowel een Android versie als een browser versie. De browser versie kan je dus makkelijk op de RPi installeren. Zo kan elk toestel (laptop, iPhone, ...) binnen het lokale netwerk de site via http of https bereiken. Je hoeft enkel nog de gecompileerde browser versie naar de map /home/pi/www op de RPi te kopiëren. Je kan hiervoor een standaard FTP-programma gebruiken (FileZilla bijvoorbeeld) of je gebruikt de ingebouwde FTP-client van WebStorm.
Ziehier de configuratie voor WebStorm:
- Wijzig enkele voorkeuren in WebStorm:
- Open Settings onder het File-menu. Ga naar Build, Execution, Deployment en klik op Options.
- Vink de optie Hash hosts in known_hosts file af.
- Open het menu Tools -> Deployment -> Configuration en klik op het plus-teken.
- Geef de configuratie een naam (PIstrip) en vul de gegevens van de RPi in. Belangrijk: kies als verbindingstype SFTP en verwijs het Root path naar /home/pi/www!
- Klik op Test SFTP connection om de verbinding te testen.
- Klik bovenaan op het tabblad Mappings.
- Verwijs het Deployment path naar /.
Leg het Local path naar de gecompileerde versie. Deze staat in de map platforms\browser\www!
- Open de map platforms\browser\www en upload vanuit het snelmenu de volledige www-map naar de RPi.
Vergeet niet bij elke aanpassing in het project de website ook opnieuw te uploaden.
De hercompilatie gebeurt automatisch zolang je $ phonegap serve
op de achtergrond laat draaien.
LET OP
Telkens je een volledig nieuwe image maakt, zal deze een unieke ssh-key genereren. PhPStorm kan nu niet meer kan connecteren op hetzelfde IP-adres omdat de nieuwe sleutel niet overeenstemt met de oude sleutel!
Dit kan je makkelijk oplossen door de oude IP-configuratie uit de lijst met known_hosts te verwijderen.
Zie bestand: C:\Users%USERPROFILE%.ssh\known_hosts.
# Hardware schema.
....