Raspberry Pi (Zero) projecten

Ha collega’s,

we hebben gisteren natuurlijk een mooie Raspberry Pi Zero gehad. Klein, draait Raspbian, werkt prima,
als je niet weet waar je moet beginnen, zie Raspberrypi.org / downloads.

Je hebt wel een micro sd kaartje nodig, ik gebruik deze altijd (werkt eigenlijk altijd zonder problemen):

je hebt wel wat stekkertjes nodig (zie Kiwi Electronics / Pimoroni / Pi Hut / whatever).

Het is super dat het bestuur voor een Zero W gekozen heeft want daarmee kunnen we ook IoT toepassingen doen (zit BLE en WiFi op).

Ik ben ook bezig met een XBee HAT, dan wordt het nog wat veelzijdiger want kun je bijv. ook voor LoRa:

Ik heb (nog) niet kunnen zien of je met zo’n XBee formfactor module ook met Vodafone IoT kunt werken maar dat zou ook leuk zijn te onderzoeken:
https://www.everythingrf.com/News/details/5544-Digi-Releases-Next-Gen-of-Smart-Edge-IoT-Modules-and-Modems

Die HAT’s zijn overigens ook wel te koop maar ik vindt het altijd leuker er zelf eentje te maken, dan heb je precies de functionaliteit die je hebben wilt en je leert er veel van. Gebruik een Zero W zelf ook voor zaken als tuinberegening etc. Dat zou ook een leuk idee zijn als je school een tuin heeft! Past m.i. ook heel goed bij de zaken waar Eelco Dijkstra mee bezig is rond IoT.

1 like

Ik wil een NumWorks calculator ombouwen met een Zero. Hele complexe berekeningen rechtstreeks in het datacenter van Wolfram.

1 like

Deel 1/2: Een LED-strip met HomeKit aansturen met je i&i Raspberry Pi Zero.

Tijdsinvestering: Ik ben er incl. tutorial schrijven maar excl. de python server code een avondje mee bezig geweest. Python servertje kostte ook zo ongeveer een avondje.

Hoe het begon: Hoera! Op de ALV 2019 kregen we een Raspberry Pi!

Ik had verwacht dat het een Zero zonder W was, maar het was zelfs een Zero W:
W heeft WiFi én Bluetooth Low Energy dus veel beter bruikbaar zonder extra’s.

Even om een indruk te geven van waar je Pi’s voor zou kunnen gebruiken:
Ik gebruik andere Pi’s al voor:

  • Tuinberegening incl. grondwaterpomp aansturing
  • Zonnescherm
  • Bruggetje naar Dyson Ventilator
  • Weerstation
  • (Binnenkort hopelijk: Spotjes die geen ZigBee hebben)

Een andere Pi draait als een lokaal Git servertje.
Er zitten verder Pi’s in mijn onderzoeksproject (reanimatie simulatoren).

Op school (Hogeschool van Arnhem en Nijmegen) gebruiken we Pi’s zowel bij opleidingen rond
Embedded Systemen en Elektrotechniek (en o.a. AD Smart Factory) als Informatica (HBO-ICT ESD variant).
Voor het VO zijn ze ook geweldig, zeker de nieuwere Pi 3 en Pi 4: goedkoop en veelzijdig.

Om de Pi Zero aan de praat te krijgen heb je in principe dit nodig:

  1. https://shop.pimoroni.com/products/official-raspberry-pi-zero-case
  2. https://shop.pimoroni.com/products/usb-to-microusb-otg-converter-shim (zoiets, heb een iets andere variant)
  3. https://shop.pimoroni.com/products/mini-hdmi-cable
  4. https://shop.pimoroni.com/products/mini-wireless-bluetooth-keyboard-with-touchpad
  5. https://thepihut.com/products/wall-adapter-usb-power-supply-5v-2-5a-european-standard (voor NeoPixels liefst zwaarder!)
  6. 16Gb sandisk https://www.amazon.de/SanDisk-Ultra-microSDHC-Speicherkarte-Adapter/dp/B073S9SFK2/ref=sr_1_2?keywords=16+gb+sandisk&qid=1563649389&s=gateway&sr=8-2

N.b. er zijn dongles met USB én Ethernet (https://shop.pimoroni.com/products/three-port-usb-hub-with-ethernet-and-microb-connector).

1A adapter zal voor een Pi Zero meestal al wel willen (tenzij je allerlei USB apparaten e.d. aan wilt sluiten), 2.5A adapter is meer dan genoeg,
let op voor een Pi 4 heb je wel een 3A+ adapter nodig (USB-C).

Stap 1.1. Download Rasbian van https://www.raspberrypi.org/downloads/

Voor de Pi Zero is “Raspbian Buster Lite” een prima keuze, als je minder ervaren bent en in desktop mode wilt starten
is “Raspbian Buster with desktop”.

Ik had “Raspbian Buster with desktop” net vanmorgen gedownload voor de Raspberry Pi 4 dus gebruik die gewoon.

Stap 1.2. Installeren van Rasbian:

Zie hier hoe je Raspbian op die SD kaart krijgt onder Windows:
https://www.raspberrypi.org/documentation/installation/installing-images/windows.md

Op de Mac gebruik je https://www.raspberrypi.org/documentation/installation/installing-images/mac.md.

Stap 1.2b. Koffie / thee zetten terwijl je computer de SD kaart in orde maakt.

Stap 1.3. Kaartje uit je computer, in je Pi Zero W en Pi Zero aanzetten (USB adapter er in).

De Pi Zero is niet heel snel (als je normaal met een Pi 3 of 4 werkt), dat boeit totaal niet maar beetje geduld hebben soms.

Stap 1.4. Loop alle stappen door:
a. Land, taal, tijdzone en toetsenbord instellen.
b. Wachtwoord instellen.
c. Verbinding maken via WiFi
d. Update Software (duurt wel weer even…, op de Pi 4 mislukte dat maar ging prima op de Zero W)

  • Als je nog zin in koffie / thee hebt: nu is het moment!
    e. Sla voor nu “opnieuw opstarten” nog maar even over.

Stap 1.5. SSH configureren

Dat kleine toetsenbordje is leuk en handig als je de eerste stappen wilt doen, ik werk verder liever vanaf mijn laptop.

De Raspberry “start” knop | Raspberry Pi Configuration toont een configuratiescherm:

  • Onder “System” kun je daar de hostnaam (staat in /etc/hostname) eenvoudig veranderen: ik koos nu voor WorkshopLightPi
  • Onder “Interfaces” zet je SSH aan (normaal stel je in dat scherm ook SPI / I2C (bijv voor samenwerking met Arduino) in)
  • Als je op OK klikt vraagt de Pi of je wilt rebooten: Yes please!

Stap 1.6. SSH inloggen: (kun je eventueel overslaan).

Open een terminal venster op je normale computer.
Log in op je Pi: ssh -l pi [hostname]

$ ssh -l pi WorkshopLightPi

(N.b. Dit werkt omdat de Rasbian tegenwoordig Avahi / Zeroconf / mDNS / Bonjour automatisch heeft aan staan!!!)

Voer je wachtwoord in!
Voila! Nu kun je vanaf je normale computer typen op de Pi.

Stap 1.7. De LED strip.

Er zijn meerdere opties die LED strip aan de praat te krijgen. Let er trouwens op dat je de strip niet direct vanaf de 5V van de Pi voedt want dat vindt de voltage regulator op de Pi Zero niet zo prettig.
Op de Adafruit website zie je hoe het we moet:

N.b. ik heb een LED strip van AliExpress gebruikt met WS8212B ‘slimme’ RGB leds.

Het is verstandig eerst die tutorial van Adafruit te volgen, dan test je goed op alles werkt etc.

Voor de voeding van Pi + NeoPixel moeten we even uitrekenen hoe zwaar onze voeding moet zijn:

De WS8212B DIN (groene draad) aan GPIO18
De witte draad aan GND
De rode draad aan +5V=

Stap 1.8. Python test.

Als alles aangesloten is is het verstandig eerst zonder homebridge de verbinding met tussen de strip en de Pi te testen.

Hierbij helpt https://learn.adafruit.com/neopixels-on-raspberry-pi?view=all

Een plaatje van de header van de Zero (W) is ook handig:

Ik heb ‘stiekem’ de 5V van de Pi aan de 5V van de voeding gehangen.
N.b. het is niet verstandig dit zo te doen omdat je de beveiling e.d. omzeilt (o.a. de thermische zekering etc),
toch werkte het bij mij vlekkeloos, maar is wel op eigen risico dus.

Ik heb een rechte pinheader afgeknipt op 6 pinnen, de 1e/2e pin zijn de 5V, de 3e dan de GND en de laatste is de GPIO18
als je hem rechtsboven op de header plaatst…

Probeer het voorbeeld programma van Adafruit.

$ sudo python3 neoPixelTest.py

Bij mij werkt het!!!

Tot zo ver deel 1, in deel 2 gaan we de LED strip integreren met ons slimme huis.

1 like

Bij deze twee filmpjes die laten zien hoe en dat het werkt:


Niet heel esthetisch mooi filmpje zo tegen het buitenlicht in, maar je ziet dat de LED-strip op spraak werkt. Je kunt hem ook gewoon vanuit de Home app bedienen. zoals ik al aangaf zou het ook met niet Apple producten moeten kunnen werken alleen moet je dan ws. eea aanpassen, ik heb geen Android devices dus kon het ook niet testen.

1 like

Deel 2: Neopixels als Homekit HUE lamp

Stap 2.1. Voorbereiden Homebridge installatie.

We gaan nu homebridge installeren. Ik heb geen Alexa / Google Home, maar dat moet in principe ook met Homebridge samenwerken.

sudo apt-get update
sudo apt-get upgrade

Dat zou snel moeten gaan op een Pi die net geüpdated is.

g++ -v
Geeft bij mij: gcc version 8.3.0 (Raspbian 8.3.0-6+rpi1)
Zou prima moeten zijn, die stap slaan we verder dus over.

Op de Zero moet je even wat meer moeite doen om NodeJS te installeren:

“## You appear to be running on ARMv6 hardware. Unfortunately this is not currently supported by the NodeSource Linux distributions. Please use the ‘linux-armv6l’ binary tarballs available directly from nodejs.org for Node.js 4 and later.”

We zoeken daarom even “Pi Zero NodeJS” en vinden bijv:

$ curl -o node-v9.7.1-linux-armv6l.tar.gz https://nodejs.org/dist/v9.7.1/node-v9.7.1-linux-armv6l.tar.gz
$ tar -xzf node-v9.7.1-linux-armv6l.tar.gz
$ sudo cp -r node-v9.7.1-linux-armv6l/* /usr/local/

Als alles goed gaat kun je nu controleren of node draait:

$ node -v
Dit geeft v9.7.1 terug.

We checken de node package manager ook nog even:
$ npm -v
5.6.0

We installeren Git ook meteen maar even:
$ sudo apt-get install git

Aha: dat doet het al in onze Buster versie: “git is already the newest version (1:2.20.1-2).”

Avahi doet het ook al in Buster, voor de zekerheid toch maar even deze stap omdat Homebridge soms wat achter loopt.

$ sudo apt-get install libavahi-compat-libdnssd-dev

Stap 2.2. Homebridge zelf

Nu volgen we de stappen voor Homebridge zelf: https://github.com/nfarina/homebridge

$ sudo npm install -g --unsafe-perm homebridge

Ok, bij mij werkte dat vlekkeloos!

$ homebridge
“No plugins found. See the README for information on installing plugins.”

Je kunt het indirect doen, met MQTT, mooie IoT oplossing, dan kun je je Zero ook nog voor allerlei andere dingen gebruiken
en is het alleen een “home bridge”

Stap 2.3. Homebridge Neopixel

Er is weinig te vinden wat als directe oplossing wil. Ik heb o.a. naar homebridge-opc gekeken maar dat is niet precies wat ik
wil.

We kunnen in python wel een simpel REST servertje implementeren en daar met homebridge-neopixel tegenaan praten,
dat het dan lokaal is maakt natuurlijk weinig uit.

Met de Node package manager kun je “homebridge-neopixel” installeren:
$ npm install -g homebridge-neopixel

Stap 2.4. REST HUE servertje

Op https://www.npmjs.com/package/homebridge-neopixel en https://www.studiopieters.nl/homebridge-neopixel-light/ krijgen we
een aardig idee van wat we doen moeten om eea aan de praat te krijgen, alleen vertalen we die ESP8266 code naar Python.

Dit is een goede basis voor het servertje in Python (3):

#!/usr/bin/python3

import socket
from http.server import BaseHTTPRequestHandler, HTTPServer
import time

hostName = ""
hostPort = 80

class MyServer(BaseHTTPRequestHandler):

	#	method for GET request
	def do_GET(self):
		self.send_response(200)
      # hier moet onze code om commando's af te vangen
      content = "<p>You accessed path: {}</p>".format(self.path)
		self.response()

	#	POST is for submitting data.
	def do_POST(self):

		print( "incoming http POST: ", self.path )

		content_length = int(self.headers['Content-Length']) # <--- Gets the size of data
		post_data = self.rfile.read(content_length) # <--- Gets the data itself
		self.send_response(200)
		client.close()

		#import pdb; pdb.set_trace()

   def response(self, content):
      self.wfile.write(bytes(content, "utf-8"))


myServer = HTTPServer((hostName, hostPort), MyServer)
print(time.asctime(), "Server Starts - %s:%s" % (hostName, hostPort))

try:
	myServer.serve_forever()
except KeyboardInterrupt:
	pass

myServer.server_close()
print(time.asctime(), "Server Stops - %s:%s" % (hostName, hostPort))

Stap 2.5. Commando’s:

We moeten een aantal commando’s afvangen:

  • on
  • off
  • set
  • status
  • color
  • bright

Stap 2.6. Netatalk (optioneel):

Het is niet heel prettig om te ontwikkelen op de Pi zelf. Ik heb daarom netatalk geïnstalleerd.
Daarmee kan ik vanuit de macOS finder de Pi als schijf benaderen en gewoon in mijn favoriete editor werken.

N.b. voor windows heb je SAMBA nodig, daar zijn ook wel tutorials voor te vinden.

$ sudo apt-get install netatalk

Netatalk 3 heeft de configuratie in /etc/netatalk/afp.conf staan

$ sudo nano /etc/netatalk/afp.conf

Ik heb daar dit ingezet:

[Homes]
basedir regex = /home

Eventjes opslaan en dan voer je dit commando uit:
$ sudo systemctl restart netatalk

Daarna kan ik mijn Pi gewoon als schijf benaderen.


def processServerRequest(self, path):
		global last_color
		global state

		if ("/on" in path):
		  self.setHex(last_color)
		  state = 1
		  return "OK"
		if ("/off" in path):
		  state = 0
		  self.setHex((0,0,0))
		  return "OK"
		if ("/set/" in path):
		  _hexString = path[5:]
		  last_color = self.stringToRGB(_hexString)
		  self.setHex(last_color)
		  return "OK"
		if ("/status" in path):
		  return str(state)
		if ("/color" in path):
		  _result = "{:02x}{:02x}{:02x}".format(r,g,b)
		  print(_result)
		  return _result
		if ("/bright" in path):
		  _brightness = self.getBrightness()
		  return str(_brightness)

		return "Unknown"

Daarna is het tijd om je config.json aan te passen:
$ nano /home/pi/.homebridge/config.json

De volledige Python 3 server code staat hier op GitHub:

N.b. Zie ook de config.json file daar.

Ik heb nog enkele aanvullingen:

  • volg de Adafruit tutorial om de LED strip aan te kunnen sturen met python (je moet m.b.v. pip3 install enkele libraries installeren (het commando daarvoor is: “sudo pip3 install rpi_ws281x adafruit-circuitpython-neopixel”)
  • Python is in één opzicht een groot drama: de manier waarop inspringen de scope aangeeft. Pedagogisch erg fijn en zo, maar niet als je code knipt en plakt (voor leerlingen een ‘voordeel’ maar niet voor zo’n tutorial als je alle code niet wilt overtypen). Je kunt de code van GitHub op je pi krijgen door: wget https://raw.githubusercontent.com/jakorten/NeoPixelPi/master/pixelServer.py uit te voeren)
  • Ik heb inmiddels een upgrade gedaan van 30 naar 144 LEDs (zodat ik het als heldere verlichting in mijn werkplaatsje kan gebruiken). Een meter met 144 LEDs + Pi Zero W trekt meer dan 3A volgens mijn labvoeding (maar die is ook maar 3A): mijn adaptertje van 3A trok het in ieder geval niet als alle LED’s vol aan staan. Er zijn wel kleine voedingen speciaal voor zulke strips op amazon e.d. te koop voor minder dan tientje (5V / 5A), maar wees dus gewaarschuwd :).

Op GitHub heb ik ook nog een voorbeeld gezet van mijn config.json (staat bij mij in /home/pi/.homebridge/config.json). Die config.json zorgt voor de koppeling van het python servertje met homebridge: je geeft daar de gewenste endpoints op).

In mijn nieuwste versie is de hostname van de Pi workbench dus daarom workbench.local overal.