Compare commits
184 Commits
a08ed6c5a8
...
main
Author | SHA1 | Date | |
---|---|---|---|
774f7f41d6 | |||
2a585ff318 | |||
e700818a2f | |||
6be2d84f05 | |||
d943d6239e | |||
7a4b75c0a3 | |||
a46ad186db | |||
7b3c164c6d | |||
9da84bb7a8 | |||
1009a14673 | |||
2d1a6ae1f6 | |||
d099aac466 | |||
c4c56efb7a | |||
e975e5a93b | |||
e43a469647 | |||
f156423f8b | |||
f892d78745 | |||
5adf888713 | |||
2dd30990bc | |||
5104f71dc6 | |||
7b81c1dda8 | |||
a1d488be28 | |||
27935b52fb | |||
c3a9ff919d | |||
7cea94942a | |||
66a25a0606 | |||
2440990a6e | |||
b231e7228b | |||
009f4d1861 | |||
3e94aa1e00 | |||
9b30fba225 | |||
7f79189c49 | |||
0620e8ef26 | |||
24292d2e9b | |||
ce91a4b418 | |||
a2111224b3 | |||
1519d1adad | |||
cd215c317c | |||
ed2e686233 | |||
e4ab6273b2 | |||
f9cec7ea35 | |||
a0477deb64 | |||
5161756aa1 | |||
a3957aa47d | |||
3008b5dd95 | |||
1e3dd04ba7 | |||
957926cca2 | |||
73bea72ae4 | |||
a27535e901 | |||
d1780d7134 | |||
ef8daf1a2a | |||
a20e4ef745 | |||
8be0cb4a13 | |||
a33daf2a01 | |||
e5fbd9143c | |||
b7040826db | |||
fd41c9bbdf | |||
0c2f5f6064 | |||
b11ed673ef | |||
7087a257c3 | |||
2d060cbb15 | |||
d588ab6c6e | |||
37a453fd4e | |||
66eb28f496 | |||
b9a6f40e11 | |||
e12e552bb6 | |||
d2fb4972e9 | |||
7303af6f30 | |||
fd7be4083a | |||
df2b821da4 | |||
e3a4a53347 | |||
9c7f966ad6 | |||
4f9667ba16 | |||
855b079e1f | |||
16b569c49d | |||
f5c2e0d7a6 | |||
5333816f44 | |||
fba6149cf3 | |||
a941dd8700 | |||
b65de95a4e | |||
d7a4e2f51c | |||
7eeeda4210 | |||
1b393ff12b | |||
6064097fe3 | |||
2c3788d19e | |||
911ada0146 | |||
e9c90ab8d0 | |||
3bd7a07563 | |||
f0744a5ec0 | |||
e2ba053893 | |||
8f9109cd77 | |||
ebdb548599 | |||
465c5b186a | |||
960411167a | |||
4ee9a76291 | |||
e48daca357 | |||
811e58e453 | |||
d6467bbf15 | |||
d77db17b4f | |||
24894ebd33 | |||
774af615b7 | |||
38e7ea72a8 | |||
38c49e4205 | |||
f4b257de8e | |||
3635e32259 | |||
fd037dbef2 | |||
7d9ba29209 | |||
718cbe66d8 | |||
9a1ca56ac1 | |||
cfa8a9d74e | |||
5c10f8fbfc | |||
c491110afe | |||
d007b2de8f | |||
1b580320e9 | |||
bbf72a1bdf | |||
5e6f5a62a5 | |||
7504e037f7 | |||
56f9e57501 | |||
85ab692586 | |||
1b1b429c99 | |||
4ff4f26cec | |||
228a887ad5 | |||
f68dc2c19b | |||
b7ee9decc0 | |||
f05c78e400 | |||
49fe84e1a6 | |||
76ebfd9677 | |||
011cc8ccfd | |||
5a985367f2 | |||
22c057cec7 | |||
c30a08eda2 | |||
d766c5fc98 | |||
eee588c0b0 | |||
78d969f99e | |||
d7ad2f74a4 | |||
3d3014e08d | |||
d20b7b4150 | |||
7735322d30 | |||
3ba2bc53ac | |||
d19bb98936 | |||
7977e9c2c2 | |||
be0ed9359c | |||
cc872ce7f3 | |||
7ff6bcd8b3 | |||
a30ca1f04c | |||
7c338dda33 | |||
7540575c64 | |||
866dcd6ab2 | |||
64e15dcd60 | |||
190f84a93b | |||
9e1fd7c18c | |||
8d3714b258 | |||
3000842988 | |||
54162ae667 | |||
235784f87e | |||
01c591e96e | |||
1b608469fb | |||
fb4b6b11cb | |||
3994d90a9b | |||
53ae8822c7 | |||
4d7f967daa | |||
c2ff52bc71 | |||
c7c225f2c1 | |||
2f6ac6feb8 | |||
f3ce0db138 | |||
56962166b2 | |||
b4ab726293 | |||
c833c11aef | |||
3edf04530b | |||
36ae7c5be3 | |||
8decf60bb1 | |||
36df64d871 | |||
694550ebe8 | |||
8ccc6170e4 | |||
84fffaf40d | |||
d7aecf60ea | |||
a1203b6b9d | |||
c52161f3b4 | |||
2b16ea154f | |||
83e63ccba5 | |||
84fc9a93c1 | |||
e9231e92aa | |||
bbfd4965d8 | |||
df4145c734 |
BIN
docs/Assignments/extra_research/FR-1-Traces.jpg
Normal file
After Width: | Height: | Size: 77 KiB |
64
docs/Assignments/extra_research/FR-1-traces.md
Normal file
@@ -0,0 +1,64 @@
|
||||
# FR-1 Trace lengths
|
||||
|
||||
## The experiment
|
||||
For the experiment, I used FR-1 that has a thickness of 35µm. On there I will mill 4 trace sizes (0.4 mm, 0,6 mm, 0,8 mm and 1 mm) and they all have the same length of 7.5 cm’s. The traces are separated by 1 Cm.
|
||||
|
||||

|
||||
|
||||
In this experiment I will measure the temperature of the traces with a multimeter and a thermal laser. I will also watch the board closely for any damage. Since it is FR-1 I expect it to shows signs of damage under heat
|
||||
|
||||
## Some background information
|
||||
|
||||
### Resistance
|
||||
When you decrease a PCB trace width, the resistance of the trace increases.
|
||||
Imagine a trace like a water pipe. Whenever you make it smaller the water needs more pressure to flow with the same amount of water.
|
||||
The same analogy goes for electricity. So for longer traces this is also the case that the amount of resistance increases with length.
|
||||
Whenever the resistance increases different things happen when voltage travels trough them. A higher resistance causes a voltage drop.
|
||||
This can be explained using Ohm's law
|
||||
|
||||
$$V = I \cdot R$$
|
||||
|
||||
The Voltage drop is Amperage $$I$$ times the Resistance $$R$$. So if you have a higher resistance or a lower Amperage you will get a voltage drop.
|
||||
Another side effect of having a higher resistance is that the resistor or trace will heat up more easily.
|
||||
|
||||
### Capacitance
|
||||
The capacitance of a PCB trace is the amount of energy it can hold. It works like a capacitor it stores a small amount of energy.
|
||||
The capacitance is determined by the amount of copper is in the trace. So length, width and the thickness. When working with low frequency signals the capacitance is not super important.
|
||||
But when working with higher speed frequencies the capacitance can actually mess up the signal integrity.
|
||||
|
||||
## Heat generation
|
||||
Heat within traces is generated by the current flowing through it. Not the wattage. A good example of the is train lines. These run on 230.000 volts on thin wires while being able to supply multiple trains. The higher the voltage the easier it is the transport a higher amount of wattage.
|
||||
|
||||
## Results
|
||||
|
||||
the power. So I grabbed an old robot with 4 stepper motors attached but I could not get them to draw more than 1.6 Amperage. So that is why the maximum in this test is 1.6 Amperage. I also had a hard time finding a way to measure the temperature of the traces because we only had a heat gun here and the laser was not the place it was actually measuring. So 0,4 mm is not measured properly.
|
||||
|
||||
| Trace Width Trace | Resistance | Maximum safe Current in Ampere | Burn out Ampere |
|
||||
| :---------------- | ---------- | ------------------------------ | --------------- |
|
||||
| 0,4mm | 3.1Ω | 0.7 | 0.85 |
|
||||
| 0,6mm | 2.7Ω | 0.9 | 1.05 |
|
||||
| 0,8mm | 2Ω | 1.6 | ?? |
|
||||
| 1mm | 1.85Ω | ?? | ?? |
|
||||
| | | | |
|
||||
|
||||
|
||||
* The 0,4 mm trace was the first one I tested. I started with 0.7 amps for a few seconds. After that I increased the wattage to 0.85 amps and the trace instantly exploded and burned so I could not get temperature readings there.
|
||||
|
||||
* The 0,6 mm trace it held up well up to 0.9 amps where it started getting burn marks within a 5-10 seconds. The temperature rose to 50 degrees celsius. At 1.05 amps the pcb burned out at 68 degrees celsius.
|
||||
|
||||
* When testing the 0,8 mm trace I hit a roof with how much power I could consume with the robot. I could only get up to 1.6 amps and I did not manage to break the trace after powering it for a few minutes. The maximum I found before it started discoloring was 24 watts at 54 degrees celsius. This was measured after it was left on for 2 minutes.
|
||||
|
||||
* I could not get to the 1mm trace because the robot could not draw more than 1.6 Amperage. So thats why these are not filled in the table.
|
||||
|
||||
|
||||
## Extra notes on temperature
|
||||
When something keeps fluctuating in heat it will increase in size and shrink again. This can make it so your board deteriorate faster and make traces break faster. So it isn't recommended to use high wattages in pcb traces.
|
||||
|
||||
## Recommendations for next time
|
||||
Make bigger pads to hookup the power easier to the pcb and maybe remove all the excess copper but that takes a super long time.
|
||||
|
||||

|
||||

|
||||
|
||||
## Files
|
||||
* [KiCad](TraceThicknesTest.zip)
|
BIN
docs/Assignments/extra_research/TraceThicknesTest.zip
Normal file
BIN
docs/Assignments/extra_research/image-1.jpg
Normal file
After Width: | Height: | Size: 81 KiB |
BIN
docs/Assignments/extra_research/image.jpg
Normal file
After Width: | Height: | Size: 91 KiB |
@@ -115,7 +115,7 @@ Third image where we did everything right
|
||||
#### Focus test
|
||||
One of the lines of the focus test didn't go right because it was near an edge and the line bend. So we can't use of the lines to conclude something.
|
||||

|
||||
You can see it start off thin then get a bit wider and then smaller. So the laser is focused, unfocused then focused. It's hard to see but its visible with the middle line
|
||||
You can see it start off thin then get a bit wider and then smaller. So the laser is focused, unfocused then focused. It's hard to see but its visible with the middle line.
|
||||
|
||||
#### Extra Acrylic things
|
||||
You can mend acrylic together using acetone. You can also remove the laser frequently lines using acetone. It's a powerful chemical that can do a lot with acrylic.
|
||||
@@ -219,4 +219,3 @@ Connects through webusb but doesn't work
|
||||
|
||||
|
||||
|
||||
Focus is always the same for every mateiral because of the laser
|
Before Width: | Height: | Size: 474 KiB After Width: | Height: | Size: 474 KiB |
Before Width: | Height: | Size: 368 KiB After Width: | Height: | Size: 368 KiB |
BIN
docs/Assignments/week_04_programming/IMG_8200.jpg
Normal file
After Width: | Height: | Size: 176 KiB |
BIN
docs/Assignments/week_04_programming/IMG_8212.jpg
Normal file
After Width: | Height: | Size: 361 KiB |
BIN
docs/Assignments/week_04_programming/IMG_8213.jpg
Normal file
After Width: | Height: | Size: 389 KiB |
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 77 KiB |
Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 171 KiB |
Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 92 KiB |
Before Width: | Height: | Size: 406 KiB After Width: | Height: | Size: 406 KiB |
Before Width: | Height: | Size: 327 KiB After Width: | Height: | Size: 327 KiB |
Before Width: | Height: | Size: 113 KiB After Width: | Height: | Size: 113 KiB |
Before Width: | Height: | Size: 257 KiB After Width: | Height: | Size: 257 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 148 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 116 KiB |
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 90 KiB |
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 126 KiB After Width: | Height: | Size: 126 KiB |
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 120 KiB |
BIN
docs/Assignments/week_04_programming/image-26.jpg
Normal file
After Width: | Height: | Size: 54 KiB |
BIN
docs/Assignments/week_04_programming/image-27.jpg
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
docs/Assignments/week_04_programming/image-28.jpg
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
docs/Assignments/week_04_programming/image-29.jpg
Normal file
After Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
BIN
docs/Assignments/week_04_programming/image-30.jpg
Normal file
After Width: | Height: | Size: 215 KiB |
BIN
docs/Assignments/week_04_programming/image-31.jpg
Normal file
After Width: | Height: | Size: 102 KiB |
BIN
docs/Assignments/week_04_programming/image-32.jpg
Normal file
After Width: | Height: | Size: 122 KiB |
BIN
docs/Assignments/week_04_programming/image-33.jpg
Normal file
After Width: | Height: | Size: 212 KiB |
BIN
docs/Assignments/week_04_programming/image-34.jpg
Normal file
After Width: | Height: | Size: 212 KiB |
BIN
docs/Assignments/week_04_programming/image-35.jpg
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
docs/Assignments/week_04_programming/image-36.jpg
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
docs/Assignments/week_04_programming/image-37.jpg
Normal file
After Width: | Height: | Size: 60 KiB |
BIN
docs/Assignments/week_04_programming/image-38.jpg
Normal file
After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 182 KiB After Width: | Height: | Size: 182 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 47 KiB |
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 83 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 151 KiB |
Before Width: | Height: | Size: 159 KiB After Width: | Height: | Size: 159 KiB |
@@ -3,6 +3,63 @@
|
||||
## Introduction
|
||||
I'm very familiar with coding in C++ because of my university. At the moment im studying computer sciences at the Applied University of Amsterdam.
|
||||
|
||||
|
||||
### Switching to platformIO.
|
||||
At the local lecture we got thought how to use platformIO. I was already used to Arduino IDE v2. But I found the UI and the speeds of PlatformIO very nice so that's why I decided to switch to PlatformIO.
|
||||
|
||||
First off. I created a new project with the Xiao espC3 because the espC6 isn't registered on the list. I've googled a bit and that's because PlatformIO needs to get profit so they ask money to the board developers to add the board to their platform. So we need to set the correct board later on.
|
||||

|
||||
When it created the project. I copied all the files over to the src folder and renament my drone.ino to main.cpp. Now I had a lot of include errors because Arduino IDE automatically imports everything and with PlatformIO you need to define everything yourself. So I started out in the Library manager installing all the libraries to the project I needed.
|
||||
|
||||

|
||||
|
||||
#### Setting the correct board
|
||||
|
||||
Before
|
||||
```ini
|
||||
[env:seeed_xiao_esp32c3]
|
||||
platform = espressif32
|
||||
board = seeed_xiao_esp32c3
|
||||
framework = arduino
|
||||
```
|
||||
|
||||
After
|
||||
```ini
|
||||
[env:seeed_xiao_esp32c6]
|
||||
platform = https://github.com/mnowak32/platform-espressif32.git#boards/seeed_xiao_esp32c6
|
||||
platform_packages =
|
||||
framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.2
|
||||
framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.2/esp32-arduino-libs-3.0.2.zip
|
||||
framework = arduino
|
||||
board = seeed_xiao_esp32c6
|
||||
```
|
||||
|
||||
To get the correct configuration if it isn't listed on PlatformIO, is to go to the Board manufactors website and hope there is a PlatformIO example configuration. For example this example was listed on the Xiao website. [Link](https://wiki.seeedstudio.com/xiao_esp32c6_with_platform_io/).
|
||||
|
||||
#### Installing libraries in platformIO
|
||||
To install a library click the platformIO icon. In there click the libraries button. Then you can search a library and click add to project. Now you have added a library to your project!
|
||||
|
||||

|
||||
|
||||
After that it will edit platformio.ini and there you will see the library added to the project. It's also in `.pio/libdeps`
|
||||
|
||||
### Important for linux users.
|
||||
When setting up PlatformIO on another system we ran into the issue that the machine couldn't upload the code properly. We first checked how the OS interacted with `dmesg`. `dmesg` on linux shows the kernel activity. After a while we found out we needed to install the package `platformio-udev`. What it does it add some rules for the kernel on how to handle the mcu's.
|
||||
|
||||
### Programming and compiling and uploading
|
||||
Using platformIO is really straight forward. The only folder you should look at in your platformIO project is the `src` folder.
|
||||
|
||||

|
||||
|
||||
In the main.cpp file you can write your program to run on a microcontroller.
|
||||
|
||||
On the bottom of your screen you see that there are a few new buttons.
|
||||
|
||||

|
||||
|
||||
The Compile and Upload and Serial console buttons are going to be the most used. Compile compiles the code and checks if it's correct. If it has incorrect syntax you need to correct it. The upload button compiles the code first and then sends it to the Microcontroller. The Serial console is a really nice debug tool to see what the microcontroller is doing if you added print statements in your code.
|
||||
|
||||
|
||||
## First code to read from the BNO085
|
||||
I first wanted to create the drone firmware myself. But then I looked through some research papers and existing programs and saw all the math that was needed to keep it upright. Then I decided to modify an existing program.
|
||||
This was my first attempts at getting the sensor to read
|
||||
@@ -117,93 +174,6 @@ First used the wrong library I used the Adafruit bno0xx library instead of the S
|
||||
## New driver
|
||||
After researching for a while and looking through other fab academy projects I found out that other people also made drones with micro controllers and used a pre-made driver that they customized (https://fab.cba.mit.edu/classes/863.23/Architecture/people/Zhixing/finalproject.html). After doing some research on how to keep the drone upright I also decided to use an existing driver because the math required for that is way above my level. Im gonna be using the [dRhemFlightVTOL](https://github.com/nickrehm/dRehmFlight/tree/master) driver. The only problem is that it doesn't support my Inertial measuring unit (BNO085). So I will have to customize the driver to make it work with it.
|
||||
|
||||
### Implementing the BNO085
|
||||
|
||||
### Hijacking the controls
|
||||
I need to reverse engineer the controls because now it just calls a function called radiocontrols() that manages the controls. There are 4 pwm channel that controls where the drone is going. I wanna make my own controller and simulate these pwm signals.
|
||||
```cpp
|
||||
thro_des = (channel_1_pwm - 1000.0) / 1000.0; // Between 0 and 1
|
||||
roll_des = (channel_2_pwm - 1500.0) / 500.0; // Between -1 and 1
|
||||
pitch_des = (channel_3_pwm - 1500.0) / 500.0; // Between -1 and 1
|
||||
yaw_des = (channel_4_pwm - 1500.0) / 500.0; // Between -1 and 1
|
||||
```
|
||||
From looking further in the code it has safety protocols when the channels go too low or too high so using that we have a range where the pwm speed should be.
|
||||
|
||||
```cpp
|
||||
// Triggers for failure criteria
|
||||
// Line 1260
|
||||
if (channel_1_pwm > maxVal || channel_1_pwm < minVal)
|
||||
check1 = 1;
|
||||
if (channel_2_pwm > maxVal || channel_2_pwm < minVal)
|
||||
check2 = 1;
|
||||
if (channel_3_pwm > maxVal || channel_3_pwm < minVal)
|
||||
check3 = 1;
|
||||
if (channel_4_pwm > maxVal || channel_4_pwm < minVal)
|
||||
check4 = 1;
|
||||
if (channel_5_pwm > maxVal || channel_5_pwm < minVal)
|
||||
check5 = 1;
|
||||
if (channel_6_pwm > maxVal || channel_6_pwm < minVal)
|
||||
check6 = 1;
|
||||
```
|
||||
In this case minVal is 800 an maxVal is 2200. So we need to stay between these ranges to control the drone. In theory you can send any value to the ESC because it calibrates to the lowest and highest values you give it but there is a range. From past experiences I have experienced that 12bit PWM is not sufficient, 16 bit is needed.
|
||||
|
||||
[ESC calibration](https://ardupilot.org/copter/docs/esc-calibration.html)
|
||||
|
||||
### Switching to platformIO.
|
||||
At the local lecture we got thought how to use platformIO. I was already used to Arduino IDE v2. But I found the UI and the speeds of PlatformIO very nice so that's why I decided to switch to PlatformIO.
|
||||
|
||||
First off. I created a new project with the Xiao espC3 because the espC6 isn't registered on the list. I've googled a bit and that's because PlatformIO needs to get profit so they ask money to the board developers to add the board to their platform. So we need to set the correct board later on.
|
||||

|
||||
When it created the project. I copied all the files over to the src folder and renament my drone.ino to main.cpp. Now I had a lot of include errors because Arduino IDE automatically imports everything and with PlatformIO you need to define everything yourself. So I started out in the Library manager installing all the libraries to the project I needed.
|
||||
|
||||

|
||||
|
||||
#### Setting the correct board
|
||||
|
||||
Before
|
||||
```ini
|
||||
[env:seeed_xiao_esp32c3]
|
||||
platform = espressif32
|
||||
board = seeed_xiao_esp32c3
|
||||
framework = arduino
|
||||
```
|
||||
|
||||
After
|
||||
```ini
|
||||
[env:seeed_xiao_esp32c6]
|
||||
platform = https://github.com/mnowak32/platform-espressif32.git#boards/seeed_xiao_esp32c6
|
||||
platform_packages =
|
||||
framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.2
|
||||
framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.2/esp32-arduino-libs-3.0.2.zip
|
||||
framework = arduino
|
||||
board = seeed_xiao_esp32c6
|
||||
```
|
||||
|
||||
To get the correct configuration if it isn't listed on PlatformIO, is to go to the Board manufactors website and hope there is a PlatformIO example configuration. For example this example was listed on the Xiao website. [Link](https://wiki.seeedstudio.com/xiao_esp32c6_with_platform_io/).
|
||||
|
||||
#### Installing libraries in platformIO
|
||||
To install a library click the platformIO icon. In there click the libraries button. Then you can search a library and click add to project. Now you have added a library to your project!
|
||||
|
||||

|
||||
|
||||
After that it will edit platformio.ini and there you will see the library added to the project. It's also in `.pio/libdeps`
|
||||
|
||||
### Important for linux users.
|
||||
When setting up PlatformIO on another system we ran into the issue that the machine couldn't upload the code properly. We first checked how the OS interacted with `dmesg`. `dmesg` on linux shows the kernel activity.
|
||||
|
||||
### Programming and compiling and uploading
|
||||
Using platformIO is really straight forward. The only folder you should look at in your platformIO project is the `src` folder.
|
||||
|
||||

|
||||
|
||||
In the main.cpp file you can write your program to run on a microcontroller.
|
||||
|
||||
On the bottom of your screen you see that there are a few new buttons.
|
||||
|
||||

|
||||
|
||||
The Compile and Upload and Serial console buttons are going to be the most used. Compile compiles the code and checks if it's correct. If it has incorrect syntax you need to correct it. The upload button compiles the code first and then sends it to the Microcontroller. The Serial console is a really nice debug tool to see what the microcontroller is doing if you added print statements in your code.
|
||||
|
||||
## Editing the new driver
|
||||
Adding in support for the BNO085. The original driver doesn't support the BNO085.
|
||||
I first started off searching for every instance of an existing sensor.
|
||||
@@ -222,7 +192,7 @@ The purple text are compiler flags. They tell the compiler what to do with certa
|
||||
| #elif | Same as #if except using this you can have multiple cases |
|
||||
| #include | Include a library into the code |
|
||||
| #else | If none of the cases are met this is used |
|
||||
| #error | Throws an error during compiling when it is compiled |
|
||||
| #error | Throws an error during compiling when ran by the compiler |
|
||||
| #endif | end of a #if, #elif or #else |
|
||||
|
||||
### Setting the correct library
|
||||
@@ -277,6 +247,38 @@ When attempting to compile it still throws some errors so there are still functi
|
||||

|
||||
So I will be needing to make my own case to control the drone.
|
||||
|
||||
|
||||
### Hijacking the controls from the original driver.
|
||||
I need to reverse engineer the controls because now it just calls a function called radiocontrols() that manages the controls. There are 4 pwm channel that controls where the drone is going. I wanna make my own controller and simulate these pwm signals.
|
||||
```cpp
|
||||
thro_des = (channel_1_pwm - 1000.0) / 1000.0; // Between 0 and 1
|
||||
roll_des = (channel_2_pwm - 1500.0) / 500.0; // Between -1 and 1
|
||||
pitch_des = (channel_3_pwm - 1500.0) / 500.0; // Between -1 and 1
|
||||
yaw_des = (channel_4_pwm - 1500.0) / 500.0; // Between -1 and 1
|
||||
```
|
||||
From looking further in the code it has safety protocols when the channels go too low or too high so using that we have a range where the pwm speed should be.
|
||||
|
||||
```cpp
|
||||
// Triggers for failure criteria
|
||||
// Line 1260
|
||||
if (channel_1_pwm > maxVal || channel_1_pwm < minVal)
|
||||
check1 = 1;
|
||||
if (channel_2_pwm > maxVal || channel_2_pwm < minVal)
|
||||
check2 = 1;
|
||||
if (channel_3_pwm > maxVal || channel_3_pwm < minVal)
|
||||
check3 = 1;
|
||||
if (channel_4_pwm > maxVal || channel_4_pwm < minVal)
|
||||
check4 = 1;
|
||||
if (channel_5_pwm > maxVal || channel_5_pwm < minVal)
|
||||
check5 = 1;
|
||||
if (channel_6_pwm > maxVal || channel_6_pwm < minVal)
|
||||
check6 = 1;
|
||||
```
|
||||
In this case minVal is 800 an maxVal is 2200. So we need to stay between these ranges to control the drone. In theory you can send any value to the ESC because it calibrates to the lowest and highest values you give it but there is a range. From past experiences I have experienced that 12bit PWM is not sufficient, 16 bit is needed.
|
||||
|
||||
[ESC calibration](https://ardupilot.org/copter/docs/esc-calibration.html)
|
||||
|
||||
|
||||
I wanna control to drone using another microcontroller, specifically an esp because then I can use the espNOW protocol to connect them together and get communication running between them. First I wanna make something functional before I upgrade it so that's why I'm starting out easy.
|
||||
|
||||
|
||||
@@ -286,8 +288,8 @@ Im going to start off with 2 sliding potentiometers and a espC3 for throttle and
|
||||

|
||||
|
||||
* [PotSlider](https://nl.aliexpress.com/item/1005006733220962.html) x2
|
||||
* [espC3 supermini](https://nl.aliexpress.com/item/1005008125438785.html) x1
|
||||
|
||||
* ~~[espC3 supermini](https://nl.aliexpress.com/item/1005008125438785.html) x1~~
|
||||
* [MCU changed to espC3 XIAO](https://www.seeedstudio.com/Seeed-XIAO-ESP32C3-p-5431.html)
|
||||
|
||||
### Wiring the controller
|
||||
To read the Pot meter values we need to read the resistance from the potslider. So we need analog read. When looking at the data sheet I can see that I can use pins from 0 to 5.
|
||||
@@ -457,7 +459,7 @@ I am following [this](https://randomnerdtutorials.com/esp-now-esp32-arduino-ide/
|
||||
|
||||
What I first need to do according to the tutorial is get the receiver esp their mac adress. Luckily that gets displayed when uploading to the esp.
|
||||
|
||||

|
||||

|
||||
After `MAC` there is the mac address. I've saved it in my controller code as a compiler flag `#define receiverMAC "d8:3b:da:37:66:00";` So I could use it later on. I don't know if the libraries accepts this compiler flag but I will find out soon enough.
|
||||
|
||||
I first need to create a struct with the data I wanna send. A stuct is a collection of variables named under one big variable.
|
||||
@@ -573,7 +575,7 @@ I added that it could connect to the internet and that it attempts to send data.
|
||||
|
||||
Now when I compile it I get errors that the data isn't being send correctly. The issue could be that the second microcontroller isn't turned on with the receiver code.
|
||||
|
||||

|
||||

|
||||
|
||||
#### Drone side
|
||||
|
||||
@@ -647,16 +649,16 @@ For the drone I'm going to start of with a seperate script to see if it works an
|
||||
|
||||
A weird thing I found out is that my esp32C3 Supermini doesn't work wirelessly that well. When I uploaded the code it still didn't work untill I held my finger on the antenna.
|
||||
|
||||
<video controls src="IMG_8197(1).mp4" title="Title" type="video/mp4"></video>
|
||||
<video controls src="../../../Assignments/week_4_programming/IMG_8197(1).mp4" title="Title" type="video/mp4"></video>
|
||||
|
||||
I've delved a bit deeper into it and then I found online that with the first batches of espC3 supermini's have issues with the antenna. When I was debugging it I noticed that connecting the ground to the antenne fixed it when I tried it with a pin. But when soldered on it didn't work anymore and then only thing that worked was my finger.
|
||||
I've delved a bit deeper into it and then I found online that with the first batches of espC3 supermini's have issues with the antenna. When I was debugging it I noticed that connecting the ground to the antenna fixed it when I tried it with a pin. But when soldered on it didn't work anymore and then only thing that worked was my finger.
|
||||
|
||||

|
||||

|
||||
Result of bridging ground and the antenna. Sadly didn't work. After that I grabbed the Xiao espC3 and connected it. It almost worked like a drop in replacement I only needed to change the Potpin. After that it worked flawlessly.
|
||||
|
||||

|
||||

|
||||
|
||||
Now I can start intergrating the code into the drone driver.
|
||||
Now I can start integrating the code into the drone driver.
|
||||
|
||||
The first thing I did is add the correct libraries at the top of the file. So it looks like this now
|
||||
|
||||
@@ -670,25 +672,57 @@ The first thing I did is add the correct libraries at the top of the file. So it
|
||||
|
||||
After that I added my own ESPNow define so I could use that later on in the code. I want the code to stay variable and user specified so thats why im continuing the way it was made.
|
||||
|
||||

|
||||

|
||||
|
||||
After that I added the global variables for the ESPNow protocol.
|
||||
|
||||

|
||||

|
||||
|
||||
Then I uncommented `RadioSetup()` again so it could be used again and I added a case for my ESPNow protocol.
|
||||

|
||||

|
||||
|
||||
|
||||
In the PWM receive function I added an additional case so my PWM values actually get intergrated into the code.
|
||||
|
||||

|
||||

|
||||
|
||||
At the end of the program I added the ESPNow Initialisation function and the callback function for when the data is received.
|
||||
At the end of the program I added the ESPNow Initialization function and the callback function for when the data is received.
|
||||
|
||||

|
||||

|
||||
|
||||
When I comppile it now it should work.
|
||||
When I compile it now it should work. Except that it doesn't work.
|
||||
|
||||

|
||||
From looking at the errors it looked like the PWMServo library wasn't compatible with the ESP32. When looking around on google from PWMservo libraries for the ESP32 I found the correct library on [this](https://randomnerdtutorials.com/esp32-servo-motor-web-server-arduino-ide/) website. When I added that I needed to edit the class creation to the correct library and then it finally compiles!
|
||||
|
||||
From:
|
||||

|
||||
|
||||
To:
|
||||

|
||||
|
||||
Result:
|
||||

|
||||
It compiles!
|
||||
|
||||
The next day when testing the code. The microcontroller would suddenly disconnect. First I tried setting every pin to something else because there where pins being defined the espC6 doesn't have. When I finally set the debug level to verbose.
|
||||
I did that by adding this line in my platformio.ini file. [Source](https://community.platformio.org/t/how-to-set-up-log-level-to-be-able-to-debug-the-esp32/8278)
|
||||
```ini
|
||||
build_flags = -DCORE_DEBUG_LEVEL=5
|
||||
```
|
||||
|
||||
Now I can see everything that the microcontroller is doing. I saw that it used pin 12 and 13 for USB. And somewhere in the program pin 12 and 13 where re-assigned. So I removed that it got reassigned and then the communication worked flawlessly again.
|
||||
|
||||

|
||||
|
||||
Now I can finally test. When adding debug print statements for my sensor I found out it wasn't responding. Then I looked at the pins of the sensor and found out when I re-seated it I accidentally killed it.
|
||||
|
||||
I had it like this:
|
||||

|
||||
|
||||
Instead of like this.
|
||||

|
||||
So I had the 3v3 connected to the sensor it's ground and the ground connected to the SCL pin. So that killed it.
|
||||
|
||||
## Sources
|
||||
### Code
|
||||
@@ -697,6 +731,8 @@ When I comppile it now it should work.
|
||||
* [BNO085 library examples](https://github.com/sparkfun/SparkFun_BNO080_Arduino_Library/tree/main/examples)
|
||||
* [PlatformIO espC6](https://wiki.seeedstudio.com/xiao_esp32c6_with_platform_io)
|
||||
* [ESC calibration and PWM](https://ardupilot.org/copter/docs/esc-calibration.html)
|
||||
* [ESP32PWMServo lib](https://randomnerdtutorials.com/esp32-servo-motor-web-server-arduino-ide/)
|
||||
* [PlatformIO Debug level change for ESP](https://community.platformio.org/t/how-to-set-up-log-level-to-be-able-to-debug-the-esp32/8278)
|
||||
|
||||
### Parts
|
||||
* [PotSlider](https://nl.aliexpress.com/item/1005006733220962.html)
|
238
docs/Assignments/week_05_3dprinting_and_scanning/3D_Printing.md
Normal file
@@ -0,0 +1,238 @@
|
||||
# 3D printing
|
||||
|
||||
## Hero shot
|
||||
|
||||
## Introduction
|
||||
I'm already familiar with 3D printing. I owned 2 3D printers. The ender 3 and the Bambu A1. With the Ender 3 I really learned how to repair the machines and how to configure them. With the Bambu A1 that's all kind of thrown out of the window because it does everything for you.
|
||||
|
||||
## Things to do before and after printing
|
||||
Before we started printing we need to clean the buildplate otherwise there is a chance that the print won't stick to the bed properly. And then the print would fail. Thats why we have 70% Ethanol. After printing we need to make sure the nozzle is empty, because if someone else wants to use the printer and wants to use a different filament there is a chance it will get clogged or the filament will burn because they have different melting points.
|
||||
|
||||
## Filament sizes
|
||||
On the market there are 2 different filament sizes 1,75 is currenctly the most used one. It's used in Ender, Prusa and Bambu. There is also 2.85
|
||||
|
||||
## Our printers and design rules
|
||||
We have 4 printers where ~~3~~ 2 work. We have an Ender 3, Prusa MK3S, Voron and a INFI-20.
|
||||
The Prusa works amazingly and has calibration out of the box. The ender is a bit harder to calibrate. You need to hold a piece of paper under the nozzle and rotate the knob under the bed till you feel a small bit of friction on the paper. Then that corner is calibrated.
|
||||
We also have the INFI 20 which is a bit more confusing to calibrate and I don't have expierence with it. We also have the Voron printer but Henk still needs to do some stuff with it.
|
||||
|
||||
### Design rules tests.
|
||||
#### Prusa MK3S.
|
||||

|
||||
These 3 prints where done on the Prusa printer. There are still some differences between the tests. So filament also matters when printing. They where all PLA but I don't know how old the filament was. So that could also be a variable on why it printed like this.
|
||||
|
||||
#### Ender 3
|
||||
This print was made on the ender 3.
|
||||
During printing the Ender got clogged and we couldn't continue testing on the printer.
|
||||

|
||||
|
||||
#### Repairing the ender
|
||||
During the design rules 3D print the ender got clogged and we needed to repair it.s
|
||||

|
||||
When I tried unloading the filament the motors ripped out the filament from the tube and broke it on the inside.
|
||||

|
||||
|
||||
According to Henk you see that it has under extrusion and that the cause could be that the filament got stuck. That could be a possibility because the filament leader got undone during the print.
|
||||
|
||||

|
||||

|
||||
|
||||
While unscrewing the PTFE tube from the hotend it didn't come off and was stuck. After heating the nozzle up and a lot of pulling I finally got it out.
|
||||

|
||||
This was inside the filament tube. I tried pushing on the other side with filament and it didn't come out. After that I tried pushing with an alan key and that also didn't work. After that Henk told me he would look at it.
|
||||
|
||||
|
||||
## Extra assignment from Henk
|
||||
Because I found the brick laying layer printer on github I'm gonna test the strength of the this way of 3d printing.
|
||||
|
||||
The test object. Im going to hold it on a Table and put on weights till it breaks
|
||||

|
||||
|
||||
## Bricks!
|
||||
### How do I create it using the python script?
|
||||
The [python script]((https://github.com/TengerTechnologies/Bricklayers)) is really easy to use. You need to run it in the cli and give it a path to a file and then it will convert it.
|
||||
|
||||
```bash
|
||||
python3 bricklayers.py test_1h21m_0.08mm_205C_PLA_ENDER3.gcode -extrusionMultiplier 1.2
|
||||
```
|
||||
### The prints
|
||||
#### With planar infills
|
||||
The first one I printed with an extrusionMultiplier of 1.6x.
|
||||
```bash
|
||||
python3 bricklayers.py test_1h21m_0.08mm_205C_PLA_ENDER3.gcode -extrusionMultiplier 1.6
|
||||
```
|
||||
|
||||
Infill settings
|
||||

|
||||
These settings apply to all test prints to keep consistency.
|
||||
I first printed the baseline. So I have a reference point to how strong the normal prints are.
|
||||
|
||||

|
||||
|
||||
This is the second print
|
||||

|
||||
In the second print you can see that it messed with the layer heights. But it doesn't really look like bricks. Only small portions of the print have these artifacts.
|
||||
|
||||
After that I tried breaking it and measuring how much kg of force it needs using this device. It was too much and we got Err. So we needed to make it structurally weaker. So we decided to print the rectangles upright so it would be easier to break.
|
||||
|
||||
### Prints with NonPlanar infill
|
||||
There is also a script in the github repo with NonPlanar infill. Im going to try that with these settings:
|
||||
```bash
|
||||
python3 bricklayersNonPlanarInfill.py Brick-EM1.4-WR1-NP1-AMP-0.6-FREQ1.4.gcode -extrusionMultiplier 1.4 -wallReorder 1 -nonPlanar 1 -amplitude 0.6 -frequency 1.4
|
||||
```
|
||||
|
||||
With Planar infill you don't see the Z axis move as much but with the NonPlanar Infill you can see the Z axis move a lot more.
|
||||
<video controls src="../../../Assignments/week_5_3dprinting_and_scanning/IMG_8367 (3).mp4" title="Title"></video>
|
||||
|
||||
|
||||
#### Getting good prints
|
||||
Getting good prints on nonplanar infill is a lot harder than planar infill because the layers the printer is printing are constantly changing.
|
||||
|
||||

|
||||
With this print I increased the raft. It helped a bit but at some point the print got loose from the raft. Here are all the failed bricklaying prints.
|
||||
|
||||

|
||||
First I increased the brim size of the print but that also didn't work out. After that I used a cube as base and let it stick out 5mm above the build plate like this.
|
||||

|
||||
So I have a even bigger and stronger raft. After the print I knocked the small little platform off with a hammer and then I had a print I could test.
|
||||
|
||||
### Testing the strength
|
||||
To test the strength I made a makeshift setup with a scale on a hook. Then I put the plastic test subject on the bar and pulled really hard until it broke. Then I could read the amount of kg needed to break it from the scale.
|
||||
|
||||

|
||||
|
||||
I made 3 prints. One normal using normal settings. One with brick using `Bricklayers.py` and one using `bricklayersNonPlanarInfill.py` using the commands above.
|
||||
|
||||

|
||||
This is the end result. At the bottom are all the failed prints. At the top are the finished and tested prints. On the left there is the `bricklayers.py` print. The 2 in the middle have no modifications. The one on the right has the `bricklayersNonPlanarInfill.py` modification. The 2 on the left broke in the middle at the same point. Of the left one I got a measurement of 27,75kg. The one in the middle and right I didn't get the measurement because my phone couldn't record the screen of the scale. That's why im doing them again.
|
||||
|
||||
| Which Print | Force down needed to break it |
|
||||
| :---------------------------- | ----------------------------- |
|
||||
| No modifications | 24Kg |
|
||||
| Planar infill bricks | 27,75Kg |
|
||||
| Non planar infill with bricks | 31,4Kg |
|
||||
|
||||
I also noticed that the non planar infill broke at the same point twice. It could be because the print was getting unstable up there. Because the print failed a couple of times at that point when I was printing it without a solid platform.
|
||||
|
||||

|
||||
So if it was more stable during printing it may have been even stronger.
|
||||
|
||||

|
||||
|
||||
## Creating something that can't be made subtractively
|
||||
I wanted to make something simple because my University has been giving a lot of assignments to do during my internship. So I wanted to focus on that. I created a cube with a hole in it and in there another hole on another axis. That way it can't be made subtractively.
|
||||
|
||||
Result:
|
||||

|
||||

|
||||
|
||||
## 3D scanning
|
||||
For this week we also needed to do 3D scanning. When other people where doing it it looked very easy. But when I tried myself it was hard to do and to get everything right.
|
||||
|
||||
Assembling the scanner is really straight forward. First screw on the adapter and then you can screw on the camera
|
||||

|
||||
After that you can plug the usb-c to A cable in the side of the camera and then screw in the locks.
|
||||

|
||||
After that we can go to the software. Since it's an creality camera we also need the crealityScan software.
|
||||

|
||||
Then I was greeted with this screen. I pressed start and left all the default settings for the camera. Then I could start scanning.
|
||||
The first object I was trying to scan was a ESP32S3 but apparently pcb's are too reflective for the camera to pick up on. So I got this error a lot.
|
||||

|
||||
Then I grabbed a fume extractor for soldering and that worked like a charm.
|
||||

|
||||
After I pressed that I was done scanning. I could click one click process and that processes the entire scan to a 3D model with textures.
|
||||

|
||||
|
||||

|
||||
After it fully processed the scanning I could export it as a object file and then I can do various other things with it. For example import it into blender and use it.
|
||||
|
||||

|
||||
This is the end result of the scan. Maybe in hindsight it wasn't smart to use the mat to scan because the scanner needs reference points and with a mat you take that all away because it looks the same all over the mat.
|
||||
|
||||
## SLA printer (resin)
|
||||
Henk showed us how to ELEGOO Mars 3 worked. First we sliced the model in CHITUBOX. CHITUBOX is a program to slice 3d models for SLA/resin printers. Then we went to the printer to prep it and after that we needed to clean it.
|
||||
|
||||
### Slicing
|
||||
For slicing we used CHITUBOX. It's a slicer that's supports the ELEGOO resin printers.
|
||||

|
||||
It looks like this. I wanted to slice something so could also do it later on myself.
|
||||
First we need to import the file using the Open button at the top.
|
||||
Once you've imported the file you wanna make sure your part is not touching the plate. 
|
||||
Because if you are printing direct to the plate it will be very hard to remove later on according to Henk.
|
||||
Because we don't want to touch the build plate we are going to need supports.
|
||||

|
||||
To add supports we need to press this button to go to the support screen.
|
||||
After entering the screen we can press auto support to automatically generate supports.
|
||||

|
||||
Once we pressed that we can go back to the other tab and press slice to slice it all to a file.
|
||||

|
||||
Then we can put it on a USB stick and start preparing the machine
|
||||
|
||||
### Preparing the printer
|
||||

|
||||
First Henk showed how to calibrate the plate for printing. You need a piece of paper and a alan key to calibrate the plate.
|
||||
|
||||

|
||||
Once the plate is on the bottom you can set the Z axis on the screen to 0. And pull the paper up to straighten the plate out.
|
||||
|
||||

|
||||
|
||||
After that Henk poured in the resin. Always make sure when you're working with resin to use gloves.
|
||||

|
||||
|
||||
After that we where trying to get the file loaded on the machine but it didn't show up. So first Henk formatted the drive to FAT32. Then I also did it on my machine. But after re-plugging the drive in my machine after putting the file back on. The file disappeared so we grabbed another usb stick. With the new usb stick it did read the file so we had a bad usb stick.
|
||||
|
||||
### Cleaning the printer
|
||||
When we where cleaning the machine it got really messy. We needed lot's of paper towels.
|
||||
|
||||
Once the print was done we needed to remove the build plate so the print could cure in the vat of alcohol.
|
||||

|
||||
When removing the plate Henk told us to be careful with the Resin on top to let it drip into the resin reservoir.
|
||||
|
||||
After that he submerged the print in alcohol and tied the wire on the top around the lid so the soft resin print didn't touch the bottom or the sides.
|
||||
|
||||
When the print was curing Henk told us that we needed a funnel and a filter to put the rest of the resin back in the container so it can be re-used later.
|
||||
|
||||

|
||||
The filter is needed because there could be loose cured parts in the resin which can mess up prints later on if they go into the bottle.
|
||||
|
||||

|
||||
|
||||

|
||||
Henk also told us to use the plastic scraper when scraping the leftover resin out of the tray.
|
||||
After the print finished curing we could remove it from the plate and put it in the curing chamber without the vat of alcohol.
|
||||

|
||||

|
||||
|
||||
Then we needed to clean everything we used thoroughly with isopropanol. Otherwise the resin will harden over time and it will be very hard to get it off.
|
||||

|
||||

|
||||
|
||||
|
||||

|
||||

|
||||

|
||||
Also make sure to clean the bottom of the tray. Otherwise it can harden when it's attached to the resin printer and that could break the printer.
|
||||
|
||||
End result:
|
||||

|
||||
|
||||
|
||||
Resin printers are very nice because they are extremely accurate but the only downside is the cleanup after printing.
|
||||
## Assignment
|
||||
* [x] Create something that can't be made subtractively
|
||||
* [x] Test printer design rules
|
||||
|
||||
* [x] 3D scanning
|
||||
* [x] Test strength brick laying print
|
||||
* [x] Test strength brick laying non planar infill print
|
||||
* [x] Test strength normal print
|
||||
|
||||
|
||||
## Files
|
||||
* [Rectangle for brick test](rectangle.3mf)
|
||||
* [Rectangle for brick test with baseplate](BiggerBasePlate.3mf)
|
||||
|
||||
|
||||
## Links
|
||||
* [Github project bricklaying printing](https://github.com/TengerTechnologies/Bricklayers)
|
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8277.jpg
Normal file
After Width: | Height: | Size: 335 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8278.jpg
Normal file
After Width: | Height: | Size: 359 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8291.jpg
Normal file
After Width: | Height: | Size: 411 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8344.jpg
Normal file
After Width: | Height: | Size: 240 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8347.jpg
Normal file
After Width: | Height: | Size: 202 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8348.jpg
Normal file
After Width: | Height: | Size: 407 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8349.jpg
Normal file
After Width: | Height: | Size: 306 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8353.jpg
Normal file
After Width: | Height: | Size: 238 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8363.jpg
Normal file
After Width: | Height: | Size: 270 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8373.jpg
Normal file
After Width: | Height: | Size: 243 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8381.jpg
Normal file
After Width: | Height: | Size: 309 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8383.jpg
Normal file
After Width: | Height: | Size: 260 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8395.jpg
Normal file
After Width: | Height: | Size: 360 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8398.jpg
Normal file
After Width: | Height: | Size: 398 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8399.jpg
Normal file
After Width: | Height: | Size: 390 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8404.jpg
Normal file
After Width: | Height: | Size: 322 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8414.jpg
Normal file
After Width: | Height: | Size: 302 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8421.jpg
Normal file
After Width: | Height: | Size: 451 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8426.jpg
Normal file
After Width: | Height: | Size: 355 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8432.jpg
Normal file
After Width: | Height: | Size: 379 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8434.jpg
Normal file
After Width: | Height: | Size: 450 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8436.jpg
Normal file
After Width: | Height: | Size: 395 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8440.jpg
Normal file
After Width: | Height: | Size: 336 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8441.jpg
Normal file
After Width: | Height: | Size: 388 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8442.jpg
Normal file
After Width: | Height: | Size: 376 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8445.jpg
Normal file
After Width: | Height: | Size: 401 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8449.jpg
Normal file
After Width: | Height: | Size: 432 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8452.jpg
Normal file
After Width: | Height: | Size: 417 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8454.jpg
Normal file
After Width: | Height: | Size: 343 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/IMG_8462.jpg
Normal file
After Width: | Height: | Size: 290 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/image-1.jpg
Normal file
After Width: | Height: | Size: 102 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/image-10.jpg
Normal file
After Width: | Height: | Size: 161 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/image-11.jpg
Normal file
After Width: | Height: | Size: 167 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/image-12.jpg
Normal file
After Width: | Height: | Size: 188 KiB |
BIN
docs/Assignments/week_05_3dprinting_and_scanning/image-13.jpg
Normal file
After Width: | Height: | Size: 231 KiB |