Besides modding my phone yesterday morning, the vast majority of the day yesterday and today has been spent on assembling my new 3D printer. I've been down on 3D printing overall for some time, largely due to quality issues and the amount of time that it takes to complete a print. I've got access to a 3D printer at work, which has satisfied me for occasional small projects over time. But I just completed a big one. And more importantly, for this post, I also got lucky and snagged roughly 40 one kilogram rolls of free ABS filament recently. For free.
That was enough to push me over the edge and get my own. Forty kg is effectively a lifetime supply. The big project I mentioned took over twelve hours to squirt well under half of a kilogram of filament into my custom shape. I could make 160 of those with this much filament.
Anyway, above is a set of pictures showing all the parts. I got a kit, because not only are kits cheaper, I enjoy putting them together. Plus, it means I know for sure how it all goes together, which helps inform knowing how it works, which makes repairs down the line easier. I've just now completed the last major part of assembly. All the screws are screwed in, all the wires are plugged in. I've turned it on and done the most basic of things (move a bit, go to auto home), and those basic things work.
Here it is in all its glory. You might notice that this is not a traditional ("cartesian") 3D printer. Instead it's a "delta" style, which moves three arms up and down; when moved properly in concert the print head they connect to in the middle can be made to move left/right, forward/back, and up/down. But all the motors doing this are fixed, at the base, driving the arms through belts. So there's less mass to move around, which is always a good thing. Specifically this is a Geeetech G2s Pro. Which in addition to being a delta, which I like, also has two extruders. Meaning in theory (if I can learn how...) it can print with two different filaments, like two different colors, at once. Which presents exciting opportunities.
There's still a ton of things to check. All the wires are plugged in, but are they plugged in correctly? To the right thing? Does it get hot when I ask? Does it squirt out plastic when I ask? Is it level and square in each of the several ways that it needs to be? Are the fans pointing in the right direction? Do any of the wires or tubes bind up when the print head moves around?
So this is not "project done". But it's a significant milestone.
A while ago I decided that I'd wait until near the end of the year and seriously consider opening up my Nexus 5X. First, to replace the nearly year old battery and second to modify it for wireless charging. I completed that work today. This first picture shows the phone opened up. The iFixit guide for battery replacement was very useful. With the right tools, as pictured (except the #000 phillips driver), it was quite straightforward to get inside. It's worth noting that the metallic sticker, still in place as pictured, on the inside of the back cover must be removed, so the electric field can get inside to the coil!
Here's a close up image of the completed modification. I used the +5V point on a capacitor as pointed out on YouTube, but for ground just used the nice big USB-C connector shield, which I verified was also grounded. Some thin gauge wire-wrapping wire is small enough to not get in the way of anything. Since the wires are only around an inch long, I'm not concerned about the resistance of thin wires.
My new boards arrived and I've assembled the first (totally working!) "wi_ther" environmental sensor. The prototype, which I've posted about before, and was supposed to be the final version, is on the left while the new board is on the right.
The new board is larger, to put more space between the hot WiFi/controller chip and the three sensors, which are closer to the proper USB connector, rather than the on-PCB fingers. I got the connector a tiny bit wrong, I had to cut off a bit of the board to make it fit properly, since I put too much empty space around the holes for it to mount to.
You can see three internal cut out slots to help break any thermal transfer from the controller to the part of the board where the sensors are. The surface mount temperature sensor also has extra cutouts around it, and the two other sensors have big slots cut out beneath them, which is nearly invisible in this picture.
I'm still finalizing how I want the software to work. For now this system is running an HTTP server, which can be polled. I've also considered letting it run as an HTTP client, periodically pushing the data out. It might be nicest for it to run as an independent system, keeping a buffer of historical data in memory, in case anything causes my normal system to miss then that data can be retrieved thanks to the independent storage. But for now, it's time to stress test it and verify whether my thermal design for this version helps the sensors provide accurate data. (Early signs are good! In the few minutes it's taken me to type up this post, the reading has remained flat, so they haven't been heated by the processor!)
Here's a picture of the just completed first prototype for my wireless weather sensor. I'm upgrading the temperature sensor design because I didn't do a great job with it. I got it to the point that it's barely functional, learned some things, and so now it's time for round two.
I've still got the DS75 temperature sensor I started with. It's at the top middle of the picture, the tiny chip on the larger green board. Moving slightly counterclockwise, behind a forest of wires, is a black box: that's an AM2320 sensor which does both temperature and humidity. Continuing clockwise from there on a purple breakout board is a BMP280 barometric pressure sensor, which also does temperature to boot.
All three of these chips speak the same I2C communication protocol, so it's just the two orange wires from the big board at the bottom (a clone NodeMCU) that connects to all of them, as I2C is a shared bus. Now that I've got it working, I know for certain that I understand all three chips and how to wire them up. And get data out:
Reading at 874742: AMT=80.06; AMH=49.00; BMT=82.83; BMP=101974.61; DST=81.05
They only mostly agree about the temperature, with a drift of a couple degrees between them. In practice I'll probably take the average (mean) of all three readings. I've got plans for a PCB to put all this on. It will be bigger than the previous one, and more carefully designed, with internal slots to make sure the heat from the WiFi/controller chip doesn't reach out to foul the temperature sensors' readings, and a real USB connector (just for power) rather than trying to use the PCB itself for that when it's too thin to do that job well.
I've "finished" my wireless temperature sensor project. At least the first version.
The first picture here is the final test before "done", on a breadboard. It's assembled and plugged in there. Look at the middle picture and you can just see (U4) the first mistake. The power regulator isn't the size I thought it was. I got lucky that I could force the smaller chip to line up just good enough to use anyway. Then on the breadboard I realized the second design mistake. I knew of the idea of designing thermal relief into a board like this, with temperature sensor included. I neglected to do so, however. Turns out the chip running the WiFi pushes the temperature on the board up around ten degrees above ambient, and with the (surface mount) temperature sensor (U3, top right of the mostly-in-focus middle picture) also right on that board, under an inch away, it doesn't give the sort of readings I want.
Luckily the next day the pair of AM2302 sensors I ordered arrived in the mail. These are the same as the DHT22, which is compatible with the DHT11. I've had some DHT11 units for a while — they're awful quality (for this application), but they do have a passable humidity sensor. And I had nothing else to do with them, so I left a place to put one in. The DHT22/AM2302 sensors are much better for this project. And they're not surface mount, so they won't be corrupted (as much?) by the heat of the processor/WiFi work. It's the white plastic box visible in all three pictures (most obviously in the last one).
The new sensor was pretty easy to hook up to the dev board (bottom right of the first picture), which is a cheap NodeMcu knockoff. But I couldn't get it to work in my board. Turns out I selected an arbitrary pin (11, GPIO9) based on proximity/convenience on the board. That pin won't work for this application (argh!), and I didn't test that before getting the board made. So, as you can just see in the last picture, the data pin is lifted, extended, and run over to one of the extra GPIO breakout points I included "just in case" (phew!) which works.
So far it's been plugged in since last night and it's happily answering my queries for data. I'm running a quick test to see what sort of data it produces overnight. But overall, it looks to be in a good enough state to begin using.
This is my first ESP8266 project, to mixed results. It's really convenient to have a programmable WiFi capable microcontroller, but programming is a bit of a pain, all the networking smarts bulk up the programs a lot, so they take a while to upload. Plus it's a bit of a dance to get it in the right mode to accept the programming. For my board, I ended up relying on the second UART port for diagnostic output, I couldn't get reliable data out of the primary one. If I have another small project where WiFi interaction would be useful, I'll probably give it another try but I'll be cautious.
That second project might be a second version of this very project. I'd like more sensors so I could know, for example, how much (if any) difference there is in temperature in various parts of my apartment, especially "upstairs" in the sleeping loft. That's why I made it wireless: so it's easy to put wherever I want, as long as I have power available to run it. I can fix the mistakes I know of, and perhaps try again with a new better version.
I've had computerized logging of temperature, indoor and outdoor, since I lived in my previous apartment. Both the heat and A/C there was electric, which I paid for. With a clunky old unit. So I hooked temperature sensors to the server I ran all day anyway, and put a relay in front of the HVAC unit to create a simple thermostat. It's fun information to have, so I've kept it.
But they sensors are clunky wired units with some nasty quirks; for example on Friday it said the temperature inside remained exactly 77.1 degrees for about 20 hours straight. There are a couple spots that it will get "stuck" like that, and it limits the possibilities for me to lay things out (server + wire must reach out the window to keep outdoor data).
I've meant for quite some time to build something better. I have an esp8266 wireless unit bought on impulse lying around, at bottom left of the image besides this text. I've also got some DHT11 sensors I could hook up to it. Those are the little blue boxes in the top right, three in the tray they came in and one actively hooked up. And working!
But the DHT11 turns out to be awful. It only gives 1 degree Celsius resolution, so about two degrees Fahrenheit; I'd prefer something like 0.1 degree F resolution. It also does humidity which is nice, but with similarly lackluster abilities.
In my last electronics parts order I grabbed a few DS75 chips, which can do temperature to 0.0625°C resolution. It's sitting on the green board in the bottom right of the picture; next thing to do is to try to talk to it!
Update, on the 6th: I've got the DS75 hooked up and working and I can indeed get my 0.1°F or so readings out of it. I know for sure because I can watch it heat up a bit as I touch it with my finger, and cool off when I let go.
I recently became the proud owner of a Raspberry Pi Zero. An amazing little gadget for its $5 price point! But as a result the features are a bit spare. When I found this RPi WiFi project on Hackaday I was hooked, I needed to have one. But it's not available, yet.
The original project is more ambitious than my adaptation of it. I only put the ESP module and a breakout for (power and) serial data. A stacking header mates with male header pins attached to the Zero, and voila! The original seemed to be called "WiFi Pants", with my simpler version intended to work with the Pi Zero, I chose to call mine "Zero Pants".
There's just one caveat: it doesn't start at boot. I'm pretty confident this is because I'm using the ESP-12-E module, which is set up with embedded flash and program to run. So I have to do the GPIO twiddle in step 10 of the instructions. But that causes a kernel panic. Actually what I need to do, so I have for now as a script file, is:
Remove the kernel module first, then toggle the GPIO pin to cause the ESP to restart. The module automatically reloads itself, and if you have a valid wpa_supplicant.conf set up, it connects in just a few moments.
Plus I needed to patch the esp8089 module to get it to compile for the recent kernel I got by following the instructions. (As mentioned in the comments.) But hey, it was a nice fun small project!
I ended up not installing either of the LEDs in this, the second module that I assembled. I got something wrong so the power LED was unnecessarily bright, and the "init" LED did indeed blink correctly to let me know the GPIO was twiddled. But it's normally high, so stays on the whole time, and also terribly dim, because it's being powered through the (I assume?) processor's internal pullup resistor. So no need to keep that!
Historically, the SAM8 and SAM88 CPUs that are the core of the S3 Family were based on Zilog’s efficient Z8 architecture. For Zilog to introduce the S3 Family is simply a natural evolution culminating in a cooperative agreement between IXYS and Samsung.
IXYS Corporation, parent company of legacy and legendary microcontroller manufacturer Zilog, has entered into an agreement to purchase 4-bit and 8-bit Flash microcontroller product lines from South Korean semiconductor manufacturer Samsung Electronics for $50 Million.
This nugget of info helped me find the S3 Embedded Flash Serial Programming document (mirrored at archive.org and locally), which at first seemed very promising. The best I could find from the datasheet was vague references to "tool mode" which the TEST pin could set, but not whether it's active high or low, and also a NRESET pin with no polarity/value indication, and SDAT/SCLK which sounds like I2C. (The N in NRESET implies active low, and some vague wording implies active high for TEST, but that's not enough to go on by itself.) And no data about the protocol. But this S3 document from Zilog mentions pins with nearly identical names, has much more clear wording about the Reset and Test pins, and specifies the protocol to talk over the data line!
Unfortunately all my attempts to whip up something to talk to this chip with that protocol have failed. The Arduino is terribly easy to work with, but I've only got 5V modules, so I tried working with the 3V STM32 board I have instead. I might have been tripped up by the dual-direction data line (output at first to specify the operation, then input). Either way, I can't get the chip to respond.
Next up is the J6 header which just has two power pins and two UART interfaces. It took a little digging, but I found that UART1 spits out some data at power up, at 38400 N81; here's several repetitions:
By watching in my logic analyzer, I can see an 0x00, followed by an 8ms delay, then the 0x00 UIB0 0x01 0x0b, a 10ms delay, an 0x00, another 8ms delay, then the 0x00 UIB0 0x01 0x18. There's a clear pattern here, but I can't interpret the data. With the guts of the remote tacked down to the breadboard I can hardly interact with it. When I move it the backlight lights up, but I see no serial traffic. I can get to a few of the hard buttons beside the display, and they also have no effect.
The JTAG interface remains. But it will remain a topic for another day, as I've got learning to do before I have a chance of making progress.
For context see part 1, which has pictures and descriptions of the chips I'm referencing.
The important bits are two microcontrollers: one ARM made by ST, ("Chip 1") one 8-bit made by Samsung ("Chip 7"). I'll be referring to them as ARM and SAM8, respectively. Plus three connectors. There's J6 and J8, both close to the SAM8, both two by three standard 0.1" pitch headers, unpopulated. Then a completely unlabeled two by four arrangement of rectangular pads next to the batteries, far from any chips. I'm calling this one JX, for either eXtra or eXternal -- this one is accessible without disassembling the remote at all, just by opening the battery compartment. I've figured out what these all do, so let's share!
Just like J8 to come pin one is clearly marked as the singular square pad of the six, plus the notch on the silkscreen layout. Orient yourself so it's top left and I've chosen to label the pins counter-clockwise like a standard IC package. All of these are connected through to the ARM controller, like so:
I was quite confused for a while at the selection (port 1, pins 0 1 3 5, skipping 2 and 4??) for a while until I found, on pin 47 of its data sheet the alternate functions available on those pins, and the pattern seemed clear. I'm mildly surprised to see two UARTs broken out, perhaps the software dedicates one to sending and one to receiving, or command/debugging output, or some other combo? Or perhaps one is unused, "just in case" design. Certainly it will be interesting to check, but I doubt it will be much use on its own.
Also located just next to the SAM8, this is clearly a programming header for it:
Unfortunately data on this line of micros looks sparse. I can see these pin names, and a bare description of their function, in the data sheet, and it makes sense as a synchronous serial channel, and the TEST/nRESET pins to force it into programming mode. But what protocol goes over this channel? I surely don't know. The data sheet also has a surprising list of development tools listed, but none of them are common things. I could only find concrete evidence of one, a storefront with no price listed, which makes me think "If you have to ask how much it costs, you can't afford it." Certainly not for a hobby project! Slightly better news, I found concrete evidence of this particular micro model in use for other UEI remotes (specifically JP1.3). This is clearly the driver for the infra-red side of the remote, which works fine, so I don't need to mess with it. And maybe I can find some community reference, even if just source code, for how JP1.3 works, and maybe it's just the flashing protocol for this micro?
The main attraction was saved for last. Given the lack of markings I have to make up my own numbering scheme. So, with the remote oriented as pictured, see that it is two columns of four pads. Pin one is the top left, and they go counter clockwise from there. With that set, I can show the map to ARM pins:
Jackpot! This is clearly the JTAG debugging header for the ARM micro! This is without a doubt the next area for me to concentrate on. I know what JTAG is, but so far very little about how it works. I've got an ST-LINK device, used for STM32 (ARM Cortext) work in the past which might be enough to move forward with. And if so that should give me full access to the ARM and whatever it has stored inside, plus I think I should be able to bit-bang SPI to the external flash chip as well, at least. I've mapped its pins to the SSP0 port on the ARM, no surprise, so it's accessible that way.
Fun aside: this had me very confused at first. For the lamest of reasons: I carefully counted out the pins and double-checked them all, thanks to the narrow pitch. I knew which went where for sure, looked them up and they made no sense. Only after a few back-and-forth attempts did I finally take notice of the "pin 1" marker on the chip. It's rotated 90 degrees counter-clockwise from the "natural" orientation. Compensate for that and the JTAG pins all jumped out.