Laser Cutting a Paper Solder Paste Stencil

In the process of working on a PCB for another project, I ended up with a component that was harder to solder properly than I had originally expected, and had not ordered a solder paste stencil with the board.

I ended up thinking if I could find reasonable material, I could cut a stencil for this part using my laser cutter. Some stencils are made of kapton, but I don’t have any larger sheets of kapton, nor do I think my 10W diode laser would cut it.

I ended up finding that my standard printer paper was just about the right thickness for a stencil, at about 4 to 5 thousandths of an inch thick. I was a bit worried that the finer features between the pads might tear, but it was worth trying.

Turns out, that at least for low quantities, paper makes a pretty reasonable homebrew stencil material.

Posted in Random | Leave a comment

Customizing a Smart Plug

Recently some projects around the house have been in need of some better ‘home automation’ than a standard timer can provide, so I went looking for a smart plug that was either ‘dumb’ enough for my liking (didn’t tie you to some manufacturer’s cloud service), or was modifiable with my own code.

Fortunately the ESPHome project is a great resource both for a list of devices that are reasonably easily modifiable, and for a codebase built for running your own automation on a number of IoT devices.

I looked through their list a bit, and found a few devices that were built around the ESP32, which I am already well familiar with, and which were inexpensive and easily available to me through the usual retailers. In the end I ended up settling on the Wyze Plug Outdoor, and picked up a few units.

Internally there’s some test points that I soldered some headers on to get access to the serial UART and the power pins. After hooking that up, it’s a quick process to flash some ESPHome code on the unit, or write your own with Arduino / your IDE of choice.

So far, I’ve been really happy with these units. They seem to be built reasonably well, they aren’t glued together so they’re easy to open up and reprogram, they’re suitable for outdoor use if needed, and have two individually controllable outlets.

Posted in Electronics, Random, Technology | 1 Comment

Wired Ethernet on ESP32

I’ve used the ESP32 microcontrollers for a number of projects at this point, often using the built-in WiFi radio. However, there are use cases where WiFi may be less than ideal. In my case, I’m interested in the higher reliability a wired connection offers, as well as consistent latency performance.

Fortunately, the ESP32 includes a built-in Ethernet MAC, which is the controller that manages a wired Ethernet connection. If we can pair that with a PHY, which drives the actual electrical signals on the wire, we should be able to get a working connection.

Before getting into a specific project, I wanted to put together a test board to feel out how it would work, and resolve any issues before putting it to real use. Fortunately, there’s a few references around, including a very nice open source design from Olimex that proved to be a useful reference combined with the part datasheets.

I didn’t bother to include Power over Ethernet like their design does, though that is another potential benefit over WiFi, where you can have a single cable provide power and data to a project.

I ended up testing my design by coding up a simple NTP server, and feeding the board from a GPS signal. I started with MicroPython, which is quite handy for putting together an application a lot faster than writing it in C++, but ran into performance issues that negatively impacted the quality of the time responses the board was able to return.

After rewriting in C++, the board returns fairly accurate timing responses, and would be an interesting basis for future work, though isn’t really in a state suitable for publishing currently.

Posted in Electronics, Technology | Leave a comment

GPSMON Output with UBlox Receivers

I’ve got a UBlox GPS module in a somewhat challenging RF environment (Indoor with no clear sky view, and potentially some other RF sources causing interference), and have been looking at what data I can gather with regards to the signal. The receiver is attached to a computer running GPSd, so the easiest first step it to look at what data we see in the ‘gpsmon’ utility.

Some fairly self explanatory stuff here, receiver channel, satellite ID, azimuth, elevation, signal to noise ratio, and whether that satellite is being used in the fix. However, that flag field is not entirely clear, and some google searches didn’t bring it up either. I wasn’t able to find any documentation on what that flag field represented.

We can, however, reference the UBlox datasheet and look at the UBX-NAV-SVINFO message, which is the message that contains all this info on the individual satellites being tracked, and that gpsd / gpsmon is parsing out for us.

There end up being two bytes output for each satellite, that are labelled as ‘quality’ and ‘flags’ in the datasheet, and manually parsing the raw data, I was able to confirm that gpsmon is showing us here these two bytes in hexadecimal. The first byte being the ‘quality’ byte, and the second one being ‘flags’.

To use the example of PRN 21, on channel 5, gpsmon is showing us the data ‘070D’. Now we just need to cross-reference this with the datasheet.

The first byte we got is ’07’ hexadecimal, which is 7 decimal, and that matches the “Code and carrier locked and time synchronized” state in the quality table. All good there.

The second byte we got is ‘0D’, which is 00001101 in binary, and so we see that matches with the svUsed, orbitAvail, and orbitEph bits. So this satellite is being used in the fix, and we have current orbit information and ephemeris for this satellite.

So now we now how to parse out the flags information gpsmon will provide to us for UBlox modules, and better debug the state of how the receiver is tracking the constellation.

Posted in Electronics, Random | Leave a comment

Simulating Full IPv4 Tables in the Lab

I’ve been doing some testing recently with different software based routers, and wanted to give them a test under real world conditions. The current full IPv4 table is larger than 900,000 routes and to get an idea of how well they handle it, I needed to be able to simulate getting a full transit feed in the lab environment.

This is far from a new topic, and I’m sure there’s many ways to approach this issue, I just happened to need to work on this recently, and this is the method I ended up settling on.

First, we need a source for all these routes. They don’t necessarily have to be real, we could just make fake routes for 1.1.1.1/32, 1.1.1.2/32, 1.1.1.3/32, and so on till we got to 900,000(ish) total, but in some cases this can be an unrealistic test as systems will merge routes into contiguous blocks of larger prefixes and internally reduce the size of the routing table. To replicate how reductions would happen in the real world, we need the real world routes.

Fortunately, RIPE maintains a number of servers that regularly save a copy of all the routes received, from a variety of locations around the world, and provide that for download. I looked at their list of servers, and selected RRC18 as it has a single full table, which matches what I’m aiming to emulate. You could of course select another server that gets multiple copies of the full table from different peers if that data better fits your test environment. Then you just download the latest dump from your selected server, in my case: https://data.ris.ripe.net/rrc18/latest-bview.gz

I originally thought the easiest use of the data might be to use some bash and awk one-liner to parse the output of the file with bgpdump, and generate a text file with commands to add them as static routes to a VyOS instance, and I’d BGP peer that to the test lab. However, loading the routes to VyOS choked on the massive quantity. The first route addition commands went quickly, eventually slowing to a crawl as ever more routes were added. Eventually I gave up after leaving it trying to process the static route creations for several hours.

I tried tweaking my bash and awk to output a config file for FRR under linux that contained all the static routes, but FRR choked, using more than 64GB of memory and being killed when the system ran out of RAM.

An acquaintance pointed me to gobgpd, which will work on the dump from RIPE directly, and is a very simple daemon to test with BGP. Turns out it works pretty well.

You’ll want to:

  • install via your distro’s package manager of choice, “apt-get install gobgpd” or equivalent.
  • Create gobgpd.conf (example below)
  • Start gobgpd with “sudo -E gobgpd -f gobgpd.conf &”
  • Load the route dump into the daemon with “gobgp mrt inject global latest-bview”

Here’s a very quick config example for you. This config should be pretty self documenting in terms of the local AS and router-id, and the neighbor configuration. The policy is there to overwrite the next-hop data from the dump, as their next-hop data obviously won’t work for us here.

[global.config]
  as = 65500
  router-id = "192.168.1.1"
[[neighbors]]
  [neighbors.config]
    neighbor-address = "192.168.1.2"
    peer-as = 65501
[[policy-definitions]]
  name = "policy1"
  [[policy-definitions.statements]]
    name = "statement1"
    [policy-definitions.statements.actions.bgp-actions]
      set-next-hop = "192.168.1.1"
[global.apply-policy.config]
  export-policy-list = ["policy1"]
  default-import-policy = "accept-route"
  default-export-policy = "accept-route"

And once it’s running, we can check on the BGP state on our peer, in this case a VyOS test VM.

nigel@vyos01:~$ show bgp summary

IPv4 Unicast Summary (VRF default):
BGP router identifier 192.168.1.2, local AS number 65501 vrf-id 0
BGP table version 916895
RIB entries 1679949, using 308 MiB of memory
Peers 1, using 725 KiB of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt Desc
192.168.1.1    4      65500    945727     15503        0    0    0 00:05:24       916835        0 N/A

Total number of neighbors 1

Now we’ve got a full table of 916,835 routes, with real data, in our lab environment for testing.

Posted in Random, Technology | Leave a comment