Show Posts
Pages: 1 2 [3] 4 5 ... 376
31  Using Arduino / Programming Questions / Re: Need help with code for autonomous rc car on: July 26, 2014, 06:03:28 pm
Im amazed you never learned what a state machine.

I've known 30 year professional programmers who didn't know what a state machine was (likely they just didn't know the name, but probably used the pattern often - heck, I'm that way about certain "common patterns" - I don't know the names, because I never went thru an academic setting to learn software patterns - so some patterns I use and understand, but don't know they have a "formal name" so to speak). answer bdavis21's question, "what is a state machine?":

A state machine is a processing and decision structure designed such that the computer (and note, it doesn't have to be a computer - but today it typically is) is in one of a number of different "states" - and stays in that state until some particular condition is met, at which point the state is changed to cause the system to move to another state.

Typically, state machines in most programming languages are implemented using switch-case logic - though this isn't always necessary; it is certainly possible to implement a state machine using other logic decision operators and statements.

A simple state machine could be as follows (pseudocode):

state = 1 // initial state

  a = readSensor()

  switch (state)
    case 1:
       if a > 10 then state = 2
    case 2:
       b = readOtherSensor()
       if b < 55 then state = 3
    case 3:
       state = 4
    case 4:
       if a < 10 then state = 5
    case 5:
       state = 1

So here we can see that - as the system is looping it is in a state (1) to check a sensor for a value - if that value becomes greater than 10 it changes to the next state (2), where it checks another sensor for a value less than 55 - if that value is less than 55, then it changes to the next state (3), where it turns on a lamp, then sets things to go to the next state (4). In this state (4) is a check for the original sensor to fall below the value of 10 - if so, then the next state (5) is set, which turns off the lamp, and resets the state back to its original state (1) - to begin the cycle all over again.

During this time, the loop continuously runs - it is never "halted" or anything else. This - along with some extra code - is the essence of the whole "blink without delay" example (essentially, that example is a state machine with two states - one where the LED is on, the other where it is off, and the controlling condition is the amount of time which has passed). Since the code never halts, you could use this to allow for the ability to have many different "tasks" or "processes" running at the same time, rather than pausing to wait for something to happen (which is error prone, and typically will lead to other side effects in your program - especially for robotics).

I hope this helps to explain what a state machine is, what it is for, how to implement it, and why you might want to use it for your system.
32  Using Arduino / Project Guidance / Re: Converter videos from VHS to digital (hd mp4) on: July 26, 2014, 05:35:04 pm
I want to convert my VHS videos to a digital format only

Echoing the others: Again, what role do you envisage the Arduino playing, because honestly - there isn't really a need for the Arduino for this process.
33  Using Arduino / General Electronics / Re: H-Bridge component for designing 24V ,10A motor driver on: July 12, 2014, 02:26:43 pm
Any solution ?

By "driver", are you meaning or wanting to design a discrete component system (ie - using individual mosfets for the h-bridge, etc) - or are you looking for a "single chip" solution (plus any extra parts) - and how to design the circuit for that?

If the latter - then you would do best to see what current driver boards are using (such as the one posted on Ebay), and find out what chip they use, then get the datasheets, etc for that chip - and become familiar with the reference design, etc contained in those documents so that you can lay out such a board.

If the former, though - then you will have a long row to hoe, so to speak. You need to become intimately familiar with a whole host of topics and parts for creating such a driver: Understanding p-channel vs. n-channel mosfets, more generally how to implement an all-n-channel mosfet bridge, high-side drivers (how they work, how they can be implemented, that or use of IC high-side driver chips for all n-channel designs), how to properly size the mosfets (and potentially any heatsinks - though your current requirements are low enough that if you can obtain n-channels with a very low Rds(on) value, they could be mostly eliminated - but if you didn't understand what I just said - well, again, more learning); then there is the actually software controls, other interfacing, elimination or prevention (or protection) against shoot-thru, etc.

In short - if you really wish to learn discrete h-bridge design, at the current levels you are wanting you will need to be prepared to spend some money, because you may be blowing FETs left and right. If you do go down that route, I would personally try to find and use FETs that are smaller with a small motor (maybe 12 volts at 1 amp or so) - that way, as you blow parts, you won't blow a budget, plus you'll still get the design experience and knowledge needed for implementing the larger bridge in the future (hopefully, with fewer costly mistakes).

Oh - you're also going to want to invest in a good oscilloscope and power supply, if you haven't already got these tools - if you insist on going down the discrete component design path.

I'm not trying to discourage you here; you've stated this is for learning, and there is nothing wrong with that. I'm just wanting to make sure you understand that it won't be an easy or inexpensive route to take. If you are good with that, then - go for it. Beyond that, I don't have any specific design knowledge or experience to impart.

Good luck.
34  Topics / Robotics / Re: artificial intelligence robot. on: July 06, 2014, 07:51:37 pm
yes  cr0sh i agree you but could you please post me an better link to know more about AI. even though i search in google i am unable to find a proper one  smiley-eek-blue

The thing is, your not going to find much on simply googling "artificial intelligence" - it would be like expecting to learn how to program in C++ by googling "computer science" (not the greatest analogy, but good enough for now I think).

If you really want to learn about artificial intelligence - you'll need a foundation to work from, and you'll need to put in the work. I posted a couple of links to courses via Coursera and Udacity. Take a look at those, and maybe also other coursework those organizations offer. Neither course will be easy (although I found the Coursera ML Class to be easier than the Udacity class) - you will need to have good grounding in statistics, probabilities, and linear algebra to make headway and understanding. Each course takes about 6 to 8 weeks to complete (working a few hours each evening, plus some extra on weekends).

Once you have that understanding, then you can start looking into machine learning concepts outside that scope, plus topics on neural networks and such. I have to also say that the Udacity course, while the more difficult of the two, will give better understanding on how to relate artificial intelligence and machine learning concepts to a robot - since that is the point of the course, to teach you how to "build" a self-driving vehicle - it is after all taught by the guy behind google's self-driving car.

There is so much information out there on such a vast and wide array of topics under the "artificial intelligence" umbrella; many of them relate to robotics, but you have to understand and have that foundation to know how they relate. Also - much information is only available in book form, so you may want to build your library.

Also - you may want to check out this Udacity course as well:

It was first released as a Stanford class back in 2011 as well (I took it but had to drop out about halfway through due to personal issues). When it was taught then, you had to get this book for the class - which is a great book to learn from (it's a textbook, though - so realize that if you get a recent edition, expect to pay a lot of money):

"Artificial Intelligence: A Modern Approach"

Finally - though these books should be considered "dated" - I like to recommend them; they are mainly an example of something now known as "subsumption architecture". At the time (late 1970s - early 1980s) which was before Rodney Brook's machines - the author was just playing around with some interesting "homebrew" technology of sorts. In the end, his machine that he named "Rodney" became this robot, which was sold for a while for educational purposes:

Anyhow - the author's name is "David L. Heiserman" - his books are:

Build Your Own Working Robot - #841 (ISBN 0-8306-6841-1), HB, © 1976
How to Build Your Own Self-Programming Robot - #1241, (ISBN 0-8306-9760-8), HB, © 1979
Robot Intelligence...with experiments - #1191, (ISBN 0-8306-9685-7), HB, © 1981
How to Design & Build Your Own Custom Robot - #1341, (ISBN 0-8306-9629-6), HB, © 1981
Projects in Machine Intelligence For Your Home Computer - #1391, (ISBN 0-8306-0057-4), HB, © 1982
Build Your Own Working Robot - The Second Generation - #2781, (ISBN 0-8306-1181-9), HB, © 1987

Note that all of these are long out-of-print - if you want to read them, you'll have to purchase them used or find another source. They are very interesting to read, and give a great idea about the "state-of-the-art" in hobbyist robotics for the time period. Virtually all the examples contained in those books could be easily re-created using an Arduino and a simple robotics platform (heck, you could probably do most of it with the Arduino Robot). But again, they shouldn't be thought of as teaching "modern techniques of artificial intelligence" - they need to be looked at and understood with hindsight from today's understanding and knowledge (that's also one of the problems with AI - being able to know what "old stuff" is still relevant, and what isn't).

35  Topics / Robotics / Re: artificial intelligence robot. on: July 05, 2014, 06:32:05 pm
i am preparing my coding now onward. i just ordered a robot chassis on ebay and i am waiting till it arrive  smiley-wink. here is a piece of my code below.

What you coded is not artificial intelligence - it's also not an expert system. It is merely a simplified decision tree of sorts to potentially avoid obstacles based on what the sensor(s) report.

There is no self-learning involved in the decision tree; it will always make the same decisions given the same inputs.

I am not saying that such code can't work - I am just saying it is not artificial intelligence. An artificial intelligence algorithm - if it were implemented - would actually behave quite poorly at first. The robot would blunder into things, wouldn't be able to get "un-stuck", etc. But over time, it should be able to learn how to avoid obstacles (with only the occasional blunder).

Now - that isn't to say that eventually, it wouldn't "evolve" the same rules that you (as a programmer) could hard code into the system in the beginning. What it might do, though, is come up with a far better set of rules that would work for most cases. Then again, it might not - it might actually evolve a set of rules that are sub-optimal (this is called "getting stuck in a local minima").

I am not sure what it is you are wanting to implement; a simple set of rules for obstacle avoidance, like you have coded (note - I didn't review the code enough to know if your code will actually work as you intend it to) - or if you are wanting a robot to self-learn those rules by blundering around and figuring out the rules itself...
36  Topics / Robotics / Re: artificial intelligence robot. on: July 05, 2014, 06:24:17 pm
What cr0sh puts forward is an expert system: it relies on an algorithm based on how an expert would handle the circumstances. The algorithm is turned into code, and then the device behaves as the expert would have.

No - I am not postulating on an "expert system":

"In artificial intelligence, an expert system is a computer system that emulates the decision-making ability of a human expert. Expert systems are designed to solve complex problems by reasoning about knowledge, represented primarily as if–then rules rather than through conventional procedural code."

Those "if-then" rules are also typically represented in a "fuzzy logic" manner; the output of an expert system is typically given in percentages - that is, when the solution of the expert system is arrived at, via the user answering a series of questions presented by the expert system - the solution will be something like "...with 97.32 percent certainty" - or similar output.

What I was proposing was more akin to a machine learning algorithm - and I was trying to simplify the explanation of the process in such a manner without having to get into some of the more esoteric areas of artificial intelligence research - which I admit that I am not an expert on myself - but I have studied the topic at a hobbyist level, and I also took the following courses and passed them (both were very fun and informative):

BTW - here's an example of self-learning robotic car (namely a neural network) that came out of the ML course (which I originally took when it was presented by Stanford in the Fall of 2011 - the Coursera version of the class came later, but it's the same course):

Anyhow - my point is that what I was trying to describe was an algorithm that attempts to learn which direction to turn best, based on input parameters. Those parameters could be numerous, but imagine a system where the robot "scans" (with an ultrasonic sensor) the area in front of it. It could potentially have multiple obstacles in front of it, at different locations and distances. Now - when it scans, it could build up a "knowledge map" of where things were and how far away they were, then use that information to try to look up in its past knowledge map of what it did in the past, and how successful it was. If it finds something in that map, it could try it out. If it works - then great, update the map to say that it worked again, with a greater probability (my number was "0-10" - 0 being least likely, 10 being most likely; you could easily use a number between 0 and 1 if you would rather work with floating point values, but I was again simplifying things). If it doesn't, lower the probability, then try something else (either re-select out of the knowledge map, or try a random choice of direction, and update the map with that new choice and it's outcome for future tries).

BTW - I am using "knowledge map" here meaning something akin to an array list - not any actual "map" or anything, just to be a bit more clear.

You should be able to see that there isn't any explicit "if this, then turn this way, else turn that way" logic. At first (because the knowledge map is empty) - it's a random choice based on the inputs (what the robot senses); then as the knowledge map is built up, and there exist potential matches (notice I say "potential" - all of this stuff is based on probability matches - not -exact- matches) - those may be tried instead, and depending on how things work out (ie - does the robot get unstuck or does it collide with the object it was trying to avoid?) - the knowledge map is updated (ie - the probability scores for the selected action), etc.

I can't really make it any more clear, only to say it isn't an expert system, it's not a set of rules, and that the program in the computer (controller, mcu, etc) updates it's internal set of states (ie - it's knowledge map of what to potentially try and do based on it's sensor readings) in a continuous fashion as it explores the world. Initially that "map" is empty, but over time it builds it up - hopefully improving as it goes along.
37  Using Arduino / Project Guidance / Re: Best power source for robot on: July 05, 2014, 05:52:56 pm
What is a "usb power block"?

My first thought was that it might be a plug-in power wall-wart for USB 5 volt output; but then I thought about it - and maybe you mean one of those USB re-chargeable battery packs...? Which is it?

If you are planning on using a 7.2 volt power source (which I think might be a smart move, to directly power the four motors), then I would connect an R/C BEC (battery eliminator circuit) that outputs a regulated 5 volts - try to get one that uses a switching regulator design (most efficient).

You could then run the servos and the Arduino from the BEC (be sure to get one that will supply enough amperage for your needs); power the Arduino thru the 5 volt pin (ie - bypass the on-board regulator).
38  Topics / Robotics / Re: artificial intelligence robot. on: July 05, 2014, 01:28:19 am
what is an artificial intelligence robot?  

Well - let's look at a couple of definitions, shall we?

"Artificial intelligence (AI) is the intelligence exhibited by machines or software."

"John McCarthy, who coined the term in 1955, defines it as 'the science and engineering of making intelligent machines'..."

"The central problems (or goals) of AI research include reasoning, knowledge, planning, learning, natural language processing (communication), perception and the ability to move and manipulate objects."

Ok - so basically, for a system to exhibit "artificial intelligence", it needs to be a system which exhibits "intelligence", through the application of "reasoning, knowledge, planning, learning, natural language processing (communication), perception and the ability to move and manipulate objects" - that's the basics. If you system does not do that, it cannot be said to embody "artificial intelligence".

"A robot is a mechanical...agent, usually an electro-mechanical machine that is guided by a computer program or electronic circuitry."

So a robot is a machine, guided by a computer (generally, but not always) running a stored program that controls and guides it.

So - what would be an "artificial intelligence robot"? Well, I would say (mashing up these definitions):

" an electro-mechanical agent, guided by a computer program and/or electronic circuitry which exhibits intelligence via the application of reasoning, knowledge, planning, learning, natural language processing (communication), perception and the ability to move and manipulate objects..."

my friends say that it is a robot which will act according to human interaction, with the knowledge of self programming

Well - not "according to human interaction", but rather "separate or without human interaction" (maybe something got lost in translation, though); in other words, such a robot does not depend upon human interaction (with the exception of turning it on) to be able to navigate, explore, map, understand, interact with, etc - it's environment. In other words, it is an intelligent agent that exists and is aware of it's environment; it doesn't need direction or control from a human to make decisions about how to navigate or otherwise understand that environment. The program which controls the robot keeps track of what it has seen in the past, how it has handled past problems, and/or what the best methods were to solve such problems (such as an obstacle in its way, for instance).

To that end, such a program controlling the robot is "self programming" - it is constantly updating it's understanding of the environment based on the continuous monitoring of sensors versus what it's commands to it's "effectors" were. For instance, if it commands it's arm to move near an object to grab it, it needs to know whether it was successful at grabbing the object, and if not, why - so that next time it tries it will have more knowledge about the situation to try something slightly different (and hopefully be more successful).

now i am making an my first simple obstacle avoiding robot will it be an artificial intelligence robot?

If it just has a simple loop that says "if I sense the object over here, turn in the opposite direction"; then no - that isn't "artificial intelligence".

If instead, you had sensors to detect collisions, and you wrote the code to say "I sense an object in front of me, make a random decision to turn n-degrees in a random amount and continue to drive forward - did I make it? If yes, add that value (plus others - speed, distance to object, etc) to an array, plus a 'success factor' - a number between 0 and 10; the higher the number, the better the success. If not, add that to the array, plus the factor. Next time, look at the array, try something with a high score that matches something close to what you are sensing this time - if it works, increase the value of the factor, if it doesn't, decrease it. If you can't find a match, try another "random" direction selection".

Ok - now that is a lot more complex (and I have probably left some stuff out - but I hope you understand what I am getting at with it) - basically, the system knows nothing about its environment, but over time, by trying random combinations (only after consulting it's "memory" of past successful moves that matched within a certain percentage of the "current" sensing) - it builds up a knowledge base of what and how it most successfully avoided an obstacle.

Something really similar could be done to build up a "map" of the environment the robot is in (this is really complex, by the way - it goes by the acronym of "SLAM" - Simultaneous Localization And Mapping); don't think about trying to implement something like SLAM on an Arduino Uno - while you could implement something extremely simplified, it might also be an exercise in frustration. A better platform for such experimentation (if you wanted to stick with an Arduino, that is) would probably be a Mega2560 with a SRAM expansion board.

if not could you please explain me explain me a bit more about this artificial intelligence robot

I hope the above helps you understand the difference between a robot that is simply programmed by its builder, and one that - while it has a program - is capable of learning about its environment by trial and error, building up a knowledge representation map of these interactions. From there, things can get complicated very quickly.
39  Topics / Robotics / Re: Entry Level Robotics: How to get started on: July 02, 2014, 10:11:36 pm
The car I'm using is one I had as a kid, which is saving me about $30-50 on this project (you can get cheaper ones but finding something of similar size and power of what I have runs in about that range).

The best place to find toy cars to repurpose for a robot chassis tends to be, IMHO, via thrift stores like Goodwill and Savers. You can usually pick one up that is fully operational (but sans the remote control) for about $5.00 - 10.00 USD. Even less on half-off Saturday.

My most expensive find at a Goodwill was an MGA Tarantula vehicle for about $25.00 (sadly, it wasn't half-off day). I've seen full-sized 12 VDC Powerwheels ride-on toys go for around $50.00 (if you need something bigger, and don't mind the challenge of integrating your own steering actuator, plus the hassle and expense of getting new battery(s) and high-power motor controllers).

Another thing I see there - occasionally - are electric wheelchairs and mobility chairs; they typically go for $100.00 - 200.00. But you better have a some friends, a truck, and a good back to get them home. They are anything but lightweight (even with the batteries removed) - oh, and you'll typically have to pony up a couple of hundred more dollars for new batteries to get it running.

Oh - finally, regarding the RC toy cars, I like to point over to this "mega" thread:,86883.0.html
40  Using Arduino / Project Guidance / Re: automotion of auv on: July 02, 2014, 10:04:57 pm
What is an auv?

Personally, I think all of these acronyms have become meaningless. Generally:

ROV = Remote Operated Vehicle -> aka: a "submersible" drone (wth?)
UAV = Unmanned Aerial Vehicle -> aka: an "aerial" drone (ok, that makes sense)
UGV = Unmanned Ground Vehicle -> aka: a "ground-based" drone (or self-driving car-like vehicle)

An "AUV"?

Hmm - so an ROV isn't autonomous, but an AUV is - yet a UAV or a UGV might be one or the other, or a mixture?

Or are they all "ROV's" - and the distinction if they are autonomous is AUV/UAV/UGV?

The truth is, just use whatever term you want - because that is what the commercial and military developers are doing themselves it seems...
41  Using Arduino / Motors, Mechanics, and Power / Re: Mounting Stepper Motors on: June 28, 2014, 12:54:54 pm
Google search for "pan tilt stepper bracket" - take a look at the results and images; for instance, here's a link to a rendering of such a potential system:

Note the use of belts and pulleys for gear-reduction; this will likely be needed by your system because many steppers won't have the power to rotate the mass of the gimbal mounts and camera on their own. Of course, there are other options for gear-reduction; belts and pulleys are just one possibility.

Building your own stepper-motor based pan/tilt mount is not an easy task (compared to one using servos), but can be done by a hobbyist. If you need repeatability in positioning, you will likely also need to incorporate a feedback mechanism into the system (potentiometers or other position sensing devices to monitor the angles). This will of course increase the complexity of the system.
42  Using Arduino / Displays / Re: A question of speeeeeed on: June 28, 2014, 12:48:39 pm
I am using this to draw to a 5 inch screen with my Arduino uno. The problem is that if I want to draw pictures I have to do this one pixel at the time.

Unfortunately, it looks like a -big- chunk of functionality for that driver chip is missing from the Adafruit breakout board for the RA8875 - namely the "Block Transfer Engine (BTE) Function" (see page 123 of the datasheet). It notes that the BTE function is only available with the "Parallel MCU Interface". The Adafruit breakout only brings out the SPI (serial) pins - not the other pins for the parallel interface.

This was likely done on purpose for the Arduino Uno - because it doesn't have enough pins to support it (the data/address bus alone is a 16 bit interface - with all the other pins involved, there wouldn't be enough on the Uno anyhow).

What I would look for would be a better breakout board that brings out all of these pins; alternatively, if you are brave and have a very steady hand, you could solder thin wires to the chip pins that bring out this functionality. Connect them to their own header of some sort, maybe?

Then - for the microcontroller - I would use a Mega; it has enough pins to support the parallel interface easily.

You would, of course, have to write your own custom interface library to drive the pins properly to use the parallel BTE functionality - not a small task, but the datasheet seems to give more than enough documentation to allow you to do this.

I tested this by using a for loop and drawing 1 black pixel at a time, but it takes a LONG time. I didn't time it but I think like 30 seconds.

If you are simply trying to clear the screen, or draw simple shapes (lines, rectangles, circles, triangles, etc) - the SPI (serial) interface and the Adafruit-supplied library should work fine for that; the idea being that you would build up your drawings from these simpler primatives, which are all (seemingly) hardware-accelerated. For instance, a 3D engine could (in theory) be built using only the triangle function for the output (of course, much more is needed to make a fast 3D engine on a system without a real floating-point processor).

However, if you are trying to draw and move sprites or other bit-blitting operations - that isn't supported (according to the documentation) by the SPI (serial) interface - only by the parallel interface, which as mentioned before, has not been broken out by the Adafruit board.

Can anyone recommend a way of increasing the speed of this? I know that the TFT driver is capable of super fast drawing and that it is my end which is slowing things down.

I was thinking of buying the Arduino Due, but not sure if it this would even be up for the task!

Well - I think you can see that I have already recommended what you should do; namely, either find or build a better breakout board and use an Arduino Mega for the controller (so you have enough pins), or modify/hack the existing breakout board to bring those pins out. Likely, the former will be easier (or no more difficult) than the latter, and will result in a better system less prone to failure overall.

Moving to a Due will not likely solve your problems with the speed of the interface; you will still be constrained to the speed of the SPI transfers (which can only happen so fast), and you still won't have access to the BTE blitting engine - which is where things will really shine. If you do buy/build/modify a better breakout board for the RA8875, though - a Due could help immensely with speed (over a Mega) - plus the floating-point performance should be much better as well (if you plan on doing anything 3D related or you need floating-point functionality for other reasons - like moving sprites in a sine-wave fashion or such). Again, with clever programming, fast floating-point can be had using integer math, but it isn't intuitive to implement.

I hope this helps.

On a side note, I found it interesting in the discussion of the parallel interface (page 56) that they have a pin to select between using an 8080 or 6800 series MCU interface. In theory, you could connect this chip to an Altair 8800! I also like the idea of hooking one up to my TRS-80 Color Computer (6809). Likely you could interface this chip to any of the old machines from the 1980s and it would work ok.
43  Using Arduino / General Electronics / Re: Printer Boards on: June 28, 2014, 12:11:07 pm
Its an Okidata B2200 printer, i want to remove the chip line, I cant get it to read the chip.
So if it is possible to remove the chip line, then it will not ask for the chip.

I think something is being lost in translation here - what is a "chip line"?

How about this - you've told us what kind of printer you are trying to use; thank you. Now - tell us what your problem is with the printer. Photos, screenshots of the errors you are seeing, a detailed description/writeup of what you are doing to receive the error(s), what operating system (name, type, version, etc). Also - tell us why/what you want to do with the Arduino in relation to all of this (it could be that the Arduino won't help, or won't be of use, or that there might be another solution to your problem).
44  Using Arduino / General Electronics / Re: Perf board wiring, solid core or stranded? on: June 22, 2014, 03:07:38 pm
seems to work fine in the breadboards.

Ok for perfboarding, but you need to be careful using it with breadboards; the diameter (gauge) Cat5 wire is slightly smaller than what is supposed to be used. As such, it can sometimes get 'stuck' and break off inside the spring clips. It's possible to fix - you have to take the back off the breadboard - but can be a pain.
45  Using Arduino / General Electronics / Re: Perf board wiring, solid core or stranded? on: June 22, 2014, 03:05:19 pm
Wire-wrapping wire works with solder, too!

Oh, I know that - but generally when you do wire-wrapping, you should go "all the way" - even though it is more expensive. It's also mechanically stronger than soldering (better for use where vibration is an issue).

Another option that I forgot to mention - which is easier to get in Europe than the States - is kinda a combo of soldering and wire-wrapping; it has it's own tools and other bits-n-pieces, but it seems kinda neat:
Pages: 1 2 [3] 4 5 ... 376