main.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. #include <Arduino.h>
  2. //Automaton and custom machines
  3. #include <Automaton.h>
  4. // #include "Atm_Teenstep.h"
  5. // #include "Atm_Teenstep_OSC.h"
  6. #include "Atm_AccelStepper.h"
  7. //osc
  8. #include <SPI.h>
  9. #include <Ethernet.h>
  10. #include <EthernetUdp.h>
  11. #include <TeensyMAC.h>
  12. #include <OSCBundle.h>
  13. // Enter a MAC address and IP address for your controller below.
  14. // The IP address will be dependent on your local network:
  15. byte mac[] = {
  16. 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02
  17. };
  18. // IPAddress ip(192, 168, 1, 104); //local IP of Arduino/Teensy
  19. // unsigned int localPort = 8000; // local port to listen on (not needed for multicast)
  20. // IPAddress outIp(192, 168, 1, 102);
  21. // const unsigned int outPort = 9000;
  22. IPAddress ipMulti(239, 200, 200, 200); // ipMidi Multicast address
  23. unsigned int portMulti = 9977; // ipMidi Mutlicast port 1
  24. // buffers for receiving and sending data
  25. byte packetBuffer[UDP_TX_PACKET_MAX_SIZE]; // buffer to hold incoming packet
  26. byte sendBuffer1[] = {0x90, 0x14, 0x22}; // MIDI Note On to Multicast address
  27. byte sendBuffer2[] = {0x80, 0x14, 0x00}; // MIDI Note Off to Multicast address
  28. // An EthernetUDP instance to let us send and receive packets over UDP
  29. EthernetUDP Udp;
  30. /////////////////// OSC ////////////////////////
  31. OSCBundle bndl;
  32. /////////////////// STEPPER machines ////////////////////////
  33. const int HIGH_SPEED = 5000 ;
  34. const int HIGH_ACC = 800 ;
  35. const int LOW_SPEED = 100 ;
  36. const int LOW_ACC = 1000 ;
  37. // Atm_Teenstep_OSC A_low_OSC;
  38. // Atm_Teenstep A_low_step;
  39. // Stepper A_low_stepper(8 , 7);
  40. // StepControl A_low_controller ;
  41. Atm_AccelStepper A_low_step ;
  42. // Atm_Teenstep_OSC B_low_OSC;
  43. // Atm_Teenstep B_low_step;
  44. // Stepper B_low_stepper(32 , 31);
  45. // StepControl B_low_controller ;
  46. Atm_AccelStepper B_low_step ;
  47. // Atm_Teenstep_OSC TrBr_low_OSC;
  48. // Atm_Teenstep TrBr_low_step;
  49. // Stepper TrBr_low_stepper(2 , 1);
  50. // StepControl TrBr_low_controller ;
  51. Atm_AccelStepper TrBr_low_step ;
  52. // Atm_Teenstep_OSC LevBr_low_OSC;
  53. // Atm_Teenstep LevBr_low_step;
  54. // Stepper LevBr_low_stepper(5 , 4);
  55. // StepControl LevBr_low_controller ;
  56. Atm_AccelStepper LevBr_low_step ;
  57. /////////////////// Servo and pump ////////////////////////
  58. const int filling_pwm_pin = 29;
  59. const int brush_pwm_pin = 14;
  60. const int crusher_pin = 16;
  61. void motorsOSC(OSCMessage &msg){
  62. msg.dispatch("/filling", [](OSCMessage &msg){digitalWrite(filling_pwm_pin, msg.getInt(0));});
  63. msg.dispatch("/brush", [](OSCMessage &msg){analogWrite(brush_pwm_pin, msg.getInt(0));});
  64. msg.dispatch("/crusher", [](OSCMessage &msg){digitalWrite(crusher_pin, msg.getInt(0));});
  65. }
  66. ////////////// Setup /////////////////////
  67. void setup() {
  68. delay(2000);
  69. // SERIAL
  70. Serial.begin(115200); // higher Baud rate for faster refresh, CHANGE IN SERIAL MONITOR
  71. //delay(2000);
  72. Serial.println("Started Low");
  73. // ETHERNET
  74. SPI.setSCK(27);
  75. Ethernet.init(10);//(10)
  76. teensyMAC(mac);
  77. Ethernet.begin(mac); // start the Ethernet and UDP:
  78. Udp.beginMulticast(ipMulti, portMulti); // for modified Teensy Ethernet library
  79. // Udp.begin(localPort);
  80. Serial.print("Started ethernet, IP is ");
  81. Serial.println(Ethernet.localIP());
  82. // STEPPERS
  83. A_low_step.begin(8, 7).setEnablePin(6).pinReversed(1)//.trace(Serial)
  84. .enable()
  85. .limitLow_set(2, 37, 0).limitLow_setThresholds(600, 715).limitLow_isHard(0)
  86. // .limitHigh_set(2, 37, 0).limitHigh_setThresholds(870, 1000).limitHigh_isHard(0)
  87. .setHomingSpeed(2000)
  88. .setMaxSpeed(HIGH_SPEED).setAcceleration(HIGH_ACC);
  89. A_low_step.onChangeposition([](int idx, int v, int up){bndl.add("/A_low/step").add(v).add(up);});
  90. A_low_step.onChangestate([](int idx, int v, int up){bndl.add("/A_low/state").add(v);});
  91. A_low_step.onOnlimitlow([](int idx, int v, int up){bndl.add("/A_low/limitLow").add(v);});
  92. A_low_step.onOnlimithigh([](int idx, int v, int up){bndl.add("/A_low/limitHigh").add(v);});
  93. A_low_step.onOntarget([](int idx, int v, int up){bndl.add("/A_low/onTarget").add(v);});
  94. B_low_step.begin(32 , 31).setEnablePin(30).pinReversed(0)//.trace(Serial)
  95. .enable()
  96. .limitLow_set(2, 35, 0).limitLow_setThresholds(600, 715).limitLow_isHard(0)
  97. // .limitHigh_set(2, 35, 0).limitHigh_setThresholds(870, 1000).limitHigh_isHard(0)
  98. .setHomingSpeed(2000)
  99. .setMaxSpeed(HIGH_SPEED).setAcceleration(HIGH_ACC);
  100. B_low_step.onChangeposition([](int idx, int v, int up){bndl.add("/B_low/step").add(v).add(up);});
  101. B_low_step.onChangestate([](int idx, int v, int up){bndl.add("/B_low/state").add(v);});
  102. B_low_step.onOnlimitlow([](int idx, int v, int up){bndl.add("/B_low/limitLow").add(v);});
  103. B_low_step.onOnlimithigh([](int idx, int v, int up){bndl.add("/B_low/limitHigh").add(v);});
  104. B_low_step.onOntarget([](int idx, int v, int up){bndl.add("/B_low/onTarget").add(v);});
  105. TrBr_low_step.begin(2, 1).setEnablePin(0).pinReversed(1)//.trace(Serial)
  106. .enable()
  107. .limitLow_set(1, 19, 1).limitLow_isHard(1)
  108. .limitHigh_set(1, 17, 1).limitHigh_isHard(1)
  109. .setHomingSpeed(2000)
  110. .setMaxSpeed(HIGH_SPEED).setAcceleration(HIGH_ACC);
  111. TrBr_low_step.onChangeposition([](int idx, int v, int up){bndl.add("/TrBr_low/step").add(v).add(up);});
  112. TrBr_low_step.onChangestate([](int idx, int v, int up){bndl.add("/TrBr_low/state").add(v);});
  113. TrBr_low_step.onOnlimitlow([](int idx, int v, int up){bndl.add("/TrBr_low/limitLow").add(v);});
  114. TrBr_low_step.onOnlimithigh([](int idx, int v, int up){bndl.add("/TrBr_low/limitHigh").add(v);});
  115. TrBr_low_step.onOntarget([](int idx, int v, int up){bndl.add("/TrBr_low/onTarget").add(v);});
  116. LevBr_low_step.begin(5 , 4).setEnablePin(3).pinReversed(1)//.trace(Serial)
  117. .enable()
  118. .limitLow_set(1, 15, 1).limitLow_isHard(1)
  119. .limitHigh_set(1, 39, 1).limitHigh_isHard(1)
  120. .setHomingSpeed(2000)
  121. .setMaxSpeed(HIGH_SPEED).setAcceleration(HIGH_ACC);
  122. LevBr_low_step.onChangeposition([](int idx, int v, int up){bndl.add("/LevBr_low/step").add(v).add(up);});
  123. LevBr_low_step.onChangestate([](int idx, int v, int up){bndl.add("/LevBr_low/state").add(v);});
  124. LevBr_low_step.onOnlimitlow([](int idx, int v, int up){bndl.add("/LevBr_low/limitLow").add(v);});
  125. LevBr_low_step.onOnlimithigh([](int idx, int v, int up){bndl.add("/LevBr_low/limitHigh").add(v);});
  126. LevBr_low_step.onOntarget([](int idx, int v, int up){bndl.add("/LevBr_low/onTarget").add(v);});
  127. // Peristaltic pump
  128. pinMode(filling_pwm_pin, OUTPUT);
  129. pinMode(brush_pwm_pin, OUTPUT);
  130. pinMode(crusher_pin, OUTPUT);
  131. Serial.println("Ended setup");
  132. //TrBr_low_step.move(1000);
  133. Udp.beginPacket(ipMulti, portMulti);
  134. // Udp.beginPacket(outIp, outPort);
  135. bndl.add("/test").add("youpi");
  136. bndl.send(Udp); // send the bytes to the SLIP stream
  137. Udp.endPacket(); // mark the end of the OSC Packet
  138. bndl.empty(); //
  139. }
  140. void loop() {
  141. delay(1);
  142. Udp.beginPacket(ipMulti, portMulti);
  143. // Udp.beginPacket(outIp, outPort);
  144. automaton.run();
  145. bndl.send(Udp); // send the bytes to the SLIP stream
  146. Udp.endPacket(); // mark the end of the OSC Packet
  147. bndl.empty(); // empty the bundle to free room for a new one
  148. OSCMessage msgIn;
  149. int size;
  150. if( (size = Udp.parsePacket())>0)
  151. {
  152. while(size--)
  153. msgIn.fill(Udp.read());
  154. if(!msgIn.hasError()){
  155. //Serial.println("got OSC");
  156. msgIn.dispatch("/A_low/move", [](OSCMessage &msg){A_low_step.move(msg.getInt(0));});
  157. msgIn.dispatch("/A_low/moveTo", [](OSCMessage &msg){A_low_step.moveTo(msg.getInt(0));});
  158. msgIn.dispatch("/A_low/rotate", [](OSCMessage &msg){A_low_step.rotate(msg.getInt(0));});
  159. msgIn.dispatch("/A_low/stop", [](OSCMessage &msg){A_low_step.stop();});
  160. msgIn.dispatch("/A_low/emergency_stop", [](OSCMessage &msg){A_low_step.emergency_stop();});
  161. msgIn.dispatch("/A_low/homing", [](OSCMessage &msg){A_low_step.homing(msg.getInt(0));});
  162. msgIn.dispatch("/A_low/setMaxSpeed", [](OSCMessage &msg){A_low_step.setMaxSpeed(msg.getInt(0));});
  163. msgIn.dispatch("/A_low/setHomingSpeed", [](OSCMessage &msg){A_low_step.setHomingSpeed(msg.getInt(0));});
  164. msgIn.dispatch("/A_low/setAcceleration", [](OSCMessage &msg){A_low_step.setAcceleration(msg.getInt(0));});
  165. msgIn.dispatch("/B_low/move", [](OSCMessage &msg){B_low_step.move(msg.getInt(0));});
  166. msgIn.dispatch("/B_low/moveTo", [](OSCMessage &msg){B_low_step.moveTo(msg.getInt(0));});
  167. msgIn.dispatch("/B_low/rotate", [](OSCMessage &msg){B_low_step.rotate(msg.getInt(0));});
  168. msgIn.dispatch("/B_low/stop", [](OSCMessage &msg){B_low_step.stop();});
  169. msgIn.dispatch("/B_low/emergency_stop", [](OSCMessage &msg){B_low_step.emergency_stop();});
  170. msgIn.dispatch("/B_low/homing", [](OSCMessage &msg){B_low_step.homing(msg.getInt(0));});
  171. msgIn.dispatch("/B_low/setMaxSpeed", [](OSCMessage &msg){B_low_step.setMaxSpeed(msg.getInt(0));});
  172. msgIn.dispatch("/B_low/setHomingSpeed", [](OSCMessage &msg){B_low_step.setHomingSpeed(msg.getInt(0));});
  173. msgIn.dispatch("/B_low/setAcceleration", [](OSCMessage &msg){B_low_step.setAcceleration(msg.getInt(0));});
  174. msgIn.dispatch("/TrBr_low/move", [](OSCMessage &msg){TrBr_low_step.move(msg.getInt(0));});
  175. msgIn.dispatch("/TrBr_low/moveTo", [](OSCMessage &msg){TrBr_low_step.moveTo(msg.getInt(0));});
  176. msgIn.dispatch("/TrBr_low/rotate", [](OSCMessage &msg){TrBr_low_step.rotate(msg.getInt(0));});
  177. msgIn.dispatch("/TrBr_low/stop", [](OSCMessage &msg){TrBr_low_step.stop();});
  178. msgIn.dispatch("/TrBr_low/emergency_stop", [](OSCMessage &msg){TrBr_low_step.emergency_stop();});
  179. msgIn.dispatch("/TrBr_low/homing", [](OSCMessage &msg){TrBr_low_step.homing(msg.getInt(0));});
  180. msgIn.dispatch("/A_low/setMaxSpeed", [](OSCMessage &msg){TrBr_low_step.setMaxSpeed(msg.getInt(0));});
  181. msgIn.dispatch("/A_low/setHomingSpeed", [](OSCMessage &msg){TrBr_low_step.setHomingSpeed(msg.getInt(0));});
  182. msgIn.dispatch("/A_low/setAcceleration", [](OSCMessage &msg){TrBr_low_step.setAcceleration(msg.getInt(0));});
  183. msgIn.dispatch("/LevBr_low/move", [](OSCMessage &msg){LevBr_low_step.move(msg.getInt(0));});
  184. msgIn.dispatch("/LevBr_low/moveTo", [](OSCMessage &msg){LevBr_low_step.moveTo(msg.getInt(0));});
  185. msgIn.dispatch("/LevBr_low/rotate", [](OSCMessage &msg){LevBr_low_step.rotate(msg.getInt(0));});
  186. msgIn.dispatch("/LevBr_low/stop", [](OSCMessage &msg){LevBr_low_step.stop();});
  187. msgIn.dispatch("/LevBr_low/emergency_stop", [](OSCMessage &msg){LevBr_low_step.emergency_stop();});
  188. msgIn.dispatch("/LevBr_low/homing", [](OSCMessage &msg){LevBr_low_step.homing(msg.getInt(0));});
  189. msgIn.dispatch("/LevBr_low/setMaxSpeed", [](OSCMessage &msg){LevBr_low_step.setMaxSpeed(msg.getInt(0));});
  190. msgIn.dispatch("/LevBr_low/setHomingSpeed", [](OSCMessage &msg){LevBr_low_step.setHomingSpeed(msg.getInt(0));});
  191. msgIn.dispatch("/LevBr_low/setAcceleration", [](OSCMessage &msg){LevBr_low_step.setAcceleration(msg.getInt(0));});
  192. // B_low_OSC.onOSC(msgIn);
  193. // TrBr_low_OSC.onOSC(msgIn);
  194. // LevBr_low_OSC.onOSC(msgIn);
  195. motorsOSC(msgIn);
  196. }
  197. }
  198. }