Преглед изворни кода

functionnal OSC controlled stepper class

eLandon пре 6 година
родитељ
комит
cea574d099

+ 32 - 9
HTequi-firmware/src/Atm_lien/Atm_TeensyStep.cpp

@@ -1,10 +1,12 @@
 #include "Atm_TeensyStep.h"
 
+
 /* Add optional parameters for the state machine to begin()
  * Add extra initialization code
  */
 
-Atm_TeensyStep& Atm_TeensyStep::begin(Stepper & motorRef, StepControl & stepControlRef) {
+Atm_TeensyStep& Atm_TeensyStep::begin(Stepper & motorRef, StepControl & stepControlRef,
+                  EthernetUDP& udpRef, OSCBundle& bndl, const char* address ) {
   // clang-format off
   const static state_t state_table[] PROGMEM = {
     /*                 ON_ENTER     ON_LOOP       ON_EXIT  EVT_IDLE_TIMER  EVT_ON_TARGET  EVT_GOTO  ELSE */
@@ -15,16 +17,11 @@ Atm_TeensyStep& Atm_TeensyStep::begin(Stepper & motorRef, StepControl & stepCont
   };
   // clang-format on
   Machine::begin( state_table, ELSE );
-  // AccelStepper _motor (1, stepPin, dirPin);
   this-> motor =   &motorRef;
   this-> controller = &stepControlRef;
-  // Stepper _motor(stepPin, dirPin );
-  // StepControl _controller;
-  // _motor.setMaxSpeed(20000);
-  // _motor.setAcceleration(1000);
-  //_controller = new StepControl;
-  pinMode(0, OUTPUT);
-  digitalWrite(0, HIGH);
+  _adress = address;
+  this->_udpRef =   &udpRef;
+  this->_bndl = &bndl ;
   return *this;
 }
 
@@ -52,6 +49,7 @@ int Atm_TeensyStep::event( int id ) {
  */
 
 void Atm_TeensyStep::action( int id ) {
+  String strg = _adress;
   switch ( id ) {
     case ENT_IDLE:
       enable(0);
@@ -69,6 +67,9 @@ void Atm_TeensyStep::action( int id ) {
     case LP_RUNNING:
       // _motor.run();
       _currentStep = motor->getPosition();
+
+      strg += "/step";
+      _bndl->add(strg.c_str()).add(_currentStep);
       updateLimitSwitch();
       if(limitState[0] || limitState[1]) {emergencyStop();}
      // Serial.println(_motor.currentPosition());
@@ -91,6 +92,25 @@ Atm_TeensyStep& Atm_TeensyStep::trigger( int event ) {
   return *this;
 }
 
+Atm_TeensyStep& Atm_TeensyStep::onOSC(OSCMessage& msg ){
+  Serial.println("OSC");
+  int patternOffset = msg.match(_adress) ;
+  if(patternOffset){
+    if(msg.fullMatch("/speedAcc", patternOffset)){
+      motor->setMaxSpeed(msg.getInt(0));
+      motor->setAcceleration(msg.getInt(1));
+    }
+    if(msg.fullMatch("/enable", patternOffset)){enable(msg.getInt(0));}
+    if(msg.fullMatch("/home", patternOffset)){home(msg.getInt(0));}
+    if(msg.fullMatch("/move", patternOffset)){move(msg.getInt(0));}
+    if(msg.fullMatch("/moveTo", patternOffset)){moveTo(msg.getInt(0));}
+    if(msg.fullMatch("/stop", patternOffset)){stop();}
+    if(msg.fullMatch("/emergencyStop", patternOffset)){emergencyStop();}
+
+    return *this;
+  }
+}
+
 /* Optionally override the default state() method
  * Control what the machine returns when another process requests its state
  */
@@ -217,6 +237,9 @@ Atm_TeensyStep& Atm_TeensyStep::emergencyStop(){
   controller->emergencyStop();
   //trigger( EVT_STOPPING );
 }
+
+//Atm_TeensyStep& Atm_TeensyStep::onOSC(OSCMessage& msg)
+
 /*
  * onOnchange() push connector variants ( slots 1, autostore 0, broadcast 0 )
  */

+ 13 - 1
HTequi-firmware/src/Atm_lien/Atm_TeensyStep.h

@@ -2,6 +2,10 @@
 
 #include <Automaton.h>
 #include <TeensyStep.h>
+
+#include <EthernetUdp.h>
+#include <OSCMessage.h>
+#include <OSCBundle.h>
 // #include <AccelStepper.h>
 class Atm_TeensyStep: public Machine {
 
@@ -9,7 +13,8 @@ class Atm_TeensyStep: public Machine {
   enum { IDLE, READY, RUNNING, STOPPING }; // STATES
   enum { EVT_IDLE_TIMER, EVT_ON_TARGET, EVT_GOTO, ELSE }; // EVENTS
   Atm_TeensyStep( void ) : Machine()  {};
-  Atm_TeensyStep& begin( Stepper & motorRef , StepControl & stepControlRef ) ;
+  Atm_TeensyStep& begin( Stepper & motorRef, StepControl & stepControlRef,
+                    EthernetUDP& udpRef, OSCBundle& bndl, const char* address ) ;
 
   Atm_TeensyStep& trace( Stream & stream );
   Atm_TeensyStep& trigger( int event );
@@ -39,10 +44,17 @@ class Atm_TeensyStep: public Machine {
   bool homed; //stepper has been homed
   long int maxStep ;
 
+  const char* _adress = "/OSC";
+  EthernetUDP* _udpRef ;
+  Atm_TeensyStep& onOSC(OSCMessage& msg );
+
  private:
   // AccelStepper _motor;
   // Stepper *_motor;       // STEP pin: 2, DIR pin: 3
   // StepControl _controller;
+  OSCBundle* _bndl;
+
+
 
   enum { ENT_IDLE, EXT_IDLE, ENT_READY, ENT_RUNNING, LP_RUNNING,
           ENT_STOPPING, EXT_STOPPING }; // ACTIONS

+ 0 - 0
HTequi-firmware/src/Atm_lien/OSC_Atm_TeensyStep.h


+ 6 - 6
HTequi-firmware/src/blobcnc_low/main.cpp

@@ -108,12 +108,12 @@ class Atm_blink : public Machine {
        Serial.println("ouais gros");
        // int blinkstate = _msg.getInt(0);
        // blinkstate ? trigger(EVT_ON) : trigger(EVT_OFF);
-       _msg = new OSCMessage("/on");
-      _msg.add("youpi");
-      _udpRef->beginPacket(ipMulti, portMulti);
-      _msg.send(*_udpRef); // send the bytes to the SLIP stream
-      _udpRef->endPacket(); // mark the end of the OSC Packet
-      _msg.empty();
+      //  _msg = new OSCMessage("/on");
+      // _msg.add("youpi");
+      // _udpRef->beginPacket(ipMulti, portMulti);
+      // _msg.send(*_udpRef); // send the bytes to the SLIP stream
+      // _udpRef->endPacket(); // mark the end of the OSC Packet
+      // _msg.empty();
        return *this;
      }
    }

+ 71 - 16
HTequi-firmware/src/blobcnc_top/main.cpp

@@ -5,22 +5,27 @@
 
 #include <Arduino.h>
 
+//Automaton and custom machines
 #include <Automaton.h>
-#include "Atm_lien/Atm_stepper.h"
+// #include "Atm_lien/Atm_stepper.h"
 #include "Atm_lien/Atm_TeensyStep.h"
 
+//osc
+
+
 #include <SPI.h>
 #include <Ethernet.h>
 #include <EthernetUdp.h>
 #include <TeensyMAC.h>
-#include <OSCMessage.h>
+#include <OSCBundle.h>
+
 
 ////////////////    Ethernet  /////////////////////////////
 // Enter a MAC address and IP address for your controller below.
 // The IP address will be dependent on your local network:
 byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02};
-IPAddress ip(192, 168, 1, 204);    //local IP of Arduino/Teensy
-//unsigned int localPort = 8888;      // local port to listen on (not needed for multicast)
+// IPAddress ip(192, 168, 1, 204);    //local IP of Arduino/Teensy
+// unsigned int localPort = 8888;      // local port to listen on (not needed for multicast)
 IPAddress ipMulti(239, 200, 200, 200); // ipMidi Multicast address
 unsigned int portMulti = 9977;   // ipMidi Mutlicast port 1
 // buffers for receiving and sending data
@@ -30,6 +35,8 @@ byte sendBuffer2[] = {0x80, 0x14, 0x00};        // MIDI Note Off to Multicast ad
 // An EthernetUDP instance to let us send and receive packets over UDP
 EthernetUDP Udp;
 
+///////////////////       OSC         ////////////////////////
+OSCBundle bndl;
 
 /////////////////// STEPPER machines  ////////////////////////
 const int HIGH_SPEED = 800 ;
@@ -41,50 +48,98 @@ Atm_TeensyStep X_top_step;
 Stepper X_top_stepper(20 , 19);
 StepControl X_top_controller ;
 
+Atm_TeensyStep Y_top_step;
+Stepper Y_top_stepper(22 , 21);
+StepControl Y_top_controller ;
 
 //////////////  Setup  /////////////////////
 
 void setup() {
-  //Configure and start ethernet module (not needed for feeder)
+  //  ETHERNET (not needed for feeder)
   //SPI.setSCK(27); //only bottom
   Ethernet.init(15);//(10)
   teensyMAC(mac);
-  Ethernet.begin(mac, ip);              // start the Ethernet and UDP:
+  Ethernet.begin(mac);              // start the Ethernet and UDP:
  //  Udp.beginMulti(ipMulti, portMulti);   // for modified Arduino library
   Udp.beginMulticast(ipMulti, portMulti); // for modified Teensy Ethernet library
 
-  //Start serial
+  //  SERIAL
   Serial.begin(115200); // higher Baud rate for faster refresh, CHANGE IN SERIAL MONITOR
   delay(2000);
   Serial.println("Started");
-  pinMode(13, OUTPUT);
 
-  // pinMode(18, OUTPUT);
-  // digitalWrite(18, LOW);
+  //  LED
+
+
+  //  STEPPERS
   X_top_step.trace( Serial );
-  X_top_step.begin(X_top_stepper, X_top_controller)
-            .setEnablePin(18).enable(1)
-            .setLimitType(1).setLimitPins(A3).limitReversed(true).limitThresholds(600, 800, 900, 1200);
+  X_top_step.begin(X_top_stepper, X_top_controller, Udp, bndl, "/X_top")
+            .setEnablePin(18).enable(1);
+            //.setLimitType(3).setLimitPins(A3).limitReversed(true).limitThresholds(600, 750, 950, 1200);
   X_top_stepper.setMaxSpeed(HIGH_SPEED);
   X_top_stepper.setAcceleration(HIGH_ACC);
   X_top_stepper.setInverseRotation(true);
 
+  Y_top_step.trace( Serial );
+  Y_top_step.begin(Y_top_stepper, Y_top_controller, Udp, bndl, "/Y_top")
+            .setEnablePin(23).enableReversed(1)
+            //limit pin is on 7 and 8
+             .setLimitType(1).setLimitPins(16).limitReversed(true);
+  Y_top_stepper.setMaxSpeed(800);
+  Y_top_stepper.setAcceleration(2500);
+  Y_top_stepper.setInverseRotation(false);
   //stepper.onOnchange(Machine &machine, optional int event = 0)
   //stepper.cycle(1000);
-  X_top_step.move(100000);
+  X_top_step.move(-10000);
+  Y_top_step.move(10000);
   //controller.moveAsync(*stepper.motor);
   //pinMode(17, INPUT);
+
+
 }
 
 
 
 void loop() {
+
   automaton.run();
+  Udp.beginPacket(ipMulti, portMulti);
+  bndl.send(Udp); // send the bytes to the SLIP stream
+  Udp.endPacket(); // mark the end of the OSC Packet
+  bndl.empty(); // empty the bundle to free room for a new one
+
+  OSCMessage msgIn;
+  int size;
+  if( (size = Udp.parsePacket())>0)
+  {
+    while(size--)
+      msgIn.fill(Udp.read());
+
+     if(!msgIn.hasError()){
+       Serial.println("got OSC");
+       // msgIn.route("/blink", test);
+       X_top_step.onOSC(msgIn);
+       Y_top_step.onOSC(msgIn);
+     }
+
+
+  }
+
+
   Serial.print(analogRead(A3));
   Serial.print("   ");
-  Serial.print(X_top_step.limitState[0]);
+  Serial.print(Y_top_step.limitState[0]);
   Serial.print("   ");
   Serial.println(X_top_step.limitState[1]);
-  delay(10);
+
+  // OSCMessage msg("/analog/0");
+  // msg.add((int32_t)analogRead(0));
+  //
+  // Udp.beginPacket(ipMulti, portMulti);
+  // msg.send(Udp); // send the bytes to the SLIP stream
+  // Udp.endPacket(); // mark the end of the OSC Packet
+  // msg.empty(); // free space occupied by message
+
+  delay(1);
 
 }