Summary
Two-way RS-232 serial command protocol for the Draper MC1 motor controller used to drive SLx / SLxx series projection screens. Covers open/close/stop/program primitives, position reporting, version query, administration (BUS / Radio port assignment), load-sense threshold setting, and specific-stop channel configuration. Connection: 9600 baud, 8N1, no parity, 1 stop bit, no authentication.
Transport
protocols:
- serial
serial:
baud_rate: 9600
data_bits: 8
parity: none
stop_bits: 1
flow_control: software # X-on (Ctrl-Q, 0x11) / X-off (Ctrl-S, 0x13) documented
auth:
type: none # inferred: no auth procedure in source
Traits
- powerable # inferred from power-up version broadcast
- routable # inferred from open/close command examples
- queryable # inferred from position + version query commands
- levelable # inferred from open/close (screen position)
Actions
- id: open
label: Open (lower screen)
kind: action
command: "*o{channel};"
params:
- name: channel
type: string
description: Channel 00-60 (00 = ALL, 60 = cut strap ALL); subsystem 02-7 BUS or 7-99 Radio
notes: Example "*o01;". Time field optional; default pulse 2 sec. Use "q" to stop a forever pulse.
- id: close
label: Close (raise screen)
kind: action
command: "*c{channel};"
params:
- name: channel
type: string
description: Channel 00-60
notes: Example "*c10;".
- id: stop
label: Stop motion
kind: action
command: "*s;"
params: []
notes: Default pulse 1/4 sec when sent alone.
- id: stop_specific
label: Stop specific channel (serial)
kind: action
command: "*s{channel};"
params:
- name: channel
type: string
description: Channel 00-60
notes: Serial-specific stop on a configured C22 channel. Open/Close on this channel also acts as stop.
- id: program
label: Program command
kind: action
command: "*p{channel};"
params:
- name: channel
type: string
description: Channel 00-60
notes: Used in calibration sequence. Example "*p01;". Default pulse 1/4 sec.
- id: quit_sending
label: Quit sending (stop forever pulse)
kind: action
command: "*q;"
params: []
notes: "Footnote 6: stops a forever pulse; any other command also stops transmission but reports an error."
- id: query_position
label: Query position
kind: query
command: "*r{channel};"
params:
- name: channel
type: string
description: Subsystem/main address to query
notes: Response "*nnRpp;" (R=position report, pp=percent from reference), "*nnRN;" (not calibrated), or "*nnRU;" (unknown). Subsystem 0 = ALL systems (excludes radio).
- id: query_version
label: Query version
kind: query
command: "*V;"
params: []
notes: Response "2.0;" or "3.0;R" (Radio) / "3.0;B" (BUS) followed by CR. Characters after V in command ignored.
- id: admin_report_version
label: Administration - report version
kind: action
command: "*V3;"
params: []
notes: Returns version then R (Radio) or B (BUS) then CR.
- id: admin_make_radio
label: Administration - make port 7 Radio
kind: action
command: "*R;"
params: []
notes: Requires RFTM plugged into port 7 jack powered by DCPM.
- id: admin_make_bus
label: Administration - make port 7 BUS
kind: action
command: "*B;"
params: []
notes: Toggle port 7 from Radio back to BUS.
- id: program_accessor
label: Program accessor
kind: action
command: "*a;"
params: []
notes: Administration command. Case-insensitive throughout protocol.
- id: set_minimum_load
label: Set minimum load threshold
kind: action
command: "*C18 O{x} O{y};"
params:
- name: x
type: string
description: Position digit 1-9 (O5-O9 ignored as out of range)
- name: y
type: string
description: Position digit 0-9; omit if 0 (O10). Extra digits ignored.
notes: O10 = disable minimum load sense (useful for very small loads / relay-driven motors).
- id: set_stall_threshold
label: Set stall threshold
kind: action
command: "*C19 O{x} O{y};"
params:
- name: x
type: string
description: Position digit 1-9
- name: y
type: string
description: Position digit 0-9
notes: Use C19 O12 O12 O12 to nudge down, C19 O11 to nudge up.
- id: set_specific_stop_channel
label: Set "Specific Stop" channel
kind: action
command: "*C22 O\"{n}\";"
params:
- name: n
type: string
description: Channel number to bind as specific stop
notes: Open/Close on this channel stops this motor if running, no motion if already stopped.
- id: calibrate_motor
label: Calibrate motor (macro)
kind: action
command: "*p01;*c10;*o10;"
params: []
notes: Run motor to lower limit, then upper limit, then back to lower limit. Required after wiring change.
- id: factory_reset
label: Factory reset (macro)
kind: action
command: "*p00;*c00;*c01;*o01;*s;"
params: []
notes: Extraneous characters sent before "*" are ignored but consume buffer.
Feedbacks
- id: position_report
type: string
description: "*nnRpp; - nn = main channel, pp = percent away from reference (0=reference, 99=opposite limit, ±2% error)."
source_event: response to *r? query
- id: position_unknown_uncalibrated
type: string
description: "*nnRN; - N = position unknown, motor not yet calibrated."
source_event: response to *r? query
- id: position_unknown
type: string
description: "*nnRU; - U = position unknown for other reasons."
source_event: response to *r? query
- id: version_report
type: string
description: "2.0; or 3.0;R / 3.0;B + CR. R=Radio administered, B=BUS administered."
source_event: response to *V; or *V3;
- id: ack_good_format
type: string
description: "G; - command formatted correctly and was not *r? or our *s?."
source_event: after terminator received
- id: nack_bad_format
type: string
description: "U; - command not formatted correctly."
source_event: after terminator received
- id: nack_uncalibrated
type: string
description: "X; - 'm' command cannot be executed (uncalibrated)."
source_event: after terminator received
- id: power_up_banner
type: string
description: "\"version, X-on\" - sent when unit powers up."
source_event: power up
- id: buffer_overflow
type: string
description: "O followed by X-on - buffer (120 bytes) overflowed and all data was purged."
source_event: buffer overflow
- id: flow_control_xoff
type: string
description: "X-off (Ctrl-S, 0x13) - buffer half full, request sender pause."
source_event: buffer half full
- id: flow_control_xon
type: string
description: "X-on (Ctrl-Q, 0x11) - buffer empty, resume sending (only if X-off was previously sent)."
source_event: buffer empty
Variables
- id: subsystem_number
type: integer
range: "02-7 (BUS) or 7-99 (Radio)"
description: Subsystem number prefix on each command after '*'.
- id: channel
type: integer
range: "00-60"
description: 00 = ALL, 60 = "cut strap ALL".
- id: time_to_send
type: integer
range: "000-999 (20ths of a second)"
description: Optional 3-digit field. 000 = forever (use *q; to stop). Max timed pulse = 50 sec. Radio values rounded up to nearest 10th sec.
Events
- id: power_up
description: Unit broadcasts "version, X-on" on power up.
- id: position_drift_during_motion
description: "If motor is moving when report command received, unit reports position at moment end-of-command is received. Result is true only at that instant."
Macros
- id: calibrate
steps:
- "*p01; # program"
- "*c10; # close to upper limit"
- "*o10; # open to lower limit"
purpose: "Required after wiring change or replacement. Establishes motor travel limits."
- id: factory_default_reset
steps:
- "*p00; # program 00"
- "*c00; # close 00"
- "*c01; # close 01"
- "*o01; # open 01"
- "*s; # stop"
purpose: "Reset all settings to factory default."
Safety
confirmation_required_for: []
interlocks:
- "Stall sense: motor current must exceed and stay above stall load threshold for 1/4 sec before power is removed (not adjustable)."
- "Minimum load: motor current must fall below and stay below minimum load threshold for 1/2 sec for MC1 to register limit reached (not adjustable)."
- "IR/serial mutual exclusion: when an IR command is being sent, serial commands may be lost; when a serial command is received, an IR command may be lost."
- "Buffer is 120 bytes; overflow purges all data and reports 'O' + X-on."
warnings:
- "If stall level is set too low, motor will only run briefly in each direction because MC1 believes it is at the limit when it detects a stall."
- "When entering Ox for C18/C19, commands O5-O9 are ignored as out of range."
Notes
- Case-insensitive throughout: "o" same as "O".
- Terminator: ";" (0x3B) or "CR" (0x0D). "LF" (0x0A) ignored.
- Special chars: "*" (0x2A) start of command header.
- Total message length 2-10 characters, typically 6.
- Time between buffered commands = 0.5 sec; 0.1 sec after a stop.
- A button cannot be "held" — use the timed pulse field or *q; to terminate.
- If two-way serial is not used, several MC1 receivers can share one RS-232 link (each individually addressable via subsystem).
- Position percentage has up to ±2% error.
Spec done. 19 actions enumerated (o, c, s, s-specific, p, q, r?, V, V3, R, B, a, C18, C19, C22, calibrate, factory_reset) plus feedbacks/variables/events/macros/safety per source. Empty sections removed. UNRESOLVED markers on gaps. No fabricated values.
## Provenance
```yaml
source_domains:
- draperinc.com
source_urls:
- "https://www.draperinc.com/documentdownload.aspx?path=ProjectionScreens/Instructions&file=SerialComm-RS232_Inst.pdf"
retrieved_at: 2026-05-14T15:36:19.448Z
last_checked_at: 2026-06-02T21:41:37.167Z
Verification Summary
verdict: verified
checked_at: 2026-06-02T21:41:37.167Z
matched_actions: 17
action_count: 17
confidence: medium
summary: "All 17 spec actions matched literals in source; transport parameters verified; wire-level commands exact. (4 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "source describes the MC1 controller, not the SLx/SLxx screen mechanics directly. Compatibility assumed at controller level."
- "firmware version compatibility not stated in source."
- "maximum number of MC1 receivers on a single RS-232 bus not stated."
- "voltage/current ratings of MC1 not stated in source."
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0