Category Archives: DIY Projects

How To Make A Raspberry Pi NAS (Network Attached Storage)

How To Make A NAS (Network Attached Storage)

Adding a storage device your network is called creating a NAS (Network Attached Storage). And basically it is just a minimalistic computer with a boat load of storage attached to it. So using a Raspberry Pi as our minimalistic computer, let’s create our own Network Attached Storage. You can find the project page for this video at the link below. But for now, let’s start tinkering.

STEP 1: Gather The Parts

There really isn’t much you need to do this project, and aside from the Raspberry Pi, you probably already have everything you need.

  1. Raspberry Pi = $35.00
  2. SD Card = $5.00
  3. 1 TB External Hard Drive = $60.00

Here are some other parts and tools that you you will probably find around the house (as I did):

  1. Keyboard and Mouse
  2. Ethernet Cable
  3. Monitor

STEP 2: Installing The Software
Download Raspbian

The first thing you want to do is download the Raspbian image using the link above. This is a stripped down version of Debian linux, so what I’m doing should also work on other Debian based distros, such as Ubuntu.

You then want to burn this one to an SD card using either Win32diskImager on Windows or the dd command for linux or Mac. Then plug the SD card into your Pi with video, mouse, keyboard, internet, power, and your external storage.

STEP 3: Setting Up The NAS

Once your pi boots up, you can login using “pi” and “raspberry” and then follow these steps to set it up as a NAS:

  1. Update apt-get and install NTFS-3g
    • sudo apt-get update
    • sudo apt-get install ntfs-3g
  2. Find out what path your external drive is located at (ex. /dev/sda1).
    • sudo apt-get update
  3. Mount the external drive to the media folder and then make a shared folder within it.
    • sudo mkdir /media/NASDrive
    • sudo mount -t auto /dev/sda1 /media/NASDrive
    • sudo mkdir /media/NASDrive/shared
  4. Install the Samba software.
    • sudo apt-get install samba-common-bin
  5. Edit the Samba config file.
    • sudo nano /etc/samba/smb.conf
    • Under the “Authentication” header, remove the hash (#) before
      security = user
    • Under the “Share Definitions” header, change
      read only = yes


      read only = yes
    • At the bottom of the page add:
      comment = Shared Folder
      path = /media/NASDrive/shared
      valid users = @users
      force group = users
      create mask = 0660
      directory mask = 0771
      read only = no
  6. Restart Samba
    • sudo /etc/init.d/samba restart
  7. Add a new user to linux
    • sudo useradd [enter new user here] -m -G
    • Create a new password:
      sudo passwd [enter new users name]
  8. Add new user to Samba
    • sudo smbpasswd -a [enter new users name]
STEP 4: Final Steps

Now on a different computer, if you browse the network you should see your raspberry pi. Trying to access it will prompt you for your username and password, and you can just enter the user and password we just created. Then start storing stuff to it!

If you want to access it from mobile devices you can use apps like Samba for Android or File Explorer for iOS to access network shares.

Download OpenMediaVault

Before we dive into the nerdy method of setting up a NAS on a Raspberry Pi, a super simple alternative is to use Open Media Vault. Open Media Vault is a distribution intended to make it super simple to set up and manage your own NAS.

If you want to give it a try yourself, here are the dead easy steps for setting it up:

      1. Download the most recent OpenMediaVault Raspberry Pi Image (using the button above)
      2. Burn it to an SD card (you can use this guide if you don’t know how)
      3. Plug it into your Raspberry Pi along with a monitor, network cable and power.
      4. When it boots up, the screen will give you your IP Address along with instructions on how to log in.
      5. On a separate computer, open up a browser and type in your Pi’s IP address. On the resulting page, login using the provided credentials (default should be admin and openmediavault).
      6. Use the options provided to set up your networking share and add and manage users!

Ultrasonic Madness

Sound waves can be used for more than just making sound. Find out all the amazing things sound is capable of and make some cool projects that harness it’s power!

Click on the tabs to continue learning about ultrasound!

Here are some of the other cool projects you we’ll be creating:

Download Arduino Code

Parts List

The prices really depend on what you would like to purchase. These are cheapest locations to purchase these items that I was able to find.

Part name Price
Ultrasonic Module $2.40
Arduino Uno $8.75

Software Downloads

  1. Arduino Software
  2. New Ping Library Download

Will It Microwave?

Why don’t microwaves and metal get along? What makes microwaves destroy electronics? Let’s dive deep into the world of electromagnetic radiation to find out!

Help support my channel by becoming a patron!   Get social!


Here’s what you will need for each project:



Radio Wave Project

  • A nickel (or any other coin)
  • A 9v battery
  • An AM radio

Small EMP generator

  • A disposable camera
  • A cheap calculator
  • Extra wire
  • A high voltage switch
  • Soldering equipment

World’s cheapest speaker!

What do you need to make the simplest form of a speaker? Surprisingly, you probably already have everything you need! Click on the “Parts list” tab to see what you need to make both bone conducting headphones and your own speaker! Then, if you still want more, click on the “Further Learning” tab to learn more about the history of speakers!


Help support my channel by becoming a patron!


Get social!


Here’s what you will need for these projects:



Bone Conducting Headphones

  • Small DC Motor
  • An old pair of headphones

Cheap Speaker

  • A Paperclip
  • A business card
  • A strong magnet
  • An old pair of headphones

Learn more about the history of speakers!

Beginners Guide To Projection Mapping

366_projection_mapping_thThis video will show you how the basics of projection mapping and how to do it on the cheap!

Here’s what you will need:


Amazon $60 projector

Build One from Recycled Parts

Build One for $5 worth of parts

TOTAL COST: ~$60.00 or less

Installing and Configuring VPT7

  1. VPT7
  2. Beginners Guide Tutorial

Projection Mapping Examples:
Pomplamoose “Happy Get Lucky” –

LG Electronics Building Projection –

Audi A1 Car Projection –

Help support my channel:

Follow Tinkernut!

Google +



Make Your Own Cluster Computer

Learn how to make a cluster computer using Raspberry Pi’s! You can also use this method to build your own super computer.

Acquiring the Parts
Here’s what you will need:

  1. 2 or more Raspberry Pi’s
  2. SD cards for each Pi
  3. Power Cables for each Pi
  4. Powered USB Hub (optional)
  5. Networking Cables
  6. A Hub or a Router

TOTAL COST: ~$100.00 [tabby title="Software"]

Installing and Configuring Raspbian

  • Download the Raspbian Image from here.
  • Burn the Raspbian Image to your SD Card
  • Once the image is burned to your SD Card, but it into the Raspberry Pi and boot it up with a Keyboard, Mouse, Monitor and Internet attached.
  • Upon first boot, you should see the Rasbperry Pi Configuration screen (otherwise type “sudo raspbi-config“. Here’s the options we’ll need to configure
      • Expand the File System
      • If needed, set the Internationalization options to match your countries keyboard layout.
      • Overlcock the Pi to 800 Mhz
      • Advanced Options
        • Set the Hostname to Pi01
        • Split the memory to 16mb for graphics
        • Enable SSH
      • Finish out of the configuration, but don’t reboot yet
      • To enable auto-login, at the terminal command type “sudo nano /etc/inittab
        • Comment out this line: #1:2345:respawn:/sbin/getty --noclear 38400 tty1
        • And add this line right beneath it: 1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1
      • Now you can reboot your Pi and it should auto-login

[tabby title="Terminal Commands"]

Installing MPICH

  • MPICH is software that allows for multi-processing communication between computers.
  • To install it on your Raspberry Pi, first make sure you have a valid Internet connection going to the Pi. Then follow these Terminal Commands
    • sudo apt-get update
    • mkdir mpich2
    • cd ~/mpich2
    • wget
    • tar xfz mpich-3.1.tar.gz
    • sudo mkdir /home/rpimpi/
    • sudo mkdir /home/rpimpi/mpi-install
    • mkdir /home/pi/mpi-build
    • cd /home/pi/mpi-build
    • sudo apt-get install gfortran
    • sudo /home/pi/mpich2/mpich-3.1/configure -prefix=/home/rpimpi/mpi-install
    • sudo make
    • sudo make install
    • nano .bashrc
      • PATH=$PATH:/home/rpimpi/mpi-install/bin
    • sudo reboot
    • mpiexec -n 1 hostname
  • These commands will download and install MPICH, as well as add it as a path to your BASHRC boot file. The last command runs a test to see if it works. If the last command returns “Pi01″, then you did everything successfully.

Installing MPI4PY

  • As it is, MPICH can run C and Fortran programs. But since the Raspberry Pi has the Python coding environment pre-installed, it would be easiest to install a Python to MPI interpreter. Here’s the commands to do that:
Help support my channel: Follow Tinkernut! Google + Facebook Twitter

Arduino Motion Detecting Squirt Gun

In case you want a nerdier way to make a cheap motion detecting squirt gun, Here’s how you can build your own with an Arduino and a PIR sensor!

Acquiring the Parts
Here’s what you will need:

  1. Raid Auto Trigger
  2. Arduino
  3. PIR Motion Sensor
  4. Diode
  5. NPN Transistor
  6. Wire cutters and wire

TOTAL COST: ~$45.00

Disassemble the Automatic Sprayer
Wire Up The Arduino
Here is a schematic of the Arduino. You can download the Fritzing files by clicking on this link. Screen Shot 2014-03-29 at 3.15.19 PM [tabby title="Step 3"]

Add The Code
Here is a copy of the Arduino code to upload to your arduino. You can also download it by clicking on this link. const int pirPower = 13; const int pirIn = 12; int motorPin1 = 3; void setup(){ pinMode(pirPower, OUTPUT); pinMode(pirIn, INPUT); pinMode(motorPin1, OUTPUT); digitalWrite(motorPin1, LOW); digitalWrite(pirPower, HIGH); } void loop(){ int value= digitalRead(pirIn); if (value == HIGH){ digitalWrite(motorPin1, HIGH); delay(500); digitalWrite(motorPin1, LOW); } }

Help support my channel: Follow Tinkernut! Google + Facebook Twitter

Motion Detecting Squirt Gun Prank

In this April Fools day video, learn how to make a cheap motion detecting squirt gun using parts that you can find in your local grocery store!

If you want a geekier way to build a motion detecting squirt gun, check out the Arduino version of this same project.

Acquiring the Parts
Here’s what you will need:

TOTAL COST: ~$25.00

Disassemble the Air Freshner
Disassemble the Automatic Sprayer
Connect the Air Freshner to the Automatic Sprayer
Help support my channel: Follow Tinkernut! Google + Facebook Twitter

Control An RC Car With A Smartphone

[tabby title="Video Walkthrough"]
Learn the basics of controlling objects with your Smartphone through Bluetooth!

[tabby title="Parts List"]

Acquiring the Parts
Here’s what you will need:

TOTAL COST: ~$30.00

[tabby title="Step 1"]

Adding Bluetooth to the Arduino

  1. To get started on adding bluetooth to the Arduino, you can watch my Arduino Bluetooth Basics Tutorial
  2. For a wiring diagram, you can reference my Fritzing sketch. (You need to download Fritzing
    in order t. view this.)


[tabby title="Step 2"]



  1. To find your bluetooth’s MAC address, a good program to use is called Ardudroid on the Google Play store.
  2. To control the car, Tolik777 has created a great app that you can download from here and install on your Anrdoid device.


  1. The first thing you need to to is download the Arduino software for your computer.
  2. Then you need to copy this code to a new sketch and upload it to your Arduino device. Code provided by
#include "EEPROM.h"

#define D1 2          // direction of motor rotation 1
#define M1 3          // PWM left motor
#define D2 4          // direction of motor rotation 2
#define M2 5          // PWM right motor
#define HORN 13       // additional channel 1
//#define autoOFF 2500  // milliseconds after which the robot stops when the connection

#define cmdL 'L'      // UART-command for left motor
#define cmdR 'R'      // UART-command for right motor
#define cmdH 'H'      // UART-command for additional channel (for example Horn)
#define cmdF 'F'      // UART-command for EEPROM operation
#define cmdr 'r'      // UART-command for EEPROM operation (read)
#define cmdw 'w'      // UART-command for EEPROM operation (write)

char incomingByte;    // incoming data

char L_Data[4];       // array data for left motor
byte L_index = 0;     // index of array L
char R_Data[4];       // array data for right motor
byte R_index = 0;     // index of array R
char H_Data[1];       // array data for additional channel
byte H_index = 0;     // index of array H
char F_Data[8];       // array data for  EEPROM
byte F_index = 0;     // index of array F
char command;         // command

unsigned long currentTime, lastTimeCommand, autoOFF;

void setup() {
  Serial.begin(9600);       // initialization UART
  pinMode(HORN, OUTPUT);    // additional channel
  pinMode(D1, OUTPUT);      // output for motor rotation
  pinMode(D2, OUTPUT);      // output for motor rotation
  timer_init();             // initialization software timer

void timer_init() {
  uint8_t sw_autoOFF =;   // read EEPROM "is activated or not stopping the car when losing connection"
  if(sw_autoOFF == '1'){                 // if activated
    char var_Data[3];
    var_Data[0] =;
    var_Data[1] =;
    var_Data[2] =;
    autoOFF = atoi(var_Data)*100;        // variable autoOFF ms
  else if(sw_autoOFF == '0'){        
    autoOFF = 999999;
  else if(sw_autoOFF == 255){
    autoOFF = 2500;                      // if the EEPROM is blank, dafault value is 2.5 sec
  currentTime = millis();                // read the time elapsed since application start
void loop() {
  if (Serial.available() > 0) {          // if received UART data
    incomingByte =;        // raed byte
    if(incomingByte == cmdL) {           // if received data for left motor L
      command = cmdL;                    // current command
      memset(L_Data,0,sizeof(L_Data));   // clear array
      L_index = 0;                       // resetting array index
    else if(incomingByte == cmdR) {      // if received data for left motor R
      command = cmdR;
      R_index = 0;
    else if(incomingByte == cmdH) {      // if received data for additional channel
      command = cmdH;
      H_index = 0;
    else if(incomingByte == cmdF) {      // if received data for EEPROM op
      command = cmdF;
      F_index = 0;
    else if(incomingByte == '\r') command = 'e';   // end of line
    else if(incomingByte == '\t') command = 't';   // end of line for EEPROM op
    if(command == cmdL && incomingByte != cmdL){
      L_Data[L_index] = incomingByte;              // store each byte in the array
      L_index++;                                   // increment array index
    else if(command == cmdR && incomingByte != cmdR){
      R_Data[R_index] = incomingByte;
    else if(command == cmdH && incomingByte != cmdH){
      H_Data[H_index] = incomingByte;
    else if(command == cmdF && incomingByte != cmdF){
      F_Data[F_index] = incomingByte;
    else if(command == 'e'){                       // if we take the line end
    else if(command == 't'){                       // if we take the EEPROM line end
    lastTimeCommand = millis();                    // read the time elapsed since application start
  if(millis() >= (lastTimeCommand + autoOFF)){     // compare the current timer with variable lastTimeCommand + autoOFF
    Control4WD(0,0,0);                             // stop the car

void Control4WD(int mLeft, int mRight, uint8_t Horn){

  bool directionL, directionR;      // direction of motor rotation L298N
  byte valueL, valueR;              // PWM M1, M2 (0-255)
  if(mLeft > 0){
    valueL = mLeft;
    directionL = 0;
  else if(mLeft < 0){
    valueL = 255 - abs(mLeft);
    directionL = 1;
  else {
    directionL = 0;
    valueL = 0;
  if(mRight > 0){
    valueR = mRight;
    directionR = 0;
  else if(mRight < 0){
    valueR = 255 - abs(mRight);
    directionR = 1;
  else {
    directionR = 0;
    valueR = 0;
  analogWrite(M1, valueL);            // set speed for left motor
  analogWrite(M2, valueR);            // set speed for right motor
  digitalWrite(D1, directionL);       // set direction of left motor rotation
  digitalWrite(D2, directionR);       // set direction of right motor rotation
  digitalWrite(HORN, Horn);           // additional channel

void Flash_Op(char FCMD, uint8_t z1, uint8_t z2, uint8_t z3, uint8_t z4){

  if(FCMD == cmdr){           // if EEPROM data read command
    Serial.print("FData:");       // send EEPROM data
    Serial.write(;     // read value from the memory with 0 address and print it to UART
    Serial.print("\r\n");         // mark the end of the transmission of data EEPROM
  else if(FCMD == cmdw){          // if EEPROM data write command
    EEPROM.write(0,z1);               // z1 record to a memory with 0 address
    timer_init();             // reinitialize the timer
    Serial.print("FWOK\r\n");         // send a message that the data is successfully written to EEPROM

[tabby title="Links"]

Follow Tinkernut!
Google +


Arduino Bluetooth Basics

[tabby title="Overview"]
This video will show you the basics of controlling an Arduino through bluetooth. Click the “Step” tags for a walkthrough!

[tabby title="Step 1"]

Acquiring the Parts
Here’s what you will need:

  • A Bluetooth Capable Smartphone (I’ll be using an Android).
  • An Arduino ($10.99)
  • An Arduino Bluetooth Module ($6.45)
  • An LED ($0.99)

[tabby title="Step 2"]


You can download the Fritzing sketch here.

Screen Shot 2014-03-08 at 7.38.33 PM

[tabby title="Step 3"]



A good Android program for Arduino is called Ardudroid on the Google Play store.



int ledPin = 13; 
int state = 0;
int flag = 0; 
void setup() {
 pinMode(ledPin, OUTPUT);
 digitalWrite(ledPin, LOW);
 Serial.begin(9600); // Default connection rate for my BT module
void loop() {

 if(Serial.available() > 0){
 state =;

 if (state == '0') {
 digitalWrite(ledPin, LOW);
 if(flag == 0){
 Serial.println("LED: off");
 flag = 1;

 else if (state == '1') {
 digitalWrite(ledPin, HIGH);
 if(flag == 0){
 Serial.println("LED: on");
 flag = 1;

[tabby title="Links"]

Follow Tinkernut!
Google +