<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Ravi's Blog]]></title><description><![CDATA[Min Costs, Max Engineering ]]></description><link>https://blog.ravimakes.com/</link><image><url>https://blog.ravimakes.com/favicon.png</url><title>Ravi&apos;s Blog</title><link>https://blog.ravimakes.com/</link></image><generator>Ghost 5.53</generator><lastBuildDate>Wed, 08 Apr 2026 15:10:36 GMT</lastBuildDate><atom:link href="https://blog.ravimakes.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[ABL under 10$ for Ender 3 (With klipper config)]]></title><description><![CDATA[ABL for your Ender 3. Under $10 and works with Klipper!]]></description><link>https://blog.ravimakes.com/abl-under-10-for-ender-3-with-klipper-config/</link><guid isPermaLink="false">649f1edd428bcb01558c0761</guid><category><![CDATA[3D Printing]]></category><category><![CDATA[ABL]]></category><category><![CDATA[Ender 3]]></category><category><![CDATA[Klipper]]></category><dc:creator><![CDATA[Ravi Kiran P]]></dc:creator><pubDate>Sun, 01 Dec 2019 12:20:00 GMT</pubDate><media:content url="https://blog.ravimakes.com/content/images/2020/07/complete.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.ravimakes.com/content/images/2020/07/complete.jpg" alt="ABL under 10$ for Ender 3 (With klipper config)"><p>A while ago, I wrote <a href="https://blog.ravimakes.com/freeabl-the-cheapest-and-free-abl-for-ender-3/">this</a> article that helped with semi-auto bed levelling for the ender 3. The frustrating part with this method is that, while free, it requires manual work every time you need to home the device.</p><p>If you are willing to spend about Rs 200 (or up to $10 outside India), you can get <a href="https://www.amazon.in/Robodo-Electronics-Tower-Micro-Servo/dp/B00MTFFAE0/ref=pd_sbs_328_2/258-9504206-9352317?_encoding=UTF8&amp;pd_rd_i=B00MTFFAE0&amp;pd_rd_r=63e1923d-76de-402d-8532-d14118f598e6&amp;pd_rd_w=fhhxG&amp;pd_rd_wg=L26Qu&amp;pf_rd_p=00b53f5d-d1f8-4708-89df-2987ccce05ce&amp;pf_rd_r=W0Y1F7DEG0RBJDF2AZF3&amp;psc=1&amp;refRID=W0Y1F7DEG0RBJDF2AZF3&amp;ref=blog.ravimakes.com">this servo</a> and make a pretty good auto bed levelling system using ABL from <a href="https://www.thingiverse.com/thing:3293821?ref=blog.ravimakes.com">here</a>. Being a contact-based probe, it works well on all kinds of beds.</p><p><strong>Prerequisites:</strong></p><ol><li>A <a href="https://www.amazon.in/Robodo-Electronics-Tower-Micro-Servo/dp/B00MTFFAE0/ref=pd_sbs_328_2/258-9504206-9352317?_encoding=UTF8&amp;pd_rd_i=B00MTFFAE0&amp;pd_rd_r=63e1923d-76de-402d-8532-d14118f598e6&amp;pd_rd_w=fhhxG&amp;pd_rd_wg=L26Qu&amp;pf_rd_p=00b53f5d-d1f8-4708-89df-2987ccce05ce&amp;pf_rd_r=W0Y1F7DEG0RBJDF2AZF3&amp;psc=1&amp;refRID=W0Y1F7DEG0RBJDF2AZF3&amp;ref=blog.ravimakes.com">servo motor</a> and a <a href="https://www.amazon.in/Pin-Tactile-Switch-micro-ELECTRONICS/dp/B01N27TA98/ref=sr_1_1?dchild=1&amp;keywords=click+switch&amp;qid=1593682322&amp;s=industrial&amp;sr=1-1&amp;ref=blog.ravimakes.com">switch</a> (or <a href="https://www.amazon.in/INVENTO-%E0%A4%AE%E0%A5%88%E0%A4%95%E0%A5%87%E0%A4%A8%E0%A4%BF%E0%A4%95%E0%A4%B2-%E0%A4%AE%E0%A4%BE%E0%A4%87%E0%A4%95%E0%A5%8D%E0%A4%B0%E0%A5%8B-%E0%A4%AA%E0%A5%8D%E0%A4%B0%E0%A4%BF%E0%A4%82%E0%A4%9F%E0%A4%B0-%E0%A4%AA%E0%A5%8D%E0%A4%B0%E0%A5%8B%E0%A4%9C%E0%A5%87%E0%A4%95%E0%A5%8D%E0%A4%9F/dp/B07DM7FNK9/ref=sr_1_11?dchild=1&amp;keywords=click+switch&amp;qid=1593682322&amp;s=industrial&amp;sr=1-11&amp;ref=blog.ravimakes.com">this</a>).</li><li>Print out these <a href="https://www.thingiverse.com/thing:3293821/files?ref=blog.ravimakes.com">parts</a>. There are variants for Hero Me fan duct and for a micro swiss hot end. Choose appropriately.</li><li>6 meters of <a href="https://www.amazon.in/%E0%A4%87%E0%A4%B2%E0%A5%87%E0%A4%95%E0%A5%8D%E0%A4%9F%E0%A5%8D%E0%A4%B0%E0%A4%BF%E0%A4%95-%E0%A4%AA%E0%A5%8D%E0%A4%B0%E0%A5%8B%E0%A4%9C%E0%A5%87%E0%A4%95%E0%A5%8D%E0%A4%9F-%E0%A4%AC%E0%A4%BF%E0%A4%B2%E0%A5%8D%E0%A4%A1%E0%A4%BF%E0%A4%82%E0%A4%97-%E0%A4%B5%E0%A4%B0%E0%A5%8D%E0%A4%95%E0%A4%BF%E0%A4%82%E0%A4%97-%E0%A4%8F%E0%A4%95%E0%A5%8D%E0%A4%B8%E0%A4%AA%E0%A5%87%E0%A4%B0%E0%A4%BF%E0%A4%AE%E0%A5%87%E0%A4%82%E0%A4%9F/dp/B07MNG8KRF/ref=sr_1_6?dchild=1&amp;keywords=diy+wire&amp;qid=1593683185&amp;s=industrial&amp;sr=1-6&amp;ref=blog.ravimakes.com">copper wire</a></li><li>A soldering kit.</li></ol><p><strong>How To:</strong></p><p><strong>1. Hardware</strong></p><ol><li>Measure the length of wire required from the mainboard to the hot end.</li><li>Cut five pieces of wire for the measured length.</li><li>Solder two wires to the microswitch.</li><li>Extend the wires from the servo as well. You can use either dupont cables or splice them.</li><li>Mark the extended wires with a permanent marker for later. (You can mark one bar on both ends of a wire, 2 on either sides of the second etc.</li><li>Once this is done, pass the extension cables through the sheathing.</li><li>Connect the endstop wires to Z end stop cable. If you have a <a href="https://www.amazon.in/Pin-Tactile-Switch-micro-ELECTRONICS/dp/B01N27TA98/ref=sr_1_1?dchild=1&amp;keywords=click+switch&amp;qid=1593682322&amp;s=industrial&amp;sr=1-1&amp;ref=blog.ravimakes.com">2 pin switch</a>, the order doesn&apos;t matter. On the other hand, if you are using the <a href="https://www.amazon.in/INVENTO-%E0%A4%AE%E0%A5%88%E0%A4%95%E0%A5%87%E0%A4%A8%E0%A4%BF%E0%A4%95%E0%A4%B2-%E0%A4%AE%E0%A4%BE%E0%A4%87%E0%A4%95%E0%A5%8D%E0%A4%B0%E0%A5%8B-%E0%A4%AA%E0%A5%8D%E0%A4%B0%E0%A4%BF%E0%A4%82%E0%A4%9F%E0%A4%B0-%E0%A4%AA%E0%A5%8D%E0%A4%B0%E0%A5%8B%E0%A4%9C%E0%A5%87%E0%A4%95%E0%A5%8D%E0%A4%9F/dp/B07DM7FNK9/ref=sr_1_11?dchild=1&amp;keywords=click+switch&amp;qid=1593682322&amp;s=industrial&amp;sr=1-11&amp;ref=blog.ravimakes.com">3 pin switch</a>, you wanna connect one wire to common and the other to either normally open or normally closed. (Shortened to NO and NC respectively.) I prefer normally open. You will have to contact your seller if this information isn&apos;t mentioned on the website or on the switch.</li><li>If your switch is bigger or smaller than the printed <a href="https://cdn.thingiverse.com/renders/b5/75/7b/d6/e9/1cd16f76475a875fcf7dee6c6adac6d1_preview_featured.jpg?ref=blog.ravimakes.com">arm</a>, you can just use your pliers and use instant glue to hold the switch in place.</li><li>Once you are done with that, you need to connect up the servo. A servo has 3 wires. One of them is a live wire you need to connect to 5v, another to neutral and the third is the signal wire (PWM). In my case, red was 5v, brown was ground and orange was PWM. Like the image shown below. </li></ol><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2020/07/Servo-Motor-Wires.png" class="kg-image" alt="ABL under 10$ for Ender 3 (With klipper config)" loading="lazy"></figure><p>10. I used the IO pins from the stock ender 3 board to supply power. Below is an image that shows the IO pin out diagram from all3dp. Connect the 5v and GND wires to their respective pins. You can use a female dupont wire to make it a bit easier. </p><p><strong>Edit</strong>: You can also use the expansion pins on your LCD for power. Look at the pic under point 11&apos;s edit.</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2020/07/ender-3-pin-outs.jpg" class="kg-image" alt="ABL under 10$ for Ender 3 (With klipper config)" loading="lazy"></figure><!--kg-card-begin: markdown--><ol start="11">
<li>For the signal wire, you have two options. <s>The first is to splice the speaker wire (pin 27) from the cable that goes to your display and connect your signal wire to it. You may also get an adapter if you do not wish to damage your cable.</s> Second is to find and solder a wire to an unused pin (pin 29) on the board. Pick this method only if you are confident about your soldering skills as the point is very close to a capacitor and quite easy to damage it. Below is an image to show you where the pin is.<br>
<strong>Edit</strong>: There is a better way if you are willing to lose the speaker. Scroll through.</li>
</ol>
<!--kg-card-end: markdown--><p></p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2020/07/Pin29.jpg" class="kg-image" alt="ABL under 10$ for Ender 3 (With klipper config)" loading="lazy"></figure><p><strong>Edit</strong>: I recently found <a href="https://www.thingiverse.com/thing:3564695?ref=blog.ravimakes.com">this</a>. It turns out the expansion pins on the LCD can be used for both power and signal. I will include a pic from the same thing. Credit to <a href="https://www.thingiverse.com/?ref=blog.ravimakes.com">thingiverse</a> user <a href="https://www.thingiverse.com/torsoreaper?ref=blog.ravimakes.com">torsoreaper</a> for this.</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2020/07/exp1.jpg" class="kg-image" alt="ABL under 10$ for Ender 3 (With klipper config)" loading="lazy"></figure><p>If you wish to keep the pin for speaker, you may still use pin 29. You can also use the other pin for a filament run out sensor or other goodies. I used the second method of soldering to pin 29 though. Pick your poison. Your config changes based on which one you choose.</p><p>12. Screw the servo to the holder, fix or glue the switch to the arm, place the single lever that came with your servo in the slot and screw the arm to the servo. Fix the entire thing to your printer.</p><p><strong>2. Software</strong></p><p><strong>&#x2003;2a.</strong> <strong>Marlin</strong></p><p>&#x2003;If you are using marlin, you need to make these changes in your firmware.</p><!--kg-card-begin: markdown--><ol>
<li>Enable or change these settings in <strong>Configuration.h</strong><br>
<code>#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN</code><br>
<code>#define Z_ENDSTOP_SERVO_NR 0</code><br>
<code>#define Z_SERVO_ANGLES {174,45}</code><br>
<code>#define Z_HOMING_HEIGHT 2</code><br>
<code>#define Z_CLEARANCE_DEPLOY_PROBE 6</code><br>
<code>#define Z_CLEARANCE_BETWEEN_PROBES 6</code><br>
<code>#define Z_MIN_PROBE_REPEATABILITY_TEST</code><br>
<code>#define AUTO_BED_LEVELING_BILINEAR</code><br>
<code>#define EXTRAPOLATE_BEYOND_GRID</code><br>
<code>#define Z_SAFE_HOMING</code><br>
<code>#define HOMING_FEEDRATE_Z (6*60)</code><br>
<code>#define SERVO_DELAY { 1000 }</code><br>
<code>#define DEACTIVATE_SERVOS_AFTER_MOVE</code></li>
<li>Set up the offset<br>
<code>#define X_PROBE_OFFSET_FROM_EXTRUDER -36 // X offset: -left +right [of the nozzle]</code><br>
<code>#define Y_PROBE_OFFSET_FROM_EXTRUDER -5 // Y offset: -front +behind [the nozzle]</code><br>
<code>#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle]</code></li>
<li>Select Servo pin, under the Servo section in <strong>Configuration.h</strong>, add these lines.<br>
For <strong>Pin 27</strong> (using Pin 27 adapter or cutting the lcd wire or using expansion of LCD)<br>
<code>#define SERVO0_PIN 27</code><br>
<code>#define NUM_SERVOS 1</code><br>
For <strong>Pin 29</strong> (Soldering the servo wire to the board)<br>
<code>#define SERVO0_PIN 29</code><br>
<code>#define NUM_SERVOS 1</code></li>
<li><em>Optional</em> Depending on your switch, you may have to invert it in the config.<br>
<code>#define Z_MIN_ENDSTOP_INVERTING true // set to true to</code><br>
<code>#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe.</code></li>
<li>If you compile the sketch, you will get an error as the 1248p does not have enough space. So you need to disable the following features by commenting them out. (//)<br>
<strong>Configuration.h</strong><br>
<code>//#define SHOW_BOOTSCREEN</code><br>
<code>//enable this to gain some space.</code><br>
<code>#define SLIM_LCD_MENUS</code><br>
<strong>Configuartion_adv.h</strong><br>
<code>//#define ARC_SUPPORT // Disable this feature to save ~3226 bytes</code></li>
<li>Compile the sketch and Upload the firmware.</li>
</ol>
<!--kg-card-end: markdown--><p><strong>Setting Up</strong></p><!--kg-card-begin: markdown--><ol>
<li>Power up the printer and send <code>M280 P0 S90</code> to the printer using pronterface.</li>
<li>If the arm moves, it is working.</li>
<li>Send <code>M280 P0 S45</code>, this is the stow position you can set it to any number.</li>
<li>Send <code>M280 P0 S174</code>, check if the micro switch is parallel to the bed. adjust the S??? till it does.</li>
<li>Play around with the angles and determine the optimal stow and deploy angles. Once you are satisfied, note the two values.</li>
<li>Change the angles in <strong>Configuration.h</strong> here <code>#define Z_SERVO_ANGLES {174,45}</code></li>
<li>Compile and upload the firmware.</li>
</ol>
<!--kg-card-end: markdown--><p><strong>Testing</strong></p><!--kg-card-begin: markdown--><ol>
<li>With the USB plugged into your Printer, send <code>M119</code> (end stop status) on the terminal. You should get SENT: M119 READ: Reporting endstop status READ: x_min: open READ: y_min: open READ: z_min: open READ: ok . Your z_min must be open.</li>
<li>Push the z switch with your finger and send the same command again. z_min must now show &quot;TRIGGERED&quot;. If it doesn&apos;t, there is an issue with your end stop wiring or your switch.</li>
<li>If the open and triggered statuses or opposite, i.e., it shows triggered when open and vice versa, change the setting in step 4 in <strong>Configuration.h</strong> settings.</li>
<li>If all is as expected, deploy the probe and check to see if the hot end is higher than the probe, else the hot end will hit the bed and the switch never trigger.</li>
<li>If the last step is ok, send <code>G28</code> to home the printer. It should home X, Y, then deploy the probe to home Z. Make sure the bed is clear.</li>
<li>Send <code>G29</code> to probe the bed.</li>
<li>Send M500 to save to EEPROM or Add <code>G29</code> as the start script of your slicer, so it will level the bed before every print. <img src="https://cdn.thingiverse.com/renders/2e/82/7c/e1/9a/57851fa98c61137e19bb4c474d780e24_preview_featured.JPG" alt="ABL under 10$ for Ender 3 (With klipper config)" loading="lazy"></li>
<li>Set your print to <strong>Z-probe-offset</strong> screen and turn the knob while you print a 1 layer STL. Till you get a good squished first layer.</li>
<li>Understating the Z offset can be confusing. But it is quite simple. The &apos;+&apos; or &apos;-&apos; sign indicates whether the switch is above the nozzle or below. In this case, it is below. If you use something like the npn sensor, it will be above. So we use &apos;-&apos;. The number without the sign is the distance between the switch and the nozzle. If you want the nozzle to squish more, increase the absolute number. If it&apos;s too close to the bed, reduce it. Think of it this way. You set the Z offset to -10. Which means you are telling the printer that when the endstop triggers, the nozzle is exactly 10 mm above the bed. So, when you tell the printer to move nozzle to 0, it will move 10 mm down. Let&apos;s say the nozzle is too high. So need it to <strong>move more</strong> to reach the bed. You then increase the absolute number by 1 mm and your Z offset becomes -11 mm. Similarly, if you were using npn sensor and the offset was positive, you would increase the value from 10 mm to 11.</li>
</ol>
<!--kg-card-end: markdown--><p>2b. <strong>Klipper</strong></p><p>If you use Klipper, I recommend you to look at my config file <a href="https://github.com/ravikiranp123/ender3-klipper/blob/master/ender3.cfg?ref=blog.ravimakes.com">here</a>.</p><p>Here is what I modified on the stock config</p><!--kg-card-begin: markdown--><p>Added the following code</p>
<pre><code>[probe]
pin: ^!PC4
# Pin connected to the BLTouch sensor pin. This parameter must be
# provided.
# control_pin: PA4
# Pin connected to the BLTouch control pin. This parameter must be
# provided.
x_offset: -37.00
y_offset: -5.00
z_offset: 11.15
speed: 5.0
samples: 1
#   The number of times to probe each point. The probed z-values will
#   be averaged. The default is to probe 1 time.
#sample_retract_dist: 3.0
#   The distance (in mm) to lift the toolhead between each sample (if
#   sampling more than once). The default is 2mm.
#samples_result: average
#   The calculation method when sampling more than once - either
#   &quot;median&quot; or &quot;average&quot;. The default is average.
</code></pre>
<pre><code>[servo bltouch]
pin: PA2
#   PWM output pin controlling the servo. This parameter must be
#   provided.
maximum_servo_angle: 180
#   The maximum angle (in degrees) that this servo can be set to. The
#   default is 180 degrees.
minimum_pulse_width: 0.0005
#   The minimum pulse width time (in seconds). This should correspond
#   with an angle of 0 degrees. The default is 0.001 seconds.
maximum_pulse_width: 0.003
#   The maximum pulse width time (in seconds). This should correspond
#   with an angle of maximum_servo_angle. The default is 0.002
#   seconds.
initial_angle: 60
#   Initial angle to set the servo to when the mcu resets.  Must be between
#   0 and maximum_servo_angle  This parameter is optional.  If both
#   initial_angle and initial_pulse_width are set initial_angle will be used.
#initial_pulse_width: 0.0015
#   Initial pulse width time (in seconds) to set the servo to when
#   the mcu resets.  Must be between minimum_pulse_width and maximum_pulse_width.
#   This parameter is optional.  If both initial_angle and initial_pulse_width
#   are set initial_angle will be used
enable: True
#   Enable or disable servo. It can be enabled or disabled later using
#   SET_SERVO SERVO=my_servo ENABLE=&lt;0|1&gt; g-command. The default is True (=enabled)
</code></pre>
<pre><code>[bed_mesh]

speed: 150
horizontal_move_z: 16
mesh_pps: 2,2
# samples: 2
# sample_retract_dist: 5
mesh_min: 28,30
mesh_max: 198,198
probe_count: 3,3
</code></pre>
<!--kg-card-end: markdown--><p>There are 2 pins here. And this is what you need to pay attention to. </p><p>Pin under [probe] is the endstop pin. Do not change it.</p><p>Pin under [servo bltouch] is the one that represents either pin 27 (spliced speaker wire/adapter/expansion one) or pin29 (the one you soldered and nearly burnt the capacitor next to it) </p><!--kg-card-begin: markdown--><p>Depending on which pin you chose, use the below values</p>
<pre><code>Pin 27: PA4
</code></pre>
<pre><code>Pin 29: PA2
</code></pre>
<!--kg-card-end: markdown--><p>I also added the following macros to override homing. This is required to deploy and stow the switch as and when required.</p><!--kg-card-begin: markdown--><pre><code>[homing_override]
set_position_z: 20
axes: z
gcode:
       SET_SERVO SERVO=bltouch ENABLE=1
       SET_SERVO SERVO=bltouch ANGLE=60
       SET_SERVO SERVO=bltouch ENABLE=0
       G92 Z0
       G90 
       G1 Z20 F600
       G28 X Y
       G1 X123 Y117 F6000
       SET_SERVO SERVO=bltouch ENABLE=1
       SET_SERVO SERVO=bltouch ANGLE=134
       G4 P500
       SET_SERVO SERVO=bltouch ENABLE=0
       G28 Z0
       G1 Z20
       SET_SERVO SERVO=bltouch ENABLE=1
       SET_SERVO SERVO=bltouch ANGLE=60
       G4 P500
       SET_SERVO SERVO=bltouch ENABLE=0
</code></pre>
<pre><code>[gcode_macro G29]
gcode:
       ; G28
       G1 Z20
       G4 P400
       SET_SERVO SERVO=bltouch ENABLE=1
       SET_SERVO SERVO=bltouch ANGLE=134
       G4 P500 
       SET_SERVO SERVO=bltouch ENABLE=0
       BED_MESH_CALIBRATE
       SET_SERVO SERVO=bltouch ENABLE=1
       SET_SERVO SERVO=bltouch ANGLE=60 
       G4 P500 
       SET_SERVO SERVO=bltouch ENABLE=0
</code></pre>
<!--kg-card-end: markdown--><p><strong>Conclusion and Credits</strong></p><p>This is a time consuming upgrade. Well worth it though. While I have been using this for nearly an year now, I would still recommend you to go for an npn proximity sensor like <a href="https://www.amazon.in/JAIN-AUTOMATION-Inductive-Proximity-M18-8mm/dp/B07RDX8MLH/ref=sr_1_4?crid=5SRJ96R0BUIG&amp;dchild=1&amp;keywords=npn+proximity+sensor&amp;qid=1595855334&amp;s=industrial&amp;sprefix=npn%2Cindustrial%2C330&amp;sr=1-4&amp;ref=blog.ravimakes.com">this</a> or <a href="https://www.amazon.in/roboCraze-Detection-distance-proximity-detector/dp/B07HFS7B2X/ref=sr_1_6?crid=5SRJ96R0BUIG&amp;dchild=1&amp;keywords=npn+proximity+sensor&amp;qid=1595855334&amp;s=industrial&amp;sprefix=npn%2Cindustrial%2C330&amp;sr=1-6&amp;ref=blog.ravimakes.com">this</a>. The only reason I did not go with them is that they are rated 6 to 36v and I would need a buck converter. However, quite a few people have claimed they work with 5v as well. This is a hit or miss.</p><p>Hope this guide was useful to you. Feel free to drop a comment if you need help or have suggestions. Make sure to check out my other posts and the original thingiverse pages for the <a href="https://www.thingiverse.com/thing:3293821?ref=blog.ravimakes.com">ABL system</a> as well as the <a href="https://www.thingiverse.com/thing:3564695?ref=blog.ravimakes.com">expansion find </a>.</p>]]></content:encoded></item><item><title><![CDATA[Klipper: A new hope for 8 bit 3D Printers]]></title><description><![CDATA[When the 8 Bit processor that comes with most Budget 3D Printers becomes insufficient, Klipper is an interesting solution to changing the board.]]></description><link>https://blog.ravimakes.com/klipper-ender-3/</link><guid isPermaLink="false">649f1edd428bcb01558c0760</guid><category><![CDATA[Klipper]]></category><category><![CDATA[Ender 3]]></category><category><![CDATA[3D Printing]]></category><dc:creator><![CDATA[Ravi Kiran P]]></dc:creator><pubDate>Fri, 02 Aug 2019 19:14:00 GMT</pubDate><media:content url="https://blog.ravimakes.com/content/images/2019/12/Klipper-Ender-3.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.ravimakes.com/content/images/2019/12/Klipper-Ender-3.jpg" alt="Klipper: A new hope for 8 bit 3D Printers"><p>Most budget printers like the Ender 3 come with 8 bit processors to save costs. These processors are mostly sufficient for regular day to day users. But makers are rarely day to day users. Makers are always tinkering with their machines and sooner or later end up pushing their machines to the edge of their capability. This first issue they are likely to face is limited space on the flash memory. This is especially visible when new mods are incorporated.</p>
<p>A different kind of limitation shows up when you try to push the speeds of your machine to their max. The print head starts to skip steps. Here is an example from YouTuber Chris Riley:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/duNHOPlh2Pg?start=125" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>As you can see, the printer starts to stutter at higher speeds. One option as mentioned in the beginning of the video is to change the main board to a 32 bit board like the SKR. However, there is another option. Especially if you are already using something like the Raspberry Pi to run OctoPrint. Or in my case, this TV Box (You can do a lot of interesting projects using this little low cost SBC. But that&apos;s for another post):</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.ravimakes.com/content/images/2019/12/TV-Box.jpg" class="kg-image" alt="Klipper: A new hope for 8 bit 3D Printers" loading="lazy"><figcaption>x96 TV Box. Works as a great little development board</figcaption></figure><!--kg-card-begin: markdown--><p>And that solution is called <a href="https://www.klipper3d.org/?ref=blog.ravimakes.com">Klipper</a>. Klipper basically avoids using the inbuilt board for any computation and relies on an external computer to do that. Which means there is a klipper host installed on the external computer like a Raspberry Pi and a very small firmware flashed onto your 3D Printer&apos;s firmware. The host computer calculates action to be taken at that very instance and sends that data to the firmware of your 3D Printer. The printer just follows that instantaneous code. Nothing more. Interesting option as I did not want to buy yet another upgrade within the first year of my printer.</p>
<p>I was already using this little TV Box to OctoPrint and control my 3D printer remotely along with using it as a personal media server with content from my external hard disk. So I decided to try and use this 64 bit box to use as the klipper host. Before I explain the rather simple process to install this on your printer and Raspberry/Other SBC setup, let me just write two important points that I struggled with.</p>
<ol>
<li><s>It appears you have to use Baud Rate of 250000 only with Ender 3 on stock board. I tried using 115200 initially on Klipper as I had stability issue with higher baud rate when using Marlin. This was disastrous and I could never really connect to the printer. I highly recommend going with a Baud Rate of 250000</s> My bad, I forgot to change baud rate in config. Make sure the baud rate you set here is the same baud rate you set in the config file.</li>
<li>I have included my printer config <a href="https://github.com/ravikiranp123/ender3-klipper/blob/master/ender3.cfg?ref=blog.ravimakes.com">here</a>. My setup includes default Ender 3 + Servo motor enabled Auto Bed Levelling from <a href="https://www.thingiverse.com/thing:3293821?ref=blog.ravimakes.com">Under $10 ABL</a></li>
</ol>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/servo-abl.jpg" class="kg-image" alt="Klipper: A new hope for 8 bit 3D Printers" loading="lazy"></figure><!--kg-card-begin: markdown--><p>If you are struggling with one of those 2 points like I was and have come here troubleshooting for them, I hope that helped you.</p>
<p>To those of you guys who wish to install and try Klipper out, follow the instructions below.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><!--kg-card-begin: markdown--><h2 id="prerequisites">Pre-Requisites:</h2>
<ol>
<li>Have a Raspberry Pi or equivalent SBC running OctoPrint. Though the Klipper page states it&apos;s possible to use other methods and avoid OctoPrint, the alternatives aren&apos;t really that easy or worth the effort.</li>
<li>Ender 3. This set of instructions are not very specific to Ender 3 but the settings and comments in general are for the Ender 3.</li>
<li>Shell access to your Raspberry box.</li>
</ol>
<h2 id="installation">Installation:</h2>
<ul>
<li>SSH into your Pi or Box and login as the same user that runs OctoPrint. In my case, it was octoprint. If you are using the standard image for Pi it&apos;s probably octopi.</li>
<li>Change directory to home with:</li>
</ul>
<pre><code> cd ~
</code></pre>
<ul>
<li>Clone the official repository from <a href="https://github.com/KevinOConnor/klipper?ref=blog.ravimakes.com">Klipper</a>.</li>
</ul>
<pre><code> git clone https://github.com/KevinOConnor/klipper
</code></pre>
<ul>
<li>Install the version that suits you using the various scripts available. Since I was running a debian server, I chose this:</li>
</ul>
<pre><code>./klipper/scripts/install-ubuntu-18.04.sh
</code></pre>
<p>If you are using Raspberry Pi with official OctoPi image, run this:</p>
<pre><code>./klipper/scripts/install-octopi.sh
</code></pre>
<ul>
<li>
<p>If you are running a different OS, use one of the other scripts present <a href="https://github.com/KevinOConnor/klipper/tree/master/scripts?ref=blog.ravimakes.com">here</a>.</p>
</li>
<li>
<p>Install Klipper</p>
</li>
</ul>
<pre><code>cd ~/klipper/
make menuconfig
</code></pre>
<ul>
<li>The settings you wanna use for Ender 3:</li>
</ul>
<pre><code>+   Micro-controller Architecture -&gt; (Atmega AVR)
+    Processor model -&gt; (atmega1284p)
+    Processor speed -&gt; (16Mhz)
+   Mark &quot;Enable extra low-level configuration options&quot; and Choose 
+      Baud Rate: 250000
</code></pre>
<ul>
<li>Compile the software with:</li>
</ul>
<pre><code>make
</code></pre>
<ul>
<li>Next, determine the port your printer is connected to:</li>
</ul>
<pre><code>ls /dev/serial/by-id/*
</code></pre>
<ul>
<li>It should give you something like this:</li>
</ul>
<pre><code> /dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0
</code></pre>
<ul>
<li>Choose the appropriate one if it shows multiple items and you are now ready to flash the firmware to your machine. Enter these lines to flash the firmware. Make sure to replace content after &quot;FLASH_DEVICE=&quot;  with the output of previous command.</li>
</ul>
<pre><code> sudo service klipper stop
 make flash FLASH_DEVICE=/dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0
 sudo service klipper start
</code></pre>
<ul>
<li>You should get a message stating that avrdude finished the flashing. Once done, you are now ready to modify the OctoPrint settings. This is mostly done using the web interface.</li>
</ul>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><!--kg-card-begin: markdown--><h3 id="octoprintconfiguration">OctoPrint Configuration:</h3>
<ol>
<li>Open up your browser and navigate to it&apos;s URL.</li>
<li>You may just install the plugin named &quot;<strong>OctoKlipper</strong>&quot; in OctoPrint and save a fair bit of  hassle. Or install the manual process as stated below.</li>
<li>Navigate to the Settings tab (the wrench icon at the top of the page) -&gt; Under &#x201C;Serial Connection&#x201D; in &#x201C;Additional serial ports&#x201D; add &#x201C;/tmp/printer&#x201D; -&gt; Click &#x201C;Save&#x201D;.</li>
<li>Enter the Settings tab again and under &#x201C;Serial Connection&#x201D; change the &#x201C;Serial Port&#x201D; setting to &#x201C;/tmp/printer&#x201D;.</li>
<li>In the Settings tab, navigate to the &#x201C;Behavior&#x201D; sub-tab and select the &#x201C;Cancel any ongoing prints but stay connected to the printer&#x201D; option. Click &#x201C;Save&#x201D;.</li>
<li>From the main page, under the &#x201C;Connection&#x201D; section (at the top left of the page) make sure the &#x201C;Serial Port&#x201D; is set to &#x201C;/tmp/printer&#x201D; and click &#x201C;Connect&#x201D;. (If &#x201C;/tmp/printer&#x201D; is not an available selection then try reloading the page.)</li>
<li>Once connected, navigate to the &#x201C;Terminal&#x201D; tab and type &#x201C;status&#x201D; (without the quotes) into the command entry box and click &#x201C;Send&#x201D;. The terminal window will likely report there is an error opening the config file - that means OctoPrint is successfully communicating with Klipper.</li>
<li>If you are going with the plugin OctoKlipper, some of the above settings will be automatically set by the plugin. You will have to set the rest.</li>
</ol>
<h3 id="ender3printerconfiguration">Ender 3 Printer configuration.</h3>
<ol>
<li>This is where using Klipper becomes a headache. Yeah. You probably thought you were through the hardest part.</li>
<li>The default ender 3 configuration is available at <a href="https://github.com/KevinOConnor/klipper/tree/master/config/printer-creality-ender3-2018.cfg?ref=blog.ravimakes.com">https://github.com/KevinOConnor/klipper/tree/master/config/printer-creality-ender3-2018.cfg</a></li>
<li>Just copy that over to ~/printer.cfg</li>
</ol>
<pre><code> cp ~/klipper/config/printer-creality-ender3-2018.cfg ~/printer.cfg 
 nano ~/printer.cfg
</code></pre>
<ul>
<li>This works out of the box for a default Ender 3. You just need to fine tune this config if you have modified something.</li>
</ul>
<p>But if you have any kind of modification whatsoever, that&apos;s where this becomes a headache. You see, the biggest difference between Marlin and Klipper is that Marlin is developed by a ton of people and is designed to be beginner friendly. Klipper on the other hand is developed by a single guy and is barely even usable without a ton of self configurations for even the smallest modifications.</p>
<p>For instance, I installed this servo enabled Auto Bed Levelling <a href="https://www.thingiverse.com/thing:3293821?ref=blog.ravimakes.com">mod</a>. Enabling bed mesh levelling and figuring out how to set the servo to required angle or even figuring out the name of pin 29 was a major headache.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><!--kg-card-begin: markdown--><p>Here is my final word on this:<br>
<strong>Pros:</strong></p>
<ul>
<li>Higher processing power</li>
<li>Higher memory</li>
<li>Both the above imply practically unlimited functions and powerfull functions such as Linear Advance.</li>
<li>Very beneficial for large prints where <strong>higher speeds</strong> can be achieved without any stutter.</li>
<li>Comparitively more <strong>silent</strong> running of stepper motors.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li>Since the machine is connected over USB and requires constant connection throughout, higher chances of connection failure related print failures. <strong>EDIT:</strong> This is extremely important! My experience completely flipped once I managed to stop my adapter from getting loose from the power slot and set the machine on a stable place where any kind of disturbances to the cable were rare, I am loving klipper.</li>
<li>The simplest things require you to research for half a day and then experiment with them for the remaining half. It took me a day to just get homing to happen correctly. Bed mesh levelling and using Pin 29 are blog posts on their own. On the other hand, configuring this same setup of servo enabled levelling was 5 minutes of work on Marlin. This includes the 3 and a half minutes taken to flash the firmware. <strong>EDIT:</strong> Well, that&apos;s the case in the very beginning. Once you use it for a while, it&apos;s very rare for you to have to fix anything. I had no option but to switch to klipper as I needed arc support for my CNC and Laser engraver mods to this printer. I haven&apos;t had any major issues in the recent past.</li>
<li>I have noticed that the bed levelling servo failes to activate randomly causing my nozzle to crash. <strong>EDIT:</strong> This was due to me horrible soldering skills. Sorry! Once I properly soldered the servo actuator to pin 27 correctly, I have never had an issue with klipper.</li>
<li>I have also noticed that my servo randomly moves during the bed levelling process by a degree. This makes proper levelling impossible. And pretty much fails for sure if using multiple samples. Still cannot figure out why this happens.</li>
</ul>
<p><strong>Final Conclusion:</strong> This is a very interesting and capable way to push a budget Ender 3 to it&apos;s physical limits and enable advanced memory consuming functions without upgrading to a 32 bit board. However, it still isn&apos;t usable or reliable for day to day usage. (<strong>EDIT:</strong> No more valid. I am using klipper on a regular basis. Haven&apos;t had an issue in the past month. Requires a little getting used to for sure, but I was a little too harsh on klipper in my initial review.) If you are not very comfortable with code, you better stay away from this. On the other hand, if you are like me and have an itch, do try it. It&apos;s worth all the effort. You learn a lot. Klipper is like the Linux of 3D printing while Marlin is Windows/Mac. Klipper gives you unbelievable power over your machine. But as always, power comes with responsibility.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[A collection of great Jekyll themes]]></title><description><![CDATA[A compilation of amazing Jekyll themes you won't find in your Google Search.
With live Demos!]]></description><link>https://blog.ravimakes.com/a-collection-of-incredible-jekyll-themes/</link><guid isPermaLink="false">649f1edd428bcb01558c075f</guid><category><![CDATA[Jekyll Themes]]></category><dc:creator><![CDATA[Ravi Kiran P]]></dc:creator><pubDate>Wed, 31 Jul 2019 18:14:00 GMT</pubDate><media:content url="https://blog.ravimakes.com/content/images/2019/12/Jekyll-Themes-compilation.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.ravimakes.com/content/images/2019/12/Jekyll-Themes-compilation.jpg" alt="A collection of great Jekyll themes"><p>When I started Thrifty Engineer, I decided to avoid the hassle of hosting providers. I also wanted to avoid wordpress and go for a static website to make my site fast and secure. After a fair bit of research, I decided to go for Jekyll. However, the themes found in the official source simply weren&apos;t suited for what I was looking for. There simply weren&apos;t enough options. This lead me to search for more themes. This post aims to help you out if you are in the same boat.</p>
<p>To make it easy for you to choose, I have included Live demos within the page. This way, you don&apos;t have to open every demo in a new page and forget which was which. Make sure to click on &quot;Allow unsecure Content&quot; on the address bar if it asks when you load a demo.</p>
<p><em>Note</em>: If the theme is on <strong><a href="https://github.com/?ref=blog.ravimakes.com">Github</a></strong>, you need to clone it to a folder and then run bundle install from that folder instead of the process shown in the official Jekyll website.</p>
<p>Here are some of my favorite Jekyll Themes:</p>
<hr>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><!--kg-card-begin: markdown--><p><strong>Author</strong>:<a href="https://github.com/qwtel?ref=blog.ravimakes.com">qwtel</a></p>
<p>This Author has a lot of free themes and a few paid themes. Do look at his paid themes and buy them if you like them. He sure has put in a lot of effort into it.</p>
<h2 id="1hydejack">1. <a href="https://hydejack.com/?ref=blog.ravimakes.com">Hydejack</a></h2>
<!--kg-card-end: markdown--><p><a href="https://github.com/qwtel/hydejack/raw/master/assets/img/blog/hydejack-8.png?ref=blog.ravimakes.com">https://github.com/qwtel/hydejack/raw/master/assets/img/blog/hydejack-8.png</a></p><!--kg-card-begin: html-->
<img alt="A collection of great Jekyll themes" class="kg-image" src="https://github.com/qwtel/hydejack/raw/master/assets/img/blog/hydejack-8.png">
<!--kg-card-end: html--><p>Live Demo:</p><!--kg-card-begin: html-->
<div class="article-content-first"><a id="button1" class="button read-more">Load</a></div>
<div id="iframeHolder"></div>
<!--kg-card-end: html--><!--kg-card-begin: markdown--><p>Source: <a href="https://github.com/qwtel/hydejack-starter-kit?ref=blog.ravimakes.com">Github</a></p>
<p>Demo: <a href="https://hydejack.com/?ref=blog.ravimakes.com">Hydejack</a></p>
<p>This truly is one of the best jekyll themes out there. I really loved it and wanted to use it for <a href="thriftyengineer.com">ThriftyEngineer.com</a>. Only issue I faced was that it has a <em>slide left</em> gesture on the homepage. Though it looks good, it&apos;s not really optimized for Desktop. It feels unnatural to press and swipe with your mouse. There was no way to disable this either. So I had to pass up on this theme. If majority of your users are going to be on mobile, I highly recommend this to you.</p>
<hr>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><!--kg-card-begin: markdown--><p><strong>Author</strong>:<a href="https://github.com/artemsheludko/?ref=blog.ravimakes.com">Artem Sheludko</a></p>
<h2 id="2galada">2. <a href="http://artemsheludko.com/galada/?ref=blog.ravimakes.com">Galada</a></h2>
<img alt="A collection of great Jekyll themes" class="kg-image" src="https://github.com/artemsheludko/galada/raw/master/img/galada-main-page.jpg?raw=true">
<p>Live Demo:</p>
<div class="article-content-first"><a id="button2" class="button read-more">Load</a></div>
<div id="iframeHolder2"></div>
<p>Source: <a href="https://github.com/artemsheludko/galada?ref=blog.ravimakes.com">Github</a></p>
<p>Demo: <a href="https://galada.netlify.com/?ref=blog.ravimakes.com">Galada</a></p>
<p>If you haven&apos;t noticed it from the picture, yes this the theme I decided to go with! There&apos;s not much to say apart from the fact that you need to turn your images black and white to go with the theme. This colour scheme is frankly the future though. So might as well go with it.</p>
<h2 id="3chelia">3. <a href="https://github.com/artemsheludko/chelia?ref=blog.ravimakes.com">Chelia</a></h2>
<img alt="A collection of great Jekyll themes" class="kg-image" src="https://github.com/artemsheludko/chelia/raw/master/images/mackbook-preview.png?raw=true">
<p>Live Demo:</p>
<div class="article-content-first"><a id="button3" class="button read-more">Load</a></div>
<div id="iframeHolder3"></div>
<p><strong>Make sure to click on &quot;Allow unsafe scripts&quot; on the address bar if it asks when you load a demo. You are also suggested to inspect the script element before doing so.</strong></p>
<p>Source: <a href="https://github.com/artemsheludko/chelia?ref=blog.ravimakes.com">Github</a></p>
<p>Demo: <a href="https://artemsheludko.github.io/chelia/?ref=blog.ravimakes.com">Chelia</a></p>
<p>Another great portfolio theme from this developer.</p>
<h2 id="4fresh">4. <a href="https://artemsheludko.github.io/fresh/?ref=blog.ravimakes.com">Fresh</a></h2>
<img alt="A collection of great Jekyll themes" class="kg-image" src="https://github.com/artemsheludko/fresh/raw/master/assets/img/fresh.jpg">
<p>Live Demo:</p>
<div class="article-content-first"><a id="button4" class="button read-more">Load</a></div>
<div id="iframeHolder4"></div>
<p>Source: <a href="https://github.com/artemsheludko/fresh?ref=blog.ravimakes.com">Github</a></p>
<p>Demo: <a href="https://artemsheludko.github.io/fresh/?ref=blog.ravimakes.com">Fresh</a></p>
<p>This is a great theme but I am not a fan of the font though. This too has features such as Google Analytics and disqus integration. Use it if it&apos;s to your taste.</p>
<h2 id="5bef">5. <a href="https://artemsheludko.github.io/bef/?ref=blog.ravimakes.com">Bef</a></h2>
<img alt="A collection of great Jekyll themes" class="kg-image" src="https://github.com/artemsheludko/bef/raw/master/assets/img/bef_main_page.jpg?raw=true">
<p>Live Demo:</p>
<div class="article-content-first"><a id="button5" class="button read-more">Load</a></div>
<div id="iframeHolder5"></div>
<p>Source: <a href="https://github.com/artemsheludko/bef?ref=blog.ravimakes.com">Github</a></p>
<p>Demo: <a href="https://artemsheludko.github.io/bef/?ref=blog.ravimakes.com">Bef</a></p>
<p>Another theme from the same developer. This is a great theme with features such as Google Analytics and disqus integration. Use it if it&apos;s to your taste.</p>
<h2 id="6adamblog">6. <a href="https://artemsheludko.github.io/adam-blog/?ref=blog.ravimakes.com">Adam Blog</a></h2>
<img alt="A collection of great Jekyll themes" class="kg-image" src="https://github.com/artemsheludko/adam-blog/raw/master/assets/img/adam-blog-imac.jpg?raw=true">
<p>Live Demo:</p>
<div class="article-content-first"><a id="button6" class="button read-more">Load</a></div>
<div id="iframeHolder6"></div>
<p>Source: <a href="https://github.com/artemsheludko/adam-blog?ref=blog.ravimakes.com">Github</a></p>
<p>Demo: <a href="https://artemsheludko.github.io/adam-blog/?ref=blog.ravimakes.com">Adam Blog</a></p>
<p>Another theme from the same developer as Galada. This is a great theme with features such as Google Analytics and disqus integration. Use it if it&apos;s to your taste.</p>
<h2 id="7flexiblejekyll">7. <a href="https://artemsheludko.github.io/flexible-jekyll/?ref=blog.ravimakes.com">Flexible-Jekyll</a></h2>
<img alt="A collection of great Jekyll themes" class="kg-image" src="https://github.com/artemsheludko/flexible-jekyll/raw/master/assets/img/promo-img.jpg?raw=true">
<p>Live Demo:</p>
<div class="article-content-first"><a id="button7" class="button read-more">Load</a></div>
<div id="iframeHolder7"></div>
<p>Source: <a href="https://github.com/artemsheludko/flexible-jekyll?ref=blog.ravimakes.com">Github</a></p>
<p>Demo: <a href="https://artemsheludko.github.io/flexible-jekyll/?ref=blog.ravimakes.com">Flexible-Jekyll</a></p>
<p>Another theme from the same developer as Galada. This is a great theme with features such as Google Analytics and disqus integration. A notable feature of this theme is that it generates an approximate time needed to read a post.</p>
<h2 id="8lokmont">8. <a href="https://lokmont-jekyll.netlify.com/?ref=blog.ravimakes.com">Lokmont</a></h2>
<img alt="A collection of great Jekyll themes" class="kg-image" src="https://github.com/artemsheludko/lokmont/raw/master/images/home-page.jpg?raw=true">
<p>Live Demo:</p>
<div class="article-content-first"><a id="button8" class="button read-more">Load</a></div>
<div id="iframeHolder8"></div>
<p>Source: <a href="https://github.com/artemsheludko/lokmont?ref=blog.ravimakes.com">Github</a></p>
<p>Demo: <a href="https://lokmont-jekyll.netlify.com/?ref=blog.ravimakes.com">Lokmont</a></p>
<p>Another theme from the same developer as Galada. This is a great theme with features such as Google Analytics and disqus integration. Use it if it&apos;s to your taste.</p>
<h2 id="9flexton">9. <a href="https://flexton.netlify.com/?ref=blog.ravimakes.com">Flexton</a></h2>
<img alt="A collection of great Jekyll themes" class="kg-image" src="https://github.com/artemsheludko/flexton/raw/master/images/preview.png?raw=true">
<p>Live Demo:</p>
<div class="article-content-first"><a id="button9" class="button read-more">Load</a></div>
<div id="iframeHolder9"></div>
<p>Source: <a href="https://github.com/artemsheludko/flexton?ref=blog.ravimakes.com">Github</a></p>
<p>Demo: <a href="https://flexton.netlify.com/?ref=blog.ravimakes.com">Flexton</a></p>
<p>Another theme from the same developer as Galada. This is a great theme with features such as Google Analytics and disqus integration. Use it if it&apos;s to your taste.</p>
<h2 id="10mrbrown">10. <a href="https://artemsheludko.github.io/mr-brown/?ref=blog.ravimakes.com">#Mr.Brown</a></h2>
<img alt="A collection of great Jekyll themes" class="kg-image" src="https://github.com/artemsheludko/mr-brown/raw/master/assets/images/mr.brown.jpg">
<p>Live Demo:</p>
<div class="article-content-first"><a id="button10" class="button read-more">Load</a></div>
<div id="iframeHolder10"></div>
<p>Source: <a href="https://github.com/artemsheludko/mr-brown?ref=blog.ravimakes.com">Github</a></p>
<p>Demo: <a href="https://artemsheludko.github.io/mr-brown/?ref=blog.ravimakes.com">#Mr.Brown</a></p>
<p>Another theme from the same developer as Galada. This is a great theme with features such as Google Analytics and disqus integration. Use it if it&apos;s to your taste.</p>
<hr>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><!--kg-card-begin: markdown--><p><strong>Author</strong>:<a href="https://lantoniotrento.github.io/?ref=blog.ravimakes.com">Antonio Trento</a><br>
This guy has made some really great themes. Issue is, he has created a lot of Github accounts and uploaded them from them. So it&apos;s quite hard to find them all.</p>
<h2 id="11helium">11. <a href="https://heliumjk.github.io/?ref=blog.ravimakes.com">Helium</a></h2>
<img alt="A collection of great Jekyll themes" class="kg-image" src="https://raw.githubusercontent.com/heliumjk/heliumjk.github.io/master/assets/images/helium-screenshot.jpg">
<p>Live Demo:</p>
<div class="article-content-first"><a id="button12" class="button read-more">Load</a></div>
<div id="iframeHolder12"></div>
<p>Source: <a href="https://github.com/heliumjk/heliumjk.github.io?ref=blog.ravimakes.com">Github</a></p>
<p>Demo: <a href="https://heliumjk.github.io/?ref=blog.ravimakes.com">heliumjk</a></p>
<p>This is another top notch jekyll theme. The biggest pro with this theme is that it has integration for Google Adsense and Google Analytics along with disqus and SEO integrations. If you wish to use this theme for a blog alone and don&apos;t want a landing page, just replace index.html with blog.html. I have done that <a href="https://github.com/ravikiranp123/heliumnetlify?ref=blog.ravimakes.com">here</a>. Feel free to fork that for use. The downside with this theme is that it hasn&apos;t been updated in a while. It still works fantastic though!</p>
<h2 id="12antcv">12. <a href="https://antcv.github.io/?ref=blog.ravimakes.com">AntCV</a></h2>
<img alt="A collection of great Jekyll themes" class="kg-image" src="https://github.com/antcv/antcv.github.io/blob/master/images/antcv.png?raw=true">
<p>Live Demo:</p>
<div class="article-content-first"><a id="button13" class="button read-more">Load</a></div>
<div id="iframeHolder13"></div>
<p>Source: <a href="https://github.com/antcv/antcv.github.io?ref=blog.ravimakes.com">Github</a></p>
<p>Demo: <a href="https://antcv.github.io/?ref=blog.ravimakes.com">AntCV</a></p>
<p>This one is a portfolio theme.</p>
<h2 id="13antoniotrento">13. <a href="antoniotrento.github.io">Antonio Trento</a></h2>
<!-- !\\\\\[Antonio Trento](https://github.com/antcv/antcv.github.io/blob/master/images/antcv.png?raw=true) -->
<p>Live Demo:</p>
<div class="article-content-first"><a id="button14" class="button read-more">Load</a></div>
<div id="iframeHolder14"></div>
<p>Source: <a href="https://github.com/antoniotrento/antoniotrento.github.io?ref=blog.ravimakes.com">Github</a></p>
<p>Demo: <a href="https://antoniotrento.github.io/?ref=blog.ravimakes.com">Antonio Trento</a></p>
<p>This one is a pretty good portfolio theme. Can&apos;t find an image for it though.</p>
<h2 id="14antoniotrento">14. <a href="https://lantoniotrento.github.io/?ref=blog.ravimakes.com">Antonio Trento</a></h2>
<!-- !\\\\\[Antonio Trento](https://github.com/antcv/antcv.github.io/blob/master/images/antcv.png?raw=true)-->
<p>Live Demo:</p>
<div class="article-content-first"><a id="button15" class="button read-more">Load</a></div>
<div id="iframeHolder15"></div>
<p>Source: <a href="https://github.com/antoniotrento/antoniotrento.github.io?ref=blog.ravimakes.com">Github</a></p>
<p>Demo: <a href="https://lantoniotrento.github.io/?ref=blog.ravimakes.com">Antonio Trento</a></p>
<p>Another one of this dude&apos;s themes? I am not really sure of the original author of this them but found it on his Github. Please do let me know if this belongs to aomeone else.</p>
<h2 id="15noalfemminicidio">15. <a href="https://noalfemminicidio.github.io/?ref=blog.ravimakes.com">noalfemminicidio</a></h2>
<!-- !\\\\\[Antonio Trento](https://github.com/antcv/antcv.github.io/blob/master/images/antcv.png?raw=true)-->
<p>Live Demo:</p>
<div class="article-content-first"><a id="button16" class="button read-more">Load</a></div>
<div id="iframeHolder16"></div>
<p>Source: <a href="https://github.com/antoniotrento/antoniotrento.github.io?ref=blog.ravimakes.com">Github</a></p>
<p>Demo: <a href="https://noalfemminicidio.github.io/?ref=blog.ravimakes.com">noalfemminicidio</a></p>
<p>Another one of this dude&apos;s themes? I am not really sure of the original author of this them but found it on his Github. Please do let me know if this belongs to aomeone else. Not really sure what it says on the page either. Has some good animations btw.</p>
<hr>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><!--kg-card-begin: markdown--><p>Author: <a href="https://github.com/Phlow?ref=blog.ravimakes.com">Phlow</a></p>
<h2 id="16phlow">16. <a href="http://phlow.github.io/feeling-responsive/?ref=blog.ravimakes.com">Phlow</a></h2>
<img alt="A collection of great Jekyll themes" class="kg-image" src="https://github.com/Phlow/feeling-responsive/raw/gh-pages/images/video-feeling-responsive-1280x720.jpg">
<p>Live Demo:</p>
<div class="article-content-first"><a id="button17" class="button read-more">Load</a></div>
<div id="iframeHolder17"></div>
<p>Source: <a href="https://github.com/Phlow/feeling-responsive?ref=blog.ravimakes.com">Github</a></p>
<p>Demo: <a href="https://phlow.github.io/feeling-responsive/?ref=blog.ravimakes.com">feeling-responsive</a></p>
<p>A cool theme with some nice and simple animations. Nothing very fancy.</p>
<hr>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><!--kg-card-begin: markdown--><p><strong>Author</strong>: <a href="https://thomasvaeth.com/?ref=blog.ravimakes.com">Thomas Vaeth</a></p>
<h2 id="17thomasvaethportfolio">17. <a href="https://thomasvaeth.com/?ref=blog.ravimakes.com">Thomas Vaeth Portfolio</a></h2>
<!-- !\\\\\[feeling-responsive](https://github.com/Phlow/feeling-responsive/raw/gh-pages/images/video-feeling-responsive-1280x720.jpg) -->
<p>Live Demo:</p>
<script type="text/javascript">
$(function(){
    $('#button18').click(function(){
        if(!$('#iframe').length) {
                $('#iframeHolder18').html('<iframe sandbox = "allow-scripts" class="kg-image" src="https://thomasvaeth.com" width="100%" height="540"></iframe>');
        }
    });   
});
</script>
<div class="article-content-first"><a id="button18" class="button read-more">Load</a></div>
<div id="iframeHolder18"></div>
<p>Source: <a href="https://github.com/thomasvaeth/thomasvaeth.github.io?ref=blog.ravimakes.com">Github</a></p>
<p>Demo: <a href="https://thomasvaeth.com/?ref=blog.ravimakes.com">Thomas Vaeth Portfolio</a></p>
<p>This is a great portfolio theme. Very, very fancy! Must try!</p>
<h2 id="18trophy">18. <a href="https://thomasvaeth.github.io/trophy-jekyll/?ref=blog.ravimakes.com">Trophy</a></h2>
<img alt="A collection of great Jekyll themes" class="kg-image" src="https://github.com/thomasvaeth/trophy-jekyll/raw/master/_screenshots/screenshot-1.png">
<p>Live Demo:</p>
<div class="article-content-first"><a id="button19" class="button read-more">Load</a></div>
<div id="iframeHolder19"></div>
<p>Source: <a href="https://github.com/thomasvaeth/thomasvaeth.github.io?ref=blog.ravimakes.com">Github</a></p>
<p>Demo: <a href="https://thomasvaeth.github.io/trophy-jekyll/?ref=blog.ravimakes.com">Trophy</a></p>
<p>An interesting theme with a sidebar and really good animations. Comes in a retro style.</p>
<hr>
<p>I hope you liked them and managed to find the best theme for your blog or portfolio. I have built this list to specifically not include the famous themes you find everywhere you google. Please do leave a comment and feel free to contact me.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[ABL Using IR]]></title><description><![CDATA[Ever wondered why no one used or recommended an IR Sensor as a 3D Printer's  Auto Bed Levelling sensor? Here is a simple guide to use an IR Sensor for ABL and the issues you are likely to face.]]></description><link>https://blog.ravimakes.com/abl-using-ir-sensor-on-ender-3/</link><guid isPermaLink="false">649f1edd428bcb01558c075e</guid><category><![CDATA[ABL]]></category><category><![CDATA[Ender 3]]></category><dc:creator><![CDATA[Ravi Kiran P]]></dc:creator><pubDate>Mon, 22 Jul 2019 18:02:00 GMT</pubDate><media:content url="https://blog.ravimakes.com/content/images/2019/12/IRSensor.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.ravimakes.com/content/images/2019/12/IRSensor.jpg" alt="ABL Using IR"><p>In my <a href="https://blog.ravimakes.com/freeabl-the-cheapest-and-free-abl-for-ender-3/">previous post</a>, I wrote a thrifty solution to achieving Auto Bed Levelling on Ender 3 using the work of thingverse user <a href="https://www.thingiverse.com/stevohen?ref=blog.ravimakes.com">stevohen</a>. If you tried it out, you would realise that It is a semi-automatic method and requires you to slide the switch in and out of the mount everytime you start a print. This is mostly fine for regular use. However, if you are experimenting with some settings on cura or designing a model and end up cancelling the print every now and then they fail, you are going to get frustrated with sliding the switch every 5 minutes. This is what happened to me and I started trying out other methods to completely automate the entire auto bed levelling process. Being the Thrifty Engineer that I am, I would much rather try to accomplish this with existing things in my store. By store, I mean the dump I made with components salvaged from broken things.</p>
<p>Well, being the genius I am, I had the brilliant idea that I could just use an IR Sensor that was lying around. And since this thing costs barely INR 70 or about $1, it&apos;s truly worthy of being here on <a href="ThriftyEngineer.com">ThriftyEngineer.com</a>. In this post, I will show you how I managed to get complete auto bed levelling on my Ender 3 (Well with some caveats of course). Tag along and feel free to comment or ping me if you have any queries.</p>
<p>When I started researching on this topic online, I found out that this was pretty much never done before. Or at least never been documented. No blogs, no youtube videos, nothing. I was quite baffled as this seemed to be a very very low cost and simple way to solve this bed levelling issue. It was only after completing everything did I realise the reason why no one uses these IR Sensors for Auto Bed Levelling. Nonetheless, it still is technically possible to use them. And to give you a very short answer, it has too many issues and is not worth it. If you wish to understand exactly what goes wrong and some of my solutions to solve them, please read along.</p>
<hr>
<h2 id="prerequisites">Pre-Requisites:</h2>
<ol>
<li>Ender 3 with bootloader flashed.</li>
<li>IR Sensor like one shown below.</li>
</ol>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.ravimakes.com/content/images/2019/12/IRSensor-2.jpg" class="kg-image" alt="ABL Using IR" loading="lazy"><figcaption>IRSensor as ABL for Ender 3 (Experimental)</figcaption></figure><!--kg-card-begin: markdown--><ol start="3">
<li>Some 3D modelling skills in SketchUp or Fusion 360.</li>
</ol>
<hr>
<p>What you see in the picture above is my IR Sensor mounted on my final model of switch plate. I remodelled the switch plate from <a href="https://blog.ravimakes.com/freeabl-the-cheapest-and-free-abl-for-ender-3/">FreeABL</a> to suit the particular IR Sensor I had. From what I have seen online, there are a lot of different kinds of these IR Sensors and you will have to design or remodel the plate on your own. I will share my model if it helps you.</p>
<p>Here&apos;s how you get started.</p>
<h3 id="part1physicalmount">Part 1: Physical Mount</h3>
<ol>
<li>As explained above, you need to model and print the adapter plate to suit your sensor. It will look something like this:</li>
</ol>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/IRSensor_plate.JPG" class="kg-image" alt="ABL Using IR" loading="lazy"></figure><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><!--kg-card-begin: markdown--><ol start="2">
<li>A few things to consider when you (re)model:
<ul>
<li>The distance between the screws.</li>
<li>How far from the handle should your first screw be so that it won&apos;t obstruct the IR Sensor module when you try to screw it in.</li>
<li>The depression you might have to give so that the soldered parts do not get obstructed by the plastic.</li>
<li>In my case, I already had the FreeABL mount. So I just adapted the same to fit under my IR Sensor. It took me about 2 trials to get what I wanted correctly.</li>
</ul>
</li>
</ol>
<h3 id="part2wiring">Part 2: Wiring</h3>
<p>This is where things got quite interesting. The Z axis end stop switch is a very basic switch and has only 2 wires. One being signal and the other being voltage high. The IR Sensor is going to need three wires minimum. Along with the above two, it also needs a dedicated ground wire. To overcome this without any splicing of wires or any extra circuitry, I decided to use the IO pins in my Ender 3&apos;s melzi board to power the sensor. And then connected the digital out to the signal wire on the end stop&apos;s signal wire. I will try and make a simple diagram for you when I get some more time.</p>
<h3 id="part3firmware">Part 3: Firmware</h3>
<p>The firmware needs to be modified exactly the same way it had to be modified to use FreeABL. Here are the settings I changed.</p>
<p><em>You need to have these the lines to reduce space on the default sanguino board. If you have a board like SKR 1.4 or MKS Gen L, you may skip these as they have more space.</em></p>
<pre><code>
#define SLIM_LCD_MENUS
//#define SHOW_BOOTSCREEN
//#define SPEAKER
</code></pre>
<p><em>These lines enable auto bed leveling:</em></p>
<pre><code>
#define FIX_MOUNTED_PROBE
#define AUTO_BED_LEVELING_BILINEAR
#define Z_SAFE_HOMING
#define Z_MIN_PROBE_REPEATABILITY_TEST
#define EXTRAPOLATE_BEYOND_GRID

</code></pre>
<p><em>These lines tell the firmware where the probe is relative to the front left corner of the heat block, so that when probing happens the printer will treat the probe as the center. The values I have here are not perfect, but they work close enough for me. You  will most probably only need to adjust the &quot;Make the following changes: &quot;. This can also be adjusted later and is a topic by itself.</em></p>
<pre><code>
#define X_PROBE_OFFSET_FROM_EXTRUDER -37 // X offset: -left +right [of the nozzle]
#define Y_PROBE_OFFSET_FROM_EXTRUDER -5 // Y offset: -front +behind [the nozzle]
#define Z_PROBE_OFFSET_FROM_EXTRUDER -5 // Z offset: -below +above [the nozzle]

</code></pre>
<p><em>NOTE: The next definition occurs 3 times in the file. Change the one that occurs right after the AUTO_BED_LEVELING_BILINEAR &quot;#if&quot; statement. This line will change the default mesh grid to 4x4 instead of 3x3. You can even make it 5 if you want. Increasing this will increase the accuracy of the bed levelling but take more time to complete the bed levelling process. You will need to change this to a higher number only if you have an wxtremely warped bed. Otherwise it won&apos;t make too much of a difference!</em></p>
<pre><code>
#define GRID_MAX_POINTS_X 4

</code></pre>
<p><em>You may also change these optionally. They just give you a few more options in your menu screen.</em></p>
<p><em>For fun! Change the name of your 3D printer on the home menu:</em></p>
<pre><code>#define CUSTOM_MACHINE_NAME &quot;Ravi&apos;s 3D&quot;
</code></pre>
<p><em>In file Configuration_adv.h<br>
This line is also necessary to reduce program size. Again, you do this if you have the original board. If you have an after  market board like SKR 1.4 or MKS Gen L.</em></p>
<pre><code>
//#define ARC_SUPPORT // Disable this feature to save ~3226 bytes

</code></pre>
<p>You may refer my <a href="https://blog.ravimakes.com/freeabl-the-cheapest-and-free-abl-for-ender-3/">FreeABL Guide</a> to get a more detailed picture of what is being done in those lines.</p>
<h3 id="part4initialsetup">Part 4: Initial Setup</h3>
<p>For the first run, push you gantry up and send command <strong>G28</strong> to auto home. When the gantry starts to move downwards, put your hand under the sensor to trigger the sensor. This is important and will help you avoid the nozzle ramming into your bed. Depending on how your machine responds, you may need to adjust the sensitivity of the sensor and also invert the z axis bool in the firmware. Post this, run command <strong>G29 L30 R190 F30 B190</strong> to perform auto bed levelling routine.</p>
<p>Now this is where I realised why this sensor was not more popular with the 3D printing community for auto bed levelling. You see, when the bed does not have uniform colour and has any sort of differences in reflectivity, the sensor&apos;s trigger goes haywire. What do I mean? Well, every where my bed had the Creality logo, the sensor could detect from about 40 mm. However, on the black surface area, it could only detect from 8 mm with the exact same sensitivity settings on the potentiometer. Why? The logo area was reflecting much better than the black area.</p>
<p>So what&apos;s the solution? Simple. <a href="https://robu.in/product/220-x-220-x-0-5mm-black-frosted-heated-bed-sticker-build-plate-tape-with-adhesive-backing-for-3d-printer?ref=blog.ravimakes.com">This</a>. It is uniformly black and thus gives a very good reflective surface. However, if you are going to pay that much, you might as well by an NPN or PNP inductive sensor like <a href="https://amzn.to/2GfQftJ?ref=blog.ravimakes.com">this</a> or <a href="https://robu.in/product/lj12a3-4-z-by-6-36v-dc-induction-proximity-sensor-switch-12mm?ref=blog.ravimakes.com">this one</a>.</p>
<p>I would also like to let you know that the IR Sensor is extremely sensiive to sunlight. And the height at which it detects varies widely. So if you wanna still use this simple sensor, you need to completely isolate the machine or sensor from external light sources.</p>
<p>All in all it&apos;s not worth it.</p>
<p>Well, now you know why the IR Sensors are not popular or probably even used in the 3D Printing community. If you do have a better way to do auto bed levelling the Thrifty Engineer style, please do comment and let me know.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[FreeABL - The cheapest and free ABL for Ender 3]]></title><description><![CDATA[Want to have Bi-Linear Auto Bed Levelling (ABL) on your Ender 3 for no
  additional cost? Look no further! This shows how to use your existing Z-Axis end-stop
  switch as to have free ABL]]></description><link>https://blog.ravimakes.com/freeabl-the-cheapest-and-free-abl-for-ender-3/</link><guid isPermaLink="false">649f1edd428bcb01558c075d</guid><category><![CDATA[Ender 3]]></category><category><![CDATA[FreeABL]]></category><dc:creator><![CDATA[Ravi Kiran P]]></dc:creator><pubDate>Thu, 09 May 2019 17:48:00 GMT</pubDate><media:content url="https://blog.ravimakes.com/content/images/2019/12/freeabl.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.ravimakes.com/content/images/2019/12/freeabl.jpg" alt="FreeABL - The cheapest and free ABL for Ender 3"><p>I accidentally stumbled upon this <a href="https://www.thingiverse.com/thing:3468254?ref=blog.ravimakes.com">thingverse model</a> claiming to provide Bi-Linear bed levelling on my budget Ender 3. It seemed quite promising and I was having a lot of issues in the recent past with the levelling. There was even a time when my hot end scraped through the bed ruining it. Perfect timing I thought and decided to print it.</p>
<p>I can assure you I was quite impressed with the results. The instructions on the Thingverse are quite self explanatory for the most part. But the final usage can be confusing. This post attempts to explain the DO&apos;s and DONT&apos;s a bit more clearly so you can avoid breaking your head and wasting your time.</p>
<hr>
<h2 id="basicexplanation">Basic Explanation:</h2>
<p>The motors on your 3D printer can turn very accurately to any position you want them to relative to the position they were in when started. However, when you turn off your machine or disable the motor, you can manually move the gantry and turn the motors. These movements do not get captured. Especially if the machine is off. So, your software no longer knows where your gantry/bed are. To ascertain the current position, the motors spin to move the indiavidual members on each axis like the hotend, bed and the gantry towards one side indefinetely to reach an end. And to know where the end of the axis is, a switch is used. This is called an end stop switch. Just a fancy name for a regular high quality switch. The switch sends a stop message to the software the moment it clicks.</p>
<p>The switch is off -&gt; Keep moving the member<br>
The switch is on -&gt; Stop moving the member</p>
<p>Now, if I attach this switch on my hot end with an offset to the nozzle, I can lower the switch on various points on my bed. Everytime the switch clicks, it sends a signal and I know that it has reached the bed. Any uneven-ness on the bed gets captured when you repeat this on various grid points on the bed.</p>
<p>With this data of different points on the bed, the z axis moves to adjust at various points on the bed. This is the basic working of Auto Bed Level (ABL).</p>
<p>There is one issue though. Since the switch is below the nozzle, every time the nozzle heats up and goes down to print, the switch is going to crash into the bed. So something like a BL Touch uses a motor to lift the tip up. In this case, our dude solves this issue is a very simple way. My manually removing it. To make it easier, he created a dove tail joint that just slides the switch on and off the hotend.</p>
<p>Simply put, when the machine homes the z-axis or does a bed levelling routine, we need the switch on. When it starts to print, we need it to be removed. To give us time, we have some start GCode on every sliced file to home the axes and then move the hotend towards you before heating the hotend and bed. This is when you remove it.</p>
<p>This is frankly the best picture of what Thrifty Engineer is all about. Finding cheap and effective solutions to complex problems!</p>
<hr>
<h2 id="prerequisites">Pre-Requisites:</h2>
<ol>
<li>You need to have a bootloader installed on your Ender 3.</li>
<li>Know how to edit and flash marlin firmware.</li>
<li>Dupont connectors or some cables.</li>
</ol>
<hr>
<h2 id="installation">Installation:</h2>
<ol>
<li>On the thingverse page, download the files and print the mount as well as the switch plate.</li>
<li>Mount the mount on your hotend as shown in the picture below.</li>
</ol>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/Mount-on-hotend.jpg" class="kg-image" alt="FreeABL - The cheapest and free ABL for Ender 3" loading="lazy"></figure><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><!--kg-card-begin: markdown--><ol start="3">
<li>Open the marlin.ino after replacing configuration files from the latest firmware downloaded from <a href="http://marlinfw.org/meta/download/?ref=blog.ravimakes.com">MarlinFW</a></li>
<li>To enable or disable features, Just look for the 2 forward slashes in fron of &quot;#define&quot;. If they exist, that function is disabled. If they don&apos;t exist, it is enabled. Follow the code snippet below and enable or disable features by just searching for them one by one. The italics are my comments. They are just for your reference.</li>
</ol>
<p><em>You need to have these the lines to reduce space on the default sanguino board. If you have a board like SKR 1.4 or MKS Gen L, you may skip these as they have more space.</em></p>
<pre><code>
#define SLIM_LCD_MENUS
//#define SHOW_BOOTSCREEN
//#define SPEAKER
</code></pre>
<p><em>These lines enable auto bed leveling:</em></p>
<pre><code>
#define FIX_MOUNTED_PROBE
#define AUTO_BED_LEVELING_BILINEAR
#define Z_SAFE_HOMING
#define Z_MIN_PROBE_REPEATABILITY_TEST
#define EXTRAPOLATE_BEYOND_GRID

</code></pre>
<p><em>These lines tell the firmware where the probe is relative to the front left corner of the heat block, so that when probing happens the printer will treat the probe as the center. The values I have here are not perfect, but they work close enough for me. You  will most probably only need to adjust the &quot;Make the following changes: &quot;. This can also be adjusted later and is a topic by itself.</em></p>
<pre><code>
#define X_PROBE_OFFSET_FROM_EXTRUDER -37 // X offset: -left +right [of the nozzle]
#define Y_PROBE_OFFSET_FROM_EXTRUDER -5 // Y offset: -front +behind [the nozzle]
#define Z_PROBE_OFFSET_FROM_EXTRUDER -5 // Z offset: -below +above [the nozzle]

</code></pre>
<p><em>NOTE: The next definition occurs 3 times in the file. Change the one that occurs right after the AUTO_BED_LEVELING_BILINEAR &quot;#if&quot; statement. This line will change the default mesh grid to 4x4 instead of 3x3. You can even make it 5 if you want. Increasing this will increase the accuracy of the bed levelling but take more time to complete the bed levelling process. You will need to change this to a higher number only if you have an wxtremely warped bed. Otherwise it won&apos;t make too much of a difference!</em></p>
<pre><code>
#define GRID_MAX_POINTS_X 4

</code></pre>
<p><em>You may also change these optionally. They just give you a few more options in your menu screen.</em></p>
<p><em>For fun! Change the name of your 3D printer on the home menu:</em></p>
<pre><code>#define CUSTOM_MACHINE_NAME &quot;Ravi&apos;s 3D&quot;
</code></pre>
<p><em>In file Configuration_adv.h<br>
This line is also necessary to reduce program size. Again, you do this if you have the original board. If you have an after  market board like SKR 1.4 or MKS Gen L.</em></p>
<pre><code>
//#define ARC_SUPPORT // Disable this feature to save ~3226 bytes

</code></pre>
<p>Continuing with the <strong>Installation:</strong><br>
5. Compile and upload the sketch to your Ender 3.<br>
6. Once done, remove your Z endstop switch and separate the plastic as shown below:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/Switch.jpg" class="kg-image" alt="FreeABL - The cheapest and free ABL for Ender 3" loading="lazy"></figure><!--kg-card-begin: markdown--><ol start="7">
<li>You no longer need this and you may keep it away safely:</li>
</ol>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/11/Plastic-bracket.jpg" class="kg-image" alt="FreeABL - The cheapest and free ABL for Ender 3" loading="lazy"></figure><!--kg-card-begin: markdown--><ol start="8">
<li>Using the existing allen screws, attach the switch to the switch mount as shown below:</li>
</ol>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/11/switch-on-plate.jpg" class="kg-image" alt="FreeABL - The cheapest and free ABL for Ender 3" loading="lazy"></figure><!--kg-card-begin: markdown--><ol start="9">
<li>Slide your switch in using the dovetail and connect the jumper wires. You need to follow the colors and match them in such a way that they connect the same way they used to connect when done directly. Take a look at this:</li>
</ol>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/11/Connecting-the-wires.jpg" class="kg-image" alt="FreeABL - The cheapest and free ABL for Ender 3" loading="lazy"></figure><!--kg-card-begin: markdown--><ol start="10">
<li>In this case, I followed the <strong>white</strong> dupont connector and connected it to <strong>S</strong>. While the <strong>Grey</strong> one was connected to <strong>V</strong>.</li>
</ol>
<!--kg-card-end: markdown--><hr><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><!--kg-card-begin: markdown--><h2 id="firstruninstructions">First Run Instructions:</h2>
<ol>
<li>Connect to your printer using serial monitor from arduino or <a href="http://kliment.kapsi.fi/printrun/?ref=blog.ravimakes.com">pronterface</a>.</li>
<li>Send command: <strong>G28</strong> to home your axis. Notice that the Z axis homing now happens at the center of the bed. Note: I highly recommend you to move your gantry up manually a bit so you get some time to test and make sure your connections are correct and working.</li>
<li>To test the connections, you may just press the switch button to the click. If the gantry immediately starts to move up and back down slowly, your setup is working and correct. You only need to do this the first time.</li>
<li>Then repeat the homing by command G28. Let it home this time.</li>
<li>Send Command: <strong>G29 L30 R190 F30 B190</strong> to perform a bed levelling routine. This command creates a grid bound by the square 30 mm from left, 190 mm towards right, 30 from front and 190 towards back, This is done to avoid your clips and also because the plate we get is smaller than the max positions our bed can move.</li>
<li>Send command: <strong>M500</strong> to save your G29 bed level to EEPROM (so it will be remembered when you power down).</li>
<li>Additionally you may run command <strong>M48</strong> to test your switch for reliability. As long as the standard deviation is under .05, you are good. Otherwise your levelling might not be accurate and you may try another switch.</li>
</ol>
<hr>
<h2 id="operationalinstructions">Operational Instructions:</h2>
<ol>
<li>For using the bed levelling functionality, you need to adjust the start Gcode on your slicer profile to this:</li>
</ol>
<pre><code>; Ender 3 Custom Start G-code
M0 Insert Z Switch ;Pause with message for user
G28 ; Home all axes
M420 S1 ;Enable Mesh Bed Levelling
G1 Y-{machine_depth} Z40 F1500 ;Move Heat Bed back and lift nozzle

; Heat up bed
M140 S{material_bed_temperature} ;Start heating bed
M0 Remove Z Switch ;Pause with message for user

; Now do rest of heat up (unsafe to start before, as user might burn)
M104 S{material_print_temperature} ;Start heating extruder
M109 S{material_print_temperature} ;Wait heating extruder
M190 S{material_bed_temperature} ;Wait heating bed

G1 Z15 F100 ; Slowly lower the nozzle to give you a headsup that printing is starting
; End of custom start G-code
</code></pre>
<ol start="2">
<li>If you are using Cura, you will find the option to do so here =&gt; <em>Preferences -&gt; Configure Cura -&gt; Printers -&gt; Machine Settings -&gt; Start Gcode</em>. Replace all the content here.</li>
<li>When you a slice a stl with this start gcode and begin a print, here is what happens:<br>
a. Your print pauses at the beginning and display a message to slide your switch in. This is when you do so as it will home after this.<br>
b. Once it&apos;s done homing, the bed will move back and the hotend will rise to 40mm. This is when you remove the switch from the slide.<br>
c. At this point, your bed and hotend will begin heating.<br>
d. After heating is done, the hotend will slowly go down. If you haven&apos;t yet removed your switch, you must do so now. Or it will crash into your bed and break.<br>
e. Post this, it&apos;s regular printing process.</li>
</ol>
<p>Well, there we go! That&apos;s the guide to getting complete semi auto bed levelling on your Ender 3. It may be doable on other printers as well. If you manage to do so, Please do comment and let me know.</p>
<p>Also, if you are willing to spend about INR 75 or $1, you will can also use an IR Sensor to achieve complete auto bed levelling. You will not longer have to worry about removing and sliding the switch in. You may find the guide to that here.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[Comprehensive Guide to Free Website Hosting -Part 2]]></title><description><![CDATA[Sick and tired of all the scammy free hosting sites and the spammy paid reviews you find everywhere? This is where you get the no-nonsense solution. Part 2 contains self-hosting methods on your hardware.]]></description><link>https://blog.ravimakes.com/comprehensive-guide-to-free-website-hosting-part-2/</link><guid isPermaLink="false">649f1edd428bcb01558c075c</guid><category><![CDATA[Free Hosting]]></category><dc:creator><![CDATA[Ravi Kiran P]]></dc:creator><pubDate>Wed, 23 Jan 2019 07:54:00 GMT</pubDate><media:content url="https://blog.ravimakes.com/content/images/2019/12/freeHosting.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.ravimakes.com/content/images/2019/12/freeHosting.jpg" alt="Comprehensive Guide to Free Website Hosting -Part 2"><p>Continuing where we left off in our <a href="https://blog.ravimakes.com/comprehensive-guide-to-free-website-hosting/">previous post</a>, let us look at some more methods with which we can have free hosting for our websites.</p><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><!--kg-card-begin: markdown--><ol start="4">
<li>
<p>Self-hosting</p>
<ol>
<li>
<p>Using a raspberry pi</p>
</li>
<li>
<p>Using a TV box</p>
</li>
<li>
<p>Using an old mobile of yours</p>
</li>
<li>
<p>Using an old laptop</p>
</li>
</ol>
</li>
</ol>
<p><em><strong>The below content is still experimental! So please be aware of that.</strong></em></p>
<h2 id="4selfhosting">4 Self Hosting</h2>
<p>Well, now that the simpler ones are done, let&#x2019;s continue to more interesting solutions. To continue, you are going to need some hardware for the next section of magic. Don&#x2019;t worry though. It&#x2019;s mostly an old smartphone, laptop or a TV Box or a Raspberry Pi that you can use for more than just hosting. And since you are going to have your own hardware, you will be able to use even WordPress on these solutions.</p>
<hr>
<h3 id="41usingaraspberrypi">4.1 Using a Raspberry Pi</h3>
<p>Raspberry Pi is a very low cost, low energy consuming device that has a wide variety of uses from use as a media server to automating your home and creating robots. You can follow these instructions to have a web hosting server on your Raspberry Pi.</p>
<p>Pre-requisites:</p>
<ol>
<li>
<p>Raspberry Pi</p>
</li>
<li>
<p>Raspbian OS on it.</p>
</li>
</ol>
<p>How to get a server running on a raspberry pi:</p>
<blockquote>
<p>Well, my initial plans were to write a comprehensive guide to this. However,<br>
the official guides present on Raspberry&#x2019;s website are very comprehensive<br>
and beginner friendly. Anything I write here will just be a copy paste of<br>
it. Which makes no sense. So I will just leave you with a link to their<br>
guide.</p>
</blockquote>
<blockquote>
<p>Here you go: <a href="https://projects.raspberrypi.org/en/projects/lamp-web-server-with-wordpress?ref=blog.ravimakes.com">Raspberry Pi<br>
Wordpress</a></p>
</blockquote>
<hr>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/TV-Box-1.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting -Part 2" loading="lazy"></figure><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><!--kg-card-begin: markdown--><p>Like Raspberry Pi, you get these little low-cost Single Board Computer (SBC) based android TV boxes. The best part about them is that they all have open hardware that you can use to hack and run Debian/Ubuntu. Be it a server or a full desktop environment. I have a TV Box named X96 Mini. This name is not very important. It has an Amlogic S905w chipset. Now this part, is very important. You will have to find community builds for your chipset. The communities for these SBCs are very vibrant and active. I suggest you take part in them.</p>
<p>I use this TV Box: <a href="https://www.banggood.in/custlink/GGmKCTF5pQ?ref=blog.ravimakes.com">X96</a>. If you are going to buy one now, I highly recommend against that model though. My box&#x2019;s wifi and bluetooth got borked within a couple of days. I did get a partial refund from Banggood though. Anyway, at the time of writing, I would recommend this one: <a href="https://www.banggood.in/custlink/G33GJTFFjm?ref=blog.ravimakes.com">H96</a> or this one: <a href="https://www.banggood.in/custlink/KGGDcw5PB5?ref=blog.ravimakes.com">H96 Max</a>. Both of these use different chipsets but have support available. The same guy (balbes150) that builds distros for the product I have builds for these chipsets as well. I have checked and debian and ubuntu are available with all basic functions available.</p>
<p>Let&#x2019;s get started using the S905w TV Box that I have.</p>
<ol>
<li>
<p>Go <a href="https://yadi.sk/d/pHxaRAs-tZiei?ref=blog.ravimakes.com">here</a> and download the latest image ile of your choice for your model. You may have to search around if you have a different chipset. Again, the name of your product does not matter. Just this chipset used does.</p>
</li>
<li>
<p>Extract the image using 7zip or similar.</p>
</li>
<li>
<p>Using either etcher or similar program, write the image to a fast USB with atleast 16GB. You may also use an SD Card.</p>
</li>
<li>
<p>Turn off your box and insert the USB into your Box.</p>
</li>
<li>
<p>You may have to use a toothpick to press a hidden reset button in the AV slot. Use youtube for your model. You are on your own with this as the method varies for each manufacturer. Mine boots using the USB if its inserted. No further steps necessary.</p>
</li>
<li>
<p>You will boot up into your distro. Login using username: root and password: 1234 the first time. You will have to set up things like a new username, a new password, etc.</p>
</li>
<li>
<p>Next up, assign a static local IP to your box and forward port 80 to it on your router. The methods for each router would be slightly different. You will have to search around for this. You can find an example for this on section 2.3.4</p>
</li>
<li>
<p>Once that&#x2019;s done, you may proceed to installing the LAMP server and WordPress. This is the same as what you have in <strong>Section 3.4</strong></p>
</li>
<li>
<p>Alternatively, you may use the built in armbian config to install ISPConfig. ISPConfig is a web panel like Virtualmin and cPanel. This will make adding new websites and apps a lot more user freindly.</p>
</li>
</ol>
<hr>
<h3 id="43usinganoldsmartphone">4.3 Using an old smartphone</h3>
<p>Old smartphones are still quite powerful and power efficient to be used as<br>
servers.</p>
<p>The basic part involves setting up a server on your mobile using either server apps like <a href="https://play.google.com/store/apps/details?id=com.icecoldapps.serversultimate&amp;ref=blog.ravimakes.com">Servers Ultimate</a> or the free ones like: <a href="https://play.google.com/store/apps/details?id=com.esminis.server.apache&amp;ref=blog.ravimakes.com">Apache Server</a><br>
and <a href="https://play.google.com/store/apps/details?id=com.esminis.server.php&amp;ref=blog.ravimakes.com">PHP Server</a></p>
<p>Servers Ultimate is paid and a bit costly. But quite worth it. Do consider it.</p>
<p>The basic steps to have a web server running on your smart phone are quite<br>
simple:</p>
<h4 id="431usingserversultimate">4.3.1 Using Servers Ultimate:</h4>
<blockquote>
<p><strong>Create the Servers</strong></p>
</blockquote>
<ol>
<li>
<p>Go to <a href="https://wordpress.org/latest.zip?ref=blog.ravimakes.com">WordPress.org</a> and download the WordPress web software to your PC. Extract the archived files to a single folder on your PC. Copy this folder, preferably, to the root of your device SD Card</p>
</li>
<li>
<p>Start the Servers Ultimate app on your device, click on the &#x201C;+&#x201D; sign on the top right of your screen</p>
</li>
<li>
<p>Select &#x201C;MySQL server&#x201D;</p>
</li>
<li>
<p>Give the server a name and save it. Named mine &#x201C;wp_mysql&#x201D; (without the quotes, of course)</p>
</li>
<li>
<p>Again, click on the &#x201C;+&#x201D; sign on the top right of your screen</p>
</li>
<li>
<p>Select &#x201C;PHP and Lighttpd Server&#x201D;</p>
</li>
<li>
<p>Give the server a name. Named mine WordPress. Do not exit the screen just yet!</p>
</li>
</ol>
<p><strong>Configure the services</strong></p>
<ol>
<li>
<p>Select the next tab labelled &#x201C;Specific&#x201D;</p>
</li>
<li>
<p>Look under &#x201C;Servers&#x201D;, ensure the options &#x201C;Enable Lighttpd Server&#x201D; and &#x201C;Enable PHP Server&#x201D; are checked.</p>
</li>
<li>
<p>Scroll down and look under &#x201C;Document Root&#x201D;. Browse to the WordPress folder on your phone and select it.</p>
</li>
<li>
<p>Under &#x201C;Server Tag&#x201D;, you may enable all the options, especially &#x201C;Enable PHPMyadmin&#x201D;</p>
</li>
<li>
<p>Now press save. The screen will exit.</p>
</li>
<li>
<p>From the Server Ultimate default screen, click the start icon to start the two servers, &#x201C;WordPress&#x201D; and &#x201C;wp_mysql&#x201D;</p>
</li>
<li>
<p>Now right-click on the server labelled WordPress. From the context menu, select Information. Note the IP address that has been assigned to it. It will be in the form <a href="http://192.168.xxx.xxx:8082/?ref=blog.ravimakes.com">http://192.168.xxx.xxx:8082/</a></p>
</li>
</ol>
<p><strong>Create Database</strong></p>
<ol>
<li>
<p>Go to the following URL <a href="http://192.168.xxx.xxx:8082/phpmyadmin/?ref=blog.ravimakes.com">http://192.168.xxx.xxx:8082/phpmyadmin/</a></p>
</li>
<li>
<p>Log in with the following credentials; Username is &#x201C;root&#x201D;. Leave the password blank</p>
</li>
<li>
<p>Click on the &#x201C;Databases&#x201D; at the top left of the screen</p>
</li>
<li>
<p>Enter &#x201C;wordpress_db&#x201D; in the Create Database field and tap Create</p>
</li>
</ol>
<p><strong>Final Installation</strong></p>
<ol>
<li>
<p>Type the following URL in your browser to start the WordPress installation; <a href="http://192.168.xxx.xxx:8082/wp-admin/install.php?ref=blog.ravimakes.com">http://192.168.xxx.xxx:8082/wp-admin/install.php</a></p>
</li>
<li>
<p>When prompted fill in wordpress_db in the Database Name field</p>
</li>
<li>
<p>Fill in <strong>root</strong> in the User Name field</p>
</li>
<li>
<p>Leave the password field blank</p>
</li>
<li>
<p>On the Welcome Page, fill in the details requested for, then click <strong>Install WordPress</strong>. On completion, you will be taken to the admin page of your website.</p>
</li>
<li>
<p>To view the front end, your type the IP address 192.168.xxx.xxx to your browser.</p>
</li>
</ol>
<p>As it is, you can only view your site from within your LAN. In the next part of this post, we would go through the paces on how to access your new site from anywhere on the Internet.</p>
<h4 id="432makeyourserveraccessiblefromtheweb">4.3.2 Make Your Server Accessible From the Web</h4>
<p>If you want users outside of your local network to see your web server, you must make a few tweaks to your router settings. Every brand of router has its own administration menus so the names of menus and fields will vary slightly, but these are the general steps you must take to make your Android web server available on the Internet.</p>
<ol>
<li><strong>Log into your router&apos;s administration page</strong> from your PC. If you don&apos;t<br>
know its IP address, check the user&apos;s manual for your router.</li>
</ol>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/7522198eebc8df2cb3e9d9c6efed5d07.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting -Part 2" loading="lazy"></figure><p>2. <strong>**Make a static IP address available for your Android device**</strong>. Local IP addresses tend to start with 192.168.10.1 and go up from there. If your router provides DHCP (dynamically assigned IPs) to an address range, anything lower than that range will be available for a static assignment. For example, our router uses addresses 192.168.10.101 to 192.168.10.200 for dynamic assignments so we chose to give our phone the 192.168.10.99 address. Some routers will also let you reserve a specific address.</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/f6c5e75280995234c7a89add0870856b.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting -Part 2" loading="lazy"></figure><p>3. **Configure your router to forward port 80 to port 8080 on the static IP address** you&apos;re assigning to your Android device. On our router, this function was labeled &quot;Add virtual server&quot; but on others it will called &quot;port forwarding.&quot;</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/c1db8e2ebb0b5fd5ddf951ee9bc2a94a.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting -Part 2" loading="lazy"></figure><p>4. Navigate to the Wi-Fi menu on your Android device.</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/60aa493cc9f46d73a7d8e56bc38e1868.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting -Part 2" loading="lazy"></figure><p>5. Long press the name of your Wi-Fi network and select Modify Network.</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/907859aca3c512fe820047b22784ae6e.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting -Part 2" loading="lazy"></figure><p>6. Check show advanced options.</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/93c5c7a1945f47866d0c2812bfcce926.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting -Part 2" loading="lazy"></figure><p>7. Select Static under IP settings and enter the static IP address you chose(or reserved) and tap Save.</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/8d1ee1502b00a80827dfb51ee7a70ea4.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting -Part 2" loading="lazy"></figure><p>8. Search Google for the term &quot;What&apos;s My IP&quot; to find your router&apos;s public IP address. Google will display it above the search results.</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/f09280976638ae4b18898cccdef85a2d.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting -Part 2" loading="lazy"></figure><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><!--kg-card-begin: markdown--><p>Anyone on the Internet will now be able to navigate to your site, as long as you give them this IP address to use. Unfortunately, unless you pay for a plan with a static IP address, your number could change the next time your router reboots. You can solve this problem by purchasing a domain and using a dynamic DNS service such as <a href="http://dyn.com/dns/?ref=blog.ravimakes.com">dyn.com</a> that always directs that domain to your current IP address, no matter how often it changes. Alternatively, you could use a cron to execute a bash script that updates the IP using Cloudflare API. I will write a complete tutorial on this later.</p>
<p>It is theoretically possible using a smartphone as a web server with mobile<br>
Internet as well. But since this is just a proof of concept at the moment, I<br>
will write a different post. In the future when 5G and IoT become the norm, this method is likely to work better.</p>
<hr>
<h3 id="44usinganoldlaptop">4.4 Using an old Laptop</h3>
<p>Laptops as old as those from 2012 are still quite powerful for a working as a web server. It is quite straightforward to set these up.</p>
<ol>
<li>
<p>Install Debian server or any other server of your choice.</p>
</li>
<li>
<p>Follow steps from <strong>Section 3.4</strong></p>
</li>
<li>
<p>Setup your router using steps from <strong>Section 2.3.2</strong></p>
</li>
</ol>
<p>The only downfall with this method is that it consumes a fair bit more<br>
electricity. Not the ideal Option.</p>
<h3 id="dynamicip">Dynamic IP</h3>
<p>When you try to make your website accessible through the internet, you may notice that your home Internet address keeps changing. This is happens because a static IP that does not change is a costly commodity as it&apos;s available in limited numbers. Thus Internet Service Providers provide randomly available IPs called Dynamic IPs. Or alternatively create subnets and provide local addresses.</p>
<p>If you are on a local internet service provider, you likely have a dynamic IP. You may check your IP by just googling for it. If the IP shown in your google search result and and the one shown on your device are same, it&apos;s a dynamic IP. If different, they are using a subnet.</p>
<p>Let&apos;s get to the more interesting part. To make your website accessible from the internet with these conditions, you need a service that constantly updates the current IP to the DNS. There are many services out there like DynDNS or afraid.org that provide dynamic updating of DNS. afraid.org is a free service but has a few constraints of it&apos;s own. DynDNS on the other hand does not provide a main domain to be used on it&apos;s free plan.</p>
<p>Cloudflare provides very fast DNS and also provides REST API. This can be used to achieve our purpose. Let&apos;s get started.</p>
<h4 id="gatherinformation">Gather information</h4>
<p>You need to get your:</p>
<ol>
<li>API Key</li>
<li>email-id</li>
<li>Domain name</li>
<li>Linux shell</li>
</ol>
<p>Type in this into your shell:</p>
<pre><code>curl https://www.cloudflare.com/api_json.html -d &#x2018;a=rec_load_all&#x2019; \
 -d &#x2018;tkn=your-api-key&#x2019; \
 -d &#x2018;email=your_account@email-address.com&#x2019; \
 -d &#x2018;z=your-domain.com&#x2019;
 
</code></pre>
<p>This will give you all the info you are going to need to automate the IP address changes.</p>
<p>Now create a script like this:</p>
<pre><code>
#!/bin/sh
NEW_IP=`wget -O &#x2014; -q http://ident.me/`
CURRENT_IP=`cat /var/tmp/current_ip.txt`

if [ &#x201C;$NEW_IP&#x201D; = &#x201C;$CURRENT_IP&#x201D; ]
then
  echo &quot;No Change in IP Adddress&quot;
else
  curl https://www.cloudflare.com/api_json.html \
  -d &apos;a=rec_edit&apos; \
  -d &apos;tkn=your-api-key&apos; \
  -d &apos;email=your_account@email-address.com&apos; \
  -d &apos;z=your-domain.com&apos; \
  -d &apos;id=record-id&apos; \
  -d &apos;type=A&apos; \
  -d &apos;name=subdomain.your-domain.com&apos; \
  -d &apos;ttl=1&apos; \
  -d &quot;content=$NEW_IP&quot;
  echo $NEW_IP &gt; /var/tmp/current_ip.txt
fi
 
</code></pre>
<p>This basically gets your current IP from ident.me and updates your DNS. Of course, you need to change &quot;your-api-key&quot;, &quot;<a href="mailto:your_account@email-address.com">your_account@email-address.com</a>&quot;, &quot;your-domain.com&quot;, &quot;record-id&quot; and &quot;subdomain.your-domain.com&quot; from the values you recieved from the curl operation.</p>
<p><strong>Note</strong>: If you need a IPv6, try using work done by this guy: <a href="https://scotthelme.co.uk/replacing-dyndns-cloudflare-ddns/?ref=blog.ravimakes.com">Scott Helme</a></p>
<p>Then,</p>
<pre><code>sudo chmod +x /path/to/script.sh
</code></pre>
<p>Test it out by running it in your linux environment.</p>
<pre><code>sudo /path/to/script.sh
</code></pre>
<p>Once that&apos;s done, you need to automate the running of this on a regular basis. Let&apos;s use cron for this. You can add this to your crontab:</p>
<pre><code> */5 * * * * /path/to/script.sh
</code></pre>
<p>Further References:</p>
<ol>
<li>Raspberry Pi Docs: <a href="https://projects.raspberrypi.org/en/projects/lamp-web-server-with-wordpress?ref=blog.ravimakes.com">Raspberry Pi Wordpress</a></li>
<li>Armbian Forum: <a href="https://forum.armbian.com/?ref=blog.ravimakes.com">Armbian Forum</a></li>
<li>Servers Ultimate: <a href="https://play.google.com/store/apps/details?id=com.icecoldapps.serversultimate&amp;ref=blog.ravimakes.com">Servers Ultimate</a></li>
<li>Dynamic IP using Cloudflare: <a href="https://medium.com/coding-code/using-cloudflare-as-a-dynamic-dns-service-c0d797f32794?ref=blog.ravimakes.com">Medium</a></li>
<li>Dynamic IP using Cloudflare: <a href="https://johnpili.com/use-cloudflare-as-dynamic-dns/?ref=blog.ravimakes.com">johnpili.com</a></li>
</ol>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html-->]]></content:encoded></item><item><title><![CDATA[Comprehensive Guide to Free Website Hosting - Part 1]]></title><description><![CDATA[Sick and tired of all the scammy free hosting sites and the spammy paid
  reviews you find everywhere? This is where you get the no-nonsense solution. From
  static websites to Google Cloud Platform and AWS. All forms of free hosting solutions.]]></description><link>https://blog.ravimakes.com/comprehensive-guide-to-free-website-hosting-part-1/</link><guid isPermaLink="false">649f1edd428bcb01558c075b</guid><category><![CDATA[Free Hosting]]></category><dc:creator><![CDATA[Ravi Kiran P]]></dc:creator><pubDate>Wed, 16 Jan 2019 13:03:00 GMT</pubDate><media:content url="https://blog.ravimakes.com/content/images/2020/07/freeHosting-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.ravimakes.com/content/images/2020/07/freeHosting-1.jpg" alt="Comprehensive Guide to Free Website Hosting - Part 1"><p>If you ever decided to start a blog or a simple website, the biggest issue you would immediately come across will be finding a half decent hosting solution that doesn&#x2019;t cost a ton. One that did not claim to be unlimited everything for half a dollar on the homepage and when you click on the buy button, tell you that the unlimited all was only for the ten times priced plan.And that too wasn&#x2019;t actually unlimited as claimed but conditions apply. This frustrated me enough to try and figure out a low-cost solution that could have a blog or a website which looked modern and was responsive. Read on to see all the solutions I could come up with.</p><p>There are basically 3 ways to achieve freedom from hosting companies.</p><p>Now, before I take you through how to, let me just explain the basics of how web works. In brief, when you go to a website or click on it&apos;s link, your browser receives is a HTML file along with the images and CSS files that go along with it. Your browser shows them in a visual way. These files need to be on a server though. A server is basically a computer that is always on and connected to the internet. Simple enough right? Well, this kind of hosting is called static hosting. As all the files are ready and just need to be served by your browser. Responsiveness can be achieved using JavaScript and such.</p><p>Sometimes you will need more sophistication. Say a blog that does more. Such as having share buttons and auto sharing options. All this being easily maintained. An example for this is the ever-popular WordPress. It is called a CMS or a content management software. This is built on something called PHP. I won&#x2019;t go into too many details here, but you are going to need some processing power to use this. That is, a computer that can run programs. The hosting companies basically offer you this. A shared computer where you can host your content and use some processing power. Shared to reduce costs or a dedicated system for more processing power. This kind of hosting is called dynamic hosting.</p><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><!--kg-card-begin: markdown--><p>Now, let&#x2019;s go ahead and figure out how to avoid these hosting companies.</p>
<ol>
<li>
<p>Static Hosting</p>
<ol>
<li>Blogspot</li>
<li>Google Sites</li>
<li>Jekyll</li>
<li>Hugo</li>
<li>Netlify</li>
<li>Forestry</li>
</ol>
</li>
<li>
<p>Sway and Hybrid Solutions</p>
</li>
<li>
<p>Cloud Computing</p>
<ol>
<li>AWS</li>
<li>Azure</li>
<li>GCP</li>
</ol>
</li>
</ol>
<!--kg-card-end: markdown--><p><strong>1. Static Hosting</strong></p><p>The first way is to go for static hosting. Now, before you brush this method away, you need to understand that things have come a very long way since the time of simple static hosted sites. You get very modern and elegant websites that are responsive. If you want a blog management system, you can get them too using services like Netlify CMS and Forestry using static site generators like jekyll and Hugo. These make it very easy to have a very decent website or a blog. And one of the greatest benefits of static hosting is that they blazingly fast and secure. Something that is quite hard to achieve using dynamic hosting.</p><h3 id="1-1-blogspot">1.1 Blogspot</h3><p>The first option to have static hosting is to use the good old Google blogspot. Initially, I had a very bad impression of Google blogspot as those sites tended to have very poor quality of websites and themes. They looked very amateurish and overall just sucked. That was until I found out that it was possible to have custom themes installed on it and that you could use a custom domain with blogspot.</p><p><strong>1.1.1 Custom Domain</strong></p><p>There are just 2 steps to using blogger with a custom domain after you have registered to blogger.</p><p>1. &#xA0;Click on settings -&gt; Basic</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/10cbd86167fbec1ecad18bea4ba6d62a.png" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><p>2. Scroll to Publishing and click on &#x201C;Set up a third-party URL for your blog&#x201D;</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/cf06dc98a7a136c8dc9202f6136bc479.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><p>That&#x2019;s it! Just enter your domain address and add the CNAME records that Google asks you to and that will point your custom domain to the blogger managed blog.</p><p><strong><strong>1.1.2 Themes</strong></strong></p><p>As I mentioned before, the built-in themes in blogger are not that good. They look old and unresponsive. To overcome this issue, we will use custom themes like this one:</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/7b610a77a6aa6fcfa0817cad5ed8f6d1.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><p>To install, just download the file and extract the xml file. Then, clickTemplate -&gt; Backup / Restore -&gt; Choose File -&gt; Select XML file</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/82b1bbd620a9e6a6b8f904bbd53b2794.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><p>I highly recommend this theme: pixel-template.blogspot.com</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/8f9907b321000438424cf45de650cdcc.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><p>You can download the XML <a href="https://raw.githubusercontent.com/puikinsh/Pixel-Blogger-Template/master/Pixel-Blogger-Template.xml?ref=blog.ravimakes.com">here</a>.<br>All It&#x2019;s documentation can be found <a href="https://pixel-template.blogspot.com/p/documentation.html?ref=blog.ravimakes.com">here</a>.</p><p>Frankly, these themes are so good, you will just fall in love once you get the right one! There might actually be no point for most to go any further.Nonetheless, if you have more/different requirements or just wish to learn more and know the other options you have available with you, continue along.<br></p><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><p><strong>1.2 Google Sites</strong></p><p>Like blogspot, Google also has a lesser known service called Google sites. These sites are stored on your google drive. Using this is extremely simple. Here are the steps:</p><ol><li>Go to your google drive and navigate to where you want your website to be stored.</li></ol><p>2. Click on New-&gt;More-&gt;Google Sites. Like shown below:</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/5f7317df1058cfc56bee30c8e4efa9c2.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><p>3. Then You will be presented with something like this:</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/53c79339cc5e6b9d73c02d3201c2b2b2.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><p>4. Everything here is rather straightforward. So build your website and we will go further to showing you to use custom domains with Google Sites.</p><p>5. To use custom domains, just click on the three dots and click on Custom URLs. Here:</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/3a568a7da3b93758d8b1ed43ab38a9ed.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><p>6. Then enter your domain.</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/1b865741da0e0cb9d56303945658f642.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><p>7. Before you can use your custom domain, you will have to verify the ownership of your entered domain. To do so, follow the instructions you get and add the given verification code in the next screen:</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/1d25b2edabc41127349778adf01b4f08.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><p>8. You will also have to add a CNAME record for your website in your registrar&#x2019;s panel. It needs to point to <em><a href="http://ghs.googlehosted.com/?ref=blog.ravimakes.com">ghs.googlehosted.com</a></em>:</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/47e63cc51a2f24b8db5eee93407ecf41.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><p>9. Once that&#x2019;s done, return to the ownership page and click on verify.</p><p>10. On your Google Sites page, click Publish once you are done building your website.</p><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><p><strong>1.3 Jekyll</strong></p><!--kg-card-begin: markdown--><p>Jekyll is an interesting new thing that is called a static site generator. What is a static site generator you ask? Well, it&#x2019;s something that creates a bunch of static files by combining different files such as a header and a footer to each page. These static files are then served directly to the browser without any further processing. This helps you avoid having to edit every single page manually. It has gotten extremely popular in the past couple of years owing to the large number of themes and overall community support for it. Jekyll does require you to have some coding experience and hold on command line though. So be warned!</p>
<p><strong>1.3.1 Jekyll Tutorial</strong></p>
<p>If you prefer video tutorials, I would recommend this YouTube playlist by<br>
Giraffe Academy that is mentioned on the official website of Jekyll. Follow this link: <a href="https://jekyllrb.com/tutorials/video-walkthroughs/?ref=blog.ravimakes.com">https://jekyllrb.com/tutorials/video-walkthroughs/</a></p>
<p>Here is a very basic tutorial of using Jekyll:</p>
<h3 id="installationviarubyinstallerpermalink">Installation via RubyInstaller<a href="https://jekyllrb.com/docs/installation/windows/?ref=blog.ravimakes.com#installation-via-rubyinstaller">Permalink</a></h3>
<p>The easiest way to run Jekyll is by using the&#xA0;RubyInstaller&#xA0;for Windows.</p>
<p>RubyInstaller is a self-contained Windows-based installer that includes the Ruby language, an execution environment, important documentation, and more. We only cover RubyInstaller-2.4 and newer here, older versions need to&#xA0;<a href="https://github.com/oneclick/rubyinstaller/wiki/Development-Kit?ref=blog.ravimakes.com">install the<br>
Devkit</a>&#xA0;manually.</p>
<ol>
<li>
<p>Download and Install a&#xA0;<strong>Ruby+Devkit</strong>&#xA0;version from&#xA0;RubyInstaller Downloads. Use default options for installation.</p>
</li>
<li>
<p>Run the&#xA0;ridk install&#xA0;step on the last stage of the installation wizard. This is needed for installing gems with native extensions. You can find addtional information regarding this in the&#xA0;RubyInstaller Documentation</p>
</li>
<li>
<p>Open a new command prompt window from the start menu, so that changes to<br>
the <em>PATH</em> environment variable becomes effective. Install Jekyll and Bundler<br>
via:<code>gem install jekyll bundler</code></p>
</li>
<li>
<p>Check if Jekyll installed properly:<code>jekyll -v</code></p>
</li>
</ol>
<p>That&#x2019;s it, you&#x2019;re ready to use Jekyll!</p>
<h3 id="installationviabashonwindows10permalink">Installation via Bash on Windows 10<a href="https://jekyllrb.com/docs/installation/windows/?ref=blog.ravimakes.com#installation-via-bash-on-windows-10">Permalink</a></h3>
<p>If you are using Windows 10 version 1607 or later, another option to run Jekyll is by&#xA0;<a href="https://msdn.microsoft.com/en-us/commandline/wsl/install_guide?ref=blog.ravimakes.com">installing</a>&#xA0;the<br>
Windows Subsystem for Linux.</p>
<p><em>Note:</em>&#xA0;You must have&#xA0;<a href="https://msdn.microsoft.com/en-us/commandline/wsl/about?ref=blog.ravimakes.com">Windows Subsystem for<br>
Linux</a>&#xA0;enabled.</p>
<p>First let&#x2019;s make sure all our packages / repositories are up to date. Open a new Command Prompt instance, and type the following:</p>
<pre><code>bash
</code></pre>
<p>Your Command Prompt instance should now be a Bash instance. Now we must update<br>
our repo lists and packages.</p>
<pre><code>sudo apt-get update -y &amp;&amp; sudo apt-get upgrade -y
</code></pre>
<p>Now we can install Ruby. To do this we will use a repository from&#xA0;BrightBox,<br>
which hosts optimized versions of Ruby for Ubuntu.</p>
<pre><code>sudo apt-add-repository ppa:brightbox/ruby-ng

sudo apt-get update

sudo apt-get install ruby2.5 ruby2.5-dev build-essential dh-autoreconf
</code></pre>
<p>Next let&#x2019;s update our Ruby gems:</p>
<pre><code>gem update
</code></pre>
<p>Now all that is left to do is install Jekyll.</p>
<p>gem install jekyll bundler</p>
<p>(<em>Note: no&#xA0;<em>sudo</em>&#xA0;here.</em>)</p>
<p>Check if Jekyll installed properly by running:</p>
<pre><code>jekyll -v
</code></pre>
<p><strong>And that&#x2019;s it! The installation and setting up of everything that is.</strong></p>
<p>Once the above is completed, open your PowerShell or terminal and change<br>
directory to where you want your site to reside. Once there, type in</p>
<pre><code>jekyll new project_name
</code></pre>
<p>You should find something like this:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/942a116d6a17c7e5477d99b1fab760c9.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><p>This will take a moment. Once done, you will find a new folder by the name of<br>your project. Change directory into it and type in:</p><p>bundle exec jekyll serve</p><p>You should find something like this on your powershell/Terminal:</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/16b2de4541de9e7c668145be0b490dbe.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><p>This should build and serve a local website. You can view it by opening your browser and typing in:</p><p>http://127.0.0.1:4000</p><p>You should find something like this:</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/b93b496eb10a115ee38c064c91ffd24e.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><p>Well, there you go! You got yourself a wonderful Jekyll generated website. Now I am not going to get into all the details of using Jekyll and building your website as there are multiple other sites and videos out there that have done the same already. However, I will just touch upon themes as that can be a bit confusing.</p><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><p><strong>1.3.2 Jekyll Themes</strong></p><p>Official Jekyll themes are published on <a href="https://rubygems.org/?ref=blog.ravimakes.com">https://rubygems.org</a>. To find themes,<br>just visit that site and search for &#x201C;Jekyll themes&#x201D; or such. You will easily<br>find thousands of Jekyll themes.</p><p>For the sake of this example, let us install a theme called &#x201C;krad&#x201D;. It looks<br>like this:</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/acdf8bbf5af343c4c6bb5b83b4982760.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><p>It&#x2019;s from the theme creator&#x2019;s personal page BTW. Nice guy he is. You can visit<br>his blog here: <a href="https://www.tunglt.com/?ref=blog.ravimakes.com">https://www.tunglt.com</a></p><p>Here is the link to the theme page on rubygems: <a href="https://rubygems.org/gems/krad?ref=blog.ravimakes.com">https://rubygems.org/gems/krad</a></p><p>To use these themes in your project, follow these steps:</p><ol><li>Go to the site folder (the place where you did a &#x201C;Jekyll new&#x201D;)</li></ol><p>2. Open the file named &#x201C;Gemfile&#x201D; using a text editor.</p><p>3. Add <em>gem &apos;krad&apos;, &apos;~&gt; 3.7&apos;, &apos;&gt;= 3.7.5&apos;</em> under the themes location. Like this:</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/ce64843ce8cc30f5abb3c1b7e1203754.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><p>4. Then open a file name &#x201C;_config.yml&#x201D; and change the theme to krad from minima. Like this:</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/aef976763fb8820bff7c708e067b0443.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><p>Now if you are wondering where I got what to insert into the gemfile, well, you will find that on the rubygems page or the github page of that theme. Here is a snapshot from the rubygrms.org website for example:</p><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/3a568a7da3b93758d8b1ed43ab38a9ed-1.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><!--kg-card-begin: markdown--><p><strong>1.3.3 Jekyll Plugins</strong></p>
<p>In a similar fashion, you can install plugins to improve your seo and other such things. Like wordpress plugins. I am not going to go into detail of doing this as it is exactly the same as installing themes. I have included this part just to make to aware of the existence of plugins.</p>
<p><strong>1.4 Hugo</strong></p>
<p>Hugo is a static site generator as well with the difference that it is written the language Go instead of Ruby. I am not going to detail the instructions as the official site of hugo itself has plenty of well written documentation of both technical as well as less technical users. I will just link up the sites here and detail things further when I get time. Either in this post itself or in another post.</p>
<p><strong>1.4.1 Hugo Tutorial</strong></p>
<p>Installation: <a href="https://gohugo.io/getting-started/installing?ref=blog.ravimakes.com">https://gohugo.io/getting-started/installing</a></p>
<p>Usage: <a href="https://gohugo.io/getting-started/quick-start/?ref=blog.ravimakes.com">https://gohugo.io/getting-started/quick-start/</a></p>
<p><strong>1.4.2 Hugo Themes:</strong><br>
<a href="https://gohugo.io/getting-started/quick-start/?ref=blog.ravimakes.com#step-3-add-a-theme">https://gohugo.io/getting-started/quick-start/#step-3-add-a-theme</a></p>
<p><strong>1.5 Netlify</strong></p>
<p>As you might have observed in the Jekyll and Hugo sections, it isn&#x2019;t exactly<br>
easy to use them for the average blogger who wants to just write content. It requires you to do quite a bit of coding and doesn&#x2019;t exactly have an easy CMS like experience where you can get a rich text editor like WordPress. This is where Netlify enters.</p>
<p>Netlify is a service that builds the website using your choice of static site generator like Jekyll or Hugo or any of the others. This makes it easy for any simpleton to use static site generators from the comfort of their browsers. With comparatively little coding experience. It also helps you to get multiple people registered as authors as well as create communities along with giving you a CMS like rich content editor. Netlify has a regular website builder as well as a CMS based customizations. We will only focus on the later as that is what a blogger needs.</p>
<p><strong>Netlify CMS Guide</strong></p>
<ol>
<li>
<p>Head over to <a href="https://www.netlifycms.org/?ref=blog.ravimakes.com">https://www.netlifycms.org</a></p>
</li>
<li>
<p>Click Get started</p>
</li>
<li>
<p>Select an SSG (Hugo, Gatsby or Middleman)</p>
</li>
<li>
<p>There are advantages and disadvantages of each one. If you are a beginner,<br>
just go for Hugo. It&#x2019;s quite popular and growing every day.</p>
</li>
<li>
<p>Click on Deploy to netlify</p>
</li>
<li>
<p>If you already have a Netlify account, login. Else register.</p>
</li>
<li>
<p>Once done, you will be redirected to a page like this:</p>
</li>
</ol>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/4925df4b9c23f39ee220d6d6ae57d804.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><!--kg-card-begin: markdown--><ol start="8">
<li>
<p>Connect to either GitHub or GitLab</p>
</li>
<li>
<p>You will get a mail asking you to join a site. Accept the invite and enter a password when asked for.</p>
</li>
<li>
<p>Once done, you will be taken to the admin page and you are ready to go.</p>
</li>
</ol>
<p>You may delete the existing posts and create new ones. There is quite a bit more to learn here with respect to front matter and other things. But I will leave that to another post. For now, let me just show you how to add a custom URL to it.</p>
<p><strong>Custom URLs</strong></p>
<ol>
<li>Go to <em>Domain Management -&gt; Custom domains -&gt; Add custom domain</em>:</li>
</ol>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/f4bd0c68d05dcc38f30501fc97d15371.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><!--kg-card-begin: markdown--><ol start="2">
<li>
<p>You will then be asked to verify your website. Do so.</p>
</li>
<li>
<p>You have an option to either use the Netlify Name Servers or point to the servers on your domain registrar&#x2019;s panel. If you are going to use multiple subdomains with Netlify, it is recommended to change the name servers as they automate the process of adding a subdomain.</p>
</li>
<li>
<p>Once that&#x2019;s done, you are recommended to scroll down to HTTPS and click on <em>Force HTTPS</em>.</p>
</li>
</ol>
<p>To access the admin panel, you just need to add <em>/admin</em> to your custom domain URL.</p>
<p><strong>1.6 Forestry</strong></p>
<p><a href="https://forestry.io/?ref=blog.ravimakes.com">Forestry</a> is an alternative to Netlify and does a similar job of providing a Wordpress like CMS interface to a Jekyll or any other SSG based site generator. You can also import existing static site built using Jekyll or other SSG into Forestry and start using it&#x2019;s amazing CMS like interface. Here are the steps to get started with Forestry.</p>
<ol>
<li>
<p>Head over to<br>
<a href="https://campuen-my.sharepoint.com/personal/h2564_365office_site/Documents/thriftyengineer/forestry.io?ref=blog.ravimakes.com">forestry.io</a></p>
</li>
<li>
<p>Login or Register</p>
</li>
<li>
<p>Click on <em>Dashboard</em> on the top left corner. You should be greeted to<br>
something like this:</p>
</li>
</ol>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/9e37bb578fef7cc0d9db3f1d054560c6.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><!--kg-card-begin: markdown--><ol start="4">
<li>
<p>Click on <em>Add Site</em></p>
</li>
<li>
<p>Select your favourite generator.</p>
</li>
<li>
<p>Select where you want your site to reside. Either GitHub or GitLab.</p>
</li>
<li>
<p>Enter the email ID of anyone else who would write on your blog. If<br>
applicable.</p>
</li>
<li>
<p>Once done you should see something like this:</p>
</li>
</ol>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/392704339d51cbcf0eec23eab00f4dc5.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><!--kg-card-begin: markdown--><p>Well, That&#x2019;s it! You may edit your website to your liking and have posts and<br>
pages just as you would on WordPress.</p>
<p>You may also consider Gatsby and VuePress. They have their own unique advantages depending on your needs.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><!--kg-card-begin: markdown--><h2 id="2swayandhybridsolutions">2. Sway and Hybrid Solutions</h2>
<p>If you happen to have an office 365 subscription, you can create full fledged websites and presentations using an app called <strong>Sway</strong>. It&apos;s a very powerfull and versatile app. You can also use the web version. However, it does not give you a way to use it with a custom domain. Thus, to use this method, you need to create an index file on your website and enclose the sway link in it with a width and height of 100%.</p>
<p>Here is a basic way to achieve it:</p>
<ol>
<li>Create an index.html at the root of your website and include this code:</li>
</ol>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;fr&quot;&gt;
    &lt;head&gt;
        &lt;title&gt;Your title&lt;/title&gt;
        &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no&quot;/&gt;
    &lt;/head&gt;
    &lt;frameset rows=&quot;100%&quot;&gt;
        &lt;frame src=&quot;https://sway.com/s/{swayId}/embed&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; noresize=&quot;noresize&quot;/&gt;
    &lt;/frameset&gt;
&lt;/html&gt;
</code></pre>
<ol start="2">
<li>Make sure to replace {swayId} in <a href="https://sway.com/s/%7BswayId%7D/embed?ref=blog.ravimakes.com">https://sway.com/s/{swayId}/embed</a> with your sway&apos;s id.</li>
</ol>
<p><strong>Note:</strong> If your office subscription is from a work or school account, the visitor might be asked to sign in if they try to visit the site. This is a major drawback due to a default security setting set by your admin. If you have a personal office subscription though, you can just share your sway to the public by selecting &quot;Share with anyone with a link&quot; and the visitor will not have to sign in to view the website.</p>
<p>Here is a sample website made using this method: <a href="https://ravikiranp123.github.io/sway-website/?ref=blog.ravimakes.com">This post using sway</a></p>
<h2 id="3cloudcomputing">3 Cloud Computing</h2>
<p>This would have been my first option if not for the fact that they are not<br>
guaranteed to be free for a long term. Here we will be using Amazon&#x2019;s AWS,<br>
Microsoft&#x2019;s Azure and Google&#x2019;s GCP. The first two only offer one year of free VPS of a specific capacity. However, by making multiple accounts, we will be able to use them for longer than that. I would not really recommend this as I am not confident whether Amazon and Microsoft would be okay with you making multiple accounts. However, I can confirm that you can use a single credit card for multiple accounts. Oh, and yeah! You are going to need a credit card for this. That said, Google&#x2019;s GCP does provide a micro instance for free. So, I would recommend that if you just have one or two WordPress blogs.</p>
<p>I will showcase how you can get started and have a virtual machine instance up and running for each of these. Then further go on to show you how to get<br>
WordPress up and running on them. I will also include the basics of using a web panel call Virtualmin. The second and third parts are common for all the three cloud computing platforms. So, they will be separate. Virtualmin is optional as well. And not really required if you are going to have just one or two blogs. If more, it&#x2019;s makes your life so much easier.</p>
<hr>
<h3 id="31amazonwebservicesaws">3.1 Amazon Web Services (AWS)</h3>
<p>To get started with AWS, follow these steps:</p>
<ol>
<li>
<p>Head over to <a href="https://aws.amazon.com/?ref=blog.ravimakes.com">Amazon Web Services</a></p>
</li>
<li>
<p>Register if you don&#x2019;t have an account. Or login if you already have an<br>
account.</p>
</li>
<li>
<p>You will then be taken to the AWS Dashboard.</p>
</li>
<li>
<p>On the top right corner, you will be able to see a <em>region</em> dropdown. Click<br>
on it and choose the region where you want your server to be located.</p>
</li>
<li>
<p>Then just search for EC2</p>
</li>
<li>
<p>Click <em>Launch Instance</em>.</p>
</li>
<li>
<p>For the AMI, I would recommend Debian. You take your pick. But remember that<br>
if you are going to have a free server only, you will have just about 1 GB<br>
of RAM and 30 GB of SSD Disk Space.</p>
</li>
<li>
<p>On step 2 of the process, select t2.micro for free Tier service.</p>
</li>
<li>
<p>Don&#x2019;t worry about the next screen and skip to <em>Add Storage</em>. I would<br>
recommend adding 30 GB Disk.</p>
</li>
<li>
<p>The click on next twice to reach <em>Configure Security Group.</em></p>
<ol>
<li>
<p>If you are going to use only a WordPress blog on this server and no mail<br>
servers or such, you just need to enable HTTP and HTTPS. To do so, just<br>
click on <em>Add Rule</em> twice and change the first one to HTTP from the drop<br>
down in <em>Type.</em> And choose HTTPS for the second type.</p>
</li>
<li>
<p>If you are going to use Virtualmin, the following rules are recommended:</p>
<ol>
<li>
<p>HTTP</p>
</li>
<li>
<p>HTTPS</p>
</li>
<li>
<p>POP3</p>
</li>
<li>
<p>POP3S</p>
</li>
<li>
<p>IMAP</p>
</li>
<li>
<p>IMAPS</p>
</li>
<li>
<p>Custom TCP Rule with Port number 10000</p>
</li>
</ol>
</li>
</ol>
</li>
<li>
<p>For each of these, select <em>Source</em> as <em>anywhere</em>.</p>
</li>
<li>
<p>Review and Launch the Instance.</p>
</li>
<li>
<p>Now, let us set up a static IP address. To do so, head over to <em>Network and<br>
Security -&gt; Elastic IPs</em></p>
</li>
<li>
<p>Click on <em>Allocate new address</em></p>
</li>
<li>
<p>Once you get a new static IP address, right click on it and click <em>Associate<br>
address</em></p>
</li>
<li>
<p>Select your instance</p>
</li>
</ol>
<p>Skip to <strong>3.3 Enable Swap</strong> if you wish to skip the tutorials for Azure and<br>
Google Cloud Platform</p>
<hr>
<h3 id="32googlecloudplatform">3.2 Google Cloud Platform</h3>
<p>Google Cloud Platform (GCP) is similar to AWS and Azure. It provides a micro<br>
instance free forever that has about 592MB of RAM and 1 vCPU of 2.26GHz. You can easily run 1 to 2 blogs on a server like this. However, you need a credit card that works with 3D Secure. I had quite a bit of trouble with this as my card was not compatible. Thus, I kept this one towards the end. If your card works with this, I highly recommend you go with this.</p>
<p>To get started, follow these steps:</p>
<ol>
<li>
<p>Head over to<br>
<a href="https://campuen-my.sharepoint.com/personal/h2564_365office_site/Documents/thriftyengineer/cloud.google.com?ref=blog.ravimakes.com">cloud.google.com</a></p>
</li>
<li>
<p>Sign in if you already have an account. Sign Up otherwise.</p>
</li>
<li>
<p>Go to your console</p>
</li>
<li>
<p>Either select an existing project or create a new one.</p>
</li>
<li>
<p>Set up billing if you haven&#x2019;t</p>
</li>
<li>
<p>Once all that is done, just click on <em>Compute Engine -&gt; VM instances -&gt;<br>
CREATE INSTANCE</em></p>
</li>
</ol>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/3a568a7da3b93758d8b1ed43ab38a9ed-2.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><!--kg-card-begin: markdown--><ol start="7">
<li>Under Machine Type, select micro-f1. Make sure you have a &#x201C;Your first 744 hours of this instance are free&#x201D; kinda message on the right. If this is available, it is a free forever type and you are good to go. Otherwise, make sure to change your instance location to where is available.</li>
</ol>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/9fd4314980fffc1361fa743c66fe8b12.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><!--kg-card-begin: markdown--><ol start="8">
<li>
<p>Under &#x201C;Boot disk&#x201D; click change and change the Disk size to the maximum 30GB.<br>
You may also change the distro here if you so wish.</p>
</li>
<li>
<p>Under &#x201C;Firewall&#x201D;, tick mark both HTTP and the HTTPS checkboxes.</p>
</li>
<li>
<p>Click create.</p>
</li>
<li>
<p>Well, now that you have your micro instance up and running you may<br>
additionally assign a static IP. To assign a static IP, head over to <em>VPC<br>
Networks -&gt; External IP addresses</em></p>
</li>
</ol>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://blog.ravimakes.com/content/images/2019/12/3fcd7294395ac1076f8f092860df20d7.jpg" class="kg-image" alt="Comprehensive Guide to Free Website Hosting - Part 1" loading="lazy"></figure><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><!--kg-card-begin: markdown--><ol start="12">
<li>
<p>You may either reserve a new static address and assign it or turn your already assigned address to static. To do the first, click on <em>RESERVE STATIC ADDRESS</em> at the top and follow instructions. To convert the existing address to static, just click on the place where it says &#x201C;<em>ephemeral</em>&#x201D; and change it to static.</p>
</li>
<li>
<p>Give a name and create it.</p>
</li>
<li>
<p>Continue on to the next section to enable swap and then if you are<br>
interested, install Virtualmin.</p>
</li>
</ol>
<hr>
<h3 id="33enableswap">3.3 Enable Swap</h3>
<p>If you are going to use only the free versions, you will soon notice that you get only 1GB RAM on AWS and an even lesser 592MB on GCP&#x2019;s forever free Micro server. This is not even enough for the distro most of the times. So, you will need something called a swap file. This is similar to a pagefile in windows where the system offloads lesse used RAM content to the hard disk. Depending on whether you have an SSD or a Magnetic Disk setup, the usefulness of this varies. Nonetheless, I highly recommend having swap setup.</p>
<p>To setup swap follow these steps:</p>
<ol>
<li>
<p>Connect to your server over SSH and execute the following commands.</p>
</li>
<li>
<p>sudo fallocate -l 2G /swapfile</p>
</li>
<li>
<p>sudo dd if=/dev/zero of=/swapfile bs=2048 count=1048576</p>
</li>
<li>
<p>sudo chmod 600 /swapfile</p>
</li>
<li>
<p>sudo mkswap /swapfile</p>
</li>
<li>
<p>sudo swapon /swapfile</p>
</li>
<li>
<p>sudo nano /etc/fstab (This will open nano. A text editor. Use the web to<br>
understand how it works)</p>
<ol>
<li>
<p>Add &#x201C;/swapfile swap swap defaults 0 0&#x201D;</p>
</li>
<li>
<p>Press Ctrl+x</p>
</li>
<li>
<p>Press y</p>
</li>
<li>
<p>Press Enter</p>
</li>
</ol>
</li>
</ol>
<p>That&#x2019;s it! This will setup a swap of 2GB. You can check if it&#x2019;s working or not<br>
by using the command htop.</p>
<p><strong>Note:</strong> If you need more or less swap, just change 2G in step 2 and bs=2048 in<br>
step 3. It will be a multiple of 1024 for every GB.</p>
<hr>
<h3 id="34installingwordpress">3.4 Installing WordPress</h3>
<p>If you are going to use Virtualmin, skip this section and move to the next<br>
section.</p>
<p>Installing WordPress is a rather straightforward process.</p>
<ol>
<li>
<p>Install LAMP server</p>
<ol>
<li>
<p>Let&#x2019;s make our job easier by using an app called tasksel. To install<br>
tasksel type in</p>
</li>
<li>
<p>$ sudo apt install tasksel</p>
</li>
<li>
<p>$ sudo tasksel install lamp-server</p>
</li>
<li>
<p>$ sudo apt install php-curl php-gd php-mbstring php-xml php-xmlrpc</p>
</li>
</ol>
</li>
<li>
<p>Setup SQL</p>
<ol>
<li>
<p>$ mysql -u root</p>
</li>
<li>
<p>&gt; CREATE DATABASE wordpress;</p>
</li>
<li>
<p>&gt; GRANT ALL ON wordpress.* TO &apos;wordpressuser&apos; IDENTIFIED BY<br>
&apos;Secure1234!&apos;;</p>
</li>
<li>
<p>&gt; quit</p>
</li>
<li>
<p>$ mysql_secure_installation</p>
</li>
<li>
<p>NOTE: Make sure to change the username in step c.</p>
</li>
</ol>
</li>
<li>
<p>Configure Apache conf for website</p>
<ol>
<li>
<p>$ sudo nano /etc/apache2/sites-available/example.com.conf</p>
</li>
<li>
<p>Enter the following in it:</p>
</li>
<li>
<p>&lt;Directory /var/www/example.com&gt;<br>
Require all granted<br>
&lt;/Directory&gt;<br>
&lt;VirtualHost *:80&gt;<br>
ServerName&#xA0;<a href="http://example.com/?ref=blog.ravimakes.com">example.com</a><br>
ServerAlias&#xA0;<a href="http://www.example.com/?ref=blog.ravimakes.com">www.example.com</a><br>
ServerAdmin&#xA0;webmaster@localhost<br>
DocumentRoot /var/www/example.com<br>
&lt;/VirtualHost&gt;</p>
</li>
<li>
<p>$ mkdir -p /var/www/example.com</p>
</li>
<li>
<p>$ a2dissite 000-default.conf</p>
</li>
<li>
<p>$ a2ensite example.com.conf</p>
</li>
<li>
<p>$ systemctl reload apache2</p>
</li>
</ol>
</li>
<li>
<p>Edit the following in /etc/php/7.2/apache2/php.ini OR /etc/php7.0/php.ini<br>
depending on your PHP version.</p>
<ol>
<li>
<p>max_input_time = 30</p>
</li>
<li>
<p>upload_max_filesize = 32M</p>
</li>
<li>
<p>post_max_size = 24M</p>
</li>
</ol>
</li>
<li>
<p>Install Wordpress</p>
<ol>
<li>
<p>$ cd /var/www/example.com</p>
</li>
<li>
<p>$ wget&#xA0;<a href="https://wordpress.org/latest.tar.gz?ref=blog.ravimakes.com">https://wordpress.org/latest.tar.gz</a></p>
</li>
<li>
<p>$ tar -xzvf latest.tar.gz</p>
</li>
</ol>
</li>
</ol>
<hr>
<h3 id="35installingvirtualmin">3.5 Installing Virtualmin</h3>
<p>Virtualmin is a web panel like cPanel and Plesk. But unlike those two, it&#x2019;s<br>
free. It makes a lot of things extremely easy. Follow these steps to install<br>
Virtualmin:</p>
<ol>
<li>
<p>$ wget <a href="http://software.virtualmin.com/gpl/scripts/install.sh?ref=blog.ravimakes.com">http://software.virtualmin.com/gpl/scripts/install.sh</a></p>
</li>
<li>
<p>$ sudo /bin/sh install.sh</p>
</li>
<li>
<p>Just press y and enter when asked.</p>
</li>
<li>
<p>It will take a moment to install Virtualmin.</p>
</li>
<li>
<p>Type in $ sudo passwd root and then a password of your choice. This will be<br>
used to log into Virtualmin.</p>
</li>
<li>
<p>Once the password is set, open a browser and type in the external IP of your<br>
instance followed by a colon and 10000 ex:- 1.2.3.4:10000</p>
</li>
<li>
<p>If you have set your firewall rules properly, you should see a page that<br>
shows you a warning that the website certificate is not trustworthy. This is<br>
because it is a self-signed certificate.</p>
</li>
<li>
<p>Just click advanced and proceed. Or click on proceed anyway depending on<br>
your browser.</p>
</li>
<li>
<p>Follow the post installation steps to suit your instance capacity and your<br>
requirements.</p>
</li>
<li>
<p>Once that is done, you are good to go! Just click on <em>Create new Virtual<br>
Server</em> and you will have your new website working perfectly.</p>
</li>
<li>
<p>Some tips:</p>
<ol>
<li>
<p>Make sure to Enable SSL website in the options when you are about to<br>
create a new website.</p>
</li>
<li>
<p>Keep the SQL configuration to Medium. This is asked in the post<br>
installation setup.</p>
</li>
<li>
<p>You may set up a static IP. This isn&#x2019;t mandatory but recommended.</p>
</li>
</ol>
</li>
</ol>
<p>Well! That&#x2019;s pretty much it for this comprehensive tutorial. Please do share if you found this useful. It will also make my months of effort writing this<br>
article feel appreciated.</p>
<p>In the <a href="https://blog.ravimakes.com/comprehensive-guide-to-free-website-hosting-part-2/">next part</a>, I will show how to use your old equipment like smartphones and laptops to host your website and make them accessible from the internet.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html--><p>UPDATE: There were security issues with virtualmin where source was compiled with malware and went unnoticed for more than 7 months or so. Though this was fixed, it has caused concern. I no longer use virtualmin but rather use captain rover and ghost cms. I will write about this in another post.</p><p>Also, GCS will no longer provide a free public IP from Jan 2020. You will no longer be able to use the method posted in this post. Luckily, Oracle has come up with a much better always free VPS servers option. I will write about that as well. See you soon!</p><!--kg-card-begin: html--><!-- ************************** ADS BLOCK ***************************** -->
<ins class="adsbygoogle" style="display:block; text-align:center;width: 100%;height: 250px;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-9654892636905307" data-ad-slot="6899241266"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script><!--kg-card-end: html-->]]></content:encoded></item></channel></rss>