[PD-cvs] externals/hardware/arduino/Pd_firmware Pd_firmware.pde, 1.1, 1.2
Hans-Christoph Steiner
eighthave at users.sourceforge.net
Fri May 19 14:54:13 CEST 2006
Update of /cvsroot/pure-data/externals/hardware/arduino/Pd_firmware
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22275/Pd_firmware
Modified Files:
Pd_firmware.pde
Log Message:
worked out 2-way protocol, everything seems to work from Pd; the data sending is commented out, but it should still work...
Index: Pd_firmware.pde
===================================================================
RCS file: /cvsroot/pure-data/externals/hardware/arduino/Pd_firmware/Pd_firmware.pde,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** Pd_firmware.pde 18 May 2006 20:24:18 -0000 1.1
--- Pd_firmware.pde 19 May 2006 12:54:11 -0000 1.2
***************
*** 1,111 ****
! /* Pd_firmware
! * ------------------
! *
! *
! * It was designed to work with the Pd patch of the same
! * name in: Help -> Browser -> examples -> hardware
! *
! * (cleft) 2006 Hans-Christoph Steiner
! * @author: Hans-Christoph Steiner
! * @date: 2006-03-10
! * @location: Polytechnic University, Brooklyn, New York, USA
! */
!
! /*
! * Pduino protocol
! * ===============
! * data: 0-127 control: 128-255
! *
! * Pd->Arduino commands
! * --------------------
! * 150 - next byte sets PWM0 value
! * 151 - next byte sets PWM1 value
! * 152 - next byte sets PWM2 value
! * 200-213 - set digital pin 0-13 to input
! * 220-233 - set digital pin 0-13 to output
! *
! *
! * Pd->Arduino byte cycle
! * ----------------------
! * 0 cycle marker (255/11111111)
! * 1 digitalOut 0-6 bitmask
! * 2 digitalOut 7-13 bitmask
! *
! * Arduino->Pd byte cycle
! * ----------------------
! * 0 digitalIn 0-6 bitmask
! * 1 digitalIn 7-13 bitmask
! * 2 analogIn0 byte0
! * 3 analogIn0 byte1
! * 4 analogIn1 byte0
! * 5 analogIn1 byte1
! * 6 analogIn2 byte0
! * 7 analogIn2 byte1
! * 8 analogIn3 byte0
! * 9 analogIn3 byte1
! * 10 analogIn4 byte0
! * 11 analogIn4 byte1
! * 12 analogIn5 byte0
! * 13 analogIn5 byte1
! * 14 cycle marker (255/11111111)
! *
! *
! * TX RX
! * -----------------------
! *
! */
!
! /*
! * 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.
! */
!
!
! byte i;
!
! // this int serves as an array of bits to store pin status
! int digitalPinStatus;
!
! byte analogPin;
! int analogData;
!
! void outputDigital(byte startPin) {
! byte digitalPin;
! byte digitalPinBit;
! byte digitalOutputByte;
! byte digitalData;
! for(i=0;i<7;++i)
! {
! digitalPin = i+startPin;
! digitalPinBit = 2^digitalPin;
! // only read the pin if its set to input
! if(digitalPinStatus & digitalPinBit)
! digitalData = digitalRead(digitalPin);
! else
! digitalData = 0;
! digitalOutputByte = digitalOutputByte + (2^(i+1-startPin)*digitalData);
! }
! printByte(digitalOutputByte);
! }
!
! void setup() {
! beginSerial(9600);
! }
!
! void loop() {
! // read all digital pins
! outputDigital(0);
! outputDigital(7);
! /*
! * get analog in
! */
! analogData = analogRead(analogPin);
! // these two bytes get converted back into the whole number in Pd
! printByte(analogData / 32); // div by 32 for the big byte
! printByte(analogData % 32); // mod by 32 for the small byte
! ++analogPin;
! if (analogPin > 5) analogPin = 0;
! /* end with the cycle marker */
! printByte(255);
! }
--- 1,224 ----
! /* Pd_firmware
! * ------------------
! *
! *
! * It was designed to work with the Pd patch of the same
! * name in: Help -> Browser -> examples -> hardware
! *
! * (cleft) 2006 Hans-Christoph Steiner
! * @author: Hans-Christoph Steiner
! * @date: 2006-03-10
! * @location: Polytechnic University, Brooklyn, New York, USA
! */
!
! /*
! * Pduino protocol
! * ===============
! * data: 0-127 control: 128-255
! *
! * Pd->Arduino commands
! * --------------------
! * 200-213 - set digital pin 0-13 to output
! * 214-227 - set digital pin 0-13 to input
! * 230 - next byte sets PWM0 value
! * 231 - next byte sets PWM1 value
! * 232 - next byte sets PWM2 value
! *
! *
! * Pd->Arduino byte cycle
! * ----------------------
! * 0 cycle marker (255/11111111)
! * 1 digitalOut 0-6 bitmask
! * 2 digitalOut 7-13 bitmask
! *
! * Arduino->Pd byte cycle
! * ----------------------
! * 0 digitalIn 0-6 bitmask
! * 1 digitalIn 7-13 bitmask
! * 2 analogIn0 byte0
! * 3 analogIn0 byte1
! * 4 analogIn1 byte0
! * 5 analogIn1 byte1
! * 6 analogIn2 byte0
! * 7 analogIn2 byte1
! * 8 analogIn3 byte0
! * 9 analogIn3 byte1
! * 10 analogIn4 byte0
! * 11 analogIn4 byte1
! * 12 analogIn5 byte0
! * 13 analogIn5 byte1
! * 14 cycle marker (255/11111111)
! *
! *
! * TX RX
! * -----------------------
! *
! */
!
! /*
! * 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
!
! byte i;
!
! // this flag says that the next serial input will be data, not control
! boolean waitForData = 0;
!
! /* this int serves as an array of bits to store pin status
! * 0 = INPUT, 1 = OUTPUT
! */
! int digitalPinStatus;
!
! byte analogPin;
! int analogData;
!
! // -------------------------------------------------------------------------
! void outputDigital(byte startPin) {
! byte digitalPin;
! byte digitalPinBit;
! byte digitalOutputByte;
! byte digitalData;
! for(i=0;i<7;++i)
! {
! digitalPin = i+startPin;
! digitalPinBit = OUTPUT << digitalPin;
! // only read the pin if its set to input
! if(digitalPinStatus & digitalPinBit) {
! digitalData = 0; // pin set to OUTPUT, don't read
! }
! else {
! digitalData = digitalRead(digitalPin);
! }
! digitalOutputByte = digitalOutputByte + (2^(i+1-startPin)*digitalData);
! }
! printByte(digitalOutputByte);
! }
!
! // -------------------------------------------------------------------------
! void setPinMode(int pin, int mode) {
! pinMode(pin,mode);
! if(mode == INPUT) {
! digitalPinStatus = digitalPinStatus &~ (1 << pin);
! }
! if(mode == OUTPUT) {
! digitalPinStatus = digitalPinStatus | (1 << pin);
! }
! }
!
! // -------------------------------------------------------------------------
! void checkForInput() {
! if(serialAvailable()) {
! while(serialAvailable()) {
! processInput(serialRead());
! }
! }
! }
!
! // -------------------------------------------------------------------------
! void processInput(int inputData) {
! if (waitForData > 0) {
! // the PWM commands (230-232) have a byte of data following the command
! analogWrite(waitForData,inputData);
! waitForData = 0;
! }
! else {
! switch (inputData) {
! case 200:
! case 201:
! case 202:
! case 203:
! case 204:
! case 205:
! case 206:
! case 207:
! case 208:
! case 209:
! case 210:
! case 211:
! case 212:
! case 213:
! setPinMode(inputData-200,OUTPUT);
! printByte(inputData);
! printByte(inputData);
! printByte(inputData);
! printByte(inputData);
! break;
! case 214:
! case 215:
! case 216:
! case 217:
! case 218:
! case 219:
! case 220:
! case 221:
! case 222:
! case 223:
! case 224:
! case 225:
! case 226:
! case 227:
! setPinMode(inputData-214,INPUT);
! printByte(inputData);
! printByte(inputData);
! printByte(inputData);
! printByte(inputData);
! break;
! case 230:
! case 231:
! case 232:
! // set waitForData to the PWM pin number
! waitForData = inputData - 221;
! printByte(inputData);
! printByte(inputData);
! printByte(inputData);
! printByte(inputData);
! break;
! case 255:
! break;
! }
! }
! }
!
! // =========================================================================
!
! // -------------------------------------------------------------------------
! void setup() {
! beginSerial(9600);
! for(i=0; i<TOTAL_DIGITAL_PINS; ++i) {
! setPinMode(i,INPUT);
! }
! }
!
! // -------------------------------------------------------------------------
! void loop() {
! // read all digital pins
! outputDigital(0);
! outputDigital(7);
! /*
! * get analog in
! */
! /*
! for(analogPin=0; analogPin<5; ++analogPin)
! {
! analogData = analogRead(analogPin);
! // these two bytes get converted back into the whole number in Pd
! printByte(analogData >> 7); // bitshift the big stuff into the output byte
! printByte(analogData % 128); // mod by 32 for the small byte
! }
! */
! // ++analogPin;
! // if (analogPin > 5) analogPin = 0;
! /* end with the cycle marker */
! // bitshift the big stuff into the output byte
! printByte(digitalPinStatus >> 7);
! // clear the 8th bit before truncating to a byte for small byte
! printByte(digitalPinStatus % 128);
!
! checkForInput();
!
! printByte(255);
! }
More information about the Pd-cvs
mailing list