Friday 26 February 2016

The Kitchen Stools

The Kitchen Stools

I've managed to find White Ash wood at the local supplier. White Ash is as good looking as Oak, but not as expensive. I found it much easier to work with than Oak. The cost of the wood for three stools was less than one stool in the shop.

I scanned through the Google SketchUp 3D Warehouse and found a stool design, by David K., idea that will not be to complicated to build, yet still attractive.


I've tried making the mortises using only my router's guide, but the progress was slow and accurasy was not up to standard. So I spend some time creating jigs.  


...and the results were much more accurate and faster to complete.


The tenons was a bit more of a challenge,  but worth the effort.


By added a bit of wood stain I've managed to get a close oak look alike finished product. 



Stool one completed. Two more to build.

Sunday 7 February 2016

More table space in the kitchen

More table space in the kitchen

As the kids get older, we've realised that we need more space in the kitchen. Especially table space, because the kids would like to help mom in the kitchen and need their own area. While we were at it, we've also decided to add a breakfast bar.

I've used Google SketchUp to design two kitchen cupboards with a tabletop to cover them both and an added overhang for the breakfast bar. Below is the design without the doors, which is available in the Google SketchUp 3D Warehouse under "Kitchen cupboard and breakfast bar" . The doors are still a riddle to be dealt with. Will I still get the same design doors as the rest of the kitchen? 


So here we go. Brought my boards from the local TimberCity and started cutting to size. It is always a bit of a struggle to deal with the initial boards when you are alone, but I've learned to cut them into smaller pieces, a bit bigger than the actual required size, and then cut them to size on the table saw. A bit of a waist, but yeh... 



Putting it all together...

...and moving it to the kitchen.


The next step is to get a top for this new cupboard. We've decided to go for the granite tops. This took some careful planning and measuring and remeasuring, because if I get this wrong it is going to cost. My biggest concern was to make sure that everything is 100% level before the top arrives. 

After four days the top arrived, cut on size, and it fit perfectly.


I've been phoning everyone that could possibly supply me with the same cupboard doors as the current doors in the kitchen, but with no luck. It appears that they are out of design, but one dealer gave me a great tip. It will not look exactly the same, but at least I will be covered for the rest of my kitchen life. He said I should cut the doors slightly smaller and then add solid wood edging. 

I first tried with white ash wood, but the colour was off. I found oak wood edging in town and it looked perfect. 



 All breakfast bars need stools. The wife and me when on a stool hunt, but they all look like something that belongs on the Star Trek Enterprise. After two days of searching, I've decided to rather search for proper wood and make them myself. Will this project ever end :-)





Thursday 17 December 2015

Arduino and the TinyGPS module

I've ordered this Tiny GPS module of eBay and as usual by the time it arrives in Namibia (~ 3 months later) I can't remember why I got it in the first place. So I decided to hooked it up to my Arduino Uno.

After Googling I found a DFRobot Wiki with some sample code, wiring,  and links to the required library.



I've modifying the code a bit and was able to retrieve information from the GPS, but the format was decimal degrees and I would like to get  the DMS format. This was the most tricky part, but I finally got it right, or at least I think so.

I've also added some additional readings just for fun...

The code

#include <TinyGPS.h>
#include <Wire.h>
#include <LiquidCrystal.h>

TinyGPS gps;
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);              //LCD driver pins
int led = 13;

long lat, lon;
unsigned long fix_age, time, date, speed, course;
unsigned long chars;
unsigned short sentences, failed_checksum;
int year;
byte month, day, hour, minute, second, hundredths;
int Timezone = 2;                  //GMT +2:00
long alt;

int DEG;
int MIN;
float SEC;
long LATT, LONG;
char N_S, E_W;

int counter;

 
void LAT(){                        //Latitude state
  LATT=lat;
 
  if (LATT < 0)
  {
    N_S = 'S';
    LATT = -LATT;
  }
  else
  {
    N_S = 'N'; 
  }
 
  DEG = (int)(LATT/1000000);              //Get the Degrees
  LATT = LATT - (DEG*1000000);            //Remove the degrees from the calculation
  MIN = LATT*60/1000000;                  //Convert to minutes
  LATT = LATT*60 - (MIN*1000000);          //Remove the minutes from the calculation
  SEC = float(LATT)*60/1000000;

  lcd.setCursor(0,0);             // set the LCD cursor   position
  lcd.print(N_S);
  lcd.print(DEG);
  lcd.write(0xDF);
  lcd.print(MIN);
  lcd.print("'");
  lcd.print(SEC);
  lcd.write(0x22);
  lcd.print("           ");
}


void LON(){                        //Longitude state
  LONG=lon;
 
  if (LONG < 0)
  {
    E_W = 'W';
    LONG = -LONG;
  }
  else
  {
    E_W = 'E'; 
  }
 
  DEG = (int)(LONG/1000000);              //Get the Degrees
  LONG = LONG - (DEG*1000000);            //Remove the degrees from the calculation
  MIN = LONG*60/1000000;                 //Convert to minutes
  LONG = LONG*60 - (MIN*1000000);          //Remove the minutes from the calculation
  SEC = float(LONG)*60/1000000;

  lcd.setCursor(0,1);              // set the LCD cursor   position
  lcd.print(E_W);             
  lcd.print(DEG);
  lcd.write(0xDF);
  lcd.print(MIN);
  lcd.print("'");
  lcd.print(SEC);
  lcd.write(0x22);
  lcd.print("                ");
}



void setup()
{
  Serial.begin(9600);            //Set the GPS baud rate.

  pinMode(led, OUTPUT); 

  lcd.begin(16, 2);               // start the library
  lcd.setCursor(0,0);             // set the LCD cursor   position
  lcd.print("Nico's GPS");          // print a simple message on the LCD
  delay(2000);
  counter = 0;
}

void Date_Time() {

  lcd.setCursor(0,0);              // set the LCD cursor   position
  lcd.print(year); 
  lcd.print("-"); 
  lcd.print(month);
  lcd.print("-");
  lcd.print(day);
  lcd.print("          ");
 
  lcd.setCursor(0,1);              // set the LCD cursor   position
  lcd.print(hour + Timezone); 
  lcd.print(":"); 
  lcd.print(minute);
  lcd.print(":");
  lcd.print(second);
  lcd.print("          ");

 
}

void Altitude(){
  lcd.setCursor(0,0);              // set the LCD cursor   position
  lcd.print("Alt: ");
  lcd.print(gps.f_altitude());
  lcd.print(" m         ");
}

void Satellites(){
  lcd.setCursor(0,1);              // set the LCD cursor   position
  lcd.print("Satellites: ");
  lcd.print(gps.satellites());
  lcd.print("          ");
}

void Speed(){
  lcd.setCursor(0,0);              // set the LCD cursor   position
  lcd.print("KM/h: ");
  lcd.print(gps.f_speed_kmph());
  lcd.print("          ");
}

void Course(){
  lcd.setCursor(0,1);              // set the LCD cursor   position
  lcd.print("Course: ");
  lcd.print(gps.f_course());
  lcd.write(0xDF);
  lcd.print("          ");
}

void loop()
{
  while (Serial.available())
  {
    digitalWrite(led, HIGH);
    int c = Serial.read();                   // Read the GPS data
    if (gps.encode(c))                        // Check the GPS data
    {
      // process new gps info here
    }

  }
  digitalWrite(led, LOW);
  gps.get_position(&lat, &lon, &fix_age);     // retrieves +/- lat/long in 100000ths of a degree
  gps.get_datetime(&date, &time, &fix_age);   // time in hhmmsscc, date in ddmmyy

  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &fix_age); 

  counter++;

  if (counter >= 0 && counter <=1000) {
      LAT();
      LON();
  }
  if (counter >= 1001 && counter <=2000) {
      Date_Time();
  }
 
  if (counter >= 2001 && counter <=3000) {
      Altitude();
      Satellites();
  }
 
  if (counter >= 3001 && counter <=4000) {
      Speed();
      Course();
  }
 
  if (counter > 4000) {
      counter = 0;
  }

}


With the data I can now collect from the GPS module, I decided to search for a SD Card module to create a log file with entries every 5 seconds or so. I found and ordered the module again from eBay.

In the meanwhile I decided to replace the Arduino Uno with one of those cheap eBay Arduino Nanos.



After struggling for a while to get the cheap clone Arduino Nano to work I found this great posting on kiguino.moos.io explaining the issue and how to fix it.

I also had to add a symbolic link to get it working on my Mac:

sudo ln -s/dev/cu.usbmodem411 /dev/tty.wchusbserial1410


So what's next


Once the logger arrives I will add that to the Arduino Nano and if I'm brave enough I will attempt to get it all working on a PIC Micro Controller.