So true. When you work for cheap, the client can still reasonably justify asking for all sorts of changes (after all, they are _paying_ you), without considering that by giving them a discount you are already essentially doing some of the work for free.
If you want to help out a friend/non-profit and actually have the time to do it, "free" is usually a better option. That said, you still need to keep the scope of what you intend to do for "free" ironclad, otherwise it will probably creep out of control just like any other project.