Pages

Sunday, July 14, 2013

DIY Drone - Quadcopter

Over the past few months I've been building a Quadcopter.  Here are a couple pictures of it:



Originally I didn't want to spend a lot of money so I just bought the basic parts that I needed to get going.  Of course once I started I always wanted to make it better and better. So over time I replaced a lot of the parts to get to the final product (what see you above).

I've had quite a few requests from my YouTube channel on what parts I used and what I recommend.  So I decided that I should blog about it (since I haven't blogged in over 2 years). I will only go into the details of what the final product is.  I will not cover all the parts that I started off with.

Current Parts:
This totals out to be around 494$.  NOTE that the NTM Motors didn't fit 100% onto the frame.  I only used 2 screws to mount them instead of 4.  If I had to do it again, I'd suggest the following:

This totals out to be around 516$ but then everything will fit.  

Keep in mind that with this you will have to solder and put it all together yourself.  For me this is the fun part.  Putting it all together and making the software work.  I'm not sure exactly how much time I spent on it, but it was quite a bit because I kept improving my setup.  If you don't want to build this all yourself you can always purchase pre-built Quadcopters or get the DJI Phantom for 680$.

Also, if you dont want the GPS features, then you can reduce the cost of the flight controller to about 40$ and you can get a 4-channel remote.

Next I want to cover the features that the MultWii Flight Controller offers.

Features:
  • Acro / Gyro Mode - Allows you to flip the Quadcopter (I haven't tried this)
  • Stable / Level / Acc/ Angle - Basically holds the pitch/roll based on the absolute angel of the input stick.
  • HeadFree - Fixes the control direction to the heading it had on arming.  So you can change the yaw direction and it will still move forwards if you pitch forwards.  You can see me demonstrate it here at around 2:05.
  • Altitude Hold - Holds Altitude
  • GPS Position Hold - Holds Position based on GPS (watch this for demo).
  • GPS Return to Home (RTH) - Returns the copter to the position it was armed (watch this for demo).
  • Bluetooth Telemetry
Thats basically all for this post.  If there is interest, please post in the comments and I'll make another post on what it takes to configure it all.





Wednesday, December 15, 2010

Arduino Tivo Remote Extender

About a year ago I needed the ability to control my Tivo S3 from another room. Originally I purchased some cheap IR Extender from Radio Shack and tried it. After toying around with it I knew that a off-shelf product was going to be useless.

So I developed my own solution:

After doing some reading I knew the Tivo S3/HD (newer ones probably as well) have a telnet server running on the Tivo that allows 3rd party apps to control the Tivo.

To test this, all you need to do is open a Telnet client, connect to your Tivo's IP using port 31339 and then you could start sending out commands to the Tivo like the following:

IRCODE TIVO
IRCODE LIVETV
IRCODE UP

With this in mind, I knew there was the ability to control the Tivo using an ethernet device.

Previously I had played around with Arduino . This is a microcontroller which you can program to control your I/O's on the device. This device also supports an Ethernet Sheild which would allow me to communicate with the Tivo's Telnet server. Next I needed a IR receiver for this to work, after Googling I found this receiver on SparkFun.

Here is the hardware:


Now comes the fun part: the software:

#include

#include
#include
#include
#include

#include

byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {
192, 168, 0, 213 }; // Device IP
byte server[] = {
192, 168, 0, 134 }; // Tivo

Client client(server, 31339);

int RECV_PIN = 3;
IRrecv irrecv(RECV_PIN);
decode_results results;
decode_results resultslast;
unsigned long firetime;

void setup()
{
irrecv.enableIRIn(); // Start the receiver
Ethernet.begin(mac, ip);
Serial.begin(9600);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);

}

void sndcmd(char data[]) {
resultslast = results;

if (millis() - firetime >= 150) {

if (client.connect()) {
client.println(data);
}
else
{
client.stop();
delay(50);
if (client.connect()) {
client.println(data);
}
}

firetime = millis();

}
}

void loop() {
analogWrite(5, 15);

if (irrecv.decode(&results)) {

Serial.println(results.value, HEX);
// Serial.println("-----");

if (results.value == 0xFFFFFFFF) {
results = resultslast;
}

switch (results.value) {

case 0xA10CD00F: //Tivo Button (cheapo remote)
sndcmd("IRCODE TIVO");
break;

case 0xA10C500F: //Tivo Button (nice remote)
sndcmd("IRCODE TIVO");
break;
case 0xA10C8807: //LiveTV Button
sndcmd("IRCODE LIVETV");
break;

case 0xA10CC807: //Info Button
sndcmd("IRCODE DISPLAY");
break;

case 0xA10C6C03: //Guide Button
sndcmd("IRCODE GUIDE");
break;

case 0xA10C2807: //Select Up Button
sndcmd("IRCODE UP");
break;

case 0xA10C6807: //Select Down Button
sndcmd("IRCODE DOWN");
break;

case 0xA10CE807: //Select Left Button
sndcmd("IRCODE LEFT");
break;

case 0xA10CA807: //Select Right Button
sndcmd("IRCODE RIGHT");
break;

case 0xA10C9807: //Select Button
sndcmd("IRCODE SELECT");
break;

case 0xA10C1807: //Thumbs Down
sndcmd("IRCODE THUMBSDOWN");
break;

case 0xA10C5807: //Thumbs Up
sndcmd("IRCODE THUMBSUP");
break;

case 0xA10C7807: //Channel Up
sndcmd("IRCODE CHANNELUP");
break;

case 0xA10CF807: //Channel Down
sndcmd("IRCODE CHANNELDOWN");
break;

case 0xA10C040B: //Record
sndcmd("IRCODE RECORD");
break;

case 0xA10C840B: //Play
sndcmd("IRCODE PLAY");
break;

case 0xA10CC40B: //Pause
sndcmd("IRCODE PAUSE");
break;

case 0xA10CA40B: //Slow
sndcmd("IRCODE SLOW");
break;

case 0xA10C440B: //Reverse
sndcmd("IRCODE REVERSE");
break;

case 0xA10C240B: //Forward
sndcmd("IRCODE FORWARD");
break;

case 0xA10CE40B: //Advance
sndcmd("IRCODE ADVANCE");
break;

case 0xA10C640B: //Replay
sndcmd("IRCODE REPLAY");
break;

case 0xA10C140B: //Num 1
sndcmd("IRCODE NUM1");
break;

case 0xA10C940B: //Num 2
sndcmd("IRCODE NUM2");
break;

case 0xA10C540B: //Num 3
sndcmd("IRCODE NUM3");
break;

case 0xA10CD40B: //Num 4
sndcmd("IRCODE NUM4");
break;

case 0xA10C340B: //Num 5
sndcmd("IRCODE NUM5");
break;

case 0xA10CB40B: //Num 6
sndcmd("IRCODE NUM6");
break;

case 0xA10C740B: //Num 7
sndcmd("IRCODE NUM7");
break;

case 0xA10CF40B: //Num 8
sndcmd("IRCODE NUM8");
break;

case 0xA10C0C03: //Num 9
sndcmd("IRCODE NUM9");
break;

case 0xA10C8C03: //Num 0
sndcmd("IRCODE NUM0");
break;

case 0xA10CCC03: //Enter
sndcmd("IRCODE ENTER");
break;

case 0xA10C4C03: //Clear
sndcmd("IRCODE CLEAR");
break;

default:
resultslast = results;
break;

}

irrecv.resume(); // Receive the next value
}

}

I used this IR library I found on the net from Ken Shirriff. Basically it has the ability to capture the keys pressed from the Tivo Remote and returns a integer (ex. 0xA10C4C03). Each button fires a different integer. With this I mapped out each command, then connect to the Tivo and pass the proper Telnet command.

Below you can find a YouTube video of the device in action:







Monday, December 13, 2010

New Web Site

Just got done moving the web site from GoDaddy over to Blogger. The performance of the new site should be significantly better.

I'll be adding more content soon.

Sunday, May 2, 2010

Wireless Ipod Touch Sync Prototype 2

This is a continuation of my previous blog post.

Throughout last week I've been working on creating an application that allows you to manage your iPod's content. In the video below you can see that I am syncing my iPod through the wireless using this .NET application from a Windows 7 machine.

This application is still in its very early stage. The user interface (UI) is only a rough draft and will probably change tons before I release this.

Sunday, April 25, 2010

Wireless Ipod Touch Sync Prototype

Recently I got a new car (2010 Audi S4) which has full iPod integration. So on the Radio you can basically see everything that you can see on the iPod (Tracks/Artist/Albums/Playlist/etc).

What I want is the possibility to leave the iPod Touch in the car forever, then if I want to put new music on it, I can sync it though my wireless network at home. The iPod doesnt support this "wireless sync" out of the box; so I attempted to make my own application that can do this.

This is the prototype. I have a 1st gen iPod touch 16gb running OS 2.2.1 which is jailbroken and running vsftpd and openssh. Using the FTP server, I can transfer songs to the iPod, then also read/write the iTunesDB file (contains all the tracklist/albums/etc). Then using OpenSSH I can connect to the iPod and tell it to reload the iTunesDB file (ReSpring the ipod) when needed.

In this video I only read the itunesdb, change one of the Titles, then I manually upload the itunesdb file using FileZilla, and then I manually trigger the "ReSpring". Then you can see the updated title on Audi's MMI (The Radio).

Again, this is only a proof of concept. The intention is to have a simple to use Windows program that does all the dirty work for you.

This will only work on iPod touches running OS 2.x and must be jailbroken. Yes it is possible to downgrade an iPod touch running 3.x to 2.x (at least for the 1st gen iPod). I've done it :). I do not plan on supporting album art/video upload/etc. This is only so I can leave my ipod in the car and sync music to it.

Source Code will be made public once the project is done.

Thursday, February 11, 2010

Real Example of Google Visualization/Charts with SharePoint



Here is a real example of using SharePoint (WSS or MOSS) with Google Visualizations/Charts. The data your looking at is pool temperature that I've been collecting from a small PLC. The gauges show actual temp (real-time; updates every 2 secs), while the Annotated Timeline shows the history of the time.

The data for the Annotated Timeline is coming from a local MS SQL Express Server which collects the data every 5 minutes. The gauges are real-time connecting directly to the Beckhoff TwinCAT (PLC software) to grab the temp.

Wednesday, January 20, 2010

Google Visualization - Wire Protocol Data Provider System (DTS - Source and Installation Instructions)

In my previous post I talked about how to use Google Visualization API with SharePoint to create a new dashboard/reporting platform. Then I talked about a system to pulls any data and makes it available to the Google Visualization API using the Wire Protocol in this post.

This system I call "DTS" for Data Transformation System. As I wrote in the previous post, this system is nothing more than an ASP.NET page that loads DLL's (based on the DSNAME parameter in the URL). Then the DLL is responsible for providing a data-table with the content the user requested. The ASP.NET page will then convert the data-table into JSON which the Google Visualization API can use.

Currently I only have 1 plugin (DLL) provided which allows you to connect to a Microsoft SQL Server.

The zip file provided below contains instructions on how to install this system on Windows 2008 using SQL Express 2008. You will also find ALL the source included. Remember this is only a proof of concept and there is probably a great deal of work that can be done to make this system better.


Next week I will explain how to setup and configure new DLL's to allow you to connect to other data sources.

Comments/Thoughts are welcome!

Carsten

Sunday, July 14, 2013

DIY Drone - Quadcopter

Over the past few months I've been building a Quadcopter.  Here are a couple pictures of it:



Originally I didn't want to spend a lot of money so I just bought the basic parts that I needed to get going.  Of course once I started I always wanted to make it better and better. So over time I replaced a lot of the parts to get to the final product (what see you above).

I've had quite a few requests from my YouTube channel on what parts I used and what I recommend.  So I decided that I should blog about it (since I haven't blogged in over 2 years). I will only go into the details of what the final product is.  I will not cover all the parts that I started off with.

Current Parts:
This totals out to be around 494$.  NOTE that the NTM Motors didn't fit 100% onto the frame.  I only used 2 screws to mount them instead of 4.  If I had to do it again, I'd suggest the following:

This totals out to be around 516$ but then everything will fit.  

Keep in mind that with this you will have to solder and put it all together yourself.  For me this is the fun part.  Putting it all together and making the software work.  I'm not sure exactly how much time I spent on it, but it was quite a bit because I kept improving my setup.  If you don't want to build this all yourself you can always purchase pre-built Quadcopters or get the DJI Phantom for 680$.

Also, if you dont want the GPS features, then you can reduce the cost of the flight controller to about 40$ and you can get a 4-channel remote.

Next I want to cover the features that the MultWii Flight Controller offers.

Features:
  • Acro / Gyro Mode - Allows you to flip the Quadcopter (I haven't tried this)
  • Stable / Level / Acc/ Angle - Basically holds the pitch/roll based on the absolute angel of the input stick.
  • HeadFree - Fixes the control direction to the heading it had on arming.  So you can change the yaw direction and it will still move forwards if you pitch forwards.  You can see me demonstrate it here at around 2:05.
  • Altitude Hold - Holds Altitude
  • GPS Position Hold - Holds Position based on GPS (watch this for demo).
  • GPS Return to Home (RTH) - Returns the copter to the position it was armed (watch this for demo).
  • Bluetooth Telemetry
Thats basically all for this post.  If there is interest, please post in the comments and I'll make another post on what it takes to configure it all.





Wednesday, December 15, 2010

Arduino Tivo Remote Extender

About a year ago I needed the ability to control my Tivo S3 from another room. Originally I purchased some cheap IR Extender from Radio Shack and tried it. After toying around with it I knew that a off-shelf product was going to be useless.

So I developed my own solution:

After doing some reading I knew the Tivo S3/HD (newer ones probably as well) have a telnet server running on the Tivo that allows 3rd party apps to control the Tivo.

To test this, all you need to do is open a Telnet client, connect to your Tivo's IP using port 31339 and then you could start sending out commands to the Tivo like the following:

IRCODE TIVO
IRCODE LIVETV
IRCODE UP

With this in mind, I knew there was the ability to control the Tivo using an ethernet device.

Previously I had played around with Arduino . This is a microcontroller which you can program to control your I/O's on the device. This device also supports an Ethernet Sheild which would allow me to communicate with the Tivo's Telnet server. Next I needed a IR receiver for this to work, after Googling I found this receiver on SparkFun.

Here is the hardware:


Now comes the fun part: the software:

#include

#include
#include
#include
#include

#include

byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {
192, 168, 0, 213 }; // Device IP
byte server[] = {
192, 168, 0, 134 }; // Tivo

Client client(server, 31339);

int RECV_PIN = 3;
IRrecv irrecv(RECV_PIN);
decode_results results;
decode_results resultslast;
unsigned long firetime;

void setup()
{
irrecv.enableIRIn(); // Start the receiver
Ethernet.begin(mac, ip);
Serial.begin(9600);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);

}

void sndcmd(char data[]) {
resultslast = results;

if (millis() - firetime >= 150) {

if (client.connect()) {
client.println(data);
}
else
{
client.stop();
delay(50);
if (client.connect()) {
client.println(data);
}
}

firetime = millis();

}
}

void loop() {
analogWrite(5, 15);

if (irrecv.decode(&results)) {

Serial.println(results.value, HEX);
// Serial.println("-----");

if (results.value == 0xFFFFFFFF) {
results = resultslast;
}

switch (results.value) {

case 0xA10CD00F: //Tivo Button (cheapo remote)
sndcmd("IRCODE TIVO");
break;

case 0xA10C500F: //Tivo Button (nice remote)
sndcmd("IRCODE TIVO");
break;
case 0xA10C8807: //LiveTV Button
sndcmd("IRCODE LIVETV");
break;

case 0xA10CC807: //Info Button
sndcmd("IRCODE DISPLAY");
break;

case 0xA10C6C03: //Guide Button
sndcmd("IRCODE GUIDE");
break;

case 0xA10C2807: //Select Up Button
sndcmd("IRCODE UP");
break;

case 0xA10C6807: //Select Down Button
sndcmd("IRCODE DOWN");
break;

case 0xA10CE807: //Select Left Button
sndcmd("IRCODE LEFT");
break;

case 0xA10CA807: //Select Right Button
sndcmd("IRCODE RIGHT");
break;

case 0xA10C9807: //Select Button
sndcmd("IRCODE SELECT");
break;

case 0xA10C1807: //Thumbs Down
sndcmd("IRCODE THUMBSDOWN");
break;

case 0xA10C5807: //Thumbs Up
sndcmd("IRCODE THUMBSUP");
break;

case 0xA10C7807: //Channel Up
sndcmd("IRCODE CHANNELUP");
break;

case 0xA10CF807: //Channel Down
sndcmd("IRCODE CHANNELDOWN");
break;

case 0xA10C040B: //Record
sndcmd("IRCODE RECORD");
break;

case 0xA10C840B: //Play
sndcmd("IRCODE PLAY");
break;

case 0xA10CC40B: //Pause
sndcmd("IRCODE PAUSE");
break;

case 0xA10CA40B: //Slow
sndcmd("IRCODE SLOW");
break;

case 0xA10C440B: //Reverse
sndcmd("IRCODE REVERSE");
break;

case 0xA10C240B: //Forward
sndcmd("IRCODE FORWARD");
break;

case 0xA10CE40B: //Advance
sndcmd("IRCODE ADVANCE");
break;

case 0xA10C640B: //Replay
sndcmd("IRCODE REPLAY");
break;

case 0xA10C140B: //Num 1
sndcmd("IRCODE NUM1");
break;

case 0xA10C940B: //Num 2
sndcmd("IRCODE NUM2");
break;

case 0xA10C540B: //Num 3
sndcmd("IRCODE NUM3");
break;

case 0xA10CD40B: //Num 4
sndcmd("IRCODE NUM4");
break;

case 0xA10C340B: //Num 5
sndcmd("IRCODE NUM5");
break;

case 0xA10CB40B: //Num 6
sndcmd("IRCODE NUM6");
break;

case 0xA10C740B: //Num 7
sndcmd("IRCODE NUM7");
break;

case 0xA10CF40B: //Num 8
sndcmd("IRCODE NUM8");
break;

case 0xA10C0C03: //Num 9
sndcmd("IRCODE NUM9");
break;

case 0xA10C8C03: //Num 0
sndcmd("IRCODE NUM0");
break;

case 0xA10CCC03: //Enter
sndcmd("IRCODE ENTER");
break;

case 0xA10C4C03: //Clear
sndcmd("IRCODE CLEAR");
break;

default:
resultslast = results;
break;

}

irrecv.resume(); // Receive the next value
}

}

I used this IR library I found on the net from Ken Shirriff. Basically it has the ability to capture the keys pressed from the Tivo Remote and returns a integer (ex. 0xA10C4C03). Each button fires a different integer. With this I mapped out each command, then connect to the Tivo and pass the proper Telnet command.

Below you can find a YouTube video of the device in action:







Monday, December 13, 2010

New Web Site

Just got done moving the web site from GoDaddy over to Blogger. The performance of the new site should be significantly better.

I'll be adding more content soon.

Sunday, May 2, 2010

Wireless Ipod Touch Sync Prototype 2

This is a continuation of my previous blog post.

Throughout last week I've been working on creating an application that allows you to manage your iPod's content. In the video below you can see that I am syncing my iPod through the wireless using this .NET application from a Windows 7 machine.

This application is still in its very early stage. The user interface (UI) is only a rough draft and will probably change tons before I release this.

Sunday, April 25, 2010

Wireless Ipod Touch Sync Prototype

Recently I got a new car (2010 Audi S4) which has full iPod integration. So on the Radio you can basically see everything that you can see on the iPod (Tracks/Artist/Albums/Playlist/etc).

What I want is the possibility to leave the iPod Touch in the car forever, then if I want to put new music on it, I can sync it though my wireless network at home. The iPod doesnt support this "wireless sync" out of the box; so I attempted to make my own application that can do this.

This is the prototype. I have a 1st gen iPod touch 16gb running OS 2.2.1 which is jailbroken and running vsftpd and openssh. Using the FTP server, I can transfer songs to the iPod, then also read/write the iTunesDB file (contains all the tracklist/albums/etc). Then using OpenSSH I can connect to the iPod and tell it to reload the iTunesDB file (ReSpring the ipod) when needed.

In this video I only read the itunesdb, change one of the Titles, then I manually upload the itunesdb file using FileZilla, and then I manually trigger the "ReSpring". Then you can see the updated title on Audi's MMI (The Radio).

Again, this is only a proof of concept. The intention is to have a simple to use Windows program that does all the dirty work for you.

This will only work on iPod touches running OS 2.x and must be jailbroken. Yes it is possible to downgrade an iPod touch running 3.x to 2.x (at least for the 1st gen iPod). I've done it :). I do not plan on supporting album art/video upload/etc. This is only so I can leave my ipod in the car and sync music to it.

Source Code will be made public once the project is done.

Thursday, February 11, 2010

Real Example of Google Visualization/Charts with SharePoint



Here is a real example of using SharePoint (WSS or MOSS) with Google Visualizations/Charts. The data your looking at is pool temperature that I've been collecting from a small PLC. The gauges show actual temp (real-time; updates every 2 secs), while the Annotated Timeline shows the history of the time.

The data for the Annotated Timeline is coming from a local MS SQL Express Server which collects the data every 5 minutes. The gauges are real-time connecting directly to the Beckhoff TwinCAT (PLC software) to grab the temp.

Wednesday, January 20, 2010

Google Visualization - Wire Protocol Data Provider System (DTS - Source and Installation Instructions)

In my previous post I talked about how to use Google Visualization API with SharePoint to create a new dashboard/reporting platform. Then I talked about a system to pulls any data and makes it available to the Google Visualization API using the Wire Protocol in this post.

This system I call "DTS" for Data Transformation System. As I wrote in the previous post, this system is nothing more than an ASP.NET page that loads DLL's (based on the DSNAME parameter in the URL). Then the DLL is responsible for providing a data-table with the content the user requested. The ASP.NET page will then convert the data-table into JSON which the Google Visualization API can use.

Currently I only have 1 plugin (DLL) provided which allows you to connect to a Microsoft SQL Server.

The zip file provided below contains instructions on how to install this system on Windows 2008 using SQL Express 2008. You will also find ALL the source included. Remember this is only a proof of concept and there is probably a great deal of work that can be done to make this system better.


Next week I will explain how to setup and configure new DLL's to allow you to connect to other data sources.

Comments/Thoughts are welcome!

Carsten