We're making Megan Nielsen's Tania culottes, view D, again (v.1 here).

But this time we'll make them to actually fit as intended, high waisted and everything. To solve the between sizes issue we'll use Curve size 20 for the front, and size 22 for the back, to the length of the size 20.

We'll be using a bright purple linen, Gütermann thread colour 392. And we'll need an invisible zipper (in black) for the side seam, cotton stay tape to reinforce the pockets, and stiff fusible interfacing for the waistband.

And that's it really. Started by overlocking the raw edges, and it sewed up very quickly. This fabric takes a press very well, so the super narrow hem came out lovely. The missing pleat marking on my pattern did trip me up again, momentarily.

These are delightful in hot weather. I'm still not sold on high waists in general, but can admit it does work lovely here. The swish, the colour, the in-seam, so far so good.

Photo of A mid-length pair of culottes in purple linen, hanging from a black hanger against a white wardrobe.

Finished, front
Photo by [personal profile] chebe

Me Made May 2025

2025-May-31, Saturday 09:00 pm
Another MeMadeMay has come and gone. It was an especially hot May around here. I usually prefer clothing for layering, and when I have to not do that I find it difficult to convey personality with a minimal number of items. I did at least try to incorporate more of my makes, trying new combinations, styles. To variable success. But I'm skipping ahead, first the pledge;

"I, chebe, pledge to wear at least one me-made/-repaired/-altered item each day throughout May 2025.
I also pledge to prioritise finishing my in-progress alterations and repairs."

Previous years; 2021, 2023, 2024.

1st - 4th )

5th - 11th )

12th - 18th )

19th - 25th )

26th - 31st )

Conclusions? I managed all but two days this year. These were days when I just couldn't anything. I'll forgive myself. Let's analyse.

data )

So I need to make more short sleeve t-shirts, joggers, trousers, and vest tops. Also felt a lack of layering pieces by way of loose shirts and light cardigans (smart and casual), and I just want jeans (still working up to it). I also seem to have worked my way back to preferring slightly more fitted clothing again. Tenting t-shirts and tops will no longer be tolerated. Which is an issue with my Seamwork loyalty. Their style tends to be more 'modern' with a-line tops. And it just doesn't work well for me. But some of this can be mitigated by favouring fabrics with more drape.

On the other side, I got through about half my mending backlog, and all my non-t-shirt alterations (including some for relatives). And I only made two new items this month, which have been on the to-do list for a while. All in all, calling this a success.
One day, some time ago, I found myself in London, on a rather hot day, failing to find the shop I was looking for. I popped into a second-hand shop, for a little respite. And stumbled upon this unusual item that seemed like a cross between a playsuit and a jumpsuit. An item I would not normally wear. But the print of the fabric called to me. And the prospect of expanding my warm weather wardrobe seemed like a rather urgent one. I tried to try it on, but failed. The waistband, that looks like it's shirred, is actually not stretchy at all. The width of the item seemed to fit me, but I couldn't get into it to check. I figured I just needed to put in a zip, and bought it.

Details )


Photo of the original playsuit; sleeveless scoop neck, four buttons over the bust centre-front, a heavily top-stitched waistband panel, and straight knee-length hems, in an abstract tropical print of seamfoam green, chartreuse yellow, purple, light and dark blue, with black detailing, hanging from a black hanger against a white wardrobe.

Finished, front
Photo by [personal profile] chebe

McCall's M8479, woven short skirt pattern with faux-wrap options. I previously made the 'base' skirt, without any of the wrap options; v.1. Now it's time to wrap.

Details )


Front view of a black woven a-line skirt, with one gusseted pocket with flap and black clip buckle and webbing, and the right hand side wrap piece, which has four knife pleats, is strapped closed by way of the gunmetal d-rings on the left hand side, hanging from a black hanger, against a white wardrobe.

McCall's M8479, view b, finished, front view with wrap closed
Photo by [personal profile] chebe

The problem with focussing on repairs and alterations is that there is rarely anything significant enough to blog about. But I'll try and highlight the pieces that involve a bit more work as they happen.

Like these dungarees shorts. Details )


Photo of front view of black denim dungaree shorts, with triangles of black linen inserted into the side seams, hanging from a black hanger against a grey curtain.

Altered dungarees with additional side seam width
Photo by [personal profile] chebe

Digital Sparkle Collar

2025-Apr-02, Wednesday 01:00 am
History )

Collar )

Circuit )

Attachment )

Putting it all together )

Finishing touches )

Coding )

Testing )


Photo of the neopixel collar, closed, and turned on, with four wires meeting in the middle, leading to the Gemma in a translucent bright green 3d printed circular case, inside yet another in a translucent bright green 3d printed circular case, with the LEDs in various shades of green, yellow, white, and off.

Digital Sparkle Collar, with more robust case situation
Photo by [personal profile] chebe

Gemma projects revisited

2025-Mar-26, Wednesday 12:00 pm
It can be funny, what projects end up being used for a very long time. But with time comes maintenance, and possibly even improvements. Which is what happened as I was considering ways to make my beloved Gemma projects less fragile. When they were constructed I didn't have a 3d-printer, which ruled out experimentation. But I do now.

Gemma case )

Tiara )

But if we're talking about improvements around things involving Gemmas, then I'd like to present a lifetime achievement award to the maker of this JST connector extractor model. It's explicitly for micro:bits, but it's the same JST-PH form factor as used by Gemmas, Floras, and Lilypads. It is the 20 minute print that I wished I've had for the last 15 years. *applause*


Photo of two tiny bright green 3d prints, with two triangular 'hooks' at one end, and a raised area and hole at the other end for gripping.

JST-PH extractor tool
Photo by [personal profile] chebe

Compare and contrast getting normalized accelerometer values, where the raw value is -13248.00. (A.k.a. Please, make it make sense.)

Library 1; jarzebski's Arduino-MPU6050 - https://github.com/jarzebski/Arduino-MPU6050/
Library 2; Adafruit's Adafruit_MPU6050 - https://github.com/adafruit/Adafruit_MPU6050
Library 3; i2cdevlib/ElectronicCats' mpu6050 - https://github.com/ElectronicCats/mpu6050


Library 1;


code )

Formula for normalized acceleration value at MPU6050_RANGE_2G;
raw * rangePerDigit * gravityConst
(raw * (1.0/16384)) * gravityConst
== (raw / 16384) * gravityConst
(-13248.00 * .000061) * 9.80665 = -7.92502845
== (-13248.00 / 16384) * 9.80665 = -7.92959589


Library 2;


code )

Formula for normalized acceleration value at MPU6050_RANGE_2_G;
(raw / accel_scale) * gravityConst
(-13248.00 / 16384) * 9.80665 = -7.92959589


Library 3;


code )

No normalized functions in MPU6050.cpp. Can use MotionApps files, but they go through Quaternions.
code )

Formula for normalized acceleration value at MPU6050_ACCEL_FS_2;
// jarzebski way;
raw * accelerationResolution * gravityConst
-13248.00 * 0.000122 * 9.80665 = -15.850057

// adafruit way;
// (raw * (1.0/16384)) * gravityConst
// (raw * (2.0/16384)) * gravityConst
(-13248.00 / (2.0*16384)) * 9.80665 = -15.85919
((-13248.00*2.0) / 16384) * 9.80665 = -15.85919

Result is twice that of the others. accelerationResolution itself seems to be twice the others, so half it? Not sure if this is a mistake, or I'm missing something about MPU6050_ACCEL_FS_2 vs MPU6050_RANGE_2_G.
raw * (accelerationResolution/2) * gravityConst
-13248.00 * (accelerationResolution/2) * 9.80665 = -7.9250

accelerationResolution and get_acce_resolution() only exist in the ElectronicCats version, they're not accessible in the i2cdevlibs version. That version seems to really want you to use the Quaternion path. But you can always use the range values from the other versions yourself on the raw values.
The MPU-6050 is an accelerometer and gyroscope (with added thermometer), that contains a Digital Motion Processor (DMP) to handle a lot of the heavy maths lifting of turning the raw sensor values into useful motion values before they reach the microcontroller. It seems (caveat; I'm new to this area) that the original code is only available as a binary, or as some demo code. But some very determined people have pulled a library together.

/* Source is from the InvenSense MotionApps v2 demo code. Original source is
 * unavailable, unless you happen to be amazing as decompiling binary by
 * hand (in which case, please contact me, and I'm totally serious).
 *
 * Also, I'd like to offer many, many thanks to Noah Zerkin for all of the
 * DMP reverse-engineering he did to help make this bit of wizardry
 * possible.
 */


Well, actually, it seems quite a lot of people have pulled libraries together, to different levels of functionality, with very similar names. But the one most people seem to use is this one. Which includes the MotionApps files. This is important, not just for the right function calls, but because you need other libraries from this collection as well, particularly the I2Cdev one. These libraries, although for Arduino, are not findable inside the Arduino IDE's Library Manager. You need to side-load them, old school style. Which means downloading and extracting the .zip file. Then copying the specific libraries (being the folders that contain an 'Examples' folder as a first level child) for MPU6050 and I2Cdev into your Arduino > libraries folder. And restarting the IDE.

(I've also, after the fact, found what seems to be a copy of the MPU6050 library in an ElectronicCats repo, that is in the Library Manager, and seems to have rolled the I2Cdev code into itself. But the oldest change here seems to be 6 years ago. Whereas the i2cdevlib seems to be about 13 years ago. It does seem to have more recent updates than i2cdevlib though. So the choice is yours. I'm telling you, it's a nightmare finding what's what, especially when the code linking to it won't even compile with it.)

To help us get a feel for how the boards movements are interpreted, there's a nice demo we can try out. You can find the MPUTeapot Processing project inside the MPU6050 Arduino library; MPU6050 > examples > MPU6050_DMP6 > Processing > MPUTeapot.

First step is to install Processing. I'm using P4. Copy that MPUTeapot.pde file into a new sketch (or the whole folder to wherever you save your sketches). This sketch requires another stack of libraries, the Toxi/c libraries, which we need to side-load again. Download the newest release, extract the .zip file, and copy the libraries (being the folders that contain an 'examples' folder as a first level child) into your Processing > Libraries folder. Restart Processing.

Illustration of Arduino Mega board wired up to MPU6050 board as described below.

MPU6050 Circuit
Made with Fritzing



Wire up your MPU6050 to your Arduino (I'm using the Mega 2560). You need to connect the Interrupt pin to Digital pin 02 (on most Arduino boards). SDA -> SDA. SCL -> SCL. VCC -> 5V. GND -> GND.

Open the MPU6050 > MPU6050_DMP6 example, and load it onto your Arduino. By default it runs in readable yaw-pitch-roll mode. Open the Serial Monitor at 115200 baud. After finding and initialising your MPU6050 it will await char input. Send any char, and you'll get a lot of lines like;
DMP ready! Waiting for first interrupt...
ypr	0.01	-0.01	0.44
ypr	0.01	-0.01	0.44
ypr	0.01	-0.01	0.44
ypr	0.01	-0.01	0.43

Which are your yaw-pitch-roll Euler angles in degrees.

If you comment out the #define OUTPUT_READABLE_YAWPITCHROLL line, and uncomment the #define OUTPUT_TEAPOT line you'll prepare the code for use with the Processing demo. Instead of nice readable yaw-pitch-roll values the info is packed into a 42-byte FIFO packet buffer; [quat w][][quat x][][quat y][][quat z][][gyro x][][gyro y][][gyro z][][accl x][][accl y][][accl z][][]. Upload to your Arduino.

Moving over to Processing now, open the MPUTeapot demo. I find it nostalgic that this is running in OpenGL mode. If you want to increase the window size, go ahead and do that. Otherwise you just need to set the correct portName. For me that meant commenting out line 72, and uncommenting line 75, while updating line 75 to say "COM7". The demo is straight-forward, handling the drawing of the virtual plane, reading and unpacking the packets back to quaternion w,x,y,z values, and handing off the complications to the Toxi/c libraries. But when it works it's a lot of fun to manipulate the virtual plane by moving your MPU6050. And really helps you connect the board movement to what you want your project to detect/react to, in your mind.

Animation of a block plane (red board, green wings and tail fin, blue nose cone) rotating in 3D space.

MPUTeapot demo
Gif by [personal profile] chebe

MG90D Servos with Arduino

2025-Mar-12, Wednesday 12:00 pm
Take one Arduino Uno, and run some servos. Seemed straight-forward. Seemed.

Firstly, I couldn't find any Unos or Duemilanoves, I must have used them all. Guess it's time to finally break out the Mega 2560.

The servos are the MG90D micro servos. And using the Servo.h library.

Basic circuit set up like the sweep tutorial; on a breadboard, using a 100 µF capacitor (servo is 4.8V to 6V DC voltage), and external 9V power supply. Sweep worked fine, but setting exact angles via write() would only sometimes work.

Illustration of Arduino Mega board, with 9V power source, connected to a servo with power through a breadboard with capacitor, and connected to Digital/PWM pin 09.

Servo Circuit
Made with Fritzing



After some poking around I learned that I needed to set the minimum and maximum pulse lengths for these particular servos. (The values from the product description on Adafruit. Also note, this servo will 'hold' the position even when no signal is sent.) And then I could set the degree of rotation (0°-180°) as expected.


#include <Servo.h>

Servo myServo;

int minPulseWidth = 750; // µs == 0.75ms
int maxPulseWidth = 2250; // µs == 2.25ms

void setup()
{
  myServo.attach(9, minPulseWidth, maxPulseWidth); // digital pin (with PWM) 9
}

void loop()
{
  myServo.write(90); // angle in degrees, 0-180
  delay(1000); // ms
  myServo.write(180); // angle in degrees, 0-180
  delay(1000); // ms
  myServo.write(0); // angle in degrees, 0-180
  delay(1000); // ms
}