Apologies for the low quality photo – just wanted to share some progress with the Pact scoreboard over the last few weeks. The PCBs are mostly assembled, the board itself is mostly ready. Next up: buttons and Arduino firmware!
The courier showed up today, with a really neat new board from Adafruit – the Feather M0 Express. It is essentially a break out board for the Microchip (formerly Atmel) ATSAMD21G18, which is the same ARM M0+ micro used in the Arduino Zero, plus a 2MB flash memory, RGB LED, and a LiPoly charger. It’s not too expensive at $20USD, nice and tiny, and I think could be a real hit.
Using the Feather M0 Express from Arduino IDE almost couldn’t be easier – just add the Adafruit Board Manager URL to your Arduino IDE settings, then install the “Adafruit SAMD Boards” – instructions at https://learn.adafruit.com/add-boards-arduino-v164 .
We’ve been doing a bit of work on the maker space lately, and this website too!
For the last several years, our website has been hosted on a VPS provided by Blair (thanks so much!) Now that we’ve got a reliable Internet connection at the makerspace though, we’re able to host the site from an on-site computer that’s already hosting the Valley Workspace, Dunedin Electric Bikes, and Quarantine Island sites, and some makerspace affiliated projects like Dunedin food truck tracker foodoo.nz. If you’re interested in how the Internet works, want to host a site, or have fun ideas for things to connect to the machine, just say the word!
As part of the website move, I’ve upgraded the WordPress install, and am planning to embark on a clean out of the Users (we’ve apparently got ~45k) and Comments databases. I’ll try to keep from deleting legitimate accounts, but if your dspace account disappears, just let me know and I can restore it.
Finally, some donated lights were installed last weekend, in the room adjoining the bike workshop, to light up that web server!
This post is somewhere between a guide and a collection of notes, aimed at debugging programs for AVR microcontrollers (like the ones in most Arduinos) “on target”. We’ll be using an AVR Dragon connected to the target micro via the normal 6-pin programming header, with a Mac or Linux PC as the host.
Although this is a bit more advanced than most of our other projects, it’s really quite approachable and is a very powerful technique for fixing AVR software problems.
From a high level; we’ll use a debugging program on a Mac (or Linux, Windows, etc) “host” computer, which communicates with a Dragon “In Circuit Emulator” (ICE) via USB to debug a buggy program running on the “target” AVR, which is presumably running in some circuit we’re interested in. Small variations might apply for Windows hosts, using JTAG instead of DebugWIRE, other debugger tools (Atmel JTAGICE mkII for example), etc.
This evening, I finally got around to unwrapping the Arduino clone that came with my DSpace membership. Starting a project for the board couldn’t be easier, using the nice Arduino IDE from https://www.arduino.cc, but I ran into a little snag when it was time to upload the program onto the board. It turns out that these clone Arduinos use a newish low-cost USB to serial converter chip called a CH340G, rather than the FTDI brand chips used in the genuine Arduino boards. The CH340G that isn’t supported by MacOS by default, and I use MacOS, so the board didn’t show up in the Arduino application’s list of serial ports…
Fortunately, other folks have run into the same problem and have written up some nice blog posts on how to solve exactly this issue!
OpenWRT: thats an odd name…
The story starts late 2002 when Linksys released a wireless router called the WRT54G.
Andrew Miklas noticed (from the visible names used in the internal filesystem, amongst other things) that it was using Linux, without in any way acknowledging this or making the source available. They had obvioulsy modified Linux to get it to run on their hardware. This is a violation of the Linux license, the GPL. He tried contacting Linksys who weren’t immediately co-operative, so he posted to the Linux Kernel mailing list and Linksys came under considerable pressure to release their source. Linksys then released the source, and people started rebuilding and fiddling with it. They actually had started patching the binary firmware before Linksys did this.
A number of different projects appeared, one was OpenWRT which is first named as such in Jan 2004. So its 7-8 years old.
So what is it?
In hardware terms, OpenWRT systems are designed as Internet routers. They fall into the space between something like an Arduino (8/16 bit CPUs, battery powered, no or minimal OS) and a mini-ITX PC (32-bit CPU, 100W+ power supply). Or a netbook. They run on a plugpack/wall wart, have 4-8M of flash, 8-32M of RAM, and a ~200MHz 32-bit CPU. Can run on battery, but you need a big one and it won’t last very long. Just enough hardware to do a serious Internet connection, and they always have the hardware for that.
So what is it?
In software terms, OpenWRT is a very versatile system for making embedded Linux devices that can fit in 4-8Mbytes of flash. They are not confined to Linksys routers (although a descendant of the WRT54G that will run OpenWRT, the WRT54GL is still available today in NZ for $130). OpenWRT now runs on a *lot* of wireless routers. A list can be found at http://wiki.openwrt.org/toh/start.
Embedded Linux means not using standard gcc libraries. OpenWRT uses a much smaller library called ucLibC. It also means not including anything you don’t need. So OpenWRT has a very extensive set of customisation options. Its filesystem is somewhat eccentric (as it has to be to run out of a small amount of flash). The kernel is compressed (twice) and written to raw flash, the rest goes into a combination of squashfs (read-only) and jffs2 (read-write). The result is a system that they were able to fit into 2Mbyte of flash but now usually needs 4Mbyte.
OpenWRT has a package managment system; almost everything is an opkg. If you don’t use it, you can leave it out to save space.
None of this is terribly unusual for a embedded Linux distribution, but OpenWRT takes things a bit further in the way it does it. Instead of distributing a kernel and libraries for all the different CPUs and options that they support, they don’t distribute source at all. OpenWRT is a set of patches and scripts that build OpenWRT binaries, a system called Buildroot.
You can use OpenWRT in a number of ways; they provide prebuilt binaries, an ImageBuilder tool, and the ability to build a custom binary. I adopted the latter because I wanted to make a remote camera system that could be used by others; I was able to use OpenWRT to make a turnkey binary that could be easily installed and used by anyone with an NSLU2 and a UVC camera.
See http://wiki.openwrt.org/doc/start for an entrypoint into the OpenWRT documentation
OpenWRT is a bleeding-edge open-source project. Documentation can be out of date or missing, things don’t always work, and you need to be prepared to use Google to search for answers. If you really can’t find answers and have a focused question there are mailing lists and forums where you should be able to get answers, but they don’t like being used as a substitute for doing your own research. OpenWRT does not run on all hardware, you need to research before buying.
Can be used as
A pretty amazing wireless router; QoS, custom hotspot, OpenVPN. Web server.
Units with USB ports open up a huge range of other possibilities: file server, music player, camera server, print server, GPS, etc.
What I did
I built OpenWRT (kamikaze) for a device called an NSLU2, which was nominally a NAS device. It wasn’t a great NAS device, but OpenWRT got ported to it and then it could do all manner of things. It has two USB ports. I bought a good quality webcam and set up OpenWRT with a package called mjpg_streamer, which takes Linux video in and feeds it out to a web page or to a file. Got it to write periodically to a file on a USB flash drive; this produced time-lapse movies. The objective was to set it up at a remote crib where we have no electricity.
The second stage was to get it to shut down to reduce power consumption; I had to patch the Linux driver for the RTC chip and do a one-wire hardware mod to get a device that could turn its own power off, and get it turned back on some time later. I submitted patches back to the Linux rtc mailing list and in due course they were blessed by Linus and went into the kernel.
See my blog posts at http://johnarthur.wordpress.com/2008/03/25/a-high-resolution-ip-webcam/ and subsequently for more details.
We had a smaller turn out this time (around a dozen), thanks to school holidays and the Easter break. But everyone there got actively involved and asked a lot of great questions. Many thanks to Anne (who helped set up) and Paul (who typed for me) who helped me get through the night with a broken wrist.
The rest of the talk was learn-by-example and learn-by-doing. We built a web page that provided a simple to-do list webapp.
The code is listed below in the resources. Note that to view the code in your browser for these examples (or any webpage), right click on the page and select “View Page Source”. Or you can just save the page and open it in your favourite text editor.
As usual, there was a lot covered in this talk. And some of the code in the printed handouts (the new stuff in step 4) wasn’t covered, but leads on from what I did cover.
Resources from this talk:
The rest of the talk was learn-by-example and learn-by-doing. I walked everyone through using Mozilla’s Add-on Builder – a webapp that lets you easily code and test Firefox add-ons using the new Add-ons SDK.
We built two add-ons:
- Wikipedia Button – An extremely simple add-on that adds a button to the bar at the bottom of your browser, with the Wikipedia logo. Clicking it will open Wikipedia in a new tab.
- Translate Selection – A less-simple add-on that adds a “Translate Selection” item to your context menu (right-click menu). When you select some text, right click, and select “Translate Selection”, the text you selected will be translated into English (using Google’s translation service).