Online serial interface device
From uCtrl.net
| The Rack box project is being discontinued! I am moving to a new location, and therefor terminating the Rack box project, my plan is to build an even bigger system based on slot-in cards in a full size rack. I'll keep you posted. Feel tree to leave a comment if you have any question. |
Contents |
Information
OSID provides 9 digital inputs and outputs for the computer serial port. The outputs give GND when activated, max load pr. channel: 100mA. The inputs are triggered when they are connected to GND. By sending commands to the module one can change the status of the outputs, the module will confirm when the action is carried out.
It's also possible to ask for the current status of any in- or output, this is done by not sending a set value:
002:o:01:1 will set output 1 active. 002:o:01 will return the output 1 value.
The same can be done with the inputs:
002:i:01 will return the input 1 value.
All commands from the module is sent with a checksum.
I/O
Input
- PC0 Input 1
- PC1 Input 2
- PC2 Input 3
- PC3 Input 4
- PC4 Input 5
- PC5 Input 6
- PD5 Input 7
- PD6 Input 8
- PD7 Input 9
Outputs
- PB0 Output 1
- PB1 Output 2
- PB2 Output 3
- PB3 Output 4
- PB4 Output 5
- PB5 Output 6
- PB6 Output 7
- PB7 Output 8
- PD2 Output 9
- PD3 Lifesignal (to MSMU2)
- PD4 Link activity
D-Sub 25-pin
- 5V +
- 5V -
- Input 1
- Input 2
- Input 3
- Input 4
- Input 5
- Input 6
- Input 7
- Input 8
- Input 9
- Output 1
- Output 2
- Output 3
- Output 4
- Output 5
- Output 6
- Output 7
- Output 8
- Output 9
- Lifesignal
Communication
Interfacing is done with RS-232, using MAX232 or MAX202.
13:53:08 => 002:i:06:1:122 13:53:08 <= 002:i:06:0 13:53:05 => 002:o:01:0:122 13:53:05 <= 002:o:01:0 13:53:03 => 002:o:01:1:123 13:53:03 <= 002:o:01:1 13:52:58 => 002:s:01:1:127 13:52:35 => 002:s:00:1:126
Serial settings
- Baud
- 9600
- Data bits
- 8
- Parity
- None
- Stop bits
- 1
- Start command
- 0
- Module ID
- 002
Parts list
| Quantity | Supplier | Part number | Description |
| 1 | Elfa | 73-672-04 | AVR-RISC, ATmega8-16PI |
| 1 | Elfa | 50-197-40 | Plastic Enclosure (1591 FL), 150x80x50mm fixed install. |
| 1 | Elfa | 44-055-77 | D-Sub soldering cups, 25 pin male |
| 1 | Elfa | 44-055-28 | D-Sub soldering cups, 25 pin female |
| 1 | Elfa | 44-055-02 | D-Sub soldering cups, 9 pin female |
| 1 | Elfa | 48-161-38 | DIL socket, 16-pin, 7,62mm |
| 1 | Elfa | 48-161-87 | DIL socket, 28-pin, 7,62mm |
| 1 | Komplett | 100316 | D-sub cable, pin-to-pin 5m, 9-pin male-female |
| 1 | Elfa | 67-008-01 | Aluminium electrolytic capacitor, 10uF 25V |
| 5 | Elfa | 67-013-12 | Aluminium electrolytic capacitor, 1uF 50V |
| 1 | Elfa | 65-851-94 | Ceramic Disc Capacitor, 1 nF 100V |
| 2 | Elfa | 65-550-64 | Foil capacitor, 0,01uF |
| 2 | Elfa | 48-396-76 | Laboratory card, 100x160mm (1/5) |
| 1 | Elfa | 75-016-79 | LED 5mm clear, Green, 2.1V, 20mA, 385mcd, 6° |
| 1 | Elfa | 75-016-95 | LED 5mm clear, Yellow, 2.0V, 20mA, 250mcd, 6° |
| 1 | Elfa | 75-056-62 | LED lense 5mm, CLB 300 low, green |
| 1 | Elfa | 75-056-88 | LED lense 5mm, CLB 300 low, yellow |
| 1 | Elfa | 73-023-26 | MAX232, CPE RSR232double |
| 9 | Elfa | 60-106-15 | Carbon film resistor 5% 1/4W, 10 K |
| 11 | Elfa | 60-104-33 | Carbon film resistor 5% 1/4W, 330 Ohm |
| 11 | Elfa | 60-105-73 | Carbon film resistor 5% 1/4W, 4,7 K |
| 58 | Elfa | 43-708-05 | Socket connector 2,54, 1×36, female |
| 48 | Elfa | 43-702-19 | Straight pin header 2,54, 1×36, PCB |
| 11 | Elfa | 43-712-09 | Straight pin header 2,54 (Y), 1×15, PCB |
| 1 | Elfa | 33-167-42 | Fuse 5x20 mm, 800 mA, quick-acting |
| 1 | Elfa | 33-160-49 | Fuse Holder, panel, 5x20mm, PTF30 |
| 10 | Elfa | 71-027-59 | Transistor BC547B, NPN, 45V 0.1A 0.625W |
Images
I/O PCB |
I/O PCB backside |
||
Box with PCB, inside |
I/O PCB backside with connectors |
PCBs connected |
|
PCB in box |
Closeup I/O PCB |
||
Closeup I/O PCB backside |
|||
Installed in rack box |
Schematic drawing
Source code
The program is written in basic, using Bascom-AVR.
'-------------------------------------------------------------- ' Thomas Jensen '-------------------------------------------------------------- ' file: AVR_OSID_v.1.0 ' date: 06/05/2007 '-------------------------------------------------------------- $regfile = "m8def.dat" $crystal = 8000000 $baud = 9600 Config Portb = Output Config Portd.2 = Output Config Portd.3 = Output Config Portd.4 = Output Config Portc = Input Config Portd.5 = Input Config Portd.6 = Input Config Portd.7 = Input Dim Lifesignal As Integer , Life As Integer , Send As String * 15 Dim Inn(9) As Byte , A As Byte , A2 As String * 1 Dim Serialcharwaiting As Byte , Serialchar As Byte Dim Comminput As String * 15 , Input_nr As String * 3 Dim Input_com As String * 1 , Input_ut As String * 2 Dim Input_stat As String * 1 , B As Byte , Led As Byte Const Id = "002" Life = 2000 'Waitms 4000 Send = Id + ":s:00:1:" Print Send ; Checksum(send) 'Waitms 1000 Top: Serialcharwaiting = Ischarwaiting() If Serialcharwaiting = 1 Then Serialchar = Inkey() Goto Myroutine End If Goto Main Myroutine: Select Case Serialchar Case 48 '0 Goto Set_value End Select Main: 'input send off signal For A = 1 To 9 If Inn(a) = 1 Then Led = 103 A2 = Str(a) If Len(a2) < 2 Then A2 = "0" + A2 Send = Id + ":i:" + A2 + ":0:" Print Send ; Checksum(send) End If Next A 'input send on signal If Pinc.0 = 0 Then 'input 1 If Inn(1) = 0 Then Led = 103 Send = Id + ":i:01:1:" Print Send ; Checksum(send) End If Inn(1) = 250 End If If Pinc.1 = 0 Then 'input 2 If Inn(2) = 0 Then Led = 103 Send = Id + ":i:02:1:" Print Send ; Checksum(send) End If Inn(2) = 250 End If If Pinc.2 = 0 Then 'input 3 If Inn(3) = 0 Then Led = 103 Send = Id + ":i:03:1:" Print Send ; Checksum(send) End If Inn(3) = 250 End If If Pinc.3 = 0 Then 'input 4 If Inn(4) = 0 Then Led = 103 Send = Id + ":i:04:1:" Print Send ; Checksum(send) End If Inn(4) = 250 End If If Pinc.4 = 0 Then 'input 5 If Inn(5) = 0 Then Led = 103 Send = Id + ":i:05:1:" Print Send ; Checksum(send) End If Inn(5) = 250 End If If Pinc.5 = 0 Then 'input 6 If Inn(6) = 0 Then Led = 103 Send = Id + ":i:06:1:" Print Send ; Checksum(send) End If Inn(6) = 250 End If If Pind.5 = 0 Then 'input 7 If Inn(7) = 0 Then Led = 103 Send = Id + ":i:07:1:" Print Send ; Checksum(send) End If Inn(7) = 250 End If If Pind.6 = 0 Then 'input 8 If Inn(8) = 0 Then Led = 103 Send = Id + ":i:08:1:" Print Send ; Checksum(send) End If Inn(8) = 250 End If If Pind.7 = 0 Then 'input 9 If Inn(9) = 0 Then Led = 103 Send = Id + ":i:09:1:" Print Send ; Checksum(send) End If Inn(9) = 250 End If 'set input counters For A = 1 To 9 If Inn(a) > 0 And B = 0 Then Decr Inn(a) Next A 'led timer If Led > 0 Then Decr Led If Led = 100 Then Portd.4 = 1 If Led = 0 Then Portd.4 = 0 'lifestring If Life > 0 Then Decr Life If Life = 0 Then Led = 103 Send = Id + ":s:01:1:" Print Send ; Checksum(send) Life = 20000 End If 'lifesignal If Lifesignal > 0 Then Decr Lifesignal If Lifesignal = 500 Then Portd.3 = 1 If Lifesignal = 0 Then Portd.3 = 0 Lifesignal = 2100 End If Waitms 1 Goto Top 'loop cycle End Set_value: Input Comminput Noecho 'read serialport Input_nr = Left(comminput , 3) 'id check Input_com = Mid(comminput , 5 , 1) 'command check Input_ut = Mid(comminput , 7 , 2) 'output nr check Input_stat = Mid(comminput , 10 , 1) 'output stat check 'output If Input_nr = Id Then If Input_com = "o" Then Led = 103 Select Case Input_ut Case "01" 'output 1 If Input_stat = "1" Then Portb.0 = 1 If Input_stat = "0" Then Portb.0 = 0 Send = Id + ":o:01:" + Str(portb.0) + ":" Print Send ; Checksum(send) Case "02" 'output 2 If Input_stat = "1" Then Portb.1 = 1 If Input_stat = "0" Then Portb.1 = 0 Send = Id + ":o:02:" + Str(portb.1) + ":" Print Send ; Checksum(send) Case "03" 'output 3 If Input_stat = "1" Then Portb.2 = 1 If Input_stat = "0" Then Portb.2 = 0 Send = Id + ":o:03:" + Str(portb.2) + ":" Print Send ; Checksum(send) Case "04" 'output 4 If Input_stat = "1" Then Portb.3 = 1 If Input_stat = "0" Then Portb.3 = 0 Send = Id + ":o:04:" + Str(portb.3) + ":" Print Send ; Checksum(send) Case "05" 'output 5 If Input_stat = "1" Then Portb.4 = 1 If Input_stat = "0" Then Portb.4 = 0 Send = Id + ":o:05:" + Str(portb.4) + ":" Print Send ; Checksum(send) Case "06" 'output 6 If Input_stat = "1" Then Portb.5 = 1 If Input_stat = "0" Then Portb.5 = 0 Send = Id + ":o:06:" + Str(portb.5) + ":" Print Send ; Checksum(send) Case "07" 'output 7 If Input_stat = "1" Then Portb.6 = 1 If Input_stat = "0" Then Portb.6 = 0 Send = Id + ":o:07:" + Str(portb.6) + ":" Print Send ; Checksum(send) Case "08" 'output 8 If Input_stat = "1" Then Portb.7 = 1 If Input_stat = "0" Then Portb.7 = 0 Send = Id + ":o:08:" + Str(portb.7) + ":" Print Send ; Checksum(send) Case "09" 'output 9 If Input_stat = "1" Then Portd.2 = 1 If Input_stat = "0" Then Portd.2 = 0 Send = Id + ":o:09:" + Str(portd.2) + ":" Print Send ; Checksum(send) End Select End If If Input_com = "i" Then Select Case Input_ut Case "01" If Inn(1) = 0 Then Inn(1) = 2 Else Inn(1) = 0 'status input 1 Case "02" If Inn(2) = 0 Then Inn(2) = 2 Else Inn(2) = 0 'status input 2 Case "03" If Inn(3) = 0 Then Inn(3) = 2 Else Inn(3) = 0 'status input 3 Case "04" If Inn(4) = 0 Then Inn(4) = 2 Else Inn(4) = 0 'status input 4 Case "05" If Inn(5) = 0 Then Inn(5) = 2 Else Inn(5) = 0 'status input 5 Case "06" If Inn(6) = 0 Then Inn(6) = 2 Else Inn(6) = 0 'status input 6 Case "07" If Inn(7) = 0 Then Inn(7) = 2 Else Inn(7) = 0 'status input 7 Case "08" If Inn(8) = 0 Then Inn(8) = 2 Else Inn(8) = 0 'status input 8 Case "09" If Inn(9) = 0 Then Inn(9) = 2 Else Inn(9) = 0 'status input 9 End Select End If End If Goto Main End