All chips have decoupling caps, and I've put a 22uF across the 5v. Test failed after 3hrs 24m...
So, here's my code, though I'm sure it's okay (I'll put the xyzservos handler in the next post)
//
// MMM_matrix_Plotter3a (pairs with MP3 New VB)
// tjn 20/11/2012
//
// Status: Interleaves X, Y1, Y2 and Z(B)
// Note: 78 Steps/mm using B servo in Full-wave mode, slack = 36
#include <Wire.h>
#include <iox.h>
// Setup pins (0 and 1 reserved for serial I/O)
byte xctrl1 = 2; // X-Axis geartrain control 1
byte xctrl2 = 3; // X-Axis geartrain control 2
byte yctrl1 = 4; // South-Y geartrain control 1
byte yctrl2 = 5; // South-Y geartrain control 2
byte y2ctrl1 = 7; // North-Y geartrain control 1
byte y2ctrl2 = 8; // North-Y geartrain control 2
byte tpower = 9; // Trolley stepper supply
byte tctrl1 = 10; // Trolley control 1
byte tctrl2 = 11; // Trolley control 2
byte xypower = 12; // XY stepper supply
byte lpower = 13; // Laser logic supply
byte xsensors = 15; // X-buffer switches
byte ysensors = 14; // Y-buffer switches
byte scaleFactor = 1;
byte offset1, offset2, space, cut, gap;
byte xStepIdx, y1StepIdx, y2StepIdx, zStepIdx;
int xSteps, y1Steps, y2Steps, zSteps, totalSteps, subSteps, bitIndex, laserTime, tMult;
int xStore, yStore, zStore, pixCount, iterations, dotCount, max1, max2, iTimeIdx = 0;
char inStr[40]; // Hold incoming data
byte index = 0;
boolean stringComplete = false; // Data complete flag
boolean xStop = false;
boolean yStop = false;
boolean xDir = false; // TRUE = Clockwise
boolean yDir = false;
boolean zDir = false;
boolean oxDir = false;
boolean oyDir = false;
boolean ozDir = false;
boolean laserOn = false;
long MsDelay;
unsigned char twoWire[] = {
B01,B11,B10,B00}; // 2-Wire sequence for X/Y steppers
word fullWaveB[] = { // Full-wave Slave stepper motor sequence
0x6000,0x2010,0x18,0x4008};
word lampState = 0x0000;
double m, mx, my1, my2, mz, x, y1, y2, z;
void setup() {
Serial.begin(38400); // was 38400
pinMode(xctrl1, OUTPUT); // X stepper pin1
pinMode(xctrl2, OUTPUT); // X stepper pin2
pinMode(yctrl1, OUTPUT); // Y1 stepper pin1
pinMode(yctrl2, OUTPUT); // Y1 stepper pin2
pinMode(y2ctrl1, OUTPUT); // Y2 stepper pin1
pinMode(y2ctrl2, OUTPUT); // Y2 stepper pin2
pinMode(tctrl1, OUTPUT); // Trolley pin1
pinMode(tctrl2, OUTPUT); // Trolley pin2
pinMode(lpower, OUTPUT); // Laser power
pinMode(xypower, OUTPUT); // XY stepper power
pinMode(tpower, OUTPUT); // Trolley power
pinMode(xsensors, INPUT); // X-buffer switches
pinMode(ysensors, INPUT); // Y-buffer switches
digitalWrite(xypower, LOW); // Power-down XY motors
digitalWrite(lpower,LOW); // Power-down laser
digitalWrite(tpower,LOW); // Power-down trolley
Wire.begin(); // Start 2-wire communications (Arduino as master device)
IOX.device(0x74, 16); // 0x74 is address for Servo A (Pitch)
IOX.write(0x0080, CFGPORT); // P07=INPUT Set ports LOW to make them OUTPUTS
IOX.write(0x0000, INVPORT); // Set slave device invert ports to all NON-INVERT
IOX.write(0x000, OUTPORT); // Power-down Lamp/Fan
Serial.println("OK?");
delay(100);
}
void loop() {
if (stringComplete) {
xSteps = atoi(strtok(inStr, "xy")); // X Transit
y1Steps = atoi(strtok(NULL, "z")); // Y Transit
zSteps = atoi(strtok(NULL, "l")); // Z Transit
laserTime = atoi(strtok(NULL, ",o")); // Laser On/Off
offset1 = atoi(strtok(NULL, "s")); // Offset1
space = atoi(strtok(NULL, "c")); // Space
cut = atoi(strtok(NULL, "g")); // Cut
gap = atoi(strtok(NULL, "i")); // Gap
iterations = atoi(strtok(NULL, "o")); // Iterations
offset2 = atoi(strtok(NULL, "")); // Offset2
if (xSteps < 0) xDir = true;
if (xSteps > 0) xDir = false;
if (xSteps == 0) xDir = oxDir;
if (y1Steps < 0) yDir = true;
if (y1Steps > 0) yDir = false;
if (y1Steps == 0) yDir = oyDir;
if (zSteps < 0) zDir = false;
if (zSteps > 0) zDir = true;
if (zSteps == 0) zDir = ozDir;
if (xStop = true && xDir != oxDir) xStop = false;
if (yStop = true && yDir != oyDir) yStop = false;
xSteps = abs(xSteps);
y1Steps = abs(y1Steps);
zSteps = abs(zSteps);
y2Steps = y1Steps;
if (zDir != ozDir) { // Vertical Slack Handler
zSteps += 37; // Z-Slack value (from laser deflection test)
}
totalSteps = max(xSteps, y1Steps);
subSteps = min(xSteps, y1Steps);
m = (double)subSteps/(double)totalSteps;
if (m > 0.7) { // vector splitter/dog-legger to dodge bad harmonics
digitalWrite(lpower,LOW);
if (xSteps > y1Steps) {
xStore = xSteps;
yStore = y1Steps;
xSteps = xStore - y1Steps;
y1Steps = 0;
y2Steps = 0;
digitalWrite(xypower, HIGH);
xyzServos();
xSteps = yStore;
y1Steps = yStore;
y2Steps = y1Steps;
}
if (xSteps < y1Steps) {
xStore = xSteps;
yStore = y1Steps;
y1Steps = yStore - xSteps;
xSteps = 0;
digitalWrite(xypower, HIGH);
xyzServos();
xSteps = xStore;
y1Steps = xStore;
y2Steps = y1Steps;
}
// else not used (no adjustment needed when X & Y are equal!
}
if (xSteps != 0 || y1Steps != 0 || zSteps != 0) {
digitalWrite(xypower, HIGH);
xyzServos(); // rem-out while testing
}
else {
if (laserTime == 1) {
digitalWrite(lpower, HIGH); // Laser ON
IOX.write(0x0200, OUTPORT); // Lamp & Fan ON
}
else{
digitalWrite(lpower,LOW); // Laser OFF
IOX.write(0x000, OUTPORT); // Lamp & Fan OFF
}
}
if (xSteps == 0 && y1Steps == 0) { // switch OFF motors on end vector
//digitalWrite(xypower, LOW); // Machine loses registration on power-down!
if (laserTime == 0) IOX.write(0x0000, OUTPORT); // Turn lamp & fan OFF
}
if (xStop == true) Serial.println("X-buffer Hit");
if (yStop == true) Serial.println("Y-buffer Hit");
Serial.println("OK"); // Tell VB Arduino's ready to receive next command from vb
stringComplete = false;
oxDir = xDir;
oyDir = yDir;
ozDir = zDir;
}
}
void serialEvent()
{
while (Serial.available())
{
char inChar = Serial.read();
inStr[index++] = inChar; // add to the inStr
inStr[index] = '\0'; // NULL terminate the array
if (inChar == '\n')
{ // Flag if char is vbcrlf
stringComplete = true;
index = 0;
}
}
}