Add a second projector version of the JKM100 script. In the script, move the 16ms delay to BEFORE the confirmation character and increase it to 100ms to make sure all shake is out of the system before shooting a frame.

This commit is contained in:
Matt McWilliams 2024-05-19 09:38:48 -04:00
parent 5f7fa6287f
commit 9b7d1a3e5c
13 changed files with 387 additions and 11 deletions

View File

@ -1,5 +1,5 @@
{ {
"version": "1.8.104", "version": "1.8.105",
"ext_port": 1111, "ext_port": 1111,
"profiles": { "profiles": {
"mcopy": { "mcopy": {

2
app/package-lock.json generated
View File

@ -1,6 +1,6 @@
{ {
"name": "mcopy-app", "name": "mcopy-app",
"version": "1.8.104", "version": "1.8.105",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {

View File

@ -1,6 +1,6 @@
{ {
"name": "mcopy-app", "name": "mcopy-app",
"version": "1.8.104", "version": "1.8.105",
"description": "GUI for the mcopy small gauge film optical printer platform", "description": "GUI for the mcopy small gauge film optical printer platform",
"main": "main.js", "main": "main.js",
"scripts": { "scripts": {

View File

@ -1,5 +1,5 @@
{ {
"version": "1.8.104", "version": "1.8.105",
"ext_port": 1111, "ext_port": 1111,
"profiles": { "profiles": {
"mcopy": { "mcopy": {

View File

@ -38,8 +38,8 @@ const int PROJECTOR_BACKWARD_PIN = 4;
const int PROJECTOR_SECOND_FORWARD_PIN = 3; const int PROJECTOR_SECOND_FORWARD_PIN = 3;
const int PROJECTOR_SECOND_BACKWARD_PIN = 2; const int PROJECTOR_SECOND_BACKWARD_PIN = 2;
const int PROJECTOR_MOMENT = 500; const int PROJECTOR_MOMENT = 800;
const int PROJECTOR_LENGTH = 600; const int PROJECTOR_LENGTH = 900;
//OTHER CONSTATNS //OTHER CONSTATNS
const int MODE_SWITCH_PIN = 12; const int MODE_SWITCH_PIN = 12;

View File

@ -149,11 +149,12 @@ void proj_stop () {
} }
} }
delay(100);
mc.confirm(mc.PROJECTOR); mc.confirm(mc.PROJECTOR);
mc.log("projector()"); mc.log("projector()");
proj_running = false; proj_running = false;
delay(16);
update_timing(millis() - proj_time); update_timing(millis() - proj_time);
} }

View File

@ -0,0 +1,74 @@
/// mcopy Serial Library
#include "McopySerial.h"
McopySerial::McopySerial () {}
void McopySerial::begin (char identity) {
id = identity;
Serial.begin(baud);
Serial.flush();
Serial.setTimeout(serialDelay);
}
char McopySerial::loop () {
if (Serial.available()) {
cmdChar = (char) Serial.read();
_internal();
} else {
cmdChar = 'z';
}
return cmdChar;
}
void McopySerial::_internal () {
if (cmdChar == DEBUG) {
debug(!debugOn);
} else if (cmdChar == CONNECT) {
_connect();
} else if (cmdChar == MCOPY_IDENTIFIER) {
_identify();
}
}
void McopySerial::_connect () {
connected = true;
Serial.println(CONNECT);
log("connect()");
}
void McopySerial::_identify () {
identified = true;
Serial.println(id);
log("identify()");
}
void McopySerial::debug (bool state) {
debugOn = state;
log("debug()");
}
void McopySerial::confirm (char cmd) {
Serial.println(cmd);
}
void McopySerial::log (String message) {
if (debugOn) {
Serial.println(message);
}
}
String McopySerial::getString () {
while (Serial.available() == 0) {
//Wait for value string
}
return Serial.readString();
}
void McopySerial::sendString (String str) {
Serial.println(str);
}
void McopySerial::print (String message) {
Serial.println(message);
}

View File

@ -0,0 +1,89 @@
#ifndef MCOPY_SERIAL
#define MCOPY_SERIAL
#include <Arduino.h>
class McopySerial {
private:
const uint16_t serialDelay = 5;
const uint16_t baud = 57600;
volatile bool debugOn = false;
volatile char cmdChar = 'z';
volatile char id;
void _internal ();
void _connect ();
void _identify ();
public:
volatile bool connected = false;
volatile bool identified = false;
/* CMD FLAGS */
const char BLACK = 'b';
const char CAMERA = 'c';
const char CAMERA_BACKWARD = 'f';
const char CAMERA_CAPPER_IDENTIFIER = '8';
const char CAMERA_CAPPER_PROJECTOR_IDENTIFIER = '9';
const char CAMERA_CAPPER_PROJECTORS_IDENTIFIER = '0';
const char CAMERA_EXPOSURE = 'G';
const char CAMERA_FORWARD = 'e';
const char CAMERA_IDENTIFIER = 'k';
const char CAMERA_PROJECTORS_IDENTIFIER = '5';
const char CAMERA_SECOND = '3';
const char CAMERA_SECOND_BACKWARD = '2';
const char CAMERA_SECOND_FORWARD = '1';
const char CAMERA_SECOND_IDENTIFIER = 'y';
const char CAMERA_TIMED = 'n';
const char CAMERAS = '4';
const char CAMERAS_IDENTIFIER = 'a';
const char CAMERAS_PROJECTOR_IDENTIFIER = '6';
const char CAMERAS_PROJECTORS_IDENTIFIER = '7';
const char CAPPER_IDENTIFIER = 'C';
const char CAPPER_OFF = 'B';
const char CAPPER_ON = 'A';
const char CONNECT = 'i';
const char DEBUG = 'd';
const char ERROR = 'E';
const char HOME = 'I';
const char LIGHT = 'l';
const char LIGHT_IDENTIFIER = 'o';
const char MCOPY_IDENTIFIER = 'm';
const char OFFSET = 'O';
const char PROJECTOR = 'p';
const char PROJECTOR_BACKWARD = 'h';
const char PROJECTOR_CAMERA_IDENTIFIER = 's';
const char PROJECTOR_CAMERA_LIGHT_IDENTIFIER = 'r';
const char PROJECTOR_FORWARD = 'g';
const char PROJECTOR_IDENTIFIER = 'j';
const char PROJECTOR_LIGHT_IDENTIFIER = 'q';
const char PROJECTOR_SECOND = 'w';
const char PROJECTOR_SECOND_BACKWARD = 'v';
const char PROJECTOR_SECOND_FORWARD = 'u';
const char PROJECTOR_SECOND_IDENTIFIER = 't';
const char PROJECTORS = 'x';
const char PROJECTORS_IDENTIFIER = 'd';
const char STATE = 'H';
const char TAKEUP_BACKWARD = 'F';
const char TAKEUP_FORWARD = 'D';
/* END CMD FLAGS */
McopySerial();
void begin(char identity);
char loop();
void confirm(char cmd);
String getString();
void print(String message);
void sendString(String str);
void debug (bool state);
void log (String message);
};
#endif

View File

@ -0,0 +1,211 @@
/*
* MOD for controlling second projector only
* Sketch containing firmware for the JKMM100
* A collaboration between MONO NO AWARE and mcopy.
* Compatible with JK105 hardware.
*
* Uses an Arduino Uno compatible board and a
* custom PCB.
* Relay module for proj :
* Sainsmart 2 solid state relay board
Wiring
PROJECTOR + PROJECTOR_DIR
Wire to corresponding pins
Arduino 3 4 5V GND
Relay 1 2 VCC GND
For controling JK Projectors 106 models
Solid state relays connect to:
2uf run capacitor
400 Ohm resistor (50W)
PINS FOR PROJ WIRE
#
1 - Red (top left from back of socket) => Wire from resistor
2 - White (top center) => Wire from power cable (bridged by a fuse)
3 - Black (top right) => Wire from capacitor
8 - Orange (bottom center) => Pin 11 (microswitch digital read)
9 - Brown (bottom right) => GND
Relay 1 corresponds to FWD
Relay 2 corresponse to BWD
*/
#include "McopySerial.h"
volatile unsigned long now;
//PROJECTOR CONSTANTS
const int PROJECTOR_MICROSWITCH = 11;
const int LED_FWD = 12;
const int LED_BWD = 13;
const int PROJECTOR_FWD = 3;
const int PROJECTOR_BWD = 4;
const int PROJECTOR_MOMENT = 240;
const int PROJECTOR_FRAME = 600;
const int PROJECTOR_MICROSWITCH_CLOSED = 0;
const int PROJECTOR_MICROSWITCH_OPENED = 1;
const int PROJECTOR_HALF_TIME = 450;
const int PROJECTOR_STOP_DELAY = 3;
//PROJECTOR VARIABLES
boolean proj_dir = true;
boolean proj_running = false;
boolean proj_primed = false;
volatile int proj_micro_state = 0;
volatile long proj_time = 0;
volatile long proj_avg = -1;
volatile char cmdChar = 'z';
McopySerial mc;
void setup () {
pins();
digitalWrite(LED_FWD, HIGH);
digitalWrite(LED_BWD, HIGH);
mc.begin(mc.PROJECTOR_SECOND_IDENTIFIER);
delay(42);
digitalWrite(LED_FWD, LOW);
digitalWrite(LED_BWD, LOW);
}
void loop () {
now = millis();
if (proj_running) {
proj2_microswitch();
} else {
cmdChar = mc.loop();
cmd(cmdChar);
}
}
void pins () {
pinMode(PROJECTOR_MICROSWITCH, INPUT_PULLUP);
pinMode(PROJECTOR_FWD, OUTPUT);
pinMode(PROJECTOR_BWD, OUTPUT);
pinMode(LED_FWD, OUTPUT);
pinMode(LED_BWD, OUTPUT);
digitalWrite(PROJECTOR_FWD, LOW);
digitalWrite(PROJECTOR_BWD, LOW);
digitalWrite(LED_FWD, LOW);
digitalWrite(LED_BWD, LOW);
}
void cmd (char val) {
if (val == mc.PROJECTOR_SECOND_FORWARD) {
proj2_direction(true);
} else if (val == mc.PROJECTOR_SECOND_BACKWARD) {
proj2_direction(false);
} else if (val == mc.PROJECTOR_SECOND) {
proj2_start();
} else if (val == mc.STATE) {
state();
}
}
void proj2_start () {
proj_time = millis();
if (proj_dir) {
digitalWrite(PROJECTOR_FWD, HIGH);
digitalWrite(LED_FWD, HIGH);
} else {
digitalWrite(PROJECTOR_BWD, HIGH);
digitalWrite(LED_BWD, HIGH);
}
proj_running = true;
}
void proj2_stop () {
//stop both directions
delay(2);
digitalWrite(PROJECTOR_FWD, LOW);
digitalWrite(PROJECTOR_BWD, LOW);
digitalWrite(LED_FWD, LOW);
digitalWrite(LED_BWD, LOW);
if (digitalRead(PROJECTOR_MICROSWITCH) == PROJECTOR_MICROSWITCH_CLOSED) {
if (proj_dir) {
while (digitalRead(PROJECTOR_MICROSWITCH) == PROJECTOR_MICROSWITCH_CLOSED) {
digitalWrite(PROJECTOR_BWD, HIGH);
delay(PROJECTOR_STOP_DELAY);
}
digitalWrite(PROJECTOR_BWD, LOW);
} else {
while (digitalRead(PROJECTOR_MICROSWITCH) == PROJECTOR_MICROSWITCH_CLOSED) {
digitalWrite(PROJECTOR_FWD, HIGH);
delay(PROJECTOR_STOP_DELAY);
}
digitalWrite(PROJECTOR_FWD, LOW);
}
}
delay(100);
mc.confirm(mc.PROJECTOR_SECOND);
mc.log("projector_second()");
proj_running = false;
update_timing(millis() - proj_time);
}
void proj2_direction (boolean state) {
proj_dir = state;
if (state) {
mc.confirm(mc.PROJECTOR_SECOND_FORWARD);
mc.log("proj2_direction -> true");
} else {
mc.confirm(mc.PROJECTOR_SECOND_BACKWARD);
mc.log("proj2_direction -> false");
}
}
//LOW=0=CLOSED
//HIGH=1=OPEN
void proj2_microswitch () {
int val = digitalRead(PROJECTOR_MICROSWITCH);
if (!proj_primed // if not primed
&& val != proj_micro_state // AND if state changes
&& val == PROJECTOR_MICROSWITCH_OPENED // AND state changes to open
&& now - proj_time > PROJECTOR_HALF_TIME) {
//prime
mc.log("proj_primed => true");
proj_micro_state = val;
proj_primed = true;
} else if (proj_primed //if primed
&& val != proj_micro_state //AND if state changes
&& val == PROJECTOR_MICROSWITCH_CLOSED //AND state changes to open
&& now - proj_time > PROJECTOR_HALF_TIME) { //AND total elapsed time is greater than half frame time
//stop
proj_primed = false;
proj_micro_state = val; //unneeded?
proj2_stop();
} else {
delay(2); //some smothing value
}
}
void update_timing (int timing) {
if (proj_avg == -1) {
proj_avg = timing;
} else {
proj_avg = (int) round((proj_avg + timing) / 2);
}
}
void state () {
String stateString = String(mc.CAMERA_EXPOSURE);
stateString += String(proj_avg);
stateString += String(mc.STATE);
mc.print(stateString);
}

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "mcopy", "name": "mcopy",
"version": "1.8.104", "version": "1.8.105",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "mcopy", "name": "mcopy",
"version": "1.8.104", "version": "1.8.105",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"alert": "file:app/lib/alert", "alert": "file:app/lib/alert",

View File

@ -1,6 +1,6 @@
{ {
"name": "mcopy", "name": "mcopy",
"version": "1.8.104", "version": "1.8.105",
"description": "Small gauge film optical printer platform", "description": "Small gauge film optical printer platform",
"main": "build.js", "main": "build.js",
"directories": { "directories": {

View File

@ -1,5 +1,5 @@
{ {
"version": "1.8.104", "version": "1.8.105",
"ext_port": 1111, "ext_port": 1111,
"profiles": { "profiles": {
"mcopy": { "mcopy": {

View File

@ -22,6 +22,7 @@ SKETCHES=(
mcopy_cam_relay mcopy_cam_relay
mcopy_JKMM100 mcopy_JKMM100
mcopy_JKMM100_work mcopy_JKMM100_work
mcopy_JKMM100_second_projector
components/mcopy_light components/mcopy_light
mcopy_projector_firmware mcopy_projector_firmware
mcopy_ACME_Trebes_Nanolab mcopy_ACME_Trebes_Nanolab