Transfer Files From Phone to PC Easily

I have a Pixel phone that for some reason always disconnects when I try to transfer files over USB to my laptop. it is almost full of pics and videos since I can’t really transfer them off. I finally filled the phone up and had to make space, so I figured out the method I’m going to use from now on to transfer files on and off my phone.

I set my phone up to be a simple little WebDAV server. This allows me to very easily map it as a network drive in windows and transfer files at will.

I downloaded HTTP File Server (+WebDAV ) on my phone. Then I opened it and clicked the “Start button to start the server. Obviously you have to give this app file permissions for it to work.

Then on my PC, I mapped the drive by right-clicking the “This PC” and selected “Map Network Drive:

 

Then type in the address from the HTTP Server app.

Once this is done you can access the file from the phone via whatever drive letter you selected when you mapped it. In the above image the drive is the Y:/

 

COM Port Name Pop-up

When working with microcontrollers, especially helping students debug their work, I hate having to open device manager or a serial terminal to search for the serial port name of the device I most recently plugged in.  I wrote a small python script to hook into Window’s notification system to know when a new COM port has been plugged in, and then display its name in a popup window.

The first step in this was to find out when something is plugged in.  I tried all sorts of things with windows event viewer to see if I could detect this because I didn’t want to have yet another service running in the background on my PC eating resources all the time, and I wanted the reaction to be fast, so polling every 10 seconds or something would be too long to wait for a popup.  Alas, I couldn’t find any way to get USB port data to trigger an event in windows when you plug in a USB port.

Looking online for examples I only seemed to find C# or VS code.  I’m not installing anything more to develop this one project, and at first I wanted to see if there was a cross-platform solution since I was going to have to write it all from scratch.  Eventually I settled on a windows-only solution because I found an excellent site that is full of good code examples for win32 python interfacing from a user’s post on stackoverflow. these kinds of sites are few and far between, so I’m glad I came across it!  This code example connects into Windows Notification center and WMI (Windows Management Interface) to detect when USB items are plugged in. You can detect drives, networking, and serial ports based on the example in the link.

Once this info is gathered, the next step is to create a popup with the COM port name. For this I came across an example using the plyer library for python which is dead-simple.

When you run python code, by default, the command window is always visible, so I tried a few things to hide it. Firstly, you should be able to just use pythonw.exe instead of python to run the code and it should hide the window. For some reason, this didn’t always work. The next thing I tried was using the win32 library in python. This grabs the foreground window and hides it. Since the foreground window is likely this python script, it works fine. Running it sometimes takes a faction of a second for it to hide the window so sometimes you see it flash a command window.

The final step is to have this app start when you turn on the computer. Some folks said you could just put your python file into the windows startup folder, but this never worked for me. Instead, I keep the python script in my installations folder (where I keep all my useful apps) and I wrote a batch script to run the python code. I saved the batch script into my startup folder and rebooted.  It works great and doesn’t use many resources at all!

Get my python code and batch script here.  If you use it, let me know in a comment.

Now,  if you use linux or mac, I recommend you check out usb-ser-mon which has some of the same functionality of detecting plugged-in devices. Then you can use the same plyer code to generate a popup from what I understand.

Making Procedurally Generating Spalting Patterns

I did this a while back, but someone had an interest in this on hackaday so I tried to dig up my old code.

The goal is to generate wood grain patterns for laser cutting/CNC of plywood. Mainly, I wanted to have something similar to spalted maple laser etched onto the plain birch veneered plywood. The thing that inspired this project was this post of speaker boxes on imgur I came across. The design looked really cool, and while spalted maple is expensive, birch plywood is relatively cheap.

My first step was to procedurally create a random pattern.  Similar to the imgur post, I looked at creating camouflage. I found a great example code on openprocessing by ThingOnItsOwn that used perlin noise to create a camouflage pattern. I tweaked the values a bit experimentally, then stretched the entire design to make the final design look more like woodgrain.

The next step was to just capture the edges of these blob shapes from the first pattern. I came across this example from Richard Bourne It is forked from this example from R. Luke DuBois.   Honestly I was being lazy because I had written edge detection code in college as it is standard image processing, but I knew someone else had it already in processing. Instead of using for loops, this version manually calculates out the kernel.

This leaves me with a result that looks pretty realistic.

Camo:

Spalting:

This creates a PNG filetype which can be used to add texture to a 3D print in the slicer. The slicer will adjust the print to incorporate the texture in 3D giving it a woodgrain-like effect. You technically could use this as-is on a laser cutter to create spalting like my inspiration, however being raster data, it would take the laser a long time. It’d have to scan the laser (the thickness of a human hair) across the entire area of the panel you are applying the texture on. To make this faster, you can vectorize the PNG in inkscape or other software to outline the dark areas of the PNG.  This will cut fast as it is a vector (the laser would just have to draw the lines the same way your hand would. That would save a lot of time.

If anyone wants to add vectorizing to my code, please do! You can clone my github and put it on P5.js. I was going to add it, but I got lazy again. I even asked ChatGPT3 to help combine this code with something like potrace or imagetracerjs but it produced code that looked great, some even compiled after a few tweaks, but never worked.

Ultimate List of Tips, Tricks, and Tutorials for Fab Lab Students

This post is a not on a lot of techniques for using different types of machines and processes for making stuff. I’ve had this for years but decided to finally publish it. I’ll add to it periodically, but I figured others might find it useful as well. RIGHT-CLICK to open in new windows.

Laser Cutting:

Embedded Systems, Microcontrollers, and Arduino

Circuit Board design and Fabrication:

3D Printing:

Casting and Mould Making:

CNC:

Machines:

Mechanical:

Metal-Bending:

Miscellaneous:

 

 

================================================

My favorite Fabrication-related researchers:

Dr. Stephanie Meuller at MIT’s research group

Dr. Patrick Baudisch at Hasso Plattner Institute Human computer interaction reserach group

 

Teaching Research:

Sketchnoting basics

Graphic Recording

Sketchnote travel journal to get started

Control Theory:

Brian Douglas’s awesome youtube channel explains Control with some great examples.

Kat Kim has another great channel on Controls as well as other Electrical and Computer engineering examples and lectures

George Gillard has a great whitepaper explaining PID controls

Another great PID example is from this Reddit thread

Learning Math concepts:

MathVault – Learn higher-level (college-level) math concepts more intuitively

BetterExplained.com ADEPT model for learning math intuitively

Good sources of materials:

XXXXXXXXXXX    Todo when I’m not so busy or lazy: XXXXXXXXXXXXX

Add sections for PCL shapelock and other named plastics to ultimate FabLab list.

Also add cardboard modeling guy and nibbler tool

Add anodizing alum and titanium, bluing/blacking steel,

And interesting research I like with lasers  hydrographics and uv printers and metal hologram art

How to fix MPLabx ‘s Errors

I recently taught a class utilizing PIC chips and MPlabx. This is the first time I used PIC chips in about 20 years. I have to say, it has been one of the most frustrating experiences I have had programming chips in a very long time.  MPlabx is a modified version of Netbeans, with which I am intimately familiar with as I used it for my graduate work. My class had an impossibly hard time consistently programming chips. This page documents some of the ways we fixed the problem.

While coding, sometimes, seemingly randomly, MPLabx will start throwing underlining things and start throwing errors such as “TRISA no defined.”  It is as if the link to the libraries gets severed. I have no clue why this happens, but two things seem to fix it.  1. Save the file you are editing because sometimes it is just that the changes you’ve made have not been saved and it can’t find some of the declarations for things. 2. When the problem persists or actually won’t compile, then you have to Restart MPlabx.  Once it loads up again, it will re-register all the library paths and all is well. If this doesn’t fix the problem, then check the errors and make sure you have the correct number of  curly bracket “}” and in the right places.  Remember, no executable code can exist outside of functions except global declarations.

 

Programming issues:

One of the biggest issues was powering the circuit. By default, every project expects your circuit to be powered externally.  The programmer even has a pin dedicated to sensing this voltage and stopping everything if it isn’t sensed.  You have 2 options. Either power the circuit externally, or you can go to project properties, Conf–>PIckit4 (or whatever programmer you have)  and select “power” from the dropdown and checking to power the board. Check the box next to “Power target from…”

This will only work if your circuit is low-powered. If you need a significant amount of power, then you must power the board separately and make sure this setting is NOT checked. Sometimes this can prevent the chip from programming, but more on this later.

Programming Pins:

The programmers only have a few pins that are used on the processor, but those are very important.

Memclr/Reset: This pin basically tells the processor it is being reprogrammed. (There’s more to it, but out of the scope of this post).

Target voltage: This senses whether or not the processor has power. If not, then the programmer won’t attempt to talk to it and will instead error out.

PGD: Programmer data.  This is often on a standard port pin, so if programming keeps failing, isolate this pin form anything else. ie. remove all externally connected things like buttons, LEDs, whatever else you might have connected to this pin and only connect the programmer.

PGC:  Programmer clock. The same applies from above.

Gnd: Communication required a shared ground so make sure this is connected correctly.

If the PGD, PGC, and GND are not connected correctly, you’ll often get the following type of error:

Target Device ID (0x0) is an Invalid Device ID. Please check your connections to the Target Device.

Each processor has a special register that contains a number identifying what type of chip it is. The programmer requests this info before programming so it won’t accidently brick the chip by writing to it in the wrong places. The device ID is NEVER 0x0 for any processor. If you see this error that means that the programmer was unable to get a correct value from the PGD pin. Check your connections for shorts, opens, and remove any circuitry attached to the programming pins except the programmer itself.

Otherwise, you might get something like the following:

Target Device ID (0x6750000) is an Invalid Device ID. Please check your connections to the Target Device.

This error shows that a value number was returned, however this doesn’t match the chip your project is set to compile for.  Check your program properties and make sure the chip number matches the part number labeled on the processor itself.

Programmer Quality:

While not do or die, I will say that a good programmer is helpful.  Don’t get me wrong, I’ve cobbled together some super janky programmers back in the day that have worked, but having a quality device certainly helps troubleshoot.  We originally started using PICkit3 programmer (without the Microchip logo, which I think indicates they are clones).  For about 2 weeks, while it worked about 80% of the time on my laptop, having a class of laptops with different configurations ,etc. led us to have such problems that I searched for other solutions.  The first thing that helped was to use the MicrostickII and solder up a converter board that converted the programming pinout to a programing cable.  This solved the problem for a few students.

Eventually I was approved to buy official PICkit4 programmers, which seemed to help even more.  However unexpectedly and randomly, some folks still had a warning pop up suddenly, after successfully programming multiple times in a row, which prevented them from having success.  There would be absolutely no hardware or settings changes, only small tweaks to the code, but suddenly the chips would refuse programming.

Though there were multiple error, the most common was

Programming did not complete.
You are trying to change protected boot memory. In order to do this you must select the “Boot, Secure and General Segments” option on the debug tool Secure Segment properties page.

Attempt 1 (rarely successful): Some folks online suggested manually erasing the chip first, then trying to program.  This rarely works.

Attempt 2 (sometimes successful): Maybe your circuit requires more power than your programmer or USB can provide. Go in the settings as described above and uncheck “Power target circuit…”  and make sure to provide an external power source.

Attempt 3 (sometimes successful): Again, this is after multiple successful attempts and no hardware or program setting changes.   My predecessor told me that when this happens, the fix is typically to do the following:  Open the project properties, Select Conf–>PicKit4 (or whatever programmer you have) then select “Memories” from the dropdown and change it from “Automatic” to “Manual”  then click “Apply”  Then click it back to “Automatic” and apply then click OK.  This seems to work sometimes

Attempt 3 (the actual fix): Well, I could have just read the error message because it tells you just what to do… kind of.  Open project properties: –>Conf->PICkit4 then from the dropdown, select “Secure Segment” and change the “Segments to be programmed” to “Boot, Secure and General Segments”

Why is this not default?   Why does it work multiple times, then suddenly require this change?  Who knows?  I would absolutely love an explanation for this behavior.

 

 

After successfully programming for a n hour or so, a new error I inexplicably received suddenly appears as follows:

Erasing…
[config mem] 0xf80000, expected 0xcf, got 0x0.
You have set the program speed to Normal. The circuit on your board may require you to slow the speed down. Please change the setting in the tool properties to low and try the operation again.
Programming did not complete.

Changing programing speeds does nothing:

Erasing…
[config mem] 0xf80000, expected 0xcf, got 0x0.
Programming did not complete.

If you run into this, disconnect power to your chip and programmer, and plug it all back in. Sometimes this requires you just unplug your programmer from USB and replug the programmer to your computer.   Again, this happens when I’ve been successfully programming for an hour or so, literally nothing changes except tweaks to my code, and suddenly nothing wants to work. No explanation for as to why this happens.