1 | /*
|
---|
2 | * Firmata is a generic protocol for communicating with microcontrollers
|
---|
3 | * from software on a host computer. It is intended to work with
|
---|
4 | * any host computer software package.
|
---|
5 | *
|
---|
6 | * To download a host software package, please clink on the following link
|
---|
7 | * to open the download page in your default browser.
|
---|
8 | *
|
---|
9 | * http://firmata.org/wiki/Download
|
---|
10 | */
|
---|
11 |
|
---|
12 | /* This firmware supports as many analog ports as possible, all analog inputs,
|
---|
13 | * four PWM outputs, and two with servo support.
|
---|
14 | *
|
---|
15 | * This example code is in the public domain.
|
---|
16 | */
|
---|
17 | #include <Servo.h>
|
---|
18 | #include <Firmata.h>
|
---|
19 |
|
---|
20 | /*==============================================================================
|
---|
21 | * GLOBAL VARIABLES
|
---|
22 | *============================================================================*/
|
---|
23 |
|
---|
24 | /* servos */
|
---|
25 | Servo servo9, servo10; // one instance per pin
|
---|
26 | /* analog inputs */
|
---|
27 | int analogInputsToReport = 0; // bitwise array to store pin reporting
|
---|
28 | int analogPin = 0; // counter for reading analog pins
|
---|
29 | /* timer variables */
|
---|
30 | unsigned long currentMillis; // store the current value from millis()
|
---|
31 | unsigned long previousMillis; // for comparison with currentMillis
|
---|
32 |
|
---|
33 |
|
---|
34 | /*==============================================================================
|
---|
35 | * FUNCTIONS
|
---|
36 | *============================================================================*/
|
---|
37 |
|
---|
38 | void analogWriteCallback(byte pin, int value)
|
---|
39 | {
|
---|
40 | switch (pin) {
|
---|
41 | case 9: servo9.write(value); break;
|
---|
42 | case 10: servo10.write(value); break;
|
---|
43 | case 3:
|
---|
44 | case 5:
|
---|
45 | case 6:
|
---|
46 | case 11: // PWM pins
|
---|
47 | analogWrite(pin, value);
|
---|
48 | break;
|
---|
49 | }
|
---|
50 | }
|
---|
51 | // -----------------------------------------------------------------------------
|
---|
52 | // sets bits in a bit array (int) to toggle the reporting of the analogIns
|
---|
53 | void reportAnalogCallback(byte pin, int value)
|
---|
54 | {
|
---|
55 | if (value == 0) {
|
---|
56 | analogInputsToReport = analogInputsToReport & ~ (1 << pin);
|
---|
57 | }
|
---|
58 | else { // everything but 0 enables reporting of that pin
|
---|
59 | analogInputsToReport = analogInputsToReport | (1 << pin);
|
---|
60 | }
|
---|
61 | // TODO: save status to EEPROM here, if changed
|
---|
62 | }
|
---|
63 |
|
---|
64 | /*==============================================================================
|
---|
65 | * SETUP()
|
---|
66 | *============================================================================*/
|
---|
67 | void setup()
|
---|
68 | {
|
---|
69 | Firmata.setFirmwareVersion(FIRMATA_FIRMWARE_MAJOR_VERSION, FIRMATA_FIRMWARE_MINOR_VERSION);
|
---|
70 | Firmata.attach(ANALOG_MESSAGE, analogWriteCallback);
|
---|
71 | Firmata.attach(REPORT_ANALOG, reportAnalogCallback);
|
---|
72 |
|
---|
73 | servo9.attach(9);
|
---|
74 | servo10.attach(10);
|
---|
75 | Firmata.begin(57600);
|
---|
76 | }
|
---|
77 |
|
---|
78 | /*==============================================================================
|
---|
79 | * LOOP()
|
---|
80 | *============================================================================*/
|
---|
81 | void loop()
|
---|
82 | {
|
---|
83 | while (Firmata.available())
|
---|
84 | Firmata.processInput();
|
---|
85 | currentMillis = millis();
|
---|
86 | if (currentMillis - previousMillis > 20) {
|
---|
87 | previousMillis += 20; // run this every 20ms
|
---|
88 | for (analogPin = 0; analogPin < TOTAL_ANALOG_PINS; analogPin++) {
|
---|
89 | if ( analogInputsToReport & (1 << analogPin) )
|
---|
90 | Firmata.sendAnalog(analogPin, analogRead(analogPin));
|
---|
91 | }
|
---|
92 | }
|
---|
93 | }
|
---|
94 |
|
---|