diff options
Diffstat (limited to 'Pd_firmware/Pd_firmware.pde')
-rw-r--r-- | Pd_firmware/Pd_firmware.pde | 202 |
1 files changed, 110 insertions, 92 deletions
diff --git a/Pd_firmware/Pd_firmware.pde b/Pd_firmware/Pd_firmware.pde index 8a2de1d..ed4b1e0 100644 --- a/Pd_firmware/Pd_firmware.pde +++ b/Pd_firmware/Pd_firmware.pde @@ -1,24 +1,45 @@ -/* Arduino firmware aka Firmata - * ------------------ +/* Copyright (C) 2006 Hans-Christoph Steiner + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA + * + * ----------------------------- + * Firmata, the Arduino firmware + * ----------------------------- * - * It was designed to work with the Pd object [arduino] - * which is included in Pd-extended. This firmware could - * easily be used with other programs like Max/MSP, Processing, - * or whatever can do serial communications. + * Firmata turns the Arduino into a Plug-n-Play sensorbox, servo + * controller, and/or PWM motor/lamp controller. * - * (copyleft) 2006 Hans-Christoph Steiner <hans@at.or.at> - * @author: Hans-Christoph Steiner + * It was originally designed to work with the Pd object [arduino] + * which is included in Pd-extended. This firmware is intended to + * work with any host computer software package. It can easily be + * used with other programs like Max/MSP, Processing, or whatever can + * do serial communications. + * + * @authors: Hans-Christoph Steiner <hans@at.or.at> and Jamie Allen <jamie@heavyside.net> * @date: 2006-05-19 - * @location: STEIM, Amsterdam, Netherlands + * @location: STEIM, Amsterdam, Netherlands and New York, NY + * */ -/* TODO - * - * - get digitalInput working - * - add pulseIn functionality - * - add software PWM for servos, etc - * - redesign protocol to accomodate boards with more I/Os - * - add cycle markers to mark start of analog, digital, pulseIn, and PWM +/* + * TODO: get digitalInput working + * TODO: add pulseIn functionality + * TODO: add software PWM for servos, etc (servo.h or pulse.h) + * TODO: redesign protocol to accomodate boards with more I/Os + * TODO: add cycle markers to mark start of analog, digital, pulseIn, and PWM */ /* firmata protocol @@ -29,7 +50,7 @@ /* computer->Arduino commands * -------------------- */ - /* 128-129 // UNUSED */ +/* 128-129 // UNUSED */ #define SET_PIN_ZERO_TO_IN 130 // set digital pin 0 to INPUT #define SET_PIN_ONE_TO_IN 131 // set digital pin 1 to INPUT #define SET_PIN_TWO_TO_IN 132 // set digital pin 2 to INPUT @@ -89,11 +110,11 @@ * 2 digitalOut 7-13 bitmask */ - /* two byte software PWM data format +/* two byte PWM data format * ---------------------- - * 0 get ready for digital input bytes (250/251) + * 0 get ready for digital input bytes (ENABLE_SOFTWARE_PWM/ENABLE_PWM) * 1 pin # - * 2 pulse width + * 2 duty cycle expressed as 1 byte (255 = 100%) */ @@ -116,12 +137,6 @@ * 14 analog input pin 11 from Arduino // byte 14 */ -/* - * CAUTION!! Be careful with the Serial Monitor, it could freeze - * your computer with this firmware running! It outputs data - * without a delay() so its very fast. - */ - #define TOTAL_DIGITAL_PINS 14 // for comparing along with INPUT and OUTPUT @@ -180,8 +195,8 @@ void transmitDigitalInput(byte startPin) { else { digitalData = digitalRead(digitalPin); } -/* the next line probably needs to be re-thought (i.e. it might not work...) since my - first attempt was miserably wrong. <hans@at.or.at> */ + /* the next line probably needs to be re-thought (i.e. it might not work...) since my + first attempt was miserably wrong. <hans@at.or.at> */ transmitByte = transmitByte + ((2^i)*digitalData); } printByte(transmitByte); @@ -219,20 +234,20 @@ void setPinMode(int pin, int mode) { } void setSoftPwm (int pin, byte pulsePeriod) { - byte i; -/* for(i=0; i<7; ++i) { + byte i; + /* for(i=0; i<7; ++i) { mask = 1 << i; if(digitalPinStatus & mask) { - digitalWrite(i, inputData & mask); + digitalWrite(i, inputData & mask); } - } - */ - //read timer type thing - - //loop through each pin, turn them on if selected - //softwarePWMStatus - //check timer type thing against pulsePeriods for each pin - //throw pin low if expired + } + */ + //read timer type thing + + //loop through each pin, turn them on if selected + //softwarePWMStatus + //check timer type thing against pulsePeriods for each pin + //throw pin low if expired } void setSoftPwmFreq(byte freq) { @@ -240,13 +255,13 @@ void setSoftPwmFreq(byte freq) { void disSoftPwm(int pin) { - //throw pin low + //throw pin low } -// ------------------------------------------------------------------------- -/* this function checks to see if there is data waiting on the serial port +/* ------------------------------------------------------------------------- + * this function checks to see if there is data waiting on the serial port * then processes all of the stored data */ void checkForInput() { @@ -257,7 +272,10 @@ void checkForInput() { } } -// ------------------------------------------------------------------------- +/* ------------------------------------------------------------------------- + * processInput() is called whenever a byte is available on the + * Arduino's serial port. This is where the commands are handled. + */ void processInput(byte inputData) { int i; int mask; @@ -273,19 +291,19 @@ void processInput(byte inputData) { switch(executeMultiByteCommand) { case ENABLE_PWM: case DISABLE_PWM: - //PWM 0 on the board is PIN 9 - analogWrite(storedInputData[0] + 9, storedInputData[1]); - break; + //PWM 0 on the board is PIN 9 + analogWrite(storedInputData[0] + 9, storedInputData[1]); + break; case ENABLE_SOFTWARE_PWM: - setPinMode(storedInputData[0],SOFTPWM); - setSoftPwm(storedInputData[0], storedInputData[1]); - break; + setPinMode(storedInputData[0],SOFTPWM); + setSoftPwm(storedInputData[0], storedInputData[1]); + break; case DISABLE_SOFTWARE_PWM: - disSoftPwm(storedInputData[0]); - break; + disSoftPwm(storedInputData[0]); + break; case SET_SOFTWARE_PWM_FREQ: - setSoftPwmFreq(storedInputData[0]); - break; + setSoftPwmFreq(storedInputData[0]); + break; } executeMultiByteCommand = 0; } @@ -313,7 +331,7 @@ void processInput(byte inputData) { } else { switch (inputData) { - case SET_PIN_ZERO_TO_IN: + case SET_PIN_ZERO_TO_IN: // set digital pins to INPUT case SET_PIN_ONE_TO_IN: case SET_PIN_TWO_TO_IN: case SET_PIN_THREE_TO_IN: @@ -327,9 +345,9 @@ void processInput(byte inputData) { case SET_PIN_ELEVEN_TO_IN: case SET_PIN_TWELVE_TO_IN: case SET_PIN_THIRTEEN_TO_IN: - setPinMode(inputData - SET_PIN_ZERO_TO_IN, INPUT); - break; - case SET_PIN_ZERO_TO_OUT: + setPinMode(inputData - SET_PIN_ZERO_TO_IN, INPUT); + break; + case SET_PIN_ZERO_TO_OUT: // set digital pins to OUTPUT case SET_PIN_ONE_TO_OUT: case SET_PIN_TWO_TO_OUT: case SET_PIN_THREE_TO_OUT: @@ -343,45 +361,45 @@ void processInput(byte inputData) { case SET_PIN_ELEVEN_TO_OUT: case SET_PIN_TWELVE_TO_OUT: case SET_PIN_THIRTEEN_TO_OUT: - setPinMode(inputData - SET_PIN_ZERO_TO_OUT, OUTPUT); - break; - case DISABLE_DIGITAL_INPUTS: // all digital inputs off - digitalInputsEnabled = false; - break; - case ENABLE_DIGITAL_INPUTS: // all digital inputs on - digitalInputsEnabled = true; - break; - case DISABLE_ALL_ANALOG_INS: // analog input off - case ENABLE_ONE_ANALOG_IN: // analog 0 on - case ENABLE_TWO_ANALOG_INS: // analog 0,1 on - case ENABLE_THREE_ANALOG_INS: // analog 0-2 on - case ENABLE_FOUR_ANALOG_INS: // analog 0-3 on - case ENABLE_FIVE_ANALOG_INS: // analog 0-4 on - case ENABLE_SIX_ANALOG_INS: // analog 0-5 on - analogInputsEnabled = inputData - DISABLE_ALL_ANALOG_INS; - break; + setPinMode(inputData - SET_PIN_ZERO_TO_OUT, OUTPUT); + break; + case DISABLE_DIGITAL_INPUTS: // all digital inputs off + digitalInputsEnabled = false; + break; + case ENABLE_DIGITAL_INPUTS: // all digital inputs on + digitalInputsEnabled = true; + break; + case DISABLE_ALL_ANALOG_INS: // analog input off + case ENABLE_ONE_ANALOG_IN: // analog 0 on + case ENABLE_TWO_ANALOG_INS: // analog 0,1 on + case ENABLE_THREE_ANALOG_INS: // analog 0-2 on + case ENABLE_FOUR_ANALOG_INS: // analog 0-3 on + case ENABLE_FIVE_ANALOG_INS: // analog 0-4 on + case ENABLE_SIX_ANALOG_INS: // analog 0-5 on + analogInputsEnabled = inputData - DISABLE_ALL_ANALOG_INS; + break; case ENABLE_PWM: - waitForData = 2; // (pin#, dutyCycle) - executeMultiByteCommand = inputData; - break; + waitForData = 2; // 2 bytes needed (pin#, dutyCycle) + executeMultiByteCommand = inputData; + break; case DISABLE_PWM: - waitForData = 1; // pin# - executeMultiByteCommand = inputData; - break; + waitForData = 1; // 1 byte needed (pin#) + executeMultiByteCommand = inputData; + break; case SET_SOFTWARE_PWM_FREQ: - waitForData = 1; // pin# - executeMultiByteCommand = inputData; - break; + waitForData = 1; // 1 byte needed (pin#) + executeMultiByteCommand = inputData; + break; case ENABLE_SOFTWARE_PWM: - waitForData = 2; // (pin#, dutyCycle) - executeMultiByteCommand = inputData; - break; + waitForData = 2; // 2 bytes needed (pin#, dutyCycle) + executeMultiByteCommand = inputData; + break; case DISABLE_SOFTWARE_PWM: - waitForData = 1; // pin# - executeMultiByteCommand = inputData; - break; - case OUTPUT_TO_DIGITAL_PINS: // bytes to send to digital outputs - firstInputByte = true; + waitForData = 1; // 1 byte needed (pin#) + executeMultiByteCommand = inputData; + break; + case OUTPUT_TO_DIGITAL_PINS: // bytes to send to digital outputs + firstInputByte = true; break; } } @@ -423,7 +441,7 @@ void loop() { for(analogPin=0; analogPin<analogInputsEnabled; ++analogPin) { analogData = analogRead(analogPin); // these two bytes get converted back into the whole number in Pd - // the higher bits should be zeroed so that the 8th bit doesn't get set + // the higher bits should be zeroed so that the 8th bit doesn't get set printByte(analogData >> 7); // bitshift the big stuff into the output byte printByte(analogData % 128); // mod by 32 for the small byte checkForInput(); |