A few advices for those who would like to create a product...
It has been quite a while since I wanted to write something about my experience in product creation, especially the "what to do(s)" and "what to avoid(s)" for those who would like to do the same things as me.
I'll thus write here some tips and advices that you need to keep in mind at all times when designing your own product. Please read, these tips might save your life at some critical point during the usually complex design process!
First of all, I'm not saying that I know everything there is to know about every little detail in such a long and complex process that is product creation, i'm still an amateur. You'll just read here my methodology and the different tricks I have used in my several projects, that were very useful at several key moments. This blog article is about product development from scratch, where you don't use pre-existing assembled hardware (ie, this is not an arduino article!). Feel free to ignore and comment/criticize the things I will mention here. Thus, I will separate my tips depending on the different stages of a product development :
1st step: Alone or with friends?
Should you work alone or with friends? This question is way more complex than it seems. I learned the hard way that if you are going to work with someone that doesn't have the same situation and way of life as you, you will end up doing his part of the job. If you want to work together with other people, these persons should have the same spare time and responsibilities as you. They should also demonstrate the same motivation, and if you have any doubt at the beginning of this adventure I would advise you to find some compromises. I may sound pessimistic, but you don't want to find yourself submerged by work in the middle of the development stage!
2nd step: Schematics creation
This is the stage where everything is in the balance. If you don't have a firm grasp of all the aspects of your future product, you will design something inadequate to your future needs. Ideally, this shouldn't be a one man step as you will always forget the very small detail that will cause you some problems in the future. But if you are alone, you should spend at least a couple of days listing every need before even looking for the components you will use. Remember that you have to lose some time to gain a lot more later. Don't hesitate to talk about your project to close friends around you, they will always make you think of some aspect that you had forgotten until then.
- every functionality that your product must have
- the corresponding components you should use for these
- the corresponding interfaces, voltage levels, speeds, types of buses
- the inputs/outputs you want
- the possible upgrades you would like to do later if your product encounters some success
Then spend a couple of hours/days finding the microcontroller that would fit with everything you listed. If you need true parallelism, you may opt for a FPGA. For signal processing, DSPs or DSPics and for common applications PICs/ATMEGAs/ARMs/.... This step is quite tricky, as you will certainly have to read through the micro-controller's whole datasheet to be sure that everything will work together. This step shouldn't be skipped, as there are mistakes that could easily be made, such as:
- neglecting to check if your peripheral & uC can work at the same bus speed
- neglecting the details of your peripheral & uC common buses (for example, 'SPI bus' has a lot of different implementations!)
- impossible peripheral initialization due to the startup process of each component...
Use the KISS strategy: keep it simple stupid. Your schematics should be made in such a way that every functionality use simple components in a smart way. No need to over size everything. Try to get your hands on schematics of already existing developments boards that use the same components as you. If the product you want to develop is a bit too complex for you, you might want to start working on these development boards before making your own. Always know the limitations of your design to be sure that it will exactly do what you want it to do. As you would have guessed by now, you will have a lot of reading to do. Patience is off the essence! You should also care about the ways to program your microcontroller and the corresponding development environment. Thus, you will need to check what are the pins used by the JTAG/ISP, what voltage the programmer uses, the possibility to do debugging and the implications for the components connected to the JTAG/ISP lines. And of course, double/triple check everything you do, if possible the day after you do it (sleep will help you a lot).
A simple led connected to one of your uC pins will be your best friend. It may seem dumb, but a lot of error checking can be done with this simple diode, especially when you program for the first time your uC. Chose components that are very well documented, easily available on the internet, and perform a little google search (component problem) to see what you could expect in the future. While doing it, write your Bill of Materials and store all your components datasheets in a same folder. The more methodical you are, the easier it will be to get back in your development after a break. A USB connection with a simple FTDI chip can always be handful for home made debugging and test procedures. Don't forget decoupling capacitors for every component of your circuit and remember that every chip may add power perturbations in your system, especially when working with analog circuits.
3rd step: Idiot-proofing your schematics
You shouldn't have too much hope in your user/customer. If he had some notions in electronics, he would be helping you! You should protect every input of your system with diodes, think of all the possible things that could be done to your system. You want your system to be as robust as possible. Users may inflict physical damage to your PCB (thus opt for 1.6mm width), and may also inflict static charges to its components when touching your board. If possible, put your PCB in a protective box and if this box is made of metal, you will benefit from the Faraday cage effect. Ideally, your system should also be coffee proof ;).
4th step: PCB creation
There are plenty of software on the internet to create PCBs such as Eagle and Kicad (for the free ones) or Allegro and Altium (for the expensive ones). Eagle is a really powerful tool to make a 2 or 4 layers PCB, and you will find plenty of documentation, tutorial and forums that will help you along the process. PCB creation is an art itself, but as a general rule for a 2 layers PCB, you will want to put all your signal traces on the top layer and a large ground plane on the bottom. For complex PCBs, you should contact your manufacturer beforehand in order to know what his tolerances and minimum widths are. I have a personal preference for 0,4mm traces and 0805/0603 SMT components for hand soldering. Your design should be as compact as possible and your traces as large as possible (but not too much in order to avoid capacitive effects). Don't hesitate to modify your schematics in order to ease the routing stage, pin swapping can be very convenient in such cases. Don't only route every net, but try to see what this net is for and thus route it accordingly. If it is a 20Mhz clock line, try to keep the trace as short as possible and take care of the nearby lines. I don't go into too much details here, but feel free to ask any information you may need! Once your PCB routed, it should look "simple and beautiful" and not "complex and like a maze".
5th step: Soldering your prototype
Before going into production, your first prototypes will be hand soldered. Use a lot of patience, a pair of twizzers, a solder iron at 330 degrees with a 0.5mm tip for SMT components. Proceed with care and double check everything you do, as you may later think that the error you might have could be due to a firmware problem and not to a bad solder.
6th step: The first steps in firmware creation
When your first board is assembled, create a simple firmware that will do some basic communication with all your external components. This way you will be sure that your schematics design is ok, allowing one of your colleagues to proceed with the production procedure (with care, as you might still find some other problems later). Also check that the micro-controller speed is what it is supposed to be.
Once you are sure that every component can talk to each other, you will then begin the firmware development stage. It is said that programming style is the reflect of someone's mind. Here too, be as methodical as possible, put each functionality related code into a separate file and document every function you write (doxygen is a nice tool for this). KISS strategy should be used as much as possible to produce smart and efficient code. Remember that, when using libraries, you will never be sure of the optimality and speed of the code used, and that you are never better served than by yourself (well, in most cases...). Here too, spend some time without writing any code in order to think about your firmware architecture. Normally this is not a one man's job as software architect & software programmer (aka chinese programmer) are two very different jobs. Adding a bootloader to your firmware is a must, there will always be other functionalities that your customer will want later down the road... For my AVR projects, I use this bootloader made by Dr Erik Lins. It will allow you to reprogram your AVR though RS232 communication (and USB if you are using a FTDI chip), and can be protected by password.
7th step: Extended firmware testing
You may be the best programmer in the world, but I am pretty sure that you will not produce a bug free firmware, especially when creating thousands of lines of code!
This is thus the part where you should try finding people willing to spend (a lot of) time testing your product before releasing it to the market. Ideally, these people should come to you, denoting an already existing motivation from their side. They should (of course) be people that you can trust, have good availabilities, patience, some notions in electronics in order to facilitate the numerous firmware update procedures that you will have to do. That is the reason why I was recommending you to implement a bootloader on your product.
Remember that it is very likely that features suggested by your beta testers will be the ones that other customers will enjoy the most. I can't emphasize enough the fact that you will never have the same vision on your product's domain that people actually working/living in it. Having an active community behind your product is something very beneficial for you and for them; and will open possibilities for you to create other products' creations. A very good friend of mine always says "it is not about what you know, it is about you know".
8th step: PCB manufacturing
This is also quite a complex step, but here are a few advices I can give you:
- ask your manufacturer for serial numbering
- create a functional test and a testing bench for your product, send it to your manufacturer
- write down the firmware version, compiling date of the firmware used by the manufacturer
This step will challenge your innovative spirit, as you will have to create a testing procedure as simple and thorough as possible. At this point you will have to be sure that the work you have been doing until then is complete and perfect. Send to your manufacturer as much explainations as possible, the gerber files, Bill of Material, and some pictures of the prototype board if possible.
9th step: Business is business...
Now that you have a fully functional product, it is time to market it. As this is a whole domain itself, I'll forward you to this very nice article on ponoko where you will find the "10 rules for maker businesses". It will teach you some basics about business related to this kind of projects!
Yes, product creation is a very mind-occupier process. But it is also a very interesting experience! You will learn a lot of things along the way, and make a lot of interesting contacts. It enables you to care about every aspect of a single problem, consider every possible case and be responsible of all the choices you make!