Update of /cvsroot/pure-data/externals/hardware/arduino/Pd_firmware
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26284/Pd_firmware
Modified Files:
Pd_firmware.pde
Log Message:
minor cleanups and commenting on the firmware; got Pd code working with new protocol; digital inputs still aren't transmitted/received correctly
Index: Pd_firmware.pde
===================================================================
RCS file: /cvsroot/pure-data/externals/hardware/arduino/Pd_firmware/Pd_firmware.pde,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -d -r1.11 -r1.12
*** Pd_firmware.pde 24 Aug 2006 05:54:25 -0000 1.11
--- Pd_firmware.pde 24 Aug 2006 14:48:21 -0000 1.12
***************
*** 1,23 ****
! /* Arduino firmware aka Firmata
! * ------------------
*
! * 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.
*
! * (copyleft) 2006 Hans-Christoph Steiner <hans(a)at.or.at>
! * @author: Hans-Christoph Steiner
* @date: 2006-05-19
! * @location: STEIM, Amsterdam, Netherlands
*/
! /* 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
*/
--- 1,44 ----
! /* 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
! * -----------------------------
*
! * Firmata turns the Arduino into a Plug-n-Play sensorbox, servo
! * controller, and/or PWM motor/lamp controller.
*
! * 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(a)at.or.at> and Jamie Allen <jamie(a)heavyside.net>
* @date: 2006-05-19
! * @location: STEIM, Amsterdam, Netherlands and New York, NY
! *
*/
! /*
! * 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
*/
***************
*** 30,34 ****
/* computer->Arduino commands
* -------------------- */
! /* 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
--- 51,55 ----
/* computer->Arduino commands
* -------------------- */
! /* 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
***************
*** 90,98 ****
*/
! /* two byte software PWM data format
* ----------------------
! * 0 get ready for digital input bytes (250/251)
* 1 pin #
! * 2 pulse width
*/
--- 111,119 ----
*/
! /* two byte PWM data format
* ----------------------
! * 0 get ready for digital input bytes (ENABLE_SOFTWARE_PWM/ENABLE_PWM)
* 1 pin #
! * 2 duty cycle expressed as 1 byte (255 = 100%)
*/
***************
*** 117,126 ****
*/
- /*
- * 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
--- 138,141 ----
***************
*** 181,186 ****
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(a)at.or.at> */
transmitByte = transmitByte + ((2^i)*digitalData);
}
--- 196,201 ----
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(a)at.or.at> */
transmitByte = transmitByte + ((2^i)*digitalData);
}
***************
*** 220,237 ****
void setSoftPwm (int pin, byte pulsePeriod) {
! byte i;
! /* for(i=0; i<7; ++i) {
mask = 1 << i;
if(digitalPinStatus & 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
}
--- 235,252 ----
void setSoftPwm (int pin, byte pulsePeriod) {
! byte i;
! /* for(i=0; i<7; ++i) {
mask = 1 << i;
if(digitalPinStatus & 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
}
***************
*** 241,251 ****
void disSoftPwm(int pin) {
! //throw pin low
}
! // -------------------------------------------------------------------------
! /* this function checks to see if there is data waiting on the serial port
* then processes all of the stored data
*/
--- 256,266 ----
void disSoftPwm(int pin) {
! //throw pin low
}
! /* -------------------------------------------------------------------------
! * this function checks to see if there is data waiting on the serial port
* then processes all of the stored data
*/
***************
*** 258,262 ****
}
! // -------------------------------------------------------------------------
void processInput(byte inputData) {
int i;
--- 273,280 ----
}
! /* -------------------------------------------------------------------------
! * 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;
***************
*** 274,290 ****
case ENABLE_PWM:
case DISABLE_PWM:
! //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;
case DISABLE_SOFTWARE_PWM:
! disSoftPwm(storedInputData[0]);
! break;
case SET_SOFTWARE_PWM_FREQ:
! setSoftPwmFreq(storedInputData[0]);
! break;
}
executeMultiByteCommand = 0;
--- 292,308 ----
case ENABLE_PWM:
case DISABLE_PWM:
! //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;
case DISABLE_SOFTWARE_PWM:
! disSoftPwm(storedInputData[0]);
! break;
case SET_SOFTWARE_PWM_FREQ:
! setSoftPwmFreq(storedInputData[0]);
! break;
}
executeMultiByteCommand = 0;
***************
*** 314,318 ****
else {
switch (inputData) {
! case SET_PIN_ZERO_TO_IN:
case SET_PIN_ONE_TO_IN:
case SET_PIN_TWO_TO_IN:
--- 332,336 ----
else {
switch (inputData) {
! case SET_PIN_ZERO_TO_IN: // set digital pins to INPUT
case SET_PIN_ONE_TO_IN:
case SET_PIN_TWO_TO_IN:
***************
*** 328,334 ****
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:
case SET_PIN_ONE_TO_OUT:
case SET_PIN_TWO_TO_OUT:
--- 346,352 ----
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: // set digital pins to OUTPUT
case SET_PIN_ONE_TO_OUT:
case SET_PIN_TWO_TO_OUT:
***************
*** 344,386 ****
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;
case ENABLE_PWM:
! waitForData = 2; // (pin#, dutyCycle)
! executeMultiByteCommand = inputData;
! break;
case DISABLE_PWM:
! waitForData = 1; // pin#
! executeMultiByteCommand = inputData;
! break;
case SET_SOFTWARE_PWM_FREQ:
! waitForData = 1; // pin#
! executeMultiByteCommand = inputData;
! break;
case ENABLE_SOFTWARE_PWM:
! waitForData = 2; // (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;
break;
}
--- 362,404 ----
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;
case ENABLE_PWM:
! waitForData = 2; // 2 bytes needed (pin#, dutyCycle)
! executeMultiByteCommand = inputData;
! break;
case DISABLE_PWM:
! waitForData = 1; // 1 byte needed (pin#)
! executeMultiByteCommand = inputData;
! break;
case SET_SOFTWARE_PWM_FREQ:
! waitForData = 1; // 1 byte needed (pin#)
! executeMultiByteCommand = inputData;
! break;
case ENABLE_SOFTWARE_PWM:
! waitForData = 2; // 2 bytes needed (pin#, dutyCycle)
! executeMultiByteCommand = inputData;
! break;
case DISABLE_SOFTWARE_PWM:
! waitForData = 1; // 1 byte needed (pin#)
! executeMultiByteCommand = inputData;
! break;
! case OUTPUT_TO_DIGITAL_PINS: // bytes to send to digital outputs
! firstInputByte = true;
break;
}
***************
*** 424,428 ****
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
printByte(analogData >> 7); // bitshift the big stuff into the output byte
printByte(analogData % 128); // mod by 32 for the small byte
--- 442,446 ----
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
printByte(analogData >> 7); // bitshift the big stuff into the output byte
printByte(analogData % 128); // mod by 32 for the small byte