Monday, September 26, 2022

Stuck on a bug...

 After getting 1300 lines deep, the code has started to develop a bug. While running gait timers for leg/servo movement, Bluetooth disconnects and the program hangs... I've tried debugging and the error goes away if I had a serial.print()... but that is odd that it would fix it. I know that adding serial communication can sometimes take more time for a process... 

Anyway, I'm going to try running some multicore examples from

Thursday, August 11, 2022

Pinky: Android RC control over Bluetooth to Arduino Nano PR2040 Connect.

 For remote control of Pinky the octobot I had a choice of wifi, Bluetooth, or an old drone TX and RX set up. I'm choosing to go with Bluetooth because everybody with a phone has the capability in their pockets. The old drone RX/TX setup would require additional components and take up internal cavity space in the robot. After two nights of testing I finally got BLE working last night by following these resources:

Tonight, 8/11/22, I'll try and build a joystick and control scheme into the app inventor to push command controls to the Arduino. After that, I'll try to port Pinky's old micropython codebase to the Arduino programming language and convert all of its classes to headers....
Finally got an app I am okay with. The code is vast, so if you want to see it, just download it to view it outside your browser.
Time to start working on the arduino code.
#include <ArduinoBLE.h>

#include <Arduino_LSM6DSOX.h>

BLEService RCService("27810000-4786-42e7-bd27-45257b2e988f"); // BLE LED Service
// BLE AppInventorRC Characteristic - custom 128-bit UUID, read and writable by central
BLEIntCharacteristic RC_AngleCharacteristic("27810001-4786-42e7-bd27-45257b2e988f", BLERead | BLEWrite | BLEWriteWithoutResponse);
BLEIntCharacteristic RC_SpeedCharacteristic("27810002-4786-42e7-bd27-45257b2e988f", BLERead | BLEWrite | BLEWriteWithoutResponse);
BLEIntCharacteristic RC_HeightCharacteristic("27810003-4786-42e7-bd27-45257b2e988f", BLERead | BLEWrite | BLEWriteWithoutResponse);
BLEIntCharacteristic RC_RotationCharacteristic("27810004-4786-42e7-bd27-45257b2e988f", BLERead | BLEWrite | BLEWriteWithoutResponse);

int LastSpeed = 0;
int LastAngle = 0;
int LastHeight = 0;
int LastRot = 0;

int tick = 0;
bool CentralConnected = 0;
float x, y, z;

void setup() {
  // begin initialization
  if (!BLE.begin()) {
    Serial.println("starting Bluetooth® Low Energy failed!");

  // set advertised local name and service UUID:
  // add the characteristics to the service
  // add service
  // start advertising
  Serial.println("Pinky Peripheral, waiting for connections....");
  //IMU stuff
  if (!IMU.begin()) {
    Serial.println("Failed to initialize IMU!");
    while (1);
    Serial.print("Gyroscope sample rate = ");
  Serial.println(" Hz");
  Serial.println("Gyroscope in degrees/second");
void loop() {
  // listen for BLE peripherals to connect:
  BLEDevice central = BLE.central();
  // if a central is connected to peripheral:
  if (central) {
    if (!CentralConnected){
      Serial.print("Connected to central: ");
      // print the central's MAC address:
      // while the central is still connected to peripheral:
      CentralConnected = 1;
    while (central.connected()) {
      //Serial.print("Waiting for the write thing: ");
      //delay(100);//This causes hangs / crashes
      if (RC_AngleCharacteristic.written() || RC_SpeedCharacteristic.written() || RC_HeightCharacteristic.written() || RC_RotationCharacteristic.written()) {
        //Debounce the BLE
        if (LastAngle != RC_AngleCharacteristic.value() || LastSpeed != RC_SpeedCharacteristic.value() || LastHeight != RC_HeightCharacteristic.value() || LastRot != RC_RotationCharacteristic.value()){
        Serial.print("Angle: ");
        Serial.print(" Speed: ");
        Serial.print(" Height: ");
        Serial.print(" Rotation: ");
        LastAngle = RC_AngleCharacteristic.value();
        LastSpeed = RC_SpeedCharacteristic.value();
        LastHeight = RC_HeightCharacteristic.value();
        LastRot = RC_RotationCharacteristic.value();

      // if (IMU.gyroscopeAvailable()) {
      // IMU.readGyroscope(x, y, z);

      // Serial.print(x);
      // Serial.print('\t');
      // Serial.print(y);
      // Serial.print('\t');
      // Serial.println(z);
      // when the central disconnects, print it out:
      Serial.print(F("Disconnected from central: "));
      CentralConnected = 0;

Thursday, May 12, 2022

Modified Integza pneumatic motor

Experimenting with the Integza Wankel for semester 3 project at Bellingham Technical College:

^3D printed Fused Filament Fabrication(FFF) PETG^
  • Modified the shaft to be longer and added a spline for energy transfer to a gear(bevel). Not sure how much torque transfer is capable of being delivered. Yet!
  • Modified the lid with 3.25M bolt holes, a wider shaft hole to fit a 688z (8 x 16 x 5mm) bearing, and chamfered bearing shaft hole to clear the 688z's inner race from catching. WORKS!
  • New 6802-RS bearing (15 x 24 x 5mm) required press-fitting. I might reduce the printed dimensions in the future. This solution is more rigid but has more friction than a 3D printed plain bearing.
  • The rotor needs to be sanded, it is too tall by 0.1 mm-ish. WORKS!
  • The pneumatic fittings are too big for the case and cracked the I/O ports. Remodeled with 9.75 mm ports, no threading added yet.
  • 9.75 was too big(wasted time, plastic, electricity). Pictured below, left.
  •  9.625 mm ID with .4 x 2mm chamfer works, tested on a subsection. Pictured below, upper right.
  • The next test is adding threads. I imported the fitting model into fusion 360 from the McMaster catalog.6 mm OD, 3/8threads.

Tuesday, October 19, 2021

Bellingham MakerFaire Results

Gallery of Bellingham Makerfaire interactive booth results:

1st firing (bisque)

All of these were designed on the spot 10/9/21 by 1st-time users of my sculpting software built for the makerfaire the week before (see previous post).

Monday, October 4, 2021


Use your hands to make digital vases that will be 3d printed out of porcelain!



2. My install of TD88 no longer works with my leap motion devices. I guess that is to be expected since I haven't tried to use these together in almost a DECADE...Thanks to this video the leap motion is running again.

3. Figure out what the heck to do next...

4. 10/4/21
Day2: Make it better! Added limits for over and underhangs. Find a way to save to .obj files. The geometry types had to be a certain kind for the points in OBJ files to work. OBJ saver found in the Touchdesigner forums with a simple search.

5. 10/6/21
Day3: Test slicing, it works! Simplify 3d can turn my monsters into art! Tested the UI on Mike and Deb today, it was okay, but Deb's laptop doesn't handle live SOP updates very well. Tested around 5 fps on the studio laptop.
Steps for tonight: add highlights to the layer being moved, maybe a color change. Build out the performance UI to include multiple views (X&Z) plus an overhead map of the hand vs geo.

6. 10/8/21 Added a user interface with front and side views, as well as measurements, and a save indicator.
Here is an exported obj file:

Wednesday, September 29, 2021

After years... this is a life changer.  I feel grateful and stupid. For anybody that has a second 4k monitor.

Saturday, September 11, 2021