A less than 4 minutes how-to, using only Bambu Studio.


Follow below to create your own
Final product with embedded text

FreeCAD is an open-source parametric 3D modeller made primarily to design real-life objects of any size. Parametric modelling allows you to easily modify your design by going back into your model history and changing its parameters.
Designed a case for a measure tool, I’ve printed a case for a while ago.
What are my thoughts : I like it, I like the setup, workbench and the fact that you can edit every step again.
Measure diameter case using 3D printed tool
Draw case using FreeCAD
A 3D CAD mouse helps!
Below, a technical drawing exported to PDF using FreeCAD
I forgot the holes for mounting, these I did using Bambu Studio.
Resize, clone, negative boolean, selective cut, text surface, change modifier type.
Bambu studio:
I’ve made a script to view the camera using vlc. But it was much work.
Now I’ve installed the HACS Bambu integration in Home Assistant.
Much easier to get an image.
While Bambu studio is nice, I started using FreeCad.
I still use OpenScad and Blender, but I really try to use a CAD program for modeling 3D prints (technical prints). For sculpting I still use blender.
Many people are into 3D printing, more than ever. So why do I say “the lost art”?
I started my 3D printing journey in 2012.
Not having my own 3D printer, I was using the shapeways service,
Using Sketch-up I drew my first printable objects. Upload model and get it by mail.
Welllll .. lets compare.
I’ve bought a bambu labs P1S recently.
All fine and dandy, problems? Check YouTube for solutions.
What do you know about 3D printing?
People are forgetting about the knowledge to get at this point ..]…
How does it work, what is needed?
My first 3D printer.
Lets compare:
Every next print start at calibrate in above list.
What did you learn?
How your machine works and reacts.
Fix extruding problems, temperature, filament wetness, starting layers.
Difference between PLA, PETG, ABS in great detail.
Learn to wait
Troubleshooting in general
Never forget where we came from!
40 years old, but getting available to the masses after 2000.
Not a lot to tell, but much going on.
Having my own business means having a more professional electronics lab is a must.
So I’m moving from the attic to our outside workshop. That also means I have to make our Music Studio smaller.
So moving, printing a lot on my new 3D printer and designing EuroCards.
Above card will hold two address decodes parts, selectable using jumpers. ( Old skool TTL using 74xx and a new solution using ATF22V10.
We like Low Poly models, so I printed one using marble PLA.
I’ve cleaned my old 3D printer, and I am planning to convert this printer to a 2D plotter and a CNC machine.
I’ve already printed a pen holder and a dremel holder.
(The filament head will be removed)
I’m working on a Gcode writer to plot drawings using a pen, or using a Gyro-cut knife to cut paper.
And the biggest project using this old 3D printer, a CNC machine!
Test Code:
import time import serial arduino = serial.Serial('/dev/ttyUSB0', 115200, timeout=.1) # Motor stuff arduino.write(str.encode("M84 X Y Z S12000\r\n")) arduino.write(str.encode("M92 X160 Y160 Z800\r\n")) # Extrude fix arduino.write(str.encode("G92 E0\r\n")) # Go home arduino.write(str.encode("G28\r\n")) # Move to x,y,z arduino.write(str.encode("G1 Z90 X50 Y50\r\n")) # Wait arduino.write(str.encode("M400\r\n"))
Sin wave fun:
import time import serial import math from time import sleep arduino = serial.Serial('/dev/ttyUSB0', 115200, timeout=.1) arduino.write(str.encode("M84 X Y Z S12000\r\n")) arduino.write(str.encode("M92 X160 Y160 Z800\r\n")) arduino.write(str.encode("G92 E0\r\n")) arduino.write(str.encode("G28\r\n")) arduino.write(str.encode("M220 S100\r\n")) arduino.write(str.encode("G1 Z10 X60 Y60\r\n")) arduino.write(str.encode("M400\r\n")) sleep(10) count = 0 while True: newx=(math.sin(math.radians(count))*50)+60 newy=(math.cos(math.radians(count))*50)+60 newz=(math.cos(math.radians(count))*10)+20 count = count + 1 mystring="G1 Z" + str(newz) + " X" + str(newx) + " Y" + str(newy) + "\r\n" print(mystring) arduino.write(str.encode(mystring)) arduino.write(str.encode("M400\r\n")) # Not waiting for answer yet print(newx) sleep(0.1)
Weekend of music, BBQ, designing and more.
I was making a re-arrangement of a bagpipe tune. Designing a blender 3D printed light box. Cooking a Mexican BBQ dinner. Visiting a textile place with old and new weaving looms. (Which gave me some great ideas). And working on my 68000 computer.
A great weekend.
My little record player project is also in the picture, I need to re-print the parts using my new printer!
I bought a hardcopy of a book I used to design my 68000 computer.
In the US 130 dollars, in UK 8 pounds. (895 pages) (1992)
Search in pdf, flip through pages in hardcopy book!
New 3D printer
1956 days ago I’ve bought my previous printer. Time for a new one.
This one is very good in quality prints, but it is scary cloud connected by default. (And Chinese company)
See stuff like
So, LAN mode only.
And firewalled to internet.
Lets look at the Linux Bambu Lab source!
## Interesting src/slic3r/GUI/MediaPlayCtrl.cpp: url = "bambu:///rtsps___" + m_lan_user + ":" + m_lan_passwd + "@" + m_lan_ip + "/streaming/live/1?proto=rtsps"; src/slic3r/GUI/MediaPlayCtrl.cpp: url = "bambu:///rtsp___" + m_lan_user + ":" + m_lan_passwd + "@" + m_lan_ip + "/streaming/live/1?proto=rtsp"; src/slic3r/GUI/MediaPlayCtrl.cpp: url = "bambu:///rtsps___" + m_lan_user + ":" + m_lan_passwd + "@" + m_lan_ip + "/streaming/live/1?proto=rtsps"; src/slic3r/GUI/MediaPlayCtrl.cpp: url = "bambu:///rtsp___" + m_lan_user + ":" + m_lan_passwd + "@" + m_lan_ip + "/streaming/live/1?proto=rtsp"; src/slic3r/GUI/MediaFilePanel.cpp: std::string url = "bambu:///local/" + m_lan_ip + ".?port=6000&user=" + m_lan_user + "&passwd=" + m_lan_passwd; src/slic3r/GUI/MediaPlayCtrl.cpp: m_lan_user = "bblp"; src/slic3r/GUI/MediaPlayCtrl.cpp: m_lan_passwd = "bblp"; # Code grep -iR code ~/.config/BambuStudio/*conf "user_access_code": { "01P00A4331XXXXX": "331XXXXX" # NMAP Host is up (0.0084s latency). Not shown: 998 closed ports PORT STATE SERVICE 990/tcp open ftps 6000/tcp open X11
But it works! Many iterations .. almost perfect
Record player is going to be re-printed at a higher quality.
Updated python client (see previous posts)
import paho.mqtt.client as mqtt import urllib.request from time import sleep def on_connect(client, userdata, flags, rc): # The callback for when the client connects to the broker print("Connected with result code {0}".format(str(rc))) client.subscribe("spotify/rfid/idlms") client.subscribe("spotify/rfid/but1") client.subscribe("spotify/rfid/but2") client.subscribe("spotify/rfid/arm") def on_message(client, userdata, msg): # The callback for when a PUBLISH message is received from the server. print("Message received-> " + msg.topic + " " + str(msg.payload)) # Print a received msg if msg.topic == "spotify/rfid/idlms": urllib.request.urlopen("http://LMS-SERVER-IP:9000/anyurl?p0=playlistcontrol&p1=album_id:" + msg.payload.decode() + "&p2=cmd:load&player=00:04:20:16:d9:04") if msg.topic == "spotify/rfid/but1": urllib.request.urlopen("http://LMS-SERVER-IP:9000/anyurl?p0=pause&player=00:04:20:16:d9:04") sleep(1) if msg.topic == "spotify/rfid/but2": urllib.request.urlopen("http://LMS-SERVER-IP:9000/anyurl?p0=pause&pt=1&player=00:04:20:16:d9:04") sleep(1) if msg.topic == "spotify/rfid/arm": urllib.request.urlopen("http://LMS-SERVER-IP:9000/status.html?p0=button&p1=jump_fwd&player=00:04:20:16:d9:04") sleep(1) client = mqtt.Client("lmsclient") # Create instance of client with client ID “digi_mqtt_test” client.on_connect = on_connect # Define callback function for successful connection client.on_message = on_message # Define callback function for receipt of a message client.connect('MQTTSERVER', 1883) client.loop_forever() # Start daemon
Wemos INO file
#include <Arduino.h> #include <SPI.h> #include <MFRC522.h> #include <ESP8266WiFi.h> #include <WiFiClient.h> #include <PubSubClient.h> #define SS_PIN 15 #define RST_PIN 0 const int buttonPin1 = D1; const int buttonPin2 = D2; int buttonState1 = 0; int buttonState2 = 0; MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::StatusCode status; //variable to get card status byte buffer[18]; //data transfer buffer (16+2 bytes data+CRC) byte size = sizeof(buffer); uint8_t pageAddr = 0x06; //In this example we will write/read 16 bytes (page 6,7,8 and 9). //Ultraligth mem = 16 pages. 4 bytes per page. //Pages 0 to 4 are for special functions. unsigned long cardId = 0; WiFiClient net; PubSubClient client(net); const char* mqtt_server = "MQTTBROKER"; const char* ssid = "MYSSID"; const char* password = "MYWIFIPASWORD"; String topicStr = ""; byte buffer2[8]; boolean Rflag=false; int r_len; char payload[5]; byte value[5]; void setup() { Serial.begin(9600); pinMode(buttonPin1, INPUT_PULLUP); pinMode(buttonPin2, INPUT_PULLUP ); SPI.begin(); mfrc522.PCD_Init(); WiFi.mode(WIFI_AP_STA); WiFi.begin(ssid, password); client.setServer(mqtt_server, 1883); delay(100); client.setCallback(callback); delay(100); client.subscribe("spotify/rfid/in/#"); } void reconnect() { while (WiFi.waitForConnectResult() != WL_CONNECTED) { } while (!client.connected()) { String clientId = "rfid-"; clientId += String(random(0xffff), HEX); if (!client.connect(clientId.c_str(), "rfidclient", "...")) { delay(5000); } } client.subscribe("spotify/rfid/in/#"); } void callback(char* topic, byte* payload, unsigned int length) { Serial.print(F("Called")); Rflag=true; //will use in main loop r_len=length; //will use in main loop int j=0; for (j;j<length;j++) { buffer2[j]=payload[j]; //Serial.print((char)payload[j]); } if (r_len < 3) { Rflag=false; Serial.print(F("Set false")); } buffer2[j]='\0'; //terminate string } void loop() { if (!client.connected()) { reconnect(); } buttonState1 = digitalRead(buttonPin1); //Serial.print(buttonState1); if (buttonState1 == 0 ) { client.publish("spotify/rfid/but1", "0"); } buttonState2 = digitalRead(buttonPin2); //Serial.println(buttonState2); if (buttonState2 == 0 ) { client.publish("spotify/rfid/but2", "0"); } int reading = analogRead(0); //Serial.println(reading); if (reading > 500 ) { client.publish("spotify/rfid/arm", "0"); } client.loop(); if (!mfrc522.PICC_IsNewCardPresent()) { return; } if (!mfrc522.PICC_ReadCardSerial()) { return; } if (Rflag) { for (int i=0; i < 4; i++) { //data is writen in blocks of 4 bytes (4 bytes per page) status = (MFRC522::StatusCode) mfrc522.MIFARE_Ultralight_Write(pageAddr+i, &buffer2[i*4], 4); if (status != MFRC522::STATUS_OK) { return; } } Rflag=false; } cardId = getCardId(); char buffer3[10]; sprintf(buffer3, "%lu", cardId); client.publish("spotify/rfid/id", buffer3); status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(pageAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.println(F("MIFARE_Read() failed: (R)")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } Serial.println(F("Read data: ")); for (byte i = 0; i < 5; i++) { Serial.write(buffer[i]); buffer2[i]=buffer[i]; } client.publish("spotify/rfid/idlms", buffer,5); delay(1000); mfrc522.PICC_HaltA(); } unsigned long getCardId() { byte readCard[4]; for (int i = 0; i < 4; i++) { readCard[i] = mfrc522.uid.uidByte[i]; } return (unsigned long)readCard[0] << 24 | (unsigned long)readCard[1] << 16 | (unsigned long)readCard[2] << 8 | (unsigned long)readCard[3]; }
Not my model, but I altered the graphics, and sizes.
See https://www.thingiverse.com/thing:23817
Very cool, you can use openscad to edit the model.
(See previous posts why I am a fan!)
Badly coloured with permanent marker.
I really need a printer like my friend Duncan!