ArduinoMax-InOut-forDummies patch...loadbang settings...


    Sep 23 2013 | 5:59 am
    Greetings Max gurus,
    This is for an interactive installation. I'm using an Arduino to have a monetary button send a bang to Max. I'll have the patch autorun on startup of the computer.
    I'm trying to [loadbang] 1)Pin 2 2)Digital-Analog In 3)Toggle poll on...
    When I do this. It doesn't work unless I manually select from the [unmenu] what I want using the mouse. Any ideas or solutions to this? This is something probably very simple that I'm just not getting.
    Thank you for your time.
    Patch belo

    • Sep 23 2013 | 7:52 am
      Hi if the items from the umenu are never changed, why not ditch them and just loadbang the message (2, 0) in the [pak] object. Remember to use the [trigger] object after loadbang, to chronologically order your messages!
      Brendan
    • Sep 23 2013 | 1:58 pm
      Hi Brendan, Thanks for the suggestion. I made those changes but still experiencing the same problem.
      I have an arduino connected and using a simple monetary push button.
      When I launch the patch and press the push button nothing happens. It's only when I click the loadbang or the 0 and 2 message objects with the mouse, then pressing the push button I see the Pin2_Digiln toggle button turn on.
      Here is the Arduino code:
      /* Beta, Beta, Beta, Beta, Beta, Beta, Beta, Beta, Beta, Beta, Beta, Beta, Beta, Beta
      Shared APRIL 2012 by Lasse Vestergaard
      The protocol for communicating with this sketch is:
      SERIAL INPUT: - set pin state (p) og set pin value (v) - When setting a pin state you can write 0 (input),1 (output),2 (pwm) - set pin number - set value - Example: [p 3 2] & [v 3 128] == Pin 3 is set to be pwm and addressed with 50/50 duty cycle (medium "speed") (just send as char values from any program that can communicate with serial ports ex. Max/MSP) - You´ll need "[" and "]" to start and end requests.
      SERIAL OUTPUT: - pin number - value - Example: 7 0 == Pin 7 is set to receive a digital input (a carriage return is send to end request.) - The board will only output through serial if an Arduino port is set to input.
      */
      unsigned long sendtime;
      int portregister[]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; String sample=""; String explodedSample[3];
      void setup(){ sendtime=millis(); Serial.begin(115200); }
      void loop(){ while(Serial.available()>0){ char c=(char)Serial.read(); if(c == '[') sample=""; else if(c == ']'){ explodeString(sample); if(explodedSample[0].equalsIgnoreCase("v")){ setPinValue(convertStringToInt(explodedSample[1]),convertStringToInt(explodedSample[2])); } else if(explodedSample[0].equalsIgnoreCase("p")){ setPinState(convertStringToInt(explodedSample[1]),convertStringToInt(explodedSample[2])); } } else sample+=c; }
      if(millis()>sendtime+5){ readSendInput(); sendtime=millis(); }
      }
      void readSendInput(){ for(int i=0;i if(portregister[i]==0){ if(i Serial.print(i+2); Serial.print(" "); Serial.println(digitalRead(i+2)); } else{ Serial.print(i+2); Serial.print(" "); Serial.println(analogRead(i+2)); } } } }
      void setPinState(int pin, int pinState){ portregister[pin-2]=pinState; if(pinState==2) pinState=1; pinMode(pin, pinState); }
      void setPinValue(int pin, int val){ int pinState=portregister[pin-2]; if(pinState==1){ digitalWrite(pin,val); } else if(pinState==2){ analogWrite(pin,val); } }
      /***********************************/ /* HELPER FUNCTIONS */ /***********************************/
      void explodeString(String s){ String tem=""; int tempointer=0;
      for(int i=0;i if(s[i] == ' '){ explodedSample[tempointer++]=tem; tem=""; } else tem+=s[i]; } explodedSample[2]=tem; }
      int convertStringToInt(String s){ char test[s.length()+1]; s.toCharArray(test, sizeof(test)); return atoi(test); }
      You can also download it yourself here:
    • Sep 23 2013 | 9:35 pm
      Hi I don't have (or want :p) the ArduinoInOut stuff, so I'm just guessing here but; if the Arduino is expecting a call-and-response (while and if conditions above), then it appears that your button press is what kicks off the process. A lazy guess would be to try and send the char "[", as stated at the head of the code above:
      " – Example: [p 3 2] & [v 3 128] == Pin 3 is set to be pwm and addressed with 50/50 duty cycle (medium “speed”) (just send as char values from any program that can communicate with serial ports ex. Max/MSP) – You´ll need “[" and "]” to start and end requests. " Sorry not to be more help, but I'm crap at troubleshooting these prefabs, I prefer to roll my own code and patches for Arduino stuff.
      Brendan