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); ! }