Controlling an Arduino with Perl
Outline
- Quick intros on Arduino
- Quick intros on Firmata
- Quick intros on Demo Perl Library
- Practical Example - Specifications Parsing
What's an Arduino?
- Hobbyist's Microcontroller Development Platform
- Both Hardware and Software
Arduino's Hardware (One example!):
One part uC...
Arduino's Software:
Another part IDE...
Quick Arduino Example (Blink):
void setup() { pinMode(13, OUTPUT); // LED is connected to pin 13 } void loop() { digitalWrite(13, HIGH); // set the LED on delay(1000); // wait for a second digitalWrite(13, LOW); // set the LED off delay(1000); // wait for a second }
Why's Arduino Cool?
- Easy
- Mindshare
- Support and Accessibility
Firmata:
http://www.firmata.org
"Firmata is a generic protocol for communicating with microcontrollers from software on a host computer. It is intended to work with any host computer software package."
In pragmatic terms...
System to control Arduino I/O pins from a computer.
Control Example
How does it work?
- Arduino runs host code
- Computer runs client code
- Serial communication
Serial Communication Protocol
- MIDI usually used for electronic instruments
- Redefine MIDI messages for I/O
MIDI for Firmata
- 8-bit protocol
-
Top bit indicates data or command
c/d 0 0 0 0 0 0 0 0 - Variable packet length
- Has interruptible data-stream mode
Example Firmata Protocol
- Digital Pin 11 On
HEX c CMD PORT 0x91 1 0 0 1 0 0 0 1 0x04 0 0 0 0 0 1 0 0 0x00 0 0 0 0 0 0 0 0 - v2.1 Protocol
Example: Blink
use Device::Firmata; use Device::Firmata::Constants qw/:all/; my $device = Device::Firmata->open('/dev/ttyUSB0'); $device->pin_mode(13=>PIN_OUTPUT); while (1) { $device->digital_write(13=>1); sleep(1); $device->digital_write(13=>0); sleep(1); }
Non-demonstrated Features
- Digital Input - $device->digital_read($pin)
- Analog Input - $device->analog_read($pin)
- PWM! - $device->analog_write($pin)
Example: Interface Exploration
Sure Electronics: Red LED Matrix Board
- 32x8 matrix
- Driver IC: HT1632
- Specifications...
HT1632 Specifications
Ugh.
Prototyping the Interface
- Avoid save, compile, upload, reset, disappointment cycle!
SO:
- Use Firmata to link Arduino and Perl
- Write signal implementation in Perl
Connection Diagram
Connection Diagram
Logic Timings
Game Plan
- 1. Strobe CS pin
- 2. Clock data in
- ???
- 4.
Profit!Display cool things!
Pin Strobe Code
# $pin = pin connected CS # $PULSE_LEN = 0.001s $device->digital_write($pin=>1); select undef, undef, undef, $PULSE_LEN; $device->digital_write($pin=>0); select undef, undef, undef, $PULSE_LEN;
Data Writing
# $data_pin = connected DATA line # $wr_pin = connected to WR line # $PULSE_LEN = 0.001s $device->digital_write($data_pin=>$v); $device->digital_write($wr_pin=>1); select undef, undef, undef, $PULSE_LEN; $device->digital_write($wr_pin=>0); select undef, undef, undef, $PULSE_LEN;
Applied Example
- Full detail of code not discussed.
- Can draw lines!
- Can draw graphs!
- Can draw words!
Prototyping!!!
- Bandwidth limitations
- MIDI interpreter limitations
- Computer controlled microcontroller?!
Summary
- Arduino = Cool Prototyping Platform
- Firmata = Cool Protocol to control Arduino
- Perl = RAD tool to script interactions with the real world
http://bako.ca/pm/firmata
??