# I understand Arduino: now what?

Alright, I've played around enough with Arduino that I feel pretty comfortable with it. Anything done now is more learning the electronics than it is the Arduino side of it.

What's the next step for my learning? Arduino is a combined programmer / controller, so presumably I need to break that link and start working with a controller chip separate from the controller, I guess? Can somebody point me in the right direction?

-
Do you have a particular goal or project in mind? –  tronixstuff Sep 7 '10 at 14:57
I agree. To me this is all about getting specific things done. Arduino is just a tool like anything else. –  Dirk Sep 7 '10 at 15:57
What I'm working on right now is a multiplexed LED array. Not that difficult in Arduino, but I want to get rid of the training wheels. I mean, ultimately, there's an ATmega168 chip on the Arduino board. If I could figure out how to work with it directly, I think that would satisfy what I'm trying to achieve. –  Chris B. Behrens Sep 7 '10 at 21:17
You're actually pretty direct to the chip with the Arduino. It doesn't have that many drivers or anything attached to the pins. The headers go directly there. Perhaps a breadboarduino? –  AngryEE Sep 8 '10 at 15:13
@angryee - I think Chris means, program the ATmega chip directly, without the Arduino IDE + libraries, which could be seen as training wheels. –  J. Polfer Sep 11 '10 at 22:06
show 1 more comment

Learn I2C, SPI, 1wire and try to interface sensors with such interfaces. Read a lot of datasheets of such sensors and try to understand everything in them. Ask questions when stuck. Learn MODBUS (RTU/ASCII/TCP) or similar protocol that can open your device to the world once you embed it in the device. Learn general electronics and try to interface relays, triacs, what is pull up and pull down, what is sourcing and sinking, how to draw schematics and connect basic drivers to your MCU.

-

As a start, you may want to move from Arduino as platform to AVR as platform. Ie, learn how to program/use a virgin AVR microcontroller for your projects instead of the Arduino. That way, you won't have to buy another Arduino board for each project you do, or for doing projects with friends. This is a fairly simple step (an Arduino is just a conventional Atmel AVR microcontroller but with a special board and bootloader), but its a big one for selling/giving projects to friends. The toolchain is similar too: you use avr-gcc or avr-g++ with make in conjunction with a programming utility to install your program.

-
It is pretty simple to load the bootloader on a chip and solder up your own board if you want to give away a project. Or order a RBBB kit for $12.50(goo.gl/0yqr) no need to buy a$30+ board for each Arduino project. –  Davorak Oct 13 '10 at 17:43

I agree with Joby - Arduino is great but I always feel stifled by the framework they surround me with. I'd move on to use straight C on your Arduino and build a lot of the library functionality they provided from scratch. I generally prefer depth before breadth - don't just start on another microcontroller family by using more provided frameworks. Learn a bit more about how to implement some of these functions yourself.

Start with a working program and replace the Arduino library calls with your own versions one function at a time. You'll learn a lot about the control registers, timing, bit operations, etc if you havent' already. Read the ATMega328 datasheet in depth - everything you need is in there.

Try a different IDE like AVR Studio or Code::Blocks. Learn the GCC toolchain. Try more advanced coding techniques - unit tests, coverage, profiling, lint/splint checking. Put an RTOS on the Arduino.

A combined programmer/controller isn't a sign of weakness - it's just a design choice. The only 'weakness' that could come from it is the lack of in-circuit debugging. Buy an AVR Dragon and you'll have that licked for \$50.

-

I think what to learn next depends on what you want to do that the Arduino can't do. That is, I can't see much point in programming a similar chip to do the same things, but with more difficult means.

Here are some Arduino weaknesses:

• Threading, meaning running two sections of code interleaved so that it seems like they're being executed at the same time
• Medium or high-bandwidth internet stuff, like streaming audio
• Serious computation, or tasks that require fast computation for fast response
• Anything that's made easier by having a filesystem around, like datalogging or dealing with images

I can imagine two directions to go:

1. More powerful embedded boards with small operating systems, like the Beagleboard or Gumstix
2. Squeezing more performance out of small Atmega chips using hardware interrupts.

I can add more detail if you comment about which direction is more appealing. (The second one is definitely cheaper.)

-
It's funny...programming a similar chip to do the same things, but with more difficult means is exactly what I have in mind :). A little background - I'm a software architect with many years of experience. The software, the computation, file system...that's all the easy stuff for me. What I really need to bang my head against is the electronics. The reason why I'm looking to move beyond Arduino is simply that I want to be able to produce single purpose devices that don't have the physical (and price) overhead of an Arduino board. I think from what you've said, #2 is what I'm looking for. –  Chris B. Behrens Sep 7 '10 at 20:02
Wow...that comment sounded really egotistical. I didn't mean it that way...anyhow, I just meant that I want to get rid of the hardware training wheels that Arduino gives me. In particular, I'm working on an LED array, similar to the LOLShield, though I think I'm going to multiplex it instead. I can do it with Arduino, but without it, I need some direction. TIA. –  Chris B. Behrens Sep 7 '10 at 20:29
Ah, more electronic-y things instead of software-y... stuff. Maybe you'd get some nice experience doing sensor interfacing/datalogging. It's not glamorous but to interface the sensors to your board you'd need to learn a few more things about hardware. The Arduino doesn't really have that many hardware training wheels - certainly not as many as software. Maybe a robot that incorporates several different types of sensors - ultrasounds, IR distance, shaft encoder, etc. Certainly possible just with the Arduino and lots more hardware. –  AngryEE Sep 8 '10 at 15:12