Forum: Projekte & Code Arduino Mega 2560 & Windows per RS-232


von Thomas S. (zeilentrafo)


Lesenswert?

Hallo,
hier möchte ich Euch vorstellen, wie ein AVR (hier ATMega 2560, es kann 
aber auch an jeden anderen AVR angepasst werden) über RS-232 mit dem 
Windows-PC (geht auch unter Linux und MAC-OS) gesteuert werden kann. Als 
Hardware wird hier die LED an PortB.7 verwendet, es lässt sich natürlich 
jede hardware analog steuern: Relais, Servos etc.

Hier der Bascom-code auf dem AVR:
1
$regfile = "m2560def.dat"
2
$framesize = 32
3
$swstack = 32
4
$hwstack = 32
5
$crystal = 16000000
6
$baud = 1200
7
8
Config Portb.7 = Output
9
Led Alias Portb.7
10
11
Dim X As Byte
12
Dim Y As Byte
13
Dim Z As Byte
14
15
Z = 50                                                      ' General Wait Time
16
Y = 0                                                       'initialize software-timer
17
18
Do
19
20
If Ischarwaiting() = 1 Then                                 'Eingang RS-232 prüfen
21
Inputbin X
22
X = 100 - X                                                 'Software-Umkehr damit LED dunkel ist, wenn der Trackbar links gezogen wird
23
End If
24
25
While Y < 100                                               'Software-timer. Das kann
26
If Y = X Then Led = 1                                       'natürlich auch mit einem onboard-timer
27
Waitus Z                                                    'gemacht werden. Mit der Software-Lösung
28
Incr Y                                                      'wird jedoch die Funktion erläutert
29
Wend                                                        'und es kann bspw. eine RGB-Diode oder
30
                                                             'beliebig viele Servos in einer
31
While Y > 0                                                 'Routine abgearbeitet werden.
32
If Y = X Then Led = 0
33
Waitus Z
34
Decr Y
35
Wend
36
37
Loop
38
End

und hier der Code für PureBasic:
1
#WindowColor=$F0F0F0
2
3
Define TxByte.a
4
5
Define flags = #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget
6
OpenWindow(0,0,0,300,100,"RS-232",flags)
7
WindowBounds(0,150,150, #PB_Ignore, #PB_Ignore)
8
SetWindowColor(0,#WindowColor)
9
TextGadget(1,5,50,48,20, "tx-data:", #PB_Text_Center)
10
TrackBarGadget (2, 55, 50, 240, 30, 0, 100)
11
OpenSerialPort(0,"COM9",1200,#PB_SerialPort_NoParity,8,1,#PB_SerialPort_NoHandshake,512,512)
12
13
Repeat
14
  Select WaitWindowEvent()
15
    Case #PB_Event_Gadget
16
      Select EventGadget()
17
        Case 2
18
          TxByte = GetGadgetState(2)
19
          WriteSerialPortData(0, @TxByte, 1)
20
      EndSelect
21
    Case #PB_Event_CloseWindow:CloseSerialPort(0):End
22
  EndSelect
23
ForEver

Der COM-Port muss angepasst werden. Nach Installation des USB-RS232 
Adapters wird der im Gerätemanager angezeigt.

Viel Spass beim Experimentieren.
Thomas

: Bearbeitet durch User
von Thomas S. (zeilentrafo)


Lesenswert?

ich habe das Programm eben darum erweitert, dass eine RGB-LED 
individuell angesteuert wird. Dabei liegen die Anoden über jeweils 220 Ω 
an den Ports:

Rot   - PortB.6
Grün  - PortB.5
Blau  - PortB.4

Die Helligkeitswerte werden in einem Byte übertragen. Dabei hat die rote 
Led den Bereich von 0 bis 80, die grüne 81 ~ 161 und die blaue 162 ~ 
242. Beide Programme sind in Basic geschrieben (BASCOM und PureBasic, 
beide führen diese Programme auch in der Demo-Version aus).

AVR-Seite (Bascom):
1
$regfile = "m2560def.dat"
2
$framesize = 32
3
$swstack = 32
4
$hwstack = 32
5
$crystal = 16000000
6
$baud = 9600
7
8
Config Portb = Output
9
10
Rled Alias Portb.6
11
Gled Alias Portb.5
12
Bled Alias Portb.4
13
14
Dim R As Byte
15
Dim G As Byte
16
Dim B As Byte
17
Dim X As Byte
18
Dim Y As Byte
19
Dim Z As Byte
20
21
Z = 30
22
Y = 0
23
24
Do
25
26
If Ischarwaiting() = 1 Then
27
Gosub Rgb
28
End If
29
30
While Y < 80
31
If Y = R Then Rled = 1
32
If Y = G Then Gled = 1
33
If Y = B Then Bled = 1
34
Waitus Z
35
Incr Y
36
Wend
37
38
While Y > 0
39
If Y = R Then Rled = 0
40
If Y = G Then Gled = 0
41
If Y = B Then Bled = 0
42
Waitus Z
43
Decr Y
44
Wend
45
46
Loop
47
End
48
49
Rgb:
50
Inputbin X
51
If X <= 80 Then
52
R = X
53
R = 80 - R
54
End If
55
56
If X > 80 And X <= 161 Then
57
G = X
58
G = G - 81
59
G = 80 - G
60
End If
61
62
If X > 161 Then
63
B = X
64
B = B - 162
65
B = 80 - B
66
End If
67
Return

und auf dem PC läuft in PureBasic:

1
EnableExplicit
2
3
#WindowColor=$F0F0F0
4
5
Define TxByte.a
6
7
Define flags = #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget
8
OpenWindow(0,0,0,300,200,"RGB-Steuerung",flags)
9
WindowBounds(0,200,200, #PB_Ignore, #PB_Ignore)
10
SetWindowColor(0,#WindowColor)
11
TextGadget (0, 70, 5, 190, 20, "RGB-Steuerung", #PB_Text_Center)
12
TextGadget(1,5,30,30,20, "R: ", #PB_Text_Center)
13
TextGadget(2, 5, 60, 30, 20, "G:", #PB_Text_Center)
14
TextGadget(3, 5, 90, 30, 20, "B: ", #PB_Text_Center)
15
TrackBarGadget (4, 55, 30, 240, 30, 0, 80)
16
TrackBarGadget (5, 55, 60, 240, 30, 0, 80)
17
TrackBarGadget (6, 55, 90, 240, 30, 0, 80)
18
19
OpenSerialPort(0,"COM9",9600,#PB_SerialPort_NoParity,8,1,#PB_SerialPort_NoHandshake,512,512)
20
TxByte=0
21
WriteSerialPortData(0,@TxByte,1)
22
TxByte=81
23
WriteSerialPortData(0,@TxByte,1)
24
TxByte=162
25
WriteSerialPortData(0,@txbyte,1)
26
Repeat
27
  Select WaitWindowEvent()
28
    Case #PB_Event_Gadget
29
      Select EventGadget()
30
        Case 4
31
          TxByte = GetGadgetState(4)
32
          WriteSerialPortData(0, @TxByte, 1)
33
        Case 5
34
          TxByte=GetGadgetState(5)+81
35
          WriteSerialPortData(0,@TxByte,1)
36
        Case 6
37
          TxByte=GetGadgetState(6)+162
38
          WriteSerialPortData (0,@TxByte,1)
39
      EndSelect
40
    Case #PB_Event_CloseWindow:CloseSerialPort(0):End
41
  EndSelect
42
ForEver

Das ist bestimmt nicht alles elegant gelöst, aber es funktioniert und 
man sieht bei drei PWM-Werten den Vorteil des Software-timers.

Gruß

Thomas

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.