Using the D-Link DWA-X1850 Wi‑Fi 6 USB adapter on Linux (RTL8832AU 802.11ax)

After the introduction of wireless routers, phones and PCIe cards featuring the next generation of Wi-Fi, known as 802.11ax (or simply Wi-Fi 6), finally the first USB 3.0 adapters have arrived on the market:

The ASUS USB-AX56 adapter has two external antennas, while the D-Link DWA-X1850 comes in a more compact case with built-in antennas.
Both support 2 streams dual band on 2.4GHz and 5GHz, labelled “AX1800”, which translates as:

  • 40 MHz channel width on 2.4GHz, using MCS index 11 and short GI (0.8µs), resulting in a nominal rate of 573.5 Mbps
  • 80 MHz channel width on 5 GHz, also MCS 11 with short GI (0.8µs), resulting in the nominal rate of 1201 Mbps

Combining both rates, these are marketed as AX1800, although you typically can’t bond connections and will rather end up with a Link Rate of 1201 Mbit/s only, which may be somewhere around 500 Mbit/s of real throughput (all while assuming you are located very close to the router, and none of your neighbours are transmitting on the same wifi channel, of course).

While the Link Rate will degrade quickly when a few walls need to be penetrated, the receive sensitivity of this new generation of chips can still be considered superior to previous ac adapters, although the limitation to 2 streams might be an issue. Especially if your router supports AC with 3×3 or 4×4, older adapters like the infamous “Death Star” D-Link DWA-192 might still be a better choice.
It uses RTL8814AU and supports AC1900, i.e.

  • 3 spatial streams with 40 MHz channel width on 2.4GHz, using MCS index 9 and short GI (0.4µs), resulting in 600Mbps
  • 3 spatial streams with 80 MHz channel width on 5GHz, using MCS index 9 and short GI (0.4µs), resulting in 1300Mbps

This may seem like not much of a difference, but keep in mind that MCS11 will degrade more quickly with a few walls in between, and when the connection is at MCS9, 2 streams of AX will only be a rate of 960.Mbps compared to 1300 with 3 streams AC.

But back to the first USB AX adapters hitting the markets right now:
Both the ASUS USB-AX56 and D-Link DWA-X1850 are based on the Realtek RTL8832AU chipset, which is the 2-stream variant of the RTL8852AU – this is the most important information when it comes to finding a driver that works on Linux.

When searching github, you will find the repository
which contains the driver source code from Realtek. There are also a few documents that explain how to introduce your device’s USB VID and PID into the driver:
The relevant file to modify here is os_dep/linux/usb_intf.c, the USB VID e.g. for D-Link is 0x2001, the PID for the DWA-X1850 adapter is 0x3321. For the ASUS USB-AX56, it would be 0B05:1997.

You can find this already patched in my fork of the repo on github:

Now just clone that repo, make and sudo make install, then re-plug the dongle.
After being plugged in, the DWA-X1850 is in USB Mass Storage mode, which can be switched to network adapter mode by ejecting the virtual drive (eventually, it seems this device should be added to the USB modeswitch project).

The blue status LED is currently not working, maybe this needs some addition GPIO definition which is specific to this device.

Also keep in mind that this driver, although being built from source, uses the Realtek proprietary structure, which may not be what the Linux Wireless developers are aiming for.

A corresponding Linux Wireless compatible driver would be “rtw89”, which currently supports only the PCIe version of RTL8852, but I’m sure this may soon be updated to include the USB variants, and one day be available with Ubuntu and other common distributions. For now, at least we have the Realtek driver.

Interfacing the MH-Z14A carbon dioxide sensor with OLED display and ToF Laser distance sensor on STM32

When it comes to indoor air quality, especially during the cold days, we usually think of trying to keep the humidity at an acceptable level to prevent irritation of the respiratory tract occurring from dry air caused by ventilation, which reduces the relative humidity of outside air (that was well-saturated with moisture while it was still cold) by heating it up indoors.

However generally avoiding ventilation will sooner or later result in poor air quality, which is way more difficult to measure than humidity itself: indoor pollutants, mostly from human metabolism (but also furniture and everything else in your house) can vary among countless groups of complex substances that would be impossible to quantify analytically by reasonable means.

The carbon dioxide level is thus often used as an indicator of how much the air is “used up” by human respiration, so you can get a good estimate about air quality in your room or office by just monitoring that single component:

While fresh air is close to the average outdoor level of around 400ppm CO2, you should try to keep your indoor level below 1000ppm to prevent fatigue and reduced cognitive performance.
Exceeding 4000ppm can show significant negative effects on concentration and feeling comfortable.

Devices that measure and display the CO2 concentration (just like we are used to from countless thermometers displaying humidity) are still rare and very expensive, also they would require a little more power than a humidity meter running for years on two AA batteries.

Among the first devices bringing a low-cost solution to the mass market was the weather station from netatmo: The pack contains several sensors connected to a base station that will collect all CO2 measurements and transmit them over WiFi – directly to the netatmo cloud servers. The only way to see your local air quality in the same room is by touching the top of the base, which will then illuminate in one of three colours to give a vague estimate of the situation. Everything else works exclusively through the cloud service: They will monitor human activity (and even sound levels!) in your house and show you fancy-looking graphs on the app or website in return.

If that does not sound like the solution you would want to be running and connected to the internet 24/7, you will quickly stumble upon those MH-Z14 / MH-Z14A sensors that sell on AliExpress for less than $20 USD, shipping included.

They come with their own microcontroller and several interface options like Analog, PWM and UART.

The UART interface is somewhat straightforward, especially if you keep sending the same command over and over to query the current value (so there’s no need to calculate the checksum but rather use the static one that matches the command, as given in the datasheet): Send 9 bytes at 9600 baud and receive 9 bytes with the measurement. There’s not even the need to verify the checksum of the received reply – if you’re lazy, you can just read the value from the third and fourth byte of the reply.

For the beginning, you can just wire it up to some USB CP2102 UART module – the sensor module is perfectly fine with using the 5V from your USB port.

Which results in this little proof-of-concpet Python script that will write the current value to the console each five seconds (make sure to pip install pyserial first and adjust your /dev/ttyUSB or COM port number):

import serial, time

z14 = serial.Serial(port="COM13",baudrate=9600)

while True:
	z14.write(bytearray.fromhex("FF 01 86 00 00 00 00 00 79"))
	result =
	print(result[2] * 256 + result[3])

You will notice it takes a few minutes for the sensor to warm up and deliver plausible results.

Also, there seems to be a difference between ZH14 and ZH-14A modules regarding calibration: The 14A variant performs automatic calibration within each interval of 24 hours – in other words, you have to make sure to let in some fresh air from outside at least once per day, so it can calibrate the lowest reading within the previous 24 hours to be around 400ppm! This seems quite annoying, but also makes using the sensor a lot easier on the other hand.

Now a console window scrolling the latest sensor reading may seem quite appealing to the average nerd, but if you want to go for a more netatmo-ish style of standalone device, how about adding a microcontroller with an oled display and a tocuh sensor? The display would show a tiny version of the CO2 graph, similar to the netatmo apps, on the device itself after you activate it with a touch.

And to make it even cooler, I used one of those new-fangled VL53L0X Time-of-flight laser distance sensors from ST – those are basically the successor of the tiny sensors you have in smartphones to detect user presence (to disable the touch screen while holding the phone close to the head) and allow for range measurements of up to two meters. So you don’t even need to touch the device itself, but could rather hover your hand over the device to switch on the measurements display, or use gesture recognition (upwards or downwards motion) for additional functions.

Here’s some example using an STM32F103C8T6 board (mostly since those are less than $2 on AliExpress for an ARM Cortex MCU and also code for VL53L0x is readily available from ST; also there are Chinese clones of the ST-Link / v2 debugger availably for very little money, compared to e.g. JTAGICE debuggers for AVR controllers, or platforms like ESP8266 or Arduino where you have no live debugging by default at all). Also it has built-in USB that you can use for USB to serial or even mass storage (how about donwloading your measurements from a dynamically created .csv-file for example?).

Using STM32 CubeMX from ST you can graphically set your desired pin functions and generate all the hardware-related code, similar to the web-based tool availbale from Microchip / Atmel at for the AVR and ATSAM MCUs).

Here’s my CubeMX file (I actually used both I2C cores for separating the OLED and the ToF sensor for mere simplicity in wiring).

But after all, you should of course use the platform you feel most experienced with, considering that SSD1306 OLED drivers are available almost everywhere, and you can check the VL53L0x library from Pololu for a more lightweight alternative to ST’s bloated C library to control the laser distance sensor.

Next thing would be to make decent case for it: currently my prototype resides in a 3D-printed cylinder without any bottom plate, and I still need to figure out how to fit a battery in there and how to charge it (or probably just run a cable to the nearest usb port).

The final goal would be connecting it to the USB port of some OpenWRT router for data logging and network access, but then again you might as well go for ESP8266 in the first place… And after all, summer is coming closer, making this the ideal project for some spare time in next winter…

pictures will follow 🙂

DVB-T2 HD auf billiger China-Hardware?

Gerüchte um die Abschaltung von DVB-T zugunsten eines Nachfolgestandards gibt es schon seit Jahren, vor einiger Zeit wurde es dann konkreter: Multinationale Ballsportereignisse zeigten sich ja schon in der Vergangenheit als äußerst geeignet, um neue Generationen von Entertainment-Hardware unter das konsumfreudige Volk zu bringen.

Also mal spaßeshalber bei AliExpress den nächstbilligsten China-DVB-T2-Stick für $18 bestellt, nur so zum Spielen, ohne Garantie auf Empfangbarkeit der terrestrischen Ausstrahlungen in Deutschland. Seit dem 31.05.2016 gibt es nun auch den ersten Pilotmultiplex in den Ballungsräumen.

Es folgt die Essenz aus stundenlangem Wälzen von Bullshit-Bingo und mehr oder weniger hilfreichem technischen Wissen und Halbwissen, das man zu dem Thema finden kann:

DVB-T2 wurde als ETSI-Standard ursprünglich mit MPEG-4 (H.264) eingeführt
in Deutschland wird als Videocodec HEVC (H.265) genutzt,
außerdem eine Modulation nach aktuellerer Spezifikation mit Multi-PLP (Physical Layer Pipes)
geschützte Wort-/Bildmarke "DVB-T2 HD" der Landesmedienanstalten als Zertifizierung für Geräte
Übertragung in 1080p50, öffentlich-rechtlich meist hochskaliert, EM-Spiele jedoch nativ in 1080p und damit momentan besser als über Satellit / Kabel!
momentan billigster China-Gadget DVB-T2-Stick von Astrometa:
RTL2832P + R828D (diese Kombination klingt doch irgendwoher vertraut)
+ dazu noch ein externer Demodulator für DVB-T2, fertig ist der Stick für DVB-T2
Demodulator-IC von Panasonic: alte Version MN88472, unterstützt kein M-PLP
Stick aufmachen: neue Hardware-Revision mit MN88473 drin?
juhuu, dann fehlt jetzt nur noch die Software!
Klickibunti-Player TVR von Astrometa für Windows:
immerhin halbwegs zum Scannen geeignet, will bei mir aber auch nach Installation von LAV Filters kein H.265 decodieren

E drücken für Einstellungen
Strg + Alt + Shift + D für erweiterte Hardware-Informationen
VLC unterstützt H.265 (und/oder den Demodulator!?) erst ab Version 3, also aktuelle Nightlies runterladen!
Im VLC dann nicht drauf reinfallen und "DVB-T2" wählen, sondern DVB-T!

What’s the frequency, Kenneth?

Schon bei der Einführung von DVB-T hielt man es seitens der Sendeanstalten offenbar nicht für nötig, die Sendefrequenzen rauszurücken. Neben detaillierten Übersichten zu FM-Radiofrequenzen in den Regionen und den Parametern für den SAT-Empfang wurden DVB-T-Nutzer damals lediglich darum gebeten, auf ihrem Klickibunti-Gerät “einen Suchlauf” durchzuführen.

Geht mit VLC leider nicht, muss auch nicht (man könnte aber sicher einfach ein Batch-/Shell-Skript basteln).

Eine Übersicht der Frequenzen für den DVB-T2 HD Pilotmultiplex (sowie viele weitere Informationen – bisher die mit Abstand hilfreichste Seite) gibt es bei

Im VLC wird der Wert in kHz eingegeben, also z.B. 626000 für Hannover, 658000 für Hamburg etc.

Falls der Empfang in ländlicheren Regionen nur auf dem Dachboden wirklich brauchbar ist, kann man so im Gegensatz zur Klickibunti-Software immerhin auch mit wenigen Klicks einen Streaming-Server aufmachen und übers lokale Netz womöglich sogar direkt auf den Fernseher im Wohnzimmer streamen – falls man sowas besitzt.

Mir hat in den letzten Jahren jedenfalls ein DVB-T-Stick für sporadisches Fernsehen völlig ausgereicht.

Wenn die Privaten nun langfristig mit der DVB-T2-Plattform Freenet.TV planen, ihre Reichweite in den Ballungsräumen zu reduzieren und terrestrisch nur noch verschlüsselt zu senden, sollen sie das gerne tun.

Wenn man dann mittelfristig noch mit der analogen Kabel-Abschaltung rechnen kann, bliebe eigentlich nur die SD-Übertragung auf 19,2° Ost, die dem Deutschen Privatfernsehen überhaupt noch einen Rundfunk-Charakter geben würde – alles andere sind meiner Meinung nach längst Telemediendienste.

Möglicherweise ist das auch mittelfristig die Intention, die lästigen Bedingungen für eine Vollprogramm-Lizenz eines Tages endlich loswerden und über sämtliche Inhalte frei entscheiden zu können?

Vielleicht gibt es dann irgendwann wieder nur noch öffentlich-rechtliches Fernsehen in Deutschland, wie vor über 30 Jahren…